@tryghost/ghst 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/api.ts","../src/lib/auth.ts","../src/schemas/common.ts","../src/lib/errors.ts","../src/lib/client.ts","../src/lib/config.ts","../src/schemas/config.ts","../src/lib/credentials.ts","../src/lib/context.ts","../src/lib/output.ts","../src/lib/tty.ts","../src/lib/parse.ts","../src/commands/auth.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/lib/images.ts","../src/schemas/image.ts","../src/commands/image.ts","../src/lib/pagination.ts","../src/lib/labels.ts","../src/lib/prompts.ts","../src/schemas/label.ts","../src/commands/label.ts","../src/mcp/server.ts","../src/mcp/tools/core.ts","../src/lib/members.ts","../src/lib/newsletters.ts","../src/lib/offers.ts","../src/lib/pages.ts","../src/lib/posts.ts","../src/lib/settings.ts","../src/lib/site.ts","../src/lib/tags.ts","../src/lib/themes.ts","../src/lib/tiers.ts","../src/lib/users.ts","../src/lib/webhooks.ts","../src/mcp/transports/http.ts","../src/mcp/transports/stdio.ts","../src/commands/mcp.ts","../src/commands/member.ts","../src/schemas/member.ts","../src/lib/migrate.ts","../src/schemas/migrate.ts","../src/commands/migrate.ts","../src/schemas/newsletter.ts","../src/commands/newsletter.ts","../src/schemas/offer.ts","../src/commands/offer.ts","../src/commands/page.ts","../src/schemas/page.ts","../src/commands/post.ts","../src/schemas/post.ts","../src/schemas/setting.ts","../src/commands/setting.ts","../src/commands/site.ts","../src/schemas/tag.ts","../src/commands/tag.ts","../src/commands/theme.ts","../src/lib/theme-dev.ts","../src/schemas/theme.ts","../src/schemas/tier.ts","../src/commands/tier.ts","../src/schemas/user.ts","../src/commands/user.ts","../src/lib/webhook-listener.ts","../src/schemas/webhook.ts","../src/commands/webhook.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport { Command, CommanderError } from 'commander';\nimport { registerApiCommands } from './commands/api.js';\nimport { registerAuthCommands } from './commands/auth.js';\nimport { registerCompletionCommands } from './commands/completion.js';\nimport { registerConfigCommands } from './commands/config.js';\nimport { registerImageCommands } from './commands/image.js';\nimport { registerLabelCommands } from './commands/label.js';\nimport { registerMcpCommands } from './commands/mcp.js';\nimport { registerMemberCommands } from './commands/member.js';\nimport { registerMigrateCommands } from './commands/migrate.js';\nimport { registerNewsletterCommands } from './commands/newsletter.js';\nimport { registerOfferCommands } from './commands/offer.js';\nimport { registerPageCommands } from './commands/page.js';\nimport { registerPostCommands } from './commands/post.js';\nimport { registerSettingCommands } from './commands/setting.js';\nimport { registerSiteCommands } from './commands/site.js';\nimport { registerTagCommands } from './commands/tag.js';\nimport { registerThemeCommands } from './commands/theme.js';\nimport { registerTierCommands } from './commands/tier.js';\nimport { registerUserCommands } from './commands/user.js';\nimport { registerWebhookCommands } from './commands/webhook.js';\nimport { ExitCode, GhstError, normalizeError, printError } from './lib/errors.js';\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name('ghst')\n .description('A modern CLI for Ghost CMS')\n .showHelpAfterError()\n .showSuggestionAfterError(true)\n .option('--json', 'Output JSON')\n .option('--jq <filter>', 'Apply jq-style field extraction to JSON output')\n .option('--site <site>', 'Configured site alias')\n .option('--url <url>', 'Ghost site URL override')\n .option('--staff-token <token>', 'Ghost staff access token override')\n .option('--debug [level]', 'Enable debug output')\n .option('--no-color', 'Disable color output');\n\n registerAuthCommands(program);\n registerPostCommands(program);\n registerPageCommands(program);\n registerTagCommands(program);\n registerMemberCommands(program);\n registerNewsletterCommands(program);\n registerTierCommands(program);\n registerOfferCommands(program);\n registerLabelCommands(program);\n registerWebhookCommands(program);\n registerUserCommands(program);\n registerImageCommands(program);\n registerThemeCommands(program);\n registerSiteCommands(program);\n registerSettingCommands(program);\n registerConfigCommands(program);\n registerApiCommands(program);\n registerMcpCommands(program);\n registerMigrateCommands(program);\n registerCompletionCommands(program);\n\n program.exitOverride();\n return program;\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const program = buildProgram();\n\n try {\n await program.parseAsync(argv);\n return ExitCode.SUCCESS;\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) {\n return ExitCode.SUCCESS;\n }\n const globals = program.opts();\n const ghstError = new GhstError(error.message, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n printError(ghstError, globals);\n return ghstError.exitCode;\n }\n\n const normalized = normalizeError(error);\n const jsonMode = argv.includes('--json');\n printError(normalized, { json: jsonMode });\n return normalized.exitCode;\n }\n}\n\nexport async function main(argv: string[]): Promise<void> {\n const exitCode = await run(argv);\n process.exit(exitCode);\n}\n\n/* c8 ignore start */\nfunction isMainModule(): boolean {\n const entry = process.argv[1];\n if (!entry) {\n return false;\n }\n\n return import.meta.url === pathToFileURL(entry).href;\n}\n\n/* c8 ignore next 3 */\nif (isMainModule()) {\n void main(process.argv);\n}\n/* c8 ignore stop */\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport { GhostClient, type GhostResponseWithMeta } from '../lib/client.js';\nimport { resolveConnectionConfig } from '../lib/config.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson } from '../lib/output.js';\nimport { parseQueryPairs } from '../lib/parse.js';\n\nfunction parsePrimitiveValue(value: string): unknown {\n const trimmed = value.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n\n const asNumber = Number(trimmed);\n if (!Number.isNaN(asNumber) && trimmed !== '') {\n return asNumber;\n }\n\n return value;\n}\n\nfunction parseFieldPairs(entries: string[] | undefined): Record<string, unknown> {\n if (!entries || entries.length === 0) {\n return {};\n }\n\n return Object.fromEntries(\n entries.map((entry) => {\n const [key, ...rest] = entry.split('=');\n const parsedKey = key?.trim();\n if (!parsedKey) {\n throw new GhstError(`Invalid field pair: ${entry}`, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n return [parsedKey, parsePrimitiveValue(rest.join('='))];\n }),\n );\n}\n\nfunction getCollectionKey(data: Record<string, unknown>): string | null {\n const entries = Object.entries(data);\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n return key;\n }\n }\n\n return null;\n}\n\nfunction mergePaginatedPayload(\n base: Record<string, unknown>,\n next: Record<string, unknown>,\n key: string,\n): Record<string, unknown> {\n const left = Array.isArray(base[key]) ? base[key] : [];\n const right = Array.isArray(next[key]) ? next[key] : [];\n const merged = [...left, ...right];\n\n const baseMeta = (base.meta as Record<string, unknown> | undefined) ?? {};\n const pagination = ((baseMeta.pagination as Record<string, unknown> | undefined) ?? {}) as Record<\n string,\n unknown\n >;\n\n return {\n ...base,\n [key]: merged,\n meta: {\n ...baseMeta,\n pagination: {\n ...pagination,\n page: 1,\n pages: 1,\n next: null,\n prev: null,\n total: merged.length,\n limit: merged.length,\n },\n },\n };\n}\n\nasync function executeRequest(\n client: GhostClient,\n options: {\n endpointPath: string;\n method: string;\n body: unknown;\n params: Record<string, string | number | boolean | undefined>;\n contentApi: boolean;\n paginate: boolean;\n },\n): Promise<GhostResponseWithMeta<Record<string, unknown>>> {\n let page = Number(options.params.page ?? 1);\n if (!Number.isInteger(page) || page <= 0) {\n page = 1;\n }\n\n let firstResponse: GhostResponseWithMeta<Record<string, unknown>> | null = null;\n let mergedPayload: Record<string, unknown> | null = null;\n\n while (true) {\n const requestParams = options.paginate\n ? {\n ...options.params,\n page,\n }\n : options.params;\n\n const current = await client.rawRequestWithMeta<Record<string, unknown>>(\n options.endpointPath,\n options.method,\n options.body,\n requestParams,\n {\n api: options.contentApi ? 'content' : 'admin',\n },\n );\n\n if (!firstResponse) {\n firstResponse = current;\n mergedPayload = current.data;\n } else if (mergedPayload) {\n const key = getCollectionKey(mergedPayload);\n if (key) {\n mergedPayload = mergePaginatedPayload(mergedPayload, current.data, key);\n }\n }\n\n if (!options.paginate) {\n break;\n }\n\n const pagination =\n ((current.data.meta as Record<string, unknown> | undefined)?.pagination as\n | Record<string, unknown>\n | undefined) ?? {};\n const pages = Number(pagination.pages ?? 1);\n if (!Number.isInteger(pages) || pages <= page) {\n break;\n }\n\n const key = getCollectionKey(current.data);\n if (!key) {\n break;\n }\n\n page += 1;\n }\n\n if (!firstResponse || !mergedPayload) {\n throw new GhstError('API request failed to produce a response payload.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n return {\n status: firstResponse.status,\n headers: firstResponse.headers,\n data: mergedPayload,\n };\n}\n\nexport function registerApiCommands(program: Command): void {\n program\n .command('api [endpointPath]')\n .description('Make a raw Ghost API request')\n .option('-X, --method <method>', 'HTTP method', 'GET')\n .option('--body <json>', 'Inline JSON request body')\n .option('--input <path>', 'Read JSON request body from file')\n .option('-f, --field <pairs...>', 'Request body field in key=value format')\n .option('--query <pairs...>', 'Query params in key=value format')\n .option('--content-api', 'Use Content API instead of Admin API')\n .option('--paginate', 'Auto-paginate list responses')\n .option('--include-headers', 'Include response headers in output')\n .action(async (endpointPath: string | undefined, options, command) => {\n if (!endpointPath) {\n throw new GhstError('Missing required argument: endpointPath', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n if (options.body && options.input) {\n throw new GhstError('Use either --body or --input, not both.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const fieldValues = parseFieldPairs(options.field);\n const fieldKeys = Object.keys(fieldValues);\n\n const global = getGlobalOptions(command);\n const connection = await resolveConnectionConfig(global);\n const client = new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n contentKey: process.env.GHOST_CONTENT_API_KEY,\n version: connection.apiVersion,\n });\n\n const params = parseQueryPairs(options.query);\n let requestBody: unknown;\n\n if (options.input) {\n requestBody = JSON.parse(await fs.readFile(options.input, 'utf8')) as unknown;\n } else if (options.body) {\n requestBody = JSON.parse(options.body) as unknown;\n }\n\n if (fieldKeys.length > 0) {\n if (requestBody === undefined) {\n requestBody = fieldValues;\n } else if (requestBody && typeof requestBody === 'object' && !Array.isArray(requestBody)) {\n requestBody = {\n ...(requestBody as Record<string, unknown>),\n ...fieldValues,\n };\n } else {\n throw new GhstError('--field can only be merged into object JSON bodies.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n }\n\n const result = await executeRequest(client, {\n endpointPath,\n method: options.method,\n body: requestBody,\n params,\n contentApi: options.contentApi,\n paginate: Boolean(options.paginate),\n });\n\n if (options.includeHeaders) {\n printJson(\n {\n status: result.status,\n headers: result.headers,\n data: result.data,\n },\n global.jq,\n );\n return;\n }\n\n printJson(result.data, global.jq);\n });\n}\n","import { SignJWT } from 'jose';\nimport { StaffAccessTokenSchema } from '../schemas/common.js';\nimport { ExitCode, GhstError } from './errors.js';\n\nexport interface ParsedStaffAccessToken {\n id: string;\n secretHex: string;\n secret: Uint8Array;\n}\n\nexport function parseStaffAccessToken(value: string): ParsedStaffAccessToken {\n const parsed = StaffAccessTokenSchema.safeParse(value);\n if (!parsed.success) {\n throw new GhstError(parsed.error.issues.map((issue) => issue.message).join('; '), {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: parsed.error.flatten(),\n });\n }\n\n const [id, secretHex] = parsed.data.split(':') as [string, string];\n return {\n id,\n secretHex,\n secret: Buffer.from(secretHex, 'hex'),\n };\n}\n\nexport async function generateStaffJwt(staffToken: string): Promise<string> {\n const parsed = parseStaffAccessToken(staffToken);\n\n return new SignJWT({})\n .setProtectedHeader({ alg: 'HS256', kid: parsed.id, typ: 'JWT' })\n .setIssuedAt()\n .setExpirationTime('5m')\n .setAudience('/admin/')\n .sign(parsed.secret);\n}\n","import { z } from 'zod';\n\nexport const UrlSchema = z.url();\n\nexport const SiteAliasSchema = z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/i, 'site alias may include letters, numbers, and hyphens');\n\nexport const ApiVersionSchema = z.string().regex(/^v\\d+\\.\\d+$/, 'api version must look like v6.0');\n\nexport const StaffAccessTokenSchema = z\n .string()\n .regex(/^[A-Za-z0-9]+:[A-Fa-f0-9]+$/, 'staff token must use the format {id}:{hex-secret}')\n .refine((value) => {\n const secret = value.split(':')[1] ?? '';\n return secret.length % 2 === 0;\n }, 'hex secret must have even length');\n","import type { GlobalOptions } from './types.js';\n\nexport enum ExitCode {\n SUCCESS = 0,\n GENERAL_ERROR = 1,\n USAGE_ERROR = 2,\n AUTH_ERROR = 3,\n OPERATION_CANCELLED = 4,\n NOT_FOUND = 5,\n CONFLICT = 6,\n VALIDATION_ERROR = 7,\n RATE_LIMITED = 8,\n}\n\nexport class GhstError extends Error {\n readonly exitCode: ExitCode;\n readonly code: string;\n readonly status?: number;\n readonly details?: unknown;\n\n constructor(\n message: string,\n options: {\n exitCode?: ExitCode;\n code?: string;\n status?: number;\n details?: unknown;\n } = {},\n ) {\n super(message);\n this.name = 'GhstError';\n this.exitCode = options.exitCode ?? ExitCode.GENERAL_ERROR;\n this.code = options.code ?? 'ERROR';\n this.status = options.status;\n this.details = options.details;\n }\n}\n\nexport function mapHttpStatusToExitCode(status: number): ExitCode {\n if (status === 401 || status === 403) return ExitCode.AUTH_ERROR;\n if (status === 404) return ExitCode.NOT_FOUND;\n if (status === 409) return ExitCode.CONFLICT;\n if (status === 422) return ExitCode.VALIDATION_ERROR;\n if (status === 429) return ExitCode.RATE_LIMITED;\n return ExitCode.GENERAL_ERROR;\n}\n\nfunction getErrorContext(error: GhstError): string | undefined {\n const details = error.details as Record<string, unknown> | undefined;\n const errors = details?.errors;\n if (!Array.isArray(errors)) {\n return undefined;\n }\n\n const context = (errors[0] as Record<string, unknown> | undefined)?.context;\n return typeof context === 'string' ? context : undefined;\n}\n\nexport function normalizeError(error: unknown): GhstError {\n if (error instanceof GhstError) return error;\n if (error instanceof Error) {\n return new GhstError(error.message, {\n code: 'UNHANDLED_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n return new GhstError('Unknown error', {\n code: 'UNKNOWN_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n details: error,\n });\n}\n\nexport function formatErrorForJson(error: GhstError): Record<string, unknown> {\n return {\n error: true,\n code: error.code,\n status: error.status,\n message: error.message,\n context: getErrorContext(error),\n details: error.details,\n };\n}\n\nexport function printError(error: GhstError, global: GlobalOptions): void {\n if (global.json) {\n console.error(JSON.stringify(formatErrorForJson(error), null, 2));\n return;\n }\n\n if (error.status) {\n console.error(`Error: ${error.message} (HTTP ${error.status})`);\n } else {\n console.error(`Error: ${error.message}`);\n }\n\n const context = getErrorContext(error);\n if (context) {\n console.error('');\n console.error(` ${context}`);\n }\n\n if (error.status === 409) {\n console.error('');\n console.error(' Hint: Fetch the resource again and retry the update.');\n }\n}\n","import { generateStaffJwt, parseStaffAccessToken } from './auth.js';\nimport { ExitCode, GhstError, mapHttpStatusToExitCode } from './errors.js';\n\nexport interface GhostClientConfig {\n url: string;\n staffToken?: string;\n contentKey?: string;\n version?: string;\n}\n\nexport interface GhostApiErrorPayload {\n errors?: Array<{ message?: string; context?: string; type?: string }>;\n [key: string]: unknown;\n}\n\nexport interface GhostPaginatedResponse extends Record<string, unknown> {\n meta?: Record<string, unknown>;\n}\n\ntype RequestApi = 'admin' | 'content';\ntype ResponseType = 'json' | 'text' | 'buffer';\n\nexport interface GhostResponseWithMeta<T> {\n data: T;\n status: number;\n headers: Record<string, string>;\n}\n\nexport class GhostApiError extends GhstError {\n readonly payload: GhostApiErrorPayload | null;\n\n constructor(status: number, message: string, payload: GhostApiErrorPayload | null) {\n super(message, {\n exitCode: mapHttpStatusToExitCode(status),\n status,\n code: 'GHOST_API_ERROR',\n details: payload,\n });\n this.payload = payload;\n }\n}\n\nfunction isReadMethod(method: string): boolean {\n const normalized = method.toUpperCase();\n return normalized === 'GET' || normalized === 'HEAD';\n}\n\nfunction getRetryDelay(attempt: number): number {\n if (process.env.VITEST) {\n return 0;\n }\n\n return 1000 * 2 ** attempt;\n}\n\nfunction isFormDataBody(value: unknown): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction isTierNotFoundAnomaly(\n status: number,\n endpointPath: string,\n payload: GhostApiErrorPayload | null,\n): boolean {\n if (status !== 500 || !/^\\/tiers\\/[^/]+\\/$/.test(endpointPath)) {\n return false;\n }\n\n const context = payload?.errors?.[0]?.context ?? '';\n return (\n context.includes('Cannot read properties of null') ||\n context.includes('Cannot set properties of null')\n );\n}\n\nasync function wait(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class GhostClient {\n private readonly url: string;\n private readonly staffToken?: string;\n private readonly contentKey?: string;\n private readonly version: string;\n\n constructor(config: GhostClientConfig) {\n if (!config.staffToken && !config.contentKey) {\n throw new GhstError('Ghost client requires a staff access token or content key.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n if (config.staffToken) {\n parseStaffAccessToken(config.staffToken);\n }\n\n this.url = config.url.replace(/\\/$/, '');\n this.staffToken = config.staffToken;\n this.contentKey = config.contentKey;\n this.version = config.version ?? 'v6.0';\n }\n\n private async request<T>(\n method: string,\n endpointPath: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n source?: 'html';\n api?: RequestApi;\n responseType?: ResponseType;\n includeMeta: true;\n },\n ): Promise<GhostResponseWithMeta<T>>;\n private async request<T>(\n method: string,\n endpointPath: string,\n options?: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n source?: 'html';\n api?: RequestApi;\n responseType?: ResponseType;\n includeMeta?: false | undefined;\n },\n ): Promise<T>;\n private async request<T>(\n method: string,\n endpointPath: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n source?: 'html';\n api?: RequestApi;\n responseType?: ResponseType;\n includeMeta?: boolean;\n } = {},\n ): Promise<T | GhostResponseWithMeta<T>> {\n const api = options.api ?? 'admin';\n const upperMethod = method.toUpperCase();\n const maxNetworkRetries = isReadMethod(upperMethod) ? 1 : 0;\n let networkRetryCount = 0;\n let rateRetryCount = 0;\n\n while (true) {\n const url = new URL(`/ghost/api/${api}${endpointPath}`, this.url);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n if (options.source) {\n url.searchParams.set('source', options.source);\n }\n\n const headers: Record<string, string> = {\n 'Accept-Version': this.version,\n };\n\n if (api === 'admin') {\n if (!this.staffToken) {\n throw new GhstError('Staff access token is required for this request.', {\n code: 'AUTH_REQUIRED',\n exitCode: ExitCode.AUTH_ERROR,\n });\n }\n\n const token = await generateStaffJwt(this.staffToken);\n headers.Authorization = `Ghost ${token}`;\n } else {\n if (!this.contentKey) {\n throw new GhstError('GHOST_CONTENT_API_KEY is required for --content-api requests.', {\n code: 'AUTH_REQUIRED',\n exitCode: ExitCode.AUTH_ERROR,\n });\n }\n\n url.searchParams.set('key', this.contentKey);\n }\n\n let requestBody: string | FormData | undefined;\n if (options.body !== undefined) {\n if (isFormDataBody(options.body)) {\n requestBody = options.body;\n } else if (typeof options.body === 'string') {\n requestBody = options.body;\n headers['Content-Type'] = 'application/json';\n } else {\n requestBody = JSON.stringify(options.body);\n headers['Content-Type'] = 'application/json';\n }\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method: upperMethod,\n headers,\n body: requestBody,\n });\n } catch (error) {\n if (networkRetryCount < maxNetworkRetries) {\n networkRetryCount += 1;\n continue;\n }\n\n throw new GhstError(`Network request failed: ${(error as Error).message}`, {\n code: 'NETWORK_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n if (response.status === 429 && rateRetryCount < 3) {\n const delay = getRetryDelay(rateRetryCount);\n rateRetryCount += 1;\n await wait(delay);\n continue;\n }\n\n if (!response.ok) {\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n\n let payload: GhostApiErrorPayload | null = null;\n if (contentType.includes('application/json')) {\n try {\n payload = (await response.json()) as GhostApiErrorPayload;\n } catch {\n payload = null;\n }\n } else {\n const body = await response.text();\n try {\n payload = JSON.parse(body) as GhostApiErrorPayload;\n } catch {\n payload = null;\n }\n }\n\n if (isTierNotFoundAnomaly(response.status, endpointPath, payload)) {\n throw new GhostApiError(404, 'Tier not found', payload);\n }\n\n const ghostMessage =\n payload?.errors?.[0]?.message ?? `Ghost API request failed (${response.status})`;\n throw new GhostApiError(response.status, ghostMessage, payload);\n }\n\n const responseHeaders = Object.fromEntries(response.headers.entries());\n\n if (response.status === 204) {\n const empty = {} as T;\n if (options.includeMeta) {\n return {\n data: empty,\n status: response.status,\n headers: responseHeaders,\n };\n }\n\n return empty;\n }\n\n let data: T;\n if (options.responseType === 'text') {\n data = (await response.text()) as T;\n } else if (options.responseType === 'buffer') {\n data = Buffer.from(await response.arrayBuffer()) as T;\n } else {\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n if (!contentType.includes('application/json')) {\n data = (await response.text()) as T;\n } else {\n data = (await response.json()) as T;\n }\n }\n\n if (options.includeMeta) {\n return {\n data,\n status: response.status,\n headers: responseHeaders,\n };\n }\n\n return data;\n }\n }\n\n async siteInfo(): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>('GET', '/site/');\n }\n\n async rawRequest<T>(\n path: string,\n method = 'GET',\n body?: unknown,\n params?: Record<string, string | number | boolean | undefined>,\n options: { api?: RequestApi; responseType?: ResponseType } = {},\n ): Promise<T> {\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return (await this.request<T>(method.toUpperCase(), normalized, {\n body,\n params,\n api: options.api,\n responseType: options.responseType,\n })) as T;\n }\n\n async rawRequestWithMeta<T>(\n path: string,\n method = 'GET',\n body?: unknown,\n params?: Record<string, string | number | boolean | undefined>,\n options: { api?: RequestApi; responseType?: ResponseType } = {},\n ): Promise<GhostResponseWithMeta<T>> {\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return (await this.request<T>(method.toUpperCase(), normalized, {\n body,\n params,\n api: options.api,\n responseType: options.responseType,\n includeMeta: true,\n })) as GhostResponseWithMeta<T>;\n }\n\n posts = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/posts/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/posts/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/posts/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (post: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('POST', '/posts/', {\n body: { posts: [post] },\n source,\n }),\n\n edit: (id: string, post: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('PUT', `/posts/${id}/`, {\n body: { posts: [post] },\n source,\n }),\n\n copy: (id: string) => this.request<Record<string, unknown>>('POST', `/posts/${id}/copy/`),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/posts/${id}/`),\n };\n\n pages = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/pages/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/pages/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/pages/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (page: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('POST', '/pages/', {\n body: { pages: [page] },\n source,\n }),\n\n edit: (id: string, page: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('PUT', `/pages/${id}/`, {\n body: { pages: [page] },\n source,\n }),\n\n copy: (id: string) => this.request<Record<string, unknown>>('POST', `/pages/${id}/copy/`),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/pages/${id}/`),\n };\n\n tags = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/tags/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/tags/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/tags/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (tag: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/tags/', {\n body: { tags: [tag] },\n }),\n\n edit: (id: string, tag: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/tags/${id}/`, {\n body: { tags: [tag] },\n }),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/tags/${id}/`),\n };\n\n members = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/members/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/members/${id}/`, { params }),\n\n add: (\n member: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('POST', '/members/', {\n body: { members: [member] },\n params,\n }),\n\n edit: (id: string, member: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/members/${id}/`, {\n body: { members: [member] },\n }),\n\n delete: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, never>>('DELETE', `/members/${id}/`, { params }),\n\n bulkDestroy: (params: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('DELETE', '/members/', { params }),\n\n bulkEdit: (\n bulk: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('PUT', '/members/bulk/', {\n body: { bulk },\n params,\n }),\n\n exportCsv: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<string>('GET', '/members/upload/', {\n params,\n responseType: 'text',\n }),\n\n importCsv: (\n formData: FormData,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('POST', '/members/upload/', {\n body: formData,\n params,\n }),\n };\n\n newsletters = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/newsletters/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/newsletters/${id}/`, { params }),\n\n add: (\n newsletter: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('POST', '/newsletters/', {\n body: { newsletters: [newsletter] },\n params,\n }),\n\n edit: (\n id: string,\n newsletter: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('PUT', `/newsletters/${id}/`, {\n body: { newsletters: [newsletter] },\n params,\n }),\n };\n\n tiers = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/tiers/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/tiers/${id}/`, { params }),\n\n add: (tier: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/tiers/', {\n body: { tiers: [tier] },\n }),\n\n edit: (id: string, tier: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/tiers/${id}/`, {\n body: { tiers: [tier] },\n }),\n };\n\n offers = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/offers/', { params }),\n\n read: (id: string) => this.request<Record<string, unknown>>('GET', `/offers/${id}/`),\n\n add: (offer: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/offers/', {\n body: { offers: [offer] },\n }),\n\n edit: (id: string, offer: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/offers/${id}/`, {\n body: { offers: [offer] },\n }),\n };\n\n labels = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/labels/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/labels/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/labels/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (label: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/labels/', {\n body: { labels: [label] },\n }),\n\n edit: (id: string, label: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/labels/${id}/`, {\n body: { labels: [label] },\n }),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/labels/${id}/`),\n };\n\n users = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/users/', { params }),\n\n read: (\n idOrSlugOrEmail: string,\n options: {\n bySlug?: boolean;\n byEmail?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/users/slug/${idOrSlugOrEmail}/`, {\n params: options.params,\n });\n }\n\n if (options.byEmail) {\n return this.request<Record<string, unknown>>('GET', `/users/email/${idOrSlugOrEmail}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/users/${idOrSlugOrEmail}/`, {\n params: options.params,\n });\n },\n\n me: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', '/users/me/', { params }),\n };\n\n webhooks = {\n add: (webhook: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/webhooks/', {\n body: { webhooks: [webhook] },\n }),\n\n edit: (id: string, webhook: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/webhooks/${id}/`, {\n body: { webhooks: [webhook] },\n }),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/webhooks/${id}/`),\n };\n\n images = {\n upload: (formData: FormData) =>\n this.request<Record<string, unknown>>('POST', '/images/upload/', {\n body: formData,\n }),\n };\n\n themes = {\n browse: () => this.request<Record<string, unknown>>('GET', '/themes/'),\n\n readActive: () => this.request<Record<string, unknown>>('GET', '/themes/active/'),\n\n upload: (formData: FormData) =>\n this.request<Record<string, unknown>>('POST', '/themes/upload/', {\n body: formData,\n }),\n\n activate: (name: string) =>\n this.request<Record<string, unknown>>('PUT', `/themes/${name}/activate/`, {\n body: {},\n }),\n };\n\n settings = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', '/settings/', { params }),\n\n edit: (settings: Array<Record<string, unknown>>) =>\n this.request<Record<string, unknown>>('PUT', '/settings/', {\n body: { settings },\n }),\n };\n\n db = {\n export: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Buffer>('GET', '/db/', {\n params,\n responseType: 'buffer',\n }),\n\n import: (formData: FormData) =>\n this.request<Record<string, unknown>>('POST', '/db/', {\n body: formData,\n }),\n };\n}\n","import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { ApiVersionSchema, SiteAliasSchema, UrlSchema } from '../schemas/common.js';\nimport {\n type GhstProjectConfig,\n type GhstUserConfig,\n ProjectConfigSchema,\n UserConfigSchema,\n} from '../schemas/config.js';\nimport { credentialRefForAlias, getCredentialStore } from './credentials.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport type { ConnectionConfig, GlobalOptions } from './types.js';\n\nconst DEFAULT_API_VERSION = 'v6.0';\nconst CURRENT_CONFIG_VERSION = 2;\nlet warnedPlaintextStaffTokens = false;\n\nfunction isPosixPlatform(): boolean {\n return process.platform !== 'win32';\n}\n\nasync function enforceSecureUserConfigPermissions(configPath: string): Promise<void> {\n if (!isPosixPlatform()) {\n return;\n }\n\n let stat: Awaited<ReturnType<typeof fs.stat>> | null = null;\n try {\n stat = await fs.stat(configPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return;\n }\n throw error;\n }\n\n const mode = stat.mode & 0o777;\n if ((mode & 0o077) !== 0) {\n await fs.chmod(configPath, 0o600);\n }\n}\n\nfunction withCurrentConfigVersion(config: GhstUserConfig): GhstUserConfig {\n return {\n ...config,\n version: Math.max(config.version, CURRENT_CONFIG_VERSION),\n };\n}\n\nfunction hasPlaintextStaffTokens(config: GhstUserConfig): boolean {\n return Object.values(config.sites).some((site) =>\n Boolean(site.staffAccessToken && !site.credentialRef),\n );\n}\n\nfunction warnPlaintextCredentialFallback(): void {\n if (warnedPlaintextStaffTokens || process.env.VITEST) {\n return;\n }\n\n warnedPlaintextStaffTokens = true;\n console.error(\n 'Warning: secure credential storage is unavailable; plaintext staff access tokens remain in config. Re-login once secure storage is available.',\n );\n}\n\nasync function migratePlaintextStaffTokens(\n config: GhstUserConfig,\n env: NodeJS.ProcessEnv,\n): Promise<GhstUserConfig> {\n if (!hasPlaintextStaffTokens(config)) {\n return config;\n }\n\n const store = getCredentialStore();\n const available = await store.isAvailable().catch(() => false);\n if (!available) {\n warnPlaintextCredentialFallback();\n return config;\n }\n\n let changed = false;\n const next = structuredClone(config);\n\n for (const [alias, site] of Object.entries(next.sites)) {\n const staffToken = site.staffAccessToken;\n if (!staffToken || site.credentialRef) {\n continue;\n }\n\n const credentialRef = credentialRefForAlias(alias);\n await store.set(credentialRef, staffToken);\n site.credentialRef = credentialRef;\n delete site.staffAccessToken;\n changed = true;\n }\n\n if (!changed) {\n return config;\n }\n\n const normalized = withCurrentConfigVersion(next);\n await writeUserConfig(normalized, env);\n return normalized;\n}\n\nexport function deriveSiteAlias(url: string): string {\n const hostname = new URL(url).hostname.replace(/^www\\./, '');\n const [base = hostname] = hostname.split('.');\n return base.replace(/[^a-zA-Z0-9-]/g, '-').toLowerCase();\n}\n\nexport function getConfigDir(env: NodeJS.ProcessEnv = process.env): string {\n return env.GHST_CONFIG_DIR || path.join(os.homedir(), '.config', 'ghst');\n}\n\nexport function getUserConfigPath(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(getConfigDir(env), 'config.json');\n}\n\nexport function getProjectConfigPath(cwd = process.cwd()): string {\n return path.join(cwd, '.ghst', 'config.json');\n}\n\nexport async function readUserConfig(\n env: NodeJS.ProcessEnv = process.env,\n): Promise<GhstUserConfig> {\n const configPath = getUserConfigPath(env);\n\n try {\n const raw = await fs.readFile(configPath, 'utf8');\n const json = JSON.parse(raw) as unknown;\n const parsed = UserConfigSchema.parse(json);\n await enforceSecureUserConfigPermissions(configPath);\n return await migratePlaintextStaffTokens(parsed, env);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return UserConfigSchema.parse({ version: CURRENT_CONFIG_VERSION, sites: {} });\n }\n\n if (error instanceof SyntaxError) {\n throw new GhstError(`Invalid JSON in ${configPath}`, {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'INVALID_CONFIG',\n });\n }\n\n throw error;\n }\n}\n\nexport async function writeUserConfig(\n config: GhstUserConfig,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<void> {\n const configPath = getUserConfigPath(env);\n const normalized = withCurrentConfigVersion(UserConfigSchema.parse(config));\n await fs.mkdir(path.dirname(configPath), {\n recursive: true,\n ...(isPosixPlatform() ? { mode: 0o700 } : {}),\n });\n await fs.writeFile(configPath, `${JSON.stringify(normalized, null, 2)}\\n`, {\n encoding: 'utf8',\n ...(isPosixPlatform() ? { mode: 0o600 } : {}),\n });\n await enforceSecureUserConfigPermissions(configPath);\n}\n\nexport async function readProjectConfig(cwd = process.cwd()): Promise<GhstProjectConfig | null> {\n const configPath = getProjectConfigPath(cwd);\n\n try {\n const raw = await fs.readFile(configPath, 'utf8');\n const json = JSON.parse(raw) as unknown;\n return ProjectConfigSchema.parse(json);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n throw new GhstError(`Invalid JSON in ${configPath}`, {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'INVALID_PROJECT_CONFIG',\n });\n }\n\n throw error;\n }\n}\n\nexport async function writeProjectConfig(\n config: GhstProjectConfig,\n cwd = process.cwd(),\n): Promise<void> {\n const configPath = getProjectConfigPath(cwd);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, 'utf8');\n}\n\nasync function resolveSiteFromConfig(\n alias: string,\n config: GhstUserConfig,\n source: ConnectionConfig['source'],\n): Promise<ConnectionConfig> {\n const site = config.sites[alias];\n if (!site) {\n throw new GhstError(`Site alias not found: ${alias}`, {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n let staffToken = site.staffAccessToken;\n if (!staffToken && site.credentialRef) {\n const store = getCredentialStore();\n const available = await store.isAvailable().catch(() => false);\n if (!available) {\n throw new GhstError(\n `Secure credential storage is unavailable for site alias: ${alias}. Re-login with --insecure-storage or enable system keychain integration.`,\n {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n },\n );\n }\n\n staffToken = (await store.get(site.credentialRef)) ?? undefined;\n }\n\n if (!staffToken) {\n throw new GhstError(\n `Credentials for site alias '${alias}' are unavailable. Run ghst auth login.`,\n {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n },\n );\n }\n\n return {\n url: site.url,\n staffToken,\n apiVersion: site.apiVersion,\n siteAlias: alias,\n source,\n };\n}\n\nexport async function resolveConnectionConfig(\n global: GlobalOptions,\n options: {\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n userConfig?: GhstUserConfig;\n projectConfig?: GhstProjectConfig | null;\n } = {},\n): Promise<ConnectionConfig> {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const userConfig = options.userConfig ?? (await readUserConfig(env));\n const projectConfig =\n options.projectConfig === undefined ? await readProjectConfig(cwd) : options.projectConfig;\n\n if (global.site) {\n SiteAliasSchema.parse(global.site);\n return await resolveSiteFromConfig(global.site, userConfig, 'site');\n }\n\n const hasUrlFlag = global.url !== undefined;\n const hasStaffTokenFlag = global.staffToken !== undefined;\n const hasDirectFlags = hasUrlFlag || hasStaffTokenFlag;\n const directVersion = env.GHOST_API_VERSION ?? DEFAULT_API_VERSION;\n\n if (hasDirectFlags) {\n const directUrl = global.url;\n const directStaffToken = global.staffToken;\n\n if (directUrl === undefined || directStaffToken === undefined) {\n throw new GhstError(\n 'Both --url and --staff-token are required when using direct credential flags.',\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n\n UrlSchema.parse(directUrl);\n ApiVersionSchema.parse(directVersion);\n return {\n url: directUrl,\n staffToken: directStaffToken,\n apiVersion: directVersion,\n source: 'flags',\n };\n }\n\n if (env.GHOST_URL && env.GHOST_STAFF_ACCESS_TOKEN) {\n UrlSchema.parse(env.GHOST_URL);\n ApiVersionSchema.parse(directVersion);\n return {\n url: env.GHOST_URL,\n staffToken: env.GHOST_STAFF_ACCESS_TOKEN,\n apiVersion: directVersion,\n source: 'env',\n };\n }\n\n if (env.GHOST_SITE) {\n return await resolveSiteFromConfig(env.GHOST_SITE, userConfig, 'site');\n }\n\n if (projectConfig?.site) {\n return await resolveSiteFromConfig(projectConfig.site, userConfig, 'project');\n }\n\n if (userConfig.active) {\n return await resolveSiteFromConfig(userConfig.active, userConfig, 'active');\n }\n\n throw new GhstError(\n 'No site configuration found. Use ghst auth login, set env vars, or pass --url and --staff-token.',\n {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n },\n );\n}\n","import { z } from 'zod';\nimport { ApiVersionSchema, SiteAliasSchema, StaffAccessTokenSchema, UrlSchema } from './common.js';\n\nexport const SiteConfigSchema = z\n .object({\n url: UrlSchema,\n staffAccessToken: StaffAccessTokenSchema.optional(),\n credentialRef: z.string().min(1).optional(),\n apiVersion: ApiVersionSchema.default('v6.0'),\n addedAt: z.string().datetime(),\n })\n .refine((site) => Boolean(site.staffAccessToken || site.credentialRef), {\n message: 'site config must include staffAccessToken or credentialRef',\n });\n\nexport const UserConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.number().int().min(1).default(2),\n active: SiteAliasSchema.optional(),\n sites: z.record(SiteAliasSchema, SiteConfigSchema).default({}),\n defaults: z\n .object({\n format: z.string().optional(),\n limit: z.number().int().positive().optional(),\n editor: z.string().optional(),\n })\n .optional(),\n});\n\nexport const ProjectConfigSchema = z.object({\n site: SiteAliasSchema,\n defaults: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type GhstUserConfig = z.infer<typeof UserConfigSchema>;\nexport type GhstProjectConfig = z.infer<typeof ProjectConfigSchema>;\n","import { spawn } from 'node:child_process';\n\ninterface CommandResult {\n stdout: string;\n stderr: string;\n code: number;\n}\n\ninterface CommandOptions {\n env?: NodeJS.ProcessEnv;\n input?: string;\n}\n\nexport interface CredentialStore {\n isAvailable(): Promise<boolean>;\n set(ref: string, secret: string): Promise<void>;\n get(ref: string): Promise<string | null>;\n delete(ref: string): Promise<void>;\n}\n\ninterface CredentialStoreAdapter {\n isAvailable(): Promise<boolean>;\n set(ref: string, secret: string): Promise<void>;\n get(ref: string): Promise<string | null>;\n delete(ref: string): Promise<void>;\n}\n\nconst MACOS_SERVICE = 'ghst';\nconst LINUX_ATTR_APP = 'ghst-app';\nconst LINUX_ATTR_REF = 'ghst-ref';\nconst WINDOWS_TARGET_PREFIX = 'ghst:';\n\nlet credentialStoreForTests: CredentialStore | null = null;\nlet cachedStore: CredentialStore | null = null;\n\nfunction sanitizeRef(ref: string): string {\n return ref.replace(/[^a-zA-Z0-9:_-]/g, '-');\n}\n\nfunction toWindowsTarget(ref: string): string {\n return `${WINDOWS_TARGET_PREFIX}${sanitizeRef(ref)}`;\n}\n\nasync function runCommand(\n command: string,\n args: string[],\n options: CommandOptions = {},\n): Promise<CommandResult> {\n return await new Promise<CommandResult>((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: 'pipe',\n env: options.env,\n });\n\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n\n child.stdout.on('data', (chunk) => {\n stdout.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n });\n child.stderr.on('data', (chunk) => {\n stderr.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n });\n\n child.on('error', reject);\n child.on('close', (code) => {\n resolve({\n stdout: Buffer.concat(stdout).toString('utf8'),\n stderr: Buffer.concat(stderr).toString('utf8'),\n code: code ?? 1,\n });\n });\n\n if (options.input !== undefined) {\n child.stdin.write(options.input);\n }\n child.stdin.end();\n });\n}\n\nfunction createUnavailableStore(): CredentialStoreAdapter {\n return {\n isAvailable: async () => false,\n set: async () => {\n throw new Error('Secure credential storage is unavailable.');\n },\n get: async () => null,\n delete: async () => undefined,\n };\n}\n\nfunction createMacOsAdapter(): CredentialStoreAdapter {\n const runSecurity = async (\n args: string[],\n options: CommandOptions = {},\n ): Promise<CommandResult> => {\n return await runCommand('security', args, options);\n };\n\n return {\n isAvailable: async () => {\n try {\n const result = await runSecurity(['list-keychains']);\n return result.code === 0;\n } catch {\n return false;\n }\n },\n set: async (ref, secret) => {\n const result = await runSecurity([\n 'add-generic-password',\n '-a',\n sanitizeRef(ref),\n '-s',\n MACOS_SERVICE,\n '-U',\n '-w',\n secret,\n ]);\n if (result.code !== 0) {\n throw new Error(\n `Failed to store credential in macOS Keychain: ${result.stderr || result.stdout}`,\n );\n }\n },\n get: async (ref) => {\n const result = await runSecurity([\n 'find-generic-password',\n '-a',\n sanitizeRef(ref),\n '-s',\n MACOS_SERVICE,\n '-w',\n ]);\n if (result.code !== 0) {\n return null;\n }\n return result.stdout.trim() || null;\n },\n delete: async (ref) => {\n const result = await runSecurity([\n 'delete-generic-password',\n '-a',\n sanitizeRef(ref),\n '-s',\n MACOS_SERVICE,\n ]);\n if (result.code !== 0) {\n const message = `${result.stderr}\\n${result.stdout}`;\n if (message.includes('could not be found')) {\n return;\n }\n throw new Error(\n `Failed to delete credential from macOS Keychain: ${result.stderr || result.stdout}`,\n );\n }\n },\n };\n}\n\nfunction createLinuxAdapter(): CredentialStoreAdapter {\n const runSecretTool = async (\n args: string[],\n options: CommandOptions = {},\n ): Promise<CommandResult> => {\n return await runCommand('secret-tool', args, options);\n };\n\n return {\n isAvailable: async () => {\n try {\n const probe = await runSecretTool([\n 'lookup',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n '__probe__',\n ]);\n return probe.code === 0 || probe.code === 1;\n } catch {\n return false;\n }\n },\n set: async (ref, secret) => {\n const result = await runSecretTool(\n [\n 'store',\n '--label',\n 'ghst credential',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n sanitizeRef(ref),\n ],\n { input: secret },\n );\n if (result.code !== 0) {\n throw new Error(\n `Failed to store credential in Secret Service: ${result.stderr || result.stdout}`,\n );\n }\n },\n get: async (ref) => {\n const result = await runSecretTool([\n 'lookup',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n sanitizeRef(ref),\n ]);\n if (result.code !== 0) {\n return null;\n }\n return result.stdout.trim() || null;\n },\n delete: async (ref) => {\n const result = await runSecretTool([\n 'clear',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n sanitizeRef(ref),\n ]);\n if (result.code !== 0) {\n throw new Error(\n `Failed to delete credential from Secret Service: ${result.stderr || result.stdout}`,\n );\n }\n },\n };\n}\n\nfunction createWindowsAdapter(): CredentialStoreAdapter {\n const runPowerShell = async (\n script: string,\n env: NodeJS.ProcessEnv = process.env,\n ): Promise<CommandResult> => {\n return await runCommand(\n 'powershell',\n ['-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-Command', script],\n { env },\n );\n };\n\n const importModuleScript =\n \"$ErrorActionPreference='Stop'; Import-Module CredentialManager -ErrorAction Stop;\";\n\n return {\n isAvailable: async () => {\n try {\n const probe = await runPowerShell(\n '$module = Get-Module -ListAvailable -Name CredentialManager; if ($module) { exit 0 } else { exit 1 }',\n );\n return probe.code === 0;\n } catch {\n return false;\n }\n },\n set: async (ref, secret) => {\n const result = await runPowerShell(\n `${importModuleScript} $target=$env:GHST_CRED_TARGET; $secret=$env:GHST_CRED_SECRET; New-StoredCredential -Target $target -UserName 'ghst' -Password $secret -Persist LocalMachine | Out-Null`,\n {\n ...process.env,\n GHST_CRED_TARGET: toWindowsTarget(ref),\n GHST_CRED_SECRET: secret,\n },\n );\n if (result.code !== 0) {\n throw new Error(\n `Failed to store credential in Windows Credential Manager: ${result.stderr || result.stdout}`,\n );\n }\n },\n get: async (ref) => {\n const result = await runPowerShell(\n `${importModuleScript} $target=$env:GHST_CRED_TARGET; $cred = Get-StoredCredential -Target $target; if ($null -eq $cred) { exit 3 }; Write-Output $cred.Password`,\n {\n ...process.env,\n GHST_CRED_TARGET: toWindowsTarget(ref),\n },\n );\n if (result.code !== 0) {\n return null;\n }\n return result.stdout.trim() || null;\n },\n delete: async (ref) => {\n const result = await runPowerShell(\n `${importModuleScript} $target=$env:GHST_CRED_TARGET; $cred = Get-StoredCredential -Target $target; if ($null -eq $cred) { exit 0 }; Remove-StoredCredential -Target $target`,\n {\n ...process.env,\n GHST_CRED_TARGET: toWindowsTarget(ref),\n },\n );\n if (result.code !== 0) {\n throw new Error(\n `Failed to delete credential from Windows Credential Manager: ${result.stderr || result.stdout}`,\n );\n }\n },\n };\n}\n\nfunction createAdapterForPlatform(): CredentialStoreAdapter {\n if (process.platform === 'darwin') {\n return createMacOsAdapter();\n }\n\n if (process.platform === 'linux') {\n return createLinuxAdapter();\n }\n\n if (process.platform === 'win32') {\n return createWindowsAdapter();\n }\n\n return createUnavailableStore();\n}\n\nfunction createCredentialStoreFromAdapter(adapter: CredentialStoreAdapter): CredentialStore {\n return {\n isAvailable: async () => await adapter.isAvailable(),\n set: async (ref, secret) => {\n await adapter.set(ref, secret);\n },\n get: async (ref) => await adapter.get(ref),\n delete: async (ref) => {\n await adapter.delete(ref);\n },\n };\n}\n\nexport function credentialRefForAlias(alias: string): string {\n return `site:${sanitizeRef(alias)}`;\n}\n\nexport function setCredentialStoreForTests(store: CredentialStore | null): void {\n credentialStoreForTests = store;\n}\n\nexport function resetCredentialStoreCacheForTests(): void {\n cachedStore = null;\n}\n\nexport function getCredentialStore(): CredentialStore {\n if (credentialStoreForTests) {\n return credentialStoreForTests;\n }\n\n // Keep tests deterministic and avoid writing to real OS keychains unless explicitly mocked.\n if (process.env.VITEST) {\n if (!cachedStore) {\n cachedStore = createCredentialStoreFromAdapter(createUnavailableStore());\n }\n return cachedStore;\n }\n\n if (!cachedStore) {\n cachedStore = createCredentialStoreFromAdapter(createAdapterForPlatform());\n }\n\n return cachedStore;\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from './types.js';\n\nexport function getGlobalOptions(command: Command): GlobalOptions {\n const options = command.optsWithGlobals() as GlobalOptions;\n const noColorFromEnv = process.env.NO_COLOR === '1' || process.env.GHST_NO_COLOR === '1';\n\n return {\n json: options.json,\n jq: options.jq,\n site: options.site,\n url: options.url,\n staffToken: options.staffToken,\n debug: options.debug,\n color: options.color !== false && !noColorFromEnv,\n };\n}\n","import process from 'node:process';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { isStdoutTty } from './tty.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction applyJqSubset(data: unknown, jq?: string): unknown {\n if (!jq) {\n return data;\n }\n\n const rootArrayPattern = /^\\.\\[\\]\\.([a-zA-Z0-9_]+)$/;\n const nestedArrayPattern = /^\\.([a-zA-Z0-9_]+)\\[\\]\\.([a-zA-Z0-9_]+)$/;\n const singleFieldPattern = /^\\.([a-zA-Z0-9_]+)$/;\n\n const rootMatch = jq.match(rootArrayPattern);\n if (rootMatch) {\n const [, field = ''] = rootMatch;\n return Array.isArray(data)\n ? data.map((entry) => (entry as Record<string, unknown>)[field])\n : [];\n }\n\n const nestedMatch = jq.match(nestedArrayPattern);\n if (nestedMatch) {\n const [, collection = '', field = ''] = nestedMatch;\n const collectionValue = (data as Record<string, unknown>)[collection];\n return Array.isArray(collectionValue)\n ? collectionValue.map((entry) => (entry as Record<string, unknown>)[field])\n : [];\n }\n\n const singleMatch = jq.match(singleFieldPattern);\n if (singleMatch) {\n const [, field = ''] = singleMatch;\n return (data as Record<string, unknown>)[field];\n }\n\n throw new Error(`Unsupported --jq filter: ${jq}`);\n}\n\nexport function printJson(data: unknown, jq?: string): void {\n const filtered = applyJqSubset(data, jq);\n\n if (Array.isArray(filtered) && jq) {\n for (const entry of filtered) {\n console.log(JSON.stringify(entry));\n }\n return;\n }\n\n console.log(JSON.stringify(filtered, null, 2));\n}\n\nfunction formatStatus(status: string, useColor: boolean): string {\n if (!useColor) {\n return status;\n }\n\n if (status === 'published' || status === 'active') return chalk.green(status);\n if (status === 'draft') return chalk.yellow(status);\n if (status === 'scheduled') return chalk.blue(status);\n if (status === 'archived') return chalk.gray(status);\n return status;\n}\n\nfunction printRows(headers: string[], rows: string[][], useColor: boolean): void {\n if (!isStdoutTty()) {\n for (const row of rows) {\n console.log(row.join('\\t'));\n }\n return;\n }\n\n const table = new Table({\n head: headers,\n style: {\n head: useColor ? ['cyan'] : [],\n border: useColor ? ['gray'] : [],\n },\n wordWrap: true,\n });\n\n for (const row of rows) {\n table.push(row);\n }\n\n console.log(table.toString());\n}\n\nfunction printPagination(payload: Record<string, unknown>, label: string): void {\n const meta = payload.meta as Record<string, unknown> | undefined;\n const pagination = meta?.pagination as Record<string, unknown> | undefined;\n if (!pagination) {\n return;\n }\n\n console.log(\n `\\nShowing page ${pagination.page ?? '?'} of ${pagination.pages ?? '?'} (total ${pagination.total ?? '?'} ${label})`,\n );\n}\n\nfunction printSingleRecord(\n payload: Record<string, unknown>,\n key: string,\n fields: Array<{ label: string; field: string }>,\n): void {\n const entries = Array.isArray(payload[key]) ? payload[key] : [];\n const record = entries[0] as Record<string, unknown> | undefined;\n\n if (!record) {\n console.log('No record found.');\n return;\n }\n\n const lines = fields.map(({ label, field }) => `${label}: ${String(record[field] ?? '')}`);\n console.log(lines.join('\\n'));\n}\n\nfunction rowsFromCollection(\n payload: Record<string, unknown>,\n key: string,\n mapper: (record: Record<string, unknown>) => string[],\n): string[][] {\n const collection = Array.isArray(payload[key]) ? payload[key] : [];\n return collection.map((entry) => mapper((entry as Record<string, unknown>) ?? {}));\n}\n\nfunction formatOperationCount(value: unknown): string {\n return typeof value === 'number' ? String(value) : '0';\n}\n\nexport function printOperationStatsHuman(payload: Record<string, unknown>, label: string): void {\n const rootStats = (payload.meta as Record<string, unknown> | undefined)?.stats as\n | Record<string, unknown>\n | undefined;\n const bulkStats = (\n (payload.bulk as Record<string, unknown> | undefined)?.meta as\n | Record<string, unknown>\n | undefined\n )?.stats as Record<string, unknown> | undefined;\n\n const stats = rootStats ?? bulkStats;\n if (!stats) {\n console.log(label);\n return;\n }\n\n if (typeof stats.imported === 'number') {\n const invalidCount = Array.isArray(stats.invalid) ? stats.invalid.length : 0;\n console.log(`${label}: ${stats.imported} imported, ${invalidCount} invalid`);\n return;\n }\n\n const successful = formatOperationCount(stats.successful);\n const unsuccessful = formatOperationCount(stats.unsuccessful);\n console.log(`${label}: ${successful} successful, ${unsuccessful} unsuccessful`);\n}\n\nexport function printPostListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'posts', (record) => [\n String(record.id ?? ''),\n String(record.title ?? ''),\n formatStatus(String(record.status ?? 'unknown'), useColor),\n String(record.published_at ?? ''),\n ]);\n\n printRows(['ID', 'TITLE', 'STATUS', 'PUBLISHED'], rows, useColor);\n printPagination(payload, 'posts');\n}\n\nexport function printPageListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'pages', (record) => [\n String(record.id ?? ''),\n String(record.title ?? ''),\n formatStatus(String(record.status ?? 'unknown'), useColor),\n String(record.published_at ?? ''),\n ]);\n\n printRows(['ID', 'TITLE', 'STATUS', 'PUBLISHED'], rows, useColor);\n printPagination(payload, 'pages');\n}\n\nexport function printTagListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'tags', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n String(record.visibility ?? 'public'),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'VISIBILITY'], rows, useColor);\n printPagination(payload, 'tags');\n}\n\nexport function printMemberListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'members', (record) => [\n String(record.id ?? ''),\n String(record.email ?? ''),\n String(record.name ?? ''),\n formatStatus(String(record.status ?? 'free'), useColor),\n String(record.updated_at ?? ''),\n ]);\n\n printRows(['ID', 'EMAIL', 'NAME', 'STATUS', 'UPDATED'], rows, useColor);\n printPagination(payload, 'members');\n}\n\nexport function printNewsletterListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'newsletters', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n formatStatus(String(record.status ?? 'active'), useColor),\n String(record.visibility ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'STATUS', 'VISIBILITY'], rows, useColor);\n printPagination(payload, 'newsletters');\n}\n\nexport function printTierListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'tiers', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.type ?? ''),\n String(record.active ?? ''),\n String(record.monthly_price ?? ''),\n String(record.yearly_price ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'TYPE', 'ACTIVE', 'MONTHLY', 'YEARLY'], rows, useColor);\n printPagination(payload, 'tiers');\n}\n\nexport function printOfferListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'offers', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.code ?? ''),\n formatStatus(String(record.status ?? ''), useColor),\n String(record.type ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'CODE', 'STATUS', 'TYPE'], rows, useColor);\n printPagination(payload, 'offers');\n}\n\nexport function printLabelListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'labels', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n String(record.updated_at ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'UPDATED'], rows, useColor);\n printPagination(payload, 'labels');\n}\n\nexport function printUserListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'users', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n String(record.email ?? ''),\n formatStatus(String(record.status ?? ''), useColor),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'EMAIL', 'STATUS'], rows, useColor);\n printPagination(payload, 'users');\n}\n\nexport function printThemeListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'themes', (record) => [\n String(record.name ?? ''),\n String(record.active ?? ''),\n String(((record.package as Record<string, unknown> | undefined)?.version as string) ?? ''),\n ]);\n\n printRows(['NAME', 'ACTIVE', 'VERSION'], rows, useColor);\n}\n\nexport function printSettingListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'settings', (record) => [\n String(record.key ?? ''),\n String(record.value ?? ''),\n String(record.group ?? ''),\n ]);\n\n printRows(['KEY', 'VALUE', 'GROUP'], rows, useColor);\n}\n\nexport function printPostHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'posts', [\n { label: 'ID', field: 'id' },\n { label: 'Title', field: 'title' },\n { label: 'Slug', field: 'slug' },\n { label: 'Status', field: 'status' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printPageHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'pages', [\n { label: 'ID', field: 'id' },\n { label: 'Title', field: 'title' },\n { label: 'Slug', field: 'slug' },\n { label: 'Status', field: 'status' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printTagHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'tags', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Visibility', field: 'visibility' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printMemberHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'members', [\n { label: 'ID', field: 'id' },\n { label: 'Email', field: 'email' },\n { label: 'Name', field: 'name' },\n { label: 'Status', field: 'status' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printNewsletterHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'newsletters', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Status', field: 'status' },\n { label: 'Visibility', field: 'visibility' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printTierHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'tiers', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Type', field: 'type' },\n { label: 'Active', field: 'active' },\n { label: 'Monthly', field: 'monthly_price' },\n { label: 'Yearly', field: 'yearly_price' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printOfferHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'offers', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Code', field: 'code' },\n { label: 'Status', field: 'status' },\n { label: 'Type', field: 'type' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printLabelHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'labels', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printUserHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'users', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Email', field: 'email' },\n { label: 'Status', field: 'status' },\n ]);\n}\n\nexport function printWebhookHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'webhooks', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Event', field: 'event' },\n { label: 'Target URL', field: 'target_url' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printThemeHuman(payload: Record<string, unknown>): void {\n const themes = Array.isArray(payload.themes) ? payload.themes : [];\n const theme = (themes[0] as Record<string, unknown> | undefined) ?? payload;\n const pkg = (theme.package as Record<string, unknown> | undefined) ?? {};\n\n console.log(\n [\n `Name: ${String(theme.name ?? '')}`,\n `Active: ${String(theme.active ?? '')}`,\n `Version: ${String(pkg.version ?? '')}`,\n ].join('\\n'),\n );\n}\n\nexport function printSettingHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'settings', [\n { label: 'Key', field: 'key' },\n { label: 'Value', field: 'value' },\n { label: 'Group', field: 'group' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printSiteHuman(payload: Record<string, unknown>): void {\n const site = ((payload.site as Record<string, unknown> | undefined) ?? payload) as Record<\n string,\n unknown\n >;\n const lines = [\n `Title: ${String(site.title ?? '')}`,\n `Description: ${String(site.description ?? '')}`,\n `URL: ${String(site.url ?? site.site_url ?? '')}`,\n `Version: ${String(site.version ?? '')}`,\n ];\n console.log(lines.join('\\n'));\n}\n\nexport function isJsonMode(global: GlobalOptions): boolean {\n return Boolean(global.json || process.env.GHST_OUTPUT === 'json');\n}\n","export function isForcedTty(env: NodeJS.ProcessEnv = process.env): boolean {\n return env.GHST_FORCE_TTY === '1';\n}\n\nexport function isStdoutTty(env: NodeJS.ProcessEnv = process.env): boolean {\n if (isForcedTty(env)) {\n return true;\n }\n\n return Boolean(process.stdout.isTTY);\n}\n\nexport function isStdinTty(env: NodeJS.ProcessEnv = process.env): boolean {\n if (isForcedTty(env)) {\n return true;\n }\n\n return Boolean(process.stdin.isTTY);\n}\n\nexport function isNonInteractive(env: NodeJS.ProcessEnv = process.env): boolean {\n return !isStdoutTty(env) || !isStdinTty(env);\n}\n","import { ExitCode, GhstError } from './errors.js';\n\nexport function parseCsv(value: string | undefined): string[] | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = value\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n\n return parsed.length > 0 ? parsed : undefined;\n}\n\nexport function parseBooleanFlag(value: unknown): boolean | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true' || normalized === '1' || normalized === 'yes') {\n return true;\n }\n\n if (normalized === 'false' || normalized === '0' || normalized === 'no') {\n return false;\n }\n }\n\n throw new GhstError(`Invalid boolean value: ${String(value)}`, {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n}\n\nexport function parseQueryPairs(entries: string[] | undefined): Record<string, string> {\n if (!entries || entries.length === 0) {\n return {};\n }\n\n return Object.fromEntries(\n entries.map((entry) => {\n const [key, ...rest] = entry.split('=');\n const parsedKey = key?.trim();\n if (!parsedKey) {\n throw new GhstError(`Invalid query pair: ${entry}`, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n return [parsedKey, rest.join('=').trim()];\n }),\n );\n}\n\nexport function parseInteger(value: string | undefined, label: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const parsed = Number(value);\n if (!Number.isInteger(parsed)) {\n throw new GhstError(`${label} must be an integer`, {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n\n return parsed;\n}\n","import { spawn } from 'node:child_process';\nimport readline from 'node:readline/promises';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { generateStaffJwt, parseStaffAccessToken } from '../lib/auth.js';\nimport { GhostClient } from '../lib/client.js';\nimport {\n deriveSiteAlias,\n readUserConfig,\n resolveConnectionConfig,\n writeProjectConfig,\n writeUserConfig,\n} from '../lib/config.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { credentialRefForAlias, getCredentialStore } from '../lib/credentials.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\n\ntype PromptFn = (question: string) => Promise<string>;\ntype OpenUrlFn = (url: string) => Promise<void>;\n\nconst LOGIN_GUIDANCE_BORDER = '------------------------------------------------------------';\nconst LOGIN_GUIDANCE_TITLE = 'Continue In Ghost Admin';\nconst LOGIN_GUIDANCE_LINE =\n 'Copy the staff access token from your profile, then return here to continue.';\n\n/* c8 ignore start */\nasync function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const value = await rl.question(question);\n return value.trim();\n } finally {\n rl.close();\n }\n}\n\nfunction getBrowserOpenCommands(url: string): Array<{ command: string; args: string[] }> {\n if (process.platform === 'darwin') {\n return [{ command: 'open', args: [url] }];\n }\n\n if (process.platform === 'win32') {\n return [\n { command: 'cmd', args: ['/c', 'start', '', url] },\n {\n command: 'powershell',\n args: ['-NoProfile', '-NonInteractive', '-Command', `Start-Process '${url}'`],\n },\n ];\n }\n\n return [\n { command: 'xdg-open', args: [url] },\n { command: 'gio', args: ['open', url] },\n ];\n}\n\nasync function openExternalUrl(url: string): Promise<void> {\n const commands = getBrowserOpenCommands(url);\n let lastError: Error | null = null;\n\n for (const { command, args } of commands) {\n try {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { stdio: 'ignore' });\n child.once('error', reject);\n child.once('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(`Failed to open browser with '${command}' (exit ${code ?? 'unknown'})`));\n });\n });\n return;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n throw new Error('Failed to open browser: no launch command available.');\n}\n\nfunction formatOpenError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n\n try {\n return String(error);\n } catch {\n return 'unknown error';\n }\n}\n\nfunction printOpenWarning(adminUrl: string, useColor: boolean, reason: string): void {\n const warning = `Warning: could not open browser automatically. Open this URL manually: ${adminUrl}`;\n if (reason) {\n const message = `${warning}\\nReason: ${reason}`;\n console.error(useColor ? chalk.yellow(message) : message);\n return;\n }\n\n console.error(useColor ? chalk.yellow(warning) : warning);\n}\n\nasync function openGhostAdminForLogin(adminOrigin: string, useColor: boolean): Promise<void> {\n const staffSettingsUrl = getGhostStaffSettingsUrl(adminOrigin);\n const preflight = `Opening Ghost Admin in your browser: ${staffSettingsUrl}`;\n console.log('');\n console.log(useColor ? chalk.cyan(preflight) : preflight);\n console.log('');\n try {\n await openUrlFn(staffSettingsUrl);\n } catch (error) {\n const detail = formatOpenError(error);\n printOpenWarning(staffSettingsUrl, useColor, detail);\n }\n}\n/* c8 ignore stop */\n\nlet promptFn: PromptFn = prompt;\nlet openUrlFn: OpenUrlFn = openExternalUrl;\n\nexport function setPromptForTests(nextPrompt: PromptFn | null): void {\n promptFn = nextPrompt ?? prompt;\n}\n\nexport function setOpenUrlForTests(nextOpenUrl: OpenUrlFn | null): void {\n openUrlFn = nextOpenUrl ?? openExternalUrl;\n}\n\nfunction printLoginGuidance(useColor: boolean): void {\n console.log('');\n console.log(LOGIN_GUIDANCE_BORDER);\n console.log(LOGIN_GUIDANCE_TITLE);\n console.log(LOGIN_GUIDANCE_BORDER);\n console.log(\n useColor\n ? LOGIN_GUIDANCE_LINE.replace('staff access token', chalk.yellow('staff access token'))\n : LOGIN_GUIDANCE_LINE,\n );\n console.log('');\n}\n\nconst URL_PROTOCOL_PATTERN = /^[A-Za-z][A-Za-z\\d+.-]*:\\/\\//;\n\nfunction normalizeGhostUrl(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new GhstError('Ghost URL is required.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const candidate = URL_PROTOCOL_PATTERN.test(trimmed) ? trimmed : `https://${trimmed}`;\n\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n throw new GhstError('Ghost URL must be valid (e.g. https://example.com).', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new GhstError('Ghost URL must use http:// or https://.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n return parsed.origin;\n}\n\nfunction getGhostAdminEntryUrl(url: string): string {\n const normalizedUrl = normalizeGhostUrl(url);\n return `${normalizedUrl}/ghost`;\n}\n\nfunction getGhostStaffSettingsUrl(url: string): string {\n const normalizedUrl = normalizeGhostUrl(url);\n return `${normalizedUrl}/ghost/#/settings/staff`;\n}\n\nasync function resolveGhostAdminOrigin(inputUrl: string): Promise<string> {\n const maxRedirects = 5;\n let probeUrl = getGhostAdminEntryUrl(inputUrl);\n\n for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount += 1) {\n let response: Response;\n try {\n response = await fetch(probeUrl, {\n method: 'GET',\n redirect: 'manual',\n });\n } catch (error) {\n throw new GhstError(\n `Unable to reach Ghost Admin URL '${probeUrl}': ${(error as Error).message}`,\n {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'NETWORK_ERROR',\n },\n );\n }\n\n const location = response.headers.get('location');\n const isRedirect = response.status >= 300 && response.status < 400;\n if (isRedirect && location) {\n probeUrl = new URL(location, probeUrl).toString();\n continue;\n }\n\n const finalUrl = response.url || probeUrl;\n return normalizeGhostUrl(finalUrl);\n }\n\n throw new GhstError(`Too many redirects while resolving Ghost Admin URL from '${inputUrl}'.`, {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'NETWORK_ERROR',\n });\n}\n\nasync function persistSiteCredential(\n alias: string,\n staffTokenInput: string,\n allowInsecureStorage: boolean,\n): Promise<{ credentialRef?: string; staffAccessToken?: string }> {\n const store = getCredentialStore();\n const available = await store.isAvailable().catch(() => false);\n\n if (available) {\n const credentialRef = credentialRefForAlias(alias);\n await store.set(credentialRef, staffTokenInput);\n return { credentialRef };\n }\n\n if (!allowInsecureStorage) {\n throw new GhstError(\n 'Secure credential storage is unavailable. Re-run with --insecure-storage to store credentials in config.json.',\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n\n return { staffAccessToken: staffTokenInput };\n}\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command('auth').description('Authentication management');\n\n auth\n .command('login')\n .description('Authenticate and store site credentials')\n .option('--url <url>', 'Ghost site URL')\n .option('--staff-token <token>', 'Staff access token in {id}:{secret} format')\n .option('--staff-token-env <name>', 'Read staff token from env var name')\n .option('--non-interactive', 'Disable prompts and require explicit credentials')\n .option(\n '--insecure-storage',\n 'Allow plaintext credential storage when secure storage is unavailable',\n )\n .option('--site <alias>', 'Optional site alias')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const nonInteractive = Boolean(options.nonInteractive);\n\n if (global.json && !nonInteractive) {\n throw new GhstError('Use --non-interactive when combining auth login with --json.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const envStaffTokenInput = options.staffTokenEnv\n ? process.env[options.staffTokenEnv]\n : undefined;\n let urlInput = options.url || global.url;\n let staffTokenInput = options.staffToken || global.staffToken || envStaffTokenInput;\n\n if (nonInteractive) {\n if (!urlInput || !staffTokenInput) {\n throw new GhstError(\n 'Non-interactive login requires both --url and --staff-token (or --staff-token-env).',\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n } else {\n urlInput = urlInput || (await promptFn('Ghost URL (e.g. https://example.com): '));\n }\n\n urlInput = normalizeGhostUrl(urlInput ?? '');\n urlInput = await resolveGhostAdminOrigin(urlInput);\n\n if (!nonInteractive) {\n printLoginGuidance(global.color !== false);\n await promptFn('Press Enter to Continue...');\n await openGhostAdminForLogin(urlInput, global.color !== false);\n if (!staffTokenInput) {\n staffTokenInput = await promptFn('Ghost Staff Access Token: ');\n }\n }\n\n parseStaffAccessToken(staffTokenInput);\n\n const client = new GhostClient({\n url: urlInput,\n staffToken: staffTokenInput,\n version: process.env.GHOST_API_VERSION ?? 'v6.0',\n });\n\n await client.siteInfo();\n\n const config = await readUserConfig();\n const alias = options.site ?? deriveSiteAlias(urlInput);\n const persisted = await persistSiteCredential(\n alias,\n staffTokenInput,\n Boolean(options.insecureStorage),\n );\n config.sites[alias] = {\n url: urlInput,\n ...(persisted.credentialRef ? { credentialRef: persisted.credentialRef } : {}),\n ...(persisted.staffAccessToken ? { staffAccessToken: persisted.staffAccessToken } : {}),\n apiVersion: process.env.GHOST_API_VERSION ?? 'v6.0',\n addedAt: new Date().toISOString(),\n };\n config.active = alias;\n await writeUserConfig(config);\n\n if (global.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n site: alias,\n url: urlInput,\n active: config.active,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n const successMessage = 'Successfully authenticated with Ghost';\n console.log(global.color === false ? successMessage : chalk.green(successMessage));\n });\n\n auth\n .command('status')\n .description('Show configured authentication state')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const aliases = Object.keys(config.sites);\n\n if (global.json) {\n console.log(\n JSON.stringify(\n {\n active: config.active ?? null,\n sites: aliases,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (aliases.length === 0) {\n console.log('No configured sites. Run ghst auth login.');\n return;\n }\n\n console.log(`Active site: ${config.active ?? '(none)'}`);\n for (const [alias, site] of Object.entries(config.sites)) {\n const marker = config.active === alias ? '*' : ' ';\n console.log(`${marker} ${alias} -> ${site.url}`);\n }\n });\n\n auth\n .command('list')\n .description('List configured sites')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const aliases = Object.keys(config.sites);\n\n if (global.json) {\n console.log(JSON.stringify({ sites: aliases }, null, 2));\n return;\n }\n\n for (const alias of aliases) {\n console.log(alias);\n }\n });\n\n auth\n .command('switch [site]')\n .description('Switch active site alias (interactive if omitted)')\n .action(async (site: string | undefined) => {\n const config = await readUserConfig();\n const aliases = Object.keys(config.sites);\n\n if (aliases.length === 0) {\n throw new GhstError('No configured sites. Run ghst auth login first.', {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n });\n }\n\n let targetSite = site;\n if (!targetSite) {\n if (!process.stdin.isTTY) {\n throw new GhstError('Missing site argument. Run interactively or provide <site>.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n console.log('Configured sites:');\n for (const alias of aliases) {\n const marker = config.active === alias ? '*' : ' ';\n console.log(`${marker} ${alias}`);\n }\n\n targetSite = await promptFn('Switch to site alias: ');\n }\n\n if (!targetSite || !config.sites[targetSite]) {\n throw new GhstError(`Unknown site alias: ${targetSite ?? '(empty)'}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n config.active = targetSite;\n await writeUserConfig(config);\n console.log(`Active site set to '${targetSite}'.`);\n });\n\n auth\n .command('logout')\n .description('Remove credentials for one site or all sites')\n .option('--site <alias>', 'Specific site to remove')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const targetSite = options.site ?? global.site;\n const store = getCredentialStore();\n\n if (targetSite) {\n const site = config.sites[targetSite];\n if (!site) {\n throw new GhstError(`Unknown site alias: ${targetSite}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n if (site.credentialRef) {\n await store.delete(site.credentialRef).catch(() => undefined);\n }\n delete config.sites[targetSite];\n if (config.active === targetSite) {\n config.active = Object.keys(config.sites)[0];\n }\n await writeUserConfig(config);\n console.log(`Removed site '${targetSite}'.`);\n return;\n }\n\n for (const site of Object.values(config.sites)) {\n if (site.credentialRef) {\n await store.delete(site.credentialRef).catch(() => undefined);\n }\n }\n config.active = undefined;\n config.sites = {};\n await writeUserConfig(config);\n console.log('Removed all configured sites.');\n });\n\n auth\n .command('link')\n .description('Link current project directory to a configured site alias')\n .option('--site <alias>', 'Site alias to link')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const siteAlias = options.site ?? global.site ?? config.active;\n\n if (!siteAlias || !config.sites[siteAlias]) {\n throw new GhstError('A valid configured site alias is required for linking.', {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'SITE_REQUIRED',\n });\n }\n\n await writeProjectConfig({\n site: siteAlias,\n });\n\n console.log(`Linked current directory to '${siteAlias}'.`);\n });\n\n auth\n .command('token')\n .description('Print a short-lived staff JWT for the active connection')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const connection = await resolveConnectionConfig(global);\n const token = await generateStaffJwt(connection.staffToken);\n console.log(token);\n });\n}\n","import type { Command } from 'commander';\nimport { ExitCode, GhstError } from '../lib/errors.js';\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n\nfunction getTopLevelEntries(program: Command): string[] {\n const commandNames = program.commands\n .map((entry) => entry.name())\n .filter((name) => Boolean(name) && name !== 'help');\n const globalFlags = program.options.map((entry) => entry.long).filter(Boolean) as string[];\n\n return unique([...commandNames, 'help', ...globalFlags]);\n}\n\nfunction getBashCompletion(entries: string[]): string {\n return `# ghst bash completion\\n_ghst_complete() {\\n local cur prev\\n COMPREPLY=()\\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\\n COMPREPLY=( $(compgen -W \"${entries.join(' ')}\" -- \"$cur\") )\\n return 0\\n}\\ncomplete -F _ghst_complete ghst\\n`;\n}\n\nfunction getZshCompletion(entries: string[]): string {\n return `#compdef ghst\\n_arguments '*: :(${entries.join(' ')})'\\n`;\n}\n\nfunction getFishCompletion(entries: string[]): string {\n return entries\n .map((entry) => `complete -c ghst -f -a '${entry}'`)\n .join('\\n')\n .concat('\\n');\n}\n\nfunction getPowerShellCompletion(entries: string[]): string {\n return `Register-ArgumentCompleter -Native -CommandName ghst -ScriptBlock {\\n param($wordToComplete, $commandAst, $cursorPosition)\\n @(${entries.map((entry) => `'${entry}'`).join(', ')}) |\\n Where-Object { $_ -like \"$wordToComplete*\" } |\\n ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) }\\n}\\n`;\n}\n\nexport function registerCompletionCommands(program: Command): void {\n program\n .command('completion [shell]')\n .description('Print shell completion script')\n .action((shell: string | undefined) => {\n const entries = getTopLevelEntries(program);\n\n if (!shell) {\n console.log('Usage: ghst completion <bash|zsh|fish|powershell>');\n return;\n }\n\n if (shell === 'bash') {\n console.log(getBashCompletion(entries));\n return;\n }\n\n if (shell === 'zsh') {\n console.log(getZshCompletion(entries));\n return;\n }\n\n if (shell === 'fish') {\n console.log(getFishCompletion(entries));\n return;\n }\n\n if (shell === 'powershell') {\n console.log(getPowerShellCompletion(entries));\n return;\n }\n\n throw new GhstError(`Unsupported shell: ${shell}`, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n });\n}\n","import type { Command } from 'commander';\nimport { getUserConfigPath, readUserConfig, writeUserConfig } from '../lib/config.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { UserConfigSchema } from '../schemas/config.js';\n\nconst REDACTED = '<redacted>';\nconst SENSITIVE_KEY_PATTERN = /(key|token|secret|password)/i;\n\nfunction isSensitivePath(path: string): boolean {\n return path\n .split('.')\n .some(\n (segment) =>\n segment.toLowerCase() === 'staffaccesstoken' || SENSITIVE_KEY_PATTERN.test(segment),\n );\n}\n\nfunction redactValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => redactValue(entry));\n }\n\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n const output: Record<string, unknown> = {};\n for (const [key, entryValue] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'staffAccessToken' || SENSITIVE_KEY_PATTERN.test(key)) {\n output[key] = REDACTED;\n continue;\n }\n output[key] = redactValue(entryValue);\n }\n\n return output;\n}\n\nfunction getByPath(source: Record<string, unknown>, keyPath: string): unknown {\n return keyPath.split('.').reduce<unknown>((acc, key) => {\n if (typeof acc !== 'object' || acc === null) {\n return undefined;\n }\n return (acc as Record<string, unknown>)[key];\n }, source);\n}\n\nfunction setByPath(target: Record<string, unknown>, keyPath: string, value: unknown): void {\n const parts = keyPath.split('.');\n const leaf = parts.pop();\n\n if (!leaf) {\n throw new GhstError('Invalid config path.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n let cursor: Record<string, unknown> = target;\n for (const part of parts) {\n const next = cursor[part];\n if (typeof next !== 'object' || next === null) {\n cursor[part] = {};\n }\n cursor = cursor[part] as Record<string, unknown>;\n }\n\n cursor[leaf] = value;\n}\n\nfunction parseConfigValue(\n configPath: string,\n rawValue: string,\n config: Record<string, unknown>,\n): unknown {\n if (configPath === 'defaults.limit') {\n const limit = Number(rawValue);\n if (!Number.isInteger(limit) || limit <= 0) {\n throw new GhstError('defaults.limit must be a positive integer.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n return limit;\n }\n\n if (configPath === 'defaults.format' || configPath === 'defaults.editor') {\n return rawValue;\n }\n\n if (configPath === 'active') {\n if (rawValue === 'none') {\n return undefined;\n }\n\n const sites = (config.sites as Record<string, unknown> | undefined) ?? {};\n if (!sites[rawValue]) {\n throw new GhstError(`Unknown site alias: ${rawValue}`, {\n code: 'SITE_NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n return rawValue;\n }\n\n throw new GhstError(`Unsupported config path: ${configPath}`, {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n}\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command('config').description('CLI configuration');\n\n config\n .command('show')\n .description('Show current user config')\n .option('--show-secrets', 'Display sensitive values in plaintext')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const userConfig = await readUserConfig();\n const payload = options.showSecrets ? userConfig : redactValue(userConfig);\n\n if (global.json) {\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n\n console.log(JSON.stringify(payload, null, 2));\n });\n\n config\n .command('path')\n .description('Print user config file path')\n .action(() => {\n console.log(getUserConfigPath());\n });\n\n config\n .command('list')\n .description('List configurable defaults')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const userConfig = await readUserConfig();\n const payload = {\n active: userConfig.active ?? null,\n defaults: userConfig.defaults ?? {},\n sites: Object.keys(userConfig.sites),\n };\n\n if (global.json) {\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n\n console.log(JSON.stringify(payload, null, 2));\n });\n\n config\n .command('get <path>')\n .description('Read a config value by dot path')\n .option('--show-secrets', 'Display sensitive values in plaintext')\n .action(async (path: string, options, command) => {\n const global = getGlobalOptions(command);\n const userConfig = await readUserConfig();\n let value = getByPath(userConfig as unknown as Record<string, unknown>, path);\n\n if (global.json) {\n if (!options.showSecrets && isSensitivePath(path)) {\n value = REDACTED;\n }\n console.log(JSON.stringify({ path, value: value ?? null }, null, 2));\n return;\n }\n\n if (value === undefined) {\n throw new GhstError(`Config value not found: ${path}`, {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n if (!options.showSecrets && isSensitivePath(path)) {\n value = REDACTED;\n }\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value));\n });\n\n config\n .command('set <path> <value>')\n .description('Set a config value by dot path')\n .action(async (path: string, value: string) => {\n const userConfig = await readUserConfig();\n const mutable = structuredClone(userConfig) as unknown as Record<string, unknown>;\n const parsedValue = parseConfigValue(path, value, mutable);\n\n setByPath(mutable, path, parsedValue);\n const validated = UserConfigSchema.parse(mutable);\n await writeUserConfig(validated);\n\n console.log(`Updated ${path}.`);\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nconst IMAGE_MIME_BY_EXT: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.avif': 'image/avif',\n};\n\nfunction inferImageMimeType(filePath: string): string {\n const extension = path.extname(filePath).toLowerCase();\n return IMAGE_MIME_BY_EXT[extension] ?? 'application/octet-stream';\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function uploadImage(\n global: GlobalOptions,\n options: {\n filePath: string;\n purpose?: string;\n ref?: string;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const bytes = await fs.readFile(options.filePath);\n const mimeType = inferImageMimeType(options.filePath);\n\n const formData = new FormData();\n formData.append('file', new Blob([bytes], { type: mimeType }), path.basename(options.filePath));\n\n if (options.purpose) {\n formData.append('purpose', options.purpose);\n }\n\n if (options.ref) {\n formData.append('ref', options.ref);\n }\n\n return client.images.upload(formData);\n}\n","import { z } from 'zod';\n\nexport const ImageUploadInputSchema = z.object({\n filePath: z.string().min(1),\n purpose: z.string().min(1).optional(),\n ref: z.string().min(1).optional(),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { uploadImage } from '../lib/images.js';\nimport { printJson } from '../lib/output.js';\nimport { ImageUploadInputSchema } from '../schemas/image.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerImageCommands(program: Command): void {\n const image = program.command('image').description('Image management');\n\n image\n .command('upload <filePath...>')\n .description('Upload one or more images')\n .option('--purpose <purpose>', 'Image purpose')\n .option('--ref <ref>', 'Reference value')\n .action(async (filePaths: string[], options, command) => {\n const global = getGlobalOptions(command);\n const results: Array<Record<string, unknown>> = [];\n\n for (const filePath of filePaths) {\n const parsed = ImageUploadInputSchema.safeParse({\n filePath,\n purpose: options.purpose,\n ref: options.ref,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await uploadImage(global, {\n filePath: parsed.data.filePath,\n purpose: parsed.data.purpose,\n ref: parsed.data.ref,\n });\n\n results.push(payload);\n }\n\n if (global.json) {\n printJson({ images: results }, global.jq);\n return;\n }\n\n for (const payload of results) {\n const images = Array.isArray(payload.images)\n ? (payload.images as Array<Record<string, unknown>>)\n : [];\n const first = images[0] ?? payload;\n console.log(String(first.url ?? first.path ?? 'Uploaded image'));\n }\n });\n}\n","import type { GhostPaginatedResponse } from './client.js';\n\ninterface PaginationMeta {\n page?: number;\n pages?: number;\n next?: number | null;\n prev?: number | null;\n limit?: number;\n total?: number;\n}\n\nfunction getPagination(payload: GhostPaginatedResponse): PaginationMeta {\n const meta = payload.meta as Record<string, unknown> | undefined;\n const pagination = meta?.pagination as PaginationMeta | undefined;\n return pagination ?? {};\n}\n\nexport async function collectAllPages(\n key: string,\n fetchPage: (page: number) => Promise<GhostPaginatedResponse>,\n): Promise<GhostPaginatedResponse> {\n const first = await fetchPage(1);\n const initial = Array.isArray(first[key]) ? [...(first[key] as unknown[])] : [];\n\n const firstPagination = getPagination(first);\n const pages = Number(firstPagination.pages ?? 1);\n\n for (let page = 2; page <= pages; page += 1) {\n const nextPayload = await fetchPage(page);\n const nextItems = Array.isArray(nextPayload[key]) ? (nextPayload[key] as unknown[]) : [];\n initial.push(...nextItems);\n }\n\n const mergedPagination: PaginationMeta = {\n ...firstPagination,\n page: 1,\n pages: 1,\n next: null,\n prev: null,\n total: initial.length,\n limit: initial.length,\n };\n\n const meta = {\n ...(typeof first.meta === 'object' && first.meta !== null ? first.meta : {}),\n pagination: mergedPagination,\n };\n\n return {\n ...first,\n [key]: initial,\n meta,\n };\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstLabel(payload: Record<string, unknown>): Record<string, unknown> {\n const labels = payload.labels;\n if (!Array.isArray(labels) || labels.length === 0) {\n throw new GhstError('Label not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (labels[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listLabels(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.labels.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('labels', (page) => client.labels.browse({ ...params, page, limit }));\n}\n\nexport async function getLabel(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.labels.read(idOrSlug, options);\n}\n\nexport async function createLabel(\n global: GlobalOptions,\n label: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.labels.add(label);\n}\n\nexport async function updateLabel(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n let id = options.id;\n if (!id && options.slug) {\n const payload = await client.labels.read(options.slug, { bySlug: true });\n const label = getFirstLabel(payload);\n id = String(label.id ?? '');\n }\n\n if (!id) {\n throw new GhstError('Provide an id argument or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n return client.labels.edit(id, options.patch);\n}\n\nexport async function deleteLabel(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.labels.delete(id);\n}\n\nfunction extractLabelIds(payload: GhostPaginatedResponse): string[] {\n const labels = Array.isArray(payload.labels) ? payload.labels : [];\n return labels\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nexport async function bulkLabels(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n name?: string;\n },\n): Promise<Record<string, unknown>> {\n const list = await listLabels(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const ids = extractLabelIds(list);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deleteLabel(global, id);\n } else {\n await updateLabel(global, {\n id,\n patch: {\n name: options.name,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import readline from 'node:readline/promises';\n\nexport type PromptHandler = (question: string) => Promise<string>;\n\n/* c8 ignore start */\nasync function defaultPrompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const value = await rl.question(question);\n return value.trim();\n } finally {\n rl.close();\n }\n}\n/* c8 ignore stop */\n\nlet promptHandler: PromptHandler = defaultPrompt;\n\nexport function setPromptHandlerForTests(nextPrompt: PromptHandler | null): void {\n promptHandler = nextPrompt ?? defaultPrompt;\n}\n\nexport async function ask(question: string): Promise<string> {\n return promptHandler(question);\n}\n\nexport async function confirm(question: string): Promise<boolean> {\n const value = (await ask(question)).trim().toLowerCase();\n return value === 'y' || value === 'yes';\n}\n","import { z } from 'zod';\n\nexport const LabelListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const LabelGetInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.slug), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.slug), {\n message: 'Use either id argument or --slug, not both.',\n path: ['id'],\n });\n\nexport const LabelCreateInputSchema = z.object({\n name: z.string().min(1),\n});\n\nexport const LabelUpdateInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slugLookup: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n })\n .refine((data) => Boolean(data.id || data.slugLookup), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.slugLookup), {\n message: 'Use either id argument or --slug, not both.',\n path: ['id'],\n })\n .refine((data) => Boolean(data.name), {\n message: 'Provide at least one update field.',\n });\n\nexport const LabelDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const LabelBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']),\n name: z.string().min(1).optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => data.action !== 'delete' || data.yes === true, {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n })\n .refine((data) => data.action !== 'update' || Boolean(data.name), {\n message: 'Bulk update requires --name.',\n path: ['name'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n bulkLabels,\n createLabel,\n deleteLabel,\n getLabel,\n listLabels,\n updateLabel,\n} from '../lib/labels.js';\nimport {\n printJson,\n printLabelHuman,\n printLabelListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n LabelBulkInputSchema,\n LabelCreateInputSchema,\n LabelDeleteInputSchema,\n LabelGetInputSchema,\n LabelListInputSchema,\n LabelUpdateInputSchema,\n} from '../schemas/label.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerLabelCommands(program: Command): void {\n const label = program.command('label').description('Label management');\n\n label\n .command('list')\n .description('List labels')\n .option('--limit <numberOrAll>', 'Number of labels per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = LabelListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listLabels(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelListHuman(payload, global.color !== false);\n });\n\n label\n .command('get [id]')\n .description('Get a label by id or slug')\n .option('--slug <slug>', 'Label slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = LabelGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const payload = await getLabel(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelHuman(payload);\n });\n\n label\n .command('create')\n .description('Create a label')\n .requiredOption('--name <name>', 'Label name')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelCreateInputSchema.safeParse({\n name: options.name,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createLabel(global, {\n name: parsed.data.name,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelHuman(payload);\n });\n\n label\n .command('update [id]')\n .description('Update a label by id or slug')\n .option('--slug <slug>', 'Label slug lookup')\n .requiredOption('--name <name>', 'Label name')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelUpdateInputSchema.safeParse({\n id,\n slugLookup: options.slug,\n name: options.name,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateLabel(global, {\n id: parsed.data.id,\n slug: parsed.data.slugLookup,\n patch: {\n name: parsed.data.name,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelHuman(payload);\n });\n\n label\n .command('delete <id>')\n .description('Delete a label')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete label '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteLabel(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted label '${parsed.data.id}'.`);\n });\n\n label\n .command('bulk')\n .description('Run bulk label operations')\n .requiredOption('--filter <nql>', 'NQL filter to select labels')\n .requiredOption('--action <action>', 'update|delete')\n .option('--name <name>', 'Label name for update action')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n name: options.name,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkLabels(global, {\n filter: parsed.data.filter,\n delete: parsed.data.action === 'delete',\n name: parsed.data.name,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk label operation completed');\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { GlobalOptions } from '../lib/types.js';\nimport { type McpToolGroup, registerCoreTools } from './tools/core.js';\n\nexport function createGhostMcpServer(\n global: GlobalOptions,\n options: {\n enabledGroups: Set<McpToolGroup>;\n },\n): McpServer {\n const server = new McpServer({\n name: 'ghst',\n version: '0.4.0',\n });\n\n registerCoreTools(server, global, options.enabledGroups);\n return server;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { GhostClient } from '../../lib/client.js';\nimport { resolveConnectionConfig } from '../../lib/config.js';\nimport { uploadImage } from '../../lib/images.js';\nimport {\n createMember,\n deleteMember,\n getMember,\n importMembersCsv,\n listMembers,\n updateMember,\n} from '../../lib/members.js';\nimport { listNewsletters } from '../../lib/newsletters.js';\nimport { listOffers } from '../../lib/offers.js';\nimport { createPage, deletePage, getPage, listPages, updatePage } from '../../lib/pages.js';\nimport { parseCsv } from '../../lib/parse.js';\nimport {\n createPost,\n deletePost,\n getPost,\n listPosts,\n publishPost,\n updatePost,\n} from '../../lib/posts.js';\nimport { getSetting, listSettings, setSetting } from '../../lib/settings.js';\nimport { getSiteInfo } from '../../lib/site.js';\nimport { createTag, deleteTag, getTag, listTags, updateTag } from '../../lib/tags.js';\nimport { activateTheme, uploadTheme } from '../../lib/themes.js';\nimport { listTiers } from '../../lib/tiers.js';\nimport type { GlobalOptions } from '../../lib/types.js';\nimport { listUsers } from '../../lib/users.js';\nimport { createWebhook } from '../../lib/webhooks.js';\n\nexport type McpToolGroup =\n | 'posts'\n | 'pages'\n | 'tags'\n | 'members'\n | 'site'\n | 'settings'\n | 'users'\n | 'api'\n | 'search';\n\nexport const MCP_TOOL_GROUPS: readonly McpToolGroup[] = [\n 'posts',\n 'pages',\n 'tags',\n 'members',\n 'site',\n 'settings',\n 'users',\n 'api',\n 'search',\n] as const;\n\nfunction toolResult(data: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: Record<string, unknown>;\n} {\n let structuredContent: Record<string, unknown>;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n structuredContent = data as Record<string, unknown>;\n } else if (Array.isArray(data)) {\n structuredContent = { items: data };\n } else {\n structuredContent = { value: data };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(data, null, 2),\n },\n ],\n structuredContent,\n };\n}\n\nfunction escapeNqlValue(value: string): string {\n return value.replace(/'/g, \"\\\\'\");\n}\n\nasync function runSearch(\n global: GlobalOptions,\n query: string,\n limit: number,\n): Promise<Record<string, unknown>> {\n const escaped = escapeNqlValue(query);\n const filter = `title:~'${escaped}'`;\n\n const [posts, pages, tags, members] = await Promise.all([\n listPosts(global, { filter, limit }, false),\n listPages(global, { filter, limit }, false),\n listTags(global, { filter: `name:~'${escaped}'`, limit }, false),\n listMembers(global, { filter: `email:~'${escaped}',name:~'${escaped}'`, limit }, false),\n ]);\n\n return {\n query,\n posts: Array.isArray(posts.posts) ? posts.posts : [],\n pages: Array.isArray(pages.pages) ? pages.pages : [],\n tags: Array.isArray(tags.tags) ? tags.tags : [],\n members: Array.isArray(members.members) ? members.members : [],\n };\n}\n\nasync function callApi(\n global: GlobalOptions,\n options: {\n path: string;\n method?: string;\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n contentApi?: boolean;\n },\n): Promise<Record<string, unknown>> {\n const connection = await resolveConnectionConfig(global);\n const client = new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n contentKey: process.env.GHOST_CONTENT_API_KEY,\n });\n\n const payload = await client.rawRequest<Record<string, unknown>>(\n options.path,\n options.method ?? 'GET',\n options.body,\n options.params,\n {\n api: options.contentApi ? 'content' : 'admin',\n },\n );\n\n return payload;\n}\n\nexport function registerCoreTools(\n server: McpServer,\n global: GlobalOptions,\n enabledGroups: Set<McpToolGroup>,\n): void {\n if (enabledGroups.has('posts')) {\n server.registerTool(\n 'ghost_post_list',\n {\n description: 'List Ghost posts.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await listPosts(global, { ...args }, false);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_get',\n {\n description: 'Get a Ghost post by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await getPost(global, args.slug ?? args.id ?? '', {\n bySlug: Boolean(args.slug),\n params: {\n include: args.include,\n },\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_create',\n {\n description: 'Create a Ghost post.',\n inputSchema: z.object({\n title: z.string(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n tags: z.array(z.string()).optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await createPost(\n global,\n {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n tags: args.tags,\n visibility: args.visibility,\n },\n args.html ? 'html' : undefined,\n );\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_update',\n {\n description: 'Update a Ghost post by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n title: z.string().optional(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n tags: z.array(z.string()).optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await updatePost(global, {\n id: args.id,\n slug: args.slug,\n patch: {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n tags: args.tags,\n visibility: args.visibility,\n },\n source: args.html ? 'html' : undefined,\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_delete',\n {\n description: 'Delete a Ghost post.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => {\n const payload = await deletePost(global, args.id);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_publish',\n {\n description: 'Publish a Ghost post.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => {\n const payload = await publishPost(global, args.id);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_image_upload',\n {\n description: 'Upload an image and return the uploaded image payload.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n purpose: z.string().optional(),\n ref: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await uploadImage(global, {\n filePath: args.file_path,\n purpose: args.purpose,\n ref: args.ref,\n }),\n ),\n );\n }\n\n if (enabledGroups.has('pages')) {\n server.registerTool(\n 'ghost_page_list',\n {\n description: 'List Ghost pages.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await listPages(global, { ...args }, false);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_get',\n {\n description: 'Get a Ghost page by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await getPage(global, args.slug ?? args.id ?? '', {\n bySlug: Boolean(args.slug),\n params: {\n include: args.include,\n },\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_create',\n {\n description: 'Create a Ghost page.',\n inputSchema: z.object({\n title: z.string(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await createPage(\n global,\n {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n visibility: args.visibility,\n },\n args.html ? 'html' : undefined,\n );\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_update',\n {\n description: 'Update a Ghost page by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n title: z.string().optional(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await updatePage(global, {\n id: args.id,\n slug: args.slug,\n patch: {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n visibility: args.visibility,\n },\n source: args.html ? 'html' : undefined,\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_delete',\n {\n description: 'Delete a Ghost page.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => {\n const payload = await deletePage(global, args.id);\n return toolResult(payload);\n },\n );\n }\n\n if (enabledGroups.has('tags')) {\n server.registerTool(\n 'ghost_tag_list',\n {\n description: 'List Ghost tags.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listTags(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_tag_get',\n {\n description: 'Get a Ghost tag by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getTag(global, args.slug ?? args.id ?? '', {\n bySlug: Boolean(args.slug),\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_tag_create',\n {\n description: 'Create a Ghost tag.',\n inputSchema: z.object({\n name: z.string(),\n slug: z.string().optional(),\n description: z.string().optional(),\n }),\n },\n async (args) => toolResult(await createTag(global, args)),\n );\n\n server.registerTool(\n 'ghost_tag_update',\n {\n description: 'Update a Ghost tag.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await updateTag(global, {\n id: args.id,\n slug: args.slug,\n patch: {\n name: args.name,\n description: args.description,\n },\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_tag_delete',\n {\n description: 'Delete a Ghost tag.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => toolResult(await deleteTag(global, args.id)),\n );\n }\n\n if (enabledGroups.has('members')) {\n server.registerTool(\n 'ghost_member_list',\n {\n description: 'List Ghost members.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n search: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listMembers(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_member_get',\n {\n description: 'Get Ghost member by id or email.',\n inputSchema: z.object({\n id: z.string().optional(),\n email: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getMember(global, {\n id: args.id,\n email: args.email,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_member_create',\n {\n description: 'Create Ghost member.',\n inputSchema: z.object({\n email: z.string(),\n name: z.string().optional(),\n labels: z.array(z.string()).optional(),\n newsletters: z.array(z.string()).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await createMember(global, {\n email: args.email,\n name: args.name,\n labels: args.labels,\n newsletters: args.newsletters,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_member_update',\n {\n description: 'Update Ghost member.',\n inputSchema: z.object({\n id: z.string().optional(),\n email: z.string().optional(),\n name: z.string().optional(),\n note: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await updateMember(global, {\n id: args.id,\n email: args.email,\n patch: {\n name: args.name,\n note: args.note,\n },\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_member_delete',\n {\n description: 'Delete Ghost member.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => toolResult(await deleteMember(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_member_import',\n {\n description: 'Import members from a CSV file path.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n labels: z.array(z.string()).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await importMembersCsv(global, {\n filePath: args.file_path,\n labels: args.labels,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_newsletter_list',\n {\n description: 'List Ghost newsletters.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listNewsletters(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_tier_list',\n {\n description: 'List Ghost tiers.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listTiers(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_offer_list',\n {\n description: 'List Ghost offers.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listOffers(global, { ...args }, false)),\n );\n }\n\n if (enabledGroups.has('site')) {\n server.registerTool(\n 'ghost_site_info',\n {\n description: 'Get Ghost site metadata.',\n },\n async () => toolResult(await getSiteInfo(global)),\n );\n\n server.registerTool(\n 'ghost_theme_upload',\n {\n description: 'Upload a Ghost theme zip path and optionally activate it.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n activate: z.boolean().optional(),\n }),\n },\n async (args) => {\n const payload = await uploadTheme(global, args.file_path);\n if (args.activate) {\n const themes = Array.isArray(payload.themes) ? payload.themes : [];\n const first = (themes[0] as Record<string, unknown> | undefined) ?? payload;\n const name = String(first.name ?? '').trim();\n if (name) {\n await activateTheme(global, name);\n }\n }\n\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_webhook_create',\n {\n description: 'Create a Ghost webhook.',\n inputSchema: z.object({\n event: z.string().min(1),\n target_url: z.string().url(),\n name: z.string().optional(),\n secret: z.string().optional(),\n api_version: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await createWebhook(global, {\n event: args.event,\n target_url: args.target_url,\n name: args.name,\n secret: args.secret,\n api_version: args.api_version,\n }),\n ),\n );\n }\n\n if (enabledGroups.has('settings')) {\n server.registerTool(\n 'ghost_setting_list',\n {\n description: 'List Ghost settings.',\n },\n async () => toolResult(await listSettings(global)),\n );\n\n server.registerTool(\n 'ghost_setting_get',\n {\n description: 'Get a Ghost setting by key.',\n inputSchema: z.object({\n key: z.string(),\n }),\n },\n async (args) => toolResult(await getSetting(global, args.key)),\n );\n\n server.registerTool(\n 'ghost_setting_set',\n {\n description: 'Set a Ghost setting by key.',\n inputSchema: z.object({\n key: z.string(),\n value: z.union([z.string(), z.number(), z.boolean(), z.null()]),\n }),\n },\n async (args) => toolResult(await setSetting(global, args.key, args.value)),\n );\n }\n\n if (enabledGroups.has('users')) {\n server.registerTool(\n 'ghost_user_list',\n {\n description: 'List Ghost staff users.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n }),\n },\n async (args) => toolResult(await listUsers(global, { ...args }, false)),\n );\n }\n\n if (enabledGroups.has('api')) {\n server.registerTool(\n 'ghost_api_request',\n {\n description: 'Run a raw Ghost API request.',\n inputSchema: z.object({\n path: z.string(),\n method: z.string().optional(),\n body: z.unknown().optional(),\n params: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n content_api: z.boolean().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await callApi(global, {\n path: args.path,\n method: args.method,\n body: args.body,\n params: args.params as\n | Record<string, string | number | boolean | undefined>\n | undefined,\n contentApi: args.content_api,\n }),\n ),\n );\n }\n\n if (enabledGroups.has('search')) {\n server.registerTool(\n 'ghost_search',\n {\n description: 'Search posts, pages, tags and members.',\n inputSchema: z.object({\n query: z.string().min(1),\n limit: z.number().int().positive().max(50).optional(),\n }),\n },\n async (args) => toolResult(await runSearch(global, args.query, args.limit ?? 10)),\n );\n }\n}\n\nexport function parseToolGroups(toolsArg: string | undefined): Set<McpToolGroup> {\n if (toolsArg === undefined || toolsArg === 'all') {\n return new Set(MCP_TOOL_GROUPS);\n }\n\n const requested = parseCsv(toolsArg) ?? [];\n if (requested.length === 0) {\n return new Set();\n }\n\n const result = new Set<McpToolGroup>();\n for (const value of requested) {\n if ((MCP_TOOL_GROUPS as readonly string[]).includes(value)) {\n result.add(value as McpToolGroup);\n }\n }\n\n return result;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstMember(payload: Record<string, unknown>): Record<string, unknown> {\n const members = payload.members;\n if (!Array.isArray(members) || members.length === 0) {\n throw new GhstError('Member not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (members[0] as Record<string, unknown>) ?? {};\n}\n\nfunction emailFilter(email: string): string {\n const escaped = email.replace(/'/g, \"\\\\'\");\n return `email:'${escaped}'`;\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listMembers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.members.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('members', (page) => client.members.browse({ ...params, page, limit }));\n}\n\nexport async function getMember(\n global: GlobalOptions,\n options: {\n id?: string;\n email?: string;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n if (options.id) {\n return client.members.read(options.id, options.params);\n }\n\n if (options.email) {\n const payload = await client.members.browse({\n ...options.params,\n filter: emailFilter(options.email),\n limit: 1,\n });\n getFirstMember(payload);\n return payload;\n }\n\n throw new GhstError('Provide an id argument or --email.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n}\n\nexport async function createMember(\n global: GlobalOptions,\n member: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.members.add(member, params);\n}\n\nexport async function updateMember(\n global: GlobalOptions,\n options: {\n id?: string;\n email?: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n let id = options.id;\n if (!id && options.email) {\n const payload = await client.members.browse({\n filter: emailFilter(options.email),\n limit: 1,\n });\n const existing = getFirstMember(payload);\n id = String(existing.id ?? '');\n }\n\n if (!id) {\n throw new GhstError('Provide an id argument or --email.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n return client.members.edit(id, options.patch);\n}\n\nexport async function deleteMember(\n global: GlobalOptions,\n id: string,\n options?: {\n cancel?: boolean;\n },\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n\n const params = options?.cancel ? { cancel: true } : undefined;\n return client.members.delete(id, params);\n}\n\nexport async function exportMembersCsv(\n global: GlobalOptions,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<string> {\n const client = await getClient(global);\n return client.members.exportCsv(params);\n}\n\nexport async function importMembersCsv(\n global: GlobalOptions,\n options: {\n filePath: string;\n labels?: string[];\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n const bytes = await fs.readFile(options.filePath);\n const formData = new FormData();\n const fileBlob = new Blob([bytes], { type: 'text/csv' });\n formData.append('membersfile', fileBlob, path.basename(options.filePath));\n\n if (options.labels && options.labels.length > 0) {\n formData.append(\n 'labels',\n JSON.stringify(options.labels.map((name) => ({ name: name.trim() })).filter((l) => l.name)),\n );\n }\n\n return client.members.importCsv(formData);\n}\n\nexport async function bulkMembers(\n global: GlobalOptions,\n options: {\n action: 'unsubscribe' | 'add-label' | 'remove-label' | 'delete' | 'update-labels';\n all?: boolean;\n filter?: string;\n search?: string;\n labelId?: string;\n labels?: string[];\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n const params: Record<string, string | number | boolean | undefined> = {\n all: options.all,\n filter: options.filter,\n search: options.search,\n };\n\n if (options.action === 'update-labels') {\n const list = await listMembers(\n global,\n {\n filter: options.filter,\n search: options.search,\n limit: 100,\n },\n true,\n );\n\n const members = Array.isArray(list.members) ? list.members : [];\n const ids = members\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n const labels = (options.labels ?? [])\n .map((name) => name.trim())\n .filter(Boolean)\n .map((name) => ({ name }));\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await client.members.edit(id, {\n labels,\n });\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n }\n\n if (options.action === 'delete') {\n return client.members.bulkDestroy(params);\n }\n\n let action: 'unsubscribe' | 'addLabel' | 'removeLabel' = 'unsubscribe';\n if (options.action === 'add-label') {\n action = 'addLabel';\n } else if (options.action === 'remove-label') {\n action = 'removeLabel';\n }\n\n const bulk: Record<string, unknown> = { action };\n if ((action === 'addLabel' || action === 'removeLabel') && options.labelId) {\n bulk.meta = {\n label: {\n id: options.labelId,\n },\n };\n }\n\n return client.members.bulkEdit(bulk, params);\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listNewsletters(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.newsletters.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('newsletters', (page) =>\n client.newsletters.browse({ ...params, page, limit }),\n );\n}\n\nexport async function getNewsletter(\n global: GlobalOptions,\n id: string,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.newsletters.read(id, params);\n}\n\nexport async function createNewsletter(\n global: GlobalOptions,\n newsletter: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.newsletters.add(newsletter, params);\n}\n\nexport async function updateNewsletter(\n global: GlobalOptions,\n id: string,\n patch: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.newsletters.edit(id, patch, params);\n}\n\nexport async function bulkNewsletters(\n global: GlobalOptions,\n options: {\n filter: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const list = await listNewsletters(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const newsletters = Array.isArray(list.newsletters) ? list.newsletters : [];\n const ids = newsletters\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await updateNewsletter(global, id, options.patch);\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listOffers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.offers.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('offers', (page) => client.offers.browse({ ...params, page, limit }));\n}\n\nexport async function getOffer(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.offers.read(id);\n}\n\nexport async function createOffer(\n global: GlobalOptions,\n offer: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.offers.add(offer);\n}\n\nexport async function updateOffer(\n global: GlobalOptions,\n id: string,\n patch: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.offers.edit(id, patch);\n}\n\nexport async function bulkOffers(\n global: GlobalOptions,\n options: {\n filter: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const list = await listOffers(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const offers = Array.isArray(list.offers) ? list.offers : [];\n const ids = offers\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await updateOffer(global, id, options.patch);\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstPage(payload: Record<string, unknown>): Record<string, unknown> {\n const pages = payload.pages;\n if (!Array.isArray(pages) || pages.length === 0) {\n throw new GhstError('Page not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (pages[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listPages(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.pages.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('pages', (page) => client.pages.browse({ ...params, page, limit }));\n}\n\nexport async function getPage(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.pages.read(idOrSlug, options);\n}\n\nexport async function createPage(\n global: GlobalOptions,\n page: Record<string, unknown>,\n source?: 'html',\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.pages.add(page, source);\n}\n\nexport async function updatePage(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n source?: 'html';\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const lookup = options.slug ?? options.id;\n\n if (!lookup) {\n throw new GhstError('Provide an id or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const bySlug = Boolean(options.slug);\n const existingPayload = await client.pages.read(lookup, { bySlug });\n const existing = getFirstPage(existingPayload);\n\n const id = String(existing.id ?? '');\n const updatedAt = existing.updated_at;\n\n if (!id || typeof updatedAt !== 'string') {\n throw new GhstError('Page is missing required id/updated_at for update.', {\n code: 'CONFLICT',\n exitCode: ExitCode.CONFLICT,\n });\n }\n\n return client.pages.edit(\n id,\n {\n ...options.patch,\n updated_at: updatedAt,\n },\n options.source,\n );\n}\n\nexport async function deletePage(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.pages.delete(id);\n}\n\nexport async function copyPage(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.pages.copy(id);\n}\n\nfunction extractPageIds(payload: GhostPaginatedResponse): string[] {\n const pages = Array.isArray(payload.pages) ? payload.pages : [];\n return pages\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nexport async function bulkPages(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n status?: 'draft' | 'published' | 'scheduled';\n },\n): Promise<Record<string, unknown>> {\n const list = await listPages(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const ids = extractPageIds(list);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deletePage(global, id);\n } else {\n await updatePage(global, {\n id,\n patch: {\n status: options.status,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostApiError, GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstPost(payload: Record<string, unknown>): Record<string, unknown> {\n const posts = payload.posts;\n if (!Array.isArray(posts) || posts.length === 0) {\n throw new GhstError('Post not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (posts[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listPosts(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.posts.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('posts', (page) => client.posts.browse({ ...params, page, limit }));\n}\n\nexport async function getPost(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.posts.read(idOrSlug, options);\n}\n\nexport async function createPost(\n global: GlobalOptions,\n post: Record<string, unknown>,\n source?: 'html',\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.posts.add(post, source);\n}\n\nexport async function updatePost(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n source?: 'html';\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const lookup = options.slug ?? options.id;\n\n if (!lookup) {\n throw new GhstError('Provide an id or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const bySlug = Boolean(options.slug);\n\n const applyUpdate = async (): Promise<Record<string, unknown>> => {\n const existingPayload = await client.posts.read(lookup, { bySlug });\n const existing = getFirstPost(existingPayload);\n const id = String(existing.id ?? '');\n const updatedAt = existing.updated_at;\n\n if (!id || typeof updatedAt !== 'string') {\n throw new GhstError('Post is missing required id/updated_at for update.', {\n code: 'CONFLICT',\n exitCode: ExitCode.CONFLICT,\n });\n }\n\n return client.posts.edit(\n id,\n {\n ...options.patch,\n updated_at: updatedAt,\n },\n options.source,\n );\n };\n\n try {\n return await applyUpdate();\n } catch (error) {\n if (error instanceof GhostApiError && error.status === 409) {\n return applyUpdate();\n }\n\n throw error;\n }\n}\n\nexport async function deletePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.posts.delete(id);\n}\n\nexport async function publishPost(\n global: GlobalOptions,\n id: string,\n options?: {\n newsletter?: string;\n email_only?: boolean;\n email_segment?: string;\n },\n): Promise<Record<string, unknown>> {\n return updatePost(global, {\n id,\n patch: {\n status: 'published',\n newsletter: options?.newsletter,\n email_only: options?.email_only,\n email_segment: options?.email_segment,\n },\n });\n}\n\nexport async function schedulePost(\n global: GlobalOptions,\n id: string,\n at: string,\n): Promise<Record<string, unknown>> {\n return updatePost(global, {\n id,\n patch: {\n status: 'scheduled',\n published_at: at,\n },\n });\n}\n\nexport async function unschedulePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n return updatePost(global, {\n id,\n patch: {\n status: 'draft',\n published_at: null,\n },\n });\n}\n\nexport async function copyPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.posts.copy(id);\n}\n\nfunction extractPostIds(payload: GhostPaginatedResponse): string[] {\n const posts = Array.isArray(payload.posts) ? payload.posts : [];\n return posts\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nfunction extractPostEntries(payload: GhostPaginatedResponse): Array<Record<string, unknown>> {\n return Array.isArray(payload.posts)\n ? payload.posts.map((entry) => (entry as Record<string, unknown>) ?? {})\n : [];\n}\n\nexport async function bulkPosts(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n status?: 'draft' | 'published' | 'scheduled';\n tags?: string[];\n addTags?: string[];\n authors?: string[];\n },\n): Promise<Record<string, unknown>> {\n const list = await listPosts(\n global,\n {\n filter: options.filter,\n limit: 100,\n include: 'tags,authors',\n },\n true,\n );\n const ids = extractPostIds(list);\n const posts = extractPostEntries(list);\n const postsById = new Map<string, Record<string, unknown>>(\n posts.map((post) => [String(post.id ?? ''), post]),\n );\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deletePost(global, id);\n } else {\n const current = postsById.get(id) ?? {};\n const existingTagNames = Array.isArray(current.tags)\n ? current.tags\n .map((tag) => String((tag as Record<string, unknown>)?.name ?? '').trim())\n .filter(Boolean)\n : [];\n\n let mergedTags: string[] | undefined;\n if (options.addTags && options.addTags.length > 0) {\n const base = options.tags && options.tags.length > 0 ? options.tags : existingTagNames;\n mergedTags = Array.from(new Set([...base, ...options.addTags]));\n }\n\n await updatePost(global, {\n id,\n patch: {\n status: options.status,\n tags: mergedTags ?? options.tags,\n authors: options.authors,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostApiError, GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listSettings(global: GlobalOptions): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.settings.browse();\n}\n\nexport async function getSetting(\n global: GlobalOptions,\n key: string,\n): Promise<Record<string, unknown>> {\n const payload = await listSettings(global);\n const settings = Array.isArray(payload.settings)\n ? (payload.settings as Array<Record<string, unknown>>)\n : [];\n\n const target = settings.find((setting) => String(setting.key ?? '') === key);\n if (!target) {\n throw new GhstError(`Setting not found: ${key}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return {\n settings: [target],\n };\n}\n\nexport async function setSetting(\n global: GlobalOptions,\n key: string,\n value: unknown,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n try {\n return await client.settings.edit([{ key, value }]);\n } catch (error) {\n if (error instanceof GhostApiError && error.status === 403) {\n throw new GhstError(\n 'Settings update is forbidden for this token. Use a staff/user session with settings permissions.',\n {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n status: 403,\n details: error.payload,\n },\n );\n }\n\n throw error;\n }\n}\n","import { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function getSiteInfo(global: GlobalOptions): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.siteInfo();\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstTag(payload: Record<string, unknown>): Record<string, unknown> {\n const tags = payload.tags;\n if (!Array.isArray(tags) || tags.length === 0) {\n throw new GhstError('Tag not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (tags[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listTags(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.tags.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('tags', (page) => client.tags.browse({ ...params, page, limit }));\n}\n\nexport async function getTag(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tags.read(idOrSlug, options);\n}\n\nexport async function createTag(\n global: GlobalOptions,\n tag: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tags.add(tag);\n}\n\nexport async function updateTag(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const lookup = options.slug ?? options.id;\n\n if (!lookup) {\n throw new GhstError('Provide an id or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const bySlug = Boolean(options.slug);\n const existingPayload = await client.tags.read(lookup, { bySlug });\n const existing = getFirstTag(existingPayload);\n\n const id = String(existing.id ?? '');\n const updatedAt = existing.updated_at;\n\n if (!id || typeof updatedAt !== 'string') {\n throw new GhstError('Tag is missing required id/updated_at for update.', {\n code: 'CONFLICT',\n exitCode: ExitCode.CONFLICT,\n });\n }\n\n return client.tags.edit(id, {\n ...options.patch,\n updated_at: updatedAt,\n });\n}\n\nexport async function deleteTag(global: GlobalOptions, id: string): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.tags.delete(id);\n}\n\nfunction extractTagIds(payload: GhostPaginatedResponse): string[] {\n const tags = Array.isArray(payload.tags) ? payload.tags : [];\n return tags\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nexport async function bulkTags(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n visibility?: 'public' | 'internal';\n },\n): Promise<Record<string, unknown>> {\n const list = await listTags(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const ids = extractTagIds(list);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deleteTag(global, id);\n } else {\n await updateTag(global, {\n id,\n patch: {\n visibility: options.visibility,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listThemes(global: GlobalOptions): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.themes.browse();\n}\n\nexport async function uploadTheme(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const bytes = await fs.readFile(filePath);\n const formData = new FormData();\n formData.append('file', new Blob([bytes]), path.basename(filePath));\n return client.themes.upload(formData);\n}\n\nexport async function activateTheme(\n global: GlobalOptions,\n name: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.themes.activate(name);\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listTiers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.tiers.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('tiers', (page) => client.tiers.browse({ ...params, page, limit }));\n}\n\nexport async function getTier(\n global: GlobalOptions,\n id: string,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tiers.read(id, params);\n}\n\nexport async function createTier(\n global: GlobalOptions,\n tier: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tiers.add(tier);\n}\n\nexport async function updateTier(\n global: GlobalOptions,\n id: string,\n patch: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tiers.edit(id, patch);\n}\n\nexport async function bulkTiers(\n global: GlobalOptions,\n options: {\n filter: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const list = await listTiers(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const tiers = Array.isArray(list.tiers) ? list.tiers : [];\n const ids = tiers\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await updateTier(global, id, options.patch);\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostApiError, GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listUsers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.users.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('users', (page) => client.users.browse({ ...params, page, limit }));\n}\n\nexport async function getUser(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n email?: string;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n if (options.id) {\n return client.users.read(options.id, {\n params: options.params,\n });\n }\n\n if (options.slug) {\n return client.users.read(options.slug, {\n bySlug: true,\n params: options.params,\n });\n }\n\n if (options.email) {\n return client.users.read(options.email, {\n byEmail: true,\n params: options.params,\n });\n }\n\n throw new GhstError('Provide an id argument, --slug, or --email.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n}\n\nexport async function getCurrentUser(\n global: GlobalOptions,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n try {\n return await client.users.me(params);\n } catch (error) {\n if (error instanceof GhostApiError && (error.status === 403 || error.status === 404)) {\n throw new GhstError(\n 'Current user is unavailable for this token. Use a staff/session token with user context.',\n {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n status: error.status,\n details: error.payload,\n },\n );\n }\n\n throw error;\n }\n}\n","import { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nexport const WEBHOOK_EVENTS = [\n 'site.changed',\n 'post.added',\n 'post.deleted',\n 'post.edited',\n 'post.published',\n 'post.published.edited',\n 'post.unpublished',\n 'post.scheduled',\n 'post.unscheduled',\n 'post.rescheduled',\n 'page.added',\n 'page.deleted',\n 'page.edited',\n 'page.published',\n 'page.published.edited',\n 'page.unpublished',\n 'page.scheduled',\n 'page.unscheduled',\n 'page.rescheduled',\n 'tag.added',\n 'tag.edited',\n 'tag.deleted',\n 'member.added',\n 'member.deleted',\n 'member.edited',\n 'post.tag.attached',\n 'post.tag.detached',\n 'page.tag.attached',\n 'page.tag.detached',\n] as const;\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function createWebhook(\n global: GlobalOptions,\n webhook: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.webhooks.add(webhook);\n}\n\nexport async function updateWebhook(\n global: GlobalOptions,\n id: string,\n webhook: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.webhooks.edit(id, webhook);\n}\n\nexport async function deleteWebhook(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.webhooks.delete(id);\n}\n","import { timingSafeEqual } from 'node:crypto';\nimport http from 'node:http';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\n\ninterface RunMcpHttpOptions {\n host: string;\n port: number;\n corsOrigin?: string;\n authToken: string;\n maxBodyBytes?: number;\n headersTimeoutMs?: number;\n requestTimeoutMs?: number;\n keepAliveTimeoutMs?: number;\n}\n\nconst DEFAULT_MAX_BODY_BYTES = 1024 * 1024;\nconst DEFAULT_HEADERS_TIMEOUT_MS = 15_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\nconst DEFAULT_KEEP_ALIVE_TIMEOUT_MS = 5_000;\n\nfunction isAuthorized(authHeader: string | undefined, token: string): boolean {\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return false;\n }\n\n const provided = authHeader.slice('Bearer '.length).trim();\n const expected = Buffer.from(token, 'utf8');\n const actual = Buffer.from(provided, 'utf8');\n if (expected.length !== actual.length) {\n return false;\n }\n\n return timingSafeEqual(expected, actual);\n}\n\nfunction parseContentLength(contentLengthHeader: string | undefined): number | null {\n if (!contentLengthHeader) {\n return null;\n }\n\n const parsed = Number(contentLengthHeader);\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed < 0) {\n return null;\n }\n\n return parsed;\n}\n\nexport async function runMcpHttp(server: McpServer, options: RunMcpHttpOptions): Promise<void> {\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n const headersTimeoutMs = options.headersTimeoutMs ?? DEFAULT_HEADERS_TIMEOUT_MS;\n const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const keepAliveTimeoutMs = options.keepAliveTimeoutMs ?? DEFAULT_KEEP_ALIVE_TIMEOUT_MS;\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await server.connect(transport);\n\n const appServer = http.createServer((req, res) => {\n if (options.corsOrigin) {\n res.setHeader('Access-Control-Allow-Origin', options.corsOrigin);\n res.setHeader('Vary', 'Origin');\n res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id, Authorization');\n }\n\n if (req.method === 'OPTIONS') {\n res.statusCode = 204;\n res.end();\n return;\n }\n\n const authHeader = Array.isArray(req.headers.authorization)\n ? req.headers.authorization[0]\n : req.headers.authorization;\n if (!isAuthorized(authHeader, options.authToken)) {\n res.statusCode = 401;\n res.end('Unauthorized');\n return;\n }\n\n if (req.method === 'POST') {\n const contentLengthHeader = Array.isArray(req.headers['content-length'])\n ? req.headers['content-length'][0]\n : req.headers['content-length'];\n const contentLength = parseContentLength(contentLengthHeader);\n if (contentLength === null) {\n res.statusCode = 411;\n res.end('Length Required');\n return;\n }\n if (contentLength > maxBodyBytes) {\n res.statusCode = 413;\n res.end('Payload Too Large');\n return;\n }\n }\n\n void transport.handleRequest(req, res);\n });\n appServer.headersTimeout = headersTimeoutMs;\n appServer.requestTimeout = requestTimeoutMs;\n appServer.keepAliveTimeout = keepAliveTimeoutMs;\n\n await new Promise<void>((resolve, reject) => {\n appServer.once('error', reject);\n appServer.listen(options.port, options.host, () => {\n appServer.off('error', reject);\n resolve();\n });\n });\n\n await new Promise<void>((resolve) => {\n let closed = false;\n\n const stop = async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n await new Promise<void>((done) => {\n appServer.close(() => done());\n });\n process.off('SIGINT', onSigint);\n process.off('SIGTERM', onSigterm);\n resolve();\n };\n\n const onSigint = () => {\n void stop();\n };\n\n const onSigterm = () => {\n void stop();\n };\n\n process.on('SIGINT', onSigint);\n process.on('SIGTERM', onSigterm);\n });\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nexport async function runMcpStdio(server: McpServer): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n await new Promise<void>((resolve) => {\n transport.onclose = () => resolve();\n });\n}\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { parseCsv, parseInteger } from '../lib/parse.js';\nimport { createGhostMcpServer } from '../mcp/server.js';\nimport { MCP_TOOL_GROUPS, parseToolGroups } from '../mcp/tools/core.js';\nimport { runMcpHttp } from '../mcp/transports/http.js';\nimport { runMcpStdio } from '../mcp/transports/stdio.js';\n\nlet runMcpStdioForTests:\n | ((server: ReturnType<typeof createGhostMcpServer>) => Promise<void>)\n | null = null;\nlet runMcpHttpForTests:\n | ((\n server: ReturnType<typeof createGhostMcpServer>,\n options: {\n host: string;\n port: number;\n corsOrigin?: string;\n authToken: string;\n maxBodyBytes: number;\n headersTimeoutMs: number;\n requestTimeoutMs: number;\n keepAliveTimeoutMs: number;\n },\n ) => Promise<void>)\n | null = null;\n\nexport function setMcpRunnersForTests(\n options: {\n stdio?: ((server: ReturnType<typeof createGhostMcpServer>) => Promise<void>) | null;\n http?:\n | ((\n server: ReturnType<typeof createGhostMcpServer>,\n options: {\n host: string;\n port: number;\n corsOrigin?: string;\n authToken: string;\n maxBodyBytes: number;\n headersTimeoutMs: number;\n requestTimeoutMs: number;\n keepAliveTimeoutMs: number;\n },\n ) => Promise<void>)\n | null;\n } | null,\n): void {\n runMcpStdioForTests = options?.stdio ?? null;\n runMcpHttpForTests = options?.http ?? null;\n}\n\nfunction assertToolsFilter(toolsArg: string | undefined): void {\n if (toolsArg === undefined || toolsArg === 'all') {\n return;\n }\n\n if (toolsArg.trim().length === 0) {\n throw new GhstError('MCP tool groups cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const requested = parseCsv(toolsArg) ?? [];\n if (requested.length === 0) {\n throw new GhstError('MCP tool groups cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n const allowed = new Set(MCP_TOOL_GROUPS);\n const invalid = requested.filter(\n (value) => !allowed.has(value as (typeof MCP_TOOL_GROUPS)[number]),\n );\n if (invalid.length > 0) {\n throw new GhstError(`Unknown MCP tool group(s): ${invalid.join(', ')}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n}\n\nfunction parsePositiveIntegerOption(value: string | undefined, label: string): number {\n const parsed = parseInteger(value, label);\n if (parsed === undefined || parsed <= 0) {\n throw new GhstError(`${label} must be a positive integer`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n return parsed;\n}\n\nexport function registerMcpCommands(program: Command): void {\n const mcp = program.command('mcp').description('MCP server mode');\n\n mcp\n .command('stdio')\n .description('Run MCP server over stdio transport')\n .option(\n '--tools <tools>',\n `Tool groups to expose (comma-separated or all). Available: ${MCP_TOOL_GROUPS.join(', ')}`,\n 'all',\n )\n .action(async (options, command) => {\n assertToolsFilter(options.tools);\n const global = getGlobalOptions(command);\n const enabledGroups = parseToolGroups(options.tools);\n const server = createGhostMcpServer(global, { enabledGroups });\n const run = runMcpStdioForTests ?? runMcpStdio;\n await run(server);\n });\n\n mcp\n .command('http')\n .description('Run MCP server over HTTP transport')\n .option('--host <host>', 'Bind host', '127.0.0.1')\n .option('--port <port>', 'Bind port', '3100')\n .option('--cors-origin <origin>', 'Allow CORS origin')\n .option('--max-body-bytes <bytes>', 'Maximum HTTP MCP request body size in bytes', '1048576')\n .option('--headers-timeout-ms <ms>', 'HTTP headers timeout in milliseconds', '15000')\n .option('--request-timeout-ms <ms>', 'HTTP request timeout in milliseconds', '15000')\n .option('--keepalive-timeout-ms <ms>', 'HTTP keep-alive timeout in milliseconds', '5000')\n .requiredOption(\n '--tools <tools>',\n `Tool groups to expose (comma-separated or all). Available: ${MCP_TOOL_GROUPS.join(', ')}`,\n )\n .option('--auth-token <token>', 'Bearer auth token for HTTP MCP requests')\n .action(async (options, command) => {\n assertToolsFilter(options.tools);\n const port = parsePositiveIntegerOption(options.port, 'port');\n const maxBodyBytes = parsePositiveIntegerOption(options.maxBodyBytes, 'max-body-bytes');\n const headersTimeoutMs = parsePositiveIntegerOption(\n options.headersTimeoutMs,\n 'headers-timeout-ms',\n );\n const requestTimeoutMs = parsePositiveIntegerOption(\n options.requestTimeoutMs,\n 'request-timeout-ms',\n );\n const keepAliveTimeoutMs = parsePositiveIntegerOption(\n options.keepaliveTimeoutMs,\n 'keepalive-timeout-ms',\n );\n const authToken =\n (options.authToken as string | undefined) ?? process.env.GHST_MCP_AUTH_TOKEN;\n if (!authToken) {\n throw new GhstError('mcp http requires --auth-token or GHST_MCP_AUTH_TOKEN.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const global = getGlobalOptions(command);\n const enabledGroups = parseToolGroups(options.tools);\n const server = createGhostMcpServer(global, { enabledGroups });\n const run = runMcpHttpForTests ?? runMcpHttp;\n\n await run(server, {\n host: options.host,\n port,\n corsOrigin: options.corsOrigin,\n authToken,\n maxBodyBytes,\n headersTimeoutMs,\n requestTimeoutMs,\n keepAliveTimeoutMs,\n });\n });\n}\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n bulkMembers,\n createMember,\n deleteMember,\n exportMembersCsv,\n getMember,\n importMembersCsv,\n listMembers,\n updateMember,\n} from '../lib/members.js';\nimport {\n printJson,\n printMemberHuman,\n printMemberListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseCsv, parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n MemberBulkInputSchema,\n MemberCreateInputSchema,\n MemberDeleteInputSchema,\n MemberExportInputSchema,\n MemberGetInputSchema,\n MemberImportInputSchema,\n MemberListInputSchema,\n MemberUpdateInputSchema,\n} from '../schemas/member.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction csvAsObjects(\n input: string | undefined,\n key: 'id' | 'name',\n): Array<Record<string, string>> | undefined {\n const values = parseCsv(input);\n if (!values || values.length === 0) {\n return undefined;\n }\n\n return values.map((value) => ({ [key]: value }));\n}\n\nexport function registerMemberCommands(program: Command): void {\n const member = program.command('member').description('Member management');\n\n member\n .command('list')\n .description('List members')\n .option('--limit <numberOrAll>', 'Number of members per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--status <status>', 'Member status (free|paid|comped)')\n .option('--search <term>', 'Search term')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = MemberListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n status: options.status,\n search: options.search,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const combinedFilter =\n parsed.data.filter && parsed.data.status\n ? `${parsed.data.filter}+status:${parsed.data.status}`\n : (parsed.data.filter ??\n (parsed.data.status ? `status:${parsed.data.status}` : undefined));\n const payload = await listMembers(\n global,\n {\n ...parsed.data,\n filter: combinedFilter,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberListHuman(payload, global.color !== false);\n });\n\n member\n .command('get [id]')\n .description('Get a member by id or email')\n .option('--email <email>', 'Member email')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberGetInputSchema.safeParse({\n id,\n email: options.email,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getMember(global, {\n id: parsed.data.id,\n email: parsed.data.email,\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberHuman(payload);\n });\n\n member\n .command('create')\n .description('Create a member')\n .requiredOption('--email <email>', 'Member email')\n .option('--name <name>', 'Member name')\n .option('--note <note>', 'Internal note')\n .option('--labels <labels>', 'Comma separated labels')\n .option('--newsletters <ids>', 'Comma separated newsletter ids')\n .option('--subscribed <value>', 'true|false')\n .option('--send-email', 'Send welcome/signin/signup email')\n .option('--email-type <type>', 'signin|signup|subscribe')\n .option('--comp', 'Create as complimentary member')\n .option('--tier <id>', 'Tier id for complimentary access')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberCreateInputSchema.safeParse({\n email: options.email,\n name: options.name,\n note: options.note,\n labels: options.labels,\n newsletters: options.newsletters,\n subscribed: parseBooleanFlag(options.subscribed),\n sendEmail: parseBooleanFlag(options.sendEmail),\n emailType: options.emailType,\n comp: parseBooleanFlag(options.comp),\n tier: options.tier,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const tierId = parsed.data.tier;\n const memberPayload: Record<string, unknown> = {\n email: parsed.data.email,\n name: parsed.data.name,\n note: parsed.data.note,\n subscribed: parsed.data.subscribed,\n labels: csvAsObjects(parsed.data.labels, 'name'),\n newsletters: csvAsObjects(parsed.data.newsletters, 'id'),\n };\n\n if (parsed.data.comp && tierId) {\n memberPayload.tiers = [{ id: tierId }];\n }\n\n const apiParams: Record<string, string | number | boolean | undefined> = {\n send_email: parsed.data.sendEmail,\n email_type: parsed.data.emailType,\n };\n\n const payload = await createMember(global, memberPayload, apiParams);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberHuman(payload);\n });\n\n member\n .command('update [id]')\n .description('Update a member by id or email')\n .option('--email <email>', 'Member email lookup')\n .option('--name <name>', 'Member name')\n .option('--note <note>', 'Internal note')\n .option('--labels <labels>', 'Comma separated labels')\n .option('--newsletters <ids>', 'Comma separated newsletter ids')\n .option('--subscribed <value>', 'true|false')\n .option('--comp', 'Set complimentary tier access')\n .option('--tier <id>', 'Tier id for complimentary access')\n .option('--expiry <datetime>', 'Tier access expiry datetime')\n .option('--clear-tiers', 'Remove all complimentary tiers')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberUpdateInputSchema.safeParse({\n id,\n email: options.email,\n name: options.name,\n note: options.note,\n labels: options.labels,\n newsletters: options.newsletters,\n subscribed: parseBooleanFlag(options.subscribed),\n comp: parseBooleanFlag(options.comp),\n tier: options.tier,\n expiry: options.expiry,\n clearTiers: parseBooleanFlag(options.clearTiers),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const patch: Record<string, unknown> = {\n name: parsed.data.name,\n note: parsed.data.note,\n subscribed: parsed.data.subscribed,\n labels:\n parsed.data.labels !== undefined ? csvAsObjects(parsed.data.labels, 'name') : undefined,\n newsletters:\n parsed.data.newsletters !== undefined\n ? csvAsObjects(parsed.data.newsletters, 'id')\n : undefined,\n };\n\n if (parsed.data.clearTiers) {\n patch.tiers = [];\n } else if (parsed.data.tier && (parsed.data.comp || parsed.data.expiry)) {\n patch.tiers = [\n {\n id: parsed.data.tier,\n expiry_at: parsed.data.expiry,\n },\n ];\n }\n\n const payload = await updateMember(global, {\n id: parsed.data.id,\n email: parsed.data.email,\n patch,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberHuman(payload);\n });\n\n member\n .command('delete <id>')\n .description('Delete a member')\n .option('--cancel', 'Cancel Stripe subscriptions when deleting')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MemberDeleteInputSchema.safeParse({\n id,\n cancel: parseBooleanFlag(options.cancel),\n yes: parseBooleanFlag(options.yes),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete member '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteMember(global, parsed.data.id, {\n cancel: parsed.data.cancel,\n });\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted member '${parsed.data.id}'.`);\n });\n\n member\n .command('import <filePath>')\n .description('Import members from CSV')\n .option('--labels <labels>', 'Comma separated labels to apply to imported members')\n .action(async (filePath: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberImportInputSchema.safeParse({\n filePath,\n labels: options.labels,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await importMembersCsv(global, {\n filePath: parsed.data.filePath,\n labels: parseCsv(parsed.data.labels),\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Imported members');\n });\n\n member\n .command('export')\n .description('Export members as CSV')\n .option('--limit <numberOrAll>', 'Number of members per page or \"all\"')\n .option('--filter <nql>', 'NQL filter')\n .option('--search <term>', 'Search term')\n .option('--output <path>', 'Write CSV to file path')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const parsed = MemberExportInputSchema.safeParse({\n limit: rawLimit,\n filter: options.filter,\n search: options.search,\n output: options.output,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const csv = await exportMembersCsv(global, {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n filter: parsed.data.filter,\n search: parsed.data.search,\n });\n\n if (parsed.data.output) {\n await fs.writeFile(parsed.data.output, csv, 'utf8');\n\n if (global.json) {\n printJson({ ok: true, output: parsed.data.output });\n return;\n }\n\n console.log(`Exported members CSV to '${parsed.data.output}'.`);\n return;\n }\n\n if (global.json) {\n printJson({ csv }, global.jq);\n return;\n }\n\n process.stdout.write(csv);\n if (!csv.endsWith('\\n')) {\n process.stdout.write('\\n');\n }\n });\n\n member\n .command('bulk')\n .description('Run a bulk member operation')\n .option('--action <action>', 'unsubscribe|add-label|remove-label|delete')\n .option('--update', 'PRD alias for bulk label replacement')\n .option('--delete', 'PRD alias for delete action')\n .option('--all', 'Apply to all members')\n .option('--filter <nql>', 'Filter members by NQL')\n .option('--search <term>', 'Search members')\n .option('--label-id <id>', 'Label id for add-label/remove-label operations')\n .option('--labels <labels>', 'Comma separated label names for --update')\n .option('--yes', 'Confirm --delete action')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MemberBulkInputSchema.safeParse({\n action: options.action,\n update: parseBooleanFlag(options.update),\n delete: parseBooleanFlag(options.delete),\n all: parseBooleanFlag(options.all),\n filter: options.filter,\n search: options.search,\n labelId: options.labelId,\n labels: options.labels,\n yes: parseBooleanFlag(options.yes),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const resolvedAction = parsed.data.update\n ? 'update-labels'\n : parsed.data.delete\n ? 'delete'\n : parsed.data.action;\n const payload = await bulkMembers(global, {\n action: (resolvedAction ?? 'unsubscribe') as\n | 'unsubscribe'\n | 'add-label'\n | 'remove-label'\n | 'delete'\n | 'update-labels',\n all: parsed.data.all,\n filter: parsed.data.filter,\n search: parsed.data.search,\n labelId: parsed.data.labelId,\n labels: parseCsv(parsed.data.labels),\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk member operation completed');\n });\n}\n","import { z } from 'zod';\n\nconst EmailTypeSchema = z.enum(['signin', 'signup', 'subscribe']);\nconst BulkActionSchema = z.enum(['unsubscribe', 'add-label', 'remove-label', 'delete']);\n\nexport const MemberListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: z.enum(['free', 'paid', 'comped']).optional(),\n search: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const MemberGetInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n email: z.email().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.email), {\n message: 'Provide an id argument or --email.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.email), {\n message: 'Use either id argument or --email, not both.',\n path: ['id'],\n });\n\nexport const MemberCreateInputSchema = z\n .object({\n email: z.email(),\n name: z.string().min(1).optional(),\n note: z.string().optional(),\n labels: z.string().optional(),\n newsletters: z.string().optional(),\n subscribed: z.boolean().optional(),\n sendEmail: z.boolean().optional(),\n emailType: EmailTypeSchema.optional(),\n comp: z.boolean().optional(),\n tier: z.string().min(1).optional(),\n })\n .refine((data) => !(data.comp && !data.tier), {\n message: '--tier is required when --comp is set.',\n path: ['tier'],\n });\n\nexport const MemberUpdateInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n email: z.email().optional(),\n name: z.string().min(1).optional(),\n note: z.string().optional(),\n labels: z.string().optional(),\n newsletters: z.string().optional(),\n subscribed: z.boolean().optional(),\n comp: z.boolean().optional(),\n tier: z.string().min(1).optional(),\n expiry: z.string().datetime().optional(),\n clearTiers: z.boolean().optional(),\n })\n .refine((data) => Boolean(data.id || data.email), {\n message: 'Provide an id argument or --email.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.email), {\n message: 'Use either id argument or --email, not both.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.note !== undefined ||\n data.labels !== undefined ||\n data.newsletters !== undefined ||\n data.subscribed !== undefined ||\n data.comp !== undefined ||\n data.tier !== undefined ||\n data.expiry !== undefined ||\n data.clearTiers,\n ),\n {\n message: 'Provide at least one update field.',\n },\n )\n .refine((data) => !(data.comp && !data.tier && !data.clearTiers), {\n message: '--tier is required when --comp is set unless --clear-tiers is used.',\n path: ['tier'],\n })\n .refine((data) => !(data.expiry && !data.tier), {\n message: '--tier is required when --expiry is set.',\n path: ['tier'],\n });\n\nexport const MemberDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n cancel: z.boolean().optional(),\n});\n\nexport const MemberImportInputSchema = z.object({\n filePath: z.string().min(1),\n labels: z.string().optional(),\n});\n\nexport const MemberExportInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n filter: z.string().optional(),\n search: z.string().optional(),\n output: z.string().min(1).optional(),\n});\n\nexport const MemberBulkInputSchema = z\n .object({\n action: BulkActionSchema.optional(),\n update: z.boolean().optional(),\n delete: z.boolean().optional(),\n all: z.boolean().optional(),\n filter: z.string().optional(),\n search: z.string().optional(),\n labelId: z.string().min(1).optional(),\n labels: z.string().optional(),\n yes: z.boolean().optional(),\n })\n .refine(\n (data) => {\n const selected = [\n data.action !== undefined,\n data.update === true,\n data.delete === true,\n ].filter(Boolean);\n return selected.length === 1;\n },\n {\n message: 'Select exactly one action via --action, --update, or --delete.',\n path: ['action'],\n },\n )\n .refine((data) => Boolean(data.all || data.filter || data.search), {\n message: 'Provide one of --all, --filter, or --search.',\n path: ['all'],\n })\n .refine((data) => !(data.all && (data.filter || data.search)), {\n message: '--all cannot be combined with --filter or --search.',\n path: ['all'],\n })\n .refine(\n (data) => {\n if (data.action === 'add-label' || data.action === 'remove-label') {\n return Boolean(data.labelId);\n }\n\n return true;\n },\n {\n message: '--label-id is required for add-label/remove-label actions.',\n path: ['labelId'],\n },\n )\n .refine((data) => (data.update ? Boolean(data.labels) : true), {\n message: '--labels is required with --update.',\n path: ['labels'],\n })\n .refine((data) => (data.delete || data.action === 'delete' ? data.yes === true : true), {\n message: '--delete/--action delete requires --yes.',\n path: ['yes'],\n });\n","import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { slugify } from '@tryghost/string';\nimport { parse as parseCsv } from 'csv-parse/sync';\nimport MarkdownIt from 'markdown-it';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport type { GlobalOptions } from './types.js';\n\ninterface CsvRow {\n title: string;\n html?: string;\n markdown?: string;\n slug?: string;\n status?: 'draft' | 'published' | 'scheduled';\n published_at?: string;\n tags?: string;\n authors?: string;\n excerpt?: string;\n feature_image?: string;\n}\n\nconst ALLOWED_CSV_HEADERS = new Set([\n 'title',\n 'html',\n 'markdown',\n 'slug',\n 'status',\n 'published_at',\n 'tags',\n 'authors',\n 'excerpt',\n 'feature_image',\n]);\n\nconst VALID_STATUSES = new Set(['draft', 'published', 'scheduled']);\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst markdownRenderer = new MarkdownIt({ html: true, linkify: true, breaks: true });\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nfunction ensureObjectRecord(value: unknown, source: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new GhstError(`Migration source '${source}' returned an invalid payload.`, {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction splitList(value?: string): string[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction createTagRelation(name: string): Record<string, unknown> {\n const normalizedName = name.trim();\n const normalizedSlug = slugify(normalizedName);\n\n return {\n url: `csv://tag/${normalizedSlug}`,\n data: {\n name: normalizedName,\n slug: normalizedSlug,\n },\n };\n}\n\nfunction createAuthorRelation(value: string): Record<string, unknown> {\n const normalized = value.trim();\n\n if (EMAIL_PATTERN.test(normalized)) {\n const localPart = normalized.split('@')[0] ?? normalized;\n const normalizedSlug = slugify(localPart);\n\n return {\n url: `csv://author/${normalizedSlug}`,\n data: {\n name: localPart,\n slug: normalizedSlug,\n email: normalized,\n },\n };\n }\n\n const normalizedSlug = slugify(normalized);\n return {\n url: `csv://author/${normalizedSlug}`,\n data: {\n name: normalized,\n slug: normalizedSlug,\n },\n };\n}\n\nfunction parseCsvRows(raw: string): CsvRow[] {\n let matrix: string[][];\n try {\n matrix = parseCsv(raw, {\n bom: true,\n skip_empty_lines: true,\n relax_quotes: false,\n }) as string[][];\n } catch (error) {\n throw new GhstError(`CSV parsing failed: ${(error as Error).message}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (matrix.length < 2) {\n throw new GhstError('CSV must include headers and at least one row.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const headers = (matrix[0] ?? []).map((header) => String(header ?? '').trim());\n if (headers.length === 0 || headers.some((header) => header.length === 0)) {\n throw new GhstError('CSV headers must be non-empty values.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const duplicateHeaders = headers.filter((header, index) => headers.indexOf(header) !== index);\n if (duplicateHeaders.length > 0) {\n const uniqueDuplicates = Array.from(new Set(duplicateHeaders));\n throw new GhstError(`Duplicate CSV headers are not allowed: ${uniqueDuplicates.join(', ')}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const unknownHeaders = headers.filter((header) => !ALLOWED_CSV_HEADERS.has(header));\n if (unknownHeaders.length > 0) {\n const allowed = Array.from(ALLOWED_CSV_HEADERS).join(', ');\n throw new GhstError(\n `Unsupported CSV headers: ${unknownHeaders.join(', ')}. Allowed headers: ${allowed}`,\n {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n },\n );\n }\n\n if (!headers.includes('title')) {\n throw new GhstError(\"CSV must include a 'title' header.\", {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const hasHtmlHeader = headers.includes('html');\n const hasMarkdownHeader = headers.includes('markdown');\n if (!hasHtmlHeader && !hasMarkdownHeader) {\n throw new GhstError(\"CSV must include exactly one content header: 'html' or 'markdown'.\", {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (hasHtmlHeader && hasMarkdownHeader) {\n throw new GhstError(\"CSV cannot include both 'html' and 'markdown' headers.\", {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const rows: CsvRow[] = [];\n for (let rowIndex = 1; rowIndex < matrix.length; rowIndex += 1) {\n const values = matrix[rowIndex] ?? [];\n if (values.length !== headers.length) {\n throw new GhstError(\n `CSV row ${rowIndex + 1} has ${values.length} column(s), expected ${headers.length}.`,\n {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n },\n );\n }\n\n const record = Object.fromEntries(\n headers.map((header, index) => [header, String(values[index] ?? '')]),\n ) as Record<string, string>;\n\n const title = (record.title ?? '').trim();\n if (!title) {\n throw new GhstError(`CSV row ${rowIndex + 1} is missing required title.`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const htmlRaw = hasHtmlHeader ? (record.html ?? '') : undefined;\n const markdownRaw = hasMarkdownHeader ? (record.markdown ?? '') : undefined;\n\n if (hasHtmlHeader && !(htmlRaw ?? '').trim()) {\n throw new GhstError(`CSV row ${rowIndex + 1} must include html content.`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (hasMarkdownHeader && !(markdownRaw ?? '').trim()) {\n throw new GhstError(`CSV row ${rowIndex + 1} must include markdown content.`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const statusValue = (record.status ?? '').trim().toLowerCase();\n if (statusValue && !VALID_STATUSES.has(statusValue)) {\n throw new GhstError(\n `CSV row ${rowIndex + 1} has invalid status '${statusValue}'. Expected draft, published, or scheduled.`,\n {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n },\n );\n }\n\n rows.push({\n title,\n html: htmlRaw,\n markdown: markdownRaw,\n slug: (record.slug ?? '').trim() || undefined,\n status: (statusValue as CsvRow['status']) || undefined,\n published_at: (record.published_at ?? '').trim() || undefined,\n tags: (record.tags ?? '').trim() || undefined,\n authors: (record.authors ?? '').trim() || undefined,\n excerpt: (record.excerpt ?? '').trim() || undefined,\n feature_image: (record.feature_image ?? '').trim() || undefined,\n });\n }\n\n return rows;\n}\n\nasync function uploadDbImportFile(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const bytes = await fs.readFile(filePath);\n const formData = new FormData();\n formData.append('importfile', new Blob([bytes]), path.basename(filePath));\n return client.db.import(formData);\n}\n\nasync function buildGhostDbImportFile(input: Record<string, unknown>): Promise<string> {\n const mgJsonModule = (await loadMigrateModule('@tryghost/mg-json')) as {\n toGhostJSON?: (\n input: Record<string, unknown>,\n options?: Record<string, unknown>,\n ctx?: unknown,\n ) => Promise<Record<string, unknown>>;\n default?: {\n toGhostJSON?: (\n input: Record<string, unknown>,\n options?: Record<string, unknown>,\n ctx?: unknown,\n ) => Promise<Record<string, unknown>>;\n };\n };\n\n const toGhostJSON = mgJsonModule.toGhostJSON ?? mgJsonModule.default?.toGhostJSON;\n if (!toGhostJSON) {\n throw new GhstError('Ghost JSON converter is unavailable in @tryghost/mg-json.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const ghostJson = await toGhostJSON(input, {});\n const payload = { db: [ghostJson] };\n\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ghst-import-json-'));\n const outputPath = path.join(tempDir, 'import.json');\n await fs.writeFile(outputPath, JSON.stringify(payload), 'utf8');\n\n return outputPath;\n}\n\nexport async function migrateImportJson(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n return uploadDbImportFile(global, filePath);\n}\n\ntype MigrateSource = 'wordpress' | 'medium' | 'substack';\n\nlet migrateSourceLoaderForTests: ((modulePath: string) => Promise<unknown>) | null = null;\n\nexport function setMigrateSourceLoaderForTests(\n loader: ((modulePath: string) => Promise<unknown>) | null,\n): void {\n migrateSourceLoaderForTests = loader;\n}\n\nfunction isMissingModuleError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('cannot find package') ||\n message.includes('cannot find module') ||\n message.includes('err_module_not_found')\n );\n}\n\nasync function loadMigrateModule(modulePath: string): Promise<unknown> {\n try {\n if (migrateSourceLoaderForTests) {\n return await migrateSourceLoaderForTests(modulePath);\n }\n\n return await import(modulePath);\n } catch (error) {\n if (isMissingModuleError(error)) {\n throw new GhstError(\n `Migration dependency '${modulePath}' is not installed. Run: pnpm add @tryghost/mg-json @tryghost/mg-wp-xml @tryghost/mg-medium-export @tryghost/mg-substack`,\n {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n },\n );\n }\n\n throw error;\n }\n}\n\nasync function collectSourceMigrationInput(\n source: MigrateSource,\n options: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n if (source === 'wordpress') {\n const wpModule = (await loadMigrateModule('@tryghost/mg-wp-xml')) as {\n default?: (ctx: { options: Record<string, unknown> }) => Promise<unknown>;\n };\n\n if (typeof wpModule.default !== 'function') {\n throw new GhstError('Invalid @tryghost/mg-wp-xml module: missing default export.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const output = await wpModule.default({\n options: {\n pathToFile: options.pathToFile,\n scrape: 'none',\n zip: false,\n cache: false,\n },\n });\n\n return ensureObjectRecord(output, source);\n }\n\n if (source === 'medium') {\n const mediumModule = (await loadMigrateModule('@tryghost/mg-medium-export')) as {\n default?: (pathToZip: string, options?: Record<string, unknown>) => unknown;\n };\n\n if (typeof mediumModule.default !== 'function') {\n throw new GhstError('Invalid @tryghost/mg-medium-export module: missing default export.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const output = await Promise.resolve(\n mediumModule.default(String(options.pathToZip ?? ''), {\n scrape: 'none',\n }),\n );\n\n return ensureObjectRecord(output, source);\n }\n\n const substackModule = (await loadMigrateModule('@tryghost/mg-substack')) as {\n default?: {\n ingest?: (ctx: { options: Record<string, unknown> }) => Promise<unknown>;\n process?: (\n input: unknown,\n ctx: { options: Record<string, unknown>; postsDir?: string },\n ) => Promise<unknown>;\n };\n };\n\n const substackApi = substackModule.default;\n if (\n !substackApi ||\n typeof substackApi.ingest !== 'function' ||\n typeof substackApi.process !== 'function'\n ) {\n throw new GhstError('Invalid @tryghost/mg-substack module: expected ingest/process API.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const substackOptions: Record<string, unknown> = {\n pathToZip: options.pathToZip,\n url: options.url,\n posts: true,\n pages: true,\n podcasts: true,\n threads: false,\n drafts: true,\n addPlatformTag: true,\n addTypeTag: true,\n addAccessTag: true,\n useMetaImage: true,\n useFirstImage: true,\n useMetaAuthor: true,\n comments: true,\n };\n\n const ingested = await substackApi.ingest({ options: substackOptions });\n const output = await substackApi.process(ingested, { options: substackOptions });\n\n return ensureObjectRecord(output, source);\n}\n\nasync function runGhostMigrateSource(\n source: MigrateSource,\n options: Record<string, unknown>,\n): Promise<string> {\n const migrationInput = await collectSourceMigrationInput(source, options);\n return buildGhostDbImportFile(migrationInput);\n}\n\nexport async function migrateImportWordpress(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const importPath = await runGhostMigrateSource('wordpress', { pathToFile: filePath });\n return uploadDbImportFile(global, importPath);\n}\n\nexport async function migrateImportMedium(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const importPath = await runGhostMigrateSource('medium', { pathToZip: filePath });\n return uploadDbImportFile(global, importPath);\n}\n\nexport async function migrateImportSubstack(\n global: GlobalOptions,\n filePath: string,\n url: string,\n): Promise<Record<string, unknown>> {\n const importPath = await runGhostMigrateSource('substack', {\n pathToZip: filePath,\n url,\n });\n return uploadDbImportFile(global, importPath);\n}\n\nexport async function migrateImportCsv(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const raw = await fs.readFile(filePath, 'utf8');\n const rows = parseCsvRows(raw);\n\n const posts = rows.map((row, index) => {\n const html = row.html ?? markdownRenderer.render(row.markdown ?? '');\n const tags = splitList(row.tags).map((name) => createTagRelation(name));\n const authors = splitList(row.authors).map((name) => createAuthorRelation(name));\n\n const postData: Record<string, unknown> = {\n title: row.title,\n html,\n slug: row.slug,\n status: row.status,\n published_at: row.published_at,\n custom_excerpt: row.excerpt,\n feature_image: row.feature_image,\n };\n\n if (tags.length > 0) {\n postData.tags = tags;\n }\n\n if (authors.length === 1) {\n postData.author = authors[0];\n } else if (authors.length > 1) {\n postData.authors = authors;\n }\n\n return {\n url: row.slug ? `csv://post/${row.slug}` : `csv://post/${index + 1}`,\n data: postData,\n };\n });\n\n const importPath = await buildGhostDbImportFile({ posts });\n const payload = await uploadDbImportFile(global, importPath);\n\n return {\n imported: rows.length,\n ...payload,\n };\n}\n\nexport async function migrateExport(global: GlobalOptions, outputPath: string): Promise<string> {\n const client = await getClient(global);\n const data = await client.db.export();\n await fs.writeFile(outputPath, data);\n return outputPath;\n}\n","import { z } from 'zod';\n\nexport const MigrateWordpressInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateMediumInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateSubstackInputSchema = z.object({\n file: z.string().min(1),\n url: z.string().url(),\n});\n\nexport const MigrateCsvInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateJsonInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateExportInputSchema = z.object({\n output: z.string().min(1),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n migrateExport,\n migrateImportCsv,\n migrateImportJson,\n migrateImportMedium,\n migrateImportSubstack,\n migrateImportWordpress,\n} from '../lib/migrate.js';\nimport { printJson } from '../lib/output.js';\nimport {\n MigrateCsvInputSchema,\n MigrateExportInputSchema,\n MigrateJsonInputSchema,\n MigrateMediumInputSchema,\n MigrateSubstackInputSchema,\n MigrateWordpressInputSchema,\n} from '../schemas/migrate.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction getRootCommand(command: Command): Command {\n let cursor: Command = command;\n while (cursor.parent) {\n cursor = cursor.parent;\n }\n return cursor;\n}\n\nfunction getExplicitSubstackSourceUrl(command: Command): string | undefined {\n const rootCommand = getRootCommand(command);\n const rawArgs = (rootCommand as unknown as { rawArgs?: string[] }).rawArgs ?? [];\n const substackIndex = rawArgs.lastIndexOf('substack');\n\n if (substackIndex === -1) {\n return undefined;\n }\n\n for (let index = substackIndex + 1; index < rawArgs.length; index += 1) {\n const token = rawArgs[index] ?? '';\n if (token === '--') {\n break;\n }\n\n if (token === '--url') {\n const value = rawArgs[index + 1];\n return value && !value.startsWith('-') ? value : undefined;\n }\n\n if (token.startsWith('--url=')) {\n const [, value = ''] = token.split('=');\n return value;\n }\n }\n\n return undefined;\n}\n\nexport function registerMigrateCommands(program: Command): void {\n const migrate = program.command('migrate').description('Migration utilities');\n\n migrate\n .command('wordpress')\n .description('Import from WordPress XML export')\n .requiredOption('--file <path>', 'Path to WordPress XML file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateWordpressInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportWordpress(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('WordPress migration import completed.');\n });\n\n migrate\n .command('medium')\n .description('Import from Medium export zip')\n .requiredOption('--file <path>', 'Path to Medium export zip')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateMediumInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportMedium(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('Medium migration import completed.');\n });\n\n migrate\n .command('substack')\n .description('Import from Substack export zip')\n .requiredOption('--file <path>', 'Path to Substack export zip')\n .option('--url <url>', 'Substack site url')\n .option('--target-url <url>', 'Ghost destination URL override')\n .action(async (options, command) => {\n const sourceUrl = getExplicitSubstackSourceUrl(command);\n if (!sourceUrl) {\n throw new GhstError('Substack migration requires --url.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const global = {\n ...getGlobalOptions(command),\n // Keep migrate source --url distinct from Ghost destination URL override.\n url: options.targetUrl as string | undefined,\n };\n\n const parsed = MigrateSubstackInputSchema.safeParse({\n file: options.file,\n url: sourceUrl,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportSubstack(global, parsed.data.file, parsed.data.url);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('Substack migration import completed.');\n });\n\n migrate\n .command('csv')\n .description('Import from canonical CSV schema')\n .requiredOption('--file <path>', 'Path to CSV file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateCsvInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportCsv(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log(`CSV migration completed (${String(payload.imported ?? 0)} rows imported).`);\n });\n\n migrate\n .command('json')\n .description('Import Ghost JSON/ZIP export')\n .requiredOption('--file <path>', 'Path to Ghost import file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateJsonInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportJson(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('Ghost JSON migration import completed.');\n });\n\n migrate\n .command('export')\n .description('Export site content as Ghost backup')\n .requiredOption('--output <path>', 'Output file path')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateExportInputSchema.safeParse({ output: options.output });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const outputPath = await migrateExport(global, parsed.data.output);\n if (global.json) {\n printJson({ ok: true, output: outputPath }, global.jq);\n return;\n }\n\n console.log(`Exported Ghost backup to ${outputPath}`);\n });\n}\n","import { z } from 'zod';\n\nconst NewsletterStatusSchema = z.enum(['active', 'archived']);\nconst NewsletterVisibilitySchema = z.enum(['all', 'members', 'paid']);\n\nexport const NewsletterListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const NewsletterGetInputSchema = z.object({\n id: z.string().min(1),\n include: z.string().optional(),\n fields: z.string().optional(),\n});\n\nexport const NewsletterCreateInputSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n senderName: z.string().optional(),\n senderEmail: z.email().nullable().optional(),\n senderReplyTo: z.string().optional(),\n status: NewsletterStatusSchema.optional(),\n visibility: NewsletterVisibilitySchema.optional(),\n subscribeOnSignup: z.boolean().optional(),\n optInExisting: z.boolean().optional(),\n});\n\nexport const NewsletterUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n senderName: z.string().optional(),\n senderEmail: z.email().nullable().optional(),\n senderReplyTo: z.string().optional(),\n status: NewsletterStatusSchema.optional(),\n visibility: NewsletterVisibilitySchema.optional(),\n subscribeOnSignup: z.boolean().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.description !== undefined ||\n data.senderName !== undefined ||\n data.senderEmail !== undefined ||\n data.senderReplyTo !== undefined ||\n data.status !== undefined ||\n data.visibility !== undefined ||\n data.subscribeOnSignup !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const NewsletterBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.literal('update'),\n status: NewsletterStatusSchema.optional(),\n visibility: NewsletterVisibilitySchema.optional(),\n })\n .refine((data) => Boolean(data.status !== undefined || data.visibility !== undefined), {\n message: 'Bulk update requires --status or --visibility.',\n path: ['status'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n bulkNewsletters,\n createNewsletter,\n getNewsletter,\n listNewsletters,\n updateNewsletter,\n} from '../lib/newsletters.js';\nimport {\n printJson,\n printNewsletterHuman,\n printNewsletterListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseInteger } from '../lib/parse.js';\nimport {\n NewsletterBulkInputSchema,\n NewsletterCreateInputSchema,\n NewsletterGetInputSchema,\n NewsletterListInputSchema,\n NewsletterUpdateInputSchema,\n} from '../schemas/newsletter.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction parseNullableEmail(value: string | undefined): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value.trim().toLowerCase() === 'null') {\n return null;\n }\n\n return value;\n}\n\nexport function registerNewsletterCommands(program: Command): void {\n const newsletter = program.command('newsletter').description('Newsletter management');\n\n newsletter\n .command('list')\n .description('List newsletters')\n .option('--limit <numberOrAll>', 'Number of newsletters per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = NewsletterListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listNewsletters(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterListHuman(payload, global.color !== false);\n });\n\n newsletter\n .command('get <id>')\n .description('Get a newsletter by id')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = NewsletterGetInputSchema.safeParse({\n id,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getNewsletter(global, parsed.data.id, {\n include: parsed.data.include,\n fields: parsed.data.fields,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterHuman(payload);\n });\n\n newsletter\n .command('create')\n .description('Create a newsletter')\n .requiredOption('--name <name>', 'Newsletter name')\n .option('--description <description>', 'Newsletter description')\n .option('--sender-name <name>', 'Sender name')\n .option('--sender-email <emailOrNull>', 'Sender email or null')\n .option('--sender-reply-to <value>', 'Sender reply-to setting')\n .option('--status <status>', 'active|archived')\n .option('--visibility <visibility>', 'all|members|paid')\n .option('--subscribe-on-signup <value>', 'true|false')\n .option('--opt-in-existing', 'Subscribe existing members to this newsletter')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = NewsletterCreateInputSchema.safeParse({\n name: options.name,\n description: options.description,\n senderName: options.senderName,\n senderEmail: parseNullableEmail(options.senderEmail),\n senderReplyTo: options.senderReplyTo,\n status: options.status,\n visibility: options.visibility,\n subscribeOnSignup: parseBooleanFlag(options.subscribeOnSignup),\n optInExisting: parseBooleanFlag(options.optInExisting),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createNewsletter(\n global,\n {\n name: parsed.data.name,\n description: parsed.data.description,\n sender_name: parsed.data.senderName,\n sender_email: parsed.data.senderEmail,\n sender_reply_to: parsed.data.senderReplyTo,\n status: parsed.data.status,\n visibility: parsed.data.visibility,\n subscribe_on_signup: parsed.data.subscribeOnSignup,\n },\n {\n opt_in_existing: parsed.data.optInExisting,\n },\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterHuman(payload);\n });\n\n newsletter\n .command('update <id>')\n .description('Update a newsletter')\n .option('--name <name>', 'Newsletter name')\n .option('--description <description>', 'Newsletter description')\n .option('--sender-name <name>', 'Sender name')\n .option('--sender-email <emailOrNull>', 'Sender email or null')\n .option('--sender-reply-to <value>', 'Sender reply-to setting')\n .option('--status <status>', 'active|archived')\n .option('--visibility <visibility>', 'all|members|paid')\n .option('--subscribe-on-signup <value>', 'true|false')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = NewsletterUpdateInputSchema.safeParse({\n id,\n name: options.name,\n description: options.description,\n senderName: options.senderName,\n senderEmail: parseNullableEmail(options.senderEmail),\n senderReplyTo: options.senderReplyTo,\n status: options.status,\n visibility: options.visibility,\n subscribeOnSignup: parseBooleanFlag(options.subscribeOnSignup),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateNewsletter(global, parsed.data.id, {\n name: parsed.data.name,\n description: parsed.data.description,\n sender_name: parsed.data.senderName,\n sender_email: parsed.data.senderEmail,\n sender_reply_to: parsed.data.senderReplyTo,\n status: parsed.data.status,\n visibility: parsed.data.visibility,\n subscribe_on_signup: parsed.data.subscribeOnSignup,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterHuman(payload);\n });\n\n newsletter\n .command('bulk')\n .description('Run bulk newsletter operations')\n .requiredOption('--filter <nql>', 'NQL filter to select newsletters')\n .requiredOption('--action <action>', 'update')\n .option('--status <status>', 'active|archived')\n .option('--visibility <visibility>', 'all|members|paid')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = NewsletterBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n status: options.status,\n visibility: options.visibility,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkNewsletters(global, {\n filter: parsed.data.filter,\n patch: {\n status: parsed.data.status,\n visibility: parsed.data.visibility,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk newsletter operation completed');\n });\n}\n","import { z } from 'zod';\n\nconst OfferTypeSchema = z.enum(['percent', 'fixed', 'trial', 'free_months']);\nconst OfferCadenceSchema = z.enum(['month', 'year']);\nconst OfferDurationSchema = z.enum(['once', 'forever', 'trial', 'free_months']);\nconst OfferStatusSchema = z.enum(['active', 'archived']);\nconst OfferRedemptionTypeSchema = z.enum(['signup', 'retention']);\n\nexport const OfferListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n});\n\nexport const OfferGetInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const OfferCreateInputSchema = z.object({\n name: z.string().min(1),\n code: z.string().min(1),\n displayTitle: z.string().optional(),\n displayDescription: z.string().optional(),\n type: OfferTypeSchema.optional(),\n cadence: OfferCadenceSchema.optional(),\n amount: z.number().int().min(0).optional(),\n duration: OfferDurationSchema.optional(),\n durationInMonths: z.number().int().min(1).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .nullable()\n .optional(),\n status: OfferStatusSchema.optional(),\n redemptionType: OfferRedemptionTypeSchema.optional(),\n tierId: z.string().min(1).optional(),\n});\n\nexport const OfferUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n name: z.string().min(1).optional(),\n code: z.string().min(1).optional(),\n displayTitle: z.string().optional(),\n displayDescription: z.string().optional(),\n type: OfferTypeSchema.optional(),\n cadence: OfferCadenceSchema.optional(),\n amount: z.number().int().min(0).optional(),\n duration: OfferDurationSchema.optional(),\n durationInMonths: z.number().int().min(1).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .nullable()\n .optional(),\n status: OfferStatusSchema.optional(),\n redemptionType: OfferRedemptionTypeSchema.optional(),\n tierId: z.string().min(1).optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.code !== undefined ||\n data.displayTitle !== undefined ||\n data.displayDescription !== undefined ||\n data.type !== undefined ||\n data.cadence !== undefined ||\n data.amount !== undefined ||\n data.duration !== undefined ||\n data.durationInMonths !== undefined ||\n data.currency !== undefined ||\n data.status !== undefined ||\n data.redemptionType !== undefined ||\n data.tierId !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const OfferBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.literal('update'),\n status: OfferStatusSchema.optional(),\n })\n .refine((data) => Boolean(data.status !== undefined), {\n message: 'Bulk update requires --status.',\n path: ['status'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { bulkOffers, createOffer, getOffer, listOffers, updateOffer } from '../lib/offers.js';\nimport {\n printJson,\n printOfferHuman,\n printOfferListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport {\n OfferBulkInputSchema,\n OfferCreateInputSchema,\n OfferGetInputSchema,\n OfferListInputSchema,\n OfferUpdateInputSchema,\n} from '../schemas/offer.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerOfferCommands(program: Command): void {\n const offer = program.command('offer').description('Offer management');\n\n offer\n .command('list')\n .description('List offers')\n .option('--limit <numberOrAll>', 'Number of offers per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = OfferListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listOffers(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferListHuman(payload, global.color !== false);\n });\n\n offer\n .command('get <id>')\n .description('Get an offer by id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = OfferGetInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getOffer(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferHuman(payload);\n });\n\n offer\n .command('create')\n .description('Create an offer')\n .requiredOption('--name <name>', 'Offer name')\n .requiredOption('--code <code>', 'Offer code')\n .option('--display-title <title>', 'Display title')\n .option('--display-description <description>', 'Display description')\n .option('--type <type>', 'percent|fixed|trial|free_months')\n .option('--cadence <cadence>', 'month|year')\n .option('--amount <amount>', 'Numeric amount')\n .option('--duration <duration>', 'once|forever|trial|free_months')\n .option('--duration-in-months <months>', 'Duration in months')\n .option('--currency <codeOrNull>', '3-letter currency code or null')\n .option('--status <status>', 'active|archived')\n .option('--redemption-type <type>', 'signup|retention')\n .option('--tier-id <id>', 'Tier id')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = OfferCreateInputSchema.safeParse({\n name: options.name,\n code: options.code,\n displayTitle: options.displayTitle,\n displayDescription: options.displayDescription,\n type: options.type,\n cadence: options.cadence,\n amount: parseInteger(options.amount, 'amount'),\n duration: options.duration,\n durationInMonths: parseInteger(options.durationInMonths, 'duration-in-months'),\n currency: options.currency?.trim().toLowerCase() === 'null' ? null : options.currency,\n status: options.status,\n redemptionType: options.redemptionType,\n tierId: options.tierId,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createOffer(global, {\n name: parsed.data.name,\n code: parsed.data.code,\n display_title: parsed.data.displayTitle,\n display_description: parsed.data.displayDescription,\n type: parsed.data.type,\n cadence: parsed.data.cadence,\n amount: parsed.data.amount,\n duration: parsed.data.duration,\n duration_in_months: parsed.data.durationInMonths,\n currency: parsed.data.currency ? parsed.data.currency.toUpperCase() : parsed.data.currency,\n status: parsed.data.status,\n redemption_type: parsed.data.redemptionType,\n tier: parsed.data.tierId ? { id: parsed.data.tierId } : undefined,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferHuman(payload);\n });\n\n offer\n .command('update <id>')\n .description('Update an offer')\n .option('--name <name>', 'Offer name')\n .option('--code <code>', 'Offer code')\n .option('--display-title <title>', 'Display title')\n .option('--display-description <description>', 'Display description')\n .option('--type <type>', 'percent|fixed|trial|free_months')\n .option('--cadence <cadence>', 'month|year')\n .option('--amount <amount>', 'Numeric amount')\n .option('--duration <duration>', 'once|forever|trial|free_months')\n .option('--duration-in-months <months>', 'Duration in months')\n .option('--currency <codeOrNull>', '3-letter currency code or null')\n .option('--status <status>', 'active|archived')\n .option('--redemption-type <type>', 'signup|retention')\n .option('--tier-id <id>', 'Tier id')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = OfferUpdateInputSchema.safeParse({\n id,\n name: options.name,\n code: options.code,\n displayTitle: options.displayTitle,\n displayDescription: options.displayDescription,\n type: options.type,\n cadence: options.cadence,\n amount: parseInteger(options.amount, 'amount'),\n duration: options.duration,\n durationInMonths: parseInteger(options.durationInMonths, 'duration-in-months'),\n currency: options.currency?.trim().toLowerCase() === 'null' ? null : options.currency,\n status: options.status,\n redemptionType: options.redemptionType,\n tierId: options.tierId,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateOffer(global, parsed.data.id, {\n name: parsed.data.name,\n code: parsed.data.code,\n display_title: parsed.data.displayTitle,\n display_description: parsed.data.displayDescription,\n type: parsed.data.type,\n cadence: parsed.data.cadence,\n amount: parsed.data.amount,\n duration: parsed.data.duration,\n duration_in_months: parsed.data.durationInMonths,\n currency: parsed.data.currency ? parsed.data.currency.toUpperCase() : parsed.data.currency,\n status: parsed.data.status,\n redemption_type: parsed.data.redemptionType,\n tier: parsed.data.tierId ? { id: parsed.data.tierId } : undefined,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferHuman(payload);\n });\n\n offer\n .command('bulk')\n .description('Run bulk offer operations')\n .requiredOption('--filter <nql>', 'NQL filter to select offers')\n .requiredOption('--action <action>', 'update')\n .option('--status <status>', 'active|archived')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = OfferBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n status: options.status,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkOffers(global, {\n filter: parsed.data.filter,\n patch: {\n status: parsed.data.status,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk offer operation completed');\n });\n}\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printPageHuman, printPageListHuman } from '../lib/output.js';\nimport {\n bulkPages,\n copyPage,\n createPage,\n deletePage,\n getPage,\n listPages,\n updatePage,\n} from '../lib/pages.js';\nimport { parseBooleanFlag, parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n PageBulkInputSchema,\n PageCopyInputSchema,\n PageCreateInputSchema,\n PageDeleteInputSchema,\n PageGetInputSchema,\n PageListInputSchema,\n PageUpdateInputSchema,\n} from '../schemas/page.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nasync function readOptionalFile(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n\n return fs.readFile(filePath, 'utf8');\n}\n\nexport function registerPageCommands(program: Command): void {\n const page = program.command('page').description('Page management');\n\n page\n .command('list')\n .description('List pages')\n .option('--limit <numberOrAll>', 'Number of pages per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--status <status>', 'Page status filter')\n .option('--featured', 'Only featured pages')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = PageListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n status: options.status,\n featured: options.featured,\n include: options.include,\n fields: options.fields,\n order: options.order,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listPages(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageListHuman(payload, global.color !== false);\n });\n\n page\n .command('get [id]')\n .description('Get a page by id or slug')\n .option('--slug <slug>', 'Page slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const payload = await getPage(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n formats: parsed.data.formats,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageHuman(payload);\n });\n\n page\n .command('create')\n .description('Create a page')\n .requiredOption('--title <title>', 'Page title')\n .option('--status <status>', 'Page status', 'draft')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled pages')\n .option('--html <html>', 'Page HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--featured', 'Mark as featured')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageCreateInputSchema.safeParse({\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n featured: options.featured,\n visibility: options.visibility,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const html = parsed.data.html ?? htmlFromFile;\n const lexical = lexicalFromFile;\n const source = html ? 'html' : undefined;\n\n const payload = await createPage(\n global,\n {\n title: parsed.data.title,\n status: parsed.data.status,\n published_at: parsed.data.publishAt,\n html,\n lexical,\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n },\n source,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageHuman(payload);\n });\n\n page\n .command('update [id]')\n .description('Update a page by id or slug')\n .option('--slug <slug>', 'Page slug lookup')\n .option('--title <title>', 'Page title')\n .option('--status <status>', 'Page status')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled pages')\n .option('--html <html>', 'Page HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--featured <value>', 'true|false')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageUpdateInputSchema.safeParse({\n id,\n slug: options.slug,\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n featured: parseBooleanFlag(options.featured),\n visibility: options.visibility,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const html = parsed.data.html ?? htmlFromFile;\n const lexical = lexicalFromFile;\n const source = html ? 'html' : undefined;\n\n const payload = await updatePage(global, {\n id: parsed.data.id,\n slug: parsed.data.slug,\n patch: {\n title: parsed.data.title,\n status: parsed.data.status,\n published_at: parsed.data.publishAt,\n html,\n lexical,\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n },\n source,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageHuman(payload);\n });\n\n page\n .command('delete <id>')\n .description('Delete a page')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete page '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deletePage(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted page '${parsed.data.id}'.`);\n });\n\n page\n .command('copy <id>')\n .description('Copy a page')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageCopyInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await copyPage(global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPageHuman(payload);\n });\n\n page\n .command('bulk')\n .description('Run bulk page operations')\n .requiredOption('--filter <nql>', 'NQL filter to select pages')\n .requiredOption('--action <action>', 'update|delete')\n .option('--status <status>', 'Status to set for bulk update')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n status: options.status,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkPages(global, {\n filter: parsed.data.filter,\n delete: parsed.data.action === 'delete',\n status: parsed.data.status,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n const stats = (\n (payload.bulk as Record<string, unknown> | undefined)?.meta as Record<string, unknown>\n )?.stats as Record<string, unknown> | undefined;\n console.log(\n `Bulk operation complete: ${String(stats?.successful ?? 0)} successful, ${String(stats?.unsuccessful ?? 0)} unsuccessful`,\n );\n });\n}\n","import { z } from 'zod';\n\nconst StatusSchema = z.enum(['draft', 'published', 'scheduled']);\nconst VisibilitySchema = z.enum(['public', 'members', 'paid', 'tiers']);\n\nfunction withSingleContentSource<T extends z.ZodTypeAny>(schema: T): T {\n return schema.superRefine((value, ctx) => {\n const data = value as Record<string, unknown>;\n const contentSources = [data.html, data.htmlFile, data.lexicalFile].filter(\n (entry) => entry !== undefined,\n );\n\n if (contentSources.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Use only one of --html, --html-file, or --lexical-file.',\n });\n }\n }) as T;\n}\n\nexport const PageListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: StatusSchema.optional(),\n featured: z.boolean().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PageGetInputSchema = z.object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PageCreateInputSchema = withSingleContentSource(\n z\n .object({\n title: z.string().min(1),\n status: StatusSchema.default('draft'),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n })\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PageUpdateInputSchema = withSingleContentSource(\n z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n title: z.string().min(1).optional(),\n status: StatusSchema.optional(),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n })\n .refine((data) => Boolean(data.id || data.slug), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.title ||\n data.status ||\n data.publishAt ||\n data.html ||\n data.htmlFile ||\n data.lexicalFile ||\n data.featured !== undefined ||\n data.visibility,\n ),\n {\n message: 'Provide at least one update field.',\n },\n )\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PageDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const PageCopyInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const PageBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']),\n status: StatusSchema.optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => data.action !== 'delete' || data.yes === true, {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n })\n .refine((data) => data.action !== 'update' || Boolean(data.status !== undefined), {\n message: 'Bulk update requires --status.',\n path: ['status'],\n });\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport MarkdownIt from 'markdown-it';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printPostHuman, printPostListHuman } from '../lib/output.js';\nimport { parseBooleanFlag, parseCsv, parseInteger } from '../lib/parse.js';\nimport {\n bulkPosts,\n copyPost,\n createPost,\n deletePost,\n getPost,\n listPosts,\n publishPost,\n schedulePost,\n unschedulePost,\n updatePost,\n} from '../lib/posts.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n PostBulkInputSchema,\n PostCopyInputSchema,\n PostCreateInputSchema,\n PostDeleteInputSchema,\n PostGetInputSchema,\n PostListInputSchema,\n PostPublishInputSchema,\n PostScheduleInputSchema,\n PostUnscheduleInputSchema,\n PostUpdateInputSchema,\n} from '../schemas/post.js';\n\nconst markdownRenderer = new MarkdownIt({ html: true, linkify: true, breaks: true });\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nasync function readOptionalFile(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n\n return fs.readFile(filePath, 'utf8');\n}\n\nasync function readOptionalStdin(enabled: boolean | undefined): Promise<string | undefined> {\n if (!enabled) {\n return undefined;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n }\n const value = Buffer.concat(chunks).toString('utf8').trim();\n return value.length > 0 ? value : undefined;\n}\n\nfunction wrapRawHtmlCard(html: string): string {\n return `<!--kg-card-begin: html-->\\n${html}\\n<!--kg-card-end: html-->`;\n}\n\nfunction asPostPayload(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object') {\n throw new GhstError('Invalid --from-json payload: expected JSON object.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const record = value as Record<string, unknown>;\n if (Array.isArray(record.posts) && record.posts.length > 0) {\n const first = record.posts[0];\n if (first && typeof first === 'object') {\n return first as Record<string, unknown>;\n }\n }\n\n return record;\n}\n\nasync function readOptionalPostJson(\n filePath: string | undefined,\n): Promise<Record<string, unknown>> {\n if (!filePath) {\n return {};\n }\n\n const payload = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return asPostPayload(payload);\n}\n\nfunction assignDefined(\n target: Record<string, unknown>,\n values: Record<string, unknown>,\n): Record<string, unknown> {\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) {\n target[key] = value;\n }\n }\n\n return target;\n}\n\nexport function registerPostCommands(program: Command): void {\n const post = program.command('post').description('Post management');\n\n post\n .command('list')\n .description('List posts')\n .option('--limit <numberOrAll>', 'Number of posts per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--status <status>', 'Post status filter')\n .option('--featured', 'Only featured posts')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = PostListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n status: options.status,\n featured: options.featured,\n include: options.include,\n fields: options.fields,\n order: options.order,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listPosts(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostListHuman(payload, global.color !== false);\n });\n\n post\n .command('get [id]')\n .description('Get a post by id or slug')\n .option('--slug <slug>', 'Post slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const payload = await getPost(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n formats: parsed.data.formats,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('create')\n .description('Create a post')\n .option('--title <title>', 'Post title')\n .option('--status <status>', 'Post status')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled posts')\n .option('--html <html>', 'Post HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--markdown-file <path>', 'Path to Markdown file')\n .option('--markdown-stdin', 'Read Markdown content from stdin')\n .option('--html-raw-file <path>', 'Path to raw HTML file wrapped in an HTML card')\n .option('--from-json <path>', 'Read post payload from JSON file')\n .option('--tags <tags>', 'Comma separated tag names')\n .option('--authors <authors>', 'Comma separated author emails')\n .option('--featured', 'Mark as featured')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .option('--tier <slug>', 'Tier slug for tier visibility access')\n .option('--feature-image <url>', 'Feature image URL')\n .option('--excerpt <excerpt>', 'Custom excerpt')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .option('--og-title <title>', 'Open Graph title')\n .option('--og-image <url>', 'Open Graph image URL')\n .option('--code-injection-head <value>', 'Code injection head HTML')\n .option('--newsletter <slug>', 'Newsletter slug for published posts')\n .option('--email-only', 'Publish as email-only')\n .option('--email-segment <segment>', 'Email segment for publish email')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostCreateInputSchema.safeParse({\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n markdownFile: options.markdownFile,\n markdownStdin: parseBooleanFlag(options.markdownStdin),\n htmlRawFile: options.htmlRawFile,\n fromJson: options.fromJson,\n tags: options.tags,\n authors: options.authors,\n featured: parseBooleanFlag(options.featured),\n visibility: options.visibility,\n tier: options.tier,\n featureImage: options.featureImage,\n excerpt: options.excerpt,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n ogTitle: options.ogTitle,\n ogImage: options.ogImage,\n codeInjectionHead: options.codeInjectionHead,\n newsletter: options.newsletter,\n emailOnly: parseBooleanFlag(options.emailOnly),\n emailSegment: options.emailSegment,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const fromJson = await readOptionalPostJson(parsed.data.fromJson);\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const markdownFromFile = await readOptionalFile(parsed.data.markdownFile);\n const markdownFromStdin = await readOptionalStdin(parsed.data.markdownStdin);\n const rawHtmlFromFile = await readOptionalFile(parsed.data.htmlRawFile);\n\n const markdown = markdownFromStdin ?? markdownFromFile;\n const renderedMarkdown = markdown ? markdownRenderer.render(markdown) : undefined;\n const wrappedRawHtml = rawHtmlFromFile ? wrapRawHtmlCard(rawHtmlFromFile) : undefined;\n\n const html =\n parsed.data.html ??\n htmlFromFile ??\n wrappedRawHtml ??\n renderedMarkdown ??\n (typeof fromJson.html === 'string' ? fromJson.html : undefined);\n const lexical =\n lexicalFromFile ??\n (typeof fromJson.lexical === 'string' ? (fromJson.lexical as string) : undefined);\n const source = html ? 'html' : undefined;\n\n const createPayload = assignDefined(\n { ...fromJson },\n {\n title: parsed.data.title,\n status:\n parsed.data.status ??\n (typeof fromJson.status === 'string' ? fromJson.status : undefined) ??\n 'draft',\n published_at: parsed.data.publishAt,\n html,\n lexical,\n tags: parseCsv(parsed.data.tags),\n authors: parseCsv(parsed.data.authors),\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n tiers: parsed.data.tier ? [{ slug: parsed.data.tier }] : undefined,\n feature_image: parsed.data.featureImage,\n custom_excerpt: parsed.data.excerpt,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n og_title: parsed.data.ogTitle,\n og_image: parsed.data.ogImage,\n codeinjection_head: parsed.data.codeInjectionHead,\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n },\n );\n\n const payload = await createPost(global, createPayload, source);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('update [id]')\n .description('Update a post by id or slug')\n .option('--slug <slug>', 'Post slug lookup')\n .option('--title <title>', 'Post title')\n .option('--status <status>', 'Post status')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled posts')\n .option('--html <html>', 'Post HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--markdown-file <path>', 'Path to Markdown file')\n .option('--markdown-stdin', 'Read Markdown content from stdin')\n .option('--html-raw-file <path>', 'Path to raw HTML file wrapped in an HTML card')\n .option('--from-json <path>', 'Read post patch from JSON file')\n .option('--tags <tags>', 'Comma separated tag names')\n .option('--authors <authors>', 'Comma separated author emails')\n .option('--featured <value>', 'true|false')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .option('--tier <slug>', 'Tier slug for tier visibility access')\n .option('--feature-image <url>', 'Feature image URL')\n .option('--excerpt <excerpt>', 'Custom excerpt')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .option('--og-title <title>', 'Open Graph title')\n .option('--og-image <url>', 'Open Graph image URL')\n .option('--code-injection-head <value>', 'Code injection head HTML')\n .option('--newsletter <slug>', 'Newsletter slug')\n .option('--email-only <value>', 'true|false')\n .option('--email-segment <segment>', 'Email segment')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostUpdateInputSchema.safeParse({\n id,\n slug: options.slug,\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n markdownFile: options.markdownFile,\n markdownStdin: parseBooleanFlag(options.markdownStdin),\n htmlRawFile: options.htmlRawFile,\n fromJson: options.fromJson,\n tags: options.tags,\n authors: options.authors,\n featured: parseBooleanFlag(options.featured),\n visibility: options.visibility,\n tier: options.tier,\n featureImage: options.featureImage,\n excerpt: options.excerpt,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n ogTitle: options.ogTitle,\n ogImage: options.ogImage,\n codeInjectionHead: options.codeInjectionHead,\n newsletter: options.newsletter,\n emailOnly: parseBooleanFlag(options.emailOnly),\n emailSegment: options.emailSegment,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const fromJson = await readOptionalPostJson(parsed.data.fromJson);\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const markdownFromFile = await readOptionalFile(parsed.data.markdownFile);\n const markdownFromStdin = await readOptionalStdin(parsed.data.markdownStdin);\n const rawHtmlFromFile = await readOptionalFile(parsed.data.htmlRawFile);\n\n const markdown = markdownFromStdin ?? markdownFromFile;\n const renderedMarkdown = markdown ? markdownRenderer.render(markdown) : undefined;\n const wrappedRawHtml = rawHtmlFromFile ? wrapRawHtmlCard(rawHtmlFromFile) : undefined;\n\n const html =\n parsed.data.html ??\n htmlFromFile ??\n wrappedRawHtml ??\n renderedMarkdown ??\n (typeof fromJson.html === 'string' ? fromJson.html : undefined);\n const lexical =\n lexicalFromFile ??\n (typeof fromJson.lexical === 'string' ? (fromJson.lexical as string) : undefined);\n const source = html ? 'html' : undefined;\n\n const patch = assignDefined(\n { ...fromJson },\n {\n title: parsed.data.title,\n status: parsed.data.status,\n published_at: parsed.data.publishAt,\n html,\n lexical,\n tags: parseCsv(parsed.data.tags),\n authors: parseCsv(parsed.data.authors),\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n tiers: parsed.data.tier ? [{ slug: parsed.data.tier }] : undefined,\n feature_image: parsed.data.featureImage,\n custom_excerpt: parsed.data.excerpt,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n og_title: parsed.data.ogTitle,\n og_image: parsed.data.ogImage,\n codeinjection_head: parsed.data.codeInjectionHead,\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n },\n );\n\n const payload = await updatePost(global, {\n id: parsed.data.id,\n slug: parsed.data.slug,\n patch,\n source,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('delete [id]')\n .description('Delete a post')\n .option('--filter <nql>', 'NQL filter to delete matching posts')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostDeleteInputSchema.safeParse({\n id,\n filter: options.filter,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const label = parsed.data.filter\n ? `Delete posts matching '${parsed.data.filter}'`\n : `Delete post '${parsed.data.id}'`;\n const ok = await confirm(`${label}? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n if (parsed.data.filter) {\n const payload = await bulkPosts(global, {\n filter: parsed.data.filter,\n delete: true,\n });\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n const stats = (payload.bulk as Record<string, unknown> | undefined)?.meta as\n | Record<string, unknown>\n | undefined;\n const statValues = (stats?.stats as Record<string, unknown> | undefined) ?? {};\n console.log(\n `Bulk operation complete: ${String(statValues.successful ?? 0)} successful, ${String(statValues.unsuccessful ?? 0)} unsuccessful`,\n );\n return;\n }\n\n await deletePost(global, parsed.data.id ?? '');\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id ?? null });\n return;\n }\n\n console.log(`Deleted post '${parsed.data.id ?? ''}'.`);\n });\n\n post\n .command('publish <id>')\n .description('Publish a post')\n .option('--newsletter <slug>', 'Newsletter slug')\n .option('--email-segment <segment>', 'Email segment')\n .option('--email-only', 'Email only publish')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostPublishInputSchema.safeParse({\n id,\n newsletter: options.newsletter,\n emailOnly: parseBooleanFlag(options.emailOnly),\n emailSegment: options.emailSegment,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await publishPost(global, parsed.data.id, {\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('schedule <id>')\n .description('Schedule a post')\n .requiredOption('--at <datetime>', 'ISO datetime for scheduled publish')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostScheduleInputSchema.safeParse({\n id,\n at: options.at,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await schedulePost(global, parsed.data.id, parsed.data.at);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPostHuman(payload);\n });\n\n post\n .command('unschedule <id>')\n .description('Unschedule a post')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostUnscheduleInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await unschedulePost(global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPostHuman(payload);\n });\n\n post\n .command('copy <id>')\n .description('Copy a post')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostCopyInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await copyPost(global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPostHuman(payload);\n });\n\n post\n .command('bulk')\n .description('Run bulk post operations')\n .requiredOption('--filter <nql>', 'NQL filter to select posts')\n .option('--action <action>', 'update|delete')\n .option('--update', 'Alias for --action update')\n .option('--delete', 'Alias for --action delete')\n .option('--status <status>', 'Status to set for bulk update')\n .option('--tags <tags>', 'Comma separated tags for bulk update')\n .option('--add-tag <tags>', 'Comma separated tags to add to existing post tags')\n .option('--authors <authors>', 'Comma separated author emails for bulk update')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n update: parseBooleanFlag(options.update),\n delete: parseBooleanFlag(options.delete),\n status: options.status,\n tags: options.tags,\n addTag: options.addTag,\n authors: options.authors,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const action = parsed.data.action ?? (parsed.data.delete ? 'delete' : 'update');\n const payload = await bulkPosts(global, {\n filter: parsed.data.filter,\n delete: action === 'delete',\n status: parsed.data.status,\n tags: parseCsv(parsed.data.tags),\n addTags: parseCsv(parsed.data.addTag),\n authors: parseCsv(parsed.data.authors),\n });\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n const stats = (payload.bulk as Record<string, unknown> | undefined)?.meta as\n | Record<string, unknown>\n | undefined;\n const statValues = (stats?.stats as Record<string, unknown> | undefined) ?? {};\n console.log(\n `Bulk operation complete: ${String(statValues.successful ?? 0)} successful, ${String(statValues.unsuccessful ?? 0)} unsuccessful`,\n );\n });\n}\n","import { z } from 'zod';\n\nconst StatusSchema = z.enum(['draft', 'published', 'scheduled']);\nconst VisibilitySchema = z.enum(['public', 'members', 'paid', 'tiers']);\n\nfunction withSingleContentSource<T extends z.ZodTypeAny>(schema: T): T {\n return schema.superRefine((value, ctx) => {\n const data = value as Record<string, unknown>;\n const contentSources = [\n data.html,\n data.htmlFile,\n data.lexicalFile,\n data.markdownFile,\n data.markdownStdin,\n data.htmlRawFile,\n ].filter((entry) => entry !== undefined && entry !== false);\n\n if (contentSources.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n 'Use only one content source: --html, --html-file, --lexical-file, --markdown-file, --markdown-stdin, or --html-raw-file.',\n });\n }\n }) as T;\n}\n\nexport const PostListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: StatusSchema.optional(),\n featured: z.boolean().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PostGetInputSchema = z.object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PostCreateInputSchema = withSingleContentSource(\n z\n .object({\n title: z.string().min(1).optional(),\n status: StatusSchema.optional(),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n markdownFile: z.string().min(1).optional(),\n markdownStdin: z.boolean().optional(),\n htmlRawFile: z.string().min(1).optional(),\n fromJson: z.string().min(1).optional(),\n tags: z.string().optional(),\n authors: z.string().optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n tier: z.string().min(1).optional(),\n featureImage: z.string().url().optional(),\n excerpt: z.string().optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().url().optional(),\n codeInjectionHead: z.string().optional(),\n newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\n })\n .refine((data) => Boolean(data.title || data.fromJson), {\n message: 'Provide --title or --from-json.',\n path: ['title'],\n })\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PostUpdateInputSchema = withSingleContentSource(\n z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n title: z.string().min(1).optional(),\n status: StatusSchema.optional(),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n markdownFile: z.string().min(1).optional(),\n markdownStdin: z.boolean().optional(),\n htmlRawFile: z.string().min(1).optional(),\n fromJson: z.string().min(1).optional(),\n tags: z.string().optional(),\n authors: z.string().optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n tier: z.string().min(1).optional(),\n featureImage: z.string().url().optional(),\n excerpt: z.string().optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().url().optional(),\n codeInjectionHead: z.string().optional(),\n newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.slug), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.title ||\n data.status ||\n data.publishAt ||\n data.html ||\n data.htmlFile ||\n data.lexicalFile ||\n data.markdownFile ||\n data.markdownStdin ||\n data.htmlRawFile ||\n data.fromJson ||\n data.tags ||\n data.authors ||\n data.featured !== undefined ||\n data.visibility ||\n data.tier ||\n data.featureImage ||\n data.excerpt ||\n data.metaTitle ||\n data.metaDescription ||\n data.ogTitle ||\n data.ogImage ||\n data.codeInjectionHead ||\n data.newsletter ||\n data.emailOnly !== undefined ||\n data.emailSegment,\n ),\n {\n message: 'Provide at least one update field.',\n },\n )\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PostDeleteInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n filter: z.string().min(1).optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => Boolean(data.id || data.filter), {\n message: 'Provide <id> or --filter.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.filter), {\n message: 'Use either <id> or --filter, not both.',\n path: ['id'],\n });\n\nexport const PostPublishInputSchema = z.object({\n id: z.string().min(1),\n newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\n});\n\nexport const PostScheduleInputSchema = z.object({\n id: z.string().min(1),\n at: z.string().datetime(),\n});\n\nexport const PostUnscheduleInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const PostCopyInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const PostBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']).optional(),\n update: z.boolean().optional(),\n delete: z.boolean().optional(),\n status: StatusSchema.optional(),\n tags: z.string().optional(),\n addTag: z.string().optional(),\n authors: z.string().optional(),\n yes: z.boolean().optional(),\n })\n .refine(\n (data) => {\n const selected = [\n data.action !== undefined,\n data.update === true,\n data.delete === true,\n ].filter(Boolean);\n return selected.length === 1;\n },\n {\n message: 'Select exactly one action via --action, --update, or --delete.',\n path: ['action'],\n },\n )\n .refine(\n (data) =>\n (data.action ?? (data.delete ? 'delete' : 'update')) !== 'delete' || data.yes === true,\n {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n },\n )\n .refine(\n (data) => {\n const action = data.action ?? (data.delete ? 'delete' : 'update');\n if (action !== 'update') {\n return true;\n }\n\n return Boolean(\n data.status !== undefined ||\n data.tags !== undefined ||\n data.addTag !== undefined ||\n data.authors !== undefined,\n );\n },\n {\n message: 'Bulk update requires at least one of --status, --tags, --add-tag, or --authors.',\n path: ['status'],\n },\n );\n","import { z } from 'zod';\n\nexport const SettingGetInputSchema = z.object({\n key: z.string().min(1),\n});\n\nexport const SettingSetInputSchema = z.object({\n key: z.string().min(1),\n value: z.string().min(1),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printSettingHuman, printSettingListHuman } from '../lib/output.js';\nimport { getSetting, listSettings, setSetting } from '../lib/settings.js';\nimport { SettingGetInputSchema, SettingSetInputSchema } from '../schemas/setting.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction parseSettingValue(value: string): unknown {\n const normalized = value.trim();\n\n if (normalized === 'null') {\n return null;\n }\n\n if (normalized === 'true') {\n return true;\n }\n\n if (normalized === 'false') {\n return false;\n }\n\n if (/^-?\\d+(?:\\.\\d+)?$/.test(normalized)) {\n return Number(normalized);\n }\n\n if (\n (normalized.startsWith('{') && normalized.endsWith('}')) ||\n (normalized.startsWith('[') && normalized.endsWith(']'))\n ) {\n try {\n return JSON.parse(normalized) as unknown;\n } catch {\n throw new GhstError('Invalid JSON value.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n }\n\n return value;\n}\n\nexport function registerSettingCommands(program: Command): void {\n const setting = program.command('setting').description('Settings management');\n\n setting\n .command('list')\n .description('List settings')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await listSettings(global);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSettingListHuman(payload, global.color !== false);\n });\n\n setting\n .command('get <key>')\n .description('Get a setting by key')\n .action(async (key: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SettingGetInputSchema.safeParse({ key });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSetting(global, parsed.data.key);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSettingHuman(payload);\n });\n\n setting\n .command('set <key> <value>')\n .description('Set a setting value')\n .action(async (key: string, value: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SettingSetInputSchema.safeParse({\n key,\n value,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await setSetting(\n global,\n parsed.data.key,\n parseSettingValue(parsed.data.value),\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSettingHuman(payload);\n });\n}\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { printJson, printSiteHuman } from '../lib/output.js';\nimport { getSiteInfo } from '../lib/site.js';\n\nexport function registerSiteCommands(program: Command): void {\n const site = program.command('site').description('Site management');\n\n site\n .command('info')\n .description('Get site information')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await getSiteInfo(global);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSiteHuman(payload);\n });\n}\n","import { z } from 'zod';\n\nexport const TagListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const TagGetInputSchema = z.object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n});\n\nexport const TagCreateInputSchema = z.object({\n name: z.string().min(1),\n slug: z.string().min(1).optional(),\n description: z.string().optional(),\n featureImage: z.string().url().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n visibility: z.enum(['public', 'internal']).optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n});\n\nexport const TagUpdateInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slugLookup: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n description: z.string().optional(),\n featureImage: z.string().url().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n visibility: z.enum(['public', 'internal']).optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.slugLookup), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.name ||\n data.slug ||\n data.description ||\n data.featureImage ||\n data.accentColor ||\n data.visibility ||\n data.metaTitle ||\n data.metaDescription,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const TagDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const TagBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']),\n visibility: z.enum(['public', 'internal']).optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => data.action !== 'delete' || data.yes === true, {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n })\n .refine((data) => data.action !== 'update' || Boolean(data.visibility !== undefined), {\n message: 'Bulk update requires --visibility.',\n path: ['visibility'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printTagHuman, printTagListHuman } from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { bulkTags, createTag, deleteTag, getTag, listTags, updateTag } from '../lib/tags.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n TagBulkInputSchema,\n TagCreateInputSchema,\n TagDeleteInputSchema,\n TagGetInputSchema,\n TagListInputSchema,\n TagUpdateInputSchema,\n} from '../schemas/tag.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerTagCommands(program: Command): void {\n const tag = program.command('tag').description('Tag management');\n\n tag\n .command('list')\n .description('List tags')\n .option('--limit <numberOrAll>', 'Number of tags per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = TagListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listTags(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagListHuman(payload, global.color !== false);\n });\n\n tag\n .command('get [id]')\n .description('Get a tag by id or slug')\n .option('--slug <slug>', 'Tag slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const payload = await getTag(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagHuman(payload);\n });\n\n tag\n .command('create')\n .description('Create a tag')\n .requiredOption('--name <name>', 'Tag name')\n .option('--slug <slug>', 'Tag slug')\n .option('--description <description>', 'Tag description')\n .option('--feature-image <url>', 'Tag feature image URL')\n .option('--accent-color <hex>', 'Tag accent color (hex)')\n .option('--visibility <visibility>', 'public|internal')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagCreateInputSchema.safeParse({\n name: options.name,\n slug: options.slug,\n description: options.description,\n featureImage: options.featureImage,\n accentColor: options.accentColor,\n visibility: options.visibility,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createTag(global, {\n name: parsed.data.name,\n slug: parsed.data.slug,\n description: parsed.data.description,\n feature_image: parsed.data.featureImage,\n accent_color: parsed.data.accentColor,\n visibility: parsed.data.visibility,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagHuman(payload);\n });\n\n tag\n .command('update [id]')\n .description('Update a tag by id or slug')\n .option('--slug <slug>', 'Tag slug lookup')\n .option('--name <name>', 'Tag name')\n .option('--new-slug <slug>', 'New tag slug')\n .option('--description <description>', 'Tag description')\n .option('--feature-image <url>', 'Tag feature image URL')\n .option('--accent-color <hex>', 'Tag accent color (hex)')\n .option('--visibility <visibility>', 'public|internal')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagUpdateInputSchema.safeParse({\n id,\n slugLookup: options.slug,\n name: options.name,\n slug: options.newSlug,\n description: options.description,\n featureImage: options.featureImage,\n accentColor: options.accentColor,\n visibility: options.visibility,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateTag(global, {\n id: parsed.data.id,\n slug: parsed.data.slugLookup,\n patch: {\n name: parsed.data.name,\n slug: parsed.data.slug,\n description: parsed.data.description,\n feature_image: parsed.data.featureImage,\n accent_color: parsed.data.accentColor,\n visibility: parsed.data.visibility,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagHuman(payload);\n });\n\n tag\n .command('delete <id>')\n .description('Delete a tag')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete tag '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteTag(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted tag '${parsed.data.id}'.`);\n });\n\n tag\n .command('bulk')\n .description('Run bulk tag operations')\n .requiredOption('--filter <nql>', 'NQL filter to select tags')\n .requiredOption('--action <action>', 'update|delete')\n .option('--visibility <visibility>', 'Visibility for bulk update (public|internal)')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n visibility: options.visibility,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkTags(global, {\n filter: parsed.data.filter,\n delete: parsed.data.action === 'delete',\n visibility: parsed.data.visibility,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n const stats = (\n (payload.bulk as Record<string, unknown> | undefined)?.meta as Record<string, unknown>\n )?.stats as Record<string, unknown> | undefined;\n console.log(\n `Bulk operation complete: ${String(stats?.successful ?? 0)} successful, ${String(stats?.unsuccessful ?? 0)} unsuccessful`,\n );\n });\n}\n","import { spawn } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printThemeHuman, printThemeListHuman } from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { runThemeDev } from '../lib/theme-dev.js';\nimport { activateTheme, listThemes, uploadTheme } from '../lib/themes.js';\nimport {\n ThemeActivateInputSchema,\n ThemeDevInputSchema,\n ThemeUploadInputSchema,\n ThemeValidateInputSchema,\n} from '../schemas/theme.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nasync function zipDirectory(directoryPath: string): Promise<string> {\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ghst-theme-'));\n const zipPath = path.join(tempDir, `${path.basename(directoryPath)}.zip`);\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn('zip', ['-r', zipPath, '.'], {\n cwd: directoryPath,\n stdio: 'ignore',\n });\n\n child.on('error', (error) => reject(error));\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`zip command failed with code ${code}`));\n });\n });\n\n return zipPath;\n}\n\nasync function validateTheme(targetPath: string): Promise<Record<string, unknown>> {\n const gscanModule = (await import('gscan')) as {\n default?: {\n check?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n checkZip?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n };\n check?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n checkZip?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n };\n\n const gscan = gscanModule.default ?? gscanModule;\n const stat = await fs.stat(targetPath);\n if (stat.isDirectory()) {\n const result = await gscan.check?.(targetPath, {\n checkVersion: 'v6',\n });\n return (result as Record<string, unknown>) ?? {};\n }\n\n const result = await gscan.checkZip?.(targetPath, {\n checkVersion: 'v6',\n });\n return (result as Record<string, unknown>) ?? {};\n}\n\nfunction getValidationErrorCount(result: Record<string, unknown>): number {\n const nested = (result.results as Record<string, unknown> | undefined) ?? {};\n\n const fromNestedError = nested.error;\n if (Array.isArray(fromNestedError)) {\n return fromNestedError.length;\n }\n\n if (\n fromNestedError &&\n typeof fromNestedError === 'object' &&\n Array.isArray((fromNestedError as { all?: unknown[] }).all)\n ) {\n return ((fromNestedError as { all?: unknown[] }).all ?? []).length;\n }\n\n const fromNestedErrors = nested.errors;\n if (Array.isArray(fromNestedErrors)) {\n return fromNestedErrors.length;\n }\n\n if (Array.isArray(result.error)) {\n return result.error.length;\n }\n\n if (Array.isArray(result.errors)) {\n return result.errors.length;\n }\n\n return 0;\n}\n\nlet themeValidatorForTests: ((targetPath: string) => Promise<Record<string, unknown>>) | null =\n null;\nlet themeDevRunnerForTests:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n path: string;\n watch?: boolean;\n activate?: boolean;\n debounceMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<Record<string, unknown>>)\n | null = null;\n\nexport function setThemeValidatorForTests(\n validator: ((targetPath: string) => Promise<Record<string, unknown>>) | null,\n): void {\n themeValidatorForTests = validator;\n}\n\nexport function setThemeDevRunnerForTests(\n runner:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n path: string;\n watch?: boolean;\n activate?: boolean;\n debounceMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<Record<string, unknown>>)\n | null,\n): void {\n themeDevRunnerForTests = runner;\n}\n\nexport function registerThemeCommands(program: Command): void {\n const theme = program.command('theme').description('Theme management');\n\n theme\n .command('list')\n .description('List themes')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await listThemes(global);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printThemeListHuman(payload, global.color !== false);\n });\n\n theme\n .command('upload <pathArg>')\n .description('Upload a theme zip or directory (with --zip)')\n .option('--zip', 'Zip a directory before upload')\n .option('--activate', 'Activate uploaded theme when possible')\n .action(async (pathArg: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeUploadInputSchema.safeParse({\n path: pathArg,\n zip: options.zip,\n activate: options.activate,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const stat = await fs.stat(parsed.data.path);\n let uploadPath = parsed.data.path;\n if (stat.isDirectory()) {\n if (!parsed.data.zip) {\n throw new GhstError(\n 'Theme path is a directory. Pass --zip to archive it before upload.',\n {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n },\n );\n }\n\n uploadPath = await zipDirectory(parsed.data.path);\n }\n\n const payload = await uploadTheme(global, uploadPath);\n\n if (parsed.data.activate) {\n const themes = Array.isArray(payload.themes)\n ? (payload.themes as Array<Record<string, unknown>>)\n : [];\n const uploadedTheme = themes[0] ?? payload;\n const name = String(uploadedTheme.name ?? '').trim();\n if (name) {\n await activateTheme(global, name);\n }\n }\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printThemeHuman(payload);\n });\n\n theme\n .command('activate <name>')\n .description('Activate a theme')\n .action(async (name: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeActivateInputSchema.safeParse({ name });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await activateTheme(global, parsed.data.name);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printThemeHuman(payload);\n });\n\n theme\n .command('validate <pathArg>')\n .description('Validate a theme zip or directory with gscan')\n .action(async (pathArg: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeValidateInputSchema.safeParse({ path: pathArg });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const result = themeValidatorForTests\n ? await themeValidatorForTests(parsed.data.path)\n : await validateTheme(parsed.data.path);\n const errorCount = getValidationErrorCount(result);\n\n if (global.json) {\n printJson(result, global.jq);\n } else {\n console.log(`Theme validation completed with ${errorCount} error(s).`);\n }\n\n if (errorCount > 0) {\n throw new GhstError(`Theme validation failed with ${errorCount} error(s).`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n });\n\n theme\n .command('dev <pathArg>')\n .description('Watch a theme directory and auto-upload on changes')\n .option('--watch', 'Keep watching for changes')\n .option('--activate', 'Activate after successful uploads')\n .option('--debounce-ms <ms>', 'Debounce delay before upload')\n .action(async (pathArg: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeDevInputSchema.safeParse({\n path: pathArg,\n watch: options.watch,\n activate: options.activate,\n debounceMs: parseInteger(options.debounceMs, 'debounce-ms'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const runner = themeDevRunnerForTests ?? runThemeDev;\n const payload = await runner(global, {\n path: parsed.data.path,\n watch: parsed.data.watch,\n activate: parsed.data.activate,\n debounceMs: parsed.data.debounceMs,\n onEvent: (event) => {\n if (global.json) {\n console.log(JSON.stringify(event));\n } else if (event.type === 'uploaded') {\n const source = String(event.source ?? 'unknown');\n const activeTheme = String(event.activeTheme ?? '');\n if (activeTheme) {\n console.log(`Uploaded (${source}) and activated '${activeTheme}'.`);\n } else {\n console.log(`Uploaded (${source}).`);\n }\n } else if (event.type === 'error') {\n console.error(`Theme dev upload error: ${String(event.message ?? '')}`);\n }\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printThemeHuman(payload);\n });\n}\n","import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport fsPromises from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { ExitCode, GhstError } from './errors.js';\nimport { activateTheme, uploadTheme } from './themes.js';\nimport type { GlobalOptions } from './types.js';\n\ninterface ThemeDevOptions {\n path: string;\n watch?: boolean;\n activate?: boolean;\n debounceMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n}\n\ninterface UploadResult {\n payload: Record<string, unknown>;\n activeTheme?: string;\n}\n\nasync function zipDirectory(directoryPath: string): Promise<string> {\n const tempDir = await fsPromises.mkdtemp(path.join(os.tmpdir(), 'ghst-theme-dev-'));\n const zipPath = path.join(tempDir, `${path.basename(directoryPath)}.zip`);\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn('zip', ['-r', zipPath, '.'], {\n cwd: directoryPath,\n stdio: 'ignore',\n });\n\n child.on('error', (error) => reject(error));\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`zip command failed with code ${code}`));\n });\n });\n\n return zipPath;\n}\n\nfunction getUploadedThemeName(payload: Record<string, unknown>): string | undefined {\n const themes = Array.isArray(payload.themes)\n ? (payload.themes as Array<Record<string, unknown>>)\n : [];\n const uploaded = themes[0] ?? payload;\n const name = String(uploaded.name ?? '').trim();\n return name || undefined;\n}\n\nasync function uploadAndMaybeActivate(\n global: GlobalOptions,\n themePath: string,\n activate: boolean,\n): Promise<UploadResult> {\n const archivePath = await zipDirectory(themePath);\n const payload = await uploadTheme(global, archivePath);\n\n if (!activate) {\n return { payload };\n }\n\n const uploadedThemeName = getUploadedThemeName(payload);\n if (!uploadedThemeName) {\n return { payload };\n }\n\n await activateTheme(global, uploadedThemeName);\n return {\n payload,\n activeTheme: uploadedThemeName,\n };\n}\n\nexport async function runThemeDev(\n global: GlobalOptions,\n options: ThemeDevOptions,\n): Promise<Record<string, unknown>> {\n const stat = await fsPromises.stat(options.path).catch(() => null);\n if (!stat || !stat.isDirectory()) {\n throw new GhstError('theme dev requires a directory path.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const debounceMs = options.debounceMs ?? 500;\n const initial = await uploadAndMaybeActivate(global, options.path, options.activate === true);\n options.onEvent?.({\n type: 'uploaded',\n source: 'initial',\n activeTheme: initial.activeTheme,\n });\n\n if (!options.watch) {\n return initial.payload;\n }\n\n const watcher = fs.watch(options.path, { recursive: true });\n let timer: NodeJS.Timeout | null = null;\n let running = false;\n let queued = false;\n let closed = false;\n let onFailure: ((error: unknown, source: string) => void) | null = null;\n\n const runQueuedUpload = async (source: string): Promise<void> => {\n if (running || closed) {\n queued = true;\n return;\n }\n\n running = true;\n try {\n const next = await uploadAndMaybeActivate(global, options.path, options.activate === true);\n options.onEvent?.({\n type: 'uploaded',\n source,\n activeTheme: next.activeTheme,\n });\n } catch (error) {\n options.onEvent?.({\n type: 'error',\n source,\n message: (error as Error).message,\n });\n onFailure?.(error, source);\n } finally {\n running = false;\n if (queued && !closed) {\n queued = false;\n await runQueuedUpload('queued');\n }\n }\n };\n\n watcher.on('change', (_eventType, filename) => {\n options.onEvent?.({\n type: 'change',\n file: typeof filename === 'string' ? filename : undefined,\n });\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => {\n void runQueuedUpload('watch');\n }, debounceMs);\n });\n\n await new Promise<void>((resolve, reject) => {\n const finalize = (error?: Error) => {\n if (closed) {\n return;\n }\n\n closed = true;\n if (timer) {\n clearTimeout(timer);\n }\n watcher.close();\n process.off('SIGINT', onSigint);\n process.off('SIGTERM', onSigterm);\n onFailure = null;\n\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n };\n\n const onSigint = () => finalize();\n const onSigterm = () => finalize();\n\n onFailure = (error) => {\n const normalized = error instanceof Error ? error : new Error(String(error));\n finalize(normalized);\n };\n\n watcher.on('error', (error) => {\n onFailure?.(error, 'watcher');\n });\n\n process.on('SIGINT', onSigint);\n process.on('SIGTERM', onSigterm);\n });\n\n return initial.payload;\n}\n","import { z } from 'zod';\n\nexport const ThemeUploadInputSchema = z.object({\n path: z.string().min(1),\n zip: z.boolean().optional(),\n activate: z.boolean().optional(),\n});\n\nexport const ThemeActivateInputSchema = z.object({\n name: z.string().min(1),\n});\n\nexport const ThemeValidateInputSchema = z.object({\n path: z.string().min(1),\n});\n\nexport const ThemeDevInputSchema = z.object({\n path: z.string().min(1),\n watch: z.boolean().optional(),\n activate: z.boolean().optional(),\n debounceMs: z.number().int().positive().max(30_000).optional(),\n});\n","import { z } from 'zod';\n\nconst TierTypeSchema = z.enum(['free', 'paid']);\nconst TierVisibilitySchema = z.enum(['public', 'none']);\n\nexport const TierListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const TierGetInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const TierCreateInputSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n active: z.boolean().optional(),\n type: TierTypeSchema.optional(),\n visibility: TierVisibilitySchema.optional(),\n monthlyPrice: z.number().int().min(0).optional(),\n yearlyPrice: z.number().int().min(0).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .optional(),\n trialDays: z.number().int().min(0).nullable().optional(),\n benefits: z.string().optional(),\n});\n\nexport const TierUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n active: z.boolean().optional(),\n type: TierTypeSchema.optional(),\n visibility: TierVisibilitySchema.optional(),\n monthlyPrice: z.number().int().min(0).optional(),\n yearlyPrice: z.number().int().min(0).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .optional(),\n trialDays: z.number().int().min(0).nullable().optional(),\n benefits: z.string().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.description !== undefined ||\n data.active !== undefined ||\n data.type !== undefined ||\n data.visibility !== undefined ||\n data.monthlyPrice !== undefined ||\n data.yearlyPrice !== undefined ||\n data.currency !== undefined ||\n data.trialDays !== undefined ||\n data.benefits !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const TierBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.literal('update'),\n active: z.boolean().optional(),\n visibility: TierVisibilitySchema.optional(),\n trialDays: z.number().int().min(0).nullable().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.active !== undefined || data.visibility !== undefined || data.trialDays !== undefined,\n ),\n {\n message: 'Bulk update requires at least one update field.',\n path: ['active'],\n },\n );\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n printJson,\n printOperationStatsHuman,\n printTierHuman,\n printTierListHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseCsv, parseInteger } from '../lib/parse.js';\nimport { bulkTiers, createTier, getTier, listTiers, updateTier } from '../lib/tiers.js';\nimport {\n TierBulkInputSchema,\n TierCreateInputSchema,\n TierGetInputSchema,\n TierListInputSchema,\n TierUpdateInputSchema,\n} from '../schemas/tier.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction parseNullableInteger(value: string | undefined, label: string): number | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value.trim().toLowerCase() === 'null') {\n return null;\n }\n\n return parseInteger(value, label);\n}\n\nexport function registerTierCommands(program: Command): void {\n const tier = program.command('tier').description('Tier management');\n\n tier\n .command('list')\n .description('List tiers')\n .option('--limit <numberOrAll>', 'Number of tiers per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = TierListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listTiers(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierListHuman(payload, global.color !== false);\n });\n\n tier\n .command('get <id>')\n .description('Get a tier by id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = TierGetInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getTier(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierHuman(payload);\n });\n\n tier\n .command('create')\n .description('Create a tier')\n .requiredOption('--name <name>', 'Tier name')\n .option('--description <description>', 'Tier description')\n .option('--active <value>', 'true|false')\n .option('--type <type>', 'free|paid')\n .option('--visibility <visibility>', 'public|none')\n .option('--monthly-price <cents>', 'Monthly price in cents')\n .option('--yearly-price <cents>', 'Yearly price in cents')\n .option('--currency <code>', '3-letter currency code')\n .option('--trial-days <daysOrNull>', 'Trial days, or null')\n .option('--benefits <benefits>', 'Comma separated benefit labels')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = TierCreateInputSchema.safeParse({\n name: options.name,\n description: options.description,\n active: parseBooleanFlag(options.active),\n type: options.type,\n visibility: options.visibility,\n monthlyPrice: parseInteger(options.monthlyPrice, 'monthly-price'),\n yearlyPrice: parseInteger(options.yearlyPrice, 'yearly-price'),\n currency: options.currency,\n trialDays: parseNullableInteger(options.trialDays, 'trial-days'),\n benefits: options.benefits,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createTier(global, {\n name: parsed.data.name,\n description: parsed.data.description,\n active: parsed.data.active,\n type: parsed.data.type,\n visibility: parsed.data.visibility,\n monthly_price: parsed.data.monthlyPrice,\n yearly_price: parsed.data.yearlyPrice,\n currency: parsed.data.currency?.toUpperCase(),\n trial_days: parsed.data.trialDays,\n benefits: parseCsv(parsed.data.benefits),\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierHuman(payload);\n });\n\n tier\n .command('update <id>')\n .description('Update a tier')\n .option('--name <name>', 'Tier name')\n .option('--description <description>', 'Tier description')\n .option('--active <value>', 'true|false')\n .option('--type <type>', 'free|paid')\n .option('--visibility <visibility>', 'public|none')\n .option('--monthly-price <cents>', 'Monthly price in cents')\n .option('--yearly-price <cents>', 'Yearly price in cents')\n .option('--currency <code>', '3-letter currency code')\n .option('--trial-days <daysOrNull>', 'Trial days, or null')\n .option('--benefits <benefits>', 'Comma separated benefit labels')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = TierUpdateInputSchema.safeParse({\n id,\n name: options.name,\n description: options.description,\n active: parseBooleanFlag(options.active),\n type: options.type,\n visibility: options.visibility,\n monthlyPrice: parseInteger(options.monthlyPrice, 'monthly-price'),\n yearlyPrice: parseInteger(options.yearlyPrice, 'yearly-price'),\n currency: options.currency,\n trialDays: parseNullableInteger(options.trialDays, 'trial-days'),\n benefits: options.benefits,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateTier(global, parsed.data.id, {\n name: parsed.data.name,\n description: parsed.data.description,\n active: parsed.data.active,\n type: parsed.data.type,\n visibility: parsed.data.visibility,\n monthly_price: parsed.data.monthlyPrice,\n yearly_price: parsed.data.yearlyPrice,\n currency: parsed.data.currency?.toUpperCase(),\n trial_days: parsed.data.trialDays,\n benefits: parsed.data.benefits !== undefined ? parseCsv(parsed.data.benefits) : undefined,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierHuman(payload);\n });\n\n tier\n .command('bulk')\n .description('Run bulk tier operations')\n .requiredOption('--filter <nql>', 'NQL filter to select tiers')\n .requiredOption('--action <action>', 'update')\n .option('--active <value>', 'true|false')\n .option('--visibility <visibility>', 'public|none')\n .option('--trial-days <daysOrNull>', 'Trial days, or null')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TierBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n active: parseBooleanFlag(options.active),\n visibility: options.visibility,\n trialDays: parseNullableInteger(options.trialDays, 'trial-days'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkTiers(global, {\n filter: parsed.data.filter,\n patch: {\n active: parsed.data.active,\n visibility: parsed.data.visibility,\n trial_days: parsed.data.trialDays,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk tier operation completed');\n });\n}\n","import { z } from 'zod';\n\nexport const UserListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const UserGetInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n email: z.string().email().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n })\n .refine(\n (data) => {\n const selectors = [Boolean(data.id), Boolean(data.slug), Boolean(data.email)].filter(Boolean);\n return selectors.length === 1;\n },\n {\n message: 'Provide exactly one selector: id argument, --slug, or --email.',\n path: ['id'],\n },\n );\n\nexport const UserMeInputSchema = z.object({\n include: z.string().optional(),\n fields: z.string().optional(),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printUserHuman, printUserListHuman } from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { getCurrentUser, getUser, listUsers } from '../lib/users.js';\nimport { UserGetInputSchema, UserListInputSchema, UserMeInputSchema } from '../schemas/user.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerUserCommands(program: Command): void {\n const user = program.command('user').description('User management');\n\n user\n .command('list')\n .description('List users')\n .option('--limit <numberOrAll>', 'Number of users per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = UserListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listUsers(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printUserListHuman(payload, global.color !== false);\n });\n\n user\n .command('get [id]')\n .description('Get a user by id, slug, or email')\n .option('--slug <slug>', 'User slug')\n .option('--email <email>', 'User email')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = UserGetInputSchema.safeParse({\n id,\n slug: options.slug,\n email: options.email,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getUser(global, {\n id: parsed.data.id,\n slug: parsed.data.slug,\n email: parsed.data.email,\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printUserHuman(payload);\n });\n\n user\n .command('me')\n .description('Get current authenticated user')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = UserMeInputSchema.safeParse({\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getCurrentUser(global, {\n include: parsed.data.include,\n fields: parsed.data.fields,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printUserHuman(payload);\n });\n}\n","import { createHmac, randomUUID, timingSafeEqual } from 'node:crypto';\nimport http from 'node:http';\nimport type { GlobalOptions } from './types.js';\nimport { createWebhook, deleteWebhook } from './webhooks.js';\n\nconst DEFAULT_MAX_BODY_BYTES = 1024 * 1024;\nconst DEFAULT_SIGNATURE_MAX_SKEW_MS = 5 * 60 * 1000;\nconst DEFAULT_HEADERS_TIMEOUT_MS = 15_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\nconst DEFAULT_KEEP_ALIVE_TIMEOUT_MS = 5_000;\n\ninterface WebhookListenerOptions {\n publicUrl: string;\n forwardTo: string;\n events: string[];\n host?: string;\n port?: number;\n maxBodyBytes?: number;\n signatureMaxSkewMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n}\n\ninterface CreatedHook {\n id: string;\n event: string;\n}\n\nclass BodyTooLargeError extends Error {\n constructor(limit: number) {\n super(`Request body exceeded limit of ${limit} bytes`);\n this.name = 'BodyTooLargeError';\n }\n}\n\ninterface ParsedSignatureHeader {\n digestHex: string;\n timestampRaw?: string;\n timestampMs?: number;\n}\n\nfunction toTimestampMs(raw: string): number | null {\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n\n if (parsed > 1_000_000_000_000) {\n return Math.trunc(parsed);\n }\n\n return Math.trunc(parsed * 1000);\n}\n\nfunction parseSignatureHeader(rawHeader: string): ParsedSignatureHeader | null {\n const parts = rawHeader\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n if (parts.length === 0) {\n return null;\n }\n\n let digestHex: string | undefined;\n let timestampRaw: string | undefined;\n\n for (const part of parts) {\n const separatorIndex = part.indexOf('=');\n if (separatorIndex <= 0) {\n continue;\n }\n\n const key = part.slice(0, separatorIndex).trim();\n const value = part.slice(separatorIndex + 1).trim();\n if (!value) {\n continue;\n }\n\n if (key === 'sha256') {\n digestHex = value;\n } else if (key === 't') {\n timestampRaw = value;\n }\n }\n\n if (!digestHex) {\n return null;\n }\n\n const parsedTimestampMs = timestampRaw ? toTimestampMs(timestampRaw) : null;\n if (timestampRaw && parsedTimestampMs === null) {\n return null;\n }\n\n return {\n digestHex,\n timestampRaw,\n ...(parsedTimestampMs === null ? {} : { timestampMs: parsedTimestampMs }),\n };\n}\n\nfunction digestMatches(expectedHex: string, actualDigest: Buffer): boolean {\n if (!/^[a-fA-F0-9]+$/.test(expectedHex) || expectedHex.length % 2 !== 0) {\n return false;\n }\n\n const expectedDigest = Buffer.from(expectedHex, 'hex');\n if (expectedDigest.length !== actualDigest.length) {\n return false;\n }\n\n return timingSafeEqual(expectedDigest, actualDigest);\n}\n\nfunction verifyGhostSignature(\n secret: string,\n body: Buffer,\n rawHeader: string | undefined,\n maxSkewMs: number,\n): { ok: boolean; reason?: string } {\n if (!rawHeader) {\n return { ok: false, reason: 'missing_signature' };\n }\n\n const parsed = parseSignatureHeader(rawHeader);\n if (!parsed) {\n return { ok: false, reason: 'malformed_signature' };\n }\n\n if (parsed.timestampMs !== undefined) {\n const skew = Math.abs(Date.now() - parsed.timestampMs);\n if (skew > maxSkewMs) {\n return { ok: false, reason: 'timestamp_out_of_range' };\n }\n }\n\n if (parsed.timestampRaw) {\n const digestWithTimestamp = createHmac('sha256', secret)\n .update(body)\n .update(parsed.timestampRaw)\n .digest();\n if (digestMatches(parsed.digestHex, digestWithTimestamp)) {\n return { ok: true };\n }\n }\n\n const digestRawBody = createHmac('sha256', secret).update(body).digest();\n if (digestMatches(parsed.digestHex, digestRawBody)) {\n return { ok: true };\n }\n\n return { ok: false, reason: 'invalid_signature' };\n}\n\nfunction asWebhookId(payload: Record<string, unknown>): string | null {\n const hooks = Array.isArray(payload.webhooks)\n ? (payload.webhooks as Array<Record<string, unknown>>)\n : [];\n const first = hooks[0] ?? payload;\n const id = String(first.id ?? '').trim();\n return id || null;\n}\n\nasync function cleanupCreatedHooks(\n global: GlobalOptions,\n createdHooks: CreatedHook[],\n onEvent?: (event: Record<string, unknown>) => void,\n): Promise<void> {\n const hooks = [...createdHooks];\n createdHooks.length = 0;\n\n for (const hook of hooks) {\n try {\n await deleteWebhook(global, hook.id);\n onEvent?.({\n type: 'cleanup',\n id: hook.id,\n event: hook.event,\n });\n } catch (error) {\n onEvent?.({\n type: 'cleanup_error',\n id: hook.id,\n event: hook.event,\n message: (error as Error).message,\n });\n }\n }\n}\n\nasync function readRequestBody(\n request: http.IncomingMessage,\n maxBodyBytes: number,\n): Promise<Buffer> {\n return await new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n let settled = false;\n\n const settle = (next: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n request.off('data', onData);\n request.off('end', onEnd);\n request.off('error', onError);\n request.off('aborted', onAborted);\n request.off('close', onClose);\n next();\n };\n\n const onData = (chunk: unknown) => {\n const normalized = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n totalBytes += normalized.length;\n if (totalBytes > maxBodyBytes) {\n settle(() => reject(new BodyTooLargeError(maxBodyBytes)));\n return;\n }\n chunks.push(normalized);\n };\n const onEnd = () => settle(() => resolve(Buffer.concat(chunks)));\n const onError = (error: unknown) =>\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n const onAborted = () => settle(() => reject(new Error('Request stream aborted')));\n const onClose = () => {\n if (!request.complete) {\n settle(() => reject(new Error('Request stream closed before completion')));\n }\n };\n\n request.on('data', onData);\n request.on('end', onEnd);\n request.on('error', onError);\n request.on('aborted', onAborted);\n request.on('close', onClose);\n });\n}\n\nexport async function runWebhookListener(\n global: GlobalOptions,\n options: WebhookListenerOptions,\n): Promise<void> {\n const host = options.host ?? '127.0.0.1';\n const port = options.port ?? 8787;\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n const signatureMaxSkewMs = options.signatureMaxSkewMs ?? DEFAULT_SIGNATURE_MAX_SKEW_MS;\n const listenerSecret = randomUUID();\n const createdHooks: CreatedHook[] = [];\n let server: http.Server | null = null;\n\n try {\n for (const eventName of options.events) {\n const payload = await createWebhook(global, {\n event: eventName,\n target_url: options.publicUrl,\n name: `ghst-listen-${eventName}-${Date.now().toString(36)}`,\n secret: listenerSecret,\n });\n\n const id = asWebhookId(payload);\n if (id) {\n createdHooks.push({ id, event: eventName });\n }\n }\n\n server = http.createServer(async (request, response) => {\n if (request.method !== 'POST') {\n response.statusCode = 405;\n response.end('Method Not Allowed');\n return;\n }\n\n let body: Buffer;\n try {\n body = await readRequestBody(request, maxBodyBytes);\n } catch (error) {\n options.onEvent?.({\n type: 'error',\n stage: 'request',\n message: (error as Error).message,\n });\n response.statusCode = error instanceof BodyTooLargeError ? 413 : 400;\n response.end();\n return;\n }\n\n const rawSignature = Array.isArray(request.headers['x-ghost-signature'])\n ? request.headers['x-ghost-signature'][0]\n : request.headers['x-ghost-signature'];\n const verification = verifyGhostSignature(\n listenerSecret,\n body,\n typeof rawSignature === 'string' ? rawSignature : undefined,\n signatureMaxSkewMs,\n );\n if (!verification.ok) {\n options.onEvent?.({\n type: 'error',\n stage: 'signature',\n message: verification.reason ?? 'invalid_signature',\n });\n response.statusCode = 401;\n response.end();\n return;\n }\n\n const rawBody = body.toString('utf8');\n let parsedBody: unknown = rawBody;\n try {\n parsedBody = JSON.parse(rawBody);\n } catch {\n parsedBody = rawBody;\n }\n\n const forwardHeaders = new Headers();\n const contentType = request.headers['content-type'];\n if (typeof contentType === 'string' && contentType.length > 0) {\n forwardHeaders.set('content-type', contentType);\n }\n\n const sourceIp = request.socket.remoteAddress;\n if (sourceIp) {\n forwardHeaders.set('x-forwarded-for', sourceIp);\n }\n\n try {\n const forwarded = await fetch(options.forwardTo, {\n method: 'POST',\n headers: forwardHeaders,\n body,\n });\n\n options.onEvent?.({\n type: 'forwarded',\n status: forwarded.status,\n ok: forwarded.ok,\n body: parsedBody,\n });\n\n response.statusCode = forwarded.ok ? 200 : 502;\n response.end();\n } catch (error) {\n options.onEvent?.({\n type: 'error',\n message: (error as Error).message,\n });\n response.statusCode = 502;\n response.end();\n }\n });\n server.headersTimeout = DEFAULT_HEADERS_TIMEOUT_MS;\n server.requestTimeout = DEFAULT_REQUEST_TIMEOUT_MS;\n server.keepAliveTimeout = DEFAULT_KEEP_ALIVE_TIMEOUT_MS;\n\n const appServer = server;\n\n await new Promise<void>((resolve, reject) => {\n appServer.once('error', reject);\n appServer.listen(port, host, () => {\n appServer.off('error', reject);\n resolve();\n });\n });\n\n options.onEvent?.({\n type: 'ready',\n host,\n port,\n publicUrl: options.publicUrl,\n forwardTo: options.forwardTo,\n hooks: createdHooks,\n });\n\n await new Promise<void>((resolve, reject) => {\n let stopped = false;\n\n const shutdown = async (error?: unknown) => {\n if (stopped) {\n return;\n }\n stopped = true;\n\n process.off('SIGINT', onSigint);\n process.off('SIGTERM', onSigterm);\n\n if (appServer.listening) {\n await new Promise<void>((done) => {\n appServer.close(() => done());\n });\n }\n\n await cleanupCreatedHooks(global, createdHooks, options.onEvent);\n\n if (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n resolve();\n };\n\n const onSigint = () => {\n void shutdown();\n };\n\n const onSigterm = () => {\n void shutdown();\n };\n\n appServer.on('error', (error) => {\n void shutdown(error);\n });\n\n process.on('SIGINT', onSigint);\n process.on('SIGTERM', onSigterm);\n });\n } catch (error) {\n const activeServer = server;\n if (activeServer?.listening) {\n await new Promise<void>((resolve) => {\n activeServer.close(() => resolve());\n });\n }\n await cleanupCreatedHooks(global, createdHooks, options.onEvent);\n throw error;\n }\n}\n","import { z } from 'zod';\n\nexport const WebhookCreateInputSchema = z.object({\n event: z.string().min(1),\n targetUrl: z.string().url(),\n name: z.string().min(1).optional(),\n secret: z.string().optional(),\n apiVersion: z.string().optional(),\n});\n\nexport const WebhookUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n event: z.string().min(1).optional(),\n targetUrl: z.string().url().optional(),\n name: z.string().min(1).optional(),\n secret: z.string().optional(),\n apiVersion: z.string().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.event !== undefined ||\n data.targetUrl !== undefined ||\n data.name !== undefined ||\n data.secret !== undefined ||\n data.apiVersion !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const WebhookDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const WebhookListenInputSchema = z.object({\n publicUrl: z.string().url(),\n forwardTo: z.string().url(),\n events: z.string().optional(),\n host: z.string().min(1).optional(),\n port: z.number().int().positive().optional(),\n maxBodyBytes: z.number().int().positive().optional(),\n signatureMaxSkewMs: z.number().int().positive().optional(),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printWebhookHuman } from '../lib/output.js';\nimport { parseCsv, parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport { runWebhookListener } from '../lib/webhook-listener.js';\nimport { createWebhook, deleteWebhook, updateWebhook, WEBHOOK_EVENTS } from '../lib/webhooks.js';\nimport {\n WebhookCreateInputSchema,\n WebhookDeleteInputSchema,\n WebhookListenInputSchema,\n WebhookUpdateInputSchema,\n} from '../schemas/webhook.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nlet webhookListenRunnerForTests:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n publicUrl: string;\n forwardTo: string;\n events: string[];\n host?: string;\n port?: number;\n maxBodyBytes?: number;\n signatureMaxSkewMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<void>)\n | null = null;\n\nexport function setWebhookListenRunnerForTests(\n runner:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n publicUrl: string;\n forwardTo: string;\n events: string[];\n host?: string;\n port?: number;\n maxBodyBytes?: number;\n signatureMaxSkewMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<void>)\n | null,\n): void {\n webhookListenRunnerForTests = runner;\n}\n\nexport function registerWebhookCommands(program: Command): void {\n const webhook = program.command('webhook').description('Webhook management');\n\n webhook\n .command('create')\n .description('Create a webhook')\n .requiredOption('--event <event>', 'Webhook event')\n .requiredOption('--target-url <url>', 'Webhook target URL')\n .option('--name <name>', 'Webhook name')\n .option('--secret <secret>', 'Webhook secret')\n .option('--api-version <version>', 'Webhook api version')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookCreateInputSchema.safeParse({\n event: options.event,\n targetUrl: options.targetUrl,\n name: options.name,\n secret: options.secret,\n apiVersion: options.apiVersion,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createWebhook(global, {\n event: parsed.data.event,\n target_url: parsed.data.targetUrl,\n name: parsed.data.name,\n secret: parsed.data.secret,\n api_version: parsed.data.apiVersion,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printWebhookHuman(payload);\n });\n\n webhook\n .command('update <id>')\n .description('Update a webhook')\n .option('--event <event>', 'Webhook event')\n .option('--target-url <url>', 'Webhook target URL')\n .option('--name <name>', 'Webhook name')\n .option('--secret <secret>', 'Webhook secret')\n .option('--api-version <version>', 'Webhook api version')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookUpdateInputSchema.safeParse({\n id,\n event: options.event,\n targetUrl: options.targetUrl,\n name: options.name,\n secret: options.secret,\n apiVersion: options.apiVersion,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateWebhook(global, parsed.data.id, {\n event: parsed.data.event,\n target_url: parsed.data.targetUrl,\n name: parsed.data.name,\n secret: parsed.data.secret,\n api_version: parsed.data.apiVersion,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printWebhookHuman(payload);\n });\n\n webhook\n .command('delete <id>')\n .description('Delete a webhook')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete webhook '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteWebhook(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted webhook '${parsed.data.id}'.`);\n });\n\n webhook\n .command('events')\n .description('List available webhook events')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n if (global.json) {\n printJson({ events: WEBHOOK_EVENTS });\n return;\n }\n\n for (const eventName of WEBHOOK_EVENTS) {\n console.log(eventName);\n }\n });\n\n webhook\n .command('listen')\n .description('Listen for webhook events and forward to a local endpoint')\n .requiredOption('--public-url <url>', 'Public URL that Ghost should send webhook events to')\n .requiredOption('--forward-to <url>', 'Local endpoint to forward events to')\n .option('--events <events>', 'Comma-separated event names (defaults to post.published)')\n .option('--host <host>', 'Bind host for local listener', '127.0.0.1')\n .option('--port <port>', 'Bind port for local listener', '8787')\n .option('--max-body-bytes <bytes>', 'Maximum inbound webhook payload size', '1048576')\n .option(\n '--signature-max-skew-ms <ms>',\n 'Maximum signature timestamp skew in milliseconds',\n '300000',\n )\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookListenInputSchema.safeParse({\n publicUrl: options.publicUrl,\n forwardTo: options.forwardTo,\n events: options.events,\n host: options.host,\n port: parseInteger(options.port, 'port'),\n maxBodyBytes: parseInteger(options.maxBodyBytes, 'max-body-bytes'),\n signatureMaxSkewMs: parseInteger(options.signatureMaxSkewMs, 'signature-max-skew-ms'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const selectedEvents = parseCsv(parsed.data.events) ?? ['post.published'];\n const knownEvents = new Set<string>(WEBHOOK_EVENTS as readonly string[]);\n const invalid = selectedEvents.filter((eventName) => !knownEvents.has(eventName));\n if (invalid.length > 0) {\n throw new GhstError(`Unsupported webhook event(s): ${invalid.join(', ')}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const runner = webhookListenRunnerForTests ?? runWebhookListener;\n await runner(global, {\n publicUrl: parsed.data.publicUrl,\n forwardTo: parsed.data.forwardTo,\n events: selectedEvents,\n host: parsed.data.host,\n port: parsed.data.port,\n maxBodyBytes: parsed.data.maxBodyBytes,\n signatureMaxSkewMs: parsed.data.signatureMaxSkewMs,\n onEvent: (event) => {\n if (global.json) {\n console.log(JSON.stringify(event));\n return;\n }\n\n const type = String(event.type ?? '');\n if (type === 'ready') {\n console.log(\n `Listening on ${String(event.host)}:${String(event.port)} and forwarding to ${String(event.forwardTo)}`,\n );\n return;\n }\n\n if (type === 'forwarded') {\n console.log(`Forwarded event -> HTTP ${String(event.status)}`);\n return;\n }\n\n if (type === 'cleanup') {\n console.log(`Deleted temporary webhook ${String(event.id)}`);\n return;\n }\n\n if (type === 'error' || type === 'cleanup_error') {\n console.error(`Webhook listen error: ${String(event.message ?? '')}`);\n }\n },\n });\n });\n}\n"],"mappings":"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","names":["fs","path","z","z","process","key","fs","spawn","chalk","spawn","chalk","chalk","path","fs","path","path","fs","z","getClient","readline","z","throwValidationError","z","fs","path","getClient","fs","path","getClient","getClient","getClient","getClient","getClient","getClient","getClient","fs","path","getClient","fs","path","getClient","getClient","getClient","z","run","fs","z","throwValidationError","fs","fs","os","path","parseCsv","getClient","normalizedSlug","parseCsv","fs","path","os","output","fs","getClient","z","throwValidationError","z","throwValidationError","z","throwValidationError","fs","z","throwValidationError","fs","fs","MarkdownIt","z","StatusSchema","VisibilitySchema","withSingleContentSource","markdownRenderer","MarkdownIt","throwValidationError","readOptionalFile","fs","z","throwValidationError","z","throwValidationError","spawn","fs","os","path","spawn","fs","os","path","path","os","spawn","fs","z","throwValidationError","zipDirectory","fs","path","os","spawn","result","throwValidationError","fs","zipDirectory","z","throwValidationError","z","throwValidationError","timingSafeEqual","http","DEFAULT_MAX_BODY_BYTES","DEFAULT_HEADERS_TIMEOUT_MS","DEFAULT_REQUEST_TIMEOUT_MS","DEFAULT_KEEP_ALIVE_TIMEOUT_MS","timingSafeEqual","http","z","throwValidationError","throwValidationError"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/api.ts","../src/lib/auth.ts","../src/schemas/common.ts","../src/lib/errors.ts","../src/lib/client.ts","../src/lib/config.ts","../src/schemas/config.ts","../src/lib/credentials.ts","../src/lib/context.ts","../src/lib/output.ts","../src/lib/tty.ts","../src/lib/parse.ts","../src/commands/auth.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/lib/images.ts","../src/schemas/image.ts","../src/commands/image.ts","../src/lib/pagination.ts","../src/lib/labels.ts","../src/lib/prompts.ts","../src/schemas/label.ts","../src/commands/label.ts","../src/mcp/server.ts","../src/mcp/tools/core.ts","../src/lib/members.ts","../src/lib/newsletters.ts","../src/lib/offers.ts","../src/lib/pages.ts","../src/lib/posts.ts","../src/lib/settings.ts","../src/lib/site.ts","../src/lib/tags.ts","../src/lib/themes.ts","../src/lib/tiers.ts","../src/lib/users.ts","../src/lib/webhooks.ts","../src/mcp/transports/http.ts","../src/mcp/transports/stdio.ts","../src/commands/mcp.ts","../src/commands/member.ts","../src/schemas/member.ts","../src/lib/migrate.ts","../src/schemas/migrate.ts","../src/commands/migrate.ts","../src/schemas/newsletter.ts","../src/commands/newsletter.ts","../src/schemas/offer.ts","../src/commands/offer.ts","../src/commands/page.ts","../src/schemas/page.ts","../src/commands/post.ts","../src/schemas/post.ts","../src/schemas/setting.ts","../src/commands/setting.ts","../src/commands/site.ts","../src/schemas/tag.ts","../src/commands/tag.ts","../src/commands/theme.ts","../src/lib/theme-dev.ts","../src/schemas/theme.ts","../src/schemas/tier.ts","../src/commands/tier.ts","../src/schemas/user.ts","../src/commands/user.ts","../src/lib/webhook-listener.ts","../src/schemas/webhook.ts","../src/commands/webhook.ts"],"sourcesContent":["import { realpathSync } from 'node:fs';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { Command, CommanderError } from 'commander';\nimport { registerApiCommands } from './commands/api.js';\nimport { registerAuthCommands } from './commands/auth.js';\nimport { registerCompletionCommands } from './commands/completion.js';\nimport { registerConfigCommands } from './commands/config.js';\nimport { registerImageCommands } from './commands/image.js';\nimport { registerLabelCommands } from './commands/label.js';\nimport { registerMcpCommands } from './commands/mcp.js';\nimport { registerMemberCommands } from './commands/member.js';\nimport { registerMigrateCommands } from './commands/migrate.js';\nimport { registerNewsletterCommands } from './commands/newsletter.js';\nimport { registerOfferCommands } from './commands/offer.js';\nimport { registerPageCommands } from './commands/page.js';\nimport { registerPostCommands } from './commands/post.js';\nimport { registerSettingCommands } from './commands/setting.js';\nimport { registerSiteCommands } from './commands/site.js';\nimport { registerTagCommands } from './commands/tag.js';\nimport { registerThemeCommands } from './commands/theme.js';\nimport { registerTierCommands } from './commands/tier.js';\nimport { registerUserCommands } from './commands/user.js';\nimport { registerWebhookCommands } from './commands/webhook.js';\nimport { ExitCode, GhstError, normalizeError, printError } from './lib/errors.js';\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name('ghst')\n .description('A modern CLI for Ghost CMS')\n .showHelpAfterError()\n .showSuggestionAfterError(true)\n .option('--json', 'Output JSON')\n .option('--jq <filter>', 'Apply jq-style field extraction to JSON output')\n .option('--site <site>', 'Configured site alias')\n .option('--url <url>', 'Ghost site URL override')\n .option('--staff-token <token>', 'Ghost staff access token override')\n .option('--debug [level]', 'Enable debug output')\n .option('--no-color', 'Disable color output');\n\n registerAuthCommands(program);\n registerPostCommands(program);\n registerPageCommands(program);\n registerTagCommands(program);\n registerMemberCommands(program);\n registerNewsletterCommands(program);\n registerTierCommands(program);\n registerOfferCommands(program);\n registerLabelCommands(program);\n registerWebhookCommands(program);\n registerUserCommands(program);\n registerImageCommands(program);\n registerThemeCommands(program);\n registerSiteCommands(program);\n registerSettingCommands(program);\n registerConfigCommands(program);\n registerApiCommands(program);\n registerMcpCommands(program);\n registerMigrateCommands(program);\n registerCompletionCommands(program);\n\n program.exitOverride();\n return program;\n}\n\nexport async function run(argv: string[]): Promise<number> {\n const program = buildProgram();\n\n try {\n await program.parseAsync(argv);\n return ExitCode.SUCCESS;\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) {\n return ExitCode.SUCCESS;\n }\n const globals = program.opts();\n const ghstError = new GhstError(error.message, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n printError(ghstError, globals);\n return ghstError.exitCode;\n }\n\n const normalized = normalizeError(error);\n const jsonMode = argv.includes('--json');\n printError(normalized, { json: jsonMode });\n return normalized.exitCode;\n }\n}\n\nexport async function main(argv: string[]): Promise<void> {\n const exitCode = await run(argv);\n process.exit(exitCode);\n}\n\nexport function isMainModule(\n moduleUrl: string = import.meta.url,\n argvEntry: string | undefined = process.argv[1],\n): boolean {\n const entry = argvEntry;\n if (!entry) {\n return false;\n }\n\n try {\n const modulePath = realpathSync(fileURLToPath(moduleUrl));\n const entryPath = realpathSync(entry);\n return modulePath === entryPath;\n } catch {\n // Fall back to URL equality when realpath resolution fails.\n return moduleUrl === pathToFileURL(entry).href;\n }\n}\n\n/* c8 ignore next 3 */\nif (isMainModule()) {\n void main(process.argv);\n}\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport { GhostClient, type GhostResponseWithMeta } from '../lib/client.js';\nimport { resolveConnectionConfig } from '../lib/config.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson } from '../lib/output.js';\nimport { parseQueryPairs } from '../lib/parse.js';\n\nfunction parsePrimitiveValue(value: string): unknown {\n const trimmed = value.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n\n const asNumber = Number(trimmed);\n if (!Number.isNaN(asNumber) && trimmed !== '') {\n return asNumber;\n }\n\n return value;\n}\n\nfunction parseFieldPairs(entries: string[] | undefined): Record<string, unknown> {\n if (!entries || entries.length === 0) {\n return {};\n }\n\n return Object.fromEntries(\n entries.map((entry) => {\n const [key, ...rest] = entry.split('=');\n const parsedKey = key?.trim();\n if (!parsedKey) {\n throw new GhstError(`Invalid field pair: ${entry}`, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n return [parsedKey, parsePrimitiveValue(rest.join('='))];\n }),\n );\n}\n\nfunction getCollectionKey(data: Record<string, unknown>): string | null {\n const entries = Object.entries(data);\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n return key;\n }\n }\n\n return null;\n}\n\nfunction mergePaginatedPayload(\n base: Record<string, unknown>,\n next: Record<string, unknown>,\n key: string,\n): Record<string, unknown> {\n const left = Array.isArray(base[key]) ? base[key] : [];\n const right = Array.isArray(next[key]) ? next[key] : [];\n const merged = [...left, ...right];\n\n const baseMeta = (base.meta as Record<string, unknown> | undefined) ?? {};\n const pagination = ((baseMeta.pagination as Record<string, unknown> | undefined) ?? {}) as Record<\n string,\n unknown\n >;\n\n return {\n ...base,\n [key]: merged,\n meta: {\n ...baseMeta,\n pagination: {\n ...pagination,\n page: 1,\n pages: 1,\n next: null,\n prev: null,\n total: merged.length,\n limit: merged.length,\n },\n },\n };\n}\n\nasync function executeRequest(\n client: GhostClient,\n options: {\n endpointPath: string;\n method: string;\n body: unknown;\n params: Record<string, string | number | boolean | undefined>;\n contentApi: boolean;\n paginate: boolean;\n },\n): Promise<GhostResponseWithMeta<Record<string, unknown>>> {\n let page = Number(options.params.page ?? 1);\n if (!Number.isInteger(page) || page <= 0) {\n page = 1;\n }\n\n let firstResponse: GhostResponseWithMeta<Record<string, unknown>> | null = null;\n let mergedPayload: Record<string, unknown> | null = null;\n\n while (true) {\n const requestParams = options.paginate\n ? {\n ...options.params,\n page,\n }\n : options.params;\n\n const current = await client.rawRequestWithMeta<Record<string, unknown>>(\n options.endpointPath,\n options.method,\n options.body,\n requestParams,\n {\n api: options.contentApi ? 'content' : 'admin',\n },\n );\n\n if (!firstResponse) {\n firstResponse = current;\n mergedPayload = current.data;\n } else if (mergedPayload) {\n const key = getCollectionKey(mergedPayload);\n if (key) {\n mergedPayload = mergePaginatedPayload(mergedPayload, current.data, key);\n }\n }\n\n if (!options.paginate) {\n break;\n }\n\n const pagination =\n ((current.data.meta as Record<string, unknown> | undefined)?.pagination as\n | Record<string, unknown>\n | undefined) ?? {};\n const pages = Number(pagination.pages ?? 1);\n if (!Number.isInteger(pages) || pages <= page) {\n break;\n }\n\n const key = getCollectionKey(current.data);\n if (!key) {\n break;\n }\n\n page += 1;\n }\n\n if (!firstResponse || !mergedPayload) {\n throw new GhstError('API request failed to produce a response payload.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n return {\n status: firstResponse.status,\n headers: firstResponse.headers,\n data: mergedPayload,\n };\n}\n\nexport function registerApiCommands(program: Command): void {\n program\n .command('api [endpointPath]')\n .description('Make a raw Ghost API request')\n .option('-X, --method <method>', 'HTTP method', 'GET')\n .option('--body <json>', 'Inline JSON request body')\n .option('--input <path>', 'Read JSON request body from file')\n .option('-f, --field <pairs...>', 'Request body field in key=value format')\n .option('--query <pairs...>', 'Query params in key=value format')\n .option('--content-api', 'Use Content API instead of Admin API')\n .option('--paginate', 'Auto-paginate list responses')\n .option('--include-headers', 'Include response headers in output')\n .action(async (endpointPath: string | undefined, options, command) => {\n if (!endpointPath) {\n throw new GhstError('Missing required argument: endpointPath', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n if (options.body && options.input) {\n throw new GhstError('Use either --body or --input, not both.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const fieldValues = parseFieldPairs(options.field);\n const fieldKeys = Object.keys(fieldValues);\n\n const global = getGlobalOptions(command);\n const connection = await resolveConnectionConfig(global);\n const client = new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n contentKey: process.env.GHOST_CONTENT_API_KEY,\n version: connection.apiVersion,\n });\n\n const params = parseQueryPairs(options.query);\n let requestBody: unknown;\n\n if (options.input) {\n requestBody = JSON.parse(await fs.readFile(options.input, 'utf8')) as unknown;\n } else if (options.body) {\n requestBody = JSON.parse(options.body) as unknown;\n }\n\n if (fieldKeys.length > 0) {\n if (requestBody === undefined) {\n requestBody = fieldValues;\n } else if (requestBody && typeof requestBody === 'object' && !Array.isArray(requestBody)) {\n requestBody = {\n ...(requestBody as Record<string, unknown>),\n ...fieldValues,\n };\n } else {\n throw new GhstError('--field can only be merged into object JSON bodies.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n }\n\n const result = await executeRequest(client, {\n endpointPath,\n method: options.method,\n body: requestBody,\n params,\n contentApi: options.contentApi,\n paginate: Boolean(options.paginate),\n });\n\n if (options.includeHeaders) {\n printJson(\n {\n status: result.status,\n headers: result.headers,\n data: result.data,\n },\n global.jq,\n );\n return;\n }\n\n printJson(result.data, global.jq);\n });\n}\n","import { SignJWT } from 'jose';\nimport { StaffAccessTokenSchema } from '../schemas/common.js';\nimport { ExitCode, GhstError } from './errors.js';\n\nexport interface ParsedStaffAccessToken {\n id: string;\n secretHex: string;\n secret: Uint8Array;\n}\n\nexport function parseStaffAccessToken(value: string): ParsedStaffAccessToken {\n const parsed = StaffAccessTokenSchema.safeParse(value);\n if (!parsed.success) {\n throw new GhstError(parsed.error.issues.map((issue) => issue.message).join('; '), {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: parsed.error.flatten(),\n });\n }\n\n const [id, secretHex] = parsed.data.split(':') as [string, string];\n return {\n id,\n secretHex,\n secret: Buffer.from(secretHex, 'hex'),\n };\n}\n\nexport async function generateStaffJwt(staffToken: string): Promise<string> {\n const parsed = parseStaffAccessToken(staffToken);\n\n return new SignJWT({})\n .setProtectedHeader({ alg: 'HS256', kid: parsed.id, typ: 'JWT' })\n .setIssuedAt()\n .setExpirationTime('5m')\n .setAudience('/admin/')\n .sign(parsed.secret);\n}\n","import { z } from 'zod';\n\nexport const UrlSchema = z.url();\n\nexport const SiteAliasSchema = z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/i, 'site alias may include letters, numbers, and hyphens');\n\nexport const ApiVersionSchema = z.string().regex(/^v\\d+\\.\\d+$/, 'api version must look like v6.0');\n\nexport const StaffAccessTokenSchema = z\n .string()\n .regex(/^[A-Za-z0-9]+:[A-Fa-f0-9]+$/, 'staff token must use the format {id}:{hex-secret}')\n .refine((value) => {\n const secret = value.split(':')[1] ?? '';\n return secret.length % 2 === 0;\n }, 'hex secret must have even length');\n","import type { GlobalOptions } from './types.js';\n\nexport enum ExitCode {\n SUCCESS = 0,\n GENERAL_ERROR = 1,\n USAGE_ERROR = 2,\n AUTH_ERROR = 3,\n OPERATION_CANCELLED = 4,\n NOT_FOUND = 5,\n CONFLICT = 6,\n VALIDATION_ERROR = 7,\n RATE_LIMITED = 8,\n}\n\nexport class GhstError extends Error {\n readonly exitCode: ExitCode;\n readonly code: string;\n readonly status?: number;\n readonly details?: unknown;\n\n constructor(\n message: string,\n options: {\n exitCode?: ExitCode;\n code?: string;\n status?: number;\n details?: unknown;\n } = {},\n ) {\n super(message);\n this.name = 'GhstError';\n this.exitCode = options.exitCode ?? ExitCode.GENERAL_ERROR;\n this.code = options.code ?? 'ERROR';\n this.status = options.status;\n this.details = options.details;\n }\n}\n\nexport function mapHttpStatusToExitCode(status: number): ExitCode {\n if (status === 401 || status === 403) return ExitCode.AUTH_ERROR;\n if (status === 404) return ExitCode.NOT_FOUND;\n if (status === 409) return ExitCode.CONFLICT;\n if (status === 422) return ExitCode.VALIDATION_ERROR;\n if (status === 429) return ExitCode.RATE_LIMITED;\n return ExitCode.GENERAL_ERROR;\n}\n\nfunction getErrorContext(error: GhstError): string | undefined {\n const details = error.details as Record<string, unknown> | undefined;\n const errors = details?.errors;\n if (!Array.isArray(errors)) {\n return undefined;\n }\n\n const context = (errors[0] as Record<string, unknown> | undefined)?.context;\n return typeof context === 'string' ? context : undefined;\n}\n\nexport function normalizeError(error: unknown): GhstError {\n if (error instanceof GhstError) return error;\n if (error instanceof Error) {\n return new GhstError(error.message, {\n code: 'UNHANDLED_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n return new GhstError('Unknown error', {\n code: 'UNKNOWN_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n details: error,\n });\n}\n\nexport function formatErrorForJson(error: GhstError): Record<string, unknown> {\n return {\n error: true,\n code: error.code,\n status: error.status,\n message: error.message,\n context: getErrorContext(error),\n details: error.details,\n };\n}\n\nexport function printError(error: GhstError, global: GlobalOptions): void {\n if (global.json) {\n console.error(JSON.stringify(formatErrorForJson(error), null, 2));\n return;\n }\n\n if (error.status) {\n console.error(`Error: ${error.message} (HTTP ${error.status})`);\n } else {\n console.error(`Error: ${error.message}`);\n }\n\n const context = getErrorContext(error);\n if (context) {\n console.error('');\n console.error(` ${context}`);\n }\n\n if (error.status === 409) {\n console.error('');\n console.error(' Hint: Fetch the resource again and retry the update.');\n }\n}\n","import { generateStaffJwt, parseStaffAccessToken } from './auth.js';\nimport { ExitCode, GhstError, mapHttpStatusToExitCode } from './errors.js';\n\nexport interface GhostClientConfig {\n url: string;\n staffToken?: string;\n contentKey?: string;\n version?: string;\n}\n\nexport interface GhostApiErrorPayload {\n errors?: Array<{ message?: string; context?: string; type?: string }>;\n [key: string]: unknown;\n}\n\nexport interface GhostPaginatedResponse extends Record<string, unknown> {\n meta?: Record<string, unknown>;\n}\n\ntype RequestApi = 'admin' | 'content';\ntype ResponseType = 'json' | 'text' | 'buffer';\n\nexport interface GhostResponseWithMeta<T> {\n data: T;\n status: number;\n headers: Record<string, string>;\n}\n\nexport class GhostApiError extends GhstError {\n readonly payload: GhostApiErrorPayload | null;\n\n constructor(status: number, message: string, payload: GhostApiErrorPayload | null) {\n super(message, {\n exitCode: mapHttpStatusToExitCode(status),\n status,\n code: 'GHOST_API_ERROR',\n details: payload,\n });\n this.payload = payload;\n }\n}\n\nfunction isReadMethod(method: string): boolean {\n const normalized = method.toUpperCase();\n return normalized === 'GET' || normalized === 'HEAD';\n}\n\nfunction getRetryDelay(attempt: number): number {\n if (process.env.VITEST) {\n return 0;\n }\n\n return 1000 * 2 ** attempt;\n}\n\nfunction isFormDataBody(value: unknown): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction isTierNotFoundAnomaly(\n status: number,\n endpointPath: string,\n payload: GhostApiErrorPayload | null,\n): boolean {\n if (status !== 500 || !/^\\/tiers\\/[^/]+\\/$/.test(endpointPath)) {\n return false;\n }\n\n const context = payload?.errors?.[0]?.context ?? '';\n return (\n context.includes('Cannot read properties of null') ||\n context.includes('Cannot set properties of null')\n );\n}\n\nasync function wait(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class GhostClient {\n private readonly url: string;\n private readonly staffToken?: string;\n private readonly contentKey?: string;\n private readonly version: string;\n\n constructor(config: GhostClientConfig) {\n if (!config.staffToken && !config.contentKey) {\n throw new GhstError('Ghost client requires a staff access token or content key.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n if (config.staffToken) {\n parseStaffAccessToken(config.staffToken);\n }\n\n this.url = config.url.replace(/\\/$/, '');\n this.staffToken = config.staffToken;\n this.contentKey = config.contentKey;\n this.version = config.version ?? 'v6.0';\n }\n\n private async request<T>(\n method: string,\n endpointPath: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n source?: 'html';\n api?: RequestApi;\n responseType?: ResponseType;\n includeMeta: true;\n },\n ): Promise<GhostResponseWithMeta<T>>;\n private async request<T>(\n method: string,\n endpointPath: string,\n options?: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n source?: 'html';\n api?: RequestApi;\n responseType?: ResponseType;\n includeMeta?: false | undefined;\n },\n ): Promise<T>;\n private async request<T>(\n method: string,\n endpointPath: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n source?: 'html';\n api?: RequestApi;\n responseType?: ResponseType;\n includeMeta?: boolean;\n } = {},\n ): Promise<T | GhostResponseWithMeta<T>> {\n const api = options.api ?? 'admin';\n const upperMethod = method.toUpperCase();\n const maxNetworkRetries = isReadMethod(upperMethod) ? 1 : 0;\n let networkRetryCount = 0;\n let rateRetryCount = 0;\n\n while (true) {\n const url = new URL(`/ghost/api/${api}${endpointPath}`, this.url);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n if (options.source) {\n url.searchParams.set('source', options.source);\n }\n\n const headers: Record<string, string> = {\n 'Accept-Version': this.version,\n };\n\n if (api === 'admin') {\n if (!this.staffToken) {\n throw new GhstError('Staff access token is required for this request.', {\n code: 'AUTH_REQUIRED',\n exitCode: ExitCode.AUTH_ERROR,\n });\n }\n\n const token = await generateStaffJwt(this.staffToken);\n headers.Authorization = `Ghost ${token}`;\n } else {\n if (!this.contentKey) {\n throw new GhstError('GHOST_CONTENT_API_KEY is required for --content-api requests.', {\n code: 'AUTH_REQUIRED',\n exitCode: ExitCode.AUTH_ERROR,\n });\n }\n\n url.searchParams.set('key', this.contentKey);\n }\n\n let requestBody: string | FormData | undefined;\n if (options.body !== undefined) {\n if (isFormDataBody(options.body)) {\n requestBody = options.body;\n } else if (typeof options.body === 'string') {\n requestBody = options.body;\n headers['Content-Type'] = 'application/json';\n } else {\n requestBody = JSON.stringify(options.body);\n headers['Content-Type'] = 'application/json';\n }\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method: upperMethod,\n headers,\n body: requestBody,\n });\n } catch (error) {\n if (networkRetryCount < maxNetworkRetries) {\n networkRetryCount += 1;\n continue;\n }\n\n throw new GhstError(`Network request failed: ${(error as Error).message}`, {\n code: 'NETWORK_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n if (response.status === 429 && rateRetryCount < 3) {\n const delay = getRetryDelay(rateRetryCount);\n rateRetryCount += 1;\n await wait(delay);\n continue;\n }\n\n if (!response.ok) {\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n\n let payload: GhostApiErrorPayload | null = null;\n if (contentType.includes('application/json')) {\n try {\n payload = (await response.json()) as GhostApiErrorPayload;\n } catch {\n payload = null;\n }\n } else {\n const body = await response.text();\n try {\n payload = JSON.parse(body) as GhostApiErrorPayload;\n } catch {\n payload = null;\n }\n }\n\n if (isTierNotFoundAnomaly(response.status, endpointPath, payload)) {\n throw new GhostApiError(404, 'Tier not found', payload);\n }\n\n const ghostMessage =\n payload?.errors?.[0]?.message ?? `Ghost API request failed (${response.status})`;\n throw new GhostApiError(response.status, ghostMessage, payload);\n }\n\n const responseHeaders = Object.fromEntries(response.headers.entries());\n\n if (response.status === 204) {\n const empty = {} as T;\n if (options.includeMeta) {\n return {\n data: empty,\n status: response.status,\n headers: responseHeaders,\n };\n }\n\n return empty;\n }\n\n let data: T;\n if (options.responseType === 'text') {\n data = (await response.text()) as T;\n } else if (options.responseType === 'buffer') {\n data = Buffer.from(await response.arrayBuffer()) as T;\n } else {\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n if (!contentType.includes('application/json')) {\n data = (await response.text()) as T;\n } else {\n data = (await response.json()) as T;\n }\n }\n\n if (options.includeMeta) {\n return {\n data,\n status: response.status,\n headers: responseHeaders,\n };\n }\n\n return data;\n }\n }\n\n async siteInfo(): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>('GET', '/site/');\n }\n\n async rawRequest<T>(\n path: string,\n method = 'GET',\n body?: unknown,\n params?: Record<string, string | number | boolean | undefined>,\n options: { api?: RequestApi; responseType?: ResponseType } = {},\n ): Promise<T> {\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return (await this.request<T>(method.toUpperCase(), normalized, {\n body,\n params,\n api: options.api,\n responseType: options.responseType,\n })) as T;\n }\n\n async rawRequestWithMeta<T>(\n path: string,\n method = 'GET',\n body?: unknown,\n params?: Record<string, string | number | boolean | undefined>,\n options: { api?: RequestApi; responseType?: ResponseType } = {},\n ): Promise<GhostResponseWithMeta<T>> {\n const normalized = path.startsWith('/') ? path : `/${path}`;\n return (await this.request<T>(method.toUpperCase(), normalized, {\n body,\n params,\n api: options.api,\n responseType: options.responseType,\n includeMeta: true,\n })) as GhostResponseWithMeta<T>;\n }\n\n posts = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/posts/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/posts/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/posts/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (post: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('POST', '/posts/', {\n body: { posts: [post] },\n source,\n }),\n\n edit: (id: string, post: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('PUT', `/posts/${id}/`, {\n body: { posts: [post] },\n source,\n }),\n\n copy: (id: string) => this.request<Record<string, unknown>>('POST', `/posts/${id}/copy/`),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/posts/${id}/`),\n };\n\n pages = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/pages/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/pages/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/pages/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (page: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('POST', '/pages/', {\n body: { pages: [page] },\n source,\n }),\n\n edit: (id: string, page: Record<string, unknown>, source?: 'html') =>\n this.request<Record<string, unknown>>('PUT', `/pages/${id}/`, {\n body: { pages: [page] },\n source,\n }),\n\n copy: (id: string) => this.request<Record<string, unknown>>('POST', `/pages/${id}/copy/`),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/pages/${id}/`),\n };\n\n tags = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/tags/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/tags/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/tags/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (tag: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/tags/', {\n body: { tags: [tag] },\n }),\n\n edit: (id: string, tag: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/tags/${id}/`, {\n body: { tags: [tag] },\n }),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/tags/${id}/`),\n };\n\n members = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/members/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/members/${id}/`, { params }),\n\n add: (\n member: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('POST', '/members/', {\n body: { members: [member] },\n params,\n }),\n\n edit: (id: string, member: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/members/${id}/`, {\n body: { members: [member] },\n }),\n\n delete: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, never>>('DELETE', `/members/${id}/`, { params }),\n\n bulkDestroy: (params: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('DELETE', '/members/', { params }),\n\n bulkEdit: (\n bulk: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('PUT', '/members/bulk/', {\n body: { bulk },\n params,\n }),\n\n exportCsv: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<string>('GET', '/members/upload/', {\n params,\n responseType: 'text',\n }),\n\n importCsv: (\n formData: FormData,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('POST', '/members/upload/', {\n body: formData,\n params,\n }),\n };\n\n newsletters = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/newsletters/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/newsletters/${id}/`, { params }),\n\n add: (\n newsletter: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('POST', '/newsletters/', {\n body: { newsletters: [newsletter] },\n params,\n }),\n\n edit: (\n id: string,\n newsletter: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('PUT', `/newsletters/${id}/`, {\n body: { newsletters: [newsletter] },\n params,\n }),\n };\n\n tiers = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/tiers/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/tiers/${id}/`, { params }),\n\n add: (tier: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/tiers/', {\n body: { tiers: [tier] },\n }),\n\n edit: (id: string, tier: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/tiers/${id}/`, {\n body: { tiers: [tier] },\n }),\n };\n\n offers = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/offers/', { params }),\n\n read: (id: string) => this.request<Record<string, unknown>>('GET', `/offers/${id}/`),\n\n add: (offer: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/offers/', {\n body: { offers: [offer] },\n }),\n\n edit: (id: string, offer: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/offers/${id}/`, {\n body: { offers: [offer] },\n }),\n };\n\n labels = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/labels/', { params }),\n\n read: (\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/labels/slug/${idOrSlug}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/labels/${idOrSlug}/`, {\n params: options.params,\n });\n },\n\n add: (label: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/labels/', {\n body: { labels: [label] },\n }),\n\n edit: (id: string, label: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/labels/${id}/`, {\n body: { labels: [label] },\n }),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/labels/${id}/`),\n };\n\n users = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/users/', { params }),\n\n read: (\n idOrSlugOrEmail: string,\n options: {\n bySlug?: boolean;\n byEmail?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n } = {},\n ) => {\n if (options.bySlug) {\n return this.request<Record<string, unknown>>('GET', `/users/slug/${idOrSlugOrEmail}/`, {\n params: options.params,\n });\n }\n\n if (options.byEmail) {\n return this.request<Record<string, unknown>>('GET', `/users/email/${idOrSlugOrEmail}/`, {\n params: options.params,\n });\n }\n\n return this.request<Record<string, unknown>>('GET', `/users/${idOrSlugOrEmail}/`, {\n params: options.params,\n });\n },\n\n me: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', '/users/me/', { params }),\n };\n\n webhooks = {\n add: (webhook: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('POST', '/webhooks/', {\n body: { webhooks: [webhook] },\n }),\n\n edit: (id: string, webhook: Record<string, unknown>) =>\n this.request<Record<string, unknown>>('PUT', `/webhooks/${id}/`, {\n body: { webhooks: [webhook] },\n }),\n\n delete: (id: string) => this.request<Record<string, never>>('DELETE', `/webhooks/${id}/`),\n };\n\n images = {\n upload: (formData: FormData) =>\n this.request<Record<string, unknown>>('POST', '/images/upload/', {\n body: formData,\n }),\n };\n\n themes = {\n browse: () => this.request<Record<string, unknown>>('GET', '/themes/'),\n\n readActive: () => this.request<Record<string, unknown>>('GET', '/themes/active/'),\n\n upload: (formData: FormData) =>\n this.request<Record<string, unknown>>('POST', '/themes/upload/', {\n body: formData,\n }),\n\n activate: (name: string) =>\n this.request<Record<string, unknown>>('PUT', `/themes/${name}/activate/`, {\n body: {},\n }),\n };\n\n settings = {\n browse: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', '/settings/', { params }),\n\n edit: (settings: Array<Record<string, unknown>>) =>\n this.request<Record<string, unknown>>('PUT', '/settings/', {\n body: { settings },\n }),\n };\n\n db = {\n export: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Buffer>('GET', '/db/', {\n params,\n responseType: 'buffer',\n }),\n\n import: (formData: FormData) =>\n this.request<Record<string, unknown>>('POST', '/db/', {\n body: formData,\n }),\n };\n}\n","import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { ApiVersionSchema, SiteAliasSchema, UrlSchema } from '../schemas/common.js';\nimport {\n type GhstProjectConfig,\n type GhstUserConfig,\n ProjectConfigSchema,\n UserConfigSchema,\n} from '../schemas/config.js';\nimport { credentialRefForAlias, getCredentialStore } from './credentials.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport type { ConnectionConfig, GlobalOptions } from './types.js';\n\nconst DEFAULT_API_VERSION = 'v6.0';\nconst CURRENT_CONFIG_VERSION = 2;\nlet warnedPlaintextStaffTokens = false;\n\nfunction isPosixPlatform(): boolean {\n return process.platform !== 'win32';\n}\n\nasync function enforceSecureUserConfigPermissions(configPath: string): Promise<void> {\n if (!isPosixPlatform()) {\n return;\n }\n\n let stat: Awaited<ReturnType<typeof fs.stat>> | null = null;\n try {\n stat = await fs.stat(configPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return;\n }\n throw error;\n }\n\n const mode = stat.mode & 0o777;\n if ((mode & 0o077) !== 0) {\n await fs.chmod(configPath, 0o600);\n }\n}\n\nfunction withCurrentConfigVersion(config: GhstUserConfig): GhstUserConfig {\n return {\n ...config,\n version: Math.max(config.version, CURRENT_CONFIG_VERSION),\n };\n}\n\nfunction hasPlaintextStaffTokens(config: GhstUserConfig): boolean {\n return Object.values(config.sites).some((site) =>\n Boolean(site.staffAccessToken && !site.credentialRef),\n );\n}\n\nfunction warnPlaintextCredentialFallback(): void {\n if (warnedPlaintextStaffTokens || process.env.VITEST) {\n return;\n }\n\n warnedPlaintextStaffTokens = true;\n console.error(\n 'Warning: secure credential storage is unavailable; plaintext staff access tokens remain in config. Re-login once secure storage is available.',\n );\n}\n\nasync function migratePlaintextStaffTokens(\n config: GhstUserConfig,\n env: NodeJS.ProcessEnv,\n): Promise<GhstUserConfig> {\n if (!hasPlaintextStaffTokens(config)) {\n return config;\n }\n\n const store = getCredentialStore();\n const available = await store.isAvailable().catch(() => false);\n if (!available) {\n warnPlaintextCredentialFallback();\n return config;\n }\n\n let changed = false;\n const next = structuredClone(config);\n\n for (const [alias, site] of Object.entries(next.sites)) {\n const staffToken = site.staffAccessToken;\n if (!staffToken || site.credentialRef) {\n continue;\n }\n\n const credentialRef = credentialRefForAlias(alias);\n await store.set(credentialRef, staffToken);\n site.credentialRef = credentialRef;\n delete site.staffAccessToken;\n changed = true;\n }\n\n if (!changed) {\n return config;\n }\n\n const normalized = withCurrentConfigVersion(next);\n await writeUserConfig(normalized, env);\n return normalized;\n}\n\nexport function deriveSiteAlias(url: string): string {\n const hostname = new URL(url).hostname.replace(/^www\\./, '');\n const [base = hostname] = hostname.split('.');\n return base.replace(/[^a-zA-Z0-9-]/g, '-').toLowerCase();\n}\n\nexport function getConfigDir(env: NodeJS.ProcessEnv = process.env): string {\n return env.GHST_CONFIG_DIR || path.join(os.homedir(), '.config', 'ghst');\n}\n\nexport function getUserConfigPath(env: NodeJS.ProcessEnv = process.env): string {\n return path.join(getConfigDir(env), 'config.json');\n}\n\nexport function getProjectConfigPath(cwd = process.cwd()): string {\n return path.join(cwd, '.ghst', 'config.json');\n}\n\nexport async function readUserConfig(\n env: NodeJS.ProcessEnv = process.env,\n): Promise<GhstUserConfig> {\n const configPath = getUserConfigPath(env);\n\n try {\n const raw = await fs.readFile(configPath, 'utf8');\n const json = JSON.parse(raw) as unknown;\n const parsed = UserConfigSchema.parse(json);\n await enforceSecureUserConfigPermissions(configPath);\n return await migratePlaintextStaffTokens(parsed, env);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return UserConfigSchema.parse({ version: CURRENT_CONFIG_VERSION, sites: {} });\n }\n\n if (error instanceof SyntaxError) {\n throw new GhstError(`Invalid JSON in ${configPath}`, {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'INVALID_CONFIG',\n });\n }\n\n throw error;\n }\n}\n\nexport async function writeUserConfig(\n config: GhstUserConfig,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<void> {\n const configPath = getUserConfigPath(env);\n const normalized = withCurrentConfigVersion(UserConfigSchema.parse(config));\n await fs.mkdir(path.dirname(configPath), {\n recursive: true,\n ...(isPosixPlatform() ? { mode: 0o700 } : {}),\n });\n await fs.writeFile(configPath, `${JSON.stringify(normalized, null, 2)}\\n`, {\n encoding: 'utf8',\n ...(isPosixPlatform() ? { mode: 0o600 } : {}),\n });\n await enforceSecureUserConfigPermissions(configPath);\n}\n\nexport async function readProjectConfig(cwd = process.cwd()): Promise<GhstProjectConfig | null> {\n const configPath = getProjectConfigPath(cwd);\n\n try {\n const raw = await fs.readFile(configPath, 'utf8');\n const json = JSON.parse(raw) as unknown;\n return ProjectConfigSchema.parse(json);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n throw new GhstError(`Invalid JSON in ${configPath}`, {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'INVALID_PROJECT_CONFIG',\n });\n }\n\n throw error;\n }\n}\n\nexport async function writeProjectConfig(\n config: GhstProjectConfig,\n cwd = process.cwd(),\n): Promise<void> {\n const configPath = getProjectConfigPath(cwd);\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, 'utf8');\n}\n\nasync function resolveSiteFromConfig(\n alias: string,\n config: GhstUserConfig,\n source: ConnectionConfig['source'],\n): Promise<ConnectionConfig> {\n const site = config.sites[alias];\n if (!site) {\n throw new GhstError(`Site alias not found: ${alias}`, {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n let staffToken = site.staffAccessToken;\n if (!staffToken && site.credentialRef) {\n const store = getCredentialStore();\n const available = await store.isAvailable().catch(() => false);\n if (!available) {\n throw new GhstError(\n `Secure credential storage is unavailable for site alias: ${alias}. Re-login with --insecure-storage or enable system keychain integration.`,\n {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n },\n );\n }\n\n staffToken = (await store.get(site.credentialRef)) ?? undefined;\n }\n\n if (!staffToken) {\n throw new GhstError(\n `Credentials for site alias '${alias}' are unavailable. Run ghst auth login.`,\n {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n },\n );\n }\n\n return {\n url: site.url,\n staffToken,\n apiVersion: site.apiVersion,\n siteAlias: alias,\n source,\n };\n}\n\nexport async function resolveConnectionConfig(\n global: GlobalOptions,\n options: {\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n userConfig?: GhstUserConfig;\n projectConfig?: GhstProjectConfig | null;\n } = {},\n): Promise<ConnectionConfig> {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const userConfig = options.userConfig ?? (await readUserConfig(env));\n const projectConfig =\n options.projectConfig === undefined ? await readProjectConfig(cwd) : options.projectConfig;\n\n if (global.site) {\n SiteAliasSchema.parse(global.site);\n return await resolveSiteFromConfig(global.site, userConfig, 'site');\n }\n\n const hasUrlFlag = global.url !== undefined;\n const hasStaffTokenFlag = global.staffToken !== undefined;\n const hasDirectFlags = hasUrlFlag || hasStaffTokenFlag;\n const directVersion = env.GHOST_API_VERSION ?? DEFAULT_API_VERSION;\n\n if (hasDirectFlags) {\n const directUrl = global.url;\n const directStaffToken = global.staffToken;\n\n if (directUrl === undefined || directStaffToken === undefined) {\n throw new GhstError(\n 'Both --url and --staff-token are required when using direct credential flags.',\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n\n UrlSchema.parse(directUrl);\n ApiVersionSchema.parse(directVersion);\n return {\n url: directUrl,\n staffToken: directStaffToken,\n apiVersion: directVersion,\n source: 'flags',\n };\n }\n\n if (env.GHOST_URL && env.GHOST_STAFF_ACCESS_TOKEN) {\n UrlSchema.parse(env.GHOST_URL);\n ApiVersionSchema.parse(directVersion);\n return {\n url: env.GHOST_URL,\n staffToken: env.GHOST_STAFF_ACCESS_TOKEN,\n apiVersion: directVersion,\n source: 'env',\n };\n }\n\n if (env.GHOST_SITE) {\n return await resolveSiteFromConfig(env.GHOST_SITE, userConfig, 'site');\n }\n\n if (projectConfig?.site) {\n return await resolveSiteFromConfig(projectConfig.site, userConfig, 'project');\n }\n\n if (userConfig.active) {\n return await resolveSiteFromConfig(userConfig.active, userConfig, 'active');\n }\n\n throw new GhstError(\n 'No site configuration found. Use ghst auth login, set env vars, or pass --url and --staff-token.',\n {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n },\n );\n}\n","import { z } from 'zod';\nimport { ApiVersionSchema, SiteAliasSchema, StaffAccessTokenSchema, UrlSchema } from './common.js';\n\nexport const SiteConfigSchema = z\n .object({\n url: UrlSchema,\n staffAccessToken: StaffAccessTokenSchema.optional(),\n credentialRef: z.string().min(1).optional(),\n apiVersion: ApiVersionSchema.default('v6.0'),\n addedAt: z.string().datetime(),\n })\n .refine((site) => Boolean(site.staffAccessToken || site.credentialRef), {\n message: 'site config must include staffAccessToken or credentialRef',\n });\n\nexport const UserConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.number().int().min(1).default(2),\n active: SiteAliasSchema.optional(),\n sites: z.record(SiteAliasSchema, SiteConfigSchema).default({}),\n defaults: z\n .object({\n format: z.string().optional(),\n limit: z.number().int().positive().optional(),\n editor: z.string().optional(),\n })\n .optional(),\n});\n\nexport const ProjectConfigSchema = z.object({\n site: SiteAliasSchema,\n defaults: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type GhstUserConfig = z.infer<typeof UserConfigSchema>;\nexport type GhstProjectConfig = z.infer<typeof ProjectConfigSchema>;\n","import { spawn } from 'node:child_process';\n\ninterface CommandResult {\n stdout: string;\n stderr: string;\n code: number;\n}\n\ninterface CommandOptions {\n env?: NodeJS.ProcessEnv;\n input?: string;\n}\n\nexport interface CredentialStore {\n isAvailable(): Promise<boolean>;\n set(ref: string, secret: string): Promise<void>;\n get(ref: string): Promise<string | null>;\n delete(ref: string): Promise<void>;\n}\n\ninterface CredentialStoreAdapter {\n isAvailable(): Promise<boolean>;\n set(ref: string, secret: string): Promise<void>;\n get(ref: string): Promise<string | null>;\n delete(ref: string): Promise<void>;\n}\n\nconst MACOS_SERVICE = 'ghst';\nconst LINUX_ATTR_APP = 'ghst-app';\nconst LINUX_ATTR_REF = 'ghst-ref';\nconst WINDOWS_TARGET_PREFIX = 'ghst:';\n\nlet credentialStoreForTests: CredentialStore | null = null;\nlet cachedStore: CredentialStore | null = null;\n\nfunction sanitizeRef(ref: string): string {\n return ref.replace(/[^a-zA-Z0-9:_-]/g, '-');\n}\n\nfunction toWindowsTarget(ref: string): string {\n return `${WINDOWS_TARGET_PREFIX}${sanitizeRef(ref)}`;\n}\n\nasync function runCommand(\n command: string,\n args: string[],\n options: CommandOptions = {},\n): Promise<CommandResult> {\n return await new Promise<CommandResult>((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: 'pipe',\n env: options.env,\n });\n\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n\n child.stdout.on('data', (chunk) => {\n stdout.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n });\n child.stderr.on('data', (chunk) => {\n stderr.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n });\n\n child.on('error', reject);\n child.on('close', (code) => {\n resolve({\n stdout: Buffer.concat(stdout).toString('utf8'),\n stderr: Buffer.concat(stderr).toString('utf8'),\n code: code ?? 1,\n });\n });\n\n if (options.input !== undefined) {\n child.stdin.write(options.input);\n }\n child.stdin.end();\n });\n}\n\nfunction createUnavailableStore(): CredentialStoreAdapter {\n return {\n isAvailable: async () => false,\n set: async () => {\n throw new Error('Secure credential storage is unavailable.');\n },\n get: async () => null,\n delete: async () => undefined,\n };\n}\n\nfunction createMacOsAdapter(): CredentialStoreAdapter {\n const runSecurity = async (\n args: string[],\n options: CommandOptions = {},\n ): Promise<CommandResult> => {\n return await runCommand('security', args, options);\n };\n\n return {\n isAvailable: async () => {\n try {\n const result = await runSecurity(['list-keychains']);\n return result.code === 0;\n } catch {\n return false;\n }\n },\n set: async (ref, secret) => {\n const result = await runSecurity([\n 'add-generic-password',\n '-a',\n sanitizeRef(ref),\n '-s',\n MACOS_SERVICE,\n '-U',\n '-w',\n secret,\n ]);\n if (result.code !== 0) {\n throw new Error(\n `Failed to store credential in macOS Keychain: ${result.stderr || result.stdout}`,\n );\n }\n },\n get: async (ref) => {\n const result = await runSecurity([\n 'find-generic-password',\n '-a',\n sanitizeRef(ref),\n '-s',\n MACOS_SERVICE,\n '-w',\n ]);\n if (result.code !== 0) {\n return null;\n }\n return result.stdout.trim() || null;\n },\n delete: async (ref) => {\n const result = await runSecurity([\n 'delete-generic-password',\n '-a',\n sanitizeRef(ref),\n '-s',\n MACOS_SERVICE,\n ]);\n if (result.code !== 0) {\n const message = `${result.stderr}\\n${result.stdout}`;\n if (message.includes('could not be found')) {\n return;\n }\n throw new Error(\n `Failed to delete credential from macOS Keychain: ${result.stderr || result.stdout}`,\n );\n }\n },\n };\n}\n\nfunction createLinuxAdapter(): CredentialStoreAdapter {\n const runSecretTool = async (\n args: string[],\n options: CommandOptions = {},\n ): Promise<CommandResult> => {\n return await runCommand('secret-tool', args, options);\n };\n\n return {\n isAvailable: async () => {\n try {\n const probe = await runSecretTool([\n 'lookup',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n '__probe__',\n ]);\n return probe.code === 0 || probe.code === 1;\n } catch {\n return false;\n }\n },\n set: async (ref, secret) => {\n const result = await runSecretTool(\n [\n 'store',\n '--label',\n 'ghst credential',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n sanitizeRef(ref),\n ],\n { input: secret },\n );\n if (result.code !== 0) {\n throw new Error(\n `Failed to store credential in Secret Service: ${result.stderr || result.stdout}`,\n );\n }\n },\n get: async (ref) => {\n const result = await runSecretTool([\n 'lookup',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n sanitizeRef(ref),\n ]);\n if (result.code !== 0) {\n return null;\n }\n return result.stdout.trim() || null;\n },\n delete: async (ref) => {\n const result = await runSecretTool([\n 'clear',\n LINUX_ATTR_APP,\n 'ghst',\n LINUX_ATTR_REF,\n sanitizeRef(ref),\n ]);\n if (result.code !== 0) {\n throw new Error(\n `Failed to delete credential from Secret Service: ${result.stderr || result.stdout}`,\n );\n }\n },\n };\n}\n\nfunction createWindowsAdapter(): CredentialStoreAdapter {\n const runPowerShell = async (\n script: string,\n env: NodeJS.ProcessEnv = process.env,\n ): Promise<CommandResult> => {\n return await runCommand(\n 'powershell',\n ['-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-Command', script],\n { env },\n );\n };\n\n const importModuleScript =\n \"$ErrorActionPreference='Stop'; Import-Module CredentialManager -ErrorAction Stop;\";\n\n return {\n isAvailable: async () => {\n try {\n const probe = await runPowerShell(\n '$module = Get-Module -ListAvailable -Name CredentialManager; if ($module) { exit 0 } else { exit 1 }',\n );\n return probe.code === 0;\n } catch {\n return false;\n }\n },\n set: async (ref, secret) => {\n const result = await runPowerShell(\n `${importModuleScript} $target=$env:GHST_CRED_TARGET; $secret=$env:GHST_CRED_SECRET; New-StoredCredential -Target $target -UserName 'ghst' -Password $secret -Persist LocalMachine | Out-Null`,\n {\n ...process.env,\n GHST_CRED_TARGET: toWindowsTarget(ref),\n GHST_CRED_SECRET: secret,\n },\n );\n if (result.code !== 0) {\n throw new Error(\n `Failed to store credential in Windows Credential Manager: ${result.stderr || result.stdout}`,\n );\n }\n },\n get: async (ref) => {\n const result = await runPowerShell(\n `${importModuleScript} $target=$env:GHST_CRED_TARGET; $cred = Get-StoredCredential -Target $target; if ($null -eq $cred) { exit 3 }; Write-Output $cred.Password`,\n {\n ...process.env,\n GHST_CRED_TARGET: toWindowsTarget(ref),\n },\n );\n if (result.code !== 0) {\n return null;\n }\n return result.stdout.trim() || null;\n },\n delete: async (ref) => {\n const result = await runPowerShell(\n `${importModuleScript} $target=$env:GHST_CRED_TARGET; $cred = Get-StoredCredential -Target $target; if ($null -eq $cred) { exit 0 }; Remove-StoredCredential -Target $target`,\n {\n ...process.env,\n GHST_CRED_TARGET: toWindowsTarget(ref),\n },\n );\n if (result.code !== 0) {\n throw new Error(\n `Failed to delete credential from Windows Credential Manager: ${result.stderr || result.stdout}`,\n );\n }\n },\n };\n}\n\nfunction createAdapterForPlatform(): CredentialStoreAdapter {\n if (process.platform === 'darwin') {\n return createMacOsAdapter();\n }\n\n if (process.platform === 'linux') {\n return createLinuxAdapter();\n }\n\n if (process.platform === 'win32') {\n return createWindowsAdapter();\n }\n\n return createUnavailableStore();\n}\n\nfunction createCredentialStoreFromAdapter(adapter: CredentialStoreAdapter): CredentialStore {\n return {\n isAvailable: async () => await adapter.isAvailable(),\n set: async (ref, secret) => {\n await adapter.set(ref, secret);\n },\n get: async (ref) => await adapter.get(ref),\n delete: async (ref) => {\n await adapter.delete(ref);\n },\n };\n}\n\nexport function credentialRefForAlias(alias: string): string {\n return `site:${sanitizeRef(alias)}`;\n}\n\nexport function setCredentialStoreForTests(store: CredentialStore | null): void {\n credentialStoreForTests = store;\n}\n\nexport function resetCredentialStoreCacheForTests(): void {\n cachedStore = null;\n}\n\nexport function getCredentialStore(): CredentialStore {\n if (credentialStoreForTests) {\n return credentialStoreForTests;\n }\n\n // Keep tests deterministic and avoid writing to real OS keychains unless explicitly mocked.\n if (process.env.VITEST) {\n if (!cachedStore) {\n cachedStore = createCredentialStoreFromAdapter(createUnavailableStore());\n }\n return cachedStore;\n }\n\n if (!cachedStore) {\n cachedStore = createCredentialStoreFromAdapter(createAdapterForPlatform());\n }\n\n return cachedStore;\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from './types.js';\n\nexport function getGlobalOptions(command: Command): GlobalOptions {\n const options = command.optsWithGlobals() as GlobalOptions;\n const noColorFromEnv = process.env.NO_COLOR === '1' || process.env.GHST_NO_COLOR === '1';\n\n return {\n json: options.json,\n jq: options.jq,\n site: options.site,\n url: options.url,\n staffToken: options.staffToken,\n debug: options.debug,\n color: options.color !== false && !noColorFromEnv,\n };\n}\n","import process from 'node:process';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { isStdoutTty } from './tty.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction applyJqSubset(data: unknown, jq?: string): unknown {\n if (!jq) {\n return data;\n }\n\n const rootArrayPattern = /^\\.\\[\\]\\.([a-zA-Z0-9_]+)$/;\n const nestedArrayPattern = /^\\.([a-zA-Z0-9_]+)\\[\\]\\.([a-zA-Z0-9_]+)$/;\n const singleFieldPattern = /^\\.([a-zA-Z0-9_]+)$/;\n\n const rootMatch = jq.match(rootArrayPattern);\n if (rootMatch) {\n const [, field = ''] = rootMatch;\n return Array.isArray(data)\n ? data.map((entry) => (entry as Record<string, unknown>)[field])\n : [];\n }\n\n const nestedMatch = jq.match(nestedArrayPattern);\n if (nestedMatch) {\n const [, collection = '', field = ''] = nestedMatch;\n const collectionValue = (data as Record<string, unknown>)[collection];\n return Array.isArray(collectionValue)\n ? collectionValue.map((entry) => (entry as Record<string, unknown>)[field])\n : [];\n }\n\n const singleMatch = jq.match(singleFieldPattern);\n if (singleMatch) {\n const [, field = ''] = singleMatch;\n return (data as Record<string, unknown>)[field];\n }\n\n throw new Error(`Unsupported --jq filter: ${jq}`);\n}\n\nexport function printJson(data: unknown, jq?: string): void {\n const filtered = applyJqSubset(data, jq);\n\n if (Array.isArray(filtered) && jq) {\n for (const entry of filtered) {\n console.log(JSON.stringify(entry));\n }\n return;\n }\n\n console.log(JSON.stringify(filtered, null, 2));\n}\n\nfunction formatStatus(status: string, useColor: boolean): string {\n if (!useColor) {\n return status;\n }\n\n if (status === 'published' || status === 'active') return chalk.green(status);\n if (status === 'draft') return chalk.yellow(status);\n if (status === 'scheduled') return chalk.blue(status);\n if (status === 'archived') return chalk.gray(status);\n return status;\n}\n\nfunction printRows(headers: string[], rows: string[][], useColor: boolean): void {\n if (!isStdoutTty()) {\n for (const row of rows) {\n console.log(row.join('\\t'));\n }\n return;\n }\n\n const table = new Table({\n head: headers,\n style: {\n head: useColor ? ['cyan'] : [],\n border: useColor ? ['gray'] : [],\n },\n wordWrap: true,\n });\n\n for (const row of rows) {\n table.push(row);\n }\n\n console.log(table.toString());\n}\n\nfunction printPagination(payload: Record<string, unknown>, label: string): void {\n const meta = payload.meta as Record<string, unknown> | undefined;\n const pagination = meta?.pagination as Record<string, unknown> | undefined;\n if (!pagination) {\n return;\n }\n\n console.log(\n `\\nShowing page ${pagination.page ?? '?'} of ${pagination.pages ?? '?'} (total ${pagination.total ?? '?'} ${label})`,\n );\n}\n\nfunction printSingleRecord(\n payload: Record<string, unknown>,\n key: string,\n fields: Array<{ label: string; field: string }>,\n): void {\n const entries = Array.isArray(payload[key]) ? payload[key] : [];\n const record = entries[0] as Record<string, unknown> | undefined;\n\n if (!record) {\n console.log('No record found.');\n return;\n }\n\n const lines = fields.map(({ label, field }) => `${label}: ${String(record[field] ?? '')}`);\n console.log(lines.join('\\n'));\n}\n\nfunction rowsFromCollection(\n payload: Record<string, unknown>,\n key: string,\n mapper: (record: Record<string, unknown>) => string[],\n): string[][] {\n const collection = Array.isArray(payload[key]) ? payload[key] : [];\n return collection.map((entry) => mapper((entry as Record<string, unknown>) ?? {}));\n}\n\nfunction formatOperationCount(value: unknown): string {\n return typeof value === 'number' ? String(value) : '0';\n}\n\nexport function printOperationStatsHuman(payload: Record<string, unknown>, label: string): void {\n const rootStats = (payload.meta as Record<string, unknown> | undefined)?.stats as\n | Record<string, unknown>\n | undefined;\n const bulkStats = (\n (payload.bulk as Record<string, unknown> | undefined)?.meta as\n | Record<string, unknown>\n | undefined\n )?.stats as Record<string, unknown> | undefined;\n\n const stats = rootStats ?? bulkStats;\n if (!stats) {\n console.log(label);\n return;\n }\n\n if (typeof stats.imported === 'number') {\n const invalidCount = Array.isArray(stats.invalid) ? stats.invalid.length : 0;\n console.log(`${label}: ${stats.imported} imported, ${invalidCount} invalid`);\n return;\n }\n\n const successful = formatOperationCount(stats.successful);\n const unsuccessful = formatOperationCount(stats.unsuccessful);\n console.log(`${label}: ${successful} successful, ${unsuccessful} unsuccessful`);\n}\n\nexport function printPostListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'posts', (record) => [\n String(record.id ?? ''),\n String(record.title ?? ''),\n formatStatus(String(record.status ?? 'unknown'), useColor),\n String(record.published_at ?? ''),\n ]);\n\n printRows(['ID', 'TITLE', 'STATUS', 'PUBLISHED'], rows, useColor);\n printPagination(payload, 'posts');\n}\n\nexport function printPageListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'pages', (record) => [\n String(record.id ?? ''),\n String(record.title ?? ''),\n formatStatus(String(record.status ?? 'unknown'), useColor),\n String(record.published_at ?? ''),\n ]);\n\n printRows(['ID', 'TITLE', 'STATUS', 'PUBLISHED'], rows, useColor);\n printPagination(payload, 'pages');\n}\n\nexport function printTagListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'tags', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n String(record.visibility ?? 'public'),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'VISIBILITY'], rows, useColor);\n printPagination(payload, 'tags');\n}\n\nexport function printMemberListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'members', (record) => [\n String(record.id ?? ''),\n String(record.email ?? ''),\n String(record.name ?? ''),\n formatStatus(String(record.status ?? 'free'), useColor),\n String(record.updated_at ?? ''),\n ]);\n\n printRows(['ID', 'EMAIL', 'NAME', 'STATUS', 'UPDATED'], rows, useColor);\n printPagination(payload, 'members');\n}\n\nexport function printNewsletterListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'newsletters', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n formatStatus(String(record.status ?? 'active'), useColor),\n String(record.visibility ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'STATUS', 'VISIBILITY'], rows, useColor);\n printPagination(payload, 'newsletters');\n}\n\nexport function printTierListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'tiers', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.type ?? ''),\n String(record.active ?? ''),\n String(record.monthly_price ?? ''),\n String(record.yearly_price ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'TYPE', 'ACTIVE', 'MONTHLY', 'YEARLY'], rows, useColor);\n printPagination(payload, 'tiers');\n}\n\nexport function printOfferListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'offers', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.code ?? ''),\n formatStatus(String(record.status ?? ''), useColor),\n String(record.type ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'CODE', 'STATUS', 'TYPE'], rows, useColor);\n printPagination(payload, 'offers');\n}\n\nexport function printLabelListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'labels', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n String(record.updated_at ?? ''),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'UPDATED'], rows, useColor);\n printPagination(payload, 'labels');\n}\n\nexport function printUserListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'users', (record) => [\n String(record.id ?? ''),\n String(record.name ?? ''),\n String(record.slug ?? ''),\n String(record.email ?? ''),\n formatStatus(String(record.status ?? ''), useColor),\n ]);\n\n printRows(['ID', 'NAME', 'SLUG', 'EMAIL', 'STATUS'], rows, useColor);\n printPagination(payload, 'users');\n}\n\nexport function printThemeListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'themes', (record) => [\n String(record.name ?? ''),\n String(record.active ?? ''),\n String(((record.package as Record<string, unknown> | undefined)?.version as string) ?? ''),\n ]);\n\n printRows(['NAME', 'ACTIVE', 'VERSION'], rows, useColor);\n}\n\nexport function printSettingListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'settings', (record) => [\n String(record.key ?? ''),\n String(record.value ?? ''),\n String(record.group ?? ''),\n ]);\n\n printRows(['KEY', 'VALUE', 'GROUP'], rows, useColor);\n}\n\nexport function printPostHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'posts', [\n { label: 'ID', field: 'id' },\n { label: 'Title', field: 'title' },\n { label: 'Slug', field: 'slug' },\n { label: 'Status', field: 'status' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printPageHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'pages', [\n { label: 'ID', field: 'id' },\n { label: 'Title', field: 'title' },\n { label: 'Slug', field: 'slug' },\n { label: 'Status', field: 'status' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printTagHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'tags', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Visibility', field: 'visibility' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printMemberHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'members', [\n { label: 'ID', field: 'id' },\n { label: 'Email', field: 'email' },\n { label: 'Name', field: 'name' },\n { label: 'Status', field: 'status' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printNewsletterHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'newsletters', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Status', field: 'status' },\n { label: 'Visibility', field: 'visibility' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printTierHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'tiers', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Type', field: 'type' },\n { label: 'Active', field: 'active' },\n { label: 'Monthly', field: 'monthly_price' },\n { label: 'Yearly', field: 'yearly_price' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printOfferHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'offers', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Code', field: 'code' },\n { label: 'Status', field: 'status' },\n { label: 'Type', field: 'type' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printLabelHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'labels', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printUserHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'users', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Slug', field: 'slug' },\n { label: 'Email', field: 'email' },\n { label: 'Status', field: 'status' },\n ]);\n}\n\nexport function printWebhookHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'webhooks', [\n { label: 'ID', field: 'id' },\n { label: 'Name', field: 'name' },\n { label: 'Event', field: 'event' },\n { label: 'Target URL', field: 'target_url' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printThemeHuman(payload: Record<string, unknown>): void {\n const themes = Array.isArray(payload.themes) ? payload.themes : [];\n const theme = (themes[0] as Record<string, unknown> | undefined) ?? payload;\n const pkg = (theme.package as Record<string, unknown> | undefined) ?? {};\n\n console.log(\n [\n `Name: ${String(theme.name ?? '')}`,\n `Active: ${String(theme.active ?? '')}`,\n `Version: ${String(pkg.version ?? '')}`,\n ].join('\\n'),\n );\n}\n\nexport function printSettingHuman(payload: Record<string, unknown>): void {\n printSingleRecord(payload, 'settings', [\n { label: 'Key', field: 'key' },\n { label: 'Value', field: 'value' },\n { label: 'Group', field: 'group' },\n { label: 'Updated', field: 'updated_at' },\n ]);\n}\n\nexport function printSiteHuman(payload: Record<string, unknown>): void {\n const site = ((payload.site as Record<string, unknown> | undefined) ?? payload) as Record<\n string,\n unknown\n >;\n const lines = [\n `Title: ${String(site.title ?? '')}`,\n `Description: ${String(site.description ?? '')}`,\n `URL: ${String(site.url ?? site.site_url ?? '')}`,\n `Version: ${String(site.version ?? '')}`,\n ];\n console.log(lines.join('\\n'));\n}\n\nexport function isJsonMode(global: GlobalOptions): boolean {\n return Boolean(global.json || process.env.GHST_OUTPUT === 'json');\n}\n","export function isForcedTty(env: NodeJS.ProcessEnv = process.env): boolean {\n return env.GHST_FORCE_TTY === '1';\n}\n\nexport function isStdoutTty(env: NodeJS.ProcessEnv = process.env): boolean {\n if (isForcedTty(env)) {\n return true;\n }\n\n return Boolean(process.stdout.isTTY);\n}\n\nexport function isStdinTty(env: NodeJS.ProcessEnv = process.env): boolean {\n if (isForcedTty(env)) {\n return true;\n }\n\n return Boolean(process.stdin.isTTY);\n}\n\nexport function isNonInteractive(env: NodeJS.ProcessEnv = process.env): boolean {\n return !isStdoutTty(env) || !isStdinTty(env);\n}\n","import { ExitCode, GhstError } from './errors.js';\n\nexport function parseCsv(value: string | undefined): string[] | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = value\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n\n return parsed.length > 0 ? parsed : undefined;\n}\n\nexport function parseBooleanFlag(value: unknown): boolean | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true' || normalized === '1' || normalized === 'yes') {\n return true;\n }\n\n if (normalized === 'false' || normalized === '0' || normalized === 'no') {\n return false;\n }\n }\n\n throw new GhstError(`Invalid boolean value: ${String(value)}`, {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n}\n\nexport function parseQueryPairs(entries: string[] | undefined): Record<string, string> {\n if (!entries || entries.length === 0) {\n return {};\n }\n\n return Object.fromEntries(\n entries.map((entry) => {\n const [key, ...rest] = entry.split('=');\n const parsedKey = key?.trim();\n if (!parsedKey) {\n throw new GhstError(`Invalid query pair: ${entry}`, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n return [parsedKey, rest.join('=').trim()];\n }),\n );\n}\n\nexport function parseInteger(value: string | undefined, label: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const parsed = Number(value);\n if (!Number.isInteger(parsed)) {\n throw new GhstError(`${label} must be an integer`, {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n\n return parsed;\n}\n","import { spawn } from 'node:child_process';\nimport readline from 'node:readline/promises';\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\nimport { generateStaffJwt, parseStaffAccessToken } from '../lib/auth.js';\nimport { GhostClient } from '../lib/client.js';\nimport {\n deriveSiteAlias,\n readUserConfig,\n resolveConnectionConfig,\n writeProjectConfig,\n writeUserConfig,\n} from '../lib/config.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { credentialRefForAlias, getCredentialStore } from '../lib/credentials.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\n\ntype PromptFn = (question: string) => Promise<string>;\ntype OpenUrlFn = (url: string) => Promise<void>;\n\nconst LOGIN_GUIDANCE_BORDER = '------------------------------------------------------------';\nconst LOGIN_GUIDANCE_TITLE = 'Continue In Ghost Admin';\nconst LOGIN_GUIDANCE_LINE =\n 'Copy the staff access token from your profile, then return here to continue.';\n\n/* c8 ignore start */\nasync function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const value = await rl.question(question);\n return value.trim();\n } finally {\n rl.close();\n }\n}\n\nfunction getBrowserOpenCommands(url: string): Array<{ command: string; args: string[] }> {\n if (process.platform === 'darwin') {\n return [{ command: 'open', args: [url] }];\n }\n\n if (process.platform === 'win32') {\n return [\n { command: 'cmd', args: ['/c', 'start', '', url] },\n {\n command: 'powershell',\n args: ['-NoProfile', '-NonInteractive', '-Command', `Start-Process '${url}'`],\n },\n ];\n }\n\n return [\n { command: 'xdg-open', args: [url] },\n { command: 'gio', args: ['open', url] },\n ];\n}\n\nasync function openExternalUrl(url: string): Promise<void> {\n const commands = getBrowserOpenCommands(url);\n let lastError: Error | null = null;\n\n for (const { command, args } of commands) {\n try {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { stdio: 'ignore' });\n child.once('error', reject);\n child.once('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(`Failed to open browser with '${command}' (exit ${code ?? 'unknown'})`));\n });\n });\n return;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (lastError) {\n throw lastError;\n }\n\n throw new Error('Failed to open browser: no launch command available.');\n}\n\nfunction formatOpenError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n\n try {\n return String(error);\n } catch {\n return 'unknown error';\n }\n}\n\nfunction printOpenWarning(adminUrl: string, useColor: boolean, reason: string): void {\n const warning = `Warning: could not open browser automatically. Open this URL manually: ${adminUrl}`;\n if (reason) {\n const message = `${warning}\\nReason: ${reason}`;\n console.error(useColor ? chalk.yellow(message) : message);\n return;\n }\n\n console.error(useColor ? chalk.yellow(warning) : warning);\n}\n\nasync function openGhostAdminForLogin(adminOrigin: string, useColor: boolean): Promise<void> {\n const staffSettingsUrl = getGhostStaffSettingsUrl(adminOrigin);\n const preflight = `Opening Ghost Admin in your browser: ${staffSettingsUrl}`;\n console.log('');\n console.log(useColor ? chalk.cyan(preflight) : preflight);\n console.log('');\n try {\n await openUrlFn(staffSettingsUrl);\n } catch (error) {\n const detail = formatOpenError(error);\n printOpenWarning(staffSettingsUrl, useColor, detail);\n }\n}\n/* c8 ignore stop */\n\nlet promptFn: PromptFn = prompt;\nlet openUrlFn: OpenUrlFn = openExternalUrl;\n\nexport function setPromptForTests(nextPrompt: PromptFn | null): void {\n promptFn = nextPrompt ?? prompt;\n}\n\nexport function setOpenUrlForTests(nextOpenUrl: OpenUrlFn | null): void {\n openUrlFn = nextOpenUrl ?? openExternalUrl;\n}\n\nfunction printLoginGuidance(useColor: boolean): void {\n console.log('');\n console.log(LOGIN_GUIDANCE_BORDER);\n console.log(LOGIN_GUIDANCE_TITLE);\n console.log(LOGIN_GUIDANCE_BORDER);\n console.log(\n useColor\n ? LOGIN_GUIDANCE_LINE.replace('staff access token', chalk.yellow('staff access token'))\n : LOGIN_GUIDANCE_LINE,\n );\n console.log('');\n}\n\nconst URL_PROTOCOL_PATTERN = /^[A-Za-z][A-Za-z\\d+.-]*:\\/\\//;\n\nfunction normalizeGhostUrl(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new GhstError('Ghost URL is required.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const candidate = URL_PROTOCOL_PATTERN.test(trimmed) ? trimmed : `https://${trimmed}`;\n\n let parsed: URL;\n try {\n parsed = new URL(candidate);\n } catch {\n throw new GhstError('Ghost URL must be valid (e.g. https://example.com).', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new GhstError('Ghost URL must use http:// or https://.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n return parsed.origin;\n}\n\nfunction getGhostAdminEntryUrl(url: string): string {\n const normalizedUrl = normalizeGhostUrl(url);\n return `${normalizedUrl}/ghost`;\n}\n\nfunction getGhostStaffSettingsUrl(url: string): string {\n const normalizedUrl = normalizeGhostUrl(url);\n return `${normalizedUrl}/ghost/#/settings/staff`;\n}\n\nasync function resolveGhostAdminOrigin(inputUrl: string): Promise<string> {\n const maxRedirects = 5;\n let probeUrl = getGhostAdminEntryUrl(inputUrl);\n\n for (let redirectCount = 0; redirectCount <= maxRedirects; redirectCount += 1) {\n let response: Response;\n try {\n response = await fetch(probeUrl, {\n method: 'GET',\n redirect: 'manual',\n });\n } catch (error) {\n throw new GhstError(\n `Unable to reach Ghost Admin URL '${probeUrl}': ${(error as Error).message}`,\n {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'NETWORK_ERROR',\n },\n );\n }\n\n const location = response.headers.get('location');\n const isRedirect = response.status >= 300 && response.status < 400;\n if (isRedirect && location) {\n probeUrl = new URL(location, probeUrl).toString();\n continue;\n }\n\n const finalUrl = response.url || probeUrl;\n return normalizeGhostUrl(finalUrl);\n }\n\n throw new GhstError(`Too many redirects while resolving Ghost Admin URL from '${inputUrl}'.`, {\n exitCode: ExitCode.GENERAL_ERROR,\n code: 'NETWORK_ERROR',\n });\n}\n\nasync function persistSiteCredential(\n alias: string,\n staffTokenInput: string,\n allowInsecureStorage: boolean,\n): Promise<{ credentialRef?: string; staffAccessToken?: string }> {\n const store = getCredentialStore();\n const available = await store.isAvailable().catch(() => false);\n\n if (available) {\n const credentialRef = credentialRefForAlias(alias);\n await store.set(credentialRef, staffTokenInput);\n return { credentialRef };\n }\n\n if (!allowInsecureStorage) {\n throw new GhstError(\n 'Secure credential storage is unavailable. Re-run with --insecure-storage to store credentials in config.json.',\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n\n return { staffAccessToken: staffTokenInput };\n}\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command('auth').description('Authentication management');\n\n auth\n .command('login')\n .description('Authenticate and store site credentials')\n .option('--url <url>', 'Ghost site URL')\n .option('--staff-token <token>', 'Staff access token in {id}:{secret} format')\n .option('--staff-token-env <name>', 'Read staff token from env var name')\n .option('--non-interactive', 'Disable prompts and require explicit credentials')\n .option(\n '--insecure-storage',\n 'Allow plaintext credential storage when secure storage is unavailable',\n )\n .option('--site <alias>', 'Optional site alias')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const nonInteractive = Boolean(options.nonInteractive);\n\n if (global.json && !nonInteractive) {\n throw new GhstError('Use --non-interactive when combining auth login with --json.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const envStaffTokenInput = options.staffTokenEnv\n ? process.env[options.staffTokenEnv]\n : undefined;\n let urlInput = options.url || global.url;\n let staffTokenInput = options.staffToken || global.staffToken || envStaffTokenInput;\n\n if (nonInteractive) {\n if (!urlInput || !staffTokenInput) {\n throw new GhstError(\n 'Non-interactive login requires both --url and --staff-token (or --staff-token-env).',\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n } else {\n urlInput = urlInput || (await promptFn('Ghost URL (e.g. https://example.com): '));\n }\n\n urlInput = normalizeGhostUrl(urlInput ?? '');\n urlInput = await resolveGhostAdminOrigin(urlInput);\n\n if (!nonInteractive) {\n printLoginGuidance(global.color !== false);\n await promptFn('Press Enter to Continue...');\n await openGhostAdminForLogin(urlInput, global.color !== false);\n if (!staffTokenInput) {\n staffTokenInput = await promptFn('Ghost Staff Access Token: ');\n }\n }\n\n parseStaffAccessToken(staffTokenInput);\n\n const client = new GhostClient({\n url: urlInput,\n staffToken: staffTokenInput,\n version: process.env.GHOST_API_VERSION ?? 'v6.0',\n });\n\n await client.siteInfo();\n\n const config = await readUserConfig();\n const alias = options.site ?? deriveSiteAlias(urlInput);\n const persisted = await persistSiteCredential(\n alias,\n staffTokenInput,\n Boolean(options.insecureStorage),\n );\n config.sites[alias] = {\n url: urlInput,\n ...(persisted.credentialRef ? { credentialRef: persisted.credentialRef } : {}),\n ...(persisted.staffAccessToken ? { staffAccessToken: persisted.staffAccessToken } : {}),\n apiVersion: process.env.GHOST_API_VERSION ?? 'v6.0',\n addedAt: new Date().toISOString(),\n };\n config.active = alias;\n await writeUserConfig(config);\n\n if (global.json) {\n console.log(\n JSON.stringify(\n {\n ok: true,\n site: alias,\n url: urlInput,\n active: config.active,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n const successMessage = 'Successfully authenticated with Ghost';\n console.log(global.color === false ? successMessage : chalk.green(successMessage));\n });\n\n auth\n .command('status')\n .description('Show configured authentication state')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const aliases = Object.keys(config.sites);\n\n if (global.json) {\n console.log(\n JSON.stringify(\n {\n active: config.active ?? null,\n sites: aliases,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (aliases.length === 0) {\n console.log('No configured sites. Run ghst auth login.');\n return;\n }\n\n console.log(`Active site: ${config.active ?? '(none)'}`);\n for (const [alias, site] of Object.entries(config.sites)) {\n const marker = config.active === alias ? '*' : ' ';\n console.log(`${marker} ${alias} -> ${site.url}`);\n }\n });\n\n auth\n .command('list')\n .description('List configured sites')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const aliases = Object.keys(config.sites);\n\n if (global.json) {\n console.log(JSON.stringify({ sites: aliases }, null, 2));\n return;\n }\n\n for (const alias of aliases) {\n console.log(alias);\n }\n });\n\n auth\n .command('switch [site]')\n .description('Switch active site alias (interactive if omitted)')\n .action(async (site: string | undefined) => {\n const config = await readUserConfig();\n const aliases = Object.keys(config.sites);\n\n if (aliases.length === 0) {\n throw new GhstError('No configured sites. Run ghst auth login first.', {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'AUTH_REQUIRED',\n });\n }\n\n let targetSite = site;\n if (!targetSite) {\n if (!process.stdin.isTTY) {\n throw new GhstError('Missing site argument. Run interactively or provide <site>.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n console.log('Configured sites:');\n for (const alias of aliases) {\n const marker = config.active === alias ? '*' : ' ';\n console.log(`${marker} ${alias}`);\n }\n\n targetSite = await promptFn('Switch to site alias: ');\n }\n\n if (!targetSite || !config.sites[targetSite]) {\n throw new GhstError(`Unknown site alias: ${targetSite ?? '(empty)'}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n config.active = targetSite;\n await writeUserConfig(config);\n console.log(`Active site set to '${targetSite}'.`);\n });\n\n auth\n .command('logout')\n .description('Remove credentials for one site or all sites')\n .option('--site <alias>', 'Specific site to remove')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const targetSite = options.site ?? global.site;\n const store = getCredentialStore();\n\n if (targetSite) {\n const site = config.sites[targetSite];\n if (!site) {\n throw new GhstError(`Unknown site alias: ${targetSite}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n if (site.credentialRef) {\n await store.delete(site.credentialRef).catch(() => undefined);\n }\n delete config.sites[targetSite];\n if (config.active === targetSite) {\n config.active = Object.keys(config.sites)[0];\n }\n await writeUserConfig(config);\n console.log(`Removed site '${targetSite}'.`);\n return;\n }\n\n for (const site of Object.values(config.sites)) {\n if (site.credentialRef) {\n await store.delete(site.credentialRef).catch(() => undefined);\n }\n }\n config.active = undefined;\n config.sites = {};\n await writeUserConfig(config);\n console.log('Removed all configured sites.');\n });\n\n auth\n .command('link')\n .description('Link current project directory to a configured site alias')\n .option('--site <alias>', 'Site alias to link')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const config = await readUserConfig();\n const siteAlias = options.site ?? global.site ?? config.active;\n\n if (!siteAlias || !config.sites[siteAlias]) {\n throw new GhstError('A valid configured site alias is required for linking.', {\n exitCode: ExitCode.AUTH_ERROR,\n code: 'SITE_REQUIRED',\n });\n }\n\n await writeProjectConfig({\n site: siteAlias,\n });\n\n console.log(`Linked current directory to '${siteAlias}'.`);\n });\n\n auth\n .command('token')\n .description('Print a short-lived staff JWT for the active connection')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const connection = await resolveConnectionConfig(global);\n const token = await generateStaffJwt(connection.staffToken);\n console.log(token);\n });\n}\n","import type { Command } from 'commander';\nimport { ExitCode, GhstError } from '../lib/errors.js';\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n\nfunction getTopLevelEntries(program: Command): string[] {\n const commandNames = program.commands\n .map((entry) => entry.name())\n .filter((name) => Boolean(name) && name !== 'help');\n const globalFlags = program.options.map((entry) => entry.long).filter(Boolean) as string[];\n\n return unique([...commandNames, 'help', ...globalFlags]);\n}\n\nfunction getBashCompletion(entries: string[]): string {\n return `# ghst bash completion\\n_ghst_complete() {\\n local cur prev\\n COMPREPLY=()\\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\\n COMPREPLY=( $(compgen -W \"${entries.join(' ')}\" -- \"$cur\") )\\n return 0\\n}\\ncomplete -F _ghst_complete ghst\\n`;\n}\n\nfunction getZshCompletion(entries: string[]): string {\n return `#compdef ghst\\n_arguments '*: :(${entries.join(' ')})'\\n`;\n}\n\nfunction getFishCompletion(entries: string[]): string {\n return entries\n .map((entry) => `complete -c ghst -f -a '${entry}'`)\n .join('\\n')\n .concat('\\n');\n}\n\nfunction getPowerShellCompletion(entries: string[]): string {\n return `Register-ArgumentCompleter -Native -CommandName ghst -ScriptBlock {\\n param($wordToComplete, $commandAst, $cursorPosition)\\n @(${entries.map((entry) => `'${entry}'`).join(', ')}) |\\n Where-Object { $_ -like \"$wordToComplete*\" } |\\n ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) }\\n}\\n`;\n}\n\nexport function registerCompletionCommands(program: Command): void {\n program\n .command('completion [shell]')\n .description('Print shell completion script')\n .action((shell: string | undefined) => {\n const entries = getTopLevelEntries(program);\n\n if (!shell) {\n console.log('Usage: ghst completion <bash|zsh|fish|powershell>');\n return;\n }\n\n if (shell === 'bash') {\n console.log(getBashCompletion(entries));\n return;\n }\n\n if (shell === 'zsh') {\n console.log(getZshCompletion(entries));\n return;\n }\n\n if (shell === 'fish') {\n console.log(getFishCompletion(entries));\n return;\n }\n\n if (shell === 'powershell') {\n console.log(getPowerShellCompletion(entries));\n return;\n }\n\n throw new GhstError(`Unsupported shell: ${shell}`, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n });\n}\n","import type { Command } from 'commander';\nimport { getUserConfigPath, readUserConfig, writeUserConfig } from '../lib/config.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { UserConfigSchema } from '../schemas/config.js';\n\nconst REDACTED = '<redacted>';\nconst SENSITIVE_KEY_PATTERN = /(key|token|secret|password)/i;\n\nfunction isSensitivePath(path: string): boolean {\n return path\n .split('.')\n .some(\n (segment) =>\n segment.toLowerCase() === 'staffaccesstoken' || SENSITIVE_KEY_PATTERN.test(segment),\n );\n}\n\nfunction redactValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => redactValue(entry));\n }\n\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n const output: Record<string, unknown> = {};\n for (const [key, entryValue] of Object.entries(value as Record<string, unknown>)) {\n if (key === 'staffAccessToken' || SENSITIVE_KEY_PATTERN.test(key)) {\n output[key] = REDACTED;\n continue;\n }\n output[key] = redactValue(entryValue);\n }\n\n return output;\n}\n\nfunction getByPath(source: Record<string, unknown>, keyPath: string): unknown {\n return keyPath.split('.').reduce<unknown>((acc, key) => {\n if (typeof acc !== 'object' || acc === null) {\n return undefined;\n }\n return (acc as Record<string, unknown>)[key];\n }, source);\n}\n\nfunction setByPath(target: Record<string, unknown>, keyPath: string, value: unknown): void {\n const parts = keyPath.split('.');\n const leaf = parts.pop();\n\n if (!leaf) {\n throw new GhstError('Invalid config path.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n let cursor: Record<string, unknown> = target;\n for (const part of parts) {\n const next = cursor[part];\n if (typeof next !== 'object' || next === null) {\n cursor[part] = {};\n }\n cursor = cursor[part] as Record<string, unknown>;\n }\n\n cursor[leaf] = value;\n}\n\nfunction parseConfigValue(\n configPath: string,\n rawValue: string,\n config: Record<string, unknown>,\n): unknown {\n if (configPath === 'defaults.limit') {\n const limit = Number(rawValue);\n if (!Number.isInteger(limit) || limit <= 0) {\n throw new GhstError('defaults.limit must be a positive integer.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n return limit;\n }\n\n if (configPath === 'defaults.format' || configPath === 'defaults.editor') {\n return rawValue;\n }\n\n if (configPath === 'active') {\n if (rawValue === 'none') {\n return undefined;\n }\n\n const sites = (config.sites as Record<string, unknown> | undefined) ?? {};\n if (!sites[rawValue]) {\n throw new GhstError(`Unknown site alias: ${rawValue}`, {\n code: 'SITE_NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n return rawValue;\n }\n\n throw new GhstError(`Unsupported config path: ${configPath}`, {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n}\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command('config').description('CLI configuration');\n\n config\n .command('show')\n .description('Show current user config')\n .option('--show-secrets', 'Display sensitive values in plaintext')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const userConfig = await readUserConfig();\n const payload = options.showSecrets ? userConfig : redactValue(userConfig);\n\n if (global.json) {\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n\n console.log(JSON.stringify(payload, null, 2));\n });\n\n config\n .command('path')\n .description('Print user config file path')\n .action(() => {\n console.log(getUserConfigPath());\n });\n\n config\n .command('list')\n .description('List configurable defaults')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const userConfig = await readUserConfig();\n const payload = {\n active: userConfig.active ?? null,\n defaults: userConfig.defaults ?? {},\n sites: Object.keys(userConfig.sites),\n };\n\n if (global.json) {\n console.log(JSON.stringify(payload, null, 2));\n return;\n }\n\n console.log(JSON.stringify(payload, null, 2));\n });\n\n config\n .command('get <path>')\n .description('Read a config value by dot path')\n .option('--show-secrets', 'Display sensitive values in plaintext')\n .action(async (path: string, options, command) => {\n const global = getGlobalOptions(command);\n const userConfig = await readUserConfig();\n let value = getByPath(userConfig as unknown as Record<string, unknown>, path);\n\n if (global.json) {\n if (!options.showSecrets && isSensitivePath(path)) {\n value = REDACTED;\n }\n console.log(JSON.stringify({ path, value: value ?? null }, null, 2));\n return;\n }\n\n if (value === undefined) {\n throw new GhstError(`Config value not found: ${path}`, {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n if (!options.showSecrets && isSensitivePath(path)) {\n value = REDACTED;\n }\n console.log(typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value));\n });\n\n config\n .command('set <path> <value>')\n .description('Set a config value by dot path')\n .action(async (path: string, value: string) => {\n const userConfig = await readUserConfig();\n const mutable = structuredClone(userConfig) as unknown as Record<string, unknown>;\n const parsedValue = parseConfigValue(path, value, mutable);\n\n setByPath(mutable, path, parsedValue);\n const validated = UserConfigSchema.parse(mutable);\n await writeUserConfig(validated);\n\n console.log(`Updated ${path}.`);\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nconst IMAGE_MIME_BY_EXT: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.avif': 'image/avif',\n};\n\nfunction inferImageMimeType(filePath: string): string {\n const extension = path.extname(filePath).toLowerCase();\n return IMAGE_MIME_BY_EXT[extension] ?? 'application/octet-stream';\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function uploadImage(\n global: GlobalOptions,\n options: {\n filePath: string;\n purpose?: string;\n ref?: string;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const bytes = await fs.readFile(options.filePath);\n const mimeType = inferImageMimeType(options.filePath);\n\n const formData = new FormData();\n formData.append('file', new Blob([bytes], { type: mimeType }), path.basename(options.filePath));\n\n if (options.purpose) {\n formData.append('purpose', options.purpose);\n }\n\n if (options.ref) {\n formData.append('ref', options.ref);\n }\n\n return client.images.upload(formData);\n}\n","import { z } from 'zod';\n\nexport const ImageUploadInputSchema = z.object({\n filePath: z.string().min(1),\n purpose: z.string().min(1).optional(),\n ref: z.string().min(1).optional(),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { uploadImage } from '../lib/images.js';\nimport { printJson } from '../lib/output.js';\nimport { ImageUploadInputSchema } from '../schemas/image.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerImageCommands(program: Command): void {\n const image = program.command('image').description('Image management');\n\n image\n .command('upload <filePath...>')\n .description('Upload one or more images')\n .option('--purpose <purpose>', 'Image purpose')\n .option('--ref <ref>', 'Reference value')\n .action(async (filePaths: string[], options, command) => {\n const global = getGlobalOptions(command);\n const results: Array<Record<string, unknown>> = [];\n\n for (const filePath of filePaths) {\n const parsed = ImageUploadInputSchema.safeParse({\n filePath,\n purpose: options.purpose,\n ref: options.ref,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await uploadImage(global, {\n filePath: parsed.data.filePath,\n purpose: parsed.data.purpose,\n ref: parsed.data.ref,\n });\n\n results.push(payload);\n }\n\n if (global.json) {\n printJson({ images: results }, global.jq);\n return;\n }\n\n for (const payload of results) {\n const images = Array.isArray(payload.images)\n ? (payload.images as Array<Record<string, unknown>>)\n : [];\n const first = images[0] ?? payload;\n console.log(String(first.url ?? first.path ?? 'Uploaded image'));\n }\n });\n}\n","import type { GhostPaginatedResponse } from './client.js';\n\ninterface PaginationMeta {\n page?: number;\n pages?: number;\n next?: number | null;\n prev?: number | null;\n limit?: number;\n total?: number;\n}\n\nfunction getPagination(payload: GhostPaginatedResponse): PaginationMeta {\n const meta = payload.meta as Record<string, unknown> | undefined;\n const pagination = meta?.pagination as PaginationMeta | undefined;\n return pagination ?? {};\n}\n\nexport async function collectAllPages(\n key: string,\n fetchPage: (page: number) => Promise<GhostPaginatedResponse>,\n): Promise<GhostPaginatedResponse> {\n const first = await fetchPage(1);\n const initial = Array.isArray(first[key]) ? [...(first[key] as unknown[])] : [];\n\n const firstPagination = getPagination(first);\n const pages = Number(firstPagination.pages ?? 1);\n\n for (let page = 2; page <= pages; page += 1) {\n const nextPayload = await fetchPage(page);\n const nextItems = Array.isArray(nextPayload[key]) ? (nextPayload[key] as unknown[]) : [];\n initial.push(...nextItems);\n }\n\n const mergedPagination: PaginationMeta = {\n ...firstPagination,\n page: 1,\n pages: 1,\n next: null,\n prev: null,\n total: initial.length,\n limit: initial.length,\n };\n\n const meta = {\n ...(typeof first.meta === 'object' && first.meta !== null ? first.meta : {}),\n pagination: mergedPagination,\n };\n\n return {\n ...first,\n [key]: initial,\n meta,\n };\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstLabel(payload: Record<string, unknown>): Record<string, unknown> {\n const labels = payload.labels;\n if (!Array.isArray(labels) || labels.length === 0) {\n throw new GhstError('Label not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (labels[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listLabels(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.labels.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('labels', (page) => client.labels.browse({ ...params, page, limit }));\n}\n\nexport async function getLabel(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.labels.read(idOrSlug, options);\n}\n\nexport async function createLabel(\n global: GlobalOptions,\n label: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.labels.add(label);\n}\n\nexport async function updateLabel(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n let id = options.id;\n if (!id && options.slug) {\n const payload = await client.labels.read(options.slug, { bySlug: true });\n const label = getFirstLabel(payload);\n id = String(label.id ?? '');\n }\n\n if (!id) {\n throw new GhstError('Provide an id argument or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n return client.labels.edit(id, options.patch);\n}\n\nexport async function deleteLabel(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.labels.delete(id);\n}\n\nfunction extractLabelIds(payload: GhostPaginatedResponse): string[] {\n const labels = Array.isArray(payload.labels) ? payload.labels : [];\n return labels\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nexport async function bulkLabels(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n name?: string;\n },\n): Promise<Record<string, unknown>> {\n const list = await listLabels(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const ids = extractLabelIds(list);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deleteLabel(global, id);\n } else {\n await updateLabel(global, {\n id,\n patch: {\n name: options.name,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import readline from 'node:readline/promises';\n\nexport type PromptHandler = (question: string) => Promise<string>;\n\n/* c8 ignore start */\nasync function defaultPrompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const value = await rl.question(question);\n return value.trim();\n } finally {\n rl.close();\n }\n}\n/* c8 ignore stop */\n\nlet promptHandler: PromptHandler = defaultPrompt;\n\nexport function setPromptHandlerForTests(nextPrompt: PromptHandler | null): void {\n promptHandler = nextPrompt ?? defaultPrompt;\n}\n\nexport async function ask(question: string): Promise<string> {\n return promptHandler(question);\n}\n\nexport async function confirm(question: string): Promise<boolean> {\n const value = (await ask(question)).trim().toLowerCase();\n return value === 'y' || value === 'yes';\n}\n","import { z } from 'zod';\n\nexport const LabelListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const LabelGetInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.slug), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.slug), {\n message: 'Use either id argument or --slug, not both.',\n path: ['id'],\n });\n\nexport const LabelCreateInputSchema = z.object({\n name: z.string().min(1),\n});\n\nexport const LabelUpdateInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slugLookup: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n })\n .refine((data) => Boolean(data.id || data.slugLookup), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.slugLookup), {\n message: 'Use either id argument or --slug, not both.',\n path: ['id'],\n })\n .refine((data) => Boolean(data.name), {\n message: 'Provide at least one update field.',\n });\n\nexport const LabelDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const LabelBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']),\n name: z.string().min(1).optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => data.action !== 'delete' || data.yes === true, {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n })\n .refine((data) => data.action !== 'update' || Boolean(data.name), {\n message: 'Bulk update requires --name.',\n path: ['name'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n bulkLabels,\n createLabel,\n deleteLabel,\n getLabel,\n listLabels,\n updateLabel,\n} from '../lib/labels.js';\nimport {\n printJson,\n printLabelHuman,\n printLabelListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n LabelBulkInputSchema,\n LabelCreateInputSchema,\n LabelDeleteInputSchema,\n LabelGetInputSchema,\n LabelListInputSchema,\n LabelUpdateInputSchema,\n} from '../schemas/label.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerLabelCommands(program: Command): void {\n const label = program.command('label').description('Label management');\n\n label\n .command('list')\n .description('List labels')\n .option('--limit <numberOrAll>', 'Number of labels per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = LabelListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listLabels(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelListHuman(payload, global.color !== false);\n });\n\n label\n .command('get [id]')\n .description('Get a label by id or slug')\n .option('--slug <slug>', 'Label slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = LabelGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const payload = await getLabel(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelHuman(payload);\n });\n\n label\n .command('create')\n .description('Create a label')\n .requiredOption('--name <name>', 'Label name')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelCreateInputSchema.safeParse({\n name: options.name,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createLabel(global, {\n name: parsed.data.name,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelHuman(payload);\n });\n\n label\n .command('update [id]')\n .description('Update a label by id or slug')\n .option('--slug <slug>', 'Label slug lookup')\n .requiredOption('--name <name>', 'Label name')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelUpdateInputSchema.safeParse({\n id,\n slugLookup: options.slug,\n name: options.name,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateLabel(global, {\n id: parsed.data.id,\n slug: parsed.data.slugLookup,\n patch: {\n name: parsed.data.name,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printLabelHuman(payload);\n });\n\n label\n .command('delete <id>')\n .description('Delete a label')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete label '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteLabel(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted label '${parsed.data.id}'.`);\n });\n\n label\n .command('bulk')\n .description('Run bulk label operations')\n .requiredOption('--filter <nql>', 'NQL filter to select labels')\n .requiredOption('--action <action>', 'update|delete')\n .option('--name <name>', 'Label name for update action')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = LabelBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n name: options.name,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkLabels(global, {\n filter: parsed.data.filter,\n delete: parsed.data.action === 'delete',\n name: parsed.data.name,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk label operation completed');\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { GlobalOptions } from '../lib/types.js';\nimport { type McpToolGroup, registerCoreTools } from './tools/core.js';\n\nexport function createGhostMcpServer(\n global: GlobalOptions,\n options: {\n enabledGroups: Set<McpToolGroup>;\n },\n): McpServer {\n const server = new McpServer({\n name: 'ghst',\n version: '0.4.0',\n });\n\n registerCoreTools(server, global, options.enabledGroups);\n return server;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { GhostClient } from '../../lib/client.js';\nimport { resolveConnectionConfig } from '../../lib/config.js';\nimport { uploadImage } from '../../lib/images.js';\nimport {\n createMember,\n deleteMember,\n getMember,\n importMembersCsv,\n listMembers,\n updateMember,\n} from '../../lib/members.js';\nimport { listNewsletters } from '../../lib/newsletters.js';\nimport { listOffers } from '../../lib/offers.js';\nimport { createPage, deletePage, getPage, listPages, updatePage } from '../../lib/pages.js';\nimport { parseCsv } from '../../lib/parse.js';\nimport {\n createPost,\n deletePost,\n getPost,\n listPosts,\n publishPost,\n updatePost,\n} from '../../lib/posts.js';\nimport { getSetting, listSettings, setSetting } from '../../lib/settings.js';\nimport { getSiteInfo } from '../../lib/site.js';\nimport { createTag, deleteTag, getTag, listTags, updateTag } from '../../lib/tags.js';\nimport { activateTheme, uploadTheme } from '../../lib/themes.js';\nimport { listTiers } from '../../lib/tiers.js';\nimport type { GlobalOptions } from '../../lib/types.js';\nimport { listUsers } from '../../lib/users.js';\nimport { createWebhook } from '../../lib/webhooks.js';\n\nexport type McpToolGroup =\n | 'posts'\n | 'pages'\n | 'tags'\n | 'members'\n | 'site'\n | 'settings'\n | 'users'\n | 'api'\n | 'search';\n\nexport const MCP_TOOL_GROUPS: readonly McpToolGroup[] = [\n 'posts',\n 'pages',\n 'tags',\n 'members',\n 'site',\n 'settings',\n 'users',\n 'api',\n 'search',\n] as const;\n\nfunction toolResult(data: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: Record<string, unknown>;\n} {\n let structuredContent: Record<string, unknown>;\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n structuredContent = data as Record<string, unknown>;\n } else if (Array.isArray(data)) {\n structuredContent = { items: data };\n } else {\n structuredContent = { value: data };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(data, null, 2),\n },\n ],\n structuredContent,\n };\n}\n\nfunction escapeNqlValue(value: string): string {\n return value.replace(/'/g, \"\\\\'\");\n}\n\nasync function runSearch(\n global: GlobalOptions,\n query: string,\n limit: number,\n): Promise<Record<string, unknown>> {\n const escaped = escapeNqlValue(query);\n const filter = `title:~'${escaped}'`;\n\n const [posts, pages, tags, members] = await Promise.all([\n listPosts(global, { filter, limit }, false),\n listPages(global, { filter, limit }, false),\n listTags(global, { filter: `name:~'${escaped}'`, limit }, false),\n listMembers(global, { filter: `email:~'${escaped}',name:~'${escaped}'`, limit }, false),\n ]);\n\n return {\n query,\n posts: Array.isArray(posts.posts) ? posts.posts : [],\n pages: Array.isArray(pages.pages) ? pages.pages : [],\n tags: Array.isArray(tags.tags) ? tags.tags : [],\n members: Array.isArray(members.members) ? members.members : [],\n };\n}\n\nasync function callApi(\n global: GlobalOptions,\n options: {\n path: string;\n method?: string;\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n contentApi?: boolean;\n },\n): Promise<Record<string, unknown>> {\n const connection = await resolveConnectionConfig(global);\n const client = new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n contentKey: process.env.GHOST_CONTENT_API_KEY,\n });\n\n const payload = await client.rawRequest<Record<string, unknown>>(\n options.path,\n options.method ?? 'GET',\n options.body,\n options.params,\n {\n api: options.contentApi ? 'content' : 'admin',\n },\n );\n\n return payload;\n}\n\nexport function registerCoreTools(\n server: McpServer,\n global: GlobalOptions,\n enabledGroups: Set<McpToolGroup>,\n): void {\n if (enabledGroups.has('posts')) {\n server.registerTool(\n 'ghost_post_list',\n {\n description: 'List Ghost posts.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await listPosts(global, { ...args }, false);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_get',\n {\n description: 'Get a Ghost post by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await getPost(global, args.slug ?? args.id ?? '', {\n bySlug: Boolean(args.slug),\n params: {\n include: args.include,\n },\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_create',\n {\n description: 'Create a Ghost post.',\n inputSchema: z.object({\n title: z.string(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n tags: z.array(z.string()).optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await createPost(\n global,\n {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n tags: args.tags,\n visibility: args.visibility,\n },\n args.html ? 'html' : undefined,\n );\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_update',\n {\n description: 'Update a Ghost post by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n title: z.string().optional(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n tags: z.array(z.string()).optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await updatePost(global, {\n id: args.id,\n slug: args.slug,\n patch: {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n tags: args.tags,\n visibility: args.visibility,\n },\n source: args.html ? 'html' : undefined,\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_delete',\n {\n description: 'Delete a Ghost post.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => {\n const payload = await deletePost(global, args.id);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_post_publish',\n {\n description: 'Publish a Ghost post.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => {\n const payload = await publishPost(global, args.id);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_image_upload',\n {\n description: 'Upload an image and return the uploaded image payload.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n purpose: z.string().optional(),\n ref: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await uploadImage(global, {\n filePath: args.file_path,\n purpose: args.purpose,\n ref: args.ref,\n }),\n ),\n );\n }\n\n if (enabledGroups.has('pages')) {\n server.registerTool(\n 'ghost_page_list',\n {\n description: 'List Ghost pages.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await listPages(global, { ...args }, false);\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_get',\n {\n description: 'Get a Ghost page by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n include: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await getPage(global, args.slug ?? args.id ?? '', {\n bySlug: Boolean(args.slug),\n params: {\n include: args.include,\n },\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_create',\n {\n description: 'Create a Ghost page.',\n inputSchema: z.object({\n title: z.string(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await createPage(\n global,\n {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n visibility: args.visibility,\n },\n args.html ? 'html' : undefined,\n );\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_update',\n {\n description: 'Update a Ghost page by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n title: z.string().optional(),\n html: z.string().optional(),\n status: z.enum(['draft', 'published', 'scheduled']).optional(),\n publish_at: z.string().datetime().optional(),\n visibility: z.enum(['public', 'members', 'paid', 'tiers']).optional(),\n }),\n },\n async (args) => {\n const payload = await updatePage(global, {\n id: args.id,\n slug: args.slug,\n patch: {\n title: args.title,\n html: args.html,\n status: args.status,\n published_at: args.publish_at,\n visibility: args.visibility,\n },\n source: args.html ? 'html' : undefined,\n });\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_page_delete',\n {\n description: 'Delete a Ghost page.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => {\n const payload = await deletePage(global, args.id);\n return toolResult(payload);\n },\n );\n }\n\n if (enabledGroups.has('tags')) {\n server.registerTool(\n 'ghost_tag_list',\n {\n description: 'List Ghost tags.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listTags(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_tag_get',\n {\n description: 'Get a Ghost tag by id or slug.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getTag(global, args.slug ?? args.id ?? '', {\n bySlug: Boolean(args.slug),\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_tag_create',\n {\n description: 'Create a Ghost tag.',\n inputSchema: z.object({\n name: z.string(),\n slug: z.string().optional(),\n description: z.string().optional(),\n }),\n },\n async (args) => toolResult(await createTag(global, args)),\n );\n\n server.registerTool(\n 'ghost_tag_update',\n {\n description: 'Update a Ghost tag.',\n inputSchema: z.object({\n id: z.string().optional(),\n slug: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await updateTag(global, {\n id: args.id,\n slug: args.slug,\n patch: {\n name: args.name,\n description: args.description,\n },\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_tag_delete',\n {\n description: 'Delete a Ghost tag.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => toolResult(await deleteTag(global, args.id)),\n );\n }\n\n if (enabledGroups.has('members')) {\n server.registerTool(\n 'ghost_member_list',\n {\n description: 'List Ghost members.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n search: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listMembers(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_member_get',\n {\n description: 'Get Ghost member by id or email.',\n inputSchema: z.object({\n id: z.string().optional(),\n email: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getMember(global, {\n id: args.id,\n email: args.email,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_member_create',\n {\n description: 'Create Ghost member.',\n inputSchema: z.object({\n email: z.string(),\n name: z.string().optional(),\n labels: z.array(z.string()).optional(),\n newsletters: z.array(z.string()).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await createMember(global, {\n email: args.email,\n name: args.name,\n labels: args.labels,\n newsletters: args.newsletters,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_member_update',\n {\n description: 'Update Ghost member.',\n inputSchema: z.object({\n id: z.string().optional(),\n email: z.string().optional(),\n name: z.string().optional(),\n note: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await updateMember(global, {\n id: args.id,\n email: args.email,\n patch: {\n name: args.name,\n note: args.note,\n },\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_member_delete',\n {\n description: 'Delete Ghost member.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => toolResult(await deleteMember(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_member_import',\n {\n description: 'Import members from a CSV file path.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n labels: z.array(z.string()).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await importMembersCsv(global, {\n filePath: args.file_path,\n labels: args.labels,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_newsletter_list',\n {\n description: 'List Ghost newsletters.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listNewsletters(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_tier_list',\n {\n description: 'List Ghost tiers.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listTiers(global, { ...args }, false)),\n );\n\n server.registerTool(\n 'ghost_offer_list',\n {\n description: 'List Ghost offers.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n }),\n },\n async (args) => toolResult(await listOffers(global, { ...args }, false)),\n );\n }\n\n if (enabledGroups.has('site')) {\n server.registerTool(\n 'ghost_site_info',\n {\n description: 'Get Ghost site metadata.',\n },\n async () => toolResult(await getSiteInfo(global)),\n );\n\n server.registerTool(\n 'ghost_theme_upload',\n {\n description: 'Upload a Ghost theme zip path and optionally activate it.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n activate: z.boolean().optional(),\n }),\n },\n async (args) => {\n const payload = await uploadTheme(global, args.file_path);\n if (args.activate) {\n const themes = Array.isArray(payload.themes) ? payload.themes : [];\n const first = (themes[0] as Record<string, unknown> | undefined) ?? payload;\n const name = String(first.name ?? '').trim();\n if (name) {\n await activateTheme(global, name);\n }\n }\n\n return toolResult(payload);\n },\n );\n\n server.registerTool(\n 'ghost_webhook_create',\n {\n description: 'Create a Ghost webhook.',\n inputSchema: z.object({\n event: z.string().min(1),\n target_url: z.string().url(),\n name: z.string().optional(),\n secret: z.string().optional(),\n api_version: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await createWebhook(global, {\n event: args.event,\n target_url: args.target_url,\n name: args.name,\n secret: args.secret,\n api_version: args.api_version,\n }),\n ),\n );\n }\n\n if (enabledGroups.has('settings')) {\n server.registerTool(\n 'ghost_setting_list',\n {\n description: 'List Ghost settings.',\n },\n async () => toolResult(await listSettings(global)),\n );\n\n server.registerTool(\n 'ghost_setting_get',\n {\n description: 'Get a Ghost setting by key.',\n inputSchema: z.object({\n key: z.string(),\n }),\n },\n async (args) => toolResult(await getSetting(global, args.key)),\n );\n\n server.registerTool(\n 'ghost_setting_set',\n {\n description: 'Set a Ghost setting by key.',\n inputSchema: z.object({\n key: z.string(),\n value: z.union([z.string(), z.number(), z.boolean(), z.null()]),\n }),\n },\n async (args) => toolResult(await setSetting(global, args.key, args.value)),\n );\n }\n\n if (enabledGroups.has('users')) {\n server.registerTool(\n 'ghost_user_list',\n {\n description: 'List Ghost staff users.',\n inputSchema: z.object({\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n }),\n },\n async (args) => toolResult(await listUsers(global, { ...args }, false)),\n );\n }\n\n if (enabledGroups.has('api')) {\n server.registerTool(\n 'ghost_api_request',\n {\n description: 'Run a raw Ghost API request.',\n inputSchema: z.object({\n path: z.string(),\n method: z.string().optional(),\n body: z.unknown().optional(),\n params: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n content_api: z.boolean().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await callApi(global, {\n path: args.path,\n method: args.method,\n body: args.body,\n params: args.params as\n | Record<string, string | number | boolean | undefined>\n | undefined,\n contentApi: args.content_api,\n }),\n ),\n );\n }\n\n if (enabledGroups.has('search')) {\n server.registerTool(\n 'ghost_search',\n {\n description: 'Search posts, pages, tags and members.',\n inputSchema: z.object({\n query: z.string().min(1),\n limit: z.number().int().positive().max(50).optional(),\n }),\n },\n async (args) => toolResult(await runSearch(global, args.query, args.limit ?? 10)),\n );\n }\n}\n\nexport function parseToolGroups(toolsArg: string | undefined): Set<McpToolGroup> {\n if (toolsArg === undefined || toolsArg === 'all') {\n return new Set(MCP_TOOL_GROUPS);\n }\n\n const requested = parseCsv(toolsArg) ?? [];\n if (requested.length === 0) {\n return new Set();\n }\n\n const result = new Set<McpToolGroup>();\n for (const value of requested) {\n if ((MCP_TOOL_GROUPS as readonly string[]).includes(value)) {\n result.add(value as McpToolGroup);\n }\n }\n\n return result;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstMember(payload: Record<string, unknown>): Record<string, unknown> {\n const members = payload.members;\n if (!Array.isArray(members) || members.length === 0) {\n throw new GhstError('Member not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (members[0] as Record<string, unknown>) ?? {};\n}\n\nfunction emailFilter(email: string): string {\n const escaped = email.replace(/'/g, \"\\\\'\");\n return `email:'${escaped}'`;\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listMembers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.members.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('members', (page) => client.members.browse({ ...params, page, limit }));\n}\n\nexport async function getMember(\n global: GlobalOptions,\n options: {\n id?: string;\n email?: string;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n if (options.id) {\n return client.members.read(options.id, options.params);\n }\n\n if (options.email) {\n const payload = await client.members.browse({\n ...options.params,\n filter: emailFilter(options.email),\n limit: 1,\n });\n getFirstMember(payload);\n return payload;\n }\n\n throw new GhstError('Provide an id argument or --email.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n}\n\nexport async function createMember(\n global: GlobalOptions,\n member: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.members.add(member, params);\n}\n\nexport async function updateMember(\n global: GlobalOptions,\n options: {\n id?: string;\n email?: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n let id = options.id;\n if (!id && options.email) {\n const payload = await client.members.browse({\n filter: emailFilter(options.email),\n limit: 1,\n });\n const existing = getFirstMember(payload);\n id = String(existing.id ?? '');\n }\n\n if (!id) {\n throw new GhstError('Provide an id argument or --email.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n return client.members.edit(id, options.patch);\n}\n\nexport async function deleteMember(\n global: GlobalOptions,\n id: string,\n options?: {\n cancel?: boolean;\n },\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n\n const params = options?.cancel ? { cancel: true } : undefined;\n return client.members.delete(id, params);\n}\n\nexport async function exportMembersCsv(\n global: GlobalOptions,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<string> {\n const client = await getClient(global);\n return client.members.exportCsv(params);\n}\n\nexport async function importMembersCsv(\n global: GlobalOptions,\n options: {\n filePath: string;\n labels?: string[];\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n const bytes = await fs.readFile(options.filePath);\n const formData = new FormData();\n const fileBlob = new Blob([bytes], { type: 'text/csv' });\n formData.append('membersfile', fileBlob, path.basename(options.filePath));\n\n if (options.labels && options.labels.length > 0) {\n formData.append(\n 'labels',\n JSON.stringify(options.labels.map((name) => ({ name: name.trim() })).filter((l) => l.name)),\n );\n }\n\n return client.members.importCsv(formData);\n}\n\nexport async function bulkMembers(\n global: GlobalOptions,\n options: {\n action: 'unsubscribe' | 'add-label' | 'remove-label' | 'delete' | 'update-labels';\n all?: boolean;\n filter?: string;\n search?: string;\n labelId?: string;\n labels?: string[];\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n const params: Record<string, string | number | boolean | undefined> = {\n all: options.all,\n filter: options.filter,\n search: options.search,\n };\n\n if (options.action === 'update-labels') {\n const list = await listMembers(\n global,\n {\n filter: options.filter,\n search: options.search,\n limit: 100,\n },\n true,\n );\n\n const members = Array.isArray(list.members) ? list.members : [];\n const ids = members\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n const labels = (options.labels ?? [])\n .map((name) => name.trim())\n .filter(Boolean)\n .map((name) => ({ name }));\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await client.members.edit(id, {\n labels,\n });\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n }\n\n if (options.action === 'delete') {\n return client.members.bulkDestroy(params);\n }\n\n let action: 'unsubscribe' | 'addLabel' | 'removeLabel' = 'unsubscribe';\n if (options.action === 'add-label') {\n action = 'addLabel';\n } else if (options.action === 'remove-label') {\n action = 'removeLabel';\n }\n\n const bulk: Record<string, unknown> = { action };\n if ((action === 'addLabel' || action === 'removeLabel') && options.labelId) {\n bulk.meta = {\n label: {\n id: options.labelId,\n },\n };\n }\n\n return client.members.bulkEdit(bulk, params);\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listNewsletters(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.newsletters.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('newsletters', (page) =>\n client.newsletters.browse({ ...params, page, limit }),\n );\n}\n\nexport async function getNewsletter(\n global: GlobalOptions,\n id: string,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.newsletters.read(id, params);\n}\n\nexport async function createNewsletter(\n global: GlobalOptions,\n newsletter: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.newsletters.add(newsletter, params);\n}\n\nexport async function updateNewsletter(\n global: GlobalOptions,\n id: string,\n patch: Record<string, unknown>,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.newsletters.edit(id, patch, params);\n}\n\nexport async function bulkNewsletters(\n global: GlobalOptions,\n options: {\n filter: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const list = await listNewsletters(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const newsletters = Array.isArray(list.newsletters) ? list.newsletters : [];\n const ids = newsletters\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await updateNewsletter(global, id, options.patch);\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listOffers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.offers.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('offers', (page) => client.offers.browse({ ...params, page, limit }));\n}\n\nexport async function getOffer(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.offers.read(id);\n}\n\nexport async function createOffer(\n global: GlobalOptions,\n offer: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.offers.add(offer);\n}\n\nexport async function updateOffer(\n global: GlobalOptions,\n id: string,\n patch: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.offers.edit(id, patch);\n}\n\nexport async function bulkOffers(\n global: GlobalOptions,\n options: {\n filter: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const list = await listOffers(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const offers = Array.isArray(list.offers) ? list.offers : [];\n const ids = offers\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await updateOffer(global, id, options.patch);\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstPage(payload: Record<string, unknown>): Record<string, unknown> {\n const pages = payload.pages;\n if (!Array.isArray(pages) || pages.length === 0) {\n throw new GhstError('Page not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (pages[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listPages(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.pages.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('pages', (page) => client.pages.browse({ ...params, page, limit }));\n}\n\nexport async function getPage(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.pages.read(idOrSlug, options);\n}\n\nexport async function createPage(\n global: GlobalOptions,\n page: Record<string, unknown>,\n source?: 'html',\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.pages.add(page, source);\n}\n\nexport async function updatePage(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n source?: 'html';\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const lookup = options.slug ?? options.id;\n\n if (!lookup) {\n throw new GhstError('Provide an id or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const bySlug = Boolean(options.slug);\n const existingPayload = await client.pages.read(lookup, { bySlug });\n const existing = getFirstPage(existingPayload);\n\n const id = String(existing.id ?? '');\n const updatedAt = existing.updated_at;\n\n if (!id || typeof updatedAt !== 'string') {\n throw new GhstError('Page is missing required id/updated_at for update.', {\n code: 'CONFLICT',\n exitCode: ExitCode.CONFLICT,\n });\n }\n\n return client.pages.edit(\n id,\n {\n ...options.patch,\n updated_at: updatedAt,\n },\n options.source,\n );\n}\n\nexport async function deletePage(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.pages.delete(id);\n}\n\nexport async function copyPage(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.pages.copy(id);\n}\n\nfunction extractPageIds(payload: GhostPaginatedResponse): string[] {\n const pages = Array.isArray(payload.pages) ? payload.pages : [];\n return pages\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nexport async function bulkPages(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n status?: 'draft' | 'published' | 'scheduled';\n },\n): Promise<Record<string, unknown>> {\n const list = await listPages(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const ids = extractPageIds(list);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deletePage(global, id);\n } else {\n await updatePage(global, {\n id,\n patch: {\n status: options.status,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostApiError, GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstPost(payload: Record<string, unknown>): Record<string, unknown> {\n const posts = payload.posts;\n if (!Array.isArray(posts) || posts.length === 0) {\n throw new GhstError('Post not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (posts[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listPosts(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.posts.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('posts', (page) => client.posts.browse({ ...params, page, limit }));\n}\n\nexport async function getPost(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.posts.read(idOrSlug, options);\n}\n\nexport async function createPost(\n global: GlobalOptions,\n post: Record<string, unknown>,\n source?: 'html',\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.posts.add(post, source);\n}\n\nexport async function updatePost(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n source?: 'html';\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const lookup = options.slug ?? options.id;\n\n if (!lookup) {\n throw new GhstError('Provide an id or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const bySlug = Boolean(options.slug);\n\n const applyUpdate = async (): Promise<Record<string, unknown>> => {\n const existingPayload = await client.posts.read(lookup, { bySlug });\n const existing = getFirstPost(existingPayload);\n const id = String(existing.id ?? '');\n const updatedAt = existing.updated_at;\n\n if (!id || typeof updatedAt !== 'string') {\n throw new GhstError('Post is missing required id/updated_at for update.', {\n code: 'CONFLICT',\n exitCode: ExitCode.CONFLICT,\n });\n }\n\n return client.posts.edit(\n id,\n {\n ...options.patch,\n updated_at: updatedAt,\n },\n options.source,\n );\n };\n\n try {\n return await applyUpdate();\n } catch (error) {\n if (error instanceof GhostApiError && error.status === 409) {\n return applyUpdate();\n }\n\n throw error;\n }\n}\n\nexport async function deletePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.posts.delete(id);\n}\n\nexport async function publishPost(\n global: GlobalOptions,\n id: string,\n options?: {\n newsletter?: string;\n email_only?: boolean;\n email_segment?: string;\n },\n): Promise<Record<string, unknown>> {\n return updatePost(global, {\n id,\n patch: {\n status: 'published',\n newsletter: options?.newsletter,\n email_only: options?.email_only,\n email_segment: options?.email_segment,\n },\n });\n}\n\nexport async function schedulePost(\n global: GlobalOptions,\n id: string,\n at: string,\n): Promise<Record<string, unknown>> {\n return updatePost(global, {\n id,\n patch: {\n status: 'scheduled',\n published_at: at,\n },\n });\n}\n\nexport async function unschedulePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n return updatePost(global, {\n id,\n patch: {\n status: 'draft',\n published_at: null,\n },\n });\n}\n\nexport async function copyPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.posts.copy(id);\n}\n\nfunction extractPostIds(payload: GhostPaginatedResponse): string[] {\n const posts = Array.isArray(payload.posts) ? payload.posts : [];\n return posts\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nfunction extractPostEntries(payload: GhostPaginatedResponse): Array<Record<string, unknown>> {\n return Array.isArray(payload.posts)\n ? payload.posts.map((entry) => (entry as Record<string, unknown>) ?? {})\n : [];\n}\n\nexport async function bulkPosts(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n status?: 'draft' | 'published' | 'scheduled';\n tags?: string[];\n addTags?: string[];\n authors?: string[];\n },\n): Promise<Record<string, unknown>> {\n const list = await listPosts(\n global,\n {\n filter: options.filter,\n limit: 100,\n include: 'tags,authors',\n },\n true,\n );\n const ids = extractPostIds(list);\n const posts = extractPostEntries(list);\n const postsById = new Map<string, Record<string, unknown>>(\n posts.map((post) => [String(post.id ?? ''), post]),\n );\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deletePost(global, id);\n } else {\n const current = postsById.get(id) ?? {};\n const existingTagNames = Array.isArray(current.tags)\n ? current.tags\n .map((tag) => String((tag as Record<string, unknown>)?.name ?? '').trim())\n .filter(Boolean)\n : [];\n\n let mergedTags: string[] | undefined;\n if (options.addTags && options.addTags.length > 0) {\n const base = options.tags && options.tags.length > 0 ? options.tags : existingTagNames;\n mergedTags = Array.from(new Set([...base, ...options.addTags]));\n }\n\n await updatePost(global, {\n id,\n patch: {\n status: options.status,\n tags: mergedTags ?? options.tags,\n authors: options.authors,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostApiError, GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listSettings(global: GlobalOptions): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.settings.browse();\n}\n\nexport async function getSetting(\n global: GlobalOptions,\n key: string,\n): Promise<Record<string, unknown>> {\n const payload = await listSettings(global);\n const settings = Array.isArray(payload.settings)\n ? (payload.settings as Array<Record<string, unknown>>)\n : [];\n\n const target = settings.find((setting) => String(setting.key ?? '') === key);\n if (!target) {\n throw new GhstError(`Setting not found: ${key}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return {\n settings: [target],\n };\n}\n\nexport async function setSetting(\n global: GlobalOptions,\n key: string,\n value: unknown,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n try {\n return await client.settings.edit([{ key, value }]);\n } catch (error) {\n if (error instanceof GhostApiError && error.status === 403) {\n throw new GhstError(\n 'Settings update is forbidden for this token. Use a staff/user session with settings permissions.',\n {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n status: 403,\n details: error.payload,\n },\n );\n }\n\n throw error;\n }\n}\n","import { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function getSiteInfo(global: GlobalOptions): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.siteInfo();\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nfunction getFirstTag(payload: Record<string, unknown>): Record<string, unknown> {\n const tags = payload.tags;\n if (!Array.isArray(tags) || tags.length === 0) {\n throw new GhstError('Tag not found', {\n exitCode: ExitCode.NOT_FOUND,\n code: 'NOT_FOUND',\n });\n }\n\n return (tags[0] as Record<string, unknown>) ?? {};\n}\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listTags(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.tags.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('tags', (page) => client.tags.browse({ ...params, page, limit }));\n}\n\nexport async function getTag(\n global: GlobalOptions,\n idOrSlug: string,\n options: {\n bySlug?: boolean;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tags.read(idOrSlug, options);\n}\n\nexport async function createTag(\n global: GlobalOptions,\n tag: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tags.add(tag);\n}\n\nexport async function updateTag(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const lookup = options.slug ?? options.id;\n\n if (!lookup) {\n throw new GhstError('Provide an id or --slug.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const bySlug = Boolean(options.slug);\n const existingPayload = await client.tags.read(lookup, { bySlug });\n const existing = getFirstTag(existingPayload);\n\n const id = String(existing.id ?? '');\n const updatedAt = existing.updated_at;\n\n if (!id || typeof updatedAt !== 'string') {\n throw new GhstError('Tag is missing required id/updated_at for update.', {\n code: 'CONFLICT',\n exitCode: ExitCode.CONFLICT,\n });\n }\n\n return client.tags.edit(id, {\n ...options.patch,\n updated_at: updatedAt,\n });\n}\n\nexport async function deleteTag(global: GlobalOptions, id: string): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.tags.delete(id);\n}\n\nfunction extractTagIds(payload: GhostPaginatedResponse): string[] {\n const tags = Array.isArray(payload.tags) ? payload.tags : [];\n return tags\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n}\n\nexport async function bulkTags(\n global: GlobalOptions,\n options: {\n filter: string;\n delete?: boolean;\n visibility?: 'public' | 'internal';\n },\n): Promise<Record<string, unknown>> {\n const list = await listTags(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const ids = extractTagIds(list);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n if (options.delete) {\n await deleteTag(global, id);\n } else {\n await updateTag(global, {\n id,\n patch: {\n visibility: options.visibility,\n },\n });\n }\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listThemes(global: GlobalOptions): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.themes.browse();\n}\n\nexport async function uploadTheme(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const bytes = await fs.readFile(filePath);\n const formData = new FormData();\n formData.append('file', new Blob([bytes]), path.basename(filePath));\n return client.themes.upload(formData);\n}\n\nexport async function activateTheme(\n global: GlobalOptions,\n name: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.themes.activate(name);\n}\n","import { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listTiers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.tiers.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('tiers', (page) => client.tiers.browse({ ...params, page, limit }));\n}\n\nexport async function getTier(\n global: GlobalOptions,\n id: string,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tiers.read(id, params);\n}\n\nexport async function createTier(\n global: GlobalOptions,\n tier: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tiers.add(tier);\n}\n\nexport async function updateTier(\n global: GlobalOptions,\n id: string,\n patch: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.tiers.edit(id, patch);\n}\n\nexport async function bulkTiers(\n global: GlobalOptions,\n options: {\n filter: string;\n patch: Record<string, unknown>;\n },\n): Promise<Record<string, unknown>> {\n const list = await listTiers(\n global,\n {\n filter: options.filter,\n limit: 100,\n },\n true,\n );\n const tiers = Array.isArray(list.tiers) ? list.tiers : [];\n const ids = tiers\n .map((entry) => String((entry as Record<string, unknown>)?.id ?? '').trim())\n .filter(Boolean);\n\n if (ids.length === 0) {\n return {\n bulk: {\n meta: {\n stats: {\n successful: 0,\n unsuccessful: 0,\n },\n },\n errors: [],\n },\n };\n }\n\n let successful = 0;\n let unsuccessful = 0;\n const errors: Array<Record<string, string>> = [];\n\n for (const id of ids) {\n try {\n await updateTier(global, id, options.patch);\n successful += 1;\n } catch (error) {\n unsuccessful += 1;\n errors.push({\n id,\n message: (error as Error).message,\n });\n }\n }\n\n return {\n bulk: {\n meta: {\n stats: {\n successful,\n unsuccessful,\n },\n },\n errors,\n },\n };\n}\n","import { GhostApiError, GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function listUsers(\n global: GlobalOptions,\n params: Record<string, string | number | boolean | undefined>,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n\n if (!allPages) {\n return client.users.browse(params);\n }\n\n const limit = typeof params.limit === 'number' ? params.limit : 100;\n return collectAllPages('users', (page) => client.users.browse({ ...params, page, limit }));\n}\n\nexport async function getUser(\n global: GlobalOptions,\n options: {\n id?: string;\n slug?: string;\n email?: string;\n params?: Record<string, string | number | boolean | undefined>;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n\n if (options.id) {\n return client.users.read(options.id, {\n params: options.params,\n });\n }\n\n if (options.slug) {\n return client.users.read(options.slug, {\n bySlug: true,\n params: options.params,\n });\n }\n\n if (options.email) {\n return client.users.read(options.email, {\n byEmail: true,\n params: options.params,\n });\n }\n\n throw new GhstError('Provide an id argument, --slug, or --email.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n}\n\nexport async function getCurrentUser(\n global: GlobalOptions,\n params?: Record<string, string | number | boolean | undefined>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n try {\n return await client.users.me(params);\n } catch (error) {\n if (error instanceof GhostApiError && (error.status === 403 || error.status === 404)) {\n throw new GhstError(\n 'Current user is unavailable for this token. Use a staff/session token with user context.',\n {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n status: error.status,\n details: error.payload,\n },\n );\n }\n\n throw error;\n }\n}\n","import { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport type { GlobalOptions } from './types.js';\n\nexport const WEBHOOK_EVENTS = [\n 'site.changed',\n 'post.added',\n 'post.deleted',\n 'post.edited',\n 'post.published',\n 'post.published.edited',\n 'post.unpublished',\n 'post.scheduled',\n 'post.unscheduled',\n 'post.rescheduled',\n 'page.added',\n 'page.deleted',\n 'page.edited',\n 'page.published',\n 'page.published.edited',\n 'page.unpublished',\n 'page.scheduled',\n 'page.unscheduled',\n 'page.rescheduled',\n 'tag.added',\n 'tag.edited',\n 'tag.deleted',\n 'member.added',\n 'member.deleted',\n 'member.edited',\n 'post.tag.attached',\n 'post.tag.detached',\n 'page.tag.attached',\n 'page.tag.detached',\n] as const;\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nexport async function createWebhook(\n global: GlobalOptions,\n webhook: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.webhooks.add(webhook);\n}\n\nexport async function updateWebhook(\n global: GlobalOptions,\n id: string,\n webhook: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.webhooks.edit(id, webhook);\n}\n\nexport async function deleteWebhook(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, never>> {\n const client = await getClient(global);\n return client.webhooks.delete(id);\n}\n","import { timingSafeEqual } from 'node:crypto';\nimport http from 'node:http';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\n\ninterface RunMcpHttpOptions {\n host: string;\n port: number;\n corsOrigin?: string;\n authToken: string;\n maxBodyBytes?: number;\n headersTimeoutMs?: number;\n requestTimeoutMs?: number;\n keepAliveTimeoutMs?: number;\n}\n\nconst DEFAULT_MAX_BODY_BYTES = 1024 * 1024;\nconst DEFAULT_HEADERS_TIMEOUT_MS = 15_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\nconst DEFAULT_KEEP_ALIVE_TIMEOUT_MS = 5_000;\n\nfunction isAuthorized(authHeader: string | undefined, token: string): boolean {\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return false;\n }\n\n const provided = authHeader.slice('Bearer '.length).trim();\n const expected = Buffer.from(token, 'utf8');\n const actual = Buffer.from(provided, 'utf8');\n if (expected.length !== actual.length) {\n return false;\n }\n\n return timingSafeEqual(expected, actual);\n}\n\nfunction parseContentLength(contentLengthHeader: string | undefined): number | null {\n if (!contentLengthHeader) {\n return null;\n }\n\n const parsed = Number(contentLengthHeader);\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed < 0) {\n return null;\n }\n\n return parsed;\n}\n\nexport async function runMcpHttp(server: McpServer, options: RunMcpHttpOptions): Promise<void> {\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n const headersTimeoutMs = options.headersTimeoutMs ?? DEFAULT_HEADERS_TIMEOUT_MS;\n const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const keepAliveTimeoutMs = options.keepAliveTimeoutMs ?? DEFAULT_KEEP_ALIVE_TIMEOUT_MS;\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n await server.connect(transport);\n\n const appServer = http.createServer((req, res) => {\n if (options.corsOrigin) {\n res.setHeader('Access-Control-Allow-Origin', options.corsOrigin);\n res.setHeader('Vary', 'Origin');\n res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id, Authorization');\n }\n\n if (req.method === 'OPTIONS') {\n res.statusCode = 204;\n res.end();\n return;\n }\n\n const authHeader = Array.isArray(req.headers.authorization)\n ? req.headers.authorization[0]\n : req.headers.authorization;\n if (!isAuthorized(authHeader, options.authToken)) {\n res.statusCode = 401;\n res.end('Unauthorized');\n return;\n }\n\n if (req.method === 'POST') {\n const contentLengthHeader = Array.isArray(req.headers['content-length'])\n ? req.headers['content-length'][0]\n : req.headers['content-length'];\n const contentLength = parseContentLength(contentLengthHeader);\n if (contentLength === null) {\n res.statusCode = 411;\n res.end('Length Required');\n return;\n }\n if (contentLength > maxBodyBytes) {\n res.statusCode = 413;\n res.end('Payload Too Large');\n return;\n }\n }\n\n void transport.handleRequest(req, res);\n });\n appServer.headersTimeout = headersTimeoutMs;\n appServer.requestTimeout = requestTimeoutMs;\n appServer.keepAliveTimeout = keepAliveTimeoutMs;\n\n await new Promise<void>((resolve, reject) => {\n appServer.once('error', reject);\n appServer.listen(options.port, options.host, () => {\n appServer.off('error', reject);\n resolve();\n });\n });\n\n await new Promise<void>((resolve) => {\n let closed = false;\n\n const stop = async () => {\n if (closed) {\n return;\n }\n\n closed = true;\n await new Promise<void>((done) => {\n appServer.close(() => done());\n });\n process.off('SIGINT', onSigint);\n process.off('SIGTERM', onSigterm);\n resolve();\n };\n\n const onSigint = () => {\n void stop();\n };\n\n const onSigterm = () => {\n void stop();\n };\n\n process.on('SIGINT', onSigint);\n process.on('SIGTERM', onSigterm);\n });\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nexport async function runMcpStdio(server: McpServer): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n await new Promise<void>((resolve) => {\n transport.onclose = () => resolve();\n });\n}\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { parseCsv, parseInteger } from '../lib/parse.js';\nimport { createGhostMcpServer } from '../mcp/server.js';\nimport { MCP_TOOL_GROUPS, parseToolGroups } from '../mcp/tools/core.js';\nimport { runMcpHttp } from '../mcp/transports/http.js';\nimport { runMcpStdio } from '../mcp/transports/stdio.js';\n\nlet runMcpStdioForTests:\n | ((server: ReturnType<typeof createGhostMcpServer>) => Promise<void>)\n | null = null;\nlet runMcpHttpForTests:\n | ((\n server: ReturnType<typeof createGhostMcpServer>,\n options: {\n host: string;\n port: number;\n corsOrigin?: string;\n authToken: string;\n maxBodyBytes: number;\n headersTimeoutMs: number;\n requestTimeoutMs: number;\n keepAliveTimeoutMs: number;\n },\n ) => Promise<void>)\n | null = null;\n\nexport function setMcpRunnersForTests(\n options: {\n stdio?: ((server: ReturnType<typeof createGhostMcpServer>) => Promise<void>) | null;\n http?:\n | ((\n server: ReturnType<typeof createGhostMcpServer>,\n options: {\n host: string;\n port: number;\n corsOrigin?: string;\n authToken: string;\n maxBodyBytes: number;\n headersTimeoutMs: number;\n requestTimeoutMs: number;\n keepAliveTimeoutMs: number;\n },\n ) => Promise<void>)\n | null;\n } | null,\n): void {\n runMcpStdioForTests = options?.stdio ?? null;\n runMcpHttpForTests = options?.http ?? null;\n}\n\nfunction assertToolsFilter(toolsArg: string | undefined): void {\n if (toolsArg === undefined || toolsArg === 'all') {\n return;\n }\n\n if (toolsArg.trim().length === 0) {\n throw new GhstError('MCP tool groups cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const requested = parseCsv(toolsArg) ?? [];\n if (requested.length === 0) {\n throw new GhstError('MCP tool groups cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n const allowed = new Set(MCP_TOOL_GROUPS);\n const invalid = requested.filter(\n (value) => !allowed.has(value as (typeof MCP_TOOL_GROUPS)[number]),\n );\n if (invalid.length > 0) {\n throw new GhstError(`Unknown MCP tool group(s): ${invalid.join(', ')}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n}\n\nfunction parsePositiveIntegerOption(value: string | undefined, label: string): number {\n const parsed = parseInteger(value, label);\n if (parsed === undefined || parsed <= 0) {\n throw new GhstError(`${label} must be a positive integer`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n return parsed;\n}\n\nexport function registerMcpCommands(program: Command): void {\n const mcp = program.command('mcp').description('MCP server mode');\n\n mcp\n .command('stdio')\n .description('Run MCP server over stdio transport')\n .option(\n '--tools <tools>',\n `Tool groups to expose (comma-separated or all). Available: ${MCP_TOOL_GROUPS.join(', ')}`,\n 'all',\n )\n .action(async (options, command) => {\n assertToolsFilter(options.tools);\n const global = getGlobalOptions(command);\n const enabledGroups = parseToolGroups(options.tools);\n const server = createGhostMcpServer(global, { enabledGroups });\n const run = runMcpStdioForTests ?? runMcpStdio;\n await run(server);\n });\n\n mcp\n .command('http')\n .description('Run MCP server over HTTP transport')\n .option('--host <host>', 'Bind host', '127.0.0.1')\n .option('--port <port>', 'Bind port', '3100')\n .option('--cors-origin <origin>', 'Allow CORS origin')\n .option('--max-body-bytes <bytes>', 'Maximum HTTP MCP request body size in bytes', '1048576')\n .option('--headers-timeout-ms <ms>', 'HTTP headers timeout in milliseconds', '15000')\n .option('--request-timeout-ms <ms>', 'HTTP request timeout in milliseconds', '15000')\n .option('--keepalive-timeout-ms <ms>', 'HTTP keep-alive timeout in milliseconds', '5000')\n .requiredOption(\n '--tools <tools>',\n `Tool groups to expose (comma-separated or all). Available: ${MCP_TOOL_GROUPS.join(', ')}`,\n )\n .option('--auth-token <token>', 'Bearer auth token for HTTP MCP requests')\n .action(async (options, command) => {\n assertToolsFilter(options.tools);\n const port = parsePositiveIntegerOption(options.port, 'port');\n const maxBodyBytes = parsePositiveIntegerOption(options.maxBodyBytes, 'max-body-bytes');\n const headersTimeoutMs = parsePositiveIntegerOption(\n options.headersTimeoutMs,\n 'headers-timeout-ms',\n );\n const requestTimeoutMs = parsePositiveIntegerOption(\n options.requestTimeoutMs,\n 'request-timeout-ms',\n );\n const keepAliveTimeoutMs = parsePositiveIntegerOption(\n options.keepaliveTimeoutMs,\n 'keepalive-timeout-ms',\n );\n const authToken =\n (options.authToken as string | undefined) ?? process.env.GHST_MCP_AUTH_TOKEN;\n if (!authToken) {\n throw new GhstError('mcp http requires --auth-token or GHST_MCP_AUTH_TOKEN.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const global = getGlobalOptions(command);\n const enabledGroups = parseToolGroups(options.tools);\n const server = createGhostMcpServer(global, { enabledGroups });\n const run = runMcpHttpForTests ?? runMcpHttp;\n\n await run(server, {\n host: options.host,\n port,\n corsOrigin: options.corsOrigin,\n authToken,\n maxBodyBytes,\n headersTimeoutMs,\n requestTimeoutMs,\n keepAliveTimeoutMs,\n });\n });\n}\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n bulkMembers,\n createMember,\n deleteMember,\n exportMembersCsv,\n getMember,\n importMembersCsv,\n listMembers,\n updateMember,\n} from '../lib/members.js';\nimport {\n printJson,\n printMemberHuman,\n printMemberListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseCsv, parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n MemberBulkInputSchema,\n MemberCreateInputSchema,\n MemberDeleteInputSchema,\n MemberExportInputSchema,\n MemberGetInputSchema,\n MemberImportInputSchema,\n MemberListInputSchema,\n MemberUpdateInputSchema,\n} from '../schemas/member.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction csvAsObjects(\n input: string | undefined,\n key: 'id' | 'name',\n): Array<Record<string, string>> | undefined {\n const values = parseCsv(input);\n if (!values || values.length === 0) {\n return undefined;\n }\n\n return values.map((value) => ({ [key]: value }));\n}\n\nexport function registerMemberCommands(program: Command): void {\n const member = program.command('member').description('Member management');\n\n member\n .command('list')\n .description('List members')\n .option('--limit <numberOrAll>', 'Number of members per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--status <status>', 'Member status (free|paid|comped)')\n .option('--search <term>', 'Search term')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = MemberListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n status: options.status,\n search: options.search,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const combinedFilter =\n parsed.data.filter && parsed.data.status\n ? `${parsed.data.filter}+status:${parsed.data.status}`\n : (parsed.data.filter ??\n (parsed.data.status ? `status:${parsed.data.status}` : undefined));\n const payload = await listMembers(\n global,\n {\n ...parsed.data,\n filter: combinedFilter,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberListHuman(payload, global.color !== false);\n });\n\n member\n .command('get [id]')\n .description('Get a member by id or email')\n .option('--email <email>', 'Member email')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberGetInputSchema.safeParse({\n id,\n email: options.email,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getMember(global, {\n id: parsed.data.id,\n email: parsed.data.email,\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberHuman(payload);\n });\n\n member\n .command('create')\n .description('Create a member')\n .requiredOption('--email <email>', 'Member email')\n .option('--name <name>', 'Member name')\n .option('--note <note>', 'Internal note')\n .option('--labels <labels>', 'Comma separated labels')\n .option('--newsletters <ids>', 'Comma separated newsletter ids')\n .option('--subscribed <value>', 'true|false')\n .option('--send-email', 'Send welcome/signin/signup email')\n .option('--email-type <type>', 'signin|signup|subscribe')\n .option('--comp', 'Create as complimentary member')\n .option('--tier <id>', 'Tier id for complimentary access')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberCreateInputSchema.safeParse({\n email: options.email,\n name: options.name,\n note: options.note,\n labels: options.labels,\n newsletters: options.newsletters,\n subscribed: parseBooleanFlag(options.subscribed),\n sendEmail: parseBooleanFlag(options.sendEmail),\n emailType: options.emailType,\n comp: parseBooleanFlag(options.comp),\n tier: options.tier,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const tierId = parsed.data.tier;\n const memberPayload: Record<string, unknown> = {\n email: parsed.data.email,\n name: parsed.data.name,\n note: parsed.data.note,\n subscribed: parsed.data.subscribed,\n labels: csvAsObjects(parsed.data.labels, 'name'),\n newsletters: csvAsObjects(parsed.data.newsletters, 'id'),\n };\n\n if (parsed.data.comp && tierId) {\n memberPayload.tiers = [{ id: tierId }];\n }\n\n const apiParams: Record<string, string | number | boolean | undefined> = {\n send_email: parsed.data.sendEmail,\n email_type: parsed.data.emailType,\n };\n\n const payload = await createMember(global, memberPayload, apiParams);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberHuman(payload);\n });\n\n member\n .command('update [id]')\n .description('Update a member by id or email')\n .option('--email <email>', 'Member email lookup')\n .option('--name <name>', 'Member name')\n .option('--note <note>', 'Internal note')\n .option('--labels <labels>', 'Comma separated labels')\n .option('--newsletters <ids>', 'Comma separated newsletter ids')\n .option('--subscribed <value>', 'true|false')\n .option('--comp', 'Set complimentary tier access')\n .option('--tier <id>', 'Tier id for complimentary access')\n .option('--expiry <datetime>', 'Tier access expiry datetime')\n .option('--clear-tiers', 'Remove all complimentary tiers')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberUpdateInputSchema.safeParse({\n id,\n email: options.email,\n name: options.name,\n note: options.note,\n labels: options.labels,\n newsletters: options.newsletters,\n subscribed: parseBooleanFlag(options.subscribed),\n comp: parseBooleanFlag(options.comp),\n tier: options.tier,\n expiry: options.expiry,\n clearTiers: parseBooleanFlag(options.clearTiers),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const patch: Record<string, unknown> = {\n name: parsed.data.name,\n note: parsed.data.note,\n subscribed: parsed.data.subscribed,\n labels:\n parsed.data.labels !== undefined ? csvAsObjects(parsed.data.labels, 'name') : undefined,\n newsletters:\n parsed.data.newsletters !== undefined\n ? csvAsObjects(parsed.data.newsletters, 'id')\n : undefined,\n };\n\n if (parsed.data.clearTiers) {\n patch.tiers = [];\n } else if (parsed.data.tier && (parsed.data.comp || parsed.data.expiry)) {\n patch.tiers = [\n {\n id: parsed.data.tier,\n expiry_at: parsed.data.expiry,\n },\n ];\n }\n\n const payload = await updateMember(global, {\n id: parsed.data.id,\n email: parsed.data.email,\n patch,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printMemberHuman(payload);\n });\n\n member\n .command('delete <id>')\n .description('Delete a member')\n .option('--cancel', 'Cancel Stripe subscriptions when deleting')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MemberDeleteInputSchema.safeParse({\n id,\n cancel: parseBooleanFlag(options.cancel),\n yes: parseBooleanFlag(options.yes),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete member '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteMember(global, parsed.data.id, {\n cancel: parsed.data.cancel,\n });\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted member '${parsed.data.id}'.`);\n });\n\n member\n .command('import <filePath>')\n .description('Import members from CSV')\n .option('--labels <labels>', 'Comma separated labels to apply to imported members')\n .action(async (filePath: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = MemberImportInputSchema.safeParse({\n filePath,\n labels: options.labels,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await importMembersCsv(global, {\n filePath: parsed.data.filePath,\n labels: parseCsv(parsed.data.labels),\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Imported members');\n });\n\n member\n .command('export')\n .description('Export members as CSV')\n .option('--limit <numberOrAll>', 'Number of members per page or \"all\"')\n .option('--filter <nql>', 'NQL filter')\n .option('--search <term>', 'Search term')\n .option('--output <path>', 'Write CSV to file path')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const parsed = MemberExportInputSchema.safeParse({\n limit: rawLimit,\n filter: options.filter,\n search: options.search,\n output: options.output,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const csv = await exportMembersCsv(global, {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n filter: parsed.data.filter,\n search: parsed.data.search,\n });\n\n if (parsed.data.output) {\n await fs.writeFile(parsed.data.output, csv, 'utf8');\n\n if (global.json) {\n printJson({ ok: true, output: parsed.data.output });\n return;\n }\n\n console.log(`Exported members CSV to '${parsed.data.output}'.`);\n return;\n }\n\n if (global.json) {\n printJson({ csv }, global.jq);\n return;\n }\n\n process.stdout.write(csv);\n if (!csv.endsWith('\\n')) {\n process.stdout.write('\\n');\n }\n });\n\n member\n .command('bulk')\n .description('Run a bulk member operation')\n .option('--action <action>', 'unsubscribe|add-label|remove-label|delete')\n .option('--update', 'PRD alias for bulk label replacement')\n .option('--delete', 'PRD alias for delete action')\n .option('--all', 'Apply to all members')\n .option('--filter <nql>', 'Filter members by NQL')\n .option('--search <term>', 'Search members')\n .option('--label-id <id>', 'Label id for add-label/remove-label operations')\n .option('--labels <labels>', 'Comma separated label names for --update')\n .option('--yes', 'Confirm --delete action')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MemberBulkInputSchema.safeParse({\n action: options.action,\n update: parseBooleanFlag(options.update),\n delete: parseBooleanFlag(options.delete),\n all: parseBooleanFlag(options.all),\n filter: options.filter,\n search: options.search,\n labelId: options.labelId,\n labels: options.labels,\n yes: parseBooleanFlag(options.yes),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const resolvedAction = parsed.data.update\n ? 'update-labels'\n : parsed.data.delete\n ? 'delete'\n : parsed.data.action;\n const payload = await bulkMembers(global, {\n action: (resolvedAction ?? 'unsubscribe') as\n | 'unsubscribe'\n | 'add-label'\n | 'remove-label'\n | 'delete'\n | 'update-labels',\n all: parsed.data.all,\n filter: parsed.data.filter,\n search: parsed.data.search,\n labelId: parsed.data.labelId,\n labels: parseCsv(parsed.data.labels),\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk member operation completed');\n });\n}\n","import { z } from 'zod';\n\nconst EmailTypeSchema = z.enum(['signin', 'signup', 'subscribe']);\nconst BulkActionSchema = z.enum(['unsubscribe', 'add-label', 'remove-label', 'delete']);\n\nexport const MemberListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: z.enum(['free', 'paid', 'comped']).optional(),\n search: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const MemberGetInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n email: z.email().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.email), {\n message: 'Provide an id argument or --email.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.email), {\n message: 'Use either id argument or --email, not both.',\n path: ['id'],\n });\n\nexport const MemberCreateInputSchema = z\n .object({\n email: z.email(),\n name: z.string().min(1).optional(),\n note: z.string().optional(),\n labels: z.string().optional(),\n newsletters: z.string().optional(),\n subscribed: z.boolean().optional(),\n sendEmail: z.boolean().optional(),\n emailType: EmailTypeSchema.optional(),\n comp: z.boolean().optional(),\n tier: z.string().min(1).optional(),\n })\n .refine((data) => !(data.comp && !data.tier), {\n message: '--tier is required when --comp is set.',\n path: ['tier'],\n });\n\nexport const MemberUpdateInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n email: z.email().optional(),\n name: z.string().min(1).optional(),\n note: z.string().optional(),\n labels: z.string().optional(),\n newsletters: z.string().optional(),\n subscribed: z.boolean().optional(),\n comp: z.boolean().optional(),\n tier: z.string().min(1).optional(),\n expiry: z.string().datetime().optional(),\n clearTiers: z.boolean().optional(),\n })\n .refine((data) => Boolean(data.id || data.email), {\n message: 'Provide an id argument or --email.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.email), {\n message: 'Use either id argument or --email, not both.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.note !== undefined ||\n data.labels !== undefined ||\n data.newsletters !== undefined ||\n data.subscribed !== undefined ||\n data.comp !== undefined ||\n data.tier !== undefined ||\n data.expiry !== undefined ||\n data.clearTiers,\n ),\n {\n message: 'Provide at least one update field.',\n },\n )\n .refine((data) => !(data.comp && !data.tier && !data.clearTiers), {\n message: '--tier is required when --comp is set unless --clear-tiers is used.',\n path: ['tier'],\n })\n .refine((data) => !(data.expiry && !data.tier), {\n message: '--tier is required when --expiry is set.',\n path: ['tier'],\n });\n\nexport const MemberDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n cancel: z.boolean().optional(),\n});\n\nexport const MemberImportInputSchema = z.object({\n filePath: z.string().min(1),\n labels: z.string().optional(),\n});\n\nexport const MemberExportInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n filter: z.string().optional(),\n search: z.string().optional(),\n output: z.string().min(1).optional(),\n});\n\nexport const MemberBulkInputSchema = z\n .object({\n action: BulkActionSchema.optional(),\n update: z.boolean().optional(),\n delete: z.boolean().optional(),\n all: z.boolean().optional(),\n filter: z.string().optional(),\n search: z.string().optional(),\n labelId: z.string().min(1).optional(),\n labels: z.string().optional(),\n yes: z.boolean().optional(),\n })\n .refine(\n (data) => {\n const selected = [\n data.action !== undefined,\n data.update === true,\n data.delete === true,\n ].filter(Boolean);\n return selected.length === 1;\n },\n {\n message: 'Select exactly one action via --action, --update, or --delete.',\n path: ['action'],\n },\n )\n .refine((data) => Boolean(data.all || data.filter || data.search), {\n message: 'Provide one of --all, --filter, or --search.',\n path: ['all'],\n })\n .refine((data) => !(data.all && (data.filter || data.search)), {\n message: '--all cannot be combined with --filter or --search.',\n path: ['all'],\n })\n .refine(\n (data) => {\n if (data.action === 'add-label' || data.action === 'remove-label') {\n return Boolean(data.labelId);\n }\n\n return true;\n },\n {\n message: '--label-id is required for add-label/remove-label actions.',\n path: ['labelId'],\n },\n )\n .refine((data) => (data.update ? Boolean(data.labels) : true), {\n message: '--labels is required with --update.',\n path: ['labels'],\n })\n .refine((data) => (data.delete || data.action === 'delete' ? data.yes === true : true), {\n message: '--delete/--action delete requires --yes.',\n path: ['yes'],\n });\n","import fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { slugify } from '@tryghost/string';\nimport { parse as parseCsv } from 'csv-parse/sync';\nimport MarkdownIt from 'markdown-it';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError } from './errors.js';\nimport type { GlobalOptions } from './types.js';\n\ninterface CsvRow {\n title: string;\n html?: string;\n markdown?: string;\n slug?: string;\n status?: 'draft' | 'published' | 'scheduled';\n published_at?: string;\n tags?: string;\n authors?: string;\n excerpt?: string;\n feature_image?: string;\n}\n\nconst ALLOWED_CSV_HEADERS = new Set([\n 'title',\n 'html',\n 'markdown',\n 'slug',\n 'status',\n 'published_at',\n 'tags',\n 'authors',\n 'excerpt',\n 'feature_image',\n]);\n\nconst VALID_STATUSES = new Set(['draft', 'published', 'scheduled']);\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst markdownRenderer = new MarkdownIt({ html: true, linkify: true, breaks: true });\n\nasync function getClient(global: GlobalOptions): Promise<GhostClient> {\n const connection = await resolveConnectionConfig(global);\n return new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n });\n}\n\nfunction ensureObjectRecord(value: unknown, source: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new GhstError(`Migration source '${source}' returned an invalid payload.`, {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction splitList(value?: string): string[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction createTagRelation(name: string): Record<string, unknown> {\n const normalizedName = name.trim();\n const normalizedSlug = slugify(normalizedName);\n\n return {\n url: `csv://tag/${normalizedSlug}`,\n data: {\n name: normalizedName,\n slug: normalizedSlug,\n },\n };\n}\n\nfunction createAuthorRelation(value: string): Record<string, unknown> {\n const normalized = value.trim();\n\n if (EMAIL_PATTERN.test(normalized)) {\n const localPart = normalized.split('@')[0] ?? normalized;\n const normalizedSlug = slugify(localPart);\n\n return {\n url: `csv://author/${normalizedSlug}`,\n data: {\n name: localPart,\n slug: normalizedSlug,\n email: normalized,\n },\n };\n }\n\n const normalizedSlug = slugify(normalized);\n return {\n url: `csv://author/${normalizedSlug}`,\n data: {\n name: normalized,\n slug: normalizedSlug,\n },\n };\n}\n\nfunction parseCsvRows(raw: string): CsvRow[] {\n let matrix: string[][];\n try {\n matrix = parseCsv(raw, {\n bom: true,\n skip_empty_lines: true,\n relax_quotes: false,\n }) as string[][];\n } catch (error) {\n throw new GhstError(`CSV parsing failed: ${(error as Error).message}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (matrix.length < 2) {\n throw new GhstError('CSV must include headers and at least one row.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const headers = (matrix[0] ?? []).map((header) => String(header ?? '').trim());\n if (headers.length === 0 || headers.some((header) => header.length === 0)) {\n throw new GhstError('CSV headers must be non-empty values.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const duplicateHeaders = headers.filter((header, index) => headers.indexOf(header) !== index);\n if (duplicateHeaders.length > 0) {\n const uniqueDuplicates = Array.from(new Set(duplicateHeaders));\n throw new GhstError(`Duplicate CSV headers are not allowed: ${uniqueDuplicates.join(', ')}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const unknownHeaders = headers.filter((header) => !ALLOWED_CSV_HEADERS.has(header));\n if (unknownHeaders.length > 0) {\n const allowed = Array.from(ALLOWED_CSV_HEADERS).join(', ');\n throw new GhstError(\n `Unsupported CSV headers: ${unknownHeaders.join(', ')}. Allowed headers: ${allowed}`,\n {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n },\n );\n }\n\n if (!headers.includes('title')) {\n throw new GhstError(\"CSV must include a 'title' header.\", {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const hasHtmlHeader = headers.includes('html');\n const hasMarkdownHeader = headers.includes('markdown');\n if (!hasHtmlHeader && !hasMarkdownHeader) {\n throw new GhstError(\"CSV must include exactly one content header: 'html' or 'markdown'.\", {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (hasHtmlHeader && hasMarkdownHeader) {\n throw new GhstError(\"CSV cannot include both 'html' and 'markdown' headers.\", {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const rows: CsvRow[] = [];\n for (let rowIndex = 1; rowIndex < matrix.length; rowIndex += 1) {\n const values = matrix[rowIndex] ?? [];\n if (values.length !== headers.length) {\n throw new GhstError(\n `CSV row ${rowIndex + 1} has ${values.length} column(s), expected ${headers.length}.`,\n {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n },\n );\n }\n\n const record = Object.fromEntries(\n headers.map((header, index) => [header, String(values[index] ?? '')]),\n ) as Record<string, string>;\n\n const title = (record.title ?? '').trim();\n if (!title) {\n throw new GhstError(`CSV row ${rowIndex + 1} is missing required title.`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const htmlRaw = hasHtmlHeader ? (record.html ?? '') : undefined;\n const markdownRaw = hasMarkdownHeader ? (record.markdown ?? '') : undefined;\n\n if (hasHtmlHeader && !(htmlRaw ?? '').trim()) {\n throw new GhstError(`CSV row ${rowIndex + 1} must include html content.`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (hasMarkdownHeader && !(markdownRaw ?? '').trim()) {\n throw new GhstError(`CSV row ${rowIndex + 1} must include markdown content.`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const statusValue = (record.status ?? '').trim().toLowerCase();\n if (statusValue && !VALID_STATUSES.has(statusValue)) {\n throw new GhstError(\n `CSV row ${rowIndex + 1} has invalid status '${statusValue}'. Expected draft, published, or scheduled.`,\n {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n },\n );\n }\n\n rows.push({\n title,\n html: htmlRaw,\n markdown: markdownRaw,\n slug: (record.slug ?? '').trim() || undefined,\n status: (statusValue as CsvRow['status']) || undefined,\n published_at: (record.published_at ?? '').trim() || undefined,\n tags: (record.tags ?? '').trim() || undefined,\n authors: (record.authors ?? '').trim() || undefined,\n excerpt: (record.excerpt ?? '').trim() || undefined,\n feature_image: (record.feature_image ?? '').trim() || undefined,\n });\n }\n\n return rows;\n}\n\nasync function uploadDbImportFile(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const bytes = await fs.readFile(filePath);\n const formData = new FormData();\n formData.append('importfile', new Blob([bytes]), path.basename(filePath));\n return client.db.import(formData);\n}\n\nasync function buildGhostDbImportFile(input: Record<string, unknown>): Promise<string> {\n const mgJsonModule = (await loadMigrateModule('@tryghost/mg-json')) as {\n toGhostJSON?: (\n input: Record<string, unknown>,\n options?: Record<string, unknown>,\n ctx?: unknown,\n ) => Promise<Record<string, unknown>>;\n default?: {\n toGhostJSON?: (\n input: Record<string, unknown>,\n options?: Record<string, unknown>,\n ctx?: unknown,\n ) => Promise<Record<string, unknown>>;\n };\n };\n\n const toGhostJSON = mgJsonModule.toGhostJSON ?? mgJsonModule.default?.toGhostJSON;\n if (!toGhostJSON) {\n throw new GhstError('Ghost JSON converter is unavailable in @tryghost/mg-json.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const ghostJson = await toGhostJSON(input, {});\n const payload = { db: [ghostJson] };\n\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ghst-import-json-'));\n const outputPath = path.join(tempDir, 'import.json');\n await fs.writeFile(outputPath, JSON.stringify(payload), 'utf8');\n\n return outputPath;\n}\n\nexport async function migrateImportJson(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n return uploadDbImportFile(global, filePath);\n}\n\ntype MigrateSource = 'wordpress' | 'medium' | 'substack';\n\nlet migrateSourceLoaderForTests: ((modulePath: string) => Promise<unknown>) | null = null;\n\nexport function setMigrateSourceLoaderForTests(\n loader: ((modulePath: string) => Promise<unknown>) | null,\n): void {\n migrateSourceLoaderForTests = loader;\n}\n\nfunction isMissingModuleError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes('cannot find package') ||\n message.includes('cannot find module') ||\n message.includes('err_module_not_found')\n );\n}\n\nasync function loadMigrateModule(modulePath: string): Promise<unknown> {\n try {\n if (migrateSourceLoaderForTests) {\n return await migrateSourceLoaderForTests(modulePath);\n }\n\n return await import(modulePath);\n } catch (error) {\n if (isMissingModuleError(error)) {\n throw new GhstError(\n `Migration dependency '${modulePath}' is not installed. Run: pnpm add @tryghost/mg-json @tryghost/mg-wp-xml @tryghost/mg-medium-export @tryghost/mg-substack`,\n {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n },\n );\n }\n\n throw error;\n }\n}\n\nasync function collectSourceMigrationInput(\n source: MigrateSource,\n options: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n if (source === 'wordpress') {\n const wpModule = (await loadMigrateModule('@tryghost/mg-wp-xml')) as {\n default?: (ctx: { options: Record<string, unknown> }) => Promise<unknown>;\n };\n\n if (typeof wpModule.default !== 'function') {\n throw new GhstError('Invalid @tryghost/mg-wp-xml module: missing default export.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const output = await wpModule.default({\n options: {\n pathToFile: options.pathToFile,\n scrape: 'none',\n zip: false,\n cache: false,\n },\n });\n\n return ensureObjectRecord(output, source);\n }\n\n if (source === 'medium') {\n const mediumModule = (await loadMigrateModule('@tryghost/mg-medium-export')) as {\n default?: (pathToZip: string, options?: Record<string, unknown>) => unknown;\n };\n\n if (typeof mediumModule.default !== 'function') {\n throw new GhstError('Invalid @tryghost/mg-medium-export module: missing default export.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const output = await Promise.resolve(\n mediumModule.default(String(options.pathToZip ?? ''), {\n scrape: 'none',\n }),\n );\n\n return ensureObjectRecord(output, source);\n }\n\n const substackModule = (await loadMigrateModule('@tryghost/mg-substack')) as {\n default?: {\n ingest?: (ctx: { options: Record<string, unknown> }) => Promise<unknown>;\n process?: (\n input: unknown,\n ctx: { options: Record<string, unknown>; postsDir?: string },\n ) => Promise<unknown>;\n };\n };\n\n const substackApi = substackModule.default;\n if (\n !substackApi ||\n typeof substackApi.ingest !== 'function' ||\n typeof substackApi.process !== 'function'\n ) {\n throw new GhstError('Invalid @tryghost/mg-substack module: expected ingest/process API.', {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const substackOptions: Record<string, unknown> = {\n pathToZip: options.pathToZip,\n url: options.url,\n posts: true,\n pages: true,\n podcasts: true,\n threads: false,\n drafts: true,\n addPlatformTag: true,\n addTypeTag: true,\n addAccessTag: true,\n useMetaImage: true,\n useFirstImage: true,\n useMetaAuthor: true,\n comments: true,\n };\n\n const ingested = await substackApi.ingest({ options: substackOptions });\n const output = await substackApi.process(ingested, { options: substackOptions });\n\n return ensureObjectRecord(output, source);\n}\n\nasync function runGhostMigrateSource(\n source: MigrateSource,\n options: Record<string, unknown>,\n): Promise<string> {\n const migrationInput = await collectSourceMigrationInput(source, options);\n return buildGhostDbImportFile(migrationInput);\n}\n\nexport async function migrateImportWordpress(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const importPath = await runGhostMigrateSource('wordpress', { pathToFile: filePath });\n return uploadDbImportFile(global, importPath);\n}\n\nexport async function migrateImportMedium(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const importPath = await runGhostMigrateSource('medium', { pathToZip: filePath });\n return uploadDbImportFile(global, importPath);\n}\n\nexport async function migrateImportSubstack(\n global: GlobalOptions,\n filePath: string,\n url: string,\n): Promise<Record<string, unknown>> {\n const importPath = await runGhostMigrateSource('substack', {\n pathToZip: filePath,\n url,\n });\n return uploadDbImportFile(global, importPath);\n}\n\nexport async function migrateImportCsv(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const raw = await fs.readFile(filePath, 'utf8');\n const rows = parseCsvRows(raw);\n\n const posts = rows.map((row, index) => {\n const html = row.html ?? markdownRenderer.render(row.markdown ?? '');\n const tags = splitList(row.tags).map((name) => createTagRelation(name));\n const authors = splitList(row.authors).map((name) => createAuthorRelation(name));\n\n const postData: Record<string, unknown> = {\n title: row.title,\n html,\n slug: row.slug,\n status: row.status,\n published_at: row.published_at,\n custom_excerpt: row.excerpt,\n feature_image: row.feature_image,\n };\n\n if (tags.length > 0) {\n postData.tags = tags;\n }\n\n if (authors.length === 1) {\n postData.author = authors[0];\n } else if (authors.length > 1) {\n postData.authors = authors;\n }\n\n return {\n url: row.slug ? `csv://post/${row.slug}` : `csv://post/${index + 1}`,\n data: postData,\n };\n });\n\n const importPath = await buildGhostDbImportFile({ posts });\n const payload = await uploadDbImportFile(global, importPath);\n\n return {\n imported: rows.length,\n ...payload,\n };\n}\n\nexport async function migrateExport(global: GlobalOptions, outputPath: string): Promise<string> {\n const client = await getClient(global);\n const data = await client.db.export();\n await fs.writeFile(outputPath, data);\n return outputPath;\n}\n","import { z } from 'zod';\n\nexport const MigrateWordpressInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateMediumInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateSubstackInputSchema = z.object({\n file: z.string().min(1),\n url: z.string().url(),\n});\n\nexport const MigrateCsvInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateJsonInputSchema = z.object({\n file: z.string().min(1),\n});\n\nexport const MigrateExportInputSchema = z.object({\n output: z.string().min(1),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n migrateExport,\n migrateImportCsv,\n migrateImportJson,\n migrateImportMedium,\n migrateImportSubstack,\n migrateImportWordpress,\n} from '../lib/migrate.js';\nimport { printJson } from '../lib/output.js';\nimport {\n MigrateCsvInputSchema,\n MigrateExportInputSchema,\n MigrateJsonInputSchema,\n MigrateMediumInputSchema,\n MigrateSubstackInputSchema,\n MigrateWordpressInputSchema,\n} from '../schemas/migrate.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction getRootCommand(command: Command): Command {\n let cursor: Command = command;\n while (cursor.parent) {\n cursor = cursor.parent;\n }\n return cursor;\n}\n\nfunction getExplicitSubstackSourceUrl(command: Command): string | undefined {\n const rootCommand = getRootCommand(command);\n const rawArgs = (rootCommand as unknown as { rawArgs?: string[] }).rawArgs ?? [];\n const substackIndex = rawArgs.lastIndexOf('substack');\n\n if (substackIndex === -1) {\n return undefined;\n }\n\n for (let index = substackIndex + 1; index < rawArgs.length; index += 1) {\n const token = rawArgs[index] ?? '';\n if (token === '--') {\n break;\n }\n\n if (token === '--url') {\n const value = rawArgs[index + 1];\n return value && !value.startsWith('-') ? value : undefined;\n }\n\n if (token.startsWith('--url=')) {\n const [, value = ''] = token.split('=');\n return value;\n }\n }\n\n return undefined;\n}\n\nexport function registerMigrateCommands(program: Command): void {\n const migrate = program.command('migrate').description('Migration utilities');\n\n migrate\n .command('wordpress')\n .description('Import from WordPress XML export')\n .requiredOption('--file <path>', 'Path to WordPress XML file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateWordpressInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportWordpress(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('WordPress migration import completed.');\n });\n\n migrate\n .command('medium')\n .description('Import from Medium export zip')\n .requiredOption('--file <path>', 'Path to Medium export zip')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateMediumInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportMedium(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('Medium migration import completed.');\n });\n\n migrate\n .command('substack')\n .description('Import from Substack export zip')\n .requiredOption('--file <path>', 'Path to Substack export zip')\n .option('--url <url>', 'Substack site url')\n .option('--target-url <url>', 'Ghost destination URL override')\n .action(async (options, command) => {\n const sourceUrl = getExplicitSubstackSourceUrl(command);\n if (!sourceUrl) {\n throw new GhstError('Substack migration requires --url.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const global = {\n ...getGlobalOptions(command),\n // Keep migrate source --url distinct from Ghost destination URL override.\n url: options.targetUrl as string | undefined,\n };\n\n const parsed = MigrateSubstackInputSchema.safeParse({\n file: options.file,\n url: sourceUrl,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportSubstack(global, parsed.data.file, parsed.data.url);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('Substack migration import completed.');\n });\n\n migrate\n .command('csv')\n .description('Import from canonical CSV schema')\n .requiredOption('--file <path>', 'Path to CSV file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateCsvInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportCsv(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log(`CSV migration completed (${String(payload.imported ?? 0)} rows imported).`);\n });\n\n migrate\n .command('json')\n .description('Import Ghost JSON/ZIP export')\n .requiredOption('--file <path>', 'Path to Ghost import file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateJsonInputSchema.safeParse({ file: options.file });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await migrateImportJson(global, parsed.data.file);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n console.log('Ghost JSON migration import completed.');\n });\n\n migrate\n .command('export')\n .description('Export site content as Ghost backup')\n .requiredOption('--output <path>', 'Output file path')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = MigrateExportInputSchema.safeParse({ output: options.output });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const outputPath = await migrateExport(global, parsed.data.output);\n if (global.json) {\n printJson({ ok: true, output: outputPath }, global.jq);\n return;\n }\n\n console.log(`Exported Ghost backup to ${outputPath}`);\n });\n}\n","import { z } from 'zod';\n\nconst NewsletterStatusSchema = z.enum(['active', 'archived']);\nconst NewsletterVisibilitySchema = z.enum(['all', 'members', 'paid']);\n\nexport const NewsletterListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const NewsletterGetInputSchema = z.object({\n id: z.string().min(1),\n include: z.string().optional(),\n fields: z.string().optional(),\n});\n\nexport const NewsletterCreateInputSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n senderName: z.string().optional(),\n senderEmail: z.email().nullable().optional(),\n senderReplyTo: z.string().optional(),\n status: NewsletterStatusSchema.optional(),\n visibility: NewsletterVisibilitySchema.optional(),\n subscribeOnSignup: z.boolean().optional(),\n optInExisting: z.boolean().optional(),\n});\n\nexport const NewsletterUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n senderName: z.string().optional(),\n senderEmail: z.email().nullable().optional(),\n senderReplyTo: z.string().optional(),\n status: NewsletterStatusSchema.optional(),\n visibility: NewsletterVisibilitySchema.optional(),\n subscribeOnSignup: z.boolean().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.description !== undefined ||\n data.senderName !== undefined ||\n data.senderEmail !== undefined ||\n data.senderReplyTo !== undefined ||\n data.status !== undefined ||\n data.visibility !== undefined ||\n data.subscribeOnSignup !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const NewsletterBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.literal('update'),\n status: NewsletterStatusSchema.optional(),\n visibility: NewsletterVisibilitySchema.optional(),\n })\n .refine((data) => Boolean(data.status !== undefined || data.visibility !== undefined), {\n message: 'Bulk update requires --status or --visibility.',\n path: ['status'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n bulkNewsletters,\n createNewsletter,\n getNewsletter,\n listNewsletters,\n updateNewsletter,\n} from '../lib/newsletters.js';\nimport {\n printJson,\n printNewsletterHuman,\n printNewsletterListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseInteger } from '../lib/parse.js';\nimport {\n NewsletterBulkInputSchema,\n NewsletterCreateInputSchema,\n NewsletterGetInputSchema,\n NewsletterListInputSchema,\n NewsletterUpdateInputSchema,\n} from '../schemas/newsletter.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction parseNullableEmail(value: string | undefined): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value.trim().toLowerCase() === 'null') {\n return null;\n }\n\n return value;\n}\n\nexport function registerNewsletterCommands(program: Command): void {\n const newsletter = program.command('newsletter').description('Newsletter management');\n\n newsletter\n .command('list')\n .description('List newsletters')\n .option('--limit <numberOrAll>', 'Number of newsletters per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = NewsletterListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listNewsletters(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterListHuman(payload, global.color !== false);\n });\n\n newsletter\n .command('get <id>')\n .description('Get a newsletter by id')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = NewsletterGetInputSchema.safeParse({\n id,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getNewsletter(global, parsed.data.id, {\n include: parsed.data.include,\n fields: parsed.data.fields,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterHuman(payload);\n });\n\n newsletter\n .command('create')\n .description('Create a newsletter')\n .requiredOption('--name <name>', 'Newsletter name')\n .option('--description <description>', 'Newsletter description')\n .option('--sender-name <name>', 'Sender name')\n .option('--sender-email <emailOrNull>', 'Sender email or null')\n .option('--sender-reply-to <value>', 'Sender reply-to setting')\n .option('--status <status>', 'active|archived')\n .option('--visibility <visibility>', 'all|members|paid')\n .option('--subscribe-on-signup <value>', 'true|false')\n .option('--opt-in-existing', 'Subscribe existing members to this newsletter')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = NewsletterCreateInputSchema.safeParse({\n name: options.name,\n description: options.description,\n senderName: options.senderName,\n senderEmail: parseNullableEmail(options.senderEmail),\n senderReplyTo: options.senderReplyTo,\n status: options.status,\n visibility: options.visibility,\n subscribeOnSignup: parseBooleanFlag(options.subscribeOnSignup),\n optInExisting: parseBooleanFlag(options.optInExisting),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createNewsletter(\n global,\n {\n name: parsed.data.name,\n description: parsed.data.description,\n sender_name: parsed.data.senderName,\n sender_email: parsed.data.senderEmail,\n sender_reply_to: parsed.data.senderReplyTo,\n status: parsed.data.status,\n visibility: parsed.data.visibility,\n subscribe_on_signup: parsed.data.subscribeOnSignup,\n },\n {\n opt_in_existing: parsed.data.optInExisting,\n },\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterHuman(payload);\n });\n\n newsletter\n .command('update <id>')\n .description('Update a newsletter')\n .option('--name <name>', 'Newsletter name')\n .option('--description <description>', 'Newsletter description')\n .option('--sender-name <name>', 'Sender name')\n .option('--sender-email <emailOrNull>', 'Sender email or null')\n .option('--sender-reply-to <value>', 'Sender reply-to setting')\n .option('--status <status>', 'active|archived')\n .option('--visibility <visibility>', 'all|members|paid')\n .option('--subscribe-on-signup <value>', 'true|false')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = NewsletterUpdateInputSchema.safeParse({\n id,\n name: options.name,\n description: options.description,\n senderName: options.senderName,\n senderEmail: parseNullableEmail(options.senderEmail),\n senderReplyTo: options.senderReplyTo,\n status: options.status,\n visibility: options.visibility,\n subscribeOnSignup: parseBooleanFlag(options.subscribeOnSignup),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateNewsletter(global, parsed.data.id, {\n name: parsed.data.name,\n description: parsed.data.description,\n sender_name: parsed.data.senderName,\n sender_email: parsed.data.senderEmail,\n sender_reply_to: parsed.data.senderReplyTo,\n status: parsed.data.status,\n visibility: parsed.data.visibility,\n subscribe_on_signup: parsed.data.subscribeOnSignup,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printNewsletterHuman(payload);\n });\n\n newsletter\n .command('bulk')\n .description('Run bulk newsletter operations')\n .requiredOption('--filter <nql>', 'NQL filter to select newsletters')\n .requiredOption('--action <action>', 'update')\n .option('--status <status>', 'active|archived')\n .option('--visibility <visibility>', 'all|members|paid')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = NewsletterBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n status: options.status,\n visibility: options.visibility,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkNewsletters(global, {\n filter: parsed.data.filter,\n patch: {\n status: parsed.data.status,\n visibility: parsed.data.visibility,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk newsletter operation completed');\n });\n}\n","import { z } from 'zod';\n\nconst OfferTypeSchema = z.enum(['percent', 'fixed', 'trial', 'free_months']);\nconst OfferCadenceSchema = z.enum(['month', 'year']);\nconst OfferDurationSchema = z.enum(['once', 'forever', 'trial', 'free_months']);\nconst OfferStatusSchema = z.enum(['active', 'archived']);\nconst OfferRedemptionTypeSchema = z.enum(['signup', 'retention']);\n\nexport const OfferListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n});\n\nexport const OfferGetInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const OfferCreateInputSchema = z.object({\n name: z.string().min(1),\n code: z.string().min(1),\n displayTitle: z.string().optional(),\n displayDescription: z.string().optional(),\n type: OfferTypeSchema.optional(),\n cadence: OfferCadenceSchema.optional(),\n amount: z.number().int().min(0).optional(),\n duration: OfferDurationSchema.optional(),\n durationInMonths: z.number().int().min(1).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .nullable()\n .optional(),\n status: OfferStatusSchema.optional(),\n redemptionType: OfferRedemptionTypeSchema.optional(),\n tierId: z.string().min(1).optional(),\n});\n\nexport const OfferUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n name: z.string().min(1).optional(),\n code: z.string().min(1).optional(),\n displayTitle: z.string().optional(),\n displayDescription: z.string().optional(),\n type: OfferTypeSchema.optional(),\n cadence: OfferCadenceSchema.optional(),\n amount: z.number().int().min(0).optional(),\n duration: OfferDurationSchema.optional(),\n durationInMonths: z.number().int().min(1).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .nullable()\n .optional(),\n status: OfferStatusSchema.optional(),\n redemptionType: OfferRedemptionTypeSchema.optional(),\n tierId: z.string().min(1).optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.code !== undefined ||\n data.displayTitle !== undefined ||\n data.displayDescription !== undefined ||\n data.type !== undefined ||\n data.cadence !== undefined ||\n data.amount !== undefined ||\n data.duration !== undefined ||\n data.durationInMonths !== undefined ||\n data.currency !== undefined ||\n data.status !== undefined ||\n data.redemptionType !== undefined ||\n data.tierId !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const OfferBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.literal('update'),\n status: OfferStatusSchema.optional(),\n })\n .refine((data) => Boolean(data.status !== undefined), {\n message: 'Bulk update requires --status.',\n path: ['status'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { bulkOffers, createOffer, getOffer, listOffers, updateOffer } from '../lib/offers.js';\nimport {\n printJson,\n printOfferHuman,\n printOfferListHuman,\n printOperationStatsHuman,\n} from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport {\n OfferBulkInputSchema,\n OfferCreateInputSchema,\n OfferGetInputSchema,\n OfferListInputSchema,\n OfferUpdateInputSchema,\n} from '../schemas/offer.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerOfferCommands(program: Command): void {\n const offer = program.command('offer').description('Offer management');\n\n offer\n .command('list')\n .description('List offers')\n .option('--limit <numberOrAll>', 'Number of offers per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = OfferListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listOffers(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferListHuman(payload, global.color !== false);\n });\n\n offer\n .command('get <id>')\n .description('Get an offer by id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = OfferGetInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getOffer(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferHuman(payload);\n });\n\n offer\n .command('create')\n .description('Create an offer')\n .requiredOption('--name <name>', 'Offer name')\n .requiredOption('--code <code>', 'Offer code')\n .option('--display-title <title>', 'Display title')\n .option('--display-description <description>', 'Display description')\n .option('--type <type>', 'percent|fixed|trial|free_months')\n .option('--cadence <cadence>', 'month|year')\n .option('--amount <amount>', 'Numeric amount')\n .option('--duration <duration>', 'once|forever|trial|free_months')\n .option('--duration-in-months <months>', 'Duration in months')\n .option('--currency <codeOrNull>', '3-letter currency code or null')\n .option('--status <status>', 'active|archived')\n .option('--redemption-type <type>', 'signup|retention')\n .option('--tier-id <id>', 'Tier id')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = OfferCreateInputSchema.safeParse({\n name: options.name,\n code: options.code,\n displayTitle: options.displayTitle,\n displayDescription: options.displayDescription,\n type: options.type,\n cadence: options.cadence,\n amount: parseInteger(options.amount, 'amount'),\n duration: options.duration,\n durationInMonths: parseInteger(options.durationInMonths, 'duration-in-months'),\n currency: options.currency?.trim().toLowerCase() === 'null' ? null : options.currency,\n status: options.status,\n redemptionType: options.redemptionType,\n tierId: options.tierId,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createOffer(global, {\n name: parsed.data.name,\n code: parsed.data.code,\n display_title: parsed.data.displayTitle,\n display_description: parsed.data.displayDescription,\n type: parsed.data.type,\n cadence: parsed.data.cadence,\n amount: parsed.data.amount,\n duration: parsed.data.duration,\n duration_in_months: parsed.data.durationInMonths,\n currency: parsed.data.currency ? parsed.data.currency.toUpperCase() : parsed.data.currency,\n status: parsed.data.status,\n redemption_type: parsed.data.redemptionType,\n tier: parsed.data.tierId ? { id: parsed.data.tierId } : undefined,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferHuman(payload);\n });\n\n offer\n .command('update <id>')\n .description('Update an offer')\n .option('--name <name>', 'Offer name')\n .option('--code <code>', 'Offer code')\n .option('--display-title <title>', 'Display title')\n .option('--display-description <description>', 'Display description')\n .option('--type <type>', 'percent|fixed|trial|free_months')\n .option('--cadence <cadence>', 'month|year')\n .option('--amount <amount>', 'Numeric amount')\n .option('--duration <duration>', 'once|forever|trial|free_months')\n .option('--duration-in-months <months>', 'Duration in months')\n .option('--currency <codeOrNull>', '3-letter currency code or null')\n .option('--status <status>', 'active|archived')\n .option('--redemption-type <type>', 'signup|retention')\n .option('--tier-id <id>', 'Tier id')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = OfferUpdateInputSchema.safeParse({\n id,\n name: options.name,\n code: options.code,\n displayTitle: options.displayTitle,\n displayDescription: options.displayDescription,\n type: options.type,\n cadence: options.cadence,\n amount: parseInteger(options.amount, 'amount'),\n duration: options.duration,\n durationInMonths: parseInteger(options.durationInMonths, 'duration-in-months'),\n currency: options.currency?.trim().toLowerCase() === 'null' ? null : options.currency,\n status: options.status,\n redemptionType: options.redemptionType,\n tierId: options.tierId,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateOffer(global, parsed.data.id, {\n name: parsed.data.name,\n code: parsed.data.code,\n display_title: parsed.data.displayTitle,\n display_description: parsed.data.displayDescription,\n type: parsed.data.type,\n cadence: parsed.data.cadence,\n amount: parsed.data.amount,\n duration: parsed.data.duration,\n duration_in_months: parsed.data.durationInMonths,\n currency: parsed.data.currency ? parsed.data.currency.toUpperCase() : parsed.data.currency,\n status: parsed.data.status,\n redemption_type: parsed.data.redemptionType,\n tier: parsed.data.tierId ? { id: parsed.data.tierId } : undefined,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOfferHuman(payload);\n });\n\n offer\n .command('bulk')\n .description('Run bulk offer operations')\n .requiredOption('--filter <nql>', 'NQL filter to select offers')\n .requiredOption('--action <action>', 'update')\n .option('--status <status>', 'active|archived')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = OfferBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n status: options.status,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkOffers(global, {\n filter: parsed.data.filter,\n patch: {\n status: parsed.data.status,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk offer operation completed');\n });\n}\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printPageHuman, printPageListHuman } from '../lib/output.js';\nimport {\n bulkPages,\n copyPage,\n createPage,\n deletePage,\n getPage,\n listPages,\n updatePage,\n} from '../lib/pages.js';\nimport { parseBooleanFlag, parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n PageBulkInputSchema,\n PageCopyInputSchema,\n PageCreateInputSchema,\n PageDeleteInputSchema,\n PageGetInputSchema,\n PageListInputSchema,\n PageUpdateInputSchema,\n} from '../schemas/page.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nasync function readOptionalFile(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n\n return fs.readFile(filePath, 'utf8');\n}\n\nexport function registerPageCommands(program: Command): void {\n const page = program.command('page').description('Page management');\n\n page\n .command('list')\n .description('List pages')\n .option('--limit <numberOrAll>', 'Number of pages per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--status <status>', 'Page status filter')\n .option('--featured', 'Only featured pages')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = PageListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n status: options.status,\n featured: options.featured,\n include: options.include,\n fields: options.fields,\n order: options.order,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listPages(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageListHuman(payload, global.color !== false);\n });\n\n page\n .command('get [id]')\n .description('Get a page by id or slug')\n .option('--slug <slug>', 'Page slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const payload = await getPage(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n formats: parsed.data.formats,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageHuman(payload);\n });\n\n page\n .command('create')\n .description('Create a page')\n .requiredOption('--title <title>', 'Page title')\n .option('--status <status>', 'Page status', 'draft')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled pages')\n .option('--html <html>', 'Page HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--featured', 'Mark as featured')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageCreateInputSchema.safeParse({\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n featured: options.featured,\n visibility: options.visibility,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const html = parsed.data.html ?? htmlFromFile;\n const lexical = lexicalFromFile;\n const source = html ? 'html' : undefined;\n\n const payload = await createPage(\n global,\n {\n title: parsed.data.title,\n status: parsed.data.status,\n published_at: parsed.data.publishAt,\n html,\n lexical,\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n },\n source,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageHuman(payload);\n });\n\n page\n .command('update [id]')\n .description('Update a page by id or slug')\n .option('--slug <slug>', 'Page slug lookup')\n .option('--title <title>', 'Page title')\n .option('--status <status>', 'Page status')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled pages')\n .option('--html <html>', 'Page HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--featured <value>', 'true|false')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageUpdateInputSchema.safeParse({\n id,\n slug: options.slug,\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n featured: parseBooleanFlag(options.featured),\n visibility: options.visibility,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const html = parsed.data.html ?? htmlFromFile;\n const lexical = lexicalFromFile;\n const source = html ? 'html' : undefined;\n\n const payload = await updatePage(global, {\n id: parsed.data.id,\n slug: parsed.data.slug,\n patch: {\n title: parsed.data.title,\n status: parsed.data.status,\n published_at: parsed.data.publishAt,\n html,\n lexical,\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n },\n source,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPageHuman(payload);\n });\n\n page\n .command('delete <id>')\n .description('Delete a page')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete page '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deletePage(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted page '${parsed.data.id}'.`);\n });\n\n page\n .command('copy <id>')\n .description('Copy a page')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageCopyInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await copyPage(global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPageHuman(payload);\n });\n\n page\n .command('bulk')\n .description('Run bulk page operations')\n .requiredOption('--filter <nql>', 'NQL filter to select pages')\n .requiredOption('--action <action>', 'update|delete')\n .option('--status <status>', 'Status to set for bulk update')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PageBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n status: options.status,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkPages(global, {\n filter: parsed.data.filter,\n delete: parsed.data.action === 'delete',\n status: parsed.data.status,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n const stats = (\n (payload.bulk as Record<string, unknown> | undefined)?.meta as Record<string, unknown>\n )?.stats as Record<string, unknown> | undefined;\n console.log(\n `Bulk operation complete: ${String(stats?.successful ?? 0)} successful, ${String(stats?.unsuccessful ?? 0)} unsuccessful`,\n );\n });\n}\n","import { z } from 'zod';\n\nconst StatusSchema = z.enum(['draft', 'published', 'scheduled']);\nconst VisibilitySchema = z.enum(['public', 'members', 'paid', 'tiers']);\n\nfunction withSingleContentSource<T extends z.ZodTypeAny>(schema: T): T {\n return schema.superRefine((value, ctx) => {\n const data = value as Record<string, unknown>;\n const contentSources = [data.html, data.htmlFile, data.lexicalFile].filter(\n (entry) => entry !== undefined,\n );\n\n if (contentSources.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Use only one of --html, --html-file, or --lexical-file.',\n });\n }\n }) as T;\n}\n\nexport const PageListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: StatusSchema.optional(),\n featured: z.boolean().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PageGetInputSchema = z.object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PageCreateInputSchema = withSingleContentSource(\n z\n .object({\n title: z.string().min(1),\n status: StatusSchema.default('draft'),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n })\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PageUpdateInputSchema = withSingleContentSource(\n z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n title: z.string().min(1).optional(),\n status: StatusSchema.optional(),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n })\n .refine((data) => Boolean(data.id || data.slug), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.title ||\n data.status ||\n data.publishAt ||\n data.html ||\n data.htmlFile ||\n data.lexicalFile ||\n data.featured !== undefined ||\n data.visibility,\n ),\n {\n message: 'Provide at least one update field.',\n },\n )\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PageDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const PageCopyInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const PageBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']),\n status: StatusSchema.optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => data.action !== 'delete' || data.yes === true, {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n })\n .refine((data) => data.action !== 'update' || Boolean(data.status !== undefined), {\n message: 'Bulk update requires --status.',\n path: ['status'],\n });\n","import fs from 'node:fs/promises';\nimport type { Command } from 'commander';\nimport MarkdownIt from 'markdown-it';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printPostHuman, printPostListHuman } from '../lib/output.js';\nimport { parseBooleanFlag, parseCsv, parseInteger } from '../lib/parse.js';\nimport {\n bulkPosts,\n copyPost,\n createPost,\n deletePost,\n getPost,\n listPosts,\n publishPost,\n schedulePost,\n unschedulePost,\n updatePost,\n} from '../lib/posts.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n PostBulkInputSchema,\n PostCopyInputSchema,\n PostCreateInputSchema,\n PostDeleteInputSchema,\n PostGetInputSchema,\n PostListInputSchema,\n PostPublishInputSchema,\n PostScheduleInputSchema,\n PostUnscheduleInputSchema,\n PostUpdateInputSchema,\n} from '../schemas/post.js';\n\nconst markdownRenderer = new MarkdownIt({ html: true, linkify: true, breaks: true });\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nasync function readOptionalFile(filePath: string | undefined): Promise<string | undefined> {\n if (!filePath) {\n return undefined;\n }\n\n return fs.readFile(filePath, 'utf8');\n}\n\nasync function readOptionalStdin(enabled: boolean | undefined): Promise<string | undefined> {\n if (!enabled) {\n return undefined;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n }\n const value = Buffer.concat(chunks).toString('utf8').trim();\n return value.length > 0 ? value : undefined;\n}\n\nfunction wrapRawHtmlCard(html: string): string {\n return `<!--kg-card-begin: html-->\\n${html}\\n<!--kg-card-end: html-->`;\n}\n\nfunction asPostPayload(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object') {\n throw new GhstError('Invalid --from-json payload: expected JSON object.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const record = value as Record<string, unknown>;\n if (Array.isArray(record.posts) && record.posts.length > 0) {\n const first = record.posts[0];\n if (first && typeof first === 'object') {\n return first as Record<string, unknown>;\n }\n }\n\n return record;\n}\n\nasync function readOptionalPostJson(\n filePath: string | undefined,\n): Promise<Record<string, unknown>> {\n if (!filePath) {\n return {};\n }\n\n const payload = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return asPostPayload(payload);\n}\n\nfunction assignDefined(\n target: Record<string, unknown>,\n values: Record<string, unknown>,\n): Record<string, unknown> {\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) {\n target[key] = value;\n }\n }\n\n return target;\n}\n\nexport function registerPostCommands(program: Command): void {\n const post = program.command('post').description('Post management');\n\n post\n .command('list')\n .description('List posts')\n .option('--limit <numberOrAll>', 'Number of posts per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--status <status>', 'Post status filter')\n .option('--featured', 'Only featured posts')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = PostListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n status: options.status,\n featured: options.featured,\n include: options.include,\n fields: options.fields,\n order: options.order,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listPosts(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostListHuman(payload, global.color !== false);\n });\n\n post\n .command('get [id]')\n .description('Get a post by id or slug')\n .option('--slug <slug>', 'Post slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--formats <formats>', 'Return requested content formats')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n formats: options.formats,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const payload = await getPost(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n formats: parsed.data.formats,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('create')\n .description('Create a post')\n .option('--title <title>', 'Post title')\n .option('--status <status>', 'Post status')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled posts')\n .option('--html <html>', 'Post HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--markdown-file <path>', 'Path to Markdown file')\n .option('--markdown-stdin', 'Read Markdown content from stdin')\n .option('--html-raw-file <path>', 'Path to raw HTML file wrapped in an HTML card')\n .option('--from-json <path>', 'Read post payload from JSON file')\n .option('--tags <tags>', 'Comma separated tag names')\n .option('--authors <authors>', 'Comma separated author emails')\n .option('--featured', 'Mark as featured')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .option('--tier <slug>', 'Tier slug for tier visibility access')\n .option('--feature-image <url>', 'Feature image URL')\n .option('--excerpt <excerpt>', 'Custom excerpt')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .option('--og-title <title>', 'Open Graph title')\n .option('--og-image <url>', 'Open Graph image URL')\n .option('--code-injection-head <value>', 'Code injection head HTML')\n .option('--newsletter <slug>', 'Newsletter slug for published posts')\n .option('--email-only', 'Publish as email-only')\n .option('--email-segment <segment>', 'Email segment for publish email')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostCreateInputSchema.safeParse({\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n markdownFile: options.markdownFile,\n markdownStdin: parseBooleanFlag(options.markdownStdin),\n htmlRawFile: options.htmlRawFile,\n fromJson: options.fromJson,\n tags: options.tags,\n authors: options.authors,\n featured: parseBooleanFlag(options.featured),\n visibility: options.visibility,\n tier: options.tier,\n featureImage: options.featureImage,\n excerpt: options.excerpt,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n ogTitle: options.ogTitle,\n ogImage: options.ogImage,\n codeInjectionHead: options.codeInjectionHead,\n newsletter: options.newsletter,\n emailOnly: parseBooleanFlag(options.emailOnly),\n emailSegment: options.emailSegment,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const fromJson = await readOptionalPostJson(parsed.data.fromJson);\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const markdownFromFile = await readOptionalFile(parsed.data.markdownFile);\n const markdownFromStdin = await readOptionalStdin(parsed.data.markdownStdin);\n const rawHtmlFromFile = await readOptionalFile(parsed.data.htmlRawFile);\n\n const markdown = markdownFromStdin ?? markdownFromFile;\n const renderedMarkdown = markdown ? markdownRenderer.render(markdown) : undefined;\n const wrappedRawHtml = rawHtmlFromFile ? wrapRawHtmlCard(rawHtmlFromFile) : undefined;\n\n const html =\n parsed.data.html ??\n htmlFromFile ??\n wrappedRawHtml ??\n renderedMarkdown ??\n (typeof fromJson.html === 'string' ? fromJson.html : undefined);\n const lexical =\n lexicalFromFile ??\n (typeof fromJson.lexical === 'string' ? (fromJson.lexical as string) : undefined);\n const source = html ? 'html' : undefined;\n\n const createPayload = assignDefined(\n { ...fromJson },\n {\n title: parsed.data.title,\n status:\n parsed.data.status ??\n (typeof fromJson.status === 'string' ? fromJson.status : undefined) ??\n 'draft',\n published_at: parsed.data.publishAt,\n html,\n lexical,\n tags: parseCsv(parsed.data.tags),\n authors: parseCsv(parsed.data.authors),\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n tiers: parsed.data.tier ? [{ slug: parsed.data.tier }] : undefined,\n feature_image: parsed.data.featureImage,\n custom_excerpt: parsed.data.excerpt,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n og_title: parsed.data.ogTitle,\n og_image: parsed.data.ogImage,\n codeinjection_head: parsed.data.codeInjectionHead,\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n },\n );\n\n const payload = await createPost(global, createPayload, source);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('update [id]')\n .description('Update a post by id or slug')\n .option('--slug <slug>', 'Post slug lookup')\n .option('--title <title>', 'Post title')\n .option('--status <status>', 'Post status')\n .option('--publish-at <datetime>', 'Publish date-time for scheduled posts')\n .option('--html <html>', 'Post HTML content')\n .option('--html-file <path>', 'Path to HTML file')\n .option('--lexical-file <path>', 'Path to Lexical JSON file')\n .option('--markdown-file <path>', 'Path to Markdown file')\n .option('--markdown-stdin', 'Read Markdown content from stdin')\n .option('--html-raw-file <path>', 'Path to raw HTML file wrapped in an HTML card')\n .option('--from-json <path>', 'Read post patch from JSON file')\n .option('--tags <tags>', 'Comma separated tag names')\n .option('--authors <authors>', 'Comma separated author emails')\n .option('--featured <value>', 'true|false')\n .option('--visibility <visibility>', 'public|members|paid|tiers')\n .option('--tier <slug>', 'Tier slug for tier visibility access')\n .option('--feature-image <url>', 'Feature image URL')\n .option('--excerpt <excerpt>', 'Custom excerpt')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .option('--og-title <title>', 'Open Graph title')\n .option('--og-image <url>', 'Open Graph image URL')\n .option('--code-injection-head <value>', 'Code injection head HTML')\n .option('--newsletter <slug>', 'Newsletter slug')\n .option('--email-only <value>', 'true|false')\n .option('--email-segment <segment>', 'Email segment')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostUpdateInputSchema.safeParse({\n id,\n slug: options.slug,\n title: options.title,\n status: options.status,\n publishAt: options.publishAt,\n html: options.html,\n htmlFile: options.htmlFile,\n lexicalFile: options.lexicalFile,\n markdownFile: options.markdownFile,\n markdownStdin: parseBooleanFlag(options.markdownStdin),\n htmlRawFile: options.htmlRawFile,\n fromJson: options.fromJson,\n tags: options.tags,\n authors: options.authors,\n featured: parseBooleanFlag(options.featured),\n visibility: options.visibility,\n tier: options.tier,\n featureImage: options.featureImage,\n excerpt: options.excerpt,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n ogTitle: options.ogTitle,\n ogImage: options.ogImage,\n codeInjectionHead: options.codeInjectionHead,\n newsletter: options.newsletter,\n emailOnly: parseBooleanFlag(options.emailOnly),\n emailSegment: options.emailSegment,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const fromJson = await readOptionalPostJson(parsed.data.fromJson);\n const htmlFromFile = await readOptionalFile(parsed.data.htmlFile);\n const lexicalFromFile = await readOptionalFile(parsed.data.lexicalFile);\n const markdownFromFile = await readOptionalFile(parsed.data.markdownFile);\n const markdownFromStdin = await readOptionalStdin(parsed.data.markdownStdin);\n const rawHtmlFromFile = await readOptionalFile(parsed.data.htmlRawFile);\n\n const markdown = markdownFromStdin ?? markdownFromFile;\n const renderedMarkdown = markdown ? markdownRenderer.render(markdown) : undefined;\n const wrappedRawHtml = rawHtmlFromFile ? wrapRawHtmlCard(rawHtmlFromFile) : undefined;\n\n const html =\n parsed.data.html ??\n htmlFromFile ??\n wrappedRawHtml ??\n renderedMarkdown ??\n (typeof fromJson.html === 'string' ? fromJson.html : undefined);\n const lexical =\n lexicalFromFile ??\n (typeof fromJson.lexical === 'string' ? (fromJson.lexical as string) : undefined);\n const source = html ? 'html' : undefined;\n\n const patch = assignDefined(\n { ...fromJson },\n {\n title: parsed.data.title,\n status: parsed.data.status,\n published_at: parsed.data.publishAt,\n html,\n lexical,\n tags: parseCsv(parsed.data.tags),\n authors: parseCsv(parsed.data.authors),\n featured: parsed.data.featured,\n visibility: parsed.data.visibility,\n tiers: parsed.data.tier ? [{ slug: parsed.data.tier }] : undefined,\n feature_image: parsed.data.featureImage,\n custom_excerpt: parsed.data.excerpt,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n og_title: parsed.data.ogTitle,\n og_image: parsed.data.ogImage,\n codeinjection_head: parsed.data.codeInjectionHead,\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n },\n );\n\n const payload = await updatePost(global, {\n id: parsed.data.id,\n slug: parsed.data.slug,\n patch,\n source,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('delete [id]')\n .description('Delete a post')\n .option('--filter <nql>', 'NQL filter to delete matching posts')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostDeleteInputSchema.safeParse({\n id,\n filter: options.filter,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const label = parsed.data.filter\n ? `Delete posts matching '${parsed.data.filter}'`\n : `Delete post '${parsed.data.id}'`;\n const ok = await confirm(`${label}? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n if (parsed.data.filter) {\n const payload = await bulkPosts(global, {\n filter: parsed.data.filter,\n delete: true,\n });\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n const stats = (payload.bulk as Record<string, unknown> | undefined)?.meta as\n | Record<string, unknown>\n | undefined;\n const statValues = (stats?.stats as Record<string, unknown> | undefined) ?? {};\n console.log(\n `Bulk operation complete: ${String(statValues.successful ?? 0)} successful, ${String(statValues.unsuccessful ?? 0)} unsuccessful`,\n );\n return;\n }\n\n await deletePost(global, parsed.data.id ?? '');\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id ?? null });\n return;\n }\n\n console.log(`Deleted post '${parsed.data.id ?? ''}'.`);\n });\n\n post\n .command('publish <id>')\n .description('Publish a post')\n .option('--newsletter <slug>', 'Newsletter slug')\n .option('--email-segment <segment>', 'Email segment')\n .option('--email-only', 'Email only publish')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostPublishInputSchema.safeParse({\n id,\n newsletter: options.newsletter,\n emailOnly: parseBooleanFlag(options.emailOnly),\n emailSegment: options.emailSegment,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await publishPost(global, parsed.data.id, {\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printPostHuman(payload);\n });\n\n post\n .command('schedule <id>')\n .description('Schedule a post')\n .requiredOption('--at <datetime>', 'ISO datetime for scheduled publish')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostScheduleInputSchema.safeParse({\n id,\n at: options.at,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await schedulePost(global, parsed.data.id, parsed.data.at);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPostHuman(payload);\n });\n\n post\n .command('unschedule <id>')\n .description('Unschedule a post')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostUnscheduleInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await unschedulePost(global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPostHuman(payload);\n });\n\n post\n .command('copy <id>')\n .description('Copy a post')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostCopyInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await copyPost(global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printPostHuman(payload);\n });\n\n post\n .command('bulk')\n .description('Run bulk post operations')\n .requiredOption('--filter <nql>', 'NQL filter to select posts')\n .option('--action <action>', 'update|delete')\n .option('--update', 'Alias for --action update')\n .option('--delete', 'Alias for --action delete')\n .option('--status <status>', 'Status to set for bulk update')\n .option('--tags <tags>', 'Comma separated tags for bulk update')\n .option('--add-tag <tags>', 'Comma separated tags to add to existing post tags')\n .option('--authors <authors>', 'Comma separated author emails for bulk update')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n update: parseBooleanFlag(options.update),\n delete: parseBooleanFlag(options.delete),\n status: options.status,\n tags: options.tags,\n addTag: options.addTag,\n authors: options.authors,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const action = parsed.data.action ?? (parsed.data.delete ? 'delete' : 'update');\n const payload = await bulkPosts(global, {\n filter: parsed.data.filter,\n delete: action === 'delete',\n status: parsed.data.status,\n tags: parseCsv(parsed.data.tags),\n addTags: parseCsv(parsed.data.addTag),\n authors: parseCsv(parsed.data.authors),\n });\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n const stats = (payload.bulk as Record<string, unknown> | undefined)?.meta as\n | Record<string, unknown>\n | undefined;\n const statValues = (stats?.stats as Record<string, unknown> | undefined) ?? {};\n console.log(\n `Bulk operation complete: ${String(statValues.successful ?? 0)} successful, ${String(statValues.unsuccessful ?? 0)} unsuccessful`,\n );\n });\n}\n","import { z } from 'zod';\n\nconst StatusSchema = z.enum(['draft', 'published', 'scheduled']);\nconst VisibilitySchema = z.enum(['public', 'members', 'paid', 'tiers']);\n\nfunction withSingleContentSource<T extends z.ZodTypeAny>(schema: T): T {\n return schema.superRefine((value, ctx) => {\n const data = value as Record<string, unknown>;\n const contentSources = [\n data.html,\n data.htmlFile,\n data.lexicalFile,\n data.markdownFile,\n data.markdownStdin,\n data.htmlRawFile,\n ].filter((entry) => entry !== undefined && entry !== false);\n\n if (contentSources.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n 'Use only one content source: --html, --html-file, --lexical-file, --markdown-file, --markdown-stdin, or --html-raw-file.',\n });\n }\n }) as T;\n}\n\nexport const PostListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n status: StatusSchema.optional(),\n featured: z.boolean().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PostGetInputSchema = z.object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n formats: z.string().optional(),\n});\n\nexport const PostCreateInputSchema = withSingleContentSource(\n z\n .object({\n title: z.string().min(1).optional(),\n status: StatusSchema.optional(),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n markdownFile: z.string().min(1).optional(),\n markdownStdin: z.boolean().optional(),\n htmlRawFile: z.string().min(1).optional(),\n fromJson: z.string().min(1).optional(),\n tags: z.string().optional(),\n authors: z.string().optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n tier: z.string().min(1).optional(),\n featureImage: z.string().url().optional(),\n excerpt: z.string().optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().url().optional(),\n codeInjectionHead: z.string().optional(),\n newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\n })\n .refine((data) => Boolean(data.title || data.fromJson), {\n message: 'Provide --title or --from-json.',\n path: ['title'],\n })\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PostUpdateInputSchema = withSingleContentSource(\n z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n title: z.string().min(1).optional(),\n status: StatusSchema.optional(),\n publishAt: z.string().datetime().optional(),\n html: z.string().optional(),\n htmlFile: z.string().min(1).optional(),\n lexicalFile: z.string().min(1).optional(),\n markdownFile: z.string().min(1).optional(),\n markdownStdin: z.boolean().optional(),\n htmlRawFile: z.string().min(1).optional(),\n fromJson: z.string().min(1).optional(),\n tags: z.string().optional(),\n authors: z.string().optional(),\n featured: z.boolean().optional(),\n visibility: VisibilitySchema.optional(),\n tier: z.string().min(1).optional(),\n featureImage: z.string().url().optional(),\n excerpt: z.string().optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().url().optional(),\n codeInjectionHead: z.string().optional(),\n newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.slug), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.title ||\n data.status ||\n data.publishAt ||\n data.html ||\n data.htmlFile ||\n data.lexicalFile ||\n data.markdownFile ||\n data.markdownStdin ||\n data.htmlRawFile ||\n data.fromJson ||\n data.tags ||\n data.authors ||\n data.featured !== undefined ||\n data.visibility ||\n data.tier ||\n data.featureImage ||\n data.excerpt ||\n data.metaTitle ||\n data.metaDescription ||\n data.ogTitle ||\n data.ogImage ||\n data.codeInjectionHead ||\n data.newsletter ||\n data.emailOnly !== undefined ||\n data.emailSegment,\n ),\n {\n message: 'Provide at least one update field.',\n },\n )\n .refine((data) => !(data.status === 'scheduled' && !data.publishAt), {\n message: 'publish-at is required when status is scheduled',\n path: ['publishAt'],\n }),\n);\n\nexport const PostDeleteInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n filter: z.string().min(1).optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => Boolean(data.id || data.filter), {\n message: 'Provide <id> or --filter.',\n path: ['id'],\n })\n .refine((data) => !(data.id && data.filter), {\n message: 'Use either <id> or --filter, not both.',\n path: ['id'],\n });\n\nexport const PostPublishInputSchema = z.object({\n id: z.string().min(1),\n newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\n});\n\nexport const PostScheduleInputSchema = z.object({\n id: z.string().min(1),\n at: z.string().datetime(),\n});\n\nexport const PostUnscheduleInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const PostCopyInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const PostBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']).optional(),\n update: z.boolean().optional(),\n delete: z.boolean().optional(),\n status: StatusSchema.optional(),\n tags: z.string().optional(),\n addTag: z.string().optional(),\n authors: z.string().optional(),\n yes: z.boolean().optional(),\n })\n .refine(\n (data) => {\n const selected = [\n data.action !== undefined,\n data.update === true,\n data.delete === true,\n ].filter(Boolean);\n return selected.length === 1;\n },\n {\n message: 'Select exactly one action via --action, --update, or --delete.',\n path: ['action'],\n },\n )\n .refine(\n (data) =>\n (data.action ?? (data.delete ? 'delete' : 'update')) !== 'delete' || data.yes === true,\n {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n },\n )\n .refine(\n (data) => {\n const action = data.action ?? (data.delete ? 'delete' : 'update');\n if (action !== 'update') {\n return true;\n }\n\n return Boolean(\n data.status !== undefined ||\n data.tags !== undefined ||\n data.addTag !== undefined ||\n data.authors !== undefined,\n );\n },\n {\n message: 'Bulk update requires at least one of --status, --tags, --add-tag, or --authors.',\n path: ['status'],\n },\n );\n","import { z } from 'zod';\n\nexport const SettingGetInputSchema = z.object({\n key: z.string().min(1),\n});\n\nexport const SettingSetInputSchema = z.object({\n key: z.string().min(1),\n value: z.string().min(1),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printSettingHuman, printSettingListHuman } from '../lib/output.js';\nimport { getSetting, listSettings, setSetting } from '../lib/settings.js';\nimport { SettingGetInputSchema, SettingSetInputSchema } from '../schemas/setting.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction parseSettingValue(value: string): unknown {\n const normalized = value.trim();\n\n if (normalized === 'null') {\n return null;\n }\n\n if (normalized === 'true') {\n return true;\n }\n\n if (normalized === 'false') {\n return false;\n }\n\n if (/^-?\\d+(?:\\.\\d+)?$/.test(normalized)) {\n return Number(normalized);\n }\n\n if (\n (normalized.startsWith('{') && normalized.endsWith('}')) ||\n (normalized.startsWith('[') && normalized.endsWith(']'))\n ) {\n try {\n return JSON.parse(normalized) as unknown;\n } catch {\n throw new GhstError('Invalid JSON value.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n }\n\n return value;\n}\n\nexport function registerSettingCommands(program: Command): void {\n const setting = program.command('setting').description('Settings management');\n\n setting\n .command('list')\n .description('List settings')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await listSettings(global);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSettingListHuman(payload, global.color !== false);\n });\n\n setting\n .command('get <key>')\n .description('Get a setting by key')\n .action(async (key: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SettingGetInputSchema.safeParse({ key });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSetting(global, parsed.data.key);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSettingHuman(payload);\n });\n\n setting\n .command('set <key> <value>')\n .description('Set a setting value')\n .action(async (key: string, value: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SettingSetInputSchema.safeParse({\n key,\n value,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await setSetting(\n global,\n parsed.data.key,\n parseSettingValue(parsed.data.value),\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSettingHuman(payload);\n });\n}\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { printJson, printSiteHuman } from '../lib/output.js';\nimport { getSiteInfo } from '../lib/site.js';\n\nexport function registerSiteCommands(program: Command): void {\n const site = program.command('site').description('Site management');\n\n site\n .command('info')\n .description('Get site information')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await getSiteInfo(global);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printSiteHuman(payload);\n });\n}\n","import { z } from 'zod';\n\nexport const TagListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const TagGetInputSchema = z.object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n});\n\nexport const TagCreateInputSchema = z.object({\n name: z.string().min(1),\n slug: z.string().min(1).optional(),\n description: z.string().optional(),\n featureImage: z.string().url().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n visibility: z.enum(['public', 'internal']).optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n});\n\nexport const TagUpdateInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slugLookup: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n description: z.string().optional(),\n featureImage: z.string().url().optional(),\n accentColor: z\n .string()\n .regex(/^#[0-9A-Fa-f]{6}$/)\n .optional(),\n visibility: z.enum(['public', 'internal']).optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n })\n .refine((data) => Boolean(data.id || data.slugLookup), {\n message: 'Provide an id argument or --slug.',\n path: ['id'],\n })\n .refine(\n (data) =>\n Boolean(\n data.name ||\n data.slug ||\n data.description ||\n data.featureImage ||\n data.accentColor ||\n data.visibility ||\n data.metaTitle ||\n data.metaDescription,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const TagDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const TagBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.enum(['update', 'delete']),\n visibility: z.enum(['public', 'internal']).optional(),\n yes: z.boolean().optional(),\n })\n .refine((data) => data.action !== 'delete' || data.yes === true, {\n message: 'Bulk delete requires --yes.',\n path: ['yes'],\n })\n .refine((data) => data.action !== 'update' || Boolean(data.visibility !== undefined), {\n message: 'Bulk update requires --visibility.',\n path: ['visibility'],\n });\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printTagHuman, printTagListHuman } from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { bulkTags, createTag, deleteTag, getTag, listTags, updateTag } from '../lib/tags.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n TagBulkInputSchema,\n TagCreateInputSchema,\n TagDeleteInputSchema,\n TagGetInputSchema,\n TagListInputSchema,\n TagUpdateInputSchema,\n} from '../schemas/tag.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerTagCommands(program: Command): void {\n const tag = program.command('tag').description('Tag management');\n\n tag\n .command('list')\n .description('List tags')\n .option('--limit <numberOrAll>', 'Number of tags per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = TagListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listTags(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagListHuman(payload, global.color !== false);\n });\n\n tag\n .command('get [id]')\n .description('Get a tag by id or slug')\n .option('--slug <slug>', 'Tag slug')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagGetInputSchema.safeParse({\n id,\n slug: options.slug,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const lookup = parsed.data.slug ?? parsed.data.id;\n if (!lookup) {\n throw new GhstError('Provide an id argument or --slug.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const payload = await getTag(global, lookup, {\n bySlug: Boolean(parsed.data.slug),\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagHuman(payload);\n });\n\n tag\n .command('create')\n .description('Create a tag')\n .requiredOption('--name <name>', 'Tag name')\n .option('--slug <slug>', 'Tag slug')\n .option('--description <description>', 'Tag description')\n .option('--feature-image <url>', 'Tag feature image URL')\n .option('--accent-color <hex>', 'Tag accent color (hex)')\n .option('--visibility <visibility>', 'public|internal')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagCreateInputSchema.safeParse({\n name: options.name,\n slug: options.slug,\n description: options.description,\n featureImage: options.featureImage,\n accentColor: options.accentColor,\n visibility: options.visibility,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createTag(global, {\n name: parsed.data.name,\n slug: parsed.data.slug,\n description: parsed.data.description,\n feature_image: parsed.data.featureImage,\n accent_color: parsed.data.accentColor,\n visibility: parsed.data.visibility,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagHuman(payload);\n });\n\n tag\n .command('update [id]')\n .description('Update a tag by id or slug')\n .option('--slug <slug>', 'Tag slug lookup')\n .option('--name <name>', 'Tag name')\n .option('--new-slug <slug>', 'New tag slug')\n .option('--description <description>', 'Tag description')\n .option('--feature-image <url>', 'Tag feature image URL')\n .option('--accent-color <hex>', 'Tag accent color (hex)')\n .option('--visibility <visibility>', 'public|internal')\n .option('--meta-title <title>', 'Meta title')\n .option('--meta-description <description>', 'Meta description')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagUpdateInputSchema.safeParse({\n id,\n slugLookup: options.slug,\n name: options.name,\n slug: options.newSlug,\n description: options.description,\n featureImage: options.featureImage,\n accentColor: options.accentColor,\n visibility: options.visibility,\n metaTitle: options.metaTitle,\n metaDescription: options.metaDescription,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateTag(global, {\n id: parsed.data.id,\n slug: parsed.data.slugLookup,\n patch: {\n name: parsed.data.name,\n slug: parsed.data.slug,\n description: parsed.data.description,\n feature_image: parsed.data.featureImage,\n accent_color: parsed.data.accentColor,\n visibility: parsed.data.visibility,\n meta_title: parsed.data.metaTitle,\n meta_description: parsed.data.metaDescription,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTagHuman(payload);\n });\n\n tag\n .command('delete <id>')\n .description('Delete a tag')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete tag '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteTag(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted tag '${parsed.data.id}'.`);\n });\n\n tag\n .command('bulk')\n .description('Run bulk tag operations')\n .requiredOption('--filter <nql>', 'NQL filter to select tags')\n .requiredOption('--action <action>', 'update|delete')\n .option('--visibility <visibility>', 'Visibility for bulk update (public|internal)')\n .option('--yes', 'Confirm bulk delete')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TagBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n visibility: options.visibility,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkTags(global, {\n filter: parsed.data.filter,\n delete: parsed.data.action === 'delete',\n visibility: parsed.data.visibility,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n const stats = (\n (payload.bulk as Record<string, unknown> | undefined)?.meta as Record<string, unknown>\n )?.stats as Record<string, unknown> | undefined;\n console.log(\n `Bulk operation complete: ${String(stats?.successful ?? 0)} successful, ${String(stats?.unsuccessful ?? 0)} unsuccessful`,\n );\n });\n}\n","import { spawn } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printThemeHuman, printThemeListHuman } from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { runThemeDev } from '../lib/theme-dev.js';\nimport { activateTheme, listThemes, uploadTheme } from '../lib/themes.js';\nimport {\n ThemeActivateInputSchema,\n ThemeDevInputSchema,\n ThemeUploadInputSchema,\n ThemeValidateInputSchema,\n} from '../schemas/theme.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nasync function zipDirectory(directoryPath: string): Promise<string> {\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ghst-theme-'));\n const zipPath = path.join(tempDir, `${path.basename(directoryPath)}.zip`);\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn('zip', ['-r', zipPath, '.'], {\n cwd: directoryPath,\n stdio: 'ignore',\n });\n\n child.on('error', (error) => reject(error));\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`zip command failed with code ${code}`));\n });\n });\n\n return zipPath;\n}\n\nasync function validateTheme(targetPath: string): Promise<Record<string, unknown>> {\n const gscanModule = (await import('gscan')) as {\n default?: {\n check?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n checkZip?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n };\n check?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n checkZip?: (target: string, options?: Record<string, unknown>) => Promise<unknown>;\n };\n\n const gscan = gscanModule.default ?? gscanModule;\n const stat = await fs.stat(targetPath);\n if (stat.isDirectory()) {\n const result = await gscan.check?.(targetPath, {\n checkVersion: 'v6',\n });\n return (result as Record<string, unknown>) ?? {};\n }\n\n const result = await gscan.checkZip?.(targetPath, {\n checkVersion: 'v6',\n });\n return (result as Record<string, unknown>) ?? {};\n}\n\nfunction getValidationErrorCount(result: Record<string, unknown>): number {\n const nested = (result.results as Record<string, unknown> | undefined) ?? {};\n\n const fromNestedError = nested.error;\n if (Array.isArray(fromNestedError)) {\n return fromNestedError.length;\n }\n\n if (\n fromNestedError &&\n typeof fromNestedError === 'object' &&\n Array.isArray((fromNestedError as { all?: unknown[] }).all)\n ) {\n return ((fromNestedError as { all?: unknown[] }).all ?? []).length;\n }\n\n const fromNestedErrors = nested.errors;\n if (Array.isArray(fromNestedErrors)) {\n return fromNestedErrors.length;\n }\n\n if (Array.isArray(result.error)) {\n return result.error.length;\n }\n\n if (Array.isArray(result.errors)) {\n return result.errors.length;\n }\n\n return 0;\n}\n\nlet themeValidatorForTests: ((targetPath: string) => Promise<Record<string, unknown>>) | null =\n null;\nlet themeDevRunnerForTests:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n path: string;\n watch?: boolean;\n activate?: boolean;\n debounceMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<Record<string, unknown>>)\n | null = null;\n\nexport function setThemeValidatorForTests(\n validator: ((targetPath: string) => Promise<Record<string, unknown>>) | null,\n): void {\n themeValidatorForTests = validator;\n}\n\nexport function setThemeDevRunnerForTests(\n runner:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n path: string;\n watch?: boolean;\n activate?: boolean;\n debounceMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<Record<string, unknown>>)\n | null,\n): void {\n themeDevRunnerForTests = runner;\n}\n\nexport function registerThemeCommands(program: Command): void {\n const theme = program.command('theme').description('Theme management');\n\n theme\n .command('list')\n .description('List themes')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await listThemes(global);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printThemeListHuman(payload, global.color !== false);\n });\n\n theme\n .command('upload <pathArg>')\n .description('Upload a theme zip or directory (with --zip)')\n .option('--zip', 'Zip a directory before upload')\n .option('--activate', 'Activate uploaded theme when possible')\n .action(async (pathArg: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeUploadInputSchema.safeParse({\n path: pathArg,\n zip: options.zip,\n activate: options.activate,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const stat = await fs.stat(parsed.data.path);\n let uploadPath = parsed.data.path;\n if (stat.isDirectory()) {\n if (!parsed.data.zip) {\n throw new GhstError(\n 'Theme path is a directory. Pass --zip to archive it before upload.',\n {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n },\n );\n }\n\n uploadPath = await zipDirectory(parsed.data.path);\n }\n\n const payload = await uploadTheme(global, uploadPath);\n\n if (parsed.data.activate) {\n const themes = Array.isArray(payload.themes)\n ? (payload.themes as Array<Record<string, unknown>>)\n : [];\n const uploadedTheme = themes[0] ?? payload;\n const name = String(uploadedTheme.name ?? '').trim();\n if (name) {\n await activateTheme(global, name);\n }\n }\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printThemeHuman(payload);\n });\n\n theme\n .command('activate <name>')\n .description('Activate a theme')\n .action(async (name: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeActivateInputSchema.safeParse({ name });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await activateTheme(global, parsed.data.name);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printThemeHuman(payload);\n });\n\n theme\n .command('validate <pathArg>')\n .description('Validate a theme zip or directory with gscan')\n .action(async (pathArg: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeValidateInputSchema.safeParse({ path: pathArg });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const result = themeValidatorForTests\n ? await themeValidatorForTests(parsed.data.path)\n : await validateTheme(parsed.data.path);\n const errorCount = getValidationErrorCount(result);\n\n if (global.json) {\n printJson(result, global.jq);\n } else {\n console.log(`Theme validation completed with ${errorCount} error(s).`);\n }\n\n if (errorCount > 0) {\n throw new GhstError(`Theme validation failed with ${errorCount} error(s).`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n });\n\n theme\n .command('dev <pathArg>')\n .description('Watch a theme directory and auto-upload on changes')\n .option('--watch', 'Keep watching for changes')\n .option('--activate', 'Activate after successful uploads')\n .option('--debounce-ms <ms>', 'Debounce delay before upload')\n .action(async (pathArg: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = ThemeDevInputSchema.safeParse({\n path: pathArg,\n watch: options.watch,\n activate: options.activate,\n debounceMs: parseInteger(options.debounceMs, 'debounce-ms'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const runner = themeDevRunnerForTests ?? runThemeDev;\n const payload = await runner(global, {\n path: parsed.data.path,\n watch: parsed.data.watch,\n activate: parsed.data.activate,\n debounceMs: parsed.data.debounceMs,\n onEvent: (event) => {\n if (global.json) {\n console.log(JSON.stringify(event));\n } else if (event.type === 'uploaded') {\n const source = String(event.source ?? 'unknown');\n const activeTheme = String(event.activeTheme ?? '');\n if (activeTheme) {\n console.log(`Uploaded (${source}) and activated '${activeTheme}'.`);\n } else {\n console.log(`Uploaded (${source}).`);\n }\n } else if (event.type === 'error') {\n console.error(`Theme dev upload error: ${String(event.message ?? '')}`);\n }\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n printThemeHuman(payload);\n });\n}\n","import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport fsPromises from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { ExitCode, GhstError } from './errors.js';\nimport { activateTheme, uploadTheme } from './themes.js';\nimport type { GlobalOptions } from './types.js';\n\ninterface ThemeDevOptions {\n path: string;\n watch?: boolean;\n activate?: boolean;\n debounceMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n}\n\ninterface UploadResult {\n payload: Record<string, unknown>;\n activeTheme?: string;\n}\n\nasync function zipDirectory(directoryPath: string): Promise<string> {\n const tempDir = await fsPromises.mkdtemp(path.join(os.tmpdir(), 'ghst-theme-dev-'));\n const zipPath = path.join(tempDir, `${path.basename(directoryPath)}.zip`);\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn('zip', ['-r', zipPath, '.'], {\n cwd: directoryPath,\n stdio: 'ignore',\n });\n\n child.on('error', (error) => reject(error));\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`zip command failed with code ${code}`));\n });\n });\n\n return zipPath;\n}\n\nfunction getUploadedThemeName(payload: Record<string, unknown>): string | undefined {\n const themes = Array.isArray(payload.themes)\n ? (payload.themes as Array<Record<string, unknown>>)\n : [];\n const uploaded = themes[0] ?? payload;\n const name = String(uploaded.name ?? '').trim();\n return name || undefined;\n}\n\nasync function uploadAndMaybeActivate(\n global: GlobalOptions,\n themePath: string,\n activate: boolean,\n): Promise<UploadResult> {\n const archivePath = await zipDirectory(themePath);\n const payload = await uploadTheme(global, archivePath);\n\n if (!activate) {\n return { payload };\n }\n\n const uploadedThemeName = getUploadedThemeName(payload);\n if (!uploadedThemeName) {\n return { payload };\n }\n\n await activateTheme(global, uploadedThemeName);\n return {\n payload,\n activeTheme: uploadedThemeName,\n };\n}\n\nexport async function runThemeDev(\n global: GlobalOptions,\n options: ThemeDevOptions,\n): Promise<Record<string, unknown>> {\n const stat = await fsPromises.stat(options.path).catch(() => null);\n if (!stat || !stat.isDirectory()) {\n throw new GhstError('theme dev requires a directory path.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const debounceMs = options.debounceMs ?? 500;\n const initial = await uploadAndMaybeActivate(global, options.path, options.activate === true);\n options.onEvent?.({\n type: 'uploaded',\n source: 'initial',\n activeTheme: initial.activeTheme,\n });\n\n if (!options.watch) {\n return initial.payload;\n }\n\n const watcher = fs.watch(options.path, { recursive: true });\n let timer: NodeJS.Timeout | null = null;\n let running = false;\n let queued = false;\n let closed = false;\n let onFailure: ((error: unknown, source: string) => void) | null = null;\n\n const runQueuedUpload = async (source: string): Promise<void> => {\n if (running || closed) {\n queued = true;\n return;\n }\n\n running = true;\n try {\n const next = await uploadAndMaybeActivate(global, options.path, options.activate === true);\n options.onEvent?.({\n type: 'uploaded',\n source,\n activeTheme: next.activeTheme,\n });\n } catch (error) {\n options.onEvent?.({\n type: 'error',\n source,\n message: (error as Error).message,\n });\n onFailure?.(error, source);\n } finally {\n running = false;\n if (queued && !closed) {\n queued = false;\n await runQueuedUpload('queued');\n }\n }\n };\n\n watcher.on('change', (_eventType, filename) => {\n options.onEvent?.({\n type: 'change',\n file: typeof filename === 'string' ? filename : undefined,\n });\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => {\n void runQueuedUpload('watch');\n }, debounceMs);\n });\n\n await new Promise<void>((resolve, reject) => {\n const finalize = (error?: Error) => {\n if (closed) {\n return;\n }\n\n closed = true;\n if (timer) {\n clearTimeout(timer);\n }\n watcher.close();\n process.off('SIGINT', onSigint);\n process.off('SIGTERM', onSigterm);\n onFailure = null;\n\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n };\n\n const onSigint = () => finalize();\n const onSigterm = () => finalize();\n\n onFailure = (error) => {\n const normalized = error instanceof Error ? error : new Error(String(error));\n finalize(normalized);\n };\n\n watcher.on('error', (error) => {\n onFailure?.(error, 'watcher');\n });\n\n process.on('SIGINT', onSigint);\n process.on('SIGTERM', onSigterm);\n });\n\n return initial.payload;\n}\n","import { z } from 'zod';\n\nexport const ThemeUploadInputSchema = z.object({\n path: z.string().min(1),\n zip: z.boolean().optional(),\n activate: z.boolean().optional(),\n});\n\nexport const ThemeActivateInputSchema = z.object({\n name: z.string().min(1),\n});\n\nexport const ThemeValidateInputSchema = z.object({\n path: z.string().min(1),\n});\n\nexport const ThemeDevInputSchema = z.object({\n path: z.string().min(1),\n watch: z.boolean().optional(),\n activate: z.boolean().optional(),\n debounceMs: z.number().int().positive().max(30_000).optional(),\n});\n","import { z } from 'zod';\n\nconst TierTypeSchema = z.enum(['free', 'paid']);\nconst TierVisibilitySchema = z.enum(['public', 'none']);\n\nexport const TierListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const TierGetInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const TierCreateInputSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n active: z.boolean().optional(),\n type: TierTypeSchema.optional(),\n visibility: TierVisibilitySchema.optional(),\n monthlyPrice: z.number().int().min(0).optional(),\n yearlyPrice: z.number().int().min(0).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .optional(),\n trialDays: z.number().int().min(0).nullable().optional(),\n benefits: z.string().optional(),\n});\n\nexport const TierUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n name: z.string().min(1).optional(),\n description: z.string().optional(),\n active: z.boolean().optional(),\n type: TierTypeSchema.optional(),\n visibility: TierVisibilitySchema.optional(),\n monthlyPrice: z.number().int().min(0).optional(),\n yearlyPrice: z.number().int().min(0).optional(),\n currency: z\n .string()\n .length(3)\n .regex(/^[A-Za-z]{3}$/)\n .optional(),\n trialDays: z.number().int().min(0).nullable().optional(),\n benefits: z.string().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.name !== undefined ||\n data.description !== undefined ||\n data.active !== undefined ||\n data.type !== undefined ||\n data.visibility !== undefined ||\n data.monthlyPrice !== undefined ||\n data.yearlyPrice !== undefined ||\n data.currency !== undefined ||\n data.trialDays !== undefined ||\n data.benefits !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const TierBulkInputSchema = z\n .object({\n filter: z.string().min(1),\n action: z.literal('update'),\n active: z.boolean().optional(),\n visibility: TierVisibilitySchema.optional(),\n trialDays: z.number().int().min(0).nullable().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.active !== undefined || data.visibility !== undefined || data.trialDays !== undefined,\n ),\n {\n message: 'Bulk update requires at least one update field.',\n path: ['active'],\n },\n );\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n printJson,\n printOperationStatsHuman,\n printTierHuman,\n printTierListHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseCsv, parseInteger } from '../lib/parse.js';\nimport { bulkTiers, createTier, getTier, listTiers, updateTier } from '../lib/tiers.js';\nimport {\n TierBulkInputSchema,\n TierCreateInputSchema,\n TierGetInputSchema,\n TierListInputSchema,\n TierUpdateInputSchema,\n} from '../schemas/tier.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction parseNullableInteger(value: string | undefined, label: string): number | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value.trim().toLowerCase() === 'null') {\n return null;\n }\n\n return parseInteger(value, label);\n}\n\nexport function registerTierCommands(program: Command): void {\n const tier = program.command('tier').description('Tier management');\n\n tier\n .command('list')\n .description('List tiers')\n .option('--limit <numberOrAll>', 'Number of tiers per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = TierListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listTiers(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierListHuman(payload, global.color !== false);\n });\n\n tier\n .command('get <id>')\n .description('Get a tier by id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = TierGetInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getTier(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierHuman(payload);\n });\n\n tier\n .command('create')\n .description('Create a tier')\n .requiredOption('--name <name>', 'Tier name')\n .option('--description <description>', 'Tier description')\n .option('--active <value>', 'true|false')\n .option('--type <type>', 'free|paid')\n .option('--visibility <visibility>', 'public|none')\n .option('--monthly-price <cents>', 'Monthly price in cents')\n .option('--yearly-price <cents>', 'Yearly price in cents')\n .option('--currency <code>', '3-letter currency code')\n .option('--trial-days <daysOrNull>', 'Trial days, or null')\n .option('--benefits <benefits>', 'Comma separated benefit labels')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = TierCreateInputSchema.safeParse({\n name: options.name,\n description: options.description,\n active: parseBooleanFlag(options.active),\n type: options.type,\n visibility: options.visibility,\n monthlyPrice: parseInteger(options.monthlyPrice, 'monthly-price'),\n yearlyPrice: parseInteger(options.yearlyPrice, 'yearly-price'),\n currency: options.currency,\n trialDays: parseNullableInteger(options.trialDays, 'trial-days'),\n benefits: options.benefits,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createTier(global, {\n name: parsed.data.name,\n description: parsed.data.description,\n active: parsed.data.active,\n type: parsed.data.type,\n visibility: parsed.data.visibility,\n monthly_price: parsed.data.monthlyPrice,\n yearly_price: parsed.data.yearlyPrice,\n currency: parsed.data.currency?.toUpperCase(),\n trial_days: parsed.data.trialDays,\n benefits: parseCsv(parsed.data.benefits),\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierHuman(payload);\n });\n\n tier\n .command('update <id>')\n .description('Update a tier')\n .option('--name <name>', 'Tier name')\n .option('--description <description>', 'Tier description')\n .option('--active <value>', 'true|false')\n .option('--type <type>', 'free|paid')\n .option('--visibility <visibility>', 'public|none')\n .option('--monthly-price <cents>', 'Monthly price in cents')\n .option('--yearly-price <cents>', 'Yearly price in cents')\n .option('--currency <code>', '3-letter currency code')\n .option('--trial-days <daysOrNull>', 'Trial days, or null')\n .option('--benefits <benefits>', 'Comma separated benefit labels')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n\n const parsed = TierUpdateInputSchema.safeParse({\n id,\n name: options.name,\n description: options.description,\n active: parseBooleanFlag(options.active),\n type: options.type,\n visibility: options.visibility,\n monthlyPrice: parseInteger(options.monthlyPrice, 'monthly-price'),\n yearlyPrice: parseInteger(options.yearlyPrice, 'yearly-price'),\n currency: options.currency,\n trialDays: parseNullableInteger(options.trialDays, 'trial-days'),\n benefits: options.benefits,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateTier(global, parsed.data.id, {\n name: parsed.data.name,\n description: parsed.data.description,\n active: parsed.data.active,\n type: parsed.data.type,\n visibility: parsed.data.visibility,\n monthly_price: parsed.data.monthlyPrice,\n yearly_price: parsed.data.yearlyPrice,\n currency: parsed.data.currency?.toUpperCase(),\n trial_days: parsed.data.trialDays,\n benefits: parsed.data.benefits !== undefined ? parseCsv(parsed.data.benefits) : undefined,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printTierHuman(payload);\n });\n\n tier\n .command('bulk')\n .description('Run bulk tier operations')\n .requiredOption('--filter <nql>', 'NQL filter to select tiers')\n .requiredOption('--action <action>', 'update')\n .option('--active <value>', 'true|false')\n .option('--visibility <visibility>', 'public|none')\n .option('--trial-days <daysOrNull>', 'Trial days, or null')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = TierBulkInputSchema.safeParse({\n filter: options.filter,\n action: options.action,\n active: parseBooleanFlag(options.active),\n visibility: options.visibility,\n trialDays: parseNullableInteger(options.trialDays, 'trial-days'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await bulkTiers(global, {\n filter: parsed.data.filter,\n patch: {\n active: parsed.data.active,\n visibility: parsed.data.visibility,\n trial_days: parsed.data.trialDays,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printOperationStatsHuman(payload, 'Bulk tier operation completed');\n });\n}\n","import { z } from 'zod';\n\nexport const UserListInputSchema = z.object({\n limit: z.union([z.number().int().positive().max(100), z.literal('all')]).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n order: z.string().optional(),\n});\n\nexport const UserGetInputSchema = z\n .object({\n id: z.string().min(1).optional(),\n slug: z.string().min(1).optional(),\n email: z.string().email().optional(),\n include: z.string().optional(),\n fields: z.string().optional(),\n })\n .refine(\n (data) => {\n const selectors = [Boolean(data.id), Boolean(data.slug), Boolean(data.email)].filter(Boolean);\n return selectors.length === 1;\n },\n {\n message: 'Provide exactly one selector: id argument, --slug, or --email.',\n path: ['id'],\n },\n );\n\nexport const UserMeInputSchema = z.object({\n include: z.string().optional(),\n fields: z.string().optional(),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printUserHuman, printUserListHuman } from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { getCurrentUser, getUser, listUsers } from '../lib/users.js';\nimport { UserGetInputSchema, UserListInputSchema, UserMeInputSchema } from '../schemas/user.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nexport function registerUserCommands(program: Command): void {\n const user = program.command('user').description('User management');\n\n user\n .command('list')\n .description('List users')\n .option('--limit <numberOrAll>', 'Number of users per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .option('--order <order>', 'Sort order')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const rawLimit = options.limit === 'all' ? 'all' : parseInteger(options.limit, 'limit');\n const rawPage = parseInteger(options.page, 'page');\n\n const parsed = UserListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n include: options.include,\n fields: options.fields,\n order: options.order,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listUsers(\n global,\n {\n ...parsed.data,\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printUserListHuman(payload, global.color !== false);\n });\n\n user\n .command('get [id]')\n .description('Get a user by id, slug, or email')\n .option('--slug <slug>', 'User slug')\n .option('--email <email>', 'User email')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (id: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = UserGetInputSchema.safeParse({\n id,\n slug: options.slug,\n email: options.email,\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getUser(global, {\n id: parsed.data.id,\n slug: parsed.data.slug,\n email: parsed.data.email,\n params: {\n include: parsed.data.include,\n fields: parsed.data.fields,\n },\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printUserHuman(payload);\n });\n\n user\n .command('me')\n .description('Get current authenticated user')\n .option('--include <relations>', 'Include relationships')\n .option('--fields <fields>', 'Select output fields')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = UserMeInputSchema.safeParse({\n include: options.include,\n fields: options.fields,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getCurrentUser(global, {\n include: parsed.data.include,\n fields: parsed.data.fields,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printUserHuman(payload);\n });\n}\n","import { createHmac, randomUUID, timingSafeEqual } from 'node:crypto';\nimport http from 'node:http';\nimport type { GlobalOptions } from './types.js';\nimport { createWebhook, deleteWebhook } from './webhooks.js';\n\nconst DEFAULT_MAX_BODY_BYTES = 1024 * 1024;\nconst DEFAULT_SIGNATURE_MAX_SKEW_MS = 5 * 60 * 1000;\nconst DEFAULT_HEADERS_TIMEOUT_MS = 15_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\nconst DEFAULT_KEEP_ALIVE_TIMEOUT_MS = 5_000;\n\ninterface WebhookListenerOptions {\n publicUrl: string;\n forwardTo: string;\n events: string[];\n host?: string;\n port?: number;\n maxBodyBytes?: number;\n signatureMaxSkewMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n}\n\ninterface CreatedHook {\n id: string;\n event: string;\n}\n\nclass BodyTooLargeError extends Error {\n constructor(limit: number) {\n super(`Request body exceeded limit of ${limit} bytes`);\n this.name = 'BodyTooLargeError';\n }\n}\n\ninterface ParsedSignatureHeader {\n digestHex: string;\n timestampRaw?: string;\n timestampMs?: number;\n}\n\nfunction toTimestampMs(raw: string): number | null {\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n\n if (parsed > 1_000_000_000_000) {\n return Math.trunc(parsed);\n }\n\n return Math.trunc(parsed * 1000);\n}\n\nfunction parseSignatureHeader(rawHeader: string): ParsedSignatureHeader | null {\n const parts = rawHeader\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n if (parts.length === 0) {\n return null;\n }\n\n let digestHex: string | undefined;\n let timestampRaw: string | undefined;\n\n for (const part of parts) {\n const separatorIndex = part.indexOf('=');\n if (separatorIndex <= 0) {\n continue;\n }\n\n const key = part.slice(0, separatorIndex).trim();\n const value = part.slice(separatorIndex + 1).trim();\n if (!value) {\n continue;\n }\n\n if (key === 'sha256') {\n digestHex = value;\n } else if (key === 't') {\n timestampRaw = value;\n }\n }\n\n if (!digestHex) {\n return null;\n }\n\n const parsedTimestampMs = timestampRaw ? toTimestampMs(timestampRaw) : null;\n if (timestampRaw && parsedTimestampMs === null) {\n return null;\n }\n\n return {\n digestHex,\n timestampRaw,\n ...(parsedTimestampMs === null ? {} : { timestampMs: parsedTimestampMs }),\n };\n}\n\nfunction digestMatches(expectedHex: string, actualDigest: Buffer): boolean {\n if (!/^[a-fA-F0-9]+$/.test(expectedHex) || expectedHex.length % 2 !== 0) {\n return false;\n }\n\n const expectedDigest = Buffer.from(expectedHex, 'hex');\n if (expectedDigest.length !== actualDigest.length) {\n return false;\n }\n\n return timingSafeEqual(expectedDigest, actualDigest);\n}\n\nfunction verifyGhostSignature(\n secret: string,\n body: Buffer,\n rawHeader: string | undefined,\n maxSkewMs: number,\n): { ok: boolean; reason?: string } {\n if (!rawHeader) {\n return { ok: false, reason: 'missing_signature' };\n }\n\n const parsed = parseSignatureHeader(rawHeader);\n if (!parsed) {\n return { ok: false, reason: 'malformed_signature' };\n }\n\n if (parsed.timestampMs !== undefined) {\n const skew = Math.abs(Date.now() - parsed.timestampMs);\n if (skew > maxSkewMs) {\n return { ok: false, reason: 'timestamp_out_of_range' };\n }\n }\n\n if (parsed.timestampRaw) {\n const digestWithTimestamp = createHmac('sha256', secret)\n .update(body)\n .update(parsed.timestampRaw)\n .digest();\n if (digestMatches(parsed.digestHex, digestWithTimestamp)) {\n return { ok: true };\n }\n }\n\n const digestRawBody = createHmac('sha256', secret).update(body).digest();\n if (digestMatches(parsed.digestHex, digestRawBody)) {\n return { ok: true };\n }\n\n return { ok: false, reason: 'invalid_signature' };\n}\n\nfunction asWebhookId(payload: Record<string, unknown>): string | null {\n const hooks = Array.isArray(payload.webhooks)\n ? (payload.webhooks as Array<Record<string, unknown>>)\n : [];\n const first = hooks[0] ?? payload;\n const id = String(first.id ?? '').trim();\n return id || null;\n}\n\nasync function cleanupCreatedHooks(\n global: GlobalOptions,\n createdHooks: CreatedHook[],\n onEvent?: (event: Record<string, unknown>) => void,\n): Promise<void> {\n const hooks = [...createdHooks];\n createdHooks.length = 0;\n\n for (const hook of hooks) {\n try {\n await deleteWebhook(global, hook.id);\n onEvent?.({\n type: 'cleanup',\n id: hook.id,\n event: hook.event,\n });\n } catch (error) {\n onEvent?.({\n type: 'cleanup_error',\n id: hook.id,\n event: hook.event,\n message: (error as Error).message,\n });\n }\n }\n}\n\nasync function readRequestBody(\n request: http.IncomingMessage,\n maxBodyBytes: number,\n): Promise<Buffer> {\n return await new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n let settled = false;\n\n const settle = (next: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n request.off('data', onData);\n request.off('end', onEnd);\n request.off('error', onError);\n request.off('aborted', onAborted);\n request.off('close', onClose);\n next();\n };\n\n const onData = (chunk: unknown) => {\n const normalized = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n totalBytes += normalized.length;\n if (totalBytes > maxBodyBytes) {\n settle(() => reject(new BodyTooLargeError(maxBodyBytes)));\n return;\n }\n chunks.push(normalized);\n };\n const onEnd = () => settle(() => resolve(Buffer.concat(chunks)));\n const onError = (error: unknown) =>\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n const onAborted = () => settle(() => reject(new Error('Request stream aborted')));\n const onClose = () => {\n if (!request.complete) {\n settle(() => reject(new Error('Request stream closed before completion')));\n }\n };\n\n request.on('data', onData);\n request.on('end', onEnd);\n request.on('error', onError);\n request.on('aborted', onAborted);\n request.on('close', onClose);\n });\n}\n\nexport async function runWebhookListener(\n global: GlobalOptions,\n options: WebhookListenerOptions,\n): Promise<void> {\n const host = options.host ?? '127.0.0.1';\n const port = options.port ?? 8787;\n const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n const signatureMaxSkewMs = options.signatureMaxSkewMs ?? DEFAULT_SIGNATURE_MAX_SKEW_MS;\n const listenerSecret = randomUUID();\n const createdHooks: CreatedHook[] = [];\n let server: http.Server | null = null;\n\n try {\n for (const eventName of options.events) {\n const payload = await createWebhook(global, {\n event: eventName,\n target_url: options.publicUrl,\n name: `ghst-listen-${eventName}-${Date.now().toString(36)}`,\n secret: listenerSecret,\n });\n\n const id = asWebhookId(payload);\n if (id) {\n createdHooks.push({ id, event: eventName });\n }\n }\n\n server = http.createServer(async (request, response) => {\n if (request.method !== 'POST') {\n response.statusCode = 405;\n response.end('Method Not Allowed');\n return;\n }\n\n let body: Buffer;\n try {\n body = await readRequestBody(request, maxBodyBytes);\n } catch (error) {\n options.onEvent?.({\n type: 'error',\n stage: 'request',\n message: (error as Error).message,\n });\n response.statusCode = error instanceof BodyTooLargeError ? 413 : 400;\n response.end();\n return;\n }\n\n const rawSignature = Array.isArray(request.headers['x-ghost-signature'])\n ? request.headers['x-ghost-signature'][0]\n : request.headers['x-ghost-signature'];\n const verification = verifyGhostSignature(\n listenerSecret,\n body,\n typeof rawSignature === 'string' ? rawSignature : undefined,\n signatureMaxSkewMs,\n );\n if (!verification.ok) {\n options.onEvent?.({\n type: 'error',\n stage: 'signature',\n message: verification.reason ?? 'invalid_signature',\n });\n response.statusCode = 401;\n response.end();\n return;\n }\n\n const rawBody = body.toString('utf8');\n let parsedBody: unknown = rawBody;\n try {\n parsedBody = JSON.parse(rawBody);\n } catch {\n parsedBody = rawBody;\n }\n\n const forwardHeaders = new Headers();\n const contentType = request.headers['content-type'];\n if (typeof contentType === 'string' && contentType.length > 0) {\n forwardHeaders.set('content-type', contentType);\n }\n\n const sourceIp = request.socket.remoteAddress;\n if (sourceIp) {\n forwardHeaders.set('x-forwarded-for', sourceIp);\n }\n\n try {\n const forwarded = await fetch(options.forwardTo, {\n method: 'POST',\n headers: forwardHeaders,\n body,\n });\n\n options.onEvent?.({\n type: 'forwarded',\n status: forwarded.status,\n ok: forwarded.ok,\n body: parsedBody,\n });\n\n response.statusCode = forwarded.ok ? 200 : 502;\n response.end();\n } catch (error) {\n options.onEvent?.({\n type: 'error',\n message: (error as Error).message,\n });\n response.statusCode = 502;\n response.end();\n }\n });\n server.headersTimeout = DEFAULT_HEADERS_TIMEOUT_MS;\n server.requestTimeout = DEFAULT_REQUEST_TIMEOUT_MS;\n server.keepAliveTimeout = DEFAULT_KEEP_ALIVE_TIMEOUT_MS;\n\n const appServer = server;\n\n await new Promise<void>((resolve, reject) => {\n appServer.once('error', reject);\n appServer.listen(port, host, () => {\n appServer.off('error', reject);\n resolve();\n });\n });\n\n options.onEvent?.({\n type: 'ready',\n host,\n port,\n publicUrl: options.publicUrl,\n forwardTo: options.forwardTo,\n hooks: createdHooks,\n });\n\n await new Promise<void>((resolve, reject) => {\n let stopped = false;\n\n const shutdown = async (error?: unknown) => {\n if (stopped) {\n return;\n }\n stopped = true;\n\n process.off('SIGINT', onSigint);\n process.off('SIGTERM', onSigterm);\n\n if (appServer.listening) {\n await new Promise<void>((done) => {\n appServer.close(() => done());\n });\n }\n\n await cleanupCreatedHooks(global, createdHooks, options.onEvent);\n\n if (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n resolve();\n };\n\n const onSigint = () => {\n void shutdown();\n };\n\n const onSigterm = () => {\n void shutdown();\n };\n\n appServer.on('error', (error) => {\n void shutdown(error);\n });\n\n process.on('SIGINT', onSigint);\n process.on('SIGTERM', onSigterm);\n });\n } catch (error) {\n const activeServer = server;\n if (activeServer?.listening) {\n await new Promise<void>((resolve) => {\n activeServer.close(() => resolve());\n });\n }\n await cleanupCreatedHooks(global, createdHooks, options.onEvent);\n throw error;\n }\n}\n","import { z } from 'zod';\n\nexport const WebhookCreateInputSchema = z.object({\n event: z.string().min(1),\n targetUrl: z.string().url(),\n name: z.string().min(1).optional(),\n secret: z.string().optional(),\n apiVersion: z.string().optional(),\n});\n\nexport const WebhookUpdateInputSchema = z\n .object({\n id: z.string().min(1),\n event: z.string().min(1).optional(),\n targetUrl: z.string().url().optional(),\n name: z.string().min(1).optional(),\n secret: z.string().optional(),\n apiVersion: z.string().optional(),\n })\n .refine(\n (data) =>\n Boolean(\n data.event !== undefined ||\n data.targetUrl !== undefined ||\n data.name !== undefined ||\n data.secret !== undefined ||\n data.apiVersion !== undefined,\n ),\n {\n message: 'Provide at least one update field.',\n },\n );\n\nexport const WebhookDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n\nexport const WebhookListenInputSchema = z.object({\n publicUrl: z.string().url(),\n forwardTo: z.string().url(),\n events: z.string().optional(),\n host: z.string().min(1).optional(),\n port: z.number().int().positive().optional(),\n maxBodyBytes: z.number().int().positive().optional(),\n signatureMaxSkewMs: z.number().int().positive().optional(),\n});\n","import type { Command } from 'commander';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport { printJson, printWebhookHuman } from '../lib/output.js';\nimport { parseCsv, parseInteger } from '../lib/parse.js';\nimport { confirm } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport { runWebhookListener } from '../lib/webhook-listener.js';\nimport { createWebhook, deleteWebhook, updateWebhook, WEBHOOK_EVENTS } from '../lib/webhooks.js';\nimport {\n WebhookCreateInputSchema,\n WebhookDeleteInputSchema,\n WebhookListenInputSchema,\n WebhookUpdateInputSchema,\n} from '../schemas/webhook.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues?.map((i) => i.message).join('; ') ??\n 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nlet webhookListenRunnerForTests:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n publicUrl: string;\n forwardTo: string;\n events: string[];\n host?: string;\n port?: number;\n maxBodyBytes?: number;\n signatureMaxSkewMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<void>)\n | null = null;\n\nexport function setWebhookListenRunnerForTests(\n runner:\n | ((\n global: ReturnType<typeof getGlobalOptions>,\n options: {\n publicUrl: string;\n forwardTo: string;\n events: string[];\n host?: string;\n port?: number;\n maxBodyBytes?: number;\n signatureMaxSkewMs?: number;\n onEvent?: (event: Record<string, unknown>) => void;\n },\n ) => Promise<void>)\n | null,\n): void {\n webhookListenRunnerForTests = runner;\n}\n\nexport function registerWebhookCommands(program: Command): void {\n const webhook = program.command('webhook').description('Webhook management');\n\n webhook\n .command('create')\n .description('Create a webhook')\n .requiredOption('--event <event>', 'Webhook event')\n .requiredOption('--target-url <url>', 'Webhook target URL')\n .option('--name <name>', 'Webhook name')\n .option('--secret <secret>', 'Webhook secret')\n .option('--api-version <version>', 'Webhook api version')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookCreateInputSchema.safeParse({\n event: options.event,\n targetUrl: options.targetUrl,\n name: options.name,\n secret: options.secret,\n apiVersion: options.apiVersion,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await createWebhook(global, {\n event: parsed.data.event,\n target_url: parsed.data.targetUrl,\n name: parsed.data.name,\n secret: parsed.data.secret,\n api_version: parsed.data.apiVersion,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printWebhookHuman(payload);\n });\n\n webhook\n .command('update <id>')\n .description('Update a webhook')\n .option('--event <event>', 'Webhook event')\n .option('--target-url <url>', 'Webhook target URL')\n .option('--name <name>', 'Webhook name')\n .option('--secret <secret>', 'Webhook secret')\n .option('--api-version <version>', 'Webhook api version')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookUpdateInputSchema.safeParse({\n id,\n event: options.event,\n targetUrl: options.targetUrl,\n name: options.name,\n secret: options.secret,\n apiVersion: options.apiVersion,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateWebhook(global, parsed.data.id, {\n event: parsed.data.event,\n target_url: parsed.data.targetUrl,\n name: parsed.data.name,\n secret: parsed.data.secret,\n api_version: parsed.data.apiVersion,\n });\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printWebhookHuman(payload);\n });\n\n webhook\n .command('delete <id>')\n .description('Delete a webhook')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookDeleteInputSchema.safeParse({\n id,\n yes: options.yes,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n if (!parsed.data.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Deleting in non-interactive mode requires --yes.', {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const ok = await confirm(`Delete webhook '${parsed.data.id}'? [y/N]: `);\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n await deleteWebhook(global, parsed.data.id);\n\n if (global.json) {\n printJson({ ok: true, id: parsed.data.id });\n return;\n }\n\n console.log(`Deleted webhook '${parsed.data.id}'.`);\n });\n\n webhook\n .command('events')\n .description('List available webhook events')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n if (global.json) {\n printJson({ events: WEBHOOK_EVENTS });\n return;\n }\n\n for (const eventName of WEBHOOK_EVENTS) {\n console.log(eventName);\n }\n });\n\n webhook\n .command('listen')\n .description('Listen for webhook events and forward to a local endpoint')\n .requiredOption('--public-url <url>', 'Public URL that Ghost should send webhook events to')\n .requiredOption('--forward-to <url>', 'Local endpoint to forward events to')\n .option('--events <events>', 'Comma-separated event names (defaults to post.published)')\n .option('--host <host>', 'Bind host for local listener', '127.0.0.1')\n .option('--port <port>', 'Bind port for local listener', '8787')\n .option('--max-body-bytes <bytes>', 'Maximum inbound webhook payload size', '1048576')\n .option(\n '--signature-max-skew-ms <ms>',\n 'Maximum signature timestamp skew in milliseconds',\n '300000',\n )\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = WebhookListenInputSchema.safeParse({\n publicUrl: options.publicUrl,\n forwardTo: options.forwardTo,\n events: options.events,\n host: options.host,\n port: parseInteger(options.port, 'port'),\n maxBodyBytes: parseInteger(options.maxBodyBytes, 'max-body-bytes'),\n signatureMaxSkewMs: parseInteger(options.signatureMaxSkewMs, 'signature-max-skew-ms'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const selectedEvents = parseCsv(parsed.data.events) ?? ['post.published'];\n const knownEvents = new Set<string>(WEBHOOK_EVENTS as readonly string[]);\n const invalid = selectedEvents.filter((eventName) => !knownEvents.has(eventName));\n if (invalid.length > 0) {\n throw new GhstError(`Unsupported webhook event(s): ${invalid.join(', ')}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const runner = webhookListenRunnerForTests ?? runWebhookListener;\n await runner(global, {\n publicUrl: parsed.data.publicUrl,\n forwardTo: parsed.data.forwardTo,\n events: selectedEvents,\n host: parsed.data.host,\n port: parsed.data.port,\n maxBodyBytes: parsed.data.maxBodyBytes,\n signatureMaxSkewMs: parsed.data.signatureMaxSkewMs,\n onEvent: (event) => {\n if (global.json) {\n console.log(JSON.stringify(event));\n return;\n }\n\n const type = String(event.type ?? '');\n if (type === 'ready') {\n console.log(\n `Listening on ${String(event.host)}:${String(event.port)} and forwarding to ${String(event.forwardTo)}`,\n );\n return;\n }\n\n if (type === 'forwarded') {\n console.log(`Forwarded event -> HTTP ${String(event.status)}`);\n return;\n }\n\n if (type === 'cleanup') {\n console.log(`Deleted temporary webhook ${String(event.id)}`);\n return;\n }\n\n if (type === 'error' || type === 'cleanup_error') {\n console.error(`Webhook listen error: ${String(event.message ?? '')}`);\n }\n },\n });\n });\n}\n"],"mappings":"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","names":["fs","path","z","z","process","key","fs","spawn","chalk","spawn","chalk","chalk","path","fs","path","path","fs","z","getClient","readline","z","throwValidationError","z","fs","path","getClient","fs","path","getClient","getClient","getClient","getClient","getClient","getClient","getClient","fs","path","getClient","fs","path","getClient","getClient","getClient","z","run","fs","z","throwValidationError","fs","fs","os","path","parseCsv","getClient","normalizedSlug","parseCsv","fs","path","os","output","fs","getClient","z","throwValidationError","z","throwValidationError","z","throwValidationError","fs","z","throwValidationError","fs","fs","MarkdownIt","z","StatusSchema","VisibilitySchema","withSingleContentSource","markdownRenderer","MarkdownIt","throwValidationError","readOptionalFile","fs","z","throwValidationError","z","throwValidationError","spawn","fs","os","path","spawn","fs","os","path","path","os","spawn","fs","z","throwValidationError","zipDirectory","fs","path","os","spawn","result","throwValidationError","fs","zipDirectory","z","throwValidationError","z","throwValidationError","timingSafeEqual","http","DEFAULT_MAX_BODY_BYTES","DEFAULT_HEADERS_TIMEOUT_MS","DEFAULT_REQUEST_TIMEOUT_MS","DEFAULT_KEEP_ALIVE_TIMEOUT_MS","timingSafeEqual","http","z","throwValidationError","throwValidationError"]}