@tryghost/ghst 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/index.js +235 -63
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/api.ts","../src/lib/errors.ts","../src/lib/api-path.ts","../src/lib/auth.ts","../src/schemas/common.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/lib/pagination.ts","../src/lib/comments.ts","../src/lib/prompts.ts","../src/schemas/comment.ts","../src/commands/comment.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/lib/images.ts","../src/schemas/image.ts","../src/commands/image.ts","../src/lib/labels.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/socialweb-client.ts","../src/lib/socialweb.ts","../src/lib/stats.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/commands/socialweb.ts","../src/schemas/socialweb.ts","../src/commands/stats.ts","../src/schemas/stats.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 { registerCommentCommands } from './commands/comment.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 { registerSocialWebCommands } from './commands/socialweb.js';\nimport { registerStatsCommands } from './commands/stats.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 registerCommentCommands(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 registerSocialWebCommands(program);\n registerStatsCommands(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 { normalizeGhostApiPath } from '../lib/api-path.js';\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 const requestApi = options.contentApi ? 'content' : 'admin';\n const normalizedEndpointPath = normalizeGhostApiPath(endpointPath, requestApi);\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: normalizedEndpointPath,\n method: options.method,\n body: requestBody,\n params,\n contentApi: requestApi === 'content',\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 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 { ExitCode, GhstError } from './errors.js';\n\ntype RequestApi = 'admin' | 'content';\n\nconst API_ROOTS: Record<RequestApi, string> = {\n admin: '/ghost/api/admin',\n content: '/ghost/api/content',\n};\n\nconst ABSOLUTE_URL_PATTERN = /^[A-Za-z][A-Za-z\\d+.-]*:/;\n\nfunction throwInvalidPath(message: string): never {\n throw new GhstError(message, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n}\n\nfunction decodePathSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n throwInvalidPath(`Invalid endpoint path segment: ${segment}`);\n }\n}\n\nfunction validatePathSegment(segment: string): void {\n const decoded = decodePathSegment(segment);\n\n if (segment === '.' || segment === '..' || decoded === '.' || decoded === '..') {\n throwInvalidPath('Endpoint path must not contain dot segments.');\n }\n\n if (decoded.includes('/') || decoded.includes('\\\\')) {\n throwInvalidPath('Endpoint path must not contain encoded path separators.');\n }\n}\n\nfunction stripSelectedApiRoot(input: string, api: RequestApi): string | null {\n const root = API_ROOTS[api];\n\n if (input === root || input === `${root}/`) {\n return '/';\n }\n\n if (input.startsWith(`${root}/`)) {\n return input.slice(root.length);\n }\n\n return null;\n}\n\nexport function normalizeGhostApiPath(input: string, api: RequestApi): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throwInvalidPath('Endpoint path is required.');\n }\n\n if (ABSOLUTE_URL_PATTERN.test(trimmed) || trimmed.startsWith('//')) {\n throwInvalidPath('Endpoint path must be relative to the selected Ghost API root.');\n }\n\n if (trimmed.includes('\\\\')) {\n throwInvalidPath('Endpoint path must not contain backslashes.');\n }\n\n if (trimmed.includes('#')) {\n throwInvalidPath('Endpoint path must not contain URL fragments.');\n }\n\n if (trimmed.includes('?')) {\n throwInvalidPath('Endpoint path must not include query parameters. Use --query instead.');\n }\n\n let candidate =\n stripSelectedApiRoot(trimmed, api) ??\n (() => {\n if (trimmed.startsWith('/ghost/api/')) {\n throwInvalidPath('Endpoint path must stay within the selected Ghost API root.');\n }\n\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n })();\n\n const rawSegments = candidate.split('/').filter(Boolean);\n for (const segment of rawSegments) {\n validatePathSegment(segment);\n }\n\n candidate = rawSegments.length === 0 ? '/' : `/${rawSegments.join('/')}/`;\n return candidate;\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 { 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\nexport type GhostCommentStatus = 'published' | 'hidden' | 'deleted';\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: (\n id: string,\n post: Record<string, unknown>,\n source?: 'html',\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('PUT', `/posts/${id}/`, {\n body: { posts: [post] },\n source,\n params,\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 comments = {\n browseAll: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/comments/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/comments/${id}/`, { params }),\n\n readForModeration: (id: string) =>\n this.request<Record<string, unknown>>('GET', `/comments/${id}/`, {\n params: {\n include:\n 'member,post,count.replies,count.direct_replies,count.likes,count.reports,parent,in_reply_to',\n },\n }),\n\n replies: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', `/comments/${id}/replies/`, { params }),\n\n browseThread: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/comments/', {\n params: {\n filter: `(parent_id:${id}+in_reply_to_id:null),in_reply_to_id:${id}`,\n order: 'created_at asc',\n include: 'member,post,count.direct_replies,count.likes,count.reports,parent,in_reply_to',\n limit: 100,\n ...params,\n },\n }),\n\n likes: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', `/comments/${id}/likes/`, { params }),\n\n reports: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', `/comments/${id}/reports/`, { params }),\n\n setStatus: (id: string, status: GhostCommentStatus) =>\n this.request<Record<string, unknown>>('PUT', `/comments/${id}/`, {\n body: {\n comments: [\n {\n id,\n status,\n },\n ],\n },\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\nasync function findEnclosingRepoRoot(cwd = process.cwd()): Promise<string | null> {\n let dir = path.resolve(cwd);\n const root = path.parse(dir).root;\n\n while (true) {\n const gitPath = path.join(dir, '.git');\n try {\n await fs.access(gitPath);\n return dir;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n if (dir === root) {\n return null;\n }\n\n dir = path.dirname(dir);\n }\n}\n\nasync function findProjectConfigPath(cwd = process.cwd()): Promise<string | null> {\n let dir = path.resolve(cwd);\n const stopDir = (await findEnclosingRepoRoot(dir)) ?? dir;\n\n while (true) {\n const candidate = path.join(dir, '.ghst', 'config.json');\n try {\n await fs.access(candidate);\n return candidate;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n if (dir === stopDir) {\n return null;\n }\n\n dir = path.dirname(dir);\n }\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 = await findProjectConfigPath(cwd);\n if (!configPath) {\n return null;\n }\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 type {\n SocialWebAccount,\n SocialWebNotification,\n SocialWebPost,\n SocialWebStatusReport,\n} from './socialweb.js';\nimport type {\n StatsBreakdownRow,\n StatsContentRow,\n StatsGrowthReport,\n StatsNewsletterClicksReport,\n StatsNewsletterSubscribersReport,\n StatsNewslettersReport,\n StatsOverviewReport,\n StatsPostGrowthReport,\n StatsPostNewsletterReport,\n StatsPostReferrersReport,\n StatsPostReport,\n StatsPostsReport,\n StatsPostWebReport,\n StatsWebReport,\n StatsWebTableReport,\n} from './stats.js';\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 === 'hidden') return chalk.yellow(status);\n if (status === 'deleted') return chalk.red(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\nexport function printTableHuman(headers: string[], rows: string[][], useColor = true): void {\n printRows(headers, rows, useColor);\n}\n\nexport function formatCsv(headers: string[], rows: string[][]): string {\n const escapeValue = (value: string): string => {\n if (/[\",\\r\\n]/.test(value)) {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n\n return value;\n };\n\n return [headers, ...rows].map((row) => row.map(escapeValue).join(',')).join('\\n');\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 stripHtml(value: unknown): string {\n const html = String(value ?? '');\n return html\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/p>/gi, '\\n')\n .replace(/<[^>]+>/g, ' ')\n .replace(/ /gi, ' ')\n .replace(/&/gi, '&')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/'/gi, \"'\")\n .replace(/"/gi, '\"')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction truncateValue(value: string, max = 64): string {\n if (value.length <= max) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, max - 3))}...`;\n}\n\nfunction getFirstRecord(\n payload: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const collection = Array.isArray(payload[key]) ? payload[key] : [];\n return collection[0] as Record<string, unknown> | undefined;\n}\n\nfunction getCommentAuthor(record: Record<string, unknown>): string {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n return String(member.name ?? member.email ?? record.member_id ?? 'Unknown');\n}\n\nfunction getCommentPost(record: Record<string, unknown>): string {\n const post = (record.post as Record<string, unknown> | undefined) ?? {};\n return String(post.title ?? record.post_id ?? '');\n}\n\nfunction getCommentCounts(record: Record<string, unknown>): string {\n const count = (record.count as Record<string, unknown> | undefined) ?? {};\n const replies = Number(count.replies ?? 0);\n const directReplies = Number(count.direct_replies ?? 0);\n const likes = Number(count.likes ?? 0);\n const reports = Number(count.reports ?? 0);\n return `${replies}/${directReplies}/${likes}/${reports}`;\n}\n\nfunction getCommentReplyLink(record: Record<string, unknown>): string {\n const snippet = String(record.in_reply_to_snippet ?? '').trim();\n if (snippet) {\n return truncateValue(snippet, 32);\n }\n\n if (record.in_reply_to_id) {\n return String(record.in_reply_to_id);\n }\n\n if (record.parent_id) {\n return String(record.parent_id);\n }\n\n return '';\n}\n\nfunction getCommentSnippet(record: Record<string, unknown>): string {\n const text = stripHtml(record.html);\n return truncateValue(text || '[removed]', 72);\n}\n\nfunction commentRow(record: Record<string, unknown>, useColor: boolean): string[] {\n return [\n String(record.id ?? ''),\n getCommentAuthor(record),\n truncateValue(getCommentPost(record), 28),\n formatStatus(String(record.status ?? 'unknown'), useColor),\n getCommentCounts(record),\n String(record.created_at ?? ''),\n getCommentReplyLink(record),\n getCommentSnippet(record),\n ];\n}\n\nfunction printCommentSummary(record: Record<string, unknown>): void {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n const post = (record.post as Record<string, unknown> | undefined) ?? {};\n const lines = [\n `ID: ${String(record.id ?? '')}`,\n `Status: ${String(record.status ?? '')}`,\n `Author: ${String(member.name ?? member.email ?? record.member_id ?? '')}`,\n `Author ID: ${String(member.id ?? record.member_id ?? '')}`,\n `Post: ${String(post.title ?? record.post_id ?? '')}`,\n `Post ID: ${String(post.id ?? record.post_id ?? '')}`,\n `Parent ID: ${String(record.parent_id ?? '')}`,\n `In Reply To ID: ${String(record.in_reply_to_id ?? '')}`,\n `Created: ${String(record.created_at ?? '')}`,\n `Edited: ${String(record.edited_at ?? '')}`,\n `Counts (replies/direct/likes/reports): ${getCommentCounts(record)}`,\n '',\n 'Body:',\n stripHtml(record.html) || '[removed]',\n ];\n\n console.log(lines.join('\\n'));\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 printCommentListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'comments', (record) => commentRow(record, useColor));\n\n printRows(\n ['ID', 'AUTHOR', 'POST', 'STATUS', 'R/D/L/RP', 'CREATED', 'REPLY TO', 'TEXT'],\n rows,\n useColor,\n );\n printPagination(payload, 'comments');\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\nfunction socialWebPostRows(posts: SocialWebPost[], useColor: boolean): string[][] {\n return posts.map((post) => [\n String(post.id ?? ''),\n String(post.title ?? post.excerpt ?? '(untitled)'),\n String(\n post.author && typeof post.author === 'object'\n ? ((post.author as { handle?: string }).handle ?? '')\n : '',\n ),\n formatStatus(post.repostedByMe ? 'reposted' : post.likedByMe ? 'liked' : 'active', useColor),\n ]);\n}\n\nfunction socialWebAccountRows(accounts: SocialWebAccount[]): string[][] {\n return accounts.map((account) => [\n String(account.id ?? ''),\n String(account.name ?? ''),\n String(account.handle ?? ''),\n String(account.followedByMe ?? ''),\n ]);\n}\n\nexport function printSocialWebStatusHuman(payload: Record<string, unknown>, useColor = true): void {\n const report = payload as unknown as SocialWebStatusReport;\n console.log(\n `Social web: ${formatStatus(report.settings.social_web ? 'enabled' : 'disabled', useColor)}`,\n );\n console.log(`Reachable: ${report.reachable ? 'yes' : 'no'}`);\n console.log(`Identity available: ${report.identity.available ? 'yes' : 'no'}`);\n if (report.identity.role) {\n console.log(`Identity role: ${report.identity.role}`);\n }\n if (report.account?.handle) {\n console.log(`Handle: ${report.account.handle}`);\n }\n}\n\nexport function printSocialWebAccountHuman(\n payload: Record<string, unknown>,\n _useColor = true,\n): void {\n const account = payload as unknown as SocialWebAccount;\n console.log(`Name: ${String(account.name ?? '')}`);\n console.log(`Handle: ${String(account.handle ?? '')}`);\n if (account.url) {\n console.log(`URL: ${account.url}`);\n }\n if (account.bio) {\n console.log(`Bio: ${account.bio}`);\n }\n if (typeof account.followerCount === 'number' || typeof account.followingCount === 'number') {\n console.log(\n `Followers: ${String(account.followerCount ?? 0)} Following: ${String(account.followingCount ?? 0)}`,\n );\n }\n if (account.followedByMe !== undefined) {\n console.log(`Followed by me: ${account.followedByMe ? 'yes' : 'no'}`);\n }\n if (account.blockedByMe !== undefined) {\n console.log(`Blocked by me: ${account.blockedByMe ? 'yes' : 'no'}`);\n }\n}\n\nexport function printSocialWebAccountsHuman(\n payload: Record<string, unknown>,\n useColor = true,\n): void {\n const accounts = Array.isArray(payload.accounts)\n ? (payload.accounts as SocialWebAccount[])\n : Array.isArray(payload.blocked_accounts)\n ? (payload.blocked_accounts as SocialWebAccount[])\n : Array.isArray(payload.blocked_domains)\n ? (payload.blocked_domains as SocialWebAccount[])\n : [];\n\n printRows(['ID', 'NAME', 'HANDLE', 'FOLLOWED'], socialWebAccountRows(accounts), useColor);\n\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`\\nNext: ${payload.next}`);\n }\n}\n\nexport function printSocialWebPostsHuman(payload: Record<string, unknown>, useColor = true): void {\n if (!Array.isArray(payload.posts)) {\n const single = payload as unknown as SocialWebPost;\n const authorHandle =\n single.author && typeof single.author === 'object'\n ? String((single.author as { handle?: string }).handle ?? '')\n : '';\n console.log(`ID: ${String(single.id ?? '')}`);\n console.log(`Title: ${String(single.title ?? single.excerpt ?? '')}`);\n if (authorHandle) {\n console.log(`Author: ${authorHandle}`);\n }\n if (single.url) {\n console.log(`URL: ${single.url}`);\n }\n if (single.content) {\n console.log(`\\n${single.content}`);\n }\n return;\n }\n\n printRows(\n ['ID', 'TITLE', 'AUTHOR', 'STATE'],\n socialWebPostRows(payload.posts as SocialWebPost[], useColor),\n useColor,\n );\n\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`\\nNext: ${payload.next}`);\n }\n}\n\nexport function printSocialWebNotificationsHuman(\n payload: Record<string, unknown>,\n useColor = true,\n): void {\n const notifications = Array.isArray(payload.notifications)\n ? (payload.notifications as SocialWebNotification[])\n : [];\n const rows = notifications.map((notification) => [\n notification.type,\n notification.actor?.handle ?? '',\n notification.post && typeof notification.post === 'object'\n ? String((notification.post as { title?: string }).title ?? '')\n : '',\n notification.createdAt,\n ]);\n\n printRows(['TYPE', 'ACTOR', 'POST', 'CREATED'], rows, useColor);\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`\\nNext: ${payload.next}`);\n }\n}\n\nexport function printSocialWebThreadHuman(\n payload: Record<string, unknown>,\n _useColor = true,\n): void {\n const ancestors = Array.isArray((payload.ancestors as { chain?: unknown[] } | undefined)?.chain)\n ? (((payload.ancestors as { chain?: unknown[] }).chain ?? []) as SocialWebPost[])\n : [];\n const post = (payload.post ?? null) as SocialWebPost | null;\n const children = Array.isArray(payload.children)\n ? (payload.children as Array<{ post?: SocialWebPost }>)\n : [];\n\n for (const ancestor of ancestors) {\n console.log(`Ancestor: ${ancestor.id}`);\n }\n\n if (post) {\n console.log(`Root: ${post.id} ${post.title ?? post.excerpt ?? ''}`.trim());\n }\n\n for (const child of children) {\n if (child.post) {\n console.log(`Reply: ${child.post.id} ${child.post.title ?? child.post.excerpt ?? ''}`.trim());\n }\n }\n\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`More replies: ${payload.next}`);\n }\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 printCommentLikesHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'comment_likes', (record) => {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n return [\n String(record.id ?? ''),\n String(member.name ?? member.email ?? record.member_id ?? 'Unknown'),\n String(member.email ?? ''),\n String(record.created_at ?? ''),\n ];\n });\n\n printRows(['ID', 'MEMBER', 'EMAIL', 'CREATED'], rows, useColor);\n printPagination(payload, 'likes');\n}\n\nexport function printCommentReportsHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'comment_reports', (record) => {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n return [\n String(record.id ?? ''),\n String(member.name ?? member.email ?? record.member_id ?? 'Unknown'),\n String(member.email ?? ''),\n String(record.created_at ?? ''),\n ];\n });\n\n printRows(['ID', 'MEMBER', 'EMAIL', 'CREATED'], rows, useColor);\n printPagination(payload, 'reports');\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 printCommentHuman(payload: Record<string, unknown>): void {\n const record = getFirstRecord(payload, 'comments');\n if (!record) {\n console.log('No record found.');\n return;\n }\n\n printCommentSummary(record);\n}\n\nexport function printCommentThreadHuman(payload: Record<string, unknown>, useColor = true): void {\n const record =\n payload.comment && typeof payload.comment === 'object'\n ? (payload.comment as Record<string, unknown>)\n : undefined;\n\n if (!record) {\n console.log('No record found.');\n return;\n }\n\n printCommentSummary(record);\n\n const comments = Array.isArray(payload.comments)\n ? (payload.comments as Array<Record<string, unknown>>)\n : [];\n\n if (comments.length === 0) {\n console.log('\\nNo thread replies.');\n return;\n }\n\n console.log('\\nThread replies:');\n printRows(\n ['ID', 'AUTHOR', 'POST', 'STATUS', 'R/D/L/RP', 'CREATED', 'REPLY TO', 'TEXT'],\n comments.map((comment) => commentRow(comment, useColor)),\n useColor,\n );\n printPagination(payload, 'comments');\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\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }).format(value);\n}\n\nfunction formatDecimal(value: number): string {\n return new Intl.NumberFormat('en-US', {\n minimumFractionDigits: value % 1 === 0 ? 0 : 1,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction formatPercent(value: number): string {\n return `${formatDecimal(value)}%`;\n}\n\nfunction formatSeconds(value: number): string {\n return `${formatInteger(value)}s`;\n}\n\nfunction printSection(title: string): void {\n console.log(title);\n}\n\nfunction printKeyValues(lines: string[]): void {\n console.log(lines.join('\\n'));\n}\n\nfunction breakdownRows(items: StatsBreakdownRow[]): string[][] {\n return items.map((item) => [\n item.label,\n formatInteger(item.visits),\n item.signups === null ? '' : formatInteger(item.signups),\n item.paid_conversions === null ? '' : formatInteger(item.paid_conversions),\n item.mrr === null ? '' : formatInteger(item.mrr),\n ]);\n}\n\nfunction contentRows(items: StatsContentRow[]): string[][] {\n return items.map((item) => [\n item.title,\n item.pathname,\n formatInteger(item.visits),\n formatInteger(item.pageviews),\n ]);\n}\n\nfunction trafficSourceRows(items: StatsBreakdownRow[]): string[][] {\n return items.map((item) => [item.label, formatInteger(item.visits)]);\n}\n\nexport function printStatsOverviewHuman(payload: StatsOverviewReport, useColor = true): void {\n const memberDelta = `${payload.summary.member_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.member_delta)}`;\n const paidDelta = `${payload.summary.paid_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.paid_delta)}`;\n const mrrDelta = `${payload.summary.mrr_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.mrr_delta)}`;\n\n printSection(\n `Overview (${payload.range.from ?? 'all'} to ${payload.range.to}, ${payload.range.timezone})`,\n );\n printKeyValues([\n `Visitors: ${formatInteger(payload.summary.visitors)}`,\n `Pageviews: ${formatInteger(payload.summary.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.summary.bounce_rate)}`,\n `Visit duration: ${formatSeconds(payload.summary.avg_session_sec)}`,\n `Active visitors: ${formatInteger(payload.summary.active_visitors)}`,\n `Members: ${formatInteger(payload.summary.total_members)} (${memberDelta})`,\n `Paid members: ${formatInteger(payload.summary.paid_members)} (${paidDelta})`,\n `MRR: ${formatInteger(payload.summary.mrr)} (${mrrDelta})`,\n ]);\n console.log('');\n printSection('Top Content');\n printRows(['TITLE', 'PATH', 'VISITS', 'PAGEVIEWS'], contentRows(payload.web.content), useColor);\n console.log('');\n printSection('Top Sources');\n printRows(['SOURCE', 'VISITS'], trafficSourceRows(payload.web.sources), useColor);\n}\n\nexport function printStatsWebHuman(payload: StatsWebReport, useColor = true): void {\n printSection(\n `Web (${payload.range.from ?? 'all'} to ${payload.range.to}, ${payload.range.timezone})`,\n );\n printKeyValues([\n `Visitors: ${formatInteger(payload.kpis.visits)}`,\n `Pageviews: ${formatInteger(payload.kpis.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.kpis.bounce_rate)}`,\n `Visit duration: ${formatSeconds(payload.kpis.avg_session_sec)}`,\n `Active visitors: ${formatInteger(payload.kpis.active_visitors)}`,\n ]);\n console.log('');\n printSection('Top Content');\n printRows(['TITLE', 'PATH', 'VISITS', 'PAGEVIEWS'], contentRows(payload.content), useColor);\n console.log('');\n printSection('Top Sources');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.sources),\n useColor,\n );\n console.log('');\n printSection('Top Locations');\n printRows(\n ['LOCATION', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.locations),\n useColor,\n );\n}\n\nexport function printStatsWebTableHuman(payload: StatsWebTableReport, useColor = true): void {\n if (payload.metric === 'content') {\n printRows(\n ['TITLE', 'PATH', 'VISITS', 'PAGEVIEWS'],\n contentRows(payload.items as StatsContentRow[]),\n useColor,\n );\n return;\n }\n\n printRows(\n ['LABEL', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.items as StatsBreakdownRow[]),\n useColor,\n );\n}\n\nexport function printStatsGrowthHuman(payload: StatsGrowthReport, useColor = true): void {\n printSection(\n `Growth (${payload.range.from ?? 'all'} to ${payload.range.to}, ${payload.range.timezone})`,\n );\n printKeyValues([\n `Members: ${formatInteger(payload.summary.total_members)} (${payload.summary.member_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.member_delta)})`,\n `Paid members: ${formatInteger(payload.summary.paid_members)} (${payload.summary.paid_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.paid_delta)})`,\n `MRR: ${formatInteger(payload.summary.mrr)} (${payload.summary.mrr_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.mrr_delta)})`,\n `Subscriptions: ${formatInteger(payload.summary.total_subscriptions)} (${payload.summary.subscription_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.subscription_delta)})`,\n ]);\n console.log('');\n printSection('Top Sources');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.sources),\n useColor,\n );\n}\n\nexport function printStatsPostsHuman(payload: StatsPostsReport, useColor = true): void {\n printRows(\n ['TITLE', 'VIEWS', 'MEMBERS', 'SENT', 'OPEN RATE', 'CLICK RATE'],\n payload.posts.map((item) => [\n item.title,\n formatInteger(item.views),\n formatInteger(item.members),\n item.sent_count === null ? '' : formatInteger(item.sent_count),\n item.open_rate === null ? '' : formatPercent(item.open_rate),\n item.click_rate === null ? '' : formatPercent(item.click_rate),\n ]),\n useColor,\n );\n}\n\nexport function printStatsNewslettersHuman(payload: StatsNewslettersReport, useColor = true): void {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_name,\n formatInteger(item.sent_posts),\n formatInteger(item.recipients),\n formatPercent(item.open_rate),\n formatPercent(item.click_rate),\n formatInteger(item.subscribers),\n ]);\n\n printRows(\n ['NEWSLETTER', 'POSTS', 'RECIPIENTS', 'OPEN RATE', 'CLICK RATE', 'SUBSCRIBERS'],\n rows,\n useColor,\n );\n}\n\nexport function printStatsNewsletterClicksHuman(\n payload: StatsNewsletterClicksReport,\n useColor = true,\n): void {\n const rows = payload.clicks.map((item) => [\n item.post_title,\n item.send_date ?? '',\n formatInteger(item.recipients),\n formatInteger(item.clicks),\n formatPercent(item.click_rate),\n ]);\n printRows(['POST', 'DATE', 'RECIPIENTS', 'CLICKS', 'CLICK RATE'], rows, useColor);\n}\n\nexport function printStatsNewsletterSubscribersHuman(\n payload: StatsNewsletterSubscribersReport,\n useColor = true,\n): void {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_name,\n formatInteger(item.subscribers),\n `${item.subscriber_delta >= 0 ? '+' : ''}${formatInteger(item.subscriber_delta)}`,\n ]);\n printRows(['NEWSLETTER', 'SUBSCRIBERS', 'DELTA'], rows, useColor);\n}\n\nexport function printStatsPostHuman(payload: StatsPostReport, useColor = true): void {\n printSection(`Post: ${payload.post.title}`);\n printKeyValues([\n `Visitors: ${formatInteger(payload.summary.visitors)}`,\n `Pageviews: ${formatInteger(payload.summary.pageviews)}`,\n `Free members: ${formatInteger(payload.summary.free_members)}`,\n `Paid members: ${formatInteger(payload.summary.paid_members)}`,\n `MRR: ${formatInteger(payload.summary.mrr)}`,\n `Email recipients: ${formatInteger(payload.summary.email_recipients)}`,\n `Email open rate: ${formatPercent(payload.summary.email_open_rate)}`,\n `Email click rate: ${formatPercent(payload.summary.email_click_rate)}`,\n ]);\n\n if (payload.web) {\n console.log('');\n printSection('Web');\n printKeyValues([\n `Visitors: ${formatInteger(payload.web.kpis.visits)}`,\n `Pageviews: ${formatInteger(payload.web.kpis.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.web.kpis.bounce_rate)}`,\n ]);\n }\n\n console.log('');\n printSection('Top Referrers');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n payload.referrers.map((item) => [\n item.source,\n formatInteger(item.visits),\n formatInteger(item.signups),\n formatInteger(item.paid_conversions),\n formatInteger(item.mrr),\n ]),\n useColor,\n );\n}\n\nexport function printStatsPostGrowthHuman(payload: StatsPostGrowthReport, useColor = true): void {\n printRows(\n ['DATE', 'FREE', 'PAID', 'MRR'],\n payload.growth.map((item) => [\n item.date,\n formatInteger(item.free_members),\n formatInteger(item.paid_members),\n formatInteger(item.mrr),\n ]),\n useColor,\n );\n}\n\nexport function printStatsPostNewsletterHuman(payload: StatsPostNewsletterReport): void {\n printSection(`Post Newsletter: ${payload.post.title}`);\n printKeyValues([\n `Recipients: ${formatInteger(payload.newsletter.recipients)}`,\n `Open rate: ${formatPercent(payload.newsletter.open_rate)}`,\n `Click rate: ${formatPercent(payload.newsletter.click_rate)}`,\n ]);\n}\n\nexport function printStatsPostReferrersHuman(\n payload: StatsPostReferrersReport,\n useColor = true,\n): void {\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n payload.referrers.map((item) => [\n item.source,\n formatInteger(item.visits),\n formatInteger(item.signups),\n formatInteger(item.paid_conversions),\n formatInteger(item.mrr),\n ]),\n useColor,\n );\n}\n\nexport function printStatsPostWebHuman(payload: StatsPostWebReport, useColor = true): void {\n printSection(`Post Web: ${payload.post.title}`);\n printKeyValues([\n `Visitors: ${formatInteger(payload.kpis.visits)}`,\n `Pageviews: ${formatInteger(payload.kpis.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.kpis.bounce_rate)}`,\n `Visit duration: ${formatSeconds(payload.kpis.avg_session_sec)}`,\n `Active visitors: ${formatInteger(payload.kpis.active_visitors)}`,\n ]);\n console.log('');\n printSection('Top Sources');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.sources),\n useColor,\n );\n console.log('');\n printSection('Top Locations');\n printRows(\n ['LOCATION', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.locations),\n useColor,\n );\n}\n\nexport function isJsonMode(global: GlobalOptions): boolean {\n return Boolean(global.json || global.jq || 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 readProjectConfig,\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\ninterface ResolvedGhostAdminOrigin {\n inputOrigin: string;\n resolvedOrigin: string;\n}\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\nfunction formatConfiguredSiteDisplay(\n alias: string | null | undefined,\n sites: Record<string, { url: string }>,\n): string {\n if (!alias) {\n return '(none)';\n }\n\n const url = sites[alias]?.url;\n if (!url) {\n return alias;\n }\n\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nfunction formatSiteDomain(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nfunction formatSwitchSiteOption(alias: string, sites: Record<string, { url: string }>): string {\n const site = sites[alias];\n if (!site) {\n return alias;\n }\n\n const domain = formatSiteDomain(site.url);\n const duplicateCount = Object.values(sites).filter(\n (configuredSite) => formatSiteDomain(configuredSite.url) === domain,\n ).length;\n\n if (duplicateCount > 1) {\n return `${domain} [${alias}]`;\n }\n\n return domain;\n}\n\nfunction resolveConfiguredSiteSelection(\n input: string | null | undefined,\n sites: Record<string, { url: string }>,\n): string | null {\n const candidate = input?.trim();\n if (!candidate) {\n return null;\n }\n\n if (sites[candidate]) {\n return candidate;\n }\n\n for (const alias of Object.keys(sites)) {\n if (formatSwitchSiteOption(alias, sites) === candidate) {\n return alias;\n }\n }\n\n const matches = Object.entries(sites)\n .filter(([, site]) => formatSiteDomain(site.url) === candidate)\n .map(([alias]) => alias);\n\n if (matches.length === 1) {\n return matches[0] ?? null;\n }\n\n return null;\n}\n\nfunction hasOriginChanged(inputOrigin: string, resolvedOrigin: string): boolean {\n return inputOrigin !== resolvedOrigin;\n}\n\nasync function confirmRedirectedOrigin(\n inputOrigin: string,\n resolvedOrigin: string,\n useColor: boolean,\n): Promise<boolean> {\n const lines = [\n 'Ghost Admin redirect detected.',\n `Requested origin: ${inputOrigin}`,\n `Resolved origin: ${resolvedOrigin}`,\n 'Continue with the resolved Ghost Admin origin?',\n ];\n const message = lines.join('\\n');\n\n console.log('');\n console.log(useColor ? chalk.yellow(message) : message);\n console.log('');\n\n const answer = await promptFn('Continue? [y/N]: ');\n const normalized = answer.trim().toLowerCase();\n return normalized === 'y' || normalized === 'yes';\n}\n\nasync function resolveGhostAdminOrigin(inputUrl: string): Promise<ResolvedGhostAdminOrigin> {\n const maxRedirects = 5;\n const inputOrigin = normalizeGhostUrl(inputUrl);\n let probeUrl = getGhostAdminEntryUrl(inputOrigin);\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 {\n inputOrigin,\n resolvedOrigin: normalizeGhostUrl(finalUrl),\n };\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 const requestedOrigin = normalizeGhostUrl(urlInput ?? '');\n const resolvedOrigin = await resolveGhostAdminOrigin(requestedOrigin);\n urlInput = resolvedOrigin.resolvedOrigin;\n\n if (hasOriginChanged(resolvedOrigin.inputOrigin, resolvedOrigin.resolvedOrigin)) {\n if (nonInteractive) {\n throw new GhstError(\n `Ghost Admin discovery resolved to '${resolvedOrigin.resolvedOrigin}' instead of '${resolvedOrigin.inputOrigin}'. Re-run with --url ${resolvedOrigin.resolvedOrigin}.`,\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n\n const shouldContinue = await confirmRedirectedOrigin(\n resolvedOrigin.inputOrigin,\n resolvedOrigin.resolvedOrigin,\n global.color !== false,\n );\n if (!shouldContinue) {\n throw new GhstError('Operation cancelled.', {\n exitCode: ExitCode.OPERATION_CANCELLED,\n code: 'OPERATION_CANCELLED',\n });\n }\n }\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: ${formatConfiguredSiteDisplay(config.active, config.sites)}`);\n for (const [alias, site] of Object.entries(config.sites)) {\n const marker = config.active === alias ? '*' : ' ';\n console.log(`${marker} ${formatSiteDomain(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 const projectConfig = await readProjectConfig();\n const projectSite = projectConfig?.site ?? null;\n const effectiveSite = projectSite ?? config.active ?? null;\n\n if (global.json) {\n console.log(\n JSON.stringify(\n {\n active: config.active ?? null,\n ...(projectSite ? { projectLink: projectSite } : {}),\n effectiveSite,\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: ${formatConfiguredSiteDisplay(config.active, config.sites)}`);\n if (projectSite) {\n console.log(\n `Project link: ${formatConfiguredSiteDisplay(projectSite, config.sites)} (overrides active site in this directory)`,\n );\n }\n for (const [alias, site] of Object.entries(config.sites)) {\n const marker = effectiveSite === alias ? '*' : ' ';\n console.log(`${marker} ${formatSiteDomain(site.url)}`);\n }\n });\n\n auth\n .command('switch [site]')\n .description('Switch active site (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} ${formatSwitchSiteOption(alias, config.sites)}`);\n }\n\n targetSite = await promptFn('Switch to site domain or alias: ');\n }\n\n const resolvedTargetSite = resolveConfiguredSiteSelection(targetSite, config.sites);\n if (!resolvedTargetSite) {\n throw new GhstError(`Unknown site alias or domain: ${targetSite ?? '(empty)'}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n config.active = resolvedTargetSite;\n await writeUserConfig(config);\n console.log(\n `Active site set to '${formatSwitchSiteOption(resolvedTargetSite, config.sites)}'.`,\n );\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 (sensitive output)')\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 { 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 { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nexport type CommentStatus = 'published' | 'hidden' | 'deleted';\n\ninterface CommentBrowseOptions {\n limit?: number;\n page?: number;\n filter?: string;\n order?: string;\n includeNested?: boolean;\n}\n\ninterface CommentRepliesOptions {\n limit?: number;\n page?: number;\n filter?: string;\n}\n\ninterface CommentRelationOptions {\n limit?: number;\n page?: number;\n}\n\nexport interface CommentThreadPayload extends Record<string, unknown> {\n comment: Record<string, unknown> | null;\n comments: Array<Record<string, unknown>>;\n meta?: 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\nfunction withDefaultLimit<T extends { limit?: number }>(params: T): T & { limit: number } {\n return {\n ...params,\n limit: params.limit ?? 100,\n };\n}\n\nexport async function listComments(\n global: GlobalOptions,\n options: CommentBrowseOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n filter: options.filter,\n order: options.order ?? 'created_at desc',\n include: 'member,post,parent',\n include_nested: options.includeNested === false ? false : undefined,\n });\n\n if (!allPages) {\n return client.comments.browseAll(params);\n }\n\n return collectAllPages('comments', (page) => client.comments.browseAll({ ...params, page }));\n}\n\nexport async function getComment(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.comments.readForModeration(id);\n}\n\nexport async function getCommentThread(\n global: GlobalOptions,\n id: string,\n): Promise<CommentThreadPayload> {\n const client = await getClient(global);\n const [selectedPayload, threadPayload] = await Promise.all([\n client.comments.readForModeration(id),\n collectAllPages('comments', (page) => client.comments.browseThread(id, { page })),\n ]);\n\n const selectedComment = Array.isArray(selectedPayload.comments)\n ? ((selectedPayload.comments[0] as Record<string, unknown> | undefined) ?? null)\n : null;\n const threadComments = Array.isArray(threadPayload.comments)\n ? (threadPayload.comments as Array<Record<string, unknown>>)\n : [];\n\n return {\n comment: selectedComment,\n comments: threadComments,\n meta:\n (threadPayload.meta as Record<string, unknown> | undefined) ??\n (selectedPayload.meta as Record<string, unknown> | undefined),\n };\n}\n\nexport async function listCommentReplies(\n global: GlobalOptions,\n id: string,\n options: CommentRepliesOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n filter: options.filter,\n include: 'member,post,count.replies,count.likes,count.reports,parent',\n });\n\n if (!allPages) {\n return client.comments.replies(id, params);\n }\n\n return collectAllPages('comments', (page) => client.comments.replies(id, { ...params, page }));\n}\n\nexport async function listCommentLikes(\n global: GlobalOptions,\n id: string,\n options: CommentRelationOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n include: 'member',\n order: 'created_at desc',\n });\n\n if (!allPages) {\n return client.comments.likes(id, params);\n }\n\n return collectAllPages('comment_likes', (page) => client.comments.likes(id, { ...params, page }));\n}\n\nexport async function listCommentReports(\n global: GlobalOptions,\n id: string,\n options: CommentRelationOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n });\n\n if (!allPages) {\n return client.comments.reports(id, params);\n }\n\n return collectAllPages('comment_reports', (page) =>\n client.comments.reports(id, { ...params, page }),\n );\n}\n\nexport async function setCommentStatus(\n global: GlobalOptions,\n id: string,\n status: CommentStatus,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.comments.setStatus(id, status);\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\nconst CommentListLimitSchema = z.union([z.number().int().positive().max(100), z.literal('all')]);\n\nfunction rejectPageWithAll<T extends { limit?: number | 'all'; page?: number }>(\n value: T,\n ctx: z.RefinementCtx,\n): void {\n if (value.limit === 'all' && value.page !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['page'],\n message: 'Cannot combine --page with --limit all',\n });\n }\n}\n\nexport const CommentListInputSchema = z\n .object({\n limit: CommentListLimitSchema.optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n order: z.string().optional(),\n topLevelOnly: z.boolean().optional(),\n })\n .superRefine(rejectPageWithAll);\n\nexport const CommentGetInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const CommentThreadInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const CommentRepliesInputSchema = z\n .object({\n id: z.string().min(1),\n limit: CommentListLimitSchema.optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n })\n .superRefine(rejectPageWithAll);\n\nexport const CommentRelationListInputSchema = z\n .object({\n id: z.string().min(1),\n limit: CommentListLimitSchema.optional(),\n page: z.number().int().positive().optional(),\n })\n .superRefine(rejectPageWithAll);\n\nexport const CommentStatusInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const CommentDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n","import type { Command } from 'commander';\nimport {\n getComment,\n getCommentThread,\n listCommentLikes,\n listCommentReplies,\n listCommentReports,\n listComments,\n setCommentStatus,\n} from '../lib/comments.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n printCommentHuman,\n printCommentLikesHuman,\n printCommentListHuman,\n printCommentReportsHuman,\n printCommentThreadHuman,\n printJson,\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 CommentDeleteInputSchema,\n CommentGetInputSchema,\n CommentListInputSchema,\n CommentRelationListInputSchema,\n CommentRepliesInputSchema,\n CommentStatusInputSchema,\n CommentThreadInputSchema,\n} from '../schemas/comment.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 registerCommentCommands(program: Command): void {\n const comment = program.command('comment').description('Comment moderation');\n\n comment\n .command('list')\n .description('List comments across the site')\n .option('--limit <numberOrAll>', 'Number of comments per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--order <order>', 'Sort order')\n .option('--top-level-only', 'Only include top-level comments')\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 = CommentListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n order: options.order,\n topLevelOnly: options.topLevelOnly,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listComments(\n global,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n filter: parsed.data.filter,\n order: parsed.data.order,\n includeNested: !parsed.data.topLevelOnly,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentListHuman(payload, global.color !== false);\n });\n\n comment\n .command('get <id>')\n .description('Get a comment by id with Admin moderation fields')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentGetInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getComment(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\n });\n\n comment\n .command('thread <id>')\n .description('Open a comment thread using the Admin moderation view')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentThreadInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getCommentThread(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentThreadHuman(payload, global.color !== false);\n });\n\n comment\n .command('replies <id>')\n .description('List replies for a comment via the raw replies endpoint')\n .option('--limit <numberOrAll>', 'Number of replies per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .action(async (id: string, 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 = CommentRepliesInputSchema.safeParse({\n id,\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 listCommentReplies(\n global,\n parsed.data.id,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n filter: parsed.data.filter,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentListHuman(payload, global.color !== false);\n });\n\n comment\n .command('likes <id>')\n .description('List likes for a comment')\n .option('--limit <numberOrAll>', 'Number of likes per page or \"all\"')\n .option('--page <number>', 'Page number')\n .action(async (id: string, 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 = CommentRelationListInputSchema.safeParse({\n id,\n limit: rawLimit,\n page: rawPage,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listCommentLikes(\n global,\n parsed.data.id,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentLikesHuman(payload, global.color !== false);\n });\n\n comment\n .command('reports <id>')\n .description('List reports for a comment')\n .option('--limit <numberOrAll>', 'Number of reports per page or \"all\"')\n .option('--page <number>', 'Page number')\n .action(async (id: string, 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 = CommentRelationListInputSchema.safeParse({\n id,\n limit: rawLimit,\n page: rawPage,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listCommentReports(\n global,\n parsed.data.id,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentReportsHuman(payload, global.color !== false);\n });\n\n comment\n .command('hide <id>')\n .description('Hide a comment')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentStatusInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await setCommentStatus(global, parsed.data.id, 'hidden');\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\n });\n\n comment\n .command('show <id>')\n .description('Show a previously hidden comment')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentStatusInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await setCommentStatus(global, parsed.data.id, 'published');\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\n });\n\n comment\n .command('delete <id>')\n .description('Delete a comment')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentDeleteInputSchema.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 comment '${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 const payload = await setCommentStatus(global, parsed.data.id, 'deleted');\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\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 (sensitive output)')\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 (sensitive output)')\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 { 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 { 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 { normalizeGhostApiPath } from '../../lib/api-path.js';\nimport { GhostClient } from '../../lib/client.js';\nimport {\n getComment,\n getCommentThread,\n listCommentLikes,\n listCommentReplies,\n listCommentReports,\n listComments,\n setCommentStatus,\n} from '../../lib/comments.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 schedulePost,\n updatePost,\n} from '../../lib/posts.js';\nimport { getSetting, listSettings, setSetting } from '../../lib/settings.js';\nimport { getSiteInfo } from '../../lib/site.js';\nimport {\n blockAccount,\n blockDomain,\n createNote,\n deleteSocialWebPost,\n derepostPost,\n disableSocialWeb,\n enableSocialWeb,\n followAccount,\n getNotificationsCount,\n getSocialWebPost,\n getSocialWebProfile,\n getSocialWebStatus,\n getSocialWebThread,\n likePost,\n listBlockedAccounts,\n listBlockedDomains,\n listFollowers,\n listFollowing,\n listNotes,\n listNotifications,\n listReader,\n listSocialWebLikes,\n listSocialWebPosts,\n replyToPost,\n repostPost,\n searchSocialWeb,\n unblockAccount,\n unblockDomain,\n unfollowAccount,\n unlikePost,\n updateSocialWebProfile,\n uploadSocialWebImage,\n} from '../../lib/socialweb.js';\nimport {\n getStatsGrowth,\n getStatsNewsletterClicks,\n getStatsNewsletterSubscribers,\n getStatsNewsletters,\n getStatsOverview,\n getStatsPost,\n getStatsPostGrowth,\n getStatsPostNewsletter,\n getStatsPostReferrers,\n getStatsPosts,\n getStatsPostWeb,\n getStatsWeb,\n getStatsWebTable,\n} from '../../lib/stats.js';\nimport { createTag, deleteTag, getTag, listTags, updateTag } from '../../lib/tags.js';\nimport { activateTheme, getUploadedThemeName, 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 | 'comments'\n | 'site'\n | 'settings'\n | 'users'\n | 'api'\n | 'search'\n | 'socialweb'\n | 'stats';\n\nexport const MCP_TOOL_GROUPS: readonly McpToolGroup[] = [\n 'posts',\n 'pages',\n 'tags',\n 'members',\n 'comments',\n 'site',\n 'settings',\n 'users',\n 'api',\n 'search',\n 'socialweb',\n 'stats',\n] as const;\n\nconst statsRangeArgs = {\n range: z.enum(['7d', '30d', '90d', '365d', 'all']).optional(),\n from: z.string().optional(),\n to: z.string().optional(),\n timezone: z.string().optional(),\n};\n\nconst statsWebArgs = {\n ...statsRangeArgs,\n audience: z.enum(['all', 'free', 'paid']).optional(),\n source: z.string().optional(),\n location: z.string().optional(),\n device: z.enum(['desktop', 'mobile-ios', 'mobile-android', 'bot', 'unknown']).optional(),\n utm_source: z.string().optional(),\n utm_medium: z.string().optional(),\n utm_campaign: z.string().optional(),\n utm_content: z.string().optional(),\n utm_term: z.string().optional(),\n limit: z.number().int().positive().max(100).optional(),\n};\n\nconst commentBrowseArgs = {\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n};\n\nconst socialWebHandleSchema = z\n .string()\n .min(1)\n .refine((value) => value === 'me' || /^@?[^@\\s]+@[^@\\s]+$/.test(value), {\n message: 'handle must be me or a federated handle like @user@domain',\n });\n\nconst socialWebRemoteHandleSchema = socialWebHandleSchema.refine((value) => value !== 'me', {\n message: 'handle must be a federated handle like @user@domain',\n});\n\nconst socialWebUrlSchema = z.string().url();\n\nconst socialWebPaginationArgs = {\n limit: z.number().int().positive().max(100).optional(),\n next: z.string().min(1).optional(),\n all_pages: z.boolean().optional(),\n};\n\nconst socialWebPaginationSchema = z\n .object({\n ...socialWebPaginationArgs,\n })\n .superRefine((value, context) => {\n if (value.all_pages && value.next) {\n context.addIssue({\n code: 'custom',\n message: 'all_pages cannot be combined with next.',\n path: ['all_pages'],\n });\n }\n });\n\nconst socialWebHandlePaginationSchema = z\n .object({\n handle: socialWebHandleSchema.optional(),\n ...socialWebPaginationArgs,\n })\n .superRefine((value, context) => {\n if (value.all_pages && value.next) {\n context.addIssue({\n code: 'custom',\n message: 'all_pages cannot be combined with next.',\n path: ['all_pages'],\n });\n }\n });\n\nconst socialWebProfileUpdateSchema = z\n .object({\n name: z.string().min(1).optional(),\n username: z.string().min(1).optional(),\n bio: z.string().optional(),\n avatar_url: socialWebUrlSchema.optional(),\n banner_image_url: socialWebUrlSchema.optional(),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.username !== undefined ||\n value.bio !== undefined ||\n value.avatar_url !== undefined ||\n value.banner_image_url !== undefined,\n {\n message: 'Provide at least one profile field to update.',\n path: ['name'],\n },\n );\n\nconst socialWebContentSchema = z\n .object({\n content: z.string().min(1),\n image_file: z.string().min(1).optional(),\n image_url: socialWebUrlSchema.optional(),\n image_alt: z.string().min(1).optional(),\n })\n .superRefine((value, context) => {\n const imageSources = [value.image_file !== undefined, value.image_url !== undefined].filter(\n Boolean,\n ).length;\n if (imageSources > 1) {\n context.addIssue({\n code: 'custom',\n message: 'Provide at most one image source with image_file or image_url.',\n path: ['image_file'],\n });\n }\n });\n\nconst statsTableViewSchema = z.enum([\n 'content',\n 'sources',\n 'locations',\n 'devices',\n 'utm-sources',\n 'utm-mediums',\n 'utm-campaigns',\n 'utm-contents',\n 'utm-terms',\n]);\n\ntype StatsRangeArgsInput = {\n range?: '7d' | '30d' | '90d' | '365d' | 'all';\n from?: string;\n to?: string;\n timezone?: string;\n};\n\ntype StatsWebArgsInput = StatsRangeArgsInput & {\n audience?: 'all' | 'free' | 'paid';\n source?: string;\n location?: string;\n device?: 'desktop' | 'mobile-ios' | 'mobile-android' | 'bot' | 'unknown';\n utm_source?: string;\n utm_medium?: string;\n utm_campaign?: string;\n utm_content?: string;\n utm_term?: string;\n limit?: number;\n};\n\nfunction mapStatsRangeArgs(args: StatsRangeArgsInput) {\n return {\n range: args.range,\n from: args.from,\n to: args.to,\n timezone: args.timezone,\n };\n}\n\nfunction mapStatsWebArgs(args: StatsWebArgsInput) {\n return {\n ...mapStatsRangeArgs(args),\n audience: args.audience,\n source: args.source,\n location: args.location,\n device: args.device,\n utmSource: args.utm_source,\n utmMedium: args.utm_medium,\n utmCampaign: args.utm_campaign,\n utmContent: args.utm_content,\n utmTerm: args.utm_term,\n limit: args.limit,\n };\n}\n\nfunction mapSocialWebPaginationArgs(args: { limit?: number; next?: string; all_pages?: boolean }) {\n return {\n params: {\n limit: args.limit,\n next: args.next,\n },\n allPages: Boolean(args.all_pages),\n };\n}\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 normalizeGhostApiPath(options.path, options.contentApi ? 'content' : 'admin'),\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_post_schedule',\n {\n description: 'Schedule a Ghost post, with optional email delivery settings.',\n inputSchema: z.object({\n id: z.string(),\n at: z.string().datetime(),\n newsletter: z.string().optional(),\n email_only: z.boolean().optional(),\n email_segment: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await schedulePost(global, args.id, args.at, {\n newsletter: args.newsletter,\n email_only: args.email_only,\n email_segment: args.email_segment,\n });\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('comments')) {\n server.registerTool(\n 'ghost_comment_list',\n {\n description: 'List Ghost comments from the Admin moderation view.',\n inputSchema: z.object({\n ...commentBrowseArgs,\n order: z.string().optional(),\n top_level_only: z.boolean().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await listComments(\n global,\n {\n limit: args.limit,\n page: args.page,\n filter: args.filter,\n order: args.order,\n includeNested: !args.top_level_only,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_get',\n {\n description: 'Get a Ghost comment with Admin moderation fields.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await getComment(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_comment_thread',\n {\n description: 'Get a Ghost comment thread using the Admin moderation thread view.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await getCommentThread(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_comment_replies',\n {\n description: 'List replies for a Ghost comment using the raw replies endpoint.',\n inputSchema: z.object({\n id: z.string(),\n ...commentBrowseArgs,\n }),\n },\n async (args) =>\n toolResult(\n await listCommentReplies(\n global,\n args.id,\n {\n limit: args.limit,\n page: args.page,\n filter: args.filter,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_likes',\n {\n description: 'List likes for a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await listCommentLikes(\n global,\n args.id,\n {\n limit: args.limit,\n page: args.page,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_reports',\n {\n description: 'List reports for a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await listCommentReports(\n global,\n args.id,\n {\n limit: args.limit,\n page: args.page,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_hide',\n {\n description: 'Hide a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await setCommentStatus(global, args.id, 'hidden')),\n );\n\n server.registerTool(\n 'ghost_comment_show',\n {\n description: 'Show a previously hidden Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await setCommentStatus(global, args.id, 'published')),\n );\n\n server.registerTool(\n 'ghost_comment_delete',\n {\n description: 'Soft-delete a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => toolResult(await setCommentStatus(global, args.id, 'deleted')),\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 let resultPayload = payload;\n\n if (args.activate) {\n const name = getUploadedThemeName(payload);\n if (!name) {\n throw new Error('Theme uploaded, but activation could not determine the theme name.');\n }\n\n resultPayload = await activateTheme(global, name);\n }\n\n return toolResult(resultPayload);\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 if (enabledGroups.has('socialweb')) {\n server.registerTool(\n 'ghost_socialweb_status',\n {\n description: 'Show Ghost social web settings and connectivity status.',\n },\n async () => toolResult(await getSocialWebStatus(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_enable',\n {\n description: 'Enable Ghost social web and return the resulting status.',\n },\n async () => toolResult(await enableSocialWeb(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_disable',\n {\n description: 'Disable Ghost social web and return the resulting status.',\n },\n async () => toolResult(await disableSocialWeb(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_profile',\n {\n description: 'Get a social web profile by federated handle or me.',\n inputSchema: z.object({\n handle: socialWebHandleSchema.optional(),\n }),\n },\n async (args) => toolResult(await getSocialWebProfile(global, args.handle ?? 'me')),\n );\n\n server.registerTool(\n 'ghost_socialweb_profile_update',\n {\n description: 'Update the current social web profile.',\n inputSchema: socialWebProfileUpdateSchema,\n },\n async (args) =>\n toolResult(\n await updateSocialWebProfile(global, {\n name: args.name,\n username: args.username,\n bio: args.bio,\n avatarUrl: args.avatar_url,\n bannerImageUrl: args.banner_image_url,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_socialweb_search',\n {\n description: 'Search social web accounts.',\n inputSchema: z.object({\n query: z.string().min(1),\n }),\n },\n async (args) => toolResult(await searchSocialWeb(global, args.query)),\n );\n\n server.registerTool(\n 'ghost_socialweb_notes',\n {\n description: 'List the social web note feed.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listNotes(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_reader',\n {\n description: 'List the social web reader feed.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listReader(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_notifications',\n {\n description: 'List social web notifications.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listNotifications(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_notifications_count',\n {\n description: 'Get the unread social web notification count.',\n },\n async () => toolResult(await getNotificationsCount(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_posts',\n {\n description: 'List posts for a social web account.',\n inputSchema: socialWebHandlePaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listSocialWebPosts(\n global,\n args.handle ?? 'me',\n pagination.params,\n pagination.allPages,\n ),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_likes',\n {\n description: 'List posts liked by the current social web account.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listSocialWebLikes(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_followers',\n {\n description: 'List followers for a social web account.',\n inputSchema: socialWebHandlePaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listFollowers(global, args.handle ?? 'me', pagination.params, pagination.allPages),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_following',\n {\n description: 'List followed accounts for a social web account.',\n inputSchema: socialWebHandlePaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listFollowing(global, args.handle ?? 'me', pagination.params, pagination.allPages),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_post',\n {\n description: 'Get a social web post by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await getSocialWebPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_thread',\n {\n description: 'Get a social web thread by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await getSocialWebThread(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_follow',\n {\n description: 'Follow a federated social web account.',\n inputSchema: z.object({\n handle: socialWebRemoteHandleSchema,\n }),\n },\n async (args) => toolResult(await followAccount(global, args.handle)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unfollow',\n {\n description: 'Unfollow a federated social web account.',\n inputSchema: z.object({\n handle: socialWebRemoteHandleSchema,\n }),\n },\n async (args) => toolResult(await unfollowAccount(global, args.handle)),\n );\n\n server.registerTool(\n 'ghost_socialweb_like',\n {\n description: 'Like a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await likePost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unlike',\n {\n description: 'Unlike a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await unlikePost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_repost',\n {\n description: 'Repost a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await repostPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_derepost',\n {\n description: 'Undo a repost on a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await derepostPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_delete',\n {\n description: 'Delete a social web post authored by the current account.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await deleteSocialWebPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_note',\n {\n description: 'Create a new social web note.',\n inputSchema: socialWebContentSchema,\n },\n async (args) =>\n toolResult(\n await createNote(global, {\n content: args.content,\n imageFile: args.image_file,\n imageUrl: args.image_url,\n imageAlt: args.image_alt,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_socialweb_reply',\n {\n description: 'Reply to a social web post.',\n inputSchema: socialWebContentSchema.extend({\n id: socialWebUrlSchema,\n }),\n },\n async (args) =>\n toolResult(\n await replyToPost(global, args.id, {\n content: args.content,\n imageFile: args.image_file,\n imageUrl: args.image_url,\n imageAlt: args.image_alt,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_socialweb_blocked_accounts',\n {\n description: 'List blocked social web accounts.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listBlockedAccounts(global, pagination.params, pagination.allPages),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_blocked_domains',\n {\n description: 'List blocked social web domains.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listBlockedDomains(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_block',\n {\n description: 'Block a social web account by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await blockAccount(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unblock',\n {\n description: 'Unblock a social web account by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await unblockAccount(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_block_domain',\n {\n description: 'Block a social web domain.',\n inputSchema: z.object({\n url: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await blockDomain(global, args.url)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unblock_domain',\n {\n description: 'Unblock a social web domain.',\n inputSchema: z.object({\n url: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await unblockDomain(global, args.url)),\n );\n\n server.registerTool(\n 'ghost_socialweb_upload',\n {\n description: 'Upload an image for social web notes and replies.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n }),\n },\n async (args) => toolResult(await uploadSocialWebImage(global, args.file_path)),\n );\n }\n\n if (enabledGroups.has('stats')) {\n server.registerTool(\n 'ghost_stats_overview',\n {\n description: 'Get the Ghost analytics overview report.',\n inputSchema: z.object({\n ...statsRangeArgs,\n }),\n },\n async (args) => toolResult(await getStatsOverview(global, mapStatsRangeArgs(args))),\n );\n\n server.registerTool(\n 'ghost_stats_web',\n {\n description: 'Get the Ghost web analytics report.',\n inputSchema: z.object({\n ...statsWebArgs,\n }),\n },\n async (args) => toolResult(await getStatsWeb(global, mapStatsWebArgs(args))),\n );\n\n server.registerTool(\n 'ghost_stats_web_table',\n {\n description: 'Get a focused Ghost web analytics table view.',\n inputSchema: z.object({\n view: statsTableViewSchema,\n ...statsWebArgs,\n }),\n },\n async (args) =>\n toolResult(\n await getStatsWebTable(global, args.view, {\n ...mapStatsWebArgs(args),\n limit: args.limit ?? 10,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_growth',\n {\n description: 'Get Ghost member and revenue growth analytics.',\n inputSchema: z.object({\n ...statsRangeArgs,\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsGrowth(global, { ...mapStatsRangeArgs(args), limit: args.limit ?? 5 }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_posts',\n {\n description: 'Get top Ghost posts by views.',\n inputSchema: z.object({\n ...statsRangeArgs,\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsPosts(global, { ...mapStatsRangeArgs(args), limit: args.limit ?? 5 }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_email',\n {\n description: 'Get Ghost email analytics grouped by newsletter.',\n inputSchema: z.object({\n ...statsRangeArgs,\n newsletter_id: z.string().optional(),\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsNewsletters(global, {\n ...mapStatsRangeArgs(args),\n newsletterId: args.newsletter_id,\n limit: args.limit ?? 10,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_email_clicks',\n {\n description:\n 'Get Ghost email click analytics for a newsletter, optionally filtered by post ids.',\n inputSchema: z.object({\n ...statsRangeArgs,\n newsletter_id: z.string(),\n post_ids: z.array(z.string()).optional(),\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsNewsletterClicks(global, {\n ...mapStatsRangeArgs(args),\n newsletterId: args.newsletter_id,\n postIds: args.post_ids,\n limit: args.limit ?? 10,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_email_subscribers',\n {\n description: 'Get Ghost newsletter subscriber analytics.',\n inputSchema: z.object({\n ...statsRangeArgs,\n newsletter_id: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsNewsletterSubscribers(global, {\n ...mapStatsRangeArgs(args),\n newsletterId: args.newsletter_id,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_post',\n {\n description: 'Get Ghost analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n }),\n },\n async (args) =>\n toolResult(await getStatsPost(global, { ...mapStatsRangeArgs(args), id: args.id })),\n );\n\n server.registerTool(\n 'ghost_stats_post_web',\n {\n description: 'Get Ghost web analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsWebArgs,\n }),\n },\n async (args) =>\n toolResult(await getStatsPostWeb(global, { ...mapStatsWebArgs(args), id: args.id })),\n );\n\n server.registerTool(\n 'ghost_stats_post_growth',\n {\n description: 'Get Ghost growth analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n }),\n },\n async (args) =>\n toolResult(await getStatsPostGrowth(global, { ...mapStatsRangeArgs(args), id: args.id })),\n );\n\n server.registerTool(\n 'ghost_stats_post_newsletter',\n {\n description: 'Get Ghost email performance analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n }),\n },\n async (args) =>\n toolResult(\n await getStatsPostNewsletter(global, { ...mapStatsRangeArgs(args), id: args.id }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_post_referrers',\n {\n description: 'Get Ghost referrer analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsPostReferrers(global, {\n ...mapStatsRangeArgs(args),\n id: args.id,\n limit: args.limit ?? 10,\n }),\n ),\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 params?: Record<string, string | number | boolean | undefined>;\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 options.params,\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 options?: {\n newsletter?: string;\n email_only?: boolean;\n email_segment?: string;\n },\n): Promise<Record<string, unknown>> {\n // Ghost requires email-related fields as query parameters on the PUT\n // endpoint for scheduled posts — passing them in the JSON body has no\n // effect. This differs from the publish transition where the body works.\n const params: Record<string, string> = {};\n if (options?.newsletter) {\n params.newsletter = options.newsletter;\n }\n if (options?.email_segment) {\n params.email_segment = options.email_segment;\n }\n if (options?.email_only !== undefined) {\n params.email_only = String(options.email_only);\n }\n\n return updatePost(global, {\n id,\n patch: {\n status: 'scheduled',\n published_at: at,\n },\n params: Object.keys(params).length > 0 ? params : undefined,\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 fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError, mapHttpStatusToExitCode } from './errors.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\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n const parts = token.split('.');\n const payload = parts[1];\n if (!payload) {\n return null;\n }\n\n try {\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n return JSON.parse(Buffer.from(padded, 'base64').toString('utf8')) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction createSocialWebError(status: number, message: string, details?: unknown): GhstError {\n return new GhstError(message, {\n code: status === 401 || status === 403 ? 'AUTH_ERROR' : 'SOCIALWEB_API_ERROR',\n exitCode: mapHttpStatusToExitCode(status),\n status,\n details,\n });\n}\n\nfunction isSocialWebAvailabilityReadPath(method: string, endpointPath: string): boolean {\n if (method !== 'GET') {\n return false;\n }\n\n return [\n '/.ghost/activitypub/v1/account/',\n '/.ghost/activitypub/v1/feed/',\n '/.ghost/activitypub/v1/notifications',\n '/.ghost/activitypub/v1/posts/',\n '/.ghost/activitypub/v1/blocks/',\n ].some((prefix) => endpointPath.startsWith(prefix));\n}\n\nexport interface SocialWebIdentityInfo {\n token: string;\n claims: {\n sub: string | null;\n role: string | null;\n exp: number | null;\n };\n}\n\nconst identityCache = new Map<string, Promise<SocialWebIdentityInfo>>();\n\nexport function resetSocialWebIdentityCacheForTests(): void {\n identityCache.clear();\n}\n\nexport class SocialWebClient {\n private connectionPromise?: Promise<Awaited<ReturnType<typeof resolveConnectionConfig>>>;\n private ghostClientPromise?: Promise<GhostClient>;\n private activityPubBaseUrlPromise?: Promise<string>;\n private identityPromise?: Promise<SocialWebIdentityInfo>;\n\n constructor(private readonly global: GlobalOptions) {}\n\n private async getConnection() {\n if (!this.connectionPromise) {\n this.connectionPromise = resolveConnectionConfig(this.global);\n }\n\n return this.connectionPromise;\n }\n\n private async getGhostClient(): Promise<GhostClient> {\n if (!this.ghostClientPromise) {\n this.ghostClientPromise = this.getConnection().then(\n (connection) =>\n new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n }),\n );\n }\n\n return this.ghostClientPromise;\n }\n\n private async getActivityPubBaseUrl(): Promise<string> {\n if (!this.activityPubBaseUrlPromise) {\n this.activityPubBaseUrlPromise = this.getGhostClient().then(async (ghostClient) => {\n const siteInfo = await ghostClient.siteInfo();\n const site = (siteInfo.site as Record<string, unknown> | undefined) ?? {};\n const siteUrl =\n typeof site.url === 'string' && site.url.trim().length > 0 ? site.url : null;\n const fallbackUrl = (await this.getConnection()).url;\n return (siteUrl ?? fallbackUrl).replace(/\\/$/, '');\n });\n }\n\n return this.activityPubBaseUrlPromise;\n }\n\n async getIdentity(): Promise<SocialWebIdentityInfo> {\n if (!this.identityPromise) {\n this.identityPromise = (async () => {\n const connection = await this.getConnection();\n const cacheKey = `${connection.url}\\0${connection.staffToken ?? ''}\\0${connection.apiVersion ?? 'v6.0'}`;\n const cached = identityCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const promise = this.getGhostClient().then(async (ghostClient) => {\n let payload: Record<string, unknown>;\n try {\n payload = await ghostClient.rawRequest<Record<string, unknown>>('/identities/');\n } catch (error) {\n const normalized = error as { status?: number; payload?: unknown; message?: string };\n if (normalized.status === 403) {\n throw new GhstError(\n 'Social web requires an Owner or Administrator staff token to bootstrap identity auth.',\n {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n status: 403,\n details: normalized.payload,\n },\n );\n }\n\n throw error;\n }\n\n const identities = Array.isArray(payload.identities)\n ? (payload.identities as Array<Record<string, unknown>>)\n : [];\n const token =\n identities[0] && typeof identities[0].token === 'string' ? identities[0].token : '';\n if (!token) {\n throw new GhstError('Ghost did not return a usable identity token for social web.', {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n details: payload,\n });\n }\n\n const decoded = decodeJwtPayload(token);\n return {\n token,\n claims: {\n sub: typeof decoded?.sub === 'string' ? decoded.sub : null,\n role: typeof decoded?.role === 'string' ? decoded.role : null,\n exp: typeof decoded?.exp === 'number' ? decoded.exp : null,\n },\n };\n });\n\n identityCache.set(cacheKey, promise);\n\n try {\n return await promise;\n } catch (error) {\n identityCache.delete(cacheKey);\n throw error;\n }\n })();\n }\n\n return this.identityPromise;\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 responseType?: 'json' | 'text';\n headers?: Record<string, string>;\n } = {},\n ): Promise<T> {\n const baseUrl = await this.getActivityPubBaseUrl();\n const identity = await this.getIdentity();\n const url = new URL(endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`, baseUrl);\n\n for (const [key, value] of Object.entries(options.params ?? {})) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const headers: Record<string, string> = {\n Accept: 'application/activity+json',\n Authorization: `Bearer ${identity.token}`,\n ...options.headers,\n };\n\n let body: string | FormData | undefined;\n if (options.body !== undefined) {\n if (typeof FormData !== 'undefined' && options.body instanceof FormData) {\n body = options.body;\n } else {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(options.body);\n }\n }\n\n const response = await fetch(url.toString(), {\n method,\n headers,\n body,\n });\n\n if (!response.ok) {\n let details: unknown;\n let message = `Social web request failed (${response.status})`;\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n\n try {\n if (contentType.includes('application/json')) {\n details = (await response.json()) as unknown;\n const detailObject = details as { code?: string; message?: string; error?: string };\n if (typeof detailObject?.message === 'string' && detailObject.message.trim()) {\n message = detailObject.message;\n } else if (typeof detailObject?.error === 'string' && detailObject.error.trim()) {\n message = detailObject.error;\n }\n\n if (detailObject?.code === 'SITE_MISSING') {\n message = 'Social web is not enabled on this site.';\n }\n } else {\n const text = await response.text();\n details = text;\n if (text.trim()) {\n message = text.trim();\n }\n }\n } catch {\n details = undefined;\n }\n\n if (response.status === 404 && isSocialWebAvailabilityReadPath(method, endpointPath)) {\n throw new GhstError(\n 'Social web is not reachable for this site. It may be disabled or the ActivityPub service may not be initialized yet.',\n {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n status: 404,\n details,\n },\n );\n }\n\n throw createSocialWebError(response.status, message, details);\n }\n\n if (response.status === 204 || response.status === 202) {\n return {} as T;\n }\n\n if (options.responseType === 'text') {\n return (await response.text()) as T;\n }\n\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n if (\n contentType.includes('application/json') ||\n contentType.includes('application/activity+json')\n ) {\n return (await response.json()) as T;\n }\n\n const text = await response.text();\n return (text.trim().length > 0 ? text : {}) as T;\n }\n\n get<T>(\n endpointPath: string,\n params?: Record<string, string | number | boolean | undefined>,\n ): Promise<T> {\n return this.request<T>('GET', endpointPath, { params });\n }\n\n post<T>(endpointPath: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', endpointPath, { body });\n }\n\n put<T>(endpointPath: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', endpointPath, { body });\n }\n\n delete<T>(endpointPath: string): Promise<T> {\n return this.request<T>('DELETE', endpointPath);\n }\n\n async uploadImage(filePath: string): Promise<Record<string, unknown>> {\n const bytes = await fs.readFile(filePath);\n const formData = new FormData();\n formData.append(\n 'file',\n new Blob([bytes], { type: inferImageMimeType(filePath) }),\n path.basename(filePath),\n );\n\n return this.request<Record<string, unknown>>('POST', '/.ghost/activitypub/v1/upload/image', {\n body: formData,\n });\n }\n}\n","import { ExitCode, GhstError } from './errors.js';\nimport { listSettings, setSetting } from './settings.js';\nimport { SocialWebClient, type SocialWebIdentityInfo } from './socialweb-client.js';\nimport type { GlobalOptions } from './types.js';\n\nexport interface SocialWebAccount {\n id: string;\n apId?: string;\n name: string;\n handle: string;\n bio?: string;\n url?: string;\n avatarUrl?: string | null;\n bannerImageUrl?: string | null;\n postCount?: number;\n likedCount?: number;\n followingCount?: number;\n followerCount?: number;\n followedByMe?: boolean;\n blockedByMe?: boolean;\n domainBlockedByMe?: boolean;\n blueskyEnabled?: boolean;\n blueskyHandleConfirmed?: boolean;\n blueskyHandle?: string | null;\n [key: string]: unknown;\n}\n\nexport interface SocialWebPost {\n id: string;\n type?: number | string;\n title?: string | null;\n excerpt?: string;\n summary?: string | null;\n content?: string;\n url?: string;\n featureImageUrl?: string | null;\n publishedAt?: string;\n likeCount?: number;\n likedByMe?: boolean;\n replyCount?: number;\n readingTimeMinutes?: number;\n attachments?: Array<Record<string, unknown>>;\n author?: Record<string, unknown>;\n authoredByMe?: boolean;\n repostCount?: number;\n repostedByMe?: boolean;\n repostedBy?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\nexport interface SocialWebNotification {\n id: string;\n type: string;\n actor: {\n id: string;\n name: string;\n handle: string;\n avatarUrl?: string | null;\n [key: string]: unknown;\n };\n post?: Record<string, unknown> | null;\n inReplyTo?: Record<string, unknown> | null;\n createdAt: string;\n [key: string]: unknown;\n}\n\nexport interface SocialWebStatusReport {\n settings: {\n social_web: boolean;\n explore_ping: boolean | null;\n explore_ping_growth: boolean | null;\n };\n identity: {\n available: boolean;\n sub: string | null;\n role: string | null;\n exp: number | null;\n };\n account: SocialWebAccount | null;\n reachable: boolean;\n}\n\ntype PaginatedKey = 'posts' | 'accounts' | 'notifications' | 'blocked_accounts' | 'blocked_domains';\ntype PaginatedParams = { limit?: number; next?: string };\nconst MAX_PAGINATION_PAGES = 100;\n\nfunction parseSettingBool(value: unknown): boolean | null {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n if (value === 'true') return true;\n if (value === 'false') return false;\n }\n\n return null;\n}\n\nfunction getSettingMap(payload: Record<string, unknown>): Map<string, unknown> {\n const settings = Array.isArray(payload.settings)\n ? (payload.settings as Array<Record<string, unknown>>)\n : [];\n return new Map(settings.map((setting) => [String(setting.key ?? ''), setting.value]));\n}\n\nfunction mergePaginatedPages(\n existing: Record<string, unknown> | null,\n next: Record<string, unknown>,\n key: PaginatedKey,\n): Record<string, unknown> {\n if (!existing) {\n return next;\n }\n\n const currentItems = Array.isArray(existing[key]) ? (existing[key] as unknown[]) : [];\n const nextItems = Array.isArray(next[key]) ? (next[key] as unknown[]) : [];\n\n return {\n ...next,\n [key]: [...currentItems, ...nextItems],\n next: next.next ?? null,\n };\n}\n\nasync function collectPaginated(\n fetchPage: (next?: string) => Promise<Record<string, unknown>>,\n key: PaginatedKey,\n allPages: boolean,\n next?: string,\n): Promise<Record<string, unknown>> {\n if (!allPages) {\n return fetchPage(next);\n }\n\n let cursor = next;\n let merged: Record<string, unknown> | null = null;\n let pageCount = 0;\n\n while (true) {\n if (++pageCount > MAX_PAGINATION_PAGES) {\n throw new GhstError('Pagination exceeded the maximum number of pages.', {\n code: 'PAGINATION_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const page = await fetchPage(cursor);\n merged = mergePaginatedPages(merged, page, key);\n const nextCursor = typeof page.next === 'string' && page.next.length > 0 ? page.next : null;\n if (!nextCursor) {\n break;\n }\n cursor = nextCursor;\n }\n\n return merged ?? { [key]: [], next: null };\n}\n\nfunction encodeHandle(handle: string): string {\n return handle === 'me' ? 'me' : encodeURIComponent(handle);\n}\n\nfunction encodeActivityPubId(id: string): string {\n return encodeURIComponent(id);\n}\n\nasync function getClient(global: GlobalOptions): Promise<SocialWebClient> {\n return new SocialWebClient(global);\n}\n\nasync function getStatusBase(global: GlobalOptions): Promise<{\n client: SocialWebClient;\n settings: SocialWebStatusReport['settings'];\n}> {\n const settingsPayload = await listSettings(global);\n const settingMap = getSettingMap(settingsPayload);\n\n return {\n client: await getClient(global),\n settings: {\n social_web: parseSettingBool(settingMap.get('social_web')) ?? false,\n explore_ping: parseSettingBool(settingMap.get('explore_ping')),\n explore_ping_growth: parseSettingBool(settingMap.get('explore_ping_growth')),\n },\n };\n}\n\nfunction identityStatus(identity: SocialWebIdentityInfo | null): SocialWebStatusReport['identity'] {\n return {\n available: Boolean(identity),\n sub: identity?.claims.sub ?? null,\n role: identity?.claims.role ?? null,\n exp: identity?.claims.exp ?? null,\n };\n}\n\nexport async function getSocialWebStatus(global: GlobalOptions): Promise<SocialWebStatusReport> {\n const { client, settings } = await getStatusBase(global);\n if (!settings.social_web) {\n return {\n settings,\n identity: identityStatus(null),\n account: null,\n reachable: false,\n };\n }\n\n try {\n const identity = await client.getIdentity();\n const account = await client.get<SocialWebAccount>('/.ghost/activitypub/v1/account/me');\n\n return {\n settings,\n identity: identityStatus(identity),\n account,\n reachable: true,\n };\n } catch {\n let identity: SocialWebIdentityInfo | null = null;\n try {\n identity = await client.getIdentity();\n } catch {\n identity = null;\n }\n\n return {\n settings,\n identity: identityStatus(identity),\n account: null,\n reachable: false,\n };\n }\n}\n\nexport async function enableSocialWeb(global: GlobalOptions): Promise<SocialWebStatusReport> {\n await setSetting(global, 'social_web', true);\n return getSocialWebStatus(global);\n}\n\nexport async function disableSocialWeb(global: GlobalOptions): Promise<SocialWebStatusReport> {\n await setSetting(global, 'social_web', false);\n const report = await getSocialWebStatus(global);\n return {\n ...report,\n settings: {\n ...report.settings,\n social_web: false,\n },\n };\n}\n\nexport async function getSocialWebProfile(\n global: GlobalOptions,\n handle: string,\n): Promise<SocialWebAccount> {\n const client = await getClient(global);\n return client.get<SocialWebAccount>(`/.ghost/activitypub/v1/account/${encodeHandle(handle)}`);\n}\n\nexport async function updateSocialWebProfile(\n global: GlobalOptions,\n patch: {\n name?: string;\n username?: string;\n bio?: string;\n avatarUrl?: string;\n bannerImageUrl?: string;\n },\n): Promise<SocialWebAccount> {\n const client = await getClient(global);\n const current = await client.get<SocialWebAccount>('/.ghost/activitypub/v1/account/me');\n const currentUsername =\n String(current.handle ?? '')\n .replace(/^@/, '')\n .split('@')[0] ?? '';\n\n await client.put<Record<string, unknown>>('/.ghost/activitypub/v1/account', {\n name: patch.name ?? current.name ?? '',\n username: patch.username ?? currentUsername,\n bio: patch.bio ?? current.bio ?? '',\n avatarUrl: patch.avatarUrl ?? current.avatarUrl ?? '',\n bannerImageUrl: patch.bannerImageUrl ?? current.bannerImageUrl ?? '',\n });\n\n return client.get<SocialWebAccount>('/.ghost/activitypub/v1/account/me');\n}\n\nexport async function searchSocialWeb(\n global: GlobalOptions,\n query: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.get<Record<string, unknown>>('/.ghost/activitypub/v1/actions/search', { query });\n}\n\nexport async function listNotes(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/feed/notes', { limit: params.limit, next }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nexport async function listReader(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/feed/reader', { limit: params.limit, next }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nexport async function listNotifications(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/notifications', { limit: params.limit, next }),\n 'notifications',\n allPages,\n params.next,\n );\n}\n\nexport async function getNotificationsCount(\n global: GlobalOptions,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.get<Record<string, unknown>>('/.ghost/activitypub/v1/notifications/unread/count');\n}\n\nexport async function resetNotificationsCount(\n global: GlobalOptions,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n await client.put<Record<string, unknown>>('/.ghost/activitypub/v1/notifications/unread/reset');\n return { count: 0, reset: true };\n}\n\nexport async function listSocialWebPosts(\n global: GlobalOptions,\n handle: string,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) =>\n client.get(`/.ghost/activitypub/v1/posts/${encodeHandle(handle)}`, {\n limit: params.limit,\n next,\n }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nexport async function listSocialWebLikes(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/posts/me/liked', { limit: params.limit, next }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nasync function listSocialWebFollows(\n global: GlobalOptions,\n handle: string,\n type: 'followers' | 'following',\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) =>\n client.get(`/.ghost/activitypub/v1/account/${encodeHandle(handle)}/follows/${type}`, {\n limit: params.limit,\n next,\n }),\n 'accounts',\n allPages,\n params.next,\n );\n}\n\nexport async function listFollowers(\n global: GlobalOptions,\n handle: string,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n return listSocialWebFollows(global, handle, 'followers', params, allPages);\n}\n\nexport async function listFollowing(\n global: GlobalOptions,\n handle: string,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n return listSocialWebFollows(global, handle, 'following', params, allPages);\n}\n\nexport async function getSocialWebPost(global: GlobalOptions, id: string): Promise<SocialWebPost> {\n const client = await getClient(global);\n return client.get<SocialWebPost>(`/.ghost/activitypub/v1/post/${encodeActivityPubId(id)}`);\n}\n\nexport async function getSocialWebThread(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n try {\n return await client.get<Record<string, unknown>>(\n `/.ghost/activitypub/v1/replies/${encodeActivityPubId(id)}`,\n );\n } catch (error) {\n const status = (error as { status?: number }).status;\n if (status !== 404) {\n throw error;\n }\n\n await client.get<Record<string, unknown>>(\n `/.ghost/activitypub/v1/post/${encodeActivityPubId(id)}`,\n );\n return client.get<Record<string, unknown>>(\n `/.ghost/activitypub/v1/replies/${encodeActivityPubId(id)}`,\n );\n }\n}\n\nexport async function followAccount(\n global: GlobalOptions,\n handle: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/follow/${encodeHandle(handle)}`,\n );\n}\n\nexport async function unfollowAccount(\n global: GlobalOptions,\n handle: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unfollow/${encodeHandle(handle)}`,\n );\n}\n\nexport async function likePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/like/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function unlikePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unlike/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function repostPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/repost/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function derepostPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/derepost/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function deleteSocialWebPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.delete<Record<string, unknown>>(\n `/.ghost/activitypub/v1/post/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function uploadSocialWebImage(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.uploadImage(filePath);\n}\n\nasync function resolveImagePayload(\n global: GlobalOptions,\n options: { imageFile?: string; imageUrl?: string; imageAlt?: string },\n): Promise<{ url: string; altText?: string } | undefined> {\n if (options.imageFile) {\n const uploaded = await uploadSocialWebImage(global, options.imageFile);\n const fileUrl = typeof uploaded.fileUrl === 'string' ? uploaded.fileUrl : '';\n return fileUrl ? { url: fileUrl, altText: options.imageAlt } : undefined;\n }\n\n if (options.imageUrl) {\n return { url: options.imageUrl, altText: options.imageAlt };\n }\n\n return undefined;\n}\n\nexport async function createNote(\n global: GlobalOptions,\n options: {\n content: string;\n imageFile?: string;\n imageUrl?: string;\n imageAlt?: string;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const image = await resolveImagePayload(global, options);\n return client.post<Record<string, unknown>>('/.ghost/activitypub/v1/actions/note', {\n content: options.content,\n ...(image ? { image } : {}),\n });\n}\n\nexport async function replyToPost(\n global: GlobalOptions,\n id: string,\n options: {\n content: string;\n imageFile?: string;\n imageUrl?: string;\n imageAlt?: string;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const image = await resolveImagePayload(global, options);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/reply/${encodeActivityPubId(id)}`,\n {\n content: options.content,\n ...(image ? { image } : {}),\n },\n );\n}\n\nexport async function listBlockedAccounts(\n global: GlobalOptions,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/blocks/accounts', { limit: params.limit, next }),\n 'blocked_accounts',\n allPages,\n params.next,\n );\n}\n\nexport async function listBlockedDomains(\n global: GlobalOptions,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/blocks/domains', { limit: params.limit, next }),\n 'blocked_domains',\n allPages,\n params.next,\n );\n}\n\nexport async function blockAccount(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/block/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function unblockAccount(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unblock/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function blockDomain(\n global: GlobalOptions,\n url: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/block/domain/${encodeActivityPubId(url)}`,\n );\n}\n\nexport async function unblockDomain(\n global: GlobalOptions,\n url: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unblock/domain/${encodeActivityPubId(url)}`,\n );\n}\n","import type {\n StatsGrowthInput,\n StatsNewsletterClicksInput,\n StatsNewsletterSubscribersInput,\n StatsNewslettersInput,\n StatsOverviewInput,\n StatsPostGrowthInput,\n StatsPostInput,\n StatsPostNewsletterInput,\n StatsPostReferrersInput,\n StatsPostsInput,\n StatsPostWebInput,\n StatsWebInput,\n StatsWebTableInput,\n} from '../schemas/stats.js';\nimport { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError, mapHttpStatusToExitCode } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\ntype TinybirdPrimitive = string | number | boolean | undefined;\ntype TinybirdParams = Record<string, TinybirdPrimitive>;\ntype TinybirdRow = Record<string, unknown>;\ntype SettingsRecord = Record<string, unknown>;\nconst ALL_RANGE_DATE_FROM = '1970-01-01';\n\ninterface StatsBootstrap {\n config: Record<string, unknown>;\n settings: SettingsRecord[];\n site: Record<string, unknown>;\n}\n\ninterface StatsConfigRecord extends Record<string, unknown> {\n id?: string;\n endpoint?: string;\n endpointBrowser?: string;\n version?: string;\n local?: {\n enabled?: boolean;\n endpoint?: string;\n };\n}\n\nexport interface StatsRange {\n preset: '7d' | '30d' | '90d' | '365d' | 'all';\n from: string | null;\n to: string;\n timezone: string;\n}\n\nexport interface StatsFilters {\n audience: 'all' | 'free' | 'paid';\n source: string | null;\n location: string | null;\n device: 'desktop' | 'mobile-ios' | 'mobile-android' | 'bot' | 'unknown' | null;\n utm_source: string | null;\n utm_medium: string | null;\n utm_campaign: string | null;\n utm_content: string | null;\n utm_term: string | null;\n}\n\nexport interface StatsKpis {\n visits: number;\n pageviews: number;\n bounce_rate: number;\n avg_session_sec: number;\n active_visitors: number;\n}\n\nexport interface StatsContentRow {\n id: string | null;\n uuid: string | null;\n title: string;\n pathname: string;\n url: string | null;\n type: string | null;\n visits: number;\n pageviews: number;\n}\n\nexport interface StatsBreakdownRow {\n key: string;\n label: string;\n visits: number;\n pageviews: number | null;\n signups: number | null;\n paid_conversions: number | null;\n mrr: number | null;\n}\n\nexport interface StatsSeriesPoint {\n date: string;\n free_members: number | null;\n paid_members: number | null;\n total_members: number | null;\n mrr: number | null;\n subscriptions: number | null;\n}\n\nexport interface StatsTrafficPoint {\n date: string;\n visits: number;\n pageviews: number;\n bounce_rate: number;\n avg_session_sec: number;\n}\n\nexport interface StatsSubscriptionTotal {\n tier: string;\n label: string;\n count: number;\n}\n\nexport interface StatsWebReport {\n range: StatsRange;\n filters: StatsFilters;\n kpis: StatsKpis;\n timeseries: StatsTrafficPoint[];\n content: StatsContentRow[];\n sources: StatsBreakdownRow[];\n locations: StatsBreakdownRow[];\n}\n\nexport interface StatsWebTableReport {\n range: StatsRange;\n filters: StatsFilters;\n metric: string;\n items: StatsBreakdownRow[] | StatsContentRow[];\n}\n\nexport interface StatsGrowthReport {\n range: StatsRange;\n summary: {\n free_members: number;\n paid_members: number;\n total_members: number;\n member_delta: number;\n paid_delta: number;\n mrr: number;\n mrr_delta: number;\n total_subscriptions: number;\n subscription_delta: number;\n currency: string | null;\n };\n members: StatsSeriesPoint[];\n mrr: StatsSeriesPoint[];\n subscriptions: {\n history: StatsSeriesPoint[];\n totals: StatsSubscriptionTotal[];\n };\n sources: StatsBreakdownRow[];\n}\n\nexport interface StatsNewsletterSummaryRow {\n newsletter_id: string;\n newsletter_name: string;\n newsletter_slug: string | null;\n sent_posts: number;\n recipients: number;\n opened: number;\n clicked: number;\n open_rate: number;\n click_rate: number;\n subscribers: number;\n subscriber_delta: number;\n}\n\nexport interface StatsNewslettersReport {\n range: StatsRange;\n newsletters: StatsNewsletterSummaryRow[];\n}\n\nexport interface StatsNewsletterClicksRow {\n post_id: string | null;\n post_title: string;\n send_date: string | null;\n recipients: number;\n clicks: number;\n click_rate: number;\n}\n\nexport interface StatsNewsletterClicksReport {\n range: StatsRange;\n newsletter: {\n id: string;\n name: string;\n slug: string | null;\n };\n posts: string[];\n clicks: StatsNewsletterClicksRow[];\n}\n\nexport interface StatsNewsletterSubscribersRow {\n newsletter_id: string;\n newsletter_name: string;\n newsletter_slug: string | null;\n subscribers: number;\n subscriber_delta: number;\n history: Array<{ date: string; total: number; delta: number }>;\n}\n\nexport interface StatsNewsletterSubscribersReport {\n range: StatsRange;\n newsletters: StatsNewsletterSubscribersRow[];\n}\n\nexport interface StatsPostMeta {\n id: string;\n uuid: string | null;\n title: string;\n slug: string | null;\n url: string | null;\n published_at?: string | null;\n}\n\nexport interface StatsPostSummary {\n visitors: number;\n pageviews: number;\n free_members: number;\n paid_members: number;\n mrr: number;\n email_recipients: number;\n email_open_rate: number;\n email_click_rate: number;\n}\n\nexport interface StatsPostReferrerRow {\n source: string;\n visits: number;\n signups: number;\n paid_conversions: number;\n mrr: number;\n}\n\nexport interface StatsPostGrowthPoint {\n date: string;\n free_members: number;\n paid_members: number;\n mrr: number;\n}\n\nexport interface StatsPostNewsletterReport {\n range: StatsRange;\n post: StatsPostMeta;\n newsletter: {\n recipients: number;\n open_rate: number;\n click_rate: number;\n };\n}\n\nexport interface StatsPostGrowthReport {\n range: StatsRange;\n post: StatsPostMeta;\n growth: StatsPostGrowthPoint[];\n}\n\nexport interface StatsPostReferrersReport {\n range: StatsRange;\n post: StatsPostMeta;\n referrers: StatsPostReferrerRow[];\n}\n\nexport interface StatsPostWebReport {\n range: StatsRange;\n filters: StatsFilters;\n post: StatsPostMeta;\n kpis: StatsKpis;\n timeseries: StatsTrafficPoint[];\n sources: StatsBreakdownRow[];\n locations: StatsBreakdownRow[];\n}\n\nexport interface StatsPostViewsRow {\n post_id: string;\n title: string;\n published_at: string | null;\n feature_image: string | null;\n status: string | null;\n authors: string;\n views: number;\n sent_count: number | null;\n opened_count: number | null;\n open_rate: number | null;\n clicked_count: number;\n click_rate: number | null;\n members: number;\n free_members: number;\n paid_members: number;\n}\n\nexport interface StatsPostsReport {\n range: StatsRange;\n posts: StatsPostViewsRow[];\n}\n\ninterface StatsPostSummaryFallback {\n free_members: number;\n paid_members: number;\n email_recipients: number;\n email_open_rate: number;\n email_click_rate: number;\n}\n\nexport interface StatsPostReport {\n range: StatsRange;\n post: StatsPostMeta;\n summary: StatsPostSummary;\n web: StatsPostWebReport | null;\n growth: StatsPostGrowthPoint[];\n referrers: StatsPostReferrerRow[];\n}\n\nexport interface StatsOverviewReport {\n range: StatsRange;\n summary: {\n visitors: number;\n pageviews: number;\n bounce_rate: number;\n avg_session_sec: number;\n active_visitors: number;\n total_members: number;\n member_delta: number;\n paid_members: number;\n paid_delta: number;\n mrr: number;\n mrr_delta: number;\n };\n web: StatsWebReport;\n growth: StatsGrowthReport;\n newsletters: StatsNewslettersReport;\n}\n\nfunction getArray(payload: unknown, key = 'stats'): Record<string, unknown>[] {\n if (!payload || typeof payload !== 'object') {\n return [];\n }\n\n const value = (payload as Record<string, unknown>)[key];\n return Array.isArray(value) ? (value as Record<string, unknown>[]) : [];\n}\n\nfunction getObject(payload: unknown, key: string): Record<string, unknown> {\n if (!payload || typeof payload !== 'object') {\n return {};\n }\n\n const value = (payload as Record<string, unknown>)[key];\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction getString(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n return String(value);\n}\n\nfunction getNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n\n return 0;\n}\n\nfunction getNullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n const parsed = getNumber(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction formatDateInTimeZone(date: Date, timeZone: string): string {\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n const parts = formatter.formatToParts(date);\n const year = parts.find((part) => part.type === 'year')?.value ?? '1970';\n const month = parts.find((part) => part.type === 'month')?.value ?? '01';\n const day = parts.find((part) => part.type === 'day')?.value ?? '01';\n return `${year}-${month}-${day}`;\n}\n\nfunction subtractDays(dateString: string, days: number): string {\n const [year, month, day] = dateString.split('-').map((value) => Number(value));\n const safeYear = typeof year === 'number' && Number.isFinite(year) ? year : 1970;\n const safeMonth = typeof month === 'number' && Number.isFinite(month) ? month : 1;\n const safeDay = typeof day === 'number' && Number.isFinite(day) ? day : 1;\n const date = new Date(Date.UTC(safeYear, safeMonth - 1, safeDay));\n date.setUTCDate(date.getUTCDate() - days);\n return date.toISOString().slice(0, 10);\n}\n\nfunction lastValue<T>(items: T[]): T | null {\n return items.length > 0 ? (items[items.length - 1] ?? null) : null;\n}\n\nfunction deltaOf(items: Array<number | null>): number {\n if (items.length === 0) {\n return 0;\n }\n\n const first = items.find((value) => value !== null) ?? 0;\n const last = [...items].reverse().find((value) => value !== null) ?? 0;\n return Number(last) - Number(first);\n}\n\nfunction normalizePercentValue(value: unknown): number {\n const numeric = getNumber(value);\n const normalized = numeric <= 1 ? numeric * 100 : numeric;\n return Number(normalized.toFixed(2));\n}\n\nfunction isDateWithinRange(date: string | null | undefined, range: StatsRange): boolean {\n if (!date) {\n return false;\n }\n\n const dateOnly = date.slice(0, 10);\n if (range.from && dateOnly < range.from) {\n return false;\n }\n\n return dateOnly <= range.to;\n}\n\nfunction clipDatedRows<T extends { date: string }>(rows: T[], range: StatsRange): T[] {\n return rows.filter((row) => isDateWithinRange(row.date, range));\n}\n\nfunction hasExplicitWindowOverride(\n input: Pick<StatsOverviewInput, 'range' | 'from' | 'to'>,\n): boolean {\n return Boolean(input.range || input.from || input.to);\n}\n\nfunction getRangePresetDays(preset: StatsRange['preset']): number | null {\n switch (preset) {\n case '7d':\n return 7;\n case '30d':\n return 30;\n case '90d':\n return 90;\n case '365d':\n return 365;\n case 'all':\n return null;\n }\n}\n\nfunction settingValue(settings: SettingsRecord[], key: string): unknown {\n const match = settings.find((entry) => entry.key === key);\n return match?.value;\n}\n\nfunction resolveFilters(\n input: Pick<\n StatsWebInput,\n | 'audience'\n | 'source'\n | 'location'\n | 'device'\n | 'utmSource'\n | 'utmMedium'\n | 'utmCampaign'\n | 'utmContent'\n | 'utmTerm'\n >,\n): StatsFilters {\n return {\n audience: input.audience ?? 'all',\n source: input.source ?? null,\n location: input.location ?? null,\n device: input.device ?? null,\n utm_source: input.utmSource ?? null,\n utm_medium: input.utmMedium ?? null,\n utm_campaign: input.utmCampaign ?? null,\n utm_content: input.utmContent ?? null,\n utm_term: input.utmTerm ?? null,\n };\n}\n\nfunction makeAnalyticsUnavailableError(): GhstError {\n return new GhstError('Ghost web analytics is unavailable for this site.', {\n code: 'ANALYTICS_UNAVAILABLE',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n}\n\nfunction normalizeKpis(\n kpiRows: Record<string, unknown>[],\n activeRow: Record<string, unknown> | undefined,\n): StatsKpis {\n const totals = kpiRows.reduce<{\n visits: number;\n pageviews: number;\n bounceNumerator: number;\n durationNumerator: number;\n }>(\n (acc, row) => {\n const visits = getNumber(row.visits);\n const pageviews = getNumber(row.pageviews);\n const bounceRate = normalizePercentValue(row.bounce_rate);\n const avgSessionSec = getNumber(row.avg_session_sec);\n\n return {\n visits: acc.visits + visits,\n pageviews: acc.pageviews + pageviews,\n bounceNumerator: acc.bounceNumerator + visits * bounceRate,\n durationNumerator: acc.durationNumerator + visits * avgSessionSec,\n };\n },\n {\n visits: 0,\n pageviews: 0,\n bounceNumerator: 0,\n durationNumerator: 0,\n },\n );\n\n return {\n visits: totals.visits,\n pageviews: totals.pageviews,\n bounce_rate: totals.visits > 0 ? totals.bounceNumerator / totals.visits : 0,\n avg_session_sec: totals.visits > 0 ? totals.durationNumerator / totals.visits : 0,\n active_visitors: getNumber(\n activeRow?.active_visitors ?? activeRow?.visitors ?? activeRow?.count ?? 0,\n ),\n };\n}\n\nfunction normalizeTrafficSeries(rows: Record<string, unknown>[]): StatsTrafficPoint[] {\n return rows\n .map((row) => ({\n date: getString(row.date) ?? '',\n visits: getNumber(row.visits),\n pageviews: getNumber(row.pageviews),\n bounce_rate: normalizePercentValue(row.bounce_rate),\n avg_session_sec: getNumber(row.avg_session_sec),\n }))\n .filter((row) => row.date.length > 0);\n}\n\nfunction normalizeContentRow(row: Record<string, unknown>): StatsContentRow {\n return {\n id: getString(row.id ?? row.post_id),\n uuid: getString(row.uuid ?? row.post_uuid),\n title: getString(row.title ?? row.post_title ?? row.pathname) ?? '(untitled)',\n pathname: getString(row.pathname) ?? '/',\n url: getString(row.url),\n type: getString(row.type ?? row.post_type),\n visits: getNumber(row.visits),\n pageviews: getNumber(row.pageviews ?? row.views),\n };\n}\n\nfunction normalizeBreakdownRow(\n row: Record<string, unknown>,\n keys: string[],\n fallbackLabel: string,\n): StatsBreakdownRow {\n const key =\n keys\n .map((entry) => getString(row[entry]))\n .find((entry) => Boolean(entry && entry.length > 0)) ?? fallbackLabel;\n\n return {\n key,\n label: key,\n visits: getNumber(row.visits ?? row.count),\n pageviews: getNullableNumber(row.pageviews),\n signups: getNullableNumber(row.signups ?? row.free_members),\n paid_conversions: getNullableNumber(row.paid_conversions ?? row.paid_members),\n mrr: getNullableNumber(row.mrr),\n };\n}\n\nfunction normalizeMembersSeries(rows: Record<string, unknown>[]): StatsSeriesPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: getNullableNumber(row.free_members ?? row.free),\n paid_members: getNullableNumber(row.paid_members ?? row.paid),\n total_members: getNullableNumber(\n row.total_members ??\n row.members ??\n row.all_members ??\n row.total ??\n row.count ??\n getNumber(row.free_members ?? row.free) +\n getNumber(row.paid_members ?? row.paid) +\n getNumber(row.comped),\n ),\n mrr: null,\n subscriptions: null,\n }));\n}\n\nfunction normalizeMrrSeries(rows: Record<string, unknown>[]): StatsSeriesPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: null,\n paid_members: null,\n total_members: null,\n mrr: getNullableNumber(row.mrr),\n subscriptions: null,\n }));\n}\n\nfunction normalizeSubscriptionsHistory(rows: Record<string, unknown>[]): StatsSeriesPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: null,\n paid_members: null,\n total_members: null,\n mrr: null,\n subscriptions: getNullableNumber(row.count ?? row.subscriptions),\n }));\n}\n\nfunction normalizeTopSources(rows: Record<string, unknown>[]): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, ['source'], 'Direct'));\n}\n\nfunction normalizeLocations(rows: Record<string, unknown>[]): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, ['location', 'country'], 'Unknown'));\n}\n\nfunction normalizeDevices(rows: Record<string, unknown>[]): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, ['device'], 'unknown'));\n}\n\nfunction normalizeUtm(rows: Record<string, unknown>[], field: string): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, [field], '(none)'));\n}\n\nfunction normalizePostReferrers(rows: Record<string, unknown>[]): StatsPostReferrerRow[] {\n return rows.map((row) => ({\n source: getString(row.source) ?? 'Direct',\n visits: getNumber(row.visits ?? row.count),\n signups: getNumber(row.signups ?? row.free_members),\n paid_conversions: getNumber(row.paid_conversions ?? row.paid_members),\n mrr: getNumber(row.mrr),\n }));\n}\n\nfunction normalizePostGrowth(rows: Record<string, unknown>[]): StatsPostGrowthPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: getNumber(row.free_members),\n paid_members: getNumber(row.paid_members),\n mrr: getNumber(row.mrr),\n }));\n}\n\nfunction normalizeTopPostsViews(rows: Record<string, unknown>[]): StatsPostViewsRow[] {\n return rows.map((row) => ({\n post_id: getString(row.post_id ?? row.id) ?? '',\n title: getString(row.title) ?? '(untitled)',\n published_at: getString(row.published_at),\n feature_image: getString(row.feature_image),\n status: getString(row.status),\n authors: getString(row.authors) ?? '',\n views: getNumber(row.views ?? row.visits),\n sent_count: getNullableNumber(row.sent_count ?? row.email_count),\n opened_count: getNullableNumber(row.opened_count),\n open_rate:\n row.open_rate === null || row.open_rate === undefined\n ? null\n : normalizePercentValue(row.open_rate),\n clicked_count: getNumber(row.clicked_count ?? row.total_clicks),\n click_rate:\n row.click_rate === null || row.click_rate === undefined\n ? null\n : normalizePercentValue(row.click_rate),\n members: getNumber(row.members),\n free_members: getNumber(row.free_members),\n paid_members: getNumber(row.paid_members),\n }));\n}\n\nfunction buildPostSummaryFallback(row: StatsPostViewsRow | null): StatsPostSummaryFallback | null {\n if (!row) {\n return null;\n }\n\n return {\n free_members: row.free_members,\n paid_members: row.paid_members,\n email_recipients: row.sent_count ?? 0,\n email_open_rate: row.open_rate ?? 0,\n email_click_rate: row.click_rate ?? 0,\n };\n}\n\nfunction normalizeNewsletterClicks(rows: Record<string, unknown>[]): StatsNewsletterClicksRow[] {\n return rows.map((row) => ({\n post_id: getString(row.post_id),\n post_title: getString(row.post_title ?? row.title) ?? '(untitled)',\n send_date: getString(row.send_date),\n recipients: getNumber(row.sent_to ?? row.recipients ?? row.email_count),\n clicks: getNumber(row.total_clicks ?? row.clicked ?? row.clicks ?? row.click_count),\n click_rate: Number(\n (getNumber(row.click_rate) * (getNumber(row.click_rate) <= 1 ? 100 : 1)).toFixed(2),\n ),\n }));\n}\n\nfunction mergeNewsletterClickStats(\n basicStatsRows: Record<string, unknown>[],\n clickRows: Record<string, unknown>[],\n): Record<string, unknown>[] {\n const clickRowsByPostId = new Map<string, Record<string, unknown>>();\n\n for (const row of clickRows) {\n const postId = getString(row.post_id);\n if (postId) {\n clickRowsByPostId.set(postId, row);\n }\n }\n\n return basicStatsRows.map((row) => {\n const postId = getString(row.post_id);\n const clickRow = postId ? clickRowsByPostId.get(postId) : undefined;\n\n return {\n ...row,\n total_clicks: clickRow?.total_clicks ?? row.total_clicks ?? 0,\n click_rate: clickRow?.click_rate ?? row.click_rate ?? 0,\n email_count: clickRow?.email_count ?? row.email_count ?? row.sent_to ?? row.recipients ?? 0,\n };\n });\n}\n\nfunction extractPostSummary(raw: unknown): StatsPostSummary {\n const statsObject = getObject(raw, 'stats');\n const dataObject = getObject(raw, 'data');\n const source = Object.keys(statsObject).length > 0 ? statsObject : dataObject;\n\n return {\n visitors: getNumber(source.visitors ?? source.visits),\n pageviews: getNumber(source.pageviews ?? source.views),\n free_members: getNumber(source.free_members),\n paid_members: getNumber(source.paid_members),\n mrr: getNumber(source.mrr),\n email_recipients: getNumber(source.email_recipients ?? source.email_recipients_count),\n email_open_rate: normalizePercentValue(source.email_open_rate ?? source.open_rate),\n email_click_rate: normalizePercentValue(source.email_click_rate ?? source.click_rate),\n };\n}\n\nfunction newsletterStatsSummary(\n newsletter: Record<string, unknown>,\n basicStatsRows: Record<string, unknown>[],\n subscriberHistory: Array<{ date: string; total: number; delta: number }>,\n): StatsNewsletterSummaryRow {\n const recipients = basicStatsRows.reduce(\n (sum, row) => sum + getNumber(row.sent_to ?? row.recipients ?? row.email_count),\n 0,\n );\n const opened = basicStatsRows.reduce(\n (sum, row) => sum + getNumber(row.total_opens ?? row.opened ?? row.opens ?? row.open_count),\n 0,\n );\n const clicked = basicStatsRows.reduce(\n (sum, row) => sum + getNumber(row.total_clicks ?? row.clicked ?? row.clicks ?? row.click_count),\n 0,\n );\n const latestSubscriber = lastValue(subscriberHistory);\n\n return {\n newsletter_id: String(newsletter.id ?? ''),\n newsletter_name: getString(newsletter.name) ?? '(untitled)',\n newsletter_slug: getString(newsletter.slug),\n sent_posts: basicStatsRows.length,\n recipients,\n opened,\n clicked,\n open_rate: recipients > 0 ? Number(((opened / recipients) * 100).toFixed(2)) : 0,\n click_rate: recipients > 0 ? Number(((clicked / recipients) * 100).toFixed(2)) : 0,\n subscribers: latestSubscriber?.total ?? 0,\n subscriber_delta: latestSubscriber?.delta ?? 0,\n };\n}\n\nfunction summarizePostGrowth(\n points: StatsPostGrowthPoint[],\n): Pick<StatsPostSummary, 'free_members' | 'paid_members' | 'mrr'> {\n const latest = lastValue(points);\n\n return {\n free_members: latest?.free_members ?? 0,\n paid_members: latest?.paid_members ?? 0,\n mrr: latest?.mrr ?? 0,\n };\n}\n\nfunction buildPostEmailSummary(\n summary: StatsPostSummary,\n range: StatsRange,\n post: StatsPostMeta,\n): Pick<StatsPostSummary, 'email_recipients' | 'email_open_rate' | 'email_click_rate'> {\n if (!post.published_at) {\n return {\n email_recipients: summary.email_recipients,\n email_open_rate: summary.email_open_rate,\n email_click_rate: summary.email_click_rate,\n };\n }\n\n if (!isDateWithinRange(post.published_at, range)) {\n return {\n email_recipients: 0,\n email_open_rate: 0,\n email_click_rate: 0,\n };\n }\n\n return {\n email_recipients: summary.email_recipients,\n email_open_rate: summary.email_open_rate,\n email_click_rate: summary.email_click_rate,\n };\n}\n\nfunction normalizeSubscriptionTotals(\n rows: Record<string, unknown>[],\n fallbackTotals: StatsSubscriptionTotal[],\n range: StatsRange,\n): StatsSubscriptionTotal[] {\n const latestByTier = new Map<string, Record<string, unknown>>();\n\n for (const row of rows) {\n const date = getString(row.date);\n if (!isDateWithinRange(date, range)) {\n continue;\n }\n\n const tier = getString(row.tier) ?? '';\n if (!tier) {\n continue;\n }\n\n const existing = latestByTier.get(tier);\n if (!existing || (getString(existing.date) ?? '') <= (date ?? '')) {\n latestByTier.set(tier, row);\n }\n }\n\n if (latestByTier.size === 0) {\n return fallbackTotals;\n }\n\n return [...latestByTier.entries()].map(([tier, row]) => ({\n tier,\n label: getString(row.label ?? row.name ?? row.tier) ?? tier,\n count: getNumber(row.count),\n }));\n}\n\nclass StatsClient {\n private readonly global: GlobalOptions;\n private connectionPromise?: Promise<Awaited<ReturnType<typeof resolveConnectionConfig>>>;\n private clientPromise?: Promise<GhostClient>;\n private bootstrapPromise?: Promise<StatsBootstrap>;\n private tokenPromise?: Promise<string>;\n private postCache = new Map<string, StatsPostMeta>();\n\n constructor(global: GlobalOptions) {\n this.global = global;\n }\n\n private async getConnection() {\n if (!this.connectionPromise) {\n this.connectionPromise = resolveConnectionConfig(this.global);\n }\n\n return this.connectionPromise;\n }\n\n private async getClient(): Promise<GhostClient> {\n if (!this.clientPromise) {\n this.clientPromise = this.getConnection().then(\n (connection) =>\n new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n }),\n );\n }\n\n return this.clientPromise;\n }\n\n private async getBootstrap(): Promise<StatsBootstrap> {\n if (!this.bootstrapPromise) {\n this.bootstrapPromise = this.getClient().then(async (client) => {\n const [configResponse, settingsResponse, siteResponse] = await Promise.all([\n client.rawRequest<Record<string, unknown>>('/config/'),\n client.rawRequest<Record<string, unknown>>('/settings/'),\n client.rawRequest<Record<string, unknown>>('/site/'),\n ]);\n\n return {\n config: getObject(configResponse, 'config'),\n settings: getArray(settingsResponse, 'settings'),\n site: getObject(siteResponse, 'site'),\n };\n });\n }\n\n return this.bootstrapPromise;\n }\n\n private async getTimeZone(requested?: string): Promise<string> {\n if (requested) {\n return requested;\n }\n\n const bootstrap = await this.getBootstrap();\n const siteTz =\n getString(settingValue(bootstrap.settings, 'timezone')) ??\n getString(settingValue(bootstrap.settings, 'active_timezone'));\n if (siteTz) {\n return siteTz;\n }\n\n const systemTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n return systemTz || 'UTC';\n }\n\n private async resolveLifetimeRange(requested?: string): Promise<StatsRange> {\n const timezone = await this.getTimeZone(requested);\n const today = formatDateInTimeZone(new Date(), timezone);\n\n return {\n preset: 'all',\n from: null,\n to: today,\n timezone,\n };\n }\n\n async resolveRange(\n input: Pick<StatsOverviewInput, 'range' | 'from' | 'to' | 'timezone'>,\n ): Promise<StatsRange> {\n const timezone = await this.getTimeZone(input.timezone);\n const preset = input.range ?? '30d';\n const today = formatDateInTimeZone(new Date(), timezone);\n const to = input.to ?? today;\n const explicitRange = input.from !== undefined || input.to !== undefined;\n\n if (preset === 'all' && !input.from) {\n return {\n preset,\n from: null,\n to,\n timezone,\n };\n }\n\n const days = getRangePresetDays(preset) ?? 30;\n const from =\n input.from ?? (explicitRange ? subtractDays(to, days - 1) : subtractDays(today, days - 1));\n\n return {\n preset,\n from,\n to,\n timezone,\n };\n }\n\n private async getStatsConfig(): Promise<StatsConfigRecord> {\n const bootstrap = await this.getBootstrap();\n const stats = bootstrap.config.stats;\n if (!stats || typeof stats !== 'object' || Array.isArray(stats)) {\n throw makeAnalyticsUnavailableError();\n }\n\n return stats as StatsConfigRecord;\n }\n\n private async getTinybirdToken(): Promise<string> {\n if (!this.tokenPromise) {\n this.tokenPromise = this.getClient().then(async (client) => {\n const payload = await client.rawRequest<Record<string, unknown>>('/tinybird/token/');\n const token = getString(getObject(payload, 'tinybird').token);\n if (!token) {\n throw new GhstError('Tinybird token was not returned by Ghost.', {\n code: 'ANALYTICS_UNAVAILABLE',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n return token;\n });\n }\n\n return this.tokenPromise;\n }\n\n private async tinybirdQuery(pipeName: string, params: TinybirdParams): Promise<TinybirdRow[]> {\n const statsConfig = await this.getStatsConfig();\n const token = await this.getTinybirdToken();\n const baseUrl = statsConfig.local?.enabled\n ? getString(statsConfig.local.endpoint)\n : getString(statsConfig.endpointBrowser ?? statsConfig.endpoint);\n\n const siteUuid = getString(statsConfig.id);\n if (!baseUrl || !siteUuid) {\n throw makeAnalyticsUnavailableError();\n }\n\n const version = getString(statsConfig.version);\n const finalPipe = version ? `${pipeName}_${version}` : pipeName;\n const url = new URL(`/v0/pipes/${finalPipe}.json`, baseUrl);\n url.searchParams.set('site_uuid', siteUuid);\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null || value === '') {\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n\n const response = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n throw new GhstError(`Analytics request failed (${response.status})`, {\n code: 'ANALYTICS_REQUEST_FAILED',\n exitCode: mapHttpStatusToExitCode(response.status),\n status: response.status,\n });\n }\n\n const payload = (await response.json()) as Record<string, unknown>;\n return Array.isArray(payload.data) ? (payload.data as TinybirdRow[]) : [];\n }\n\n private buildRangeParams(range: StatsRange): TinybirdParams {\n return {\n date_from: range.from ?? (range.preset === 'all' ? ALL_RANGE_DATE_FROM : undefined),\n date_to: range.to,\n timezone: range.timezone,\n };\n }\n\n private buildFilterParams(\n filters: StatsFilters,\n extra: Record<string, TinybirdPrimitive> = {},\n ): TinybirdParams {\n return {\n member_status: filters.audience === 'all' ? undefined : filters.audience,\n source: filters.source ?? undefined,\n location: filters.location ?? undefined,\n device: filters.device ?? undefined,\n utm_source: filters.utm_source ?? undefined,\n utm_medium: filters.utm_medium ?? undefined,\n utm_campaign: filters.utm_campaign ?? undefined,\n utm_content: filters.utm_content ?? undefined,\n utm_term: filters.utm_term ?? undefined,\n ...extra,\n };\n }\n\n private async listNewsletters(): Promise<Record<string, unknown>[]> {\n const client = await this.getClient();\n const payload = (await collectAllPages('newsletters', (page) =>\n client.newsletters.browse({\n limit: 100,\n page,\n }),\n )) as GhostPaginatedResponse;\n return Array.isArray(payload.newsletters)\n ? (payload.newsletters as Record<string, unknown>[])\n : [];\n }\n\n async getPostMeta(id: string): Promise<StatsPostMeta> {\n const cached = this.postCache.get(id);\n if (cached) {\n return cached;\n }\n\n const client = await this.getClient();\n const payload = await client.posts.read(id);\n const posts = Array.isArray(payload.posts) ? (payload.posts as Record<string, unknown>[]) : [];\n const post = posts[0];\n\n if (!post) {\n throw new GhstError('Post not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const meta = {\n id,\n uuid: getString(post.uuid),\n title: getString(post.title) ?? '(untitled)',\n slug: getString(post.slug),\n url: getString(post.url),\n published_at: getString(post.published_at),\n };\n\n this.postCache.set(id, meta);\n return meta;\n }\n\n async getWebReport(input: StatsWebInput): Promise<StatsWebReport> {\n const range = await this.resolveRange(input);\n const filters = resolveFilters(input);\n const limit = input.limit ?? 5;\n const client = await this.getClient();\n\n const [kpisRows, activeRows, topContentPayload, sourceRows, locationRows] = await Promise.all([\n this.tinybirdQuery('api_kpis', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n }),\n this.tinybirdQuery('api_active_visitors', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n }),\n client.rawRequest<Record<string, unknown>>('/stats/top-content/', 'GET', undefined, {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n }),\n this.tinybirdQuery('api_top_sources', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n }),\n this.tinybirdQuery('api_top_locations', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n }),\n ]);\n\n return {\n range,\n filters,\n kpis: normalizeKpis(kpisRows, activeRows[0]),\n timeseries: normalizeTrafficSeries(kpisRows),\n content: getArray(topContentPayload).map(normalizeContentRow),\n sources: normalizeTopSources(sourceRows),\n locations: normalizeLocations(locationRows),\n };\n }\n\n async getWebTable(metric: string, input: StatsWebTableInput): Promise<StatsWebTableReport> {\n const range = await this.resolveRange(input);\n const filters = resolveFilters(input);\n const client = await this.getClient();\n const limit = input.limit ?? 10;\n\n if (metric === 'content') {\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/top-content/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n },\n );\n\n return {\n range,\n filters,\n metric,\n items: getArray(payload).map(normalizeContentRow),\n };\n }\n\n const pipeByMetric: Record<\n string,\n { pipe: string; normalizer: (rows: TinybirdRow[]) => StatsBreakdownRow[] }\n > = {\n sources: { pipe: 'api_top_sources', normalizer: normalizeTopSources },\n locations: { pipe: 'api_top_locations', normalizer: normalizeLocations },\n devices: { pipe: 'api_top_devices', normalizer: normalizeDevices },\n 'utm-sources': {\n pipe: 'api_top_utm_sources',\n normalizer: (rows) => normalizeUtm(rows, 'utm_source'),\n },\n 'utm-mediums': {\n pipe: 'api_top_utm_mediums',\n normalizer: (rows) => normalizeUtm(rows, 'utm_medium'),\n },\n 'utm-campaigns': {\n pipe: 'api_top_utm_campaigns',\n normalizer: (rows) => normalizeUtm(rows, 'utm_campaign'),\n },\n 'utm-contents': {\n pipe: 'api_top_utm_contents',\n normalizer: (rows) => normalizeUtm(rows, 'utm_content'),\n },\n 'utm-terms': {\n pipe: 'api_top_utm_terms',\n normalizer: (rows) => normalizeUtm(rows, 'utm_term'),\n },\n };\n\n const selected = pipeByMetric[metric];\n if (!selected) {\n throw new GhstError(`Unsupported web metric: ${metric}`, {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const rows = await this.tinybirdQuery(selected.pipe, {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n });\n\n return {\n range,\n filters,\n metric,\n items: selected.normalizer(rows),\n };\n }\n\n async getGrowthReport(input: StatsGrowthInput): Promise<StatsGrowthReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const limit = input.limit ?? 5;\n\n const [membersPayload, mrrPayload, subscriptionsPayload, sourcesPayload] = await Promise.all([\n client.rawRequest<Record<string, unknown>>('/stats/member_count/', 'GET', undefined, {\n date_from: range.from ?? undefined,\n }),\n client.rawRequest<Record<string, unknown>>('/stats/mrr/', 'GET', undefined, {\n date_from: range.from ?? undefined,\n }),\n client.rawRequest<Record<string, unknown>>('/stats/subscriptions/'),\n client.rawRequest<Record<string, unknown>>('/stats/top-sources-growth/', 'GET', undefined, {\n ...this.buildRangeParams(range),\n limit,\n }),\n ]);\n\n const members = clipDatedRows(normalizeMembersSeries(getArray(membersPayload)), range);\n const mrr = clipDatedRows(normalizeMrrSeries(getArray(mrrPayload)), range);\n const rawSubscriptionRows = getArray(subscriptionsPayload);\n const subscriptionsHistory = clipDatedRows(\n normalizeSubscriptionsHistory(rawSubscriptionRows),\n range,\n );\n const subscriptionsMeta = getObject(subscriptionsPayload, 'meta');\n const fallbackTotals = Array.isArray(subscriptionsMeta.totals)\n ? (subscriptionsMeta.totals as Record<string, unknown>[]).map((row) => ({\n tier: getString(row.tier) ?? '',\n label: getString(row.label ?? row.name ?? row.tier) ?? '',\n count: getNumber(row.count),\n }))\n : [];\n const totals = normalizeSubscriptionTotals(rawSubscriptionRows, fallbackTotals, range);\n const latestMembers = lastValue(members);\n const latestMrr = lastValue(mrr);\n const latestSubscriptions = lastValue(subscriptionsHistory);\n\n return {\n range,\n summary: {\n free_members: latestMembers?.free_members ?? 0,\n paid_members: latestMembers?.paid_members ?? 0,\n total_members: latestMembers?.total_members ?? 0,\n member_delta: deltaOf(members.map((entry) => entry.total_members)),\n paid_delta: deltaOf(members.map((entry) => entry.paid_members)),\n mrr: latestMrr?.mrr ?? 0,\n mrr_delta: deltaOf(mrr.map((entry) => entry.mrr)),\n total_subscriptions: latestSubscriptions?.subscriptions ?? 0,\n subscription_delta: deltaOf(subscriptionsHistory.map((entry) => entry.subscriptions)),\n currency: getString(getArray(mrrPayload)[0]?.currency),\n },\n members,\n mrr,\n subscriptions: {\n history: subscriptionsHistory,\n totals,\n },\n sources: normalizeTopSources(getArray(sourcesPayload)),\n };\n }\n\n async getPostsReport(input: StatsPostsInput): Promise<StatsPostsReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/top-posts-views/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n limit: input.limit ?? 5,\n },\n );\n\n return {\n range,\n posts: normalizeTopPostsViews(getArray(payload)),\n };\n }\n\n async getNewslettersReport(input: StatsNewslettersInput): Promise<StatsNewslettersReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const allNewsletters = await this.listNewsletters();\n const selected = input.newsletterId\n ? allNewsletters.filter((newsletter) => String(newsletter.id ?? '') === input.newsletterId)\n : allNewsletters;\n\n if (input.newsletterId && selected.length === 0) {\n throw new GhstError('Newsletter not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const rows = await Promise.all(\n selected.slice(0, input.limit ?? selected.length).map(async (newsletter) => {\n const newsletterId = String(newsletter.id ?? '');\n const [basicStatsPayload, subscriberPayload] = await Promise.all([\n client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-basic-stats/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n newsletter_id: newsletterId,\n },\n ),\n client.rawRequest<Record<string, unknown>>('/stats/subscriber-count/', 'GET', undefined, {\n ...this.buildRangeParams(range),\n newsletter_id: newsletterId,\n }),\n ]);\n const basicStatsRows = getArray(basicStatsPayload);\n const postIds = basicStatsRows\n .map((row) => getString(row.post_id))\n .filter((value): value is string => Boolean(value));\n const clickPayload =\n postIds.length > 0\n ? await client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-click-stats/',\n 'GET',\n undefined,\n {\n newsletter_id: newsletterId,\n post_ids: postIds.join(','),\n },\n )\n : { stats: [] };\n const mergedRows = mergeNewsletterClickStats(basicStatsRows, getArray(clickPayload));\n\n const subscriberHistory = getArray(subscriberPayload).map((row) => ({\n date: getString(row.date) ?? '',\n total: getNumber(row.total ?? row.subscribers),\n delta: getNumber(row.delta ?? row.change),\n }));\n\n return newsletterStatsSummary(newsletter, mergedRows, subscriberHistory);\n }),\n );\n\n return {\n range,\n newsletters: rows,\n };\n }\n\n private async getPostSummaryFallback(\n postId: string,\n range: StatsRange,\n ): Promise<StatsPostSummaryFallback | null> {\n const client = await this.getClient();\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/top-posts-views/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n limit: 100,\n },\n );\n const row =\n normalizeTopPostsViews(getArray(payload)).find((item) => item.post_id === postId) ?? null;\n return buildPostSummaryFallback(row);\n }\n\n async getNewsletterClicksReport(\n input: StatsNewsletterClicksInput,\n ): Promise<StatsNewsletterClicksReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const newsletters = await this.listNewsletters();\n const newsletter = newsletters.find((entry) => String(entry.id ?? '') === input.newsletterId);\n\n if (!newsletter) {\n throw new GhstError('Newsletter not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const basicStatsPayload = await client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-basic-stats/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n newsletter_id: input.newsletterId,\n },\n );\n const basicStatsRows = getArray(basicStatsPayload);\n const selectedRows =\n input.postIds && input.postIds.length > 0\n ? basicStatsRows.filter((row) => {\n const postId = getString(row.post_id);\n return postId ? input.postIds?.includes(postId) : false;\n })\n : basicStatsRows;\n const postIds = selectedRows\n .map((row) => getString(row.post_id))\n .filter((value): value is string => Boolean(value));\n const clickPayload =\n postIds.length > 0\n ? await client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-click-stats/',\n 'GET',\n undefined,\n {\n newsletter_id: input.newsletterId,\n post_ids: postIds.join(','),\n },\n )\n : { stats: [] };\n const mergedRows = mergeNewsletterClickStats(selectedRows, getArray(clickPayload));\n\n return {\n range,\n newsletter: {\n id: input.newsletterId,\n name: getString(newsletter.name) ?? '(untitled)',\n slug: getString(newsletter.slug),\n },\n posts: input.postIds ?? [],\n clicks: normalizeNewsletterClicks(mergedRows).slice(0, input.limit ?? mergedRows.length),\n };\n }\n\n async getNewsletterSubscribersReport(\n input: StatsNewsletterSubscribersInput,\n ): Promise<StatsNewsletterSubscribersReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const newsletters = await this.listNewsletters();\n const selected = input.newsletterId\n ? newsletters.filter((newsletter) => String(newsletter.id ?? '') === input.newsletterId)\n : newsletters;\n\n if (input.newsletterId && selected.length === 0) {\n throw new GhstError('Newsletter not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const rows = await Promise.all(\n selected.map(async (newsletter) => {\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/subscriber-count/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n newsletter_id: String(newsletter.id ?? ''),\n },\n );\n\n const history = getArray(payload).map((row) => ({\n date: getString(row.date) ?? '',\n total: getNumber(row.total ?? row.subscribers),\n delta: getNumber(row.delta ?? row.change),\n }));\n const latest = lastValue(history);\n\n return {\n newsletter_id: String(newsletter.id ?? ''),\n newsletter_name: getString(newsletter.name) ?? '(untitled)',\n newsletter_slug: getString(newsletter.slug),\n subscribers: latest?.total ?? 0,\n subscriber_delta: latest?.delta ?? 0,\n history,\n };\n }),\n );\n\n return {\n range,\n newsletters: rows,\n };\n }\n\n async getPostGrowthReport(input: StatsPostGrowthInput): Promise<StatsPostGrowthReport> {\n const range = hasExplicitWindowOverride(input)\n ? await this.resolveRange(input)\n : await this.resolveLifetimeRange(input.timezone);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n const payload = await client.rawRequest<Record<string, unknown>>(\n `/stats/posts/${input.id}/growth`,\n 'GET',\n undefined,\n this.buildRangeParams(range),\n );\n\n return {\n range,\n post,\n growth: clipDatedRows(normalizePostGrowth(getArray(payload)), range),\n };\n }\n\n async getPostReferrersReport(input: StatsPostReferrersInput): Promise<StatsPostReferrersReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n const payload = await client.rawRequest<Record<string, unknown>>(\n `/stats/posts/${input.id}/top-referrers`,\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n limit: input.limit ?? 10,\n },\n );\n\n return {\n range,\n post,\n referrers: normalizePostReferrers(getArray(payload)),\n };\n }\n\n async getPostNewsletterReport(\n input: StatsPostNewsletterInput,\n ): Promise<StatsPostNewsletterReport> {\n const range = hasExplicitWindowOverride(input)\n ? await this.resolveRange(input)\n : await this.resolveLifetimeRange(input.timezone);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n if (\n hasExplicitWindowOverride(input) &&\n post.published_at &&\n !isDateWithinRange(post.published_at, range)\n ) {\n return {\n range,\n post,\n newsletter: {\n recipients: 0,\n open_rate: 0,\n click_rate: 0,\n },\n };\n }\n\n const payload = await client.rawRequest<Record<string, unknown>>(\n `/stats/posts/${input.id}/stats/`,\n );\n const summary = extractPostSummary(payload);\n const fallback =\n summary.email_recipients > 0 || summary.email_open_rate > 0 || summary.email_click_rate > 0\n ? null\n : await this.getPostSummaryFallback(input.id, range);\n\n return {\n range,\n post,\n newsletter: {\n recipients: fallback?.email_recipients ?? summary.email_recipients,\n open_rate: fallback?.email_open_rate ?? summary.email_open_rate,\n click_rate: fallback?.email_click_rate ?? summary.email_click_rate,\n },\n };\n }\n\n async getPostWebReport(input: StatsPostWebInput): Promise<StatsPostWebReport> {\n const range = await this.resolveRange(input);\n const filters = resolveFilters(input);\n const post = await this.getPostMeta(input.id);\n if (!post.uuid) {\n throw makeAnalyticsUnavailableError();\n }\n\n const limit = input.limit ?? 10;\n const [kpisRows, activeRows, sourceRows, locationRows] = await Promise.all([\n this.tinybirdQuery('api_kpis', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid }),\n }),\n this.tinybirdQuery('api_active_visitors', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid }),\n }),\n this.tinybirdQuery('api_top_sources', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid, limit }),\n }),\n this.tinybirdQuery('api_top_locations', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid, limit }),\n }),\n ]);\n\n return {\n range,\n filters,\n post,\n kpis: normalizeKpis(kpisRows, activeRows[0]),\n timeseries: normalizeTrafficSeries(kpisRows),\n sources: normalizeTopSources(sourceRows),\n locations: normalizeLocations(locationRows),\n };\n }\n\n async getPostReport(input: StatsPostInput): Promise<StatsPostReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n const [summaryPayload, growthReport, referrersReport, webReport, fallback] = await Promise.all([\n client.rawRequest<Record<string, unknown>>(`/stats/posts/${input.id}/stats/`),\n this.getPostGrowthReport({\n ...input,\n range: range.preset ?? undefined,\n from: range.from ?? undefined,\n to: range.to,\n timezone: range.timezone,\n }),\n this.getPostReferrersReport({ ...input, limit: 5 }),\n this.getPostWebReport({ ...input, limit: 5 }).catch((error) => {\n if (error instanceof GhstError && error.code === 'ANALYTICS_UNAVAILABLE') {\n return null;\n }\n\n throw error;\n }),\n this.getPostSummaryFallback(input.id, range),\n ]);\n const summary = extractPostSummary(summaryPayload);\n const postGrowthSummary = summarizePostGrowth(growthReport.growth);\n const emailSummary = buildPostEmailSummary(summary, range, post);\n\n return {\n range,\n post,\n summary: {\n visitors: webReport?.kpis.visits ?? summary.visitors,\n pageviews: webReport?.kpis.pageviews ?? summary.pageviews,\n free_members:\n postGrowthSummary.free_members > 0\n ? postGrowthSummary.free_members\n : (fallback?.free_members ?? 0),\n paid_members:\n postGrowthSummary.paid_members > 0\n ? postGrowthSummary.paid_members\n : (fallback?.paid_members ?? 0),\n mrr: postGrowthSummary.mrr,\n email_recipients:\n emailSummary.email_recipients > 0\n ? emailSummary.email_recipients\n : (fallback?.email_recipients ?? 0),\n email_open_rate:\n emailSummary.email_open_rate > 0\n ? emailSummary.email_open_rate\n : (fallback?.email_open_rate ?? 0),\n email_click_rate:\n emailSummary.email_click_rate > 0\n ? emailSummary.email_click_rate\n : (fallback?.email_click_rate ?? 0),\n },\n web: webReport,\n growth: growthReport.growth,\n referrers: referrersReport.referrers,\n };\n }\n}\n\nexport async function getStatsOverview(\n global: GlobalOptions,\n input: StatsOverviewInput,\n): Promise<StatsOverviewReport> {\n const client = new StatsClient(global);\n const [web, growth, newsletters] = await Promise.all([\n client.getWebReport({ ...input, limit: 5 }),\n client.getGrowthReport({ ...input, limit: 5 }),\n client.getNewslettersReport({ ...input, limit: 5 }),\n ]);\n\n return {\n range: web.range,\n summary: {\n visitors: web.kpis.visits,\n pageviews: web.kpis.pageviews,\n bounce_rate: web.kpis.bounce_rate,\n avg_session_sec: web.kpis.avg_session_sec,\n active_visitors: web.kpis.active_visitors,\n total_members: growth.summary.total_members,\n member_delta: growth.summary.member_delta,\n paid_members: growth.summary.paid_members,\n paid_delta: growth.summary.paid_delta,\n mrr: growth.summary.mrr,\n mrr_delta: growth.summary.mrr_delta,\n },\n web,\n growth,\n newsletters,\n };\n}\n\nexport async function getStatsWeb(\n global: GlobalOptions,\n input: StatsWebInput,\n): Promise<StatsWebReport> {\n return new StatsClient(global).getWebReport(input);\n}\n\nexport async function getStatsWebTable(\n global: GlobalOptions,\n metric: string,\n input: StatsWebTableInput,\n): Promise<StatsWebTableReport> {\n return new StatsClient(global).getWebTable(metric, input);\n}\n\nexport async function getStatsGrowth(\n global: GlobalOptions,\n input: StatsGrowthInput,\n): Promise<StatsGrowthReport> {\n return new StatsClient(global).getGrowthReport(input);\n}\n\nexport async function getStatsPosts(\n global: GlobalOptions,\n input: StatsPostsInput,\n): Promise<StatsPostsReport> {\n return new StatsClient(global).getPostsReport(input);\n}\n\nexport async function getStatsNewsletters(\n global: GlobalOptions,\n input: StatsNewslettersInput,\n): Promise<StatsNewslettersReport> {\n return new StatsClient(global).getNewslettersReport(input);\n}\n\nexport async function getStatsNewsletterClicks(\n global: GlobalOptions,\n input: StatsNewsletterClicksInput,\n): Promise<StatsNewsletterClicksReport> {\n return new StatsClient(global).getNewsletterClicksReport(input);\n}\n\nexport async function getStatsNewsletterSubscribers(\n global: GlobalOptions,\n input: StatsNewsletterSubscribersInput,\n): Promise<StatsNewsletterSubscribersReport> {\n return new StatsClient(global).getNewsletterSubscribersReport(input);\n}\n\nexport async function getStatsPost(\n global: GlobalOptions,\n input: StatsPostInput,\n): Promise<StatsPostReport> {\n return new StatsClient(global).getPostReport(input);\n}\n\nexport async function getStatsPostGrowth(\n global: GlobalOptions,\n input: StatsPostGrowthInput,\n): Promise<StatsPostGrowthReport> {\n return new StatsClient(global).getPostGrowthReport(input);\n}\n\nexport async function getStatsPostNewsletter(\n global: GlobalOptions,\n input: StatsPostNewsletterInput,\n): Promise<StatsPostNewsletterReport> {\n return new StatsClient(global).getPostNewsletterReport(input);\n}\n\nexport async function getStatsPostReferrers(\n global: GlobalOptions,\n input: StatsPostReferrersInput,\n): Promise<StatsPostReferrersReport> {\n return new StatsClient(global).getPostReferrersReport(input);\n}\n\nexport async function getStatsPostWeb(\n global: GlobalOptions,\n input: StatsPostWebInput,\n): Promise<StatsPostWebReport> {\n return new StatsClient(global).getPostWebReport(input);\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 function 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 uploadedTheme = themes[0] ?? payload;\n const name = String(uploadedTheme.name ?? '').trim();\n return name || undefined;\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 isLoopbackHost(host: string): boolean {\n const normalized = host.trim().toLowerCase();\n return (\n normalized === '127.0.0.1' ||\n normalized === '::1' ||\n normalized === '[::1]' ||\n normalized === 'localhost'\n );\n}\n\nfunction assertSafeBindHost(host: string, allowPublicBind: boolean): void {\n if (allowPublicBind || isLoopbackHost(host)) {\n return;\n }\n\n throw new GhstError(\n `mcp http refuses non-loopback host '${host}' without --unsafe-public-bind.`,\n {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n },\n );\n}\n\nfunction normalizeCorsOrigin(origin: string | undefined): string | undefined {\n if (origin === undefined) {\n return undefined;\n }\n\n const trimmed = origin.trim();\n if (!trimmed) {\n throw new GhstError('cors-origin must be a single exact origin.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (trimmed === '*' || trimmed.includes(',')) {\n throw new GhstError('cors-origin must be a single exact origin and cannot use wildcards.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new GhstError('cors-origin must be a valid origin like https://app.example.com.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (\n parsed.username ||\n parsed.password ||\n parsed.search ||\n parsed.hash ||\n parsed.pathname !== '/'\n ) {\n throw new GhstError('cors-origin must be a single exact origin without path, query, or hash.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n return parsed.origin;\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 a single exact CORS origin')\n .option('--unsafe-public-bind', 'Allow binding mcp http to a non-loopback host')\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 assertSafeBindHost(options.host, Boolean(options.unsafePublicBind));\n const corsOrigin = normalizeCorsOrigin(options.corsOrigin as string | undefined);\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,\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 .option('--newsletter <slug>', 'Newsletter slug for email delivery')\n .option('--email-only', 'Email only publish')\n .option('--email-segment <segment>', 'Email segment')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostScheduleInputSchema.safeParse({\n id,\n at: options.at,\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 schedulePost(global, parsed.data.id, parsed.data.at, {\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n });\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 newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\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 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 printJson,\n printSocialWebAccountHuman,\n printSocialWebAccountsHuman,\n printSocialWebNotificationsHuman,\n printSocialWebPostsHuman,\n printSocialWebStatusHuman,\n printSocialWebThreadHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseInteger } from '../lib/parse.js';\nimport {\n blockAccount,\n blockDomain,\n createNote,\n deleteSocialWebPost,\n derepostPost,\n disableSocialWeb,\n enableSocialWeb,\n followAccount,\n getNotificationsCount,\n getSocialWebPost,\n getSocialWebProfile,\n getSocialWebStatus,\n getSocialWebThread,\n likePost,\n listBlockedAccounts,\n listBlockedDomains,\n listFollowers,\n listFollowing,\n listNotes,\n listNotifications,\n listReader,\n listSocialWebLikes,\n listSocialWebPosts,\n replyToPost,\n repostPost,\n searchSocialWeb,\n unblockAccount,\n unblockDomain,\n unfollowAccount,\n unlikePost,\n updateSocialWebProfile,\n uploadSocialWebImage,\n} from '../lib/socialweb.js';\nimport {\n SocialWebBlockDomainInputSchema,\n SocialWebContentInputSchema,\n SocialWebFollowsInputSchema,\n SocialWebHandleActionInputSchema,\n SocialWebIdInputSchema,\n SocialWebPaginatedInputSchema,\n SocialWebProfileInputSchema,\n SocialWebProfileUpdateInputSchema,\n SocialWebReplyInputSchema,\n SocialWebSearchInputSchema,\n SocialWebUploadInputSchema,\n} from '../schemas/socialweb.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues\n ?.map((issue) => issue.message)\n .join('; ') ?? 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\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 parsePagination(options: { limit?: string; next?: string; all?: unknown }) {\n return {\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n };\n}\n\nfunction printSocialWebReadPayload(\n commandName: string,\n payload: Record<string, unknown>,\n global: ReturnType<typeof getGlobalOptions>,\n): void {\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n switch (commandName) {\n case 'status':\n case 'enable':\n case 'disable':\n printSocialWebStatusHuman(payload, global.color !== false);\n return;\n case 'profile':\n case 'profile-update':\n case 'search':\n case 'follow':\n if (Array.isArray(payload.accounts)) {\n printSocialWebAccountsHuman(payload, global.color !== false);\n return;\n }\n printSocialWebAccountHuman(payload, global.color !== false);\n return;\n case 'notes':\n case 'reader':\n case 'posts':\n case 'likes':\n case 'post':\n case 'note':\n case 'reply':\n printSocialWebPostsHuman(payload, global.color !== false);\n return;\n case 'notifications':\n printSocialWebNotificationsHuman(payload, global.color !== false);\n return;\n case 'followers':\n case 'following':\n case 'blocked-accounts':\n case 'blocked-domains':\n printSocialWebAccountsHuman(payload, global.color !== false);\n return;\n case 'thread':\n printSocialWebThreadHuman(payload, global.color !== false);\n return;\n default:\n console.log(JSON.stringify(payload, null, 2));\n }\n}\n\nexport function registerSocialWebCommands(program: Command): void {\n const socialweb = program.command('socialweb').description('Ghost social web management');\n\n socialweb\n .command('status')\n .description('Show social web settings and connectivity status')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await getSocialWebStatus(global);\n printSocialWebReadPayload('status', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('enable')\n .description('Enable social web in Ghost settings')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await enableSocialWeb(global);\n printSocialWebReadPayload('enable', payload as unknown as Record<string, unknown>, global);\n if (global.json) {\n return;\n }\n\n const report = payload as { settings?: { social_web?: boolean }; reachable?: boolean };\n if (report.settings?.social_web && report.reachable === false) {\n console.log(\n 'Warning: Social web is enabled, but the social web service is not reachable yet.',\n );\n }\n });\n\n socialweb\n .command('disable')\n .description('Disable social web in Ghost settings')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await disableSocialWeb(global);\n printSocialWebReadPayload('disable', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('profile [handle]')\n .description('Show a social web profile')\n .action(async (handle: string | undefined, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebProfileInputSchema.safeParse({ handle: handle ?? 'me' });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSocialWebProfile(global, parsed.data.handle);\n printSocialWebReadPayload('profile', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('profile-update')\n .description('Update the current social web profile')\n .option('--name <name>', 'Profile display name')\n .option('--username <username>', 'Profile username')\n .option('--bio <bio>', 'Profile bio')\n .option('--avatar-url <url>', 'Avatar image URL')\n .option('--banner-image-url <url>', 'Banner image URL')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebProfileUpdateInputSchema.safeParse({\n name: options.name,\n username: options.username,\n bio: options.bio,\n avatarUrl: options.avatarUrl,\n bannerImageUrl: options.bannerImageUrl,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateSocialWebProfile(global, parsed.data);\n printSocialWebReadPayload(\n 'profile-update',\n payload as unknown as Record<string, unknown>,\n global,\n );\n });\n\n socialweb\n .command('search <query>')\n .description('Search social web accounts')\n .action(async (query: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebSearchInputSchema.safeParse({ query });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await searchSocialWeb(global, parsed.data.query);\n printSocialWebReadPayload('search', payload, global);\n });\n\n for (const entry of [\n ['notes', listNotes, 'Show note feed'],\n ['reader', listReader, 'Show reader feed'],\n ['notifications', listNotifications, 'Show notifications'],\n ['likes', listSocialWebLikes, 'Show liked posts'],\n ] as const) {\n socialweb\n .command(entry[0])\n .description(entry[2])\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebPaginatedInputSchema.safeParse(parsePagination(options));\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](\n global,\n {\n limit: parsed.data.limit,\n next: parsed.data.next,\n },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload(entry[0], payload, global);\n });\n }\n\n socialweb\n .command('notifications-count')\n .description('Show unread notification count')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await getNotificationsCount(global);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log(String(payload.count ?? 0));\n });\n\n socialweb\n .command('posts [handle]')\n .description('List posts for a social web account')\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (handle: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const handleValue = handle ?? 'me';\n const pagination = parsePagination(options);\n const parsedHandle = SocialWebProfileInputSchema.safeParse({ handle: handleValue });\n const parsedPagination = SocialWebPaginatedInputSchema.safeParse(pagination);\n if (!parsedHandle.success) {\n throwValidationError(parsedHandle.error);\n }\n if (!parsedPagination.success) {\n throwValidationError(parsedPagination.error);\n }\n\n const payload = await listSocialWebPosts(\n global,\n parsedHandle.data.handle,\n { limit: parsedPagination.data.limit, next: parsedPagination.data.next },\n Boolean(parsedPagination.data.all),\n );\n printSocialWebReadPayload('posts', payload, global);\n });\n\n for (const entry of [\n ['followers', listFollowers, 'List followers'],\n ['following', listFollowing, 'List following'],\n ] as const) {\n socialweb\n .command(`${entry[0]} [handle]`)\n .description(entry[2])\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (handle: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebFollowsInputSchema.safeParse({\n handle: handle ?? 'me',\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](\n global,\n parsed.data.handle,\n { limit: parsed.data.limit, next: parsed.data.next },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload(entry[0], payload, global);\n });\n }\n\n socialweb\n .command('post <id>')\n .description('Fetch a social web post by ActivityPub id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSocialWebPost(global, parsed.data.id);\n printSocialWebReadPayload('post', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('thread <id>')\n .description('Fetch a post thread by ActivityPub id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSocialWebThread(global, parsed.data.id);\n printSocialWebReadPayload('thread', payload, global);\n });\n\n for (const entry of [\n ['follow', followAccount, 'Follow an account'],\n ['unfollow', unfollowAccount, 'Unfollow an account'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <handle>`)\n .description(entry[2])\n .action(async (handle: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebHandleActionInputSchema.safeParse({ handle });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.handle);\n printSocialWebReadPayload(entry[0], payload, global);\n });\n }\n\n for (const entry of [\n ['like', likePost, 'Like a post'],\n ['unlike', unlikePost, 'Unlike a post'],\n ['repost', repostPost, 'Repost a post'],\n ['derepost', derepostPost, 'Undo repost on a post'],\n ['delete', deleteSocialWebPost, 'Delete a post'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <id>`)\n .description(entry[2])\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log(entry[0] === 'delete' ? 'Deleted post' : 'OK');\n });\n }\n\n socialweb\n .command('note')\n .description('Create a social web note')\n .option('--content <text>', 'Note content')\n .option('--stdin', 'Read note content from stdin')\n .option('--image-file <path>', 'Attach an image from a local file')\n .option('--image-url <url>', 'Attach an image by URL')\n .option('--image-alt <text>', 'Image alt text')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebContentInputSchema.safeParse({\n content: options.content,\n stdin: parseBooleanFlag(options.stdin),\n imageFile: options.imageFile,\n imageUrl: options.imageUrl,\n imageAlt: options.imageAlt,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const stdin = await readOptionalStdin(parsed.data.stdin);\n const content = parsed.data.content ?? stdin;\n if (!content) {\n throw new GhstError('Note content cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const payload = await createNote(global, {\n content,\n imageFile: parsed.data.imageFile,\n imageUrl: parsed.data.imageUrl,\n imageAlt: parsed.data.imageAlt,\n });\n printSocialWebReadPayload('note', payload, global);\n });\n\n socialweb\n .command('reply <id>')\n .description('Reply to a social web post')\n .option('--content <text>', 'Reply content')\n .option('--stdin', 'Read reply content from stdin')\n .option('--image-file <path>', 'Attach an image from a local file')\n .option('--image-url <url>', 'Attach an image by URL')\n .option('--image-alt <text>', 'Image alt text')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebReplyInputSchema.safeParse({\n id,\n content: options.content,\n stdin: parseBooleanFlag(options.stdin),\n imageFile: options.imageFile,\n imageUrl: options.imageUrl,\n imageAlt: options.imageAlt,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const stdin = await readOptionalStdin(parsed.data.stdin);\n const content = parsed.data.content ?? stdin;\n if (!content) {\n throw new GhstError('Reply content cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const payload = await replyToPost(global, parsed.data.id, {\n content,\n imageFile: parsed.data.imageFile,\n imageUrl: parsed.data.imageUrl,\n imageAlt: parsed.data.imageAlt,\n });\n printSocialWebReadPayload('reply', payload, global);\n });\n\n socialweb\n .command('blocked-accounts')\n .description('List blocked accounts')\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebFollowsInputSchema.safeParse({\n handle: 'me',\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await listBlockedAccounts(\n global,\n { limit: parsed.data.limit, next: parsed.data.next },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload('blocked-accounts', payload, global);\n });\n\n socialweb\n .command('blocked-domains')\n .description('List blocked domains')\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebFollowsInputSchema.safeParse({\n handle: 'me',\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await listBlockedDomains(\n global,\n { limit: parsed.data.limit, next: parsed.data.next },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload('blocked-domains', payload, global);\n });\n\n for (const entry of [\n ['block', blockAccount, 'Block an account'],\n ['unblock', unblockAccount, 'Unblock an account'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <id>`)\n .description(entry[2])\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log('OK');\n });\n }\n\n for (const entry of [\n ['block-domain', blockDomain, 'Block a domain'],\n ['unblock-domain', unblockDomain, 'Unblock a domain'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <url>`)\n .description(entry[2])\n .action(async (url: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebBlockDomainInputSchema.safeParse({ url });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.url);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log('OK');\n });\n }\n\n socialweb\n .command('upload <filePath>')\n .description('Upload an image for social web notes and replies')\n .action(async (filePath: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebUploadInputSchema.safeParse({ filePath });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n try {\n await fs.access(parsed.data.filePath);\n } catch {\n throw new GhstError(`File not found: ${parsed.data.filePath}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const payload = await uploadSocialWebImage(global, parsed.data.filePath);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log(String(payload.fileUrl ?? 'Uploaded image'));\n });\n}\n","import { z } from 'zod';\n\nconst HandleSchema = z\n .string()\n .min(1)\n .refine((value) => value === 'me' || /^@?[^@\\s]+@[^@\\s]+$/.test(value), {\n message: 'handle must be me or a federated handle like @user@domain',\n });\n\nconst UrlSchema = z.string().url();\n\nconst CursorSchema = z.string().min(1);\nconst LimitSchema = z.number().int().positive().max(100);\n\nconst PaginationSchema = z\n .object({\n limit: LimitSchema.optional(),\n next: CursorSchema.optional(),\n all: z.boolean().optional(),\n })\n .superRefine((value, context) => {\n if (value.all && value.next) {\n context.addIssue({\n code: 'custom',\n message: '--all cannot be combined with --next.',\n path: ['all'],\n });\n }\n });\n\nexport const SocialWebStatusInputSchema = z.object({});\n\nexport const SocialWebProfileInputSchema = z.object({\n handle: HandleSchema.default('me'),\n});\n\nexport const SocialWebProfileUpdateInputSchema = z\n .object({\n name: z.string().min(1).optional(),\n username: z.string().min(1).optional(),\n bio: z.string().optional(),\n avatarUrl: UrlSchema.optional(),\n bannerImageUrl: UrlSchema.optional(),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.username !== undefined ||\n value.bio !== undefined ||\n value.avatarUrl !== undefined ||\n value.bannerImageUrl !== undefined,\n {\n message: 'Provide at least one profile field to update.',\n path: ['name'],\n },\n );\n\nexport const SocialWebSearchInputSchema = z.object({\n query: z.string().min(1),\n});\n\nexport const SocialWebPaginatedInputSchema = PaginationSchema;\n\nexport const SocialWebFollowsInputSchema = z\n .object({\n handle: HandleSchema.default('me'),\n limit: LimitSchema.optional(),\n next: CursorSchema.optional(),\n all: z.boolean().optional(),\n })\n .superRefine((value, context) => {\n if (value.all && value.next) {\n context.addIssue({\n code: 'custom',\n message: '--all cannot be combined with --next.',\n path: ['all'],\n });\n }\n });\n\nexport const SocialWebHandleActionInputSchema = z.object({\n handle: HandleSchema.refine((value) => value !== 'me', {\n message: 'handle must be a federated handle like @user@domain',\n }),\n});\n\nexport const SocialWebIdInputSchema = z.object({\n id: UrlSchema,\n});\n\nexport const SocialWebBlockDomainInputSchema = z.object({\n url: UrlSchema,\n});\n\nexport const SocialWebUploadInputSchema = z.object({\n filePath: z.string().min(1),\n});\n\nexport const SocialWebContentInputSchema = z\n .object({\n content: z.string().min(1).optional(),\n stdin: z.boolean().optional(),\n imageFile: z.string().min(1).optional(),\n imageUrl: UrlSchema.optional(),\n imageAlt: z.string().min(1).optional(),\n })\n .superRefine((value, context) => {\n const contentSources = [value.content !== undefined, value.stdin === true].filter(\n Boolean,\n ).length;\n if (contentSources !== 1) {\n context.addIssue({\n code: 'custom',\n message: 'Provide exactly one content source with --content or --stdin.',\n path: ['content'],\n });\n }\n\n const imageSources = [value.imageFile !== undefined, value.imageUrl !== undefined].filter(\n Boolean,\n ).length;\n if (imageSources > 1) {\n context.addIssue({\n code: 'custom',\n message: 'Provide at most one image source with --image-file or --image-url.',\n path: ['imageFile'],\n });\n }\n });\n\nexport const SocialWebReplyInputSchema = SocialWebContentInputSchema.extend({\n id: UrlSchema,\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 formatCsv,\n isJsonMode,\n printJson,\n printStatsGrowthHuman,\n printStatsNewsletterClicksHuman,\n printStatsNewsletterSubscribersHuman,\n printStatsNewslettersHuman,\n printStatsOverviewHuman,\n printStatsPostGrowthHuman,\n printStatsPostHuman,\n printStatsPostNewsletterHuman,\n printStatsPostReferrersHuman,\n printStatsPostsHuman,\n printStatsPostWebHuman,\n printStatsWebHuman,\n printStatsWebTableHuman,\n} from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport {\n getStatsGrowth,\n getStatsNewsletterClicks,\n getStatsNewsletterSubscribers,\n getStatsNewsletters,\n getStatsOverview,\n getStatsPost,\n getStatsPostGrowth,\n getStatsPostNewsletter,\n getStatsPostReferrers,\n getStatsPosts,\n getStatsPostWeb,\n getStatsWeb,\n getStatsWebTable,\n type StatsBreakdownRow,\n type StatsContentRow,\n type StatsNewsletterClicksReport,\n type StatsNewsletterSubscribersReport,\n type StatsNewslettersReport,\n type StatsPostGrowthReport,\n type StatsPostReferrersReport,\n type StatsPostsReport,\n type StatsWebTableReport,\n} from '../lib/stats.js';\nimport {\n StatsGrowthInputSchema,\n StatsNewsletterClicksInputSchema,\n StatsNewsletterSubscribersInputSchema,\n StatsNewslettersInputSchema,\n StatsOverviewInputSchema,\n StatsPostGrowthInputSchema,\n StatsPostInputSchema,\n StatsPostNewsletterInputSchema,\n StatsPostReferrersInputSchema,\n StatsPostsInputSchema,\n StatsPostWebInputSchema,\n StatsWebInputSchema,\n StatsWebTableInputSchema,\n} from '../schemas/stats.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues\n ?.map((issue) => issue.message)\n .join('; ') ?? 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction throwUsageError(message: string): never {\n throw new GhstError(message, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n}\n\nfunction collectOption(value: string, previous: string[] = []): string[] {\n previous.push(value);\n return previous;\n}\n\nfunction parseRangeOptions(options: Record<string, unknown>) {\n return {\n range: options.range as string | undefined,\n from: options.from as string | undefined,\n to: options.to as string | undefined,\n timezone: options.timezone as string | undefined,\n };\n}\n\nfunction parseWebOptions(options: Record<string, unknown>) {\n return {\n ...parseRangeOptions(options),\n audience: options.audience as string | undefined,\n source: options.source as string | undefined,\n location: options.location as string | undefined,\n device: options.device as string | undefined,\n utmSource: options.utmSource as string | undefined,\n utmMedium: options.utmMedium as string | undefined,\n utmCampaign: options.utmCampaign as string | undefined,\n utmContent: options.utmContent as string | undefined,\n utmTerm: options.utmTerm as string | undefined,\n limit: parseInteger(options.limit as string | undefined, 'limit'),\n };\n}\n\nfunction assertCsvMode(\n global: ReturnType<typeof getGlobalOptions>,\n options: { csv?: boolean; output?: string },\n allowed: boolean,\n): void {\n const jsonMode = isJsonMode(global);\n\n if (!options.csv && options.output) {\n throw new GhstError('--output requires --csv.', {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n\n if (!allowed && options.csv) {\n throw new GhstError('--csv is only available on table-first analytics views.', {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n\n if (options.csv && jsonMode) {\n throw new GhstError('Cannot combine --csv with --json or --jq.', {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n}\n\nfunction shouldPrintJson(global: ReturnType<typeof getGlobalOptions>): boolean {\n return isJsonMode(global);\n}\n\nfunction addRangeOptions(command: Command): Command {\n return command\n .option('--range <preset>', '7d|30d|90d|365d|all')\n .option('--from <YYYY-MM-DD>', 'Start date')\n .option('--to <YYYY-MM-DD>', 'End date')\n .option('--timezone <iana>', 'Timezone override');\n}\n\nfunction addWebFilterOptions(command: Command, includeLimit = true): Command {\n const next = command\n .option('--audience <audience>', 'all|free|paid')\n .option('--source <value>', 'Filter by traffic source')\n .option('--location <code>', 'Filter by country code')\n .option('--device <device>', 'desktop|mobile-ios|mobile-android|bot|unknown')\n .option('--utm-source <value>', 'Filter by UTM source')\n .option('--utm-medium <value>', 'Filter by UTM medium')\n .option('--utm-campaign <value>', 'Filter by UTM campaign')\n .option('--utm-content <value>', 'Filter by UTM content')\n .option('--utm-term <value>', 'Filter by UTM term')\n .addHelpText(\n 'after',\n '\\nFilter semantics: source and utm_* filters are session-scoped in Ghost analytics. Post and member-status filters are hit-scoped.',\n );\n\n if (includeLimit) {\n next.option('--limit <number>', 'Limit returned rows');\n }\n\n return next;\n}\n\nfunction webTableCsv(payload: StatsWebTableReport): string {\n if (payload.metric === 'content') {\n const rows = (payload.items as StatsContentRow[]).map((item) => [\n item.title,\n item.pathname,\n String(item.visits),\n String(item.pageviews),\n ]);\n return formatCsv(['title', 'pathname', 'visits', 'pageviews'], rows);\n }\n\n const rows = (payload.items as StatsBreakdownRow[]).map((item) => [\n item.label,\n String(item.visits),\n item.signups === null ? '' : String(item.signups),\n item.paid_conversions === null ? '' : String(item.paid_conversions),\n item.mrr === null ? '' : String(item.mrr),\n ]);\n return formatCsv(['label', 'visits', 'signups', 'paid_conversions', 'mrr'], rows);\n}\n\nfunction newslettersCsv(payload: StatsNewslettersReport): string {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_id,\n item.newsletter_name,\n item.newsletter_slug ?? '',\n String(item.sent_posts),\n String(item.recipients),\n String(item.open_rate),\n String(item.click_rate),\n String(item.subscribers),\n String(item.subscriber_delta),\n ]);\n return formatCsv(\n [\n 'newsletter_id',\n 'newsletter_name',\n 'newsletter_slug',\n 'sent_posts',\n 'recipients',\n 'open_rate',\n 'click_rate',\n 'subscribers',\n 'subscriber_delta',\n ],\n rows,\n );\n}\n\nfunction postsCsv(payload: StatsPostsReport): string {\n const rows = payload.posts.map((item) => [\n item.post_id,\n item.title,\n item.published_at ?? '',\n item.status ?? '',\n item.authors,\n String(item.views),\n item.sent_count === null ? '' : String(item.sent_count),\n item.opened_count === null ? '' : String(item.opened_count),\n item.open_rate === null ? '' : String(item.open_rate),\n String(item.clicked_count),\n item.click_rate === null ? '' : String(item.click_rate),\n String(item.members),\n String(item.free_members),\n String(item.paid_members),\n ]);\n return formatCsv(\n [\n 'post_id',\n 'title',\n 'published_at',\n 'status',\n 'authors',\n 'views',\n 'sent_count',\n 'opened_count',\n 'open_rate',\n 'clicked_count',\n 'click_rate',\n 'members',\n 'free_members',\n 'paid_members',\n ],\n rows,\n );\n}\n\nfunction newsletterClicksCsv(payload: StatsNewsletterClicksReport): string {\n const rows = payload.clicks.map((item) => [\n item.post_id ?? '',\n item.post_title,\n item.send_date ?? '',\n String(item.recipients),\n String(item.clicks),\n String(item.click_rate),\n ]);\n return formatCsv(\n ['post_id', 'post_title', 'send_date', 'recipients', 'clicks', 'click_rate'],\n rows,\n );\n}\n\nfunction newsletterSubscribersCsv(payload: StatsNewsletterSubscribersReport): string {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_id,\n item.newsletter_name,\n item.newsletter_slug ?? '',\n String(item.subscribers),\n String(item.subscriber_delta),\n ]);\n return formatCsv(\n ['newsletter_id', 'newsletter_name', 'newsletter_slug', 'subscribers', 'subscriber_delta'],\n rows,\n );\n}\n\nfunction postGrowthCsv(payload: StatsPostGrowthReport): string {\n const rows = payload.growth.map((item) => [\n item.date,\n String(item.free_members),\n String(item.paid_members),\n String(item.mrr),\n ]);\n return formatCsv(['date', 'free_members', 'paid_members', 'mrr'], rows);\n}\n\nfunction postReferrersCsv(payload: StatsPostReferrersReport): string {\n const rows = payload.referrers.map((item) => [\n item.source,\n String(item.visits),\n String(item.signups),\n String(item.paid_conversions),\n String(item.mrr),\n ]);\n return formatCsv(['source', 'visits', 'signups', 'paid_conversions', 'mrr'], rows);\n}\n\nasync function emitCsv(csv: string, output?: string): Promise<void> {\n if (output) {\n await fs.writeFile(output, `${csv}\\n`, 'utf8');\n return;\n }\n\n process.stdout.write(csv);\n if (!csv.endsWith('\\n')) {\n process.stdout.write('\\n');\n }\n}\n\nexport function registerStatsCommands(program: Command): void {\n const stats = program.command('stats').description('Analytics and reporting');\n\n addRangeOptions(stats.command('overview').description('Site analytics overview')).action(\n async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = StatsOverviewInputSchema.safeParse(\n parseRangeOptions(options as Record<string, unknown>),\n );\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsOverview(global, parsed.data);\n\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsOverviewHuman(payload, global.color !== false);\n },\n );\n\n addWebFilterOptions(\n addRangeOptions(stats.command('web [view]').description('Web traffic analytics')),\n )\n .option('--csv', 'Output CSV for table views')\n .option('--output <path>', 'Write CSV output to a file')\n .action(async (view: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const isTableView =\n view !== undefined &&\n [\n 'content',\n 'sources',\n 'locations',\n 'devices',\n 'utm-sources',\n 'utm-mediums',\n 'utm-campaigns',\n 'utm-contents',\n 'utm-terms',\n ].includes(view);\n assertCsvMode(global, { csv: options.csv, output: options.output }, isTableView);\n\n if (!view) {\n const parsed = StatsWebInputSchema.safeParse(\n parseWebOptions(options as Record<string, unknown>),\n );\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsWeb(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsWebHuman(payload, global.color !== false);\n return;\n }\n\n if (!isTableView) {\n throwUsageError(`Unsupported web analytics view: ${view}`);\n }\n\n const parsed = StatsWebTableInputSchema.safeParse(\n parseWebOptions(options as Record<string, unknown>),\n );\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsWebTable(global, view, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(webTableCsv(payload), options.output);\n return;\n }\n\n printStatsWebTableHuman(payload, global.color !== false);\n });\n\n addRangeOptions(stats.command('growth').description('Member and revenue growth'))\n .option('--limit <number>', 'Limit top source rows')\n .addHelpText(\n 'after',\n '\\nRange behavior: Ghost member_count and mrr only accept date_from, and subscriptions are returned as lifetime history. ghst clips those datasets client-side to the selected window.',\n )\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = StatsGrowthInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n limit: parseInteger(options.limit as string | undefined, 'limit'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsGrowth(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsGrowthHuman(payload, global.color !== false);\n });\n\n addRangeOptions(stats.command('posts').description('Top posts by views'))\n .option('--limit <number>', 'Limit returned rows')\n .option('--csv', 'Output CSV')\n .option('--output <path>', 'Write CSV output to a file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n assertCsvMode(global, { csv: options.csv, output: options.output }, true);\n\n const parsed = StatsPostsInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 5,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPosts(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(postsCsv(payload), options.output);\n return;\n }\n\n printStatsPostsHuman(payload, global.color !== false);\n });\n\n const registerEmailAnalyticsCommand = (command: Command) => {\n addRangeOptions(command.description('Email analytics'))\n .option('--newsletter <id>', 'Scope to a newsletter')\n .option('--post <id>', 'Scope click stats to a post', collectOption, [])\n .option('--limit <number>', 'Limit returned rows')\n .option('--csv', 'Output CSV for table views')\n .option('--output <path>', 'Write CSV output to a file')\n .action(async (view: string | undefined, options, commandInstance) => {\n const global = getGlobalOptions(commandInstance);\n const isTableView = view === undefined || view === 'clicks' || view === 'subscribers';\n assertCsvMode(global, { csv: options.csv, output: options.output }, isTableView);\n\n if (!view) {\n const parsed = StatsNewslettersInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n newsletterId: options.newsletter as string | undefined,\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 10,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsNewsletters(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(newslettersCsv(payload), options.output);\n return;\n }\n\n printStatsNewslettersHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'clicks') {\n const parsed = StatsNewsletterClicksInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n newsletterId: options.newsletter as string | undefined,\n postIds:\n Array.isArray(options.post) && (options.post as string[]).length > 0\n ? (options.post as string[])\n : undefined,\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 10,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsNewsletterClicks(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(newsletterClicksCsv(payload), options.output);\n return;\n }\n\n printStatsNewsletterClicksHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'subscribers') {\n const parsed = StatsNewsletterSubscribersInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n newsletterId: options.newsletter as string | undefined,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsNewsletterSubscribers(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(newsletterSubscribersCsv(payload), options.output);\n return;\n }\n\n printStatsNewsletterSubscribersHuman(payload, global.color !== false);\n return;\n }\n\n throwUsageError(`Unsupported email analytics view: ${view}`);\n });\n };\n\n registerEmailAnalyticsCommand(stats.command('email [view]'));\n registerEmailAnalyticsCommand(\n stats.command('newsletters [view]').description('Email analytics (compatibility alias)'),\n );\n\n addWebFilterOptions(\n addRangeOptions(stats.command('post <id> [view]').description('Post analytics')),\n )\n .option('--csv', 'Output CSV for table views')\n .option('--output <path>', 'Write CSV output to a file')\n .addHelpText(\n 'after',\n '\\nRange behavior: `web` and `referrers` are date-scoped. Ghost post growth is returned as lifetime history and clipped client-side to the selected window. Post newsletter stats are scoped to the send date when a custom window is supplied.',\n )\n .action(async (id: string, view: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const isTableView = view === 'growth' || view === 'referrers';\n assertCsvMode(global, { csv: options.csv, output: options.output }, isTableView);\n\n if (!view) {\n const parsed = StatsPostInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPost(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsPostHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'web') {\n const parsed = StatsPostWebInputSchema.safeParse({\n ...parseWebOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostWeb(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsPostWebHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'growth') {\n const parsed = StatsPostGrowthInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostGrowth(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(postGrowthCsv(payload), options.output);\n return;\n }\n\n printStatsPostGrowthHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'newsletter') {\n const parsed = StatsPostNewsletterInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostNewsletter(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsPostNewsletterHuman(payload);\n return;\n }\n\n if (view === 'referrers') {\n const parsed = StatsPostReferrersInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 10,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostReferrers(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(postReferrersCsv(payload), options.output);\n return;\n }\n\n printStatsPostReferrersHuman(payload, global.color !== false);\n return;\n }\n\n throwUsageError(`Unsupported post analytics view: ${view}`);\n });\n}\n","import { z } from 'zod';\n\nconst RangePresetSchema = z.enum(['7d', '30d', '90d', '365d', 'all']);\nconst AudienceSchema = z.enum(['all', 'free', 'paid']);\nconst DeviceSchema = z.enum(['desktop', 'mobile-ios', 'mobile-android', 'bot', 'unknown']);\n\nfunction isValidDate(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n return false;\n }\n\n const parsed = new Date(`${value}T00:00:00.000Z`);\n return !Number.isNaN(parsed.getTime()) && parsed.toISOString().startsWith(value);\n}\n\nfunction isValidTimeZone(value: string): boolean {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: value }).format(new Date());\n return true;\n } catch {\n return false;\n }\n}\n\nconst DateSchema = z.string().refine(isValidDate, {\n message: 'Dates must use YYYY-MM-DD format.',\n});\n\nconst TimezoneSchema = z.string().min(1).refine(isValidTimeZone, {\n message: 'Timezone must be a valid IANA timezone name.',\n});\n\nconst LimitSchema = z.number().int().positive().max(100);\n\nconst RangeFieldsSchema = z.object({\n range: RangePresetSchema.optional(),\n from: DateSchema.optional(),\n to: DateSchema.optional(),\n timezone: TimezoneSchema.optional(),\n});\n\nfunction withRangeValidation<T extends z.ZodTypeAny>(schema: T): T {\n return schema.superRefine((data, context) => {\n const rangeData = data as { from?: string; to?: string };\n if (!rangeData.from || !rangeData.to) {\n return;\n }\n\n if (rangeData.from > rangeData.to) {\n context.addIssue({\n code: 'custom',\n message: '--from must be on or before --to.',\n path: ['from'],\n });\n }\n }) as T;\n}\n\nconst RangeInputSchema = withRangeValidation(RangeFieldsSchema);\n\nconst WebFilterSchema = z.object({\n audience: AudienceSchema.optional(),\n source: z.string().min(1).optional(),\n location: z\n .string()\n .trim()\n .min(2)\n .max(3)\n .transform((value) => value.toUpperCase())\n .optional(),\n device: DeviceSchema.optional(),\n utmSource: z.string().min(1).optional(),\n utmMedium: z.string().min(1).optional(),\n utmCampaign: z.string().min(1).optional(),\n utmContent: z.string().min(1).optional(),\n utmTerm: z.string().min(1).optional(),\n limit: LimitSchema.optional(),\n});\n\nexport const StatsOverviewInputSchema = RangeInputSchema;\n\nexport const StatsGrowthInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n limit: LimitSchema.optional(),\n }),\n);\n\nexport const StatsWebInputSchema = withRangeValidation(RangeFieldsSchema.merge(WebFilterSchema));\n\nexport const StatsWebTableInputSchema = withRangeValidation(\n RangeFieldsSchema.merge(WebFilterSchema).extend({\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsNewslettersInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n newsletterId: z.string().min(1).optional(),\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsPostsInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n limit: LimitSchema.default(5),\n }),\n);\n\nexport const StatsNewsletterClicksInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n newsletterId: z.string().min(1),\n postIds: z.array(z.string().min(1)).optional(),\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsNewsletterSubscribersInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n newsletterId: z.string().min(1).optional(),\n }),\n);\n\nexport const StatsPostInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n id: z.string().min(1),\n }),\n);\n\nexport const StatsPostGrowthInputSchema = StatsPostInputSchema;\n\nexport const StatsPostNewsletterInputSchema = StatsPostInputSchema;\n\nexport const StatsPostReferrersInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n id: z.string().min(1),\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsPostWebInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n id: z.string().min(1),\n }).merge(WebFilterSchema),\n);\n\nexport type StatsOverviewInput = z.infer<typeof StatsOverviewInputSchema>;\nexport type StatsGrowthInput = z.infer<typeof StatsGrowthInputSchema>;\nexport type StatsWebInput = z.infer<typeof StatsWebInputSchema>;\nexport type StatsWebTableInput = z.infer<typeof StatsWebTableInputSchema>;\nexport type StatsNewslettersInput = z.infer<typeof StatsNewslettersInputSchema>;\nexport type StatsPostsInput = z.infer<typeof StatsPostsInputSchema>;\nexport type StatsNewsletterClicksInput = z.infer<typeof StatsNewsletterClicksInputSchema>;\nexport type StatsNewsletterSubscribersInput = z.infer<typeof StatsNewsletterSubscribersInputSchema>;\nexport type StatsPostInput = z.infer<typeof StatsPostInputSchema>;\nexport type StatsPostGrowthInput = z.infer<typeof StatsPostGrowthInputSchema>;\nexport type StatsPostNewsletterInput = z.infer<typeof StatsPostNewsletterInputSchema>;\nexport type StatsPostReferrersInput = z.infer<typeof StatsPostReferrersInputSchema>;\nexport type StatsPostWebInput = z.infer<typeof StatsPostWebInputSchema>;\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, getUploadedThemeName, 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 let resultPayload = payload;\n\n if (parsed.data.activate) {\n const name = getUploadedThemeName(payload);\n if (!name) {\n throw new GhstError(\n 'Theme uploaded, but activation could not determine the theme name.',\n {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n },\n );\n }\n\n resultPayload = await activateTheme(global, name);\n }\n\n if (global.json) {\n printJson(resultPayload, global.jq);\n return;\n }\n\n printThemeHuman(resultPayload);\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, getUploadedThemeName, 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\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","process","key","fs","spawn","chalk","spawn","chalk","chalk","readline","z","path","fs","path","path","getClient","fs","z","throwValidationError","getClient","z","throwValidationError","z","fs","path","getClient","fs","path","getClient","getClient","getClient","getClient","getClient","getClient","fs","path","IMAGE_MIME_BY_EXT","inferImageMimeType","path","contentType","text","fs","inferImageMimeType","path","getClient","getClient","rows","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","fs","z","UrlSchema","throwValidationError","readOptionalStdin","fs","fs","z","LimitSchema","throwValidationError","rows","fs","parsed","payload","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/errors.ts","../src/lib/api-path.ts","../src/lib/auth.ts","../src/schemas/common.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/lib/prompts.ts","../src/lib/pagination.ts","../src/lib/comments.ts","../src/schemas/comment.ts","../src/commands/comment.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/lib/images.ts","../src/schemas/image.ts","../src/commands/image.ts","../src/lib/labels.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/socialweb-client.ts","../src/lib/socialweb.ts","../src/lib/stats.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/lib/file-guards.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/commands/socialweb.ts","../src/schemas/socialweb.ts","../src/commands/stats.ts","../src/schemas/stats.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 { registerCommentCommands } from './commands/comment.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 { registerSocialWebCommands } from './commands/socialweb.js';\nimport { registerStatsCommands } from './commands/stats.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 registerCommentCommands(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 registerSocialWebCommands(program);\n registerStatsCommands(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 { normalizeGhostApiPath } from '../lib/api-path.js';\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 const requestApi = options.contentApi ? 'content' : 'admin';\n const normalizedEndpointPath = normalizeGhostApiPath(endpointPath, requestApi);\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: normalizedEndpointPath,\n method: options.method,\n body: requestBody,\n params,\n contentApi: requestApi === 'content',\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 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 { ExitCode, GhstError } from './errors.js';\n\ntype RequestApi = 'admin' | 'content';\n\nconst API_ROOTS: Record<RequestApi, string> = {\n admin: '/ghost/api/admin',\n content: '/ghost/api/content',\n};\n\nconst ABSOLUTE_URL_PATTERN = /^[A-Za-z][A-Za-z\\d+.-]*:/;\n\nfunction throwInvalidPath(message: string): never {\n throw new GhstError(message, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n}\n\nfunction decodePathSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n throwInvalidPath(`Invalid endpoint path segment: ${segment}`);\n }\n}\n\nfunction validatePathSegment(segment: string): void {\n const decoded = decodePathSegment(segment);\n\n if (segment === '.' || segment === '..' || decoded === '.' || decoded === '..') {\n throwInvalidPath('Endpoint path must not contain dot segments.');\n }\n\n if (decoded.includes('/') || decoded.includes('\\\\')) {\n throwInvalidPath('Endpoint path must not contain encoded path separators.');\n }\n}\n\nfunction stripSelectedApiRoot(input: string, api: RequestApi): string | null {\n const root = API_ROOTS[api];\n\n if (input === root || input === `${root}/`) {\n return '/';\n }\n\n if (input.startsWith(`${root}/`)) {\n return input.slice(root.length);\n }\n\n return null;\n}\n\nexport function normalizeGhostApiPath(input: string, api: RequestApi): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throwInvalidPath('Endpoint path is required.');\n }\n\n if (ABSOLUTE_URL_PATTERN.test(trimmed) || trimmed.startsWith('//')) {\n throwInvalidPath('Endpoint path must be relative to the selected Ghost API root.');\n }\n\n if (trimmed.includes('\\\\')) {\n throwInvalidPath('Endpoint path must not contain backslashes.');\n }\n\n if (trimmed.includes('#')) {\n throwInvalidPath('Endpoint path must not contain URL fragments.');\n }\n\n if (trimmed.includes('?')) {\n throwInvalidPath('Endpoint path must not include query parameters. Use --query instead.');\n }\n\n let candidate =\n stripSelectedApiRoot(trimmed, api) ??\n (() => {\n if (trimmed.startsWith('/ghost/api/')) {\n throwInvalidPath('Endpoint path must stay within the selected Ghost API root.');\n }\n\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n })();\n\n const rawSegments = candidate.split('/').filter(Boolean);\n for (const segment of rawSegments) {\n validatePathSegment(segment);\n }\n\n candidate = rawSegments.length === 0 ? '/' : `/${rawSegments.join('/')}/`;\n return candidate;\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 { 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\nexport type GhostCommentStatus = 'published' | 'hidden' | 'deleted';\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: (\n id: string,\n post: Record<string, unknown>,\n source?: 'html',\n params?: Record<string, string | number | boolean | undefined>,\n ) =>\n this.request<Record<string, unknown>>('PUT', `/posts/${id}/`, {\n body: { posts: [post] },\n source,\n params,\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 comments = {\n browseAll: (params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/comments/', { params }),\n\n read: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<Record<string, unknown>>('GET', `/comments/${id}/`, { params }),\n\n readForModeration: (id: string) =>\n this.request<Record<string, unknown>>('GET', `/comments/${id}/`, {\n params: {\n include:\n 'member,post,count.replies,count.direct_replies,count.likes,count.reports,parent,in_reply_to',\n },\n }),\n\n replies: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', `/comments/${id}/replies/`, { params }),\n\n browseThread: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', '/comments/', {\n params: {\n filter: `(parent_id:${id}+in_reply_to_id:null),in_reply_to_id:${id}`,\n order: 'created_at asc',\n include: 'member,post,count.direct_replies,count.likes,count.reports,parent,in_reply_to',\n limit: 100,\n ...params,\n },\n }),\n\n likes: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', `/comments/${id}/likes/`, { params }),\n\n reports: (id: string, params?: Record<string, string | number | boolean | undefined>) =>\n this.request<GhostPaginatedResponse>('GET', `/comments/${id}/reports/`, { params }),\n\n setStatus: (id: string, status: GhostCommentStatus) =>\n this.request<Record<string, unknown>>('PUT', `/comments/${id}/`, {\n body: {\n comments: [\n {\n id,\n status,\n },\n ],\n },\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\nasync function findEnclosingRepoRoot(cwd = process.cwd()): Promise<string | null> {\n let dir = path.resolve(cwd);\n const root = path.parse(dir).root;\n\n while (true) {\n const gitPath = path.join(dir, '.git');\n try {\n await fs.access(gitPath);\n return dir;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n if (dir === root) {\n return null;\n }\n\n dir = path.dirname(dir);\n }\n}\n\nasync function findProjectConfigPath(cwd = process.cwd()): Promise<string | null> {\n let dir = path.resolve(cwd);\n const stopDir = (await findEnclosingRepoRoot(dir)) ?? dir;\n\n while (true) {\n const candidate = path.join(dir, '.ghst', 'config.json');\n try {\n await fs.access(candidate);\n return candidate;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n if (dir === stopDir) {\n return null;\n }\n\n dir = path.dirname(dir);\n }\n}\n\nexport async function resolveProjectConfigCwd(cwd = process.cwd()): Promise<string> {\n const configPath = await findProjectConfigPath(cwd);\n if (!configPath) {\n return cwd;\n }\n\n return path.dirname(path.dirname(configPath));\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 = await findProjectConfigPath(cwd);\n if (!configPath) {\n return null;\n }\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 type {\n SocialWebAccount,\n SocialWebNotification,\n SocialWebPost,\n SocialWebStatusReport,\n} from './socialweb.js';\nimport type {\n StatsBreakdownRow,\n StatsContentRow,\n StatsGrowthReport,\n StatsNewsletterClicksReport,\n StatsNewsletterSubscribersReport,\n StatsNewslettersReport,\n StatsOverviewReport,\n StatsPostGrowthReport,\n StatsPostNewsletterReport,\n StatsPostReferrersReport,\n StatsPostReport,\n StatsPostsReport,\n StatsPostWebReport,\n StatsWebReport,\n StatsWebTableReport,\n} from './stats.js';\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 === 'hidden') return chalk.yellow(status);\n if (status === 'deleted') return chalk.red(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\nexport function printTableHuman(headers: string[], rows: string[][], useColor = true): void {\n printRows(headers, rows, useColor);\n}\n\nexport function formatCsv(headers: string[], rows: string[][]): string {\n const escapeValue = (value: string): string => {\n if (/[\",\\r\\n]/.test(value)) {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n\n return value;\n };\n\n return [headers, ...rows].map((row) => row.map(escapeValue).join(',')).join('\\n');\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 stripHtml(value: unknown): string {\n const html = String(value ?? '');\n return html\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/p>/gi, '\\n')\n .replace(/<[^>]+>/g, ' ')\n .replace(/ /gi, ' ')\n .replace(/&/gi, '&')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/'/gi, \"'\")\n .replace(/"/gi, '\"')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nfunction truncateValue(value: string, max = 64): string {\n if (value.length <= max) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, max - 3))}...`;\n}\n\nfunction getFirstRecord(\n payload: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const collection = Array.isArray(payload[key]) ? payload[key] : [];\n return collection[0] as Record<string, unknown> | undefined;\n}\n\nfunction getCommentAuthor(record: Record<string, unknown>): string {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n return String(member.name ?? member.email ?? record.member_id ?? 'Unknown');\n}\n\nfunction getCommentPost(record: Record<string, unknown>): string {\n const post = (record.post as Record<string, unknown> | undefined) ?? {};\n return String(post.title ?? record.post_id ?? '');\n}\n\nfunction getCommentCounts(record: Record<string, unknown>): string {\n const count = (record.count as Record<string, unknown> | undefined) ?? {};\n const replies = Number(count.replies ?? 0);\n const directReplies = Number(count.direct_replies ?? 0);\n const likes = Number(count.likes ?? 0);\n const reports = Number(count.reports ?? 0);\n return `${replies}/${directReplies}/${likes}/${reports}`;\n}\n\nfunction getCommentReplyLink(record: Record<string, unknown>): string {\n const snippet = String(record.in_reply_to_snippet ?? '').trim();\n if (snippet) {\n return truncateValue(snippet, 32);\n }\n\n if (record.in_reply_to_id) {\n return String(record.in_reply_to_id);\n }\n\n if (record.parent_id) {\n return String(record.parent_id);\n }\n\n return '';\n}\n\nfunction getCommentSnippet(record: Record<string, unknown>): string {\n const text = stripHtml(record.html);\n return truncateValue(text || '[removed]', 72);\n}\n\nfunction commentRow(record: Record<string, unknown>, useColor: boolean): string[] {\n return [\n String(record.id ?? ''),\n getCommentAuthor(record),\n truncateValue(getCommentPost(record), 28),\n formatStatus(String(record.status ?? 'unknown'), useColor),\n getCommentCounts(record),\n String(record.created_at ?? ''),\n getCommentReplyLink(record),\n getCommentSnippet(record),\n ];\n}\n\nfunction printCommentSummary(record: Record<string, unknown>): void {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n const post = (record.post as Record<string, unknown> | undefined) ?? {};\n const lines = [\n `ID: ${String(record.id ?? '')}`,\n `Status: ${String(record.status ?? '')}`,\n `Author: ${String(member.name ?? member.email ?? record.member_id ?? '')}`,\n `Author ID: ${String(member.id ?? record.member_id ?? '')}`,\n `Post: ${String(post.title ?? record.post_id ?? '')}`,\n `Post ID: ${String(post.id ?? record.post_id ?? '')}`,\n `Parent ID: ${String(record.parent_id ?? '')}`,\n `In Reply To ID: ${String(record.in_reply_to_id ?? '')}`,\n `Created: ${String(record.created_at ?? '')}`,\n `Edited: ${String(record.edited_at ?? '')}`,\n `Counts (replies/direct/likes/reports): ${getCommentCounts(record)}`,\n '',\n 'Body:',\n stripHtml(record.html) || '[removed]',\n ];\n\n console.log(lines.join('\\n'));\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 printCommentListHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'comments', (record) => commentRow(record, useColor));\n\n printRows(\n ['ID', 'AUTHOR', 'POST', 'STATUS', 'R/D/L/RP', 'CREATED', 'REPLY TO', 'TEXT'],\n rows,\n useColor,\n );\n printPagination(payload, 'comments');\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\nfunction socialWebPostRows(posts: SocialWebPost[], useColor: boolean): string[][] {\n return posts.map((post) => [\n String(post.id ?? ''),\n String(post.title ?? post.excerpt ?? '(untitled)'),\n String(\n post.author && typeof post.author === 'object'\n ? ((post.author as { handle?: string }).handle ?? '')\n : '',\n ),\n formatStatus(post.repostedByMe ? 'reposted' : post.likedByMe ? 'liked' : 'active', useColor),\n ]);\n}\n\nfunction socialWebAccountRows(accounts: SocialWebAccount[]): string[][] {\n return accounts.map((account) => [\n String(account.id ?? ''),\n String(account.name ?? ''),\n String(account.handle ?? ''),\n String(account.followedByMe ?? ''),\n ]);\n}\n\nexport function printSocialWebStatusHuman(payload: Record<string, unknown>, useColor = true): void {\n const report = payload as unknown as SocialWebStatusReport;\n console.log(\n `Social web: ${formatStatus(report.settings.social_web ? 'enabled' : 'disabled', useColor)}`,\n );\n console.log(`Reachable: ${report.reachable ? 'yes' : 'no'}`);\n console.log(`Identity available: ${report.identity.available ? 'yes' : 'no'}`);\n if (report.identity.role) {\n console.log(`Identity role: ${report.identity.role}`);\n }\n if (report.account?.handle) {\n console.log(`Handle: ${report.account.handle}`);\n }\n}\n\nexport function printSocialWebAccountHuman(\n payload: Record<string, unknown>,\n _useColor = true,\n): void {\n const account = payload as unknown as SocialWebAccount;\n console.log(`Name: ${String(account.name ?? '')}`);\n console.log(`Handle: ${String(account.handle ?? '')}`);\n if (account.url) {\n console.log(`URL: ${account.url}`);\n }\n if (account.bio) {\n console.log(`Bio: ${account.bio}`);\n }\n if (typeof account.followerCount === 'number' || typeof account.followingCount === 'number') {\n console.log(\n `Followers: ${String(account.followerCount ?? 0)} Following: ${String(account.followingCount ?? 0)}`,\n );\n }\n if (account.followedByMe !== undefined) {\n console.log(`Followed by me: ${account.followedByMe ? 'yes' : 'no'}`);\n }\n if (account.blockedByMe !== undefined) {\n console.log(`Blocked by me: ${account.blockedByMe ? 'yes' : 'no'}`);\n }\n}\n\nexport function printSocialWebAccountsHuman(\n payload: Record<string, unknown>,\n useColor = true,\n): void {\n const accounts = Array.isArray(payload.accounts)\n ? (payload.accounts as SocialWebAccount[])\n : Array.isArray(payload.blocked_accounts)\n ? (payload.blocked_accounts as SocialWebAccount[])\n : Array.isArray(payload.blocked_domains)\n ? (payload.blocked_domains as SocialWebAccount[])\n : [];\n\n printRows(['ID', 'NAME', 'HANDLE', 'FOLLOWED'], socialWebAccountRows(accounts), useColor);\n\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`\\nNext: ${payload.next}`);\n }\n}\n\nexport function printSocialWebPostsHuman(payload: Record<string, unknown>, useColor = true): void {\n if (!Array.isArray(payload.posts)) {\n const single = payload as unknown as SocialWebPost;\n const authorHandle =\n single.author && typeof single.author === 'object'\n ? String((single.author as { handle?: string }).handle ?? '')\n : '';\n console.log(`ID: ${String(single.id ?? '')}`);\n console.log(`Title: ${String(single.title ?? single.excerpt ?? '')}`);\n if (authorHandle) {\n console.log(`Author: ${authorHandle}`);\n }\n if (single.url) {\n console.log(`URL: ${single.url}`);\n }\n if (single.content) {\n console.log(`\\n${single.content}`);\n }\n return;\n }\n\n printRows(\n ['ID', 'TITLE', 'AUTHOR', 'STATE'],\n socialWebPostRows(payload.posts as SocialWebPost[], useColor),\n useColor,\n );\n\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`\\nNext: ${payload.next}`);\n }\n}\n\nexport function printSocialWebNotificationsHuman(\n payload: Record<string, unknown>,\n useColor = true,\n): void {\n const notifications = Array.isArray(payload.notifications)\n ? (payload.notifications as SocialWebNotification[])\n : [];\n const rows = notifications.map((notification) => [\n notification.type,\n notification.actor?.handle ?? '',\n notification.post && typeof notification.post === 'object'\n ? String((notification.post as { title?: string }).title ?? '')\n : '',\n notification.createdAt,\n ]);\n\n printRows(['TYPE', 'ACTOR', 'POST', 'CREATED'], rows, useColor);\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`\\nNext: ${payload.next}`);\n }\n}\n\nexport function printSocialWebThreadHuman(\n payload: Record<string, unknown>,\n _useColor = true,\n): void {\n const ancestors = Array.isArray((payload.ancestors as { chain?: unknown[] } | undefined)?.chain)\n ? (((payload.ancestors as { chain?: unknown[] }).chain ?? []) as SocialWebPost[])\n : [];\n const post = (payload.post ?? null) as SocialWebPost | null;\n const children = Array.isArray(payload.children)\n ? (payload.children as Array<{ post?: SocialWebPost }>)\n : [];\n\n for (const ancestor of ancestors) {\n console.log(`Ancestor: ${ancestor.id}`);\n }\n\n if (post) {\n console.log(`Root: ${post.id} ${post.title ?? post.excerpt ?? ''}`.trim());\n }\n\n for (const child of children) {\n if (child.post) {\n console.log(`Reply: ${child.post.id} ${child.post.title ?? child.post.excerpt ?? ''}`.trim());\n }\n }\n\n if (typeof payload.next === 'string' && payload.next) {\n console.log(`More replies: ${payload.next}`);\n }\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 printCommentLikesHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'comment_likes', (record) => {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n return [\n String(record.id ?? ''),\n String(member.name ?? member.email ?? record.member_id ?? 'Unknown'),\n String(member.email ?? ''),\n String(record.created_at ?? ''),\n ];\n });\n\n printRows(['ID', 'MEMBER', 'EMAIL', 'CREATED'], rows, useColor);\n printPagination(payload, 'likes');\n}\n\nexport function printCommentReportsHuman(payload: Record<string, unknown>, useColor = true): void {\n const rows = rowsFromCollection(payload, 'comment_reports', (record) => {\n const member = (record.member as Record<string, unknown> | undefined) ?? {};\n return [\n String(record.id ?? ''),\n String(member.name ?? member.email ?? record.member_id ?? 'Unknown'),\n String(member.email ?? ''),\n String(record.created_at ?? ''),\n ];\n });\n\n printRows(['ID', 'MEMBER', 'EMAIL', 'CREATED'], rows, useColor);\n printPagination(payload, 'reports');\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 printCommentHuman(payload: Record<string, unknown>): void {\n const record = getFirstRecord(payload, 'comments');\n if (!record) {\n console.log('No record found.');\n return;\n }\n\n printCommentSummary(record);\n}\n\nexport function printCommentThreadHuman(payload: Record<string, unknown>, useColor = true): void {\n const record =\n payload.comment && typeof payload.comment === 'object'\n ? (payload.comment as Record<string, unknown>)\n : undefined;\n\n if (!record) {\n console.log('No record found.');\n return;\n }\n\n printCommentSummary(record);\n\n const comments = Array.isArray(payload.comments)\n ? (payload.comments as Array<Record<string, unknown>>)\n : [];\n\n if (comments.length === 0) {\n console.log('\\nNo thread replies.');\n return;\n }\n\n console.log('\\nThread replies:');\n printRows(\n ['ID', 'AUTHOR', 'POST', 'STATUS', 'R/D/L/RP', 'CREATED', 'REPLY TO', 'TEXT'],\n comments.map((comment) => commentRow(comment, useColor)),\n useColor,\n );\n printPagination(payload, 'comments');\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\nfunction formatInteger(value: number): string {\n return new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }).format(value);\n}\n\nfunction formatDecimal(value: number): string {\n return new Intl.NumberFormat('en-US', {\n minimumFractionDigits: value % 1 === 0 ? 0 : 1,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction formatPercent(value: number): string {\n return `${formatDecimal(value)}%`;\n}\n\nfunction formatSeconds(value: number): string {\n return `${formatInteger(value)}s`;\n}\n\nfunction printSection(title: string): void {\n console.log(title);\n}\n\nfunction printKeyValues(lines: string[]): void {\n console.log(lines.join('\\n'));\n}\n\nfunction breakdownRows(items: StatsBreakdownRow[]): string[][] {\n return items.map((item) => [\n item.label,\n formatInteger(item.visits),\n item.signups === null ? '' : formatInteger(item.signups),\n item.paid_conversions === null ? '' : formatInteger(item.paid_conversions),\n item.mrr === null ? '' : formatInteger(item.mrr),\n ]);\n}\n\nfunction contentRows(items: StatsContentRow[]): string[][] {\n return items.map((item) => [\n item.title,\n item.pathname,\n formatInteger(item.visits),\n formatInteger(item.pageviews),\n ]);\n}\n\nfunction trafficSourceRows(items: StatsBreakdownRow[]): string[][] {\n return items.map((item) => [item.label, formatInteger(item.visits)]);\n}\n\nexport function printStatsOverviewHuman(payload: StatsOverviewReport, useColor = true): void {\n const memberDelta = `${payload.summary.member_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.member_delta)}`;\n const paidDelta = `${payload.summary.paid_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.paid_delta)}`;\n const mrrDelta = `${payload.summary.mrr_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.mrr_delta)}`;\n\n printSection(\n `Overview (${payload.range.from ?? 'all'} to ${payload.range.to}, ${payload.range.timezone})`,\n );\n printKeyValues([\n `Visitors: ${formatInteger(payload.summary.visitors)}`,\n `Pageviews: ${formatInteger(payload.summary.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.summary.bounce_rate)}`,\n `Visit duration: ${formatSeconds(payload.summary.avg_session_sec)}`,\n `Active visitors: ${formatInteger(payload.summary.active_visitors)}`,\n `Members: ${formatInteger(payload.summary.total_members)} (${memberDelta})`,\n `Paid members: ${formatInteger(payload.summary.paid_members)} (${paidDelta})`,\n `MRR: ${formatInteger(payload.summary.mrr)} (${mrrDelta})`,\n ]);\n console.log('');\n printSection('Top Content');\n printRows(['TITLE', 'PATH', 'VISITS', 'PAGEVIEWS'], contentRows(payload.web.content), useColor);\n console.log('');\n printSection('Top Sources');\n printRows(['SOURCE', 'VISITS'], trafficSourceRows(payload.web.sources), useColor);\n}\n\nexport function printStatsWebHuman(payload: StatsWebReport, useColor = true): void {\n printSection(\n `Web (${payload.range.from ?? 'all'} to ${payload.range.to}, ${payload.range.timezone})`,\n );\n printKeyValues([\n `Visitors: ${formatInteger(payload.kpis.visits)}`,\n `Pageviews: ${formatInteger(payload.kpis.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.kpis.bounce_rate)}`,\n `Visit duration: ${formatSeconds(payload.kpis.avg_session_sec)}`,\n `Active visitors: ${formatInteger(payload.kpis.active_visitors)}`,\n ]);\n console.log('');\n printSection('Top Content');\n printRows(['TITLE', 'PATH', 'VISITS', 'PAGEVIEWS'], contentRows(payload.content), useColor);\n console.log('');\n printSection('Top Sources');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.sources),\n useColor,\n );\n console.log('');\n printSection('Top Locations');\n printRows(\n ['LOCATION', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.locations),\n useColor,\n );\n}\n\nexport function printStatsWebTableHuman(payload: StatsWebTableReport, useColor = true): void {\n if (payload.metric === 'content') {\n printRows(\n ['TITLE', 'PATH', 'VISITS', 'PAGEVIEWS'],\n contentRows(payload.items as StatsContentRow[]),\n useColor,\n );\n return;\n }\n\n printRows(\n ['LABEL', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.items as StatsBreakdownRow[]),\n useColor,\n );\n}\n\nexport function printStatsGrowthHuman(payload: StatsGrowthReport, useColor = true): void {\n printSection(\n `Growth (${payload.range.from ?? 'all'} to ${payload.range.to}, ${payload.range.timezone})`,\n );\n printKeyValues([\n `Members: ${formatInteger(payload.summary.total_members)} (${payload.summary.member_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.member_delta)})`,\n `Paid members: ${formatInteger(payload.summary.paid_members)} (${payload.summary.paid_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.paid_delta)})`,\n `MRR: ${formatInteger(payload.summary.mrr)} (${payload.summary.mrr_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.mrr_delta)})`,\n `Subscriptions: ${formatInteger(payload.summary.total_subscriptions)} (${payload.summary.subscription_delta >= 0 ? '+' : ''}${formatInteger(payload.summary.subscription_delta)})`,\n ]);\n console.log('');\n printSection('Top Sources');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.sources),\n useColor,\n );\n}\n\nexport function printStatsPostsHuman(payload: StatsPostsReport, useColor = true): void {\n printRows(\n ['TITLE', 'VIEWS', 'MEMBERS', 'SENT', 'OPEN RATE', 'CLICK RATE'],\n payload.posts.map((item) => [\n item.title,\n formatInteger(item.views),\n formatInteger(item.members),\n item.sent_count === null ? '' : formatInteger(item.sent_count),\n item.open_rate === null ? '' : formatPercent(item.open_rate),\n item.click_rate === null ? '' : formatPercent(item.click_rate),\n ]),\n useColor,\n );\n}\n\nexport function printStatsNewslettersHuman(payload: StatsNewslettersReport, useColor = true): void {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_name,\n formatInteger(item.sent_posts),\n formatInteger(item.recipients),\n formatPercent(item.open_rate),\n formatPercent(item.click_rate),\n formatInteger(item.subscribers),\n ]);\n\n printRows(\n ['NEWSLETTER', 'POSTS', 'RECIPIENTS', 'OPEN RATE', 'CLICK RATE', 'SUBSCRIBERS'],\n rows,\n useColor,\n );\n}\n\nexport function printStatsNewsletterClicksHuman(\n payload: StatsNewsletterClicksReport,\n useColor = true,\n): void {\n const rows = payload.clicks.map((item) => [\n item.post_title,\n item.send_date ?? '',\n formatInteger(item.recipients),\n formatInteger(item.clicks),\n formatPercent(item.click_rate),\n ]);\n printRows(['POST', 'DATE', 'RECIPIENTS', 'CLICKS', 'CLICK RATE'], rows, useColor);\n}\n\nexport function printStatsNewsletterSubscribersHuman(\n payload: StatsNewsletterSubscribersReport,\n useColor = true,\n): void {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_name,\n formatInteger(item.subscribers),\n `${item.subscriber_delta >= 0 ? '+' : ''}${formatInteger(item.subscriber_delta)}`,\n ]);\n printRows(['NEWSLETTER', 'SUBSCRIBERS', 'DELTA'], rows, useColor);\n}\n\nexport function printStatsPostHuman(payload: StatsPostReport, useColor = true): void {\n printSection(`Post: ${payload.post.title}`);\n printKeyValues([\n `Visitors: ${formatInteger(payload.summary.visitors)}`,\n `Pageviews: ${formatInteger(payload.summary.pageviews)}`,\n `Free members: ${formatInteger(payload.summary.free_members)}`,\n `Paid members: ${formatInteger(payload.summary.paid_members)}`,\n `MRR: ${formatInteger(payload.summary.mrr)}`,\n `Email recipients: ${formatInteger(payload.summary.email_recipients)}`,\n `Email open rate: ${formatPercent(payload.summary.email_open_rate)}`,\n `Email click rate: ${formatPercent(payload.summary.email_click_rate)}`,\n ]);\n\n if (payload.web) {\n console.log('');\n printSection('Web');\n printKeyValues([\n `Visitors: ${formatInteger(payload.web.kpis.visits)}`,\n `Pageviews: ${formatInteger(payload.web.kpis.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.web.kpis.bounce_rate)}`,\n ]);\n }\n\n console.log('');\n printSection('Top Referrers');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n payload.referrers.map((item) => [\n item.source,\n formatInteger(item.visits),\n formatInteger(item.signups),\n formatInteger(item.paid_conversions),\n formatInteger(item.mrr),\n ]),\n useColor,\n );\n}\n\nexport function printStatsPostGrowthHuman(payload: StatsPostGrowthReport, useColor = true): void {\n printRows(\n ['DATE', 'FREE', 'PAID', 'MRR'],\n payload.growth.map((item) => [\n item.date,\n formatInteger(item.free_members),\n formatInteger(item.paid_members),\n formatInteger(item.mrr),\n ]),\n useColor,\n );\n}\n\nexport function printStatsPostNewsletterHuman(payload: StatsPostNewsletterReport): void {\n printSection(`Post Newsletter: ${payload.post.title}`);\n printKeyValues([\n `Recipients: ${formatInteger(payload.newsletter.recipients)}`,\n `Open rate: ${formatPercent(payload.newsletter.open_rate)}`,\n `Click rate: ${formatPercent(payload.newsletter.click_rate)}`,\n ]);\n}\n\nexport function printStatsPostReferrersHuman(\n payload: StatsPostReferrersReport,\n useColor = true,\n): void {\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n payload.referrers.map((item) => [\n item.source,\n formatInteger(item.visits),\n formatInteger(item.signups),\n formatInteger(item.paid_conversions),\n formatInteger(item.mrr),\n ]),\n useColor,\n );\n}\n\nexport function printStatsPostWebHuman(payload: StatsPostWebReport, useColor = true): void {\n printSection(`Post Web: ${payload.post.title}`);\n printKeyValues([\n `Visitors: ${formatInteger(payload.kpis.visits)}`,\n `Pageviews: ${formatInteger(payload.kpis.pageviews)}`,\n `Bounce rate: ${formatPercent(payload.kpis.bounce_rate)}`,\n `Visit duration: ${formatSeconds(payload.kpis.avg_session_sec)}`,\n `Active visitors: ${formatInteger(payload.kpis.active_visitors)}`,\n ]);\n console.log('');\n printSection('Top Sources');\n printRows(\n ['SOURCE', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.sources),\n useColor,\n );\n console.log('');\n printSection('Top Locations');\n printRows(\n ['LOCATION', 'VISITS', 'SIGNUPS', 'PAID', 'MRR'],\n breakdownRows(payload.locations),\n useColor,\n );\n}\n\nexport function isJsonMode(global: GlobalOptions): boolean {\n return Boolean(global.json || global.jq || 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 readProjectConfig,\n readUserConfig,\n resolveConnectionConfig,\n resolveProjectConfigCwd,\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';\nimport { confirmDestructiveAction } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\n\ntype PromptFn = (question: string) => Promise<string>;\ntype OpenUrlFn = (url: string) => Promise<void>;\n\ninterface ResolvedGhostAdminOrigin {\n inputOrigin: string;\n resolvedOrigin: string;\n}\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\nfunction formatConfiguredSiteDisplay(\n alias: string | null | undefined,\n sites: Record<string, { url: string }>,\n): string {\n if (!alias) {\n return '(none)';\n }\n\n const url = sites[alias]?.url;\n if (!url) {\n return alias;\n }\n\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nfunction formatSiteDomain(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url;\n }\n}\n\nfunction formatSwitchSiteOption(alias: string, sites: Record<string, { url: string }>): string {\n const site = sites[alias];\n if (!site) {\n return alias;\n }\n\n const domain = formatSiteDomain(site.url);\n const duplicateCount = Object.values(sites).filter(\n (configuredSite) => formatSiteDomain(configuredSite.url) === domain,\n ).length;\n\n if (duplicateCount > 1) {\n return `${domain} [${alias}]`;\n }\n\n return domain;\n}\n\nfunction resolveConfiguredSiteSelection(\n input: string | null | undefined,\n sites: Record<string, { url: string }>,\n): string | null {\n const candidate = input?.trim();\n if (!candidate) {\n return null;\n }\n\n if (sites[candidate]) {\n return candidate;\n }\n\n for (const alias of Object.keys(sites)) {\n if (formatSwitchSiteOption(alias, sites) === candidate) {\n return alias;\n }\n }\n\n const matches = Object.entries(sites)\n .filter(([, site]) => formatSiteDomain(site.url) === candidate)\n .map(([alias]) => alias);\n\n if (matches.length === 1) {\n return matches[0] ?? null;\n }\n\n return null;\n}\n\nfunction hasOriginChanged(inputOrigin: string, resolvedOrigin: string): boolean {\n return inputOrigin !== resolvedOrigin;\n}\n\nasync function confirmRedirectedOrigin(\n inputOrigin: string,\n resolvedOrigin: string,\n useColor: boolean,\n): Promise<boolean> {\n const lines = [\n 'Ghost Admin redirect detected.',\n `Requested origin: ${inputOrigin}`,\n `Resolved origin: ${resolvedOrigin}`,\n 'Continue with the resolved Ghost Admin origin?',\n ];\n const message = lines.join('\\n');\n\n console.log('');\n console.log(useColor ? chalk.yellow(message) : message);\n console.log('');\n\n const answer = await promptFn('Continue? [y/N]: ');\n const normalized = answer.trim().toLowerCase();\n return normalized === 'y' || normalized === 'yes';\n}\n\nasync function resolveGhostAdminOrigin(inputUrl: string): Promise<ResolvedGhostAdminOrigin> {\n const maxRedirects = 5;\n const inputOrigin = normalizeGhostUrl(inputUrl);\n let probeUrl = getGhostAdminEntryUrl(inputOrigin);\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 {\n inputOrigin,\n resolvedOrigin: normalizeGhostUrl(finalUrl),\n };\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 const requestedOrigin = normalizeGhostUrl(urlInput ?? '');\n const resolvedOrigin = await resolveGhostAdminOrigin(requestedOrigin);\n urlInput = resolvedOrigin.resolvedOrigin;\n\n if (hasOriginChanged(resolvedOrigin.inputOrigin, resolvedOrigin.resolvedOrigin)) {\n if (nonInteractive) {\n throw new GhstError(\n `Ghost Admin discovery resolved to '${resolvedOrigin.resolvedOrigin}' instead of '${resolvedOrigin.inputOrigin}'. Re-run with --url ${resolvedOrigin.resolvedOrigin}.`,\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n\n const shouldContinue = await confirmRedirectedOrigin(\n resolvedOrigin.inputOrigin,\n resolvedOrigin.resolvedOrigin,\n global.color !== false,\n );\n if (!shouldContinue) {\n throw new GhstError('Operation cancelled.', {\n exitCode: ExitCode.OPERATION_CANCELLED,\n code: 'OPERATION_CANCELLED',\n });\n }\n }\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: ${formatConfiguredSiteDisplay(config.active, config.sites)}`);\n for (const [alias, site] of Object.entries(config.sites)) {\n const marker = config.active === alias ? '*' : ' ';\n console.log(`${marker} ${formatSiteDomain(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 const projectConfig = await readProjectConfig();\n const projectSite = projectConfig?.site ?? null;\n const effectiveSite = projectSite ?? config.active ?? null;\n\n if (global.json) {\n console.log(\n JSON.stringify(\n {\n active: config.active ?? null,\n ...(projectSite ? { projectLink: projectSite } : {}),\n effectiveSite,\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: ${formatConfiguredSiteDisplay(config.active, config.sites)}`);\n if (projectSite) {\n console.log(\n `Project link: ${formatConfiguredSiteDisplay(projectSite, config.sites)} (overrides active site in this directory)`,\n );\n }\n for (const [alias, site] of Object.entries(config.sites)) {\n const marker = effectiveSite === alias ? '*' : ' ';\n console.log(`${marker} ${formatSiteDomain(site.url)}`);\n }\n });\n\n auth\n .command('switch [site]')\n .description('Switch active site (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} ${formatSwitchSiteOption(alias, config.sites)}`);\n }\n\n targetSite = await promptFn('Switch to site domain or alias: ');\n }\n\n const resolvedTargetSite = resolveConfiguredSiteSelection(targetSite, config.sites);\n if (!resolvedTargetSite) {\n throw new GhstError(`Unknown site alias or domain: ${targetSite ?? '(empty)'}`, {\n exitCode: ExitCode.NOT_FOUND,\n code: 'SITE_NOT_FOUND',\n });\n }\n\n config.active = resolvedTargetSite;\n await writeUserConfig(config);\n console.log(\n `Active site set to '${formatSwitchSiteOption(resolvedTargetSite, config.sites)}'.`,\n );\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 .option('--yes', 'Skip confirmation when removing all configured sites')\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 if (!options.yes) {\n if (isNonInteractive()) {\n throw new GhstError('Removing all sites in non-interactive mode requires --yes.', {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n }\n\n const ok = await confirmDestructiveAction(\n 'Remove all configured sites and credentials? [y/N]: ',\n {\n action: 'logout_all_sites',\n target: 'all_configured_sites',\n reversible: false,\n sideEffects: ['remove_credentials', 'remove_site_links'],\n },\n );\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n exitCode: ExitCode.OPERATION_CANCELLED,\n code: 'OPERATION_CANCELLED',\n });\n }\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 .option('--yes', 'Skip confirmation when replacing an existing project 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 const projectConfig = await readProjectConfig();\n const projectConfigCwd = await resolveProjectConfigCwd();\n if (projectConfig && projectConfig.site !== siteAlias) {\n if (!options.yes) {\n if (isNonInteractive()) {\n throw new GhstError(\n 'Overwriting an existing project link in non-interactive mode requires --yes.',\n {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n },\n );\n }\n\n const ok = await confirmDestructiveAction(\n `Relink current directory from '${projectConfig.site}' to '${siteAlias}'? [y/N]: `,\n {\n action: 'relink_project',\n target: `${projectConfig.site}->${siteAlias}`,\n reversible: true,\n site: siteAlias,\n sideEffects: ['update_project_link'],\n },\n );\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n exitCode: ExitCode.OPERATION_CANCELLED,\n code: 'OPERATION_CANCELLED',\n });\n }\n }\n }\n\n await writeProjectConfig(\n {\n ...(projectConfig?.defaults ? { defaults: projectConfig.defaults } : {}),\n site: siteAlias,\n },\n projectConfigCwd,\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 (sensitive output)')\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 readline from 'node:readline/promises';\n\nexport type PromptHandler = (question: string) => Promise<string>;\nexport interface DestructiveActionNotice {\n action: string;\n target: string;\n count?: number;\n reversible?: boolean;\n site?: string | null;\n sideEffects?: string[];\n}\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\nexport async function confirmDestructiveAction(\n question: string,\n notice: DestructiveActionNotice,\n): Promise<boolean> {\n console.error('GHST_AGENT_NOTICE: destructive_action');\n console.error('GHST_AGENT_NOTICE: Agents must ask the user for approval before continuing.');\n console.error(`GHST_AGENT_NOTICE: ${JSON.stringify(notice)}`);\n return confirm(question);\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 { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\nexport type CommentStatus = 'published' | 'hidden' | 'deleted';\n\ninterface CommentBrowseOptions {\n limit?: number;\n page?: number;\n filter?: string;\n order?: string;\n includeNested?: boolean;\n}\n\ninterface CommentRepliesOptions {\n limit?: number;\n page?: number;\n filter?: string;\n}\n\ninterface CommentRelationOptions {\n limit?: number;\n page?: number;\n}\n\nexport interface CommentThreadPayload extends Record<string, unknown> {\n comment: Record<string, unknown> | null;\n comments: Array<Record<string, unknown>>;\n meta?: 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\nfunction withDefaultLimit<T extends { limit?: number }>(params: T): T & { limit: number } {\n return {\n ...params,\n limit: params.limit ?? 100,\n };\n}\n\nexport async function listComments(\n global: GlobalOptions,\n options: CommentBrowseOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n filter: options.filter,\n order: options.order ?? 'created_at desc',\n include: 'member,post,parent',\n include_nested: options.includeNested === false ? false : undefined,\n });\n\n if (!allPages) {\n return client.comments.browseAll(params);\n }\n\n return collectAllPages('comments', (page) => client.comments.browseAll({ ...params, page }));\n}\n\nexport async function getComment(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.comments.readForModeration(id);\n}\n\nexport async function getCommentThread(\n global: GlobalOptions,\n id: string,\n): Promise<CommentThreadPayload> {\n const client = await getClient(global);\n const [selectedPayload, threadPayload] = await Promise.all([\n client.comments.readForModeration(id),\n collectAllPages('comments', (page) => client.comments.browseThread(id, { page })),\n ]);\n\n const selectedComment = Array.isArray(selectedPayload.comments)\n ? ((selectedPayload.comments[0] as Record<string, unknown> | undefined) ?? null)\n : null;\n const threadComments = Array.isArray(threadPayload.comments)\n ? (threadPayload.comments as Array<Record<string, unknown>>)\n : [];\n\n return {\n comment: selectedComment,\n comments: threadComments,\n meta:\n (threadPayload.meta as Record<string, unknown> | undefined) ??\n (selectedPayload.meta as Record<string, unknown> | undefined),\n };\n}\n\nexport async function listCommentReplies(\n global: GlobalOptions,\n id: string,\n options: CommentRepliesOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n filter: options.filter,\n include: 'member,post,count.replies,count.likes,count.reports,parent',\n });\n\n if (!allPages) {\n return client.comments.replies(id, params);\n }\n\n return collectAllPages('comments', (page) => client.comments.replies(id, { ...params, page }));\n}\n\nexport async function listCommentLikes(\n global: GlobalOptions,\n id: string,\n options: CommentRelationOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n include: 'member',\n order: 'created_at desc',\n });\n\n if (!allPages) {\n return client.comments.likes(id, params);\n }\n\n return collectAllPages('comment_likes', (page) => client.comments.likes(id, { ...params, page }));\n}\n\nexport async function listCommentReports(\n global: GlobalOptions,\n id: string,\n options: CommentRelationOptions,\n allPages: boolean,\n): Promise<GhostPaginatedResponse> {\n const client = await getClient(global);\n const params = withDefaultLimit({\n limit: options.limit,\n page: options.page,\n });\n\n if (!allPages) {\n return client.comments.reports(id, params);\n }\n\n return collectAllPages('comment_reports', (page) =>\n client.comments.reports(id, { ...params, page }),\n );\n}\n\nexport async function setCommentStatus(\n global: GlobalOptions,\n id: string,\n status: CommentStatus,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.comments.setStatus(id, status);\n}\n","import { z } from 'zod';\n\nconst CommentListLimitSchema = z.union([z.number().int().positive().max(100), z.literal('all')]);\n\nfunction rejectPageWithAll<T extends { limit?: number | 'all'; page?: number }>(\n value: T,\n ctx: z.RefinementCtx,\n): void {\n if (value.limit === 'all' && value.page !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['page'],\n message: 'Cannot combine --page with --limit all',\n });\n }\n}\n\nexport const CommentListInputSchema = z\n .object({\n limit: CommentListLimitSchema.optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n order: z.string().optional(),\n topLevelOnly: z.boolean().optional(),\n })\n .superRefine(rejectPageWithAll);\n\nexport const CommentGetInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const CommentThreadInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const CommentRepliesInputSchema = z\n .object({\n id: z.string().min(1),\n limit: CommentListLimitSchema.optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n })\n .superRefine(rejectPageWithAll);\n\nexport const CommentRelationListInputSchema = z\n .object({\n id: z.string().min(1),\n limit: CommentListLimitSchema.optional(),\n page: z.number().int().positive().optional(),\n })\n .superRefine(rejectPageWithAll);\n\nexport const CommentStatusInputSchema = z.object({\n id: z.string().min(1),\n});\n\nexport const CommentDeleteInputSchema = z.object({\n id: z.string().min(1),\n yes: z.boolean().optional(),\n});\n","import type { Command } from 'commander';\nimport {\n getComment,\n getCommentThread,\n listCommentLikes,\n listCommentReplies,\n listCommentReports,\n listComments,\n setCommentStatus,\n} from '../lib/comments.js';\nimport { getGlobalOptions } from '../lib/context.js';\nimport { ExitCode, GhstError } from '../lib/errors.js';\nimport {\n printCommentHuman,\n printCommentLikesHuman,\n printCommentListHuman,\n printCommentReportsHuman,\n printCommentThreadHuman,\n printJson,\n} from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport { confirmDestructiveAction } from '../lib/prompts.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n CommentDeleteInputSchema,\n CommentGetInputSchema,\n CommentListInputSchema,\n CommentRelationListInputSchema,\n CommentRepliesInputSchema,\n CommentStatusInputSchema,\n CommentThreadInputSchema,\n} from '../schemas/comment.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 registerCommentCommands(program: Command): void {\n const comment = program.command('comment').description('Comment moderation');\n\n comment\n .command('list')\n .description('List comments across the site')\n .option('--limit <numberOrAll>', 'Number of comments per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .option('--order <order>', 'Sort order')\n .option('--top-level-only', 'Only include top-level comments')\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 = CommentListInputSchema.safeParse({\n limit: rawLimit,\n page: rawPage,\n filter: options.filter,\n order: options.order,\n topLevelOnly: options.topLevelOnly,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listComments(\n global,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n filter: parsed.data.filter,\n order: parsed.data.order,\n includeNested: !parsed.data.topLevelOnly,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentListHuman(payload, global.color !== false);\n });\n\n comment\n .command('get <id>')\n .description('Get a comment by id with Admin moderation fields')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentGetInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getComment(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\n });\n\n comment\n .command('thread <id>')\n .description('Open a comment thread using the Admin moderation view')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentThreadInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getCommentThread(global, parsed.data.id);\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentThreadHuman(payload, global.color !== false);\n });\n\n comment\n .command('replies <id>')\n .description('List replies for a comment via the raw replies endpoint')\n .option('--limit <numberOrAll>', 'Number of replies per page or \"all\"')\n .option('--page <number>', 'Page number')\n .option('--filter <nql>', 'NQL filter')\n .action(async (id: string, 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 = CommentRepliesInputSchema.safeParse({\n id,\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 listCommentReplies(\n global,\n parsed.data.id,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n filter: parsed.data.filter,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentListHuman(payload, global.color !== false);\n });\n\n comment\n .command('likes <id>')\n .description('List likes for a comment')\n .option('--limit <numberOrAll>', 'Number of likes per page or \"all\"')\n .option('--page <number>', 'Page number')\n .action(async (id: string, 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 = CommentRelationListInputSchema.safeParse({\n id,\n limit: rawLimit,\n page: rawPage,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listCommentLikes(\n global,\n parsed.data.id,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentLikesHuman(payload, global.color !== false);\n });\n\n comment\n .command('reports <id>')\n .description('List reports for a comment')\n .option('--limit <numberOrAll>', 'Number of reports per page or \"all\"')\n .option('--page <number>', 'Page number')\n .action(async (id: string, 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 = CommentRelationListInputSchema.safeParse({\n id,\n limit: rawLimit,\n page: rawPage,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const allPages = parsed.data.limit === 'all';\n const payload = await listCommentReports(\n global,\n parsed.data.id,\n {\n limit: parsed.data.limit === 'all' ? undefined : parsed.data.limit,\n page: parsed.data.page,\n },\n allPages,\n );\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentReportsHuman(payload, global.color !== false);\n });\n\n comment\n .command('hide <id>')\n .description('Hide a comment')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentStatusInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await setCommentStatus(global, parsed.data.id, 'hidden');\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\n });\n\n comment\n .command('show <id>')\n .description('Show a previously hidden comment')\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentStatusInputSchema.safeParse({ id });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await setCommentStatus(global, parsed.data.id, 'published');\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\n });\n\n comment\n .command('delete <id>')\n .description('Delete a comment')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = CommentDeleteInputSchema.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 confirmDestructiveAction(`Delete comment '${parsed.data.id}'? [y/N]: `, {\n action: 'delete_comment',\n target: parsed.data.id,\n reversible: false,\n site: global.site ?? null,\n });\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n const payload = await setCommentStatus(global, parsed.data.id, 'deleted');\n\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n printCommentHuman(payload);\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 (sensitive output)')\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 (sensitive output)')\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 { 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 { 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 { confirmDestructiveAction } 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 confirmDestructiveAction(`Delete label '${parsed.data.id}'? [y/N]: `, {\n action: 'delete_label',\n target: parsed.data.id,\n reversible: false,\n site: global.site ?? null,\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 { normalizeGhostApiPath } from '../../lib/api-path.js';\nimport { GhostClient } from '../../lib/client.js';\nimport {\n getComment,\n getCommentThread,\n listCommentLikes,\n listCommentReplies,\n listCommentReports,\n listComments,\n setCommentStatus,\n} from '../../lib/comments.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 schedulePost,\n updatePost,\n} from '../../lib/posts.js';\nimport { getSetting, listSettings, setSetting } from '../../lib/settings.js';\nimport { getSiteInfo } from '../../lib/site.js';\nimport {\n blockAccount,\n blockDomain,\n createNote,\n deleteSocialWebPost,\n derepostPost,\n disableSocialWeb,\n enableSocialWeb,\n followAccount,\n getNotificationsCount,\n getSocialWebPost,\n getSocialWebProfile,\n getSocialWebStatus,\n getSocialWebThread,\n likePost,\n listBlockedAccounts,\n listBlockedDomains,\n listFollowers,\n listFollowing,\n listNotes,\n listNotifications,\n listReader,\n listSocialWebLikes,\n listSocialWebPosts,\n replyToPost,\n repostPost,\n searchSocialWeb,\n unblockAccount,\n unblockDomain,\n unfollowAccount,\n unlikePost,\n updateSocialWebProfile,\n uploadSocialWebImage,\n} from '../../lib/socialweb.js';\nimport {\n getStatsGrowth,\n getStatsNewsletterClicks,\n getStatsNewsletterSubscribers,\n getStatsNewsletters,\n getStatsOverview,\n getStatsPost,\n getStatsPostGrowth,\n getStatsPostNewsletter,\n getStatsPostReferrers,\n getStatsPosts,\n getStatsPostWeb,\n getStatsWeb,\n getStatsWebTable,\n} from '../../lib/stats.js';\nimport { createTag, deleteTag, getTag, listTags, updateTag } from '../../lib/tags.js';\nimport { activateTheme, getUploadedThemeName, 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 | 'comments'\n | 'site'\n | 'settings'\n | 'users'\n | 'api'\n | 'search'\n | 'socialweb'\n | 'stats';\n\nexport const MCP_TOOL_GROUPS: readonly McpToolGroup[] = [\n 'posts',\n 'pages',\n 'tags',\n 'members',\n 'comments',\n 'site',\n 'settings',\n 'users',\n 'api',\n 'search',\n 'socialweb',\n 'stats',\n] as const;\n\nconst statsRangeArgs = {\n range: z.enum(['7d', '30d', '90d', '365d', 'all']).optional(),\n from: z.string().optional(),\n to: z.string().optional(),\n timezone: z.string().optional(),\n};\n\nconst statsWebArgs = {\n ...statsRangeArgs,\n audience: z.enum(['all', 'free', 'paid']).optional(),\n source: z.string().optional(),\n location: z.string().optional(),\n device: z.enum(['desktop', 'mobile-ios', 'mobile-android', 'bot', 'unknown']).optional(),\n utm_source: z.string().optional(),\n utm_medium: z.string().optional(),\n utm_campaign: z.string().optional(),\n utm_content: z.string().optional(),\n utm_term: z.string().optional(),\n limit: z.number().int().positive().max(100).optional(),\n};\n\nconst commentBrowseArgs = {\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n filter: z.string().optional(),\n};\n\nconst socialWebHandleSchema = z\n .string()\n .min(1)\n .refine((value) => value === 'me' || /^@?[^@\\s]+@[^@\\s]+$/.test(value), {\n message: 'handle must be me or a federated handle like @user@domain',\n });\n\nconst socialWebRemoteHandleSchema = socialWebHandleSchema.refine((value) => value !== 'me', {\n message: 'handle must be a federated handle like @user@domain',\n});\n\nconst socialWebUrlSchema = z.string().url();\n\nconst socialWebPaginationArgs = {\n limit: z.number().int().positive().max(100).optional(),\n next: z.string().min(1).optional(),\n all_pages: z.boolean().optional(),\n};\n\nconst socialWebPaginationSchema = z\n .object({\n ...socialWebPaginationArgs,\n })\n .superRefine((value, context) => {\n if (value.all_pages && value.next) {\n context.addIssue({\n code: 'custom',\n message: 'all_pages cannot be combined with next.',\n path: ['all_pages'],\n });\n }\n });\n\nconst socialWebHandlePaginationSchema = z\n .object({\n handle: socialWebHandleSchema.optional(),\n ...socialWebPaginationArgs,\n })\n .superRefine((value, context) => {\n if (value.all_pages && value.next) {\n context.addIssue({\n code: 'custom',\n message: 'all_pages cannot be combined with next.',\n path: ['all_pages'],\n });\n }\n });\n\nconst socialWebProfileUpdateSchema = z\n .object({\n name: z.string().min(1).optional(),\n username: z.string().min(1).optional(),\n bio: z.string().optional(),\n avatar_url: socialWebUrlSchema.optional(),\n banner_image_url: socialWebUrlSchema.optional(),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.username !== undefined ||\n value.bio !== undefined ||\n value.avatar_url !== undefined ||\n value.banner_image_url !== undefined,\n {\n message: 'Provide at least one profile field to update.',\n path: ['name'],\n },\n );\n\nconst socialWebContentSchema = z\n .object({\n content: z.string().min(1),\n image_file: z.string().min(1).optional(),\n image_url: socialWebUrlSchema.optional(),\n image_alt: z.string().min(1).optional(),\n })\n .superRefine((value, context) => {\n const imageSources = [value.image_file !== undefined, value.image_url !== undefined].filter(\n Boolean,\n ).length;\n if (imageSources > 1) {\n context.addIssue({\n code: 'custom',\n message: 'Provide at most one image source with image_file or image_url.',\n path: ['image_file'],\n });\n }\n });\n\nconst statsTableViewSchema = z.enum([\n 'content',\n 'sources',\n 'locations',\n 'devices',\n 'utm-sources',\n 'utm-mediums',\n 'utm-campaigns',\n 'utm-contents',\n 'utm-terms',\n]);\n\ntype StatsRangeArgsInput = {\n range?: '7d' | '30d' | '90d' | '365d' | 'all';\n from?: string;\n to?: string;\n timezone?: string;\n};\n\ntype StatsWebArgsInput = StatsRangeArgsInput & {\n audience?: 'all' | 'free' | 'paid';\n source?: string;\n location?: string;\n device?: 'desktop' | 'mobile-ios' | 'mobile-android' | 'bot' | 'unknown';\n utm_source?: string;\n utm_medium?: string;\n utm_campaign?: string;\n utm_content?: string;\n utm_term?: string;\n limit?: number;\n};\n\nfunction mapStatsRangeArgs(args: StatsRangeArgsInput) {\n return {\n range: args.range,\n from: args.from,\n to: args.to,\n timezone: args.timezone,\n };\n}\n\nfunction mapStatsWebArgs(args: StatsWebArgsInput) {\n return {\n ...mapStatsRangeArgs(args),\n audience: args.audience,\n source: args.source,\n location: args.location,\n device: args.device,\n utmSource: args.utm_source,\n utmMedium: args.utm_medium,\n utmCampaign: args.utm_campaign,\n utmContent: args.utm_content,\n utmTerm: args.utm_term,\n limit: args.limit,\n };\n}\n\nfunction mapSocialWebPaginationArgs(args: { limit?: number; next?: string; all_pages?: boolean }) {\n return {\n params: {\n limit: args.limit,\n next: args.next,\n },\n allPages: Boolean(args.all_pages),\n };\n}\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 normalizeGhostApiPath(options.path, options.contentApi ? 'content' : 'admin'),\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_post_schedule',\n {\n description: 'Schedule a Ghost post, with optional email delivery settings.',\n inputSchema: z.object({\n id: z.string(),\n at: z.string().datetime(),\n newsletter: z.string().optional(),\n email_only: z.boolean().optional(),\n email_segment: z.string().optional(),\n }),\n },\n async (args) => {\n const payload = await schedulePost(global, args.id, args.at, {\n newsletter: args.newsletter,\n email_only: args.email_only,\n email_segment: args.email_segment,\n });\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('comments')) {\n server.registerTool(\n 'ghost_comment_list',\n {\n description: 'List Ghost comments from the Admin moderation view.',\n inputSchema: z.object({\n ...commentBrowseArgs,\n order: z.string().optional(),\n top_level_only: z.boolean().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await listComments(\n global,\n {\n limit: args.limit,\n page: args.page,\n filter: args.filter,\n order: args.order,\n includeNested: !args.top_level_only,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_get',\n {\n description: 'Get a Ghost comment with Admin moderation fields.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await getComment(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_comment_thread',\n {\n description: 'Get a Ghost comment thread using the Admin moderation thread view.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await getCommentThread(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_comment_replies',\n {\n description: 'List replies for a Ghost comment using the raw replies endpoint.',\n inputSchema: z.object({\n id: z.string(),\n ...commentBrowseArgs,\n }),\n },\n async (args) =>\n toolResult(\n await listCommentReplies(\n global,\n args.id,\n {\n limit: args.limit,\n page: args.page,\n filter: args.filter,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_likes',\n {\n description: 'List likes for a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await listCommentLikes(\n global,\n args.id,\n {\n limit: args.limit,\n page: args.page,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_reports',\n {\n description: 'List reports for a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n limit: z.number().int().positive().max(100).optional(),\n page: z.number().int().positive().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await listCommentReports(\n global,\n args.id,\n {\n limit: args.limit,\n page: args.page,\n },\n false,\n ),\n ),\n );\n\n server.registerTool(\n 'ghost_comment_hide',\n {\n description: 'Hide a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await setCommentStatus(global, args.id, 'hidden')),\n );\n\n server.registerTool(\n 'ghost_comment_show',\n {\n description: 'Show a previously hidden Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n }),\n },\n async (args) => toolResult(await setCommentStatus(global, args.id, 'published')),\n );\n\n server.registerTool(\n 'ghost_comment_delete',\n {\n description: 'Soft-delete a Ghost comment.',\n inputSchema: z.object({\n id: z.string(),\n confirm: z.literal(true),\n }),\n },\n async (args) => toolResult(await setCommentStatus(global, args.id, 'deleted')),\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 let resultPayload = payload;\n\n if (args.activate) {\n const name = getUploadedThemeName(payload);\n if (!name) {\n throw new Error('Theme uploaded, but activation could not determine the theme name.');\n }\n\n resultPayload = await activateTheme(global, name);\n }\n\n return toolResult(resultPayload);\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 if (enabledGroups.has('socialweb')) {\n server.registerTool(\n 'ghost_socialweb_status',\n {\n description: 'Show Ghost social web settings and connectivity status.',\n },\n async () => toolResult(await getSocialWebStatus(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_enable',\n {\n description: 'Enable Ghost social web and return the resulting status.',\n },\n async () => toolResult(await enableSocialWeb(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_disable',\n {\n description: 'Disable Ghost social web and return the resulting status.',\n },\n async () => toolResult(await disableSocialWeb(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_profile',\n {\n description: 'Get a social web profile by federated handle or me.',\n inputSchema: z.object({\n handle: socialWebHandleSchema.optional(),\n }),\n },\n async (args) => toolResult(await getSocialWebProfile(global, args.handle ?? 'me')),\n );\n\n server.registerTool(\n 'ghost_socialweb_profile_update',\n {\n description: 'Update the current social web profile.',\n inputSchema: socialWebProfileUpdateSchema,\n },\n async (args) =>\n toolResult(\n await updateSocialWebProfile(global, {\n name: args.name,\n username: args.username,\n bio: args.bio,\n avatarUrl: args.avatar_url,\n bannerImageUrl: args.banner_image_url,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_socialweb_search',\n {\n description: 'Search social web accounts.',\n inputSchema: z.object({\n query: z.string().min(1),\n }),\n },\n async (args) => toolResult(await searchSocialWeb(global, args.query)),\n );\n\n server.registerTool(\n 'ghost_socialweb_notes',\n {\n description: 'List the social web note feed.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listNotes(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_reader',\n {\n description: 'List the social web reader feed.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listReader(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_notifications',\n {\n description: 'List social web notifications.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listNotifications(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_notifications_count',\n {\n description: 'Get the unread social web notification count.',\n },\n async () => toolResult(await getNotificationsCount(global)),\n );\n\n server.registerTool(\n 'ghost_socialweb_posts',\n {\n description: 'List posts for a social web account.',\n inputSchema: socialWebHandlePaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listSocialWebPosts(\n global,\n args.handle ?? 'me',\n pagination.params,\n pagination.allPages,\n ),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_likes',\n {\n description: 'List posts liked by the current social web account.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listSocialWebLikes(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_followers',\n {\n description: 'List followers for a social web account.',\n inputSchema: socialWebHandlePaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listFollowers(global, args.handle ?? 'me', pagination.params, pagination.allPages),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_following',\n {\n description: 'List followed accounts for a social web account.',\n inputSchema: socialWebHandlePaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listFollowing(global, args.handle ?? 'me', pagination.params, pagination.allPages),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_post',\n {\n description: 'Get a social web post by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await getSocialWebPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_thread',\n {\n description: 'Get a social web thread by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await getSocialWebThread(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_follow',\n {\n description: 'Follow a federated social web account.',\n inputSchema: z.object({\n handle: socialWebRemoteHandleSchema,\n }),\n },\n async (args) => toolResult(await followAccount(global, args.handle)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unfollow',\n {\n description: 'Unfollow a federated social web account.',\n inputSchema: z.object({\n handle: socialWebRemoteHandleSchema,\n }),\n },\n async (args) => toolResult(await unfollowAccount(global, args.handle)),\n );\n\n server.registerTool(\n 'ghost_socialweb_like',\n {\n description: 'Like a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await likePost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unlike',\n {\n description: 'Unlike a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await unlikePost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_repost',\n {\n description: 'Repost a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await repostPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_derepost',\n {\n description: 'Undo a repost on a social web post.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await derepostPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_delete',\n {\n description: 'Delete a social web post authored by the current account.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await deleteSocialWebPost(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_note',\n {\n description: 'Create a new social web note.',\n inputSchema: socialWebContentSchema,\n },\n async (args) =>\n toolResult(\n await createNote(global, {\n content: args.content,\n imageFile: args.image_file,\n imageUrl: args.image_url,\n imageAlt: args.image_alt,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_socialweb_reply',\n {\n description: 'Reply to a social web post.',\n inputSchema: socialWebContentSchema.extend({\n id: socialWebUrlSchema,\n }),\n },\n async (args) =>\n toolResult(\n await replyToPost(global, args.id, {\n content: args.content,\n imageFile: args.image_file,\n imageUrl: args.image_url,\n imageAlt: args.image_alt,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_socialweb_blocked_accounts',\n {\n description: 'List blocked social web accounts.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(\n await listBlockedAccounts(global, pagination.params, pagination.allPages),\n );\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_blocked_domains',\n {\n description: 'List blocked social web domains.',\n inputSchema: socialWebPaginationSchema,\n },\n async (args) => {\n const pagination = mapSocialWebPaginationArgs(args);\n return toolResult(await listBlockedDomains(global, pagination.params, pagination.allPages));\n },\n );\n\n server.registerTool(\n 'ghost_socialweb_block',\n {\n description: 'Block a social web account by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await blockAccount(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unblock',\n {\n description: 'Unblock a social web account by ActivityPub id.',\n inputSchema: z.object({\n id: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await unblockAccount(global, args.id)),\n );\n\n server.registerTool(\n 'ghost_socialweb_block_domain',\n {\n description: 'Block a social web domain.',\n inputSchema: z.object({\n url: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await blockDomain(global, args.url)),\n );\n\n server.registerTool(\n 'ghost_socialweb_unblock_domain',\n {\n description: 'Unblock a social web domain.',\n inputSchema: z.object({\n url: socialWebUrlSchema,\n }),\n },\n async (args) => toolResult(await unblockDomain(global, args.url)),\n );\n\n server.registerTool(\n 'ghost_socialweb_upload',\n {\n description: 'Upload an image for social web notes and replies.',\n inputSchema: z.object({\n file_path: z.string().min(1),\n }),\n },\n async (args) => toolResult(await uploadSocialWebImage(global, args.file_path)),\n );\n }\n\n if (enabledGroups.has('stats')) {\n server.registerTool(\n 'ghost_stats_overview',\n {\n description: 'Get the Ghost analytics overview report.',\n inputSchema: z.object({\n ...statsRangeArgs,\n }),\n },\n async (args) => toolResult(await getStatsOverview(global, mapStatsRangeArgs(args))),\n );\n\n server.registerTool(\n 'ghost_stats_web',\n {\n description: 'Get the Ghost web analytics report.',\n inputSchema: z.object({\n ...statsWebArgs,\n }),\n },\n async (args) => toolResult(await getStatsWeb(global, mapStatsWebArgs(args))),\n );\n\n server.registerTool(\n 'ghost_stats_web_table',\n {\n description: 'Get a focused Ghost web analytics table view.',\n inputSchema: z.object({\n view: statsTableViewSchema,\n ...statsWebArgs,\n }),\n },\n async (args) =>\n toolResult(\n await getStatsWebTable(global, args.view, {\n ...mapStatsWebArgs(args),\n limit: args.limit ?? 10,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_growth',\n {\n description: 'Get Ghost member and revenue growth analytics.',\n inputSchema: z.object({\n ...statsRangeArgs,\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsGrowth(global, { ...mapStatsRangeArgs(args), limit: args.limit ?? 5 }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_posts',\n {\n description: 'Get top Ghost posts by views.',\n inputSchema: z.object({\n ...statsRangeArgs,\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsPosts(global, { ...mapStatsRangeArgs(args), limit: args.limit ?? 5 }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_email',\n {\n description: 'Get Ghost email analytics grouped by newsletter.',\n inputSchema: z.object({\n ...statsRangeArgs,\n newsletter_id: z.string().optional(),\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsNewsletters(global, {\n ...mapStatsRangeArgs(args),\n newsletterId: args.newsletter_id,\n limit: args.limit ?? 10,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_email_clicks',\n {\n description:\n 'Get Ghost email click analytics for a newsletter, optionally filtered by post ids.',\n inputSchema: z.object({\n ...statsRangeArgs,\n newsletter_id: z.string(),\n post_ids: z.array(z.string()).optional(),\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsNewsletterClicks(global, {\n ...mapStatsRangeArgs(args),\n newsletterId: args.newsletter_id,\n postIds: args.post_ids,\n limit: args.limit ?? 10,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_email_subscribers',\n {\n description: 'Get Ghost newsletter subscriber analytics.',\n inputSchema: z.object({\n ...statsRangeArgs,\n newsletter_id: z.string().optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsNewsletterSubscribers(global, {\n ...mapStatsRangeArgs(args),\n newsletterId: args.newsletter_id,\n }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_post',\n {\n description: 'Get Ghost analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n }),\n },\n async (args) =>\n toolResult(await getStatsPost(global, { ...mapStatsRangeArgs(args), id: args.id })),\n );\n\n server.registerTool(\n 'ghost_stats_post_web',\n {\n description: 'Get Ghost web analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsWebArgs,\n }),\n },\n async (args) =>\n toolResult(await getStatsPostWeb(global, { ...mapStatsWebArgs(args), id: args.id })),\n );\n\n server.registerTool(\n 'ghost_stats_post_growth',\n {\n description: 'Get Ghost growth analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n }),\n },\n async (args) =>\n toolResult(await getStatsPostGrowth(global, { ...mapStatsRangeArgs(args), id: args.id })),\n );\n\n server.registerTool(\n 'ghost_stats_post_newsletter',\n {\n description: 'Get Ghost email performance analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n }),\n },\n async (args) =>\n toolResult(\n await getStatsPostNewsletter(global, { ...mapStatsRangeArgs(args), id: args.id }),\n ),\n );\n\n server.registerTool(\n 'ghost_stats_post_referrers',\n {\n description: 'Get Ghost referrer analytics for a single post.',\n inputSchema: z.object({\n id: z.string(),\n ...statsRangeArgs,\n limit: z.number().int().positive().max(100).optional(),\n }),\n },\n async (args) =>\n toolResult(\n await getStatsPostReferrers(global, {\n ...mapStatsRangeArgs(args),\n id: args.id,\n limit: args.limit ?? 10,\n }),\n ),\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 params?: Record<string, string | number | boolean | undefined>;\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 options.params,\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 options?: {\n newsletter?: string;\n email_only?: boolean;\n email_segment?: string;\n },\n): Promise<Record<string, unknown>> {\n // Ghost requires email-related fields as query parameters on the PUT\n // endpoint for scheduled posts — passing them in the JSON body has no\n // effect. This differs from the publish transition where the body works.\n const params: Record<string, string> = {};\n if (options?.newsletter) {\n params.newsletter = options.newsletter;\n }\n if (options?.email_segment) {\n params.email_segment = options.email_segment;\n }\n if (options?.email_only !== undefined) {\n params.email_only = String(options.email_only);\n }\n\n return updatePost(global, {\n id,\n patch: {\n status: 'scheduled',\n published_at: at,\n },\n params: Object.keys(params).length > 0 ? params : undefined,\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 fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { GhostClient } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError, mapHttpStatusToExitCode } from './errors.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\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n const parts = token.split('.');\n const payload = parts[1];\n if (!payload) {\n return null;\n }\n\n try {\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n return JSON.parse(Buffer.from(padded, 'base64').toString('utf8')) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction createSocialWebError(status: number, message: string, details?: unknown): GhstError {\n return new GhstError(message, {\n code: status === 401 || status === 403 ? 'AUTH_ERROR' : 'SOCIALWEB_API_ERROR',\n exitCode: mapHttpStatusToExitCode(status),\n status,\n details,\n });\n}\n\nfunction isSocialWebAvailabilityReadPath(method: string, endpointPath: string): boolean {\n if (method !== 'GET') {\n return false;\n }\n\n return [\n '/.ghost/activitypub/v1/account/',\n '/.ghost/activitypub/v1/feed/',\n '/.ghost/activitypub/v1/notifications',\n '/.ghost/activitypub/v1/posts/',\n '/.ghost/activitypub/v1/blocks/',\n ].some((prefix) => endpointPath.startsWith(prefix));\n}\n\nexport interface SocialWebIdentityInfo {\n token: string;\n claims: {\n sub: string | null;\n role: string | null;\n exp: number | null;\n };\n}\n\nconst identityCache = new Map<string, Promise<SocialWebIdentityInfo>>();\n\nexport function resetSocialWebIdentityCacheForTests(): void {\n identityCache.clear();\n}\n\nexport class SocialWebClient {\n private connectionPromise?: Promise<Awaited<ReturnType<typeof resolveConnectionConfig>>>;\n private ghostClientPromise?: Promise<GhostClient>;\n private activityPubBaseUrlPromise?: Promise<string>;\n private identityPromise?: Promise<SocialWebIdentityInfo>;\n\n constructor(private readonly global: GlobalOptions) {}\n\n private async getConnection() {\n if (!this.connectionPromise) {\n this.connectionPromise = resolveConnectionConfig(this.global);\n }\n\n return this.connectionPromise;\n }\n\n private async getGhostClient(): Promise<GhostClient> {\n if (!this.ghostClientPromise) {\n this.ghostClientPromise = this.getConnection().then(\n (connection) =>\n new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n }),\n );\n }\n\n return this.ghostClientPromise;\n }\n\n private async getActivityPubBaseUrl(): Promise<string> {\n if (!this.activityPubBaseUrlPromise) {\n this.activityPubBaseUrlPromise = this.getGhostClient().then(async (ghostClient) => {\n const siteInfo = await ghostClient.siteInfo();\n const site = (siteInfo.site as Record<string, unknown> | undefined) ?? {};\n const siteUrl =\n typeof site.url === 'string' && site.url.trim().length > 0 ? site.url : null;\n const fallbackUrl = (await this.getConnection()).url;\n return (siteUrl ?? fallbackUrl).replace(/\\/$/, '');\n });\n }\n\n return this.activityPubBaseUrlPromise;\n }\n\n async getIdentity(): Promise<SocialWebIdentityInfo> {\n if (!this.identityPromise) {\n this.identityPromise = (async () => {\n const connection = await this.getConnection();\n const cacheKey = `${connection.url}\\0${connection.staffToken ?? ''}\\0${connection.apiVersion ?? 'v6.0'}`;\n const cached = identityCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const promise = this.getGhostClient().then(async (ghostClient) => {\n let payload: Record<string, unknown>;\n try {\n payload = await ghostClient.rawRequest<Record<string, unknown>>('/identities/');\n } catch (error) {\n const normalized = error as { status?: number; payload?: unknown; message?: string };\n if (normalized.status === 403) {\n throw new GhstError(\n 'Social web requires an Owner or Administrator staff token to bootstrap identity auth.',\n {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n status: 403,\n details: normalized.payload,\n },\n );\n }\n\n throw error;\n }\n\n const identities = Array.isArray(payload.identities)\n ? (payload.identities as Array<Record<string, unknown>>)\n : [];\n const token =\n identities[0] && typeof identities[0].token === 'string' ? identities[0].token : '';\n if (!token) {\n throw new GhstError('Ghost did not return a usable identity token for social web.', {\n code: 'AUTH_ERROR',\n exitCode: ExitCode.AUTH_ERROR,\n details: payload,\n });\n }\n\n const decoded = decodeJwtPayload(token);\n return {\n token,\n claims: {\n sub: typeof decoded?.sub === 'string' ? decoded.sub : null,\n role: typeof decoded?.role === 'string' ? decoded.role : null,\n exp: typeof decoded?.exp === 'number' ? decoded.exp : null,\n },\n };\n });\n\n identityCache.set(cacheKey, promise);\n\n try {\n return await promise;\n } catch (error) {\n identityCache.delete(cacheKey);\n throw error;\n }\n })();\n }\n\n return this.identityPromise;\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 responseType?: 'json' | 'text';\n headers?: Record<string, string>;\n } = {},\n ): Promise<T> {\n const baseUrl = await this.getActivityPubBaseUrl();\n const identity = await this.getIdentity();\n const url = new URL(endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`, baseUrl);\n\n for (const [key, value] of Object.entries(options.params ?? {})) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const headers: Record<string, string> = {\n Accept: 'application/activity+json',\n Authorization: `Bearer ${identity.token}`,\n ...options.headers,\n };\n\n let body: string | FormData | undefined;\n if (options.body !== undefined) {\n if (typeof FormData !== 'undefined' && options.body instanceof FormData) {\n body = options.body;\n } else {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(options.body);\n }\n }\n\n const response = await fetch(url.toString(), {\n method,\n headers,\n body,\n });\n\n if (!response.ok) {\n let details: unknown;\n let message = `Social web request failed (${response.status})`;\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n\n try {\n if (contentType.includes('application/json')) {\n details = (await response.json()) as unknown;\n const detailObject = details as { code?: string; message?: string; error?: string };\n if (typeof detailObject?.message === 'string' && detailObject.message.trim()) {\n message = detailObject.message;\n } else if (typeof detailObject?.error === 'string' && detailObject.error.trim()) {\n message = detailObject.error;\n }\n\n if (detailObject?.code === 'SITE_MISSING') {\n message = 'Social web is not enabled on this site.';\n }\n } else {\n const text = await response.text();\n details = text;\n if (text.trim()) {\n message = text.trim();\n }\n }\n } catch {\n details = undefined;\n }\n\n if (response.status === 404 && isSocialWebAvailabilityReadPath(method, endpointPath)) {\n throw new GhstError(\n 'Social web is not reachable for this site. It may be disabled or the ActivityPub service may not be initialized yet.',\n {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n status: 404,\n details,\n },\n );\n }\n\n throw createSocialWebError(response.status, message, details);\n }\n\n if (response.status === 204 || response.status === 202) {\n return {} as T;\n }\n\n if (options.responseType === 'text') {\n return (await response.text()) as T;\n }\n\n const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';\n if (\n contentType.includes('application/json') ||\n contentType.includes('application/activity+json')\n ) {\n return (await response.json()) as T;\n }\n\n const text = await response.text();\n return (text.trim().length > 0 ? text : {}) as T;\n }\n\n get<T>(\n endpointPath: string,\n params?: Record<string, string | number | boolean | undefined>,\n ): Promise<T> {\n return this.request<T>('GET', endpointPath, { params });\n }\n\n post<T>(endpointPath: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', endpointPath, { body });\n }\n\n put<T>(endpointPath: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', endpointPath, { body });\n }\n\n delete<T>(endpointPath: string): Promise<T> {\n return this.request<T>('DELETE', endpointPath);\n }\n\n async uploadImage(filePath: string): Promise<Record<string, unknown>> {\n const bytes = await fs.readFile(filePath);\n const formData = new FormData();\n formData.append(\n 'file',\n new Blob([bytes], { type: inferImageMimeType(filePath) }),\n path.basename(filePath),\n );\n\n return this.request<Record<string, unknown>>('POST', '/.ghost/activitypub/v1/upload/image', {\n body: formData,\n });\n }\n}\n","import { ExitCode, GhstError } from './errors.js';\nimport { listSettings, setSetting } from './settings.js';\nimport { SocialWebClient, type SocialWebIdentityInfo } from './socialweb-client.js';\nimport type { GlobalOptions } from './types.js';\n\nexport interface SocialWebAccount {\n id: string;\n apId?: string;\n name: string;\n handle: string;\n bio?: string;\n url?: string;\n avatarUrl?: string | null;\n bannerImageUrl?: string | null;\n postCount?: number;\n likedCount?: number;\n followingCount?: number;\n followerCount?: number;\n followedByMe?: boolean;\n blockedByMe?: boolean;\n domainBlockedByMe?: boolean;\n blueskyEnabled?: boolean;\n blueskyHandleConfirmed?: boolean;\n blueskyHandle?: string | null;\n [key: string]: unknown;\n}\n\nexport interface SocialWebPost {\n id: string;\n type?: number | string;\n title?: string | null;\n excerpt?: string;\n summary?: string | null;\n content?: string;\n url?: string;\n featureImageUrl?: string | null;\n publishedAt?: string;\n likeCount?: number;\n likedByMe?: boolean;\n replyCount?: number;\n readingTimeMinutes?: number;\n attachments?: Array<Record<string, unknown>>;\n author?: Record<string, unknown>;\n authoredByMe?: boolean;\n repostCount?: number;\n repostedByMe?: boolean;\n repostedBy?: Record<string, unknown> | null;\n [key: string]: unknown;\n}\n\nexport interface SocialWebNotification {\n id: string;\n type: string;\n actor: {\n id: string;\n name: string;\n handle: string;\n avatarUrl?: string | null;\n [key: string]: unknown;\n };\n post?: Record<string, unknown> | null;\n inReplyTo?: Record<string, unknown> | null;\n createdAt: string;\n [key: string]: unknown;\n}\n\nexport interface SocialWebStatusReport {\n settings: {\n social_web: boolean;\n explore_ping: boolean | null;\n explore_ping_growth: boolean | null;\n };\n identity: {\n available: boolean;\n sub: string | null;\n role: string | null;\n exp: number | null;\n };\n account: SocialWebAccount | null;\n reachable: boolean;\n}\n\ntype PaginatedKey = 'posts' | 'accounts' | 'notifications' | 'blocked_accounts' | 'blocked_domains';\ntype PaginatedParams = { limit?: number; next?: string };\nconst MAX_PAGINATION_PAGES = 100;\n\nfunction parseSettingBool(value: unknown): boolean | null {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string') {\n if (value === 'true') return true;\n if (value === 'false') return false;\n }\n\n return null;\n}\n\nfunction getSettingMap(payload: Record<string, unknown>): Map<string, unknown> {\n const settings = Array.isArray(payload.settings)\n ? (payload.settings as Array<Record<string, unknown>>)\n : [];\n return new Map(settings.map((setting) => [String(setting.key ?? ''), setting.value]));\n}\n\nfunction mergePaginatedPages(\n existing: Record<string, unknown> | null,\n next: Record<string, unknown>,\n key: PaginatedKey,\n): Record<string, unknown> {\n if (!existing) {\n return next;\n }\n\n const currentItems = Array.isArray(existing[key]) ? (existing[key] as unknown[]) : [];\n const nextItems = Array.isArray(next[key]) ? (next[key] as unknown[]) : [];\n\n return {\n ...next,\n [key]: [...currentItems, ...nextItems],\n next: next.next ?? null,\n };\n}\n\nasync function collectPaginated(\n fetchPage: (next?: string) => Promise<Record<string, unknown>>,\n key: PaginatedKey,\n allPages: boolean,\n next?: string,\n): Promise<Record<string, unknown>> {\n if (!allPages) {\n return fetchPage(next);\n }\n\n let cursor = next;\n let merged: Record<string, unknown> | null = null;\n let pageCount = 0;\n\n while (true) {\n if (++pageCount > MAX_PAGINATION_PAGES) {\n throw new GhstError('Pagination exceeded the maximum number of pages.', {\n code: 'PAGINATION_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n\n const page = await fetchPage(cursor);\n merged = mergePaginatedPages(merged, page, key);\n const nextCursor = typeof page.next === 'string' && page.next.length > 0 ? page.next : null;\n if (!nextCursor) {\n break;\n }\n cursor = nextCursor;\n }\n\n return merged ?? { [key]: [], next: null };\n}\n\nfunction encodeHandle(handle: string): string {\n return handle === 'me' ? 'me' : encodeURIComponent(handle);\n}\n\nfunction encodeActivityPubId(id: string): string {\n return encodeURIComponent(id);\n}\n\nasync function getClient(global: GlobalOptions): Promise<SocialWebClient> {\n return new SocialWebClient(global);\n}\n\nasync function getStatusBase(global: GlobalOptions): Promise<{\n client: SocialWebClient;\n settings: SocialWebStatusReport['settings'];\n}> {\n const settingsPayload = await listSettings(global);\n const settingMap = getSettingMap(settingsPayload);\n\n return {\n client: await getClient(global),\n settings: {\n social_web: parseSettingBool(settingMap.get('social_web')) ?? false,\n explore_ping: parseSettingBool(settingMap.get('explore_ping')),\n explore_ping_growth: parseSettingBool(settingMap.get('explore_ping_growth')),\n },\n };\n}\n\nfunction identityStatus(identity: SocialWebIdentityInfo | null): SocialWebStatusReport['identity'] {\n return {\n available: Boolean(identity),\n sub: identity?.claims.sub ?? null,\n role: identity?.claims.role ?? null,\n exp: identity?.claims.exp ?? null,\n };\n}\n\nexport async function getSocialWebStatus(global: GlobalOptions): Promise<SocialWebStatusReport> {\n const { client, settings } = await getStatusBase(global);\n if (!settings.social_web) {\n return {\n settings,\n identity: identityStatus(null),\n account: null,\n reachable: false,\n };\n }\n\n try {\n const identity = await client.getIdentity();\n const account = await client.get<SocialWebAccount>('/.ghost/activitypub/v1/account/me');\n\n return {\n settings,\n identity: identityStatus(identity),\n account,\n reachable: true,\n };\n } catch {\n let identity: SocialWebIdentityInfo | null = null;\n try {\n identity = await client.getIdentity();\n } catch {\n identity = null;\n }\n\n return {\n settings,\n identity: identityStatus(identity),\n account: null,\n reachable: false,\n };\n }\n}\n\nexport async function enableSocialWeb(global: GlobalOptions): Promise<SocialWebStatusReport> {\n await setSetting(global, 'social_web', true);\n return getSocialWebStatus(global);\n}\n\nexport async function disableSocialWeb(global: GlobalOptions): Promise<SocialWebStatusReport> {\n await setSetting(global, 'social_web', false);\n const report = await getSocialWebStatus(global);\n return {\n ...report,\n settings: {\n ...report.settings,\n social_web: false,\n },\n };\n}\n\nexport async function getSocialWebProfile(\n global: GlobalOptions,\n handle: string,\n): Promise<SocialWebAccount> {\n const client = await getClient(global);\n return client.get<SocialWebAccount>(`/.ghost/activitypub/v1/account/${encodeHandle(handle)}`);\n}\n\nexport async function updateSocialWebProfile(\n global: GlobalOptions,\n patch: {\n name?: string;\n username?: string;\n bio?: string;\n avatarUrl?: string;\n bannerImageUrl?: string;\n },\n): Promise<SocialWebAccount> {\n const client = await getClient(global);\n const current = await client.get<SocialWebAccount>('/.ghost/activitypub/v1/account/me');\n const currentUsername =\n String(current.handle ?? '')\n .replace(/^@/, '')\n .split('@')[0] ?? '';\n\n await client.put<Record<string, unknown>>('/.ghost/activitypub/v1/account', {\n name: patch.name ?? current.name ?? '',\n username: patch.username ?? currentUsername,\n bio: patch.bio ?? current.bio ?? '',\n avatarUrl: patch.avatarUrl ?? current.avatarUrl ?? '',\n bannerImageUrl: patch.bannerImageUrl ?? current.bannerImageUrl ?? '',\n });\n\n return client.get<SocialWebAccount>('/.ghost/activitypub/v1/account/me');\n}\n\nexport async function searchSocialWeb(\n global: GlobalOptions,\n query: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.get<Record<string, unknown>>('/.ghost/activitypub/v1/actions/search', { query });\n}\n\nexport async function listNotes(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/feed/notes', { limit: params.limit, next }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nexport async function listReader(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/feed/reader', { limit: params.limit, next }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nexport async function listNotifications(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/notifications', { limit: params.limit, next }),\n 'notifications',\n allPages,\n params.next,\n );\n}\n\nexport async function getNotificationsCount(\n global: GlobalOptions,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.get<Record<string, unknown>>('/.ghost/activitypub/v1/notifications/unread/count');\n}\n\nexport async function resetNotificationsCount(\n global: GlobalOptions,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n await client.put<Record<string, unknown>>('/.ghost/activitypub/v1/notifications/unread/reset');\n return { count: 0, reset: true };\n}\n\nexport async function listSocialWebPosts(\n global: GlobalOptions,\n handle: string,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) =>\n client.get(`/.ghost/activitypub/v1/posts/${encodeHandle(handle)}`, {\n limit: params.limit,\n next,\n }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nexport async function listSocialWebLikes(\n global: GlobalOptions,\n params: { limit?: number; next?: string },\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/posts/me/liked', { limit: params.limit, next }),\n 'posts',\n allPages,\n params.next,\n );\n}\n\nasync function listSocialWebFollows(\n global: GlobalOptions,\n handle: string,\n type: 'followers' | 'following',\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) =>\n client.get(`/.ghost/activitypub/v1/account/${encodeHandle(handle)}/follows/${type}`, {\n limit: params.limit,\n next,\n }),\n 'accounts',\n allPages,\n params.next,\n );\n}\n\nexport async function listFollowers(\n global: GlobalOptions,\n handle: string,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n return listSocialWebFollows(global, handle, 'followers', params, allPages);\n}\n\nexport async function listFollowing(\n global: GlobalOptions,\n handle: string,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n return listSocialWebFollows(global, handle, 'following', params, allPages);\n}\n\nexport async function getSocialWebPost(global: GlobalOptions, id: string): Promise<SocialWebPost> {\n const client = await getClient(global);\n return client.get<SocialWebPost>(`/.ghost/activitypub/v1/post/${encodeActivityPubId(id)}`);\n}\n\nexport async function getSocialWebThread(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n try {\n return await client.get<Record<string, unknown>>(\n `/.ghost/activitypub/v1/replies/${encodeActivityPubId(id)}`,\n );\n } catch (error) {\n const status = (error as { status?: number }).status;\n if (status !== 404) {\n throw error;\n }\n\n await client.get<Record<string, unknown>>(\n `/.ghost/activitypub/v1/post/${encodeActivityPubId(id)}`,\n );\n return client.get<Record<string, unknown>>(\n `/.ghost/activitypub/v1/replies/${encodeActivityPubId(id)}`,\n );\n }\n}\n\nexport async function followAccount(\n global: GlobalOptions,\n handle: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/follow/${encodeHandle(handle)}`,\n );\n}\n\nexport async function unfollowAccount(\n global: GlobalOptions,\n handle: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unfollow/${encodeHandle(handle)}`,\n );\n}\n\nexport async function likePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/like/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function unlikePost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unlike/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function repostPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/repost/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function derepostPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/derepost/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function deleteSocialWebPost(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.delete<Record<string, unknown>>(\n `/.ghost/activitypub/v1/post/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function uploadSocialWebImage(\n global: GlobalOptions,\n filePath: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.uploadImage(filePath);\n}\n\nasync function resolveImagePayload(\n global: GlobalOptions,\n options: { imageFile?: string; imageUrl?: string; imageAlt?: string },\n): Promise<{ url: string; altText?: string } | undefined> {\n if (options.imageFile) {\n const uploaded = await uploadSocialWebImage(global, options.imageFile);\n const fileUrl = typeof uploaded.fileUrl === 'string' ? uploaded.fileUrl : '';\n return fileUrl ? { url: fileUrl, altText: options.imageAlt } : undefined;\n }\n\n if (options.imageUrl) {\n return { url: options.imageUrl, altText: options.imageAlt };\n }\n\n return undefined;\n}\n\nexport async function createNote(\n global: GlobalOptions,\n options: {\n content: string;\n imageFile?: string;\n imageUrl?: string;\n imageAlt?: string;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const image = await resolveImagePayload(global, options);\n return client.post<Record<string, unknown>>('/.ghost/activitypub/v1/actions/note', {\n content: options.content,\n ...(image ? { image } : {}),\n });\n}\n\nexport async function replyToPost(\n global: GlobalOptions,\n id: string,\n options: {\n content: string;\n imageFile?: string;\n imageUrl?: string;\n imageAlt?: string;\n },\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n const image = await resolveImagePayload(global, options);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/reply/${encodeActivityPubId(id)}`,\n {\n content: options.content,\n ...(image ? { image } : {}),\n },\n );\n}\n\nexport async function listBlockedAccounts(\n global: GlobalOptions,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/blocks/accounts', { limit: params.limit, next }),\n 'blocked_accounts',\n allPages,\n params.next,\n );\n}\n\nexport async function listBlockedDomains(\n global: GlobalOptions,\n params: PaginatedParams,\n allPages: boolean,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return collectPaginated(\n (next) => client.get('/.ghost/activitypub/v1/blocks/domains', { limit: params.limit, next }),\n 'blocked_domains',\n allPages,\n params.next,\n );\n}\n\nexport async function blockAccount(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/block/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function unblockAccount(\n global: GlobalOptions,\n id: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unblock/${encodeActivityPubId(id)}`,\n );\n}\n\nexport async function blockDomain(\n global: GlobalOptions,\n url: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/block/domain/${encodeActivityPubId(url)}`,\n );\n}\n\nexport async function unblockDomain(\n global: GlobalOptions,\n url: string,\n): Promise<Record<string, unknown>> {\n const client = await getClient(global);\n return client.post<Record<string, unknown>>(\n `/.ghost/activitypub/v1/actions/unblock/domain/${encodeActivityPubId(url)}`,\n );\n}\n","import type {\n StatsGrowthInput,\n StatsNewsletterClicksInput,\n StatsNewsletterSubscribersInput,\n StatsNewslettersInput,\n StatsOverviewInput,\n StatsPostGrowthInput,\n StatsPostInput,\n StatsPostNewsletterInput,\n StatsPostReferrersInput,\n StatsPostsInput,\n StatsPostWebInput,\n StatsWebInput,\n StatsWebTableInput,\n} from '../schemas/stats.js';\nimport { GhostClient, type GhostPaginatedResponse } from './client.js';\nimport { resolveConnectionConfig } from './config.js';\nimport { ExitCode, GhstError, mapHttpStatusToExitCode } from './errors.js';\nimport { collectAllPages } from './pagination.js';\nimport type { GlobalOptions } from './types.js';\n\ntype TinybirdPrimitive = string | number | boolean | undefined;\ntype TinybirdParams = Record<string, TinybirdPrimitive>;\ntype TinybirdRow = Record<string, unknown>;\ntype SettingsRecord = Record<string, unknown>;\nconst ALL_RANGE_DATE_FROM = '1970-01-01';\n\ninterface StatsBootstrap {\n config: Record<string, unknown>;\n settings: SettingsRecord[];\n site: Record<string, unknown>;\n}\n\ninterface StatsConfigRecord extends Record<string, unknown> {\n id?: string;\n endpoint?: string;\n endpointBrowser?: string;\n version?: string;\n local?: {\n enabled?: boolean;\n endpoint?: string;\n };\n}\n\nexport interface StatsRange {\n preset: '7d' | '30d' | '90d' | '365d' | 'all';\n from: string | null;\n to: string;\n timezone: string;\n}\n\nexport interface StatsFilters {\n audience: 'all' | 'free' | 'paid';\n source: string | null;\n location: string | null;\n device: 'desktop' | 'mobile-ios' | 'mobile-android' | 'bot' | 'unknown' | null;\n utm_source: string | null;\n utm_medium: string | null;\n utm_campaign: string | null;\n utm_content: string | null;\n utm_term: string | null;\n}\n\nexport interface StatsKpis {\n visits: number;\n pageviews: number;\n bounce_rate: number;\n avg_session_sec: number;\n active_visitors: number;\n}\n\nexport interface StatsContentRow {\n id: string | null;\n uuid: string | null;\n title: string;\n pathname: string;\n url: string | null;\n type: string | null;\n visits: number;\n pageviews: number;\n}\n\nexport interface StatsBreakdownRow {\n key: string;\n label: string;\n visits: number;\n pageviews: number | null;\n signups: number | null;\n paid_conversions: number | null;\n mrr: number | null;\n}\n\nexport interface StatsSeriesPoint {\n date: string;\n free_members: number | null;\n paid_members: number | null;\n total_members: number | null;\n mrr: number | null;\n subscriptions: number | null;\n}\n\nexport interface StatsTrafficPoint {\n date: string;\n visits: number;\n pageviews: number;\n bounce_rate: number;\n avg_session_sec: number;\n}\n\nexport interface StatsSubscriptionTotal {\n tier: string;\n label: string;\n count: number;\n}\n\nexport interface StatsWebReport {\n range: StatsRange;\n filters: StatsFilters;\n kpis: StatsKpis;\n timeseries: StatsTrafficPoint[];\n content: StatsContentRow[];\n sources: StatsBreakdownRow[];\n locations: StatsBreakdownRow[];\n}\n\nexport interface StatsWebTableReport {\n range: StatsRange;\n filters: StatsFilters;\n metric: string;\n items: StatsBreakdownRow[] | StatsContentRow[];\n}\n\nexport interface StatsGrowthReport {\n range: StatsRange;\n summary: {\n free_members: number;\n paid_members: number;\n total_members: number;\n member_delta: number;\n paid_delta: number;\n mrr: number;\n mrr_delta: number;\n total_subscriptions: number;\n subscription_delta: number;\n currency: string | null;\n };\n members: StatsSeriesPoint[];\n mrr: StatsSeriesPoint[];\n subscriptions: {\n history: StatsSeriesPoint[];\n totals: StatsSubscriptionTotal[];\n };\n sources: StatsBreakdownRow[];\n}\n\nexport interface StatsNewsletterSummaryRow {\n newsletter_id: string;\n newsletter_name: string;\n newsletter_slug: string | null;\n sent_posts: number;\n recipients: number;\n opened: number;\n clicked: number;\n open_rate: number;\n click_rate: number;\n subscribers: number;\n subscriber_delta: number;\n}\n\nexport interface StatsNewslettersReport {\n range: StatsRange;\n newsletters: StatsNewsletterSummaryRow[];\n}\n\nexport interface StatsNewsletterClicksRow {\n post_id: string | null;\n post_title: string;\n send_date: string | null;\n recipients: number;\n clicks: number;\n click_rate: number;\n}\n\nexport interface StatsNewsletterClicksReport {\n range: StatsRange;\n newsletter: {\n id: string;\n name: string;\n slug: string | null;\n };\n posts: string[];\n clicks: StatsNewsletterClicksRow[];\n}\n\nexport interface StatsNewsletterSubscribersRow {\n newsletter_id: string;\n newsletter_name: string;\n newsletter_slug: string | null;\n subscribers: number;\n subscriber_delta: number;\n history: Array<{ date: string; total: number; delta: number }>;\n}\n\nexport interface StatsNewsletterSubscribersReport {\n range: StatsRange;\n newsletters: StatsNewsletterSubscribersRow[];\n}\n\nexport interface StatsPostMeta {\n id: string;\n uuid: string | null;\n title: string;\n slug: string | null;\n url: string | null;\n published_at?: string | null;\n}\n\nexport interface StatsPostSummary {\n visitors: number;\n pageviews: number;\n free_members: number;\n paid_members: number;\n mrr: number;\n email_recipients: number;\n email_open_rate: number;\n email_click_rate: number;\n}\n\nexport interface StatsPostReferrerRow {\n source: string;\n visits: number;\n signups: number;\n paid_conversions: number;\n mrr: number;\n}\n\nexport interface StatsPostGrowthPoint {\n date: string;\n free_members: number;\n paid_members: number;\n mrr: number;\n}\n\nexport interface StatsPostNewsletterReport {\n range: StatsRange;\n post: StatsPostMeta;\n newsletter: {\n recipients: number;\n open_rate: number;\n click_rate: number;\n };\n}\n\nexport interface StatsPostGrowthReport {\n range: StatsRange;\n post: StatsPostMeta;\n growth: StatsPostGrowthPoint[];\n}\n\nexport interface StatsPostReferrersReport {\n range: StatsRange;\n post: StatsPostMeta;\n referrers: StatsPostReferrerRow[];\n}\n\nexport interface StatsPostWebReport {\n range: StatsRange;\n filters: StatsFilters;\n post: StatsPostMeta;\n kpis: StatsKpis;\n timeseries: StatsTrafficPoint[];\n sources: StatsBreakdownRow[];\n locations: StatsBreakdownRow[];\n}\n\nexport interface StatsPostViewsRow {\n post_id: string;\n title: string;\n published_at: string | null;\n feature_image: string | null;\n status: string | null;\n authors: string;\n views: number;\n sent_count: number | null;\n opened_count: number | null;\n open_rate: number | null;\n clicked_count: number;\n click_rate: number | null;\n members: number;\n free_members: number;\n paid_members: number;\n}\n\nexport interface StatsPostsReport {\n range: StatsRange;\n posts: StatsPostViewsRow[];\n}\n\ninterface StatsPostSummaryFallback {\n free_members: number;\n paid_members: number;\n email_recipients: number;\n email_open_rate: number;\n email_click_rate: number;\n}\n\nexport interface StatsPostReport {\n range: StatsRange;\n post: StatsPostMeta;\n summary: StatsPostSummary;\n web: StatsPostWebReport | null;\n growth: StatsPostGrowthPoint[];\n referrers: StatsPostReferrerRow[];\n}\n\nexport interface StatsOverviewReport {\n range: StatsRange;\n summary: {\n visitors: number;\n pageviews: number;\n bounce_rate: number;\n avg_session_sec: number;\n active_visitors: number;\n total_members: number;\n member_delta: number;\n paid_members: number;\n paid_delta: number;\n mrr: number;\n mrr_delta: number;\n };\n web: StatsWebReport;\n growth: StatsGrowthReport;\n newsletters: StatsNewslettersReport;\n}\n\nfunction getArray(payload: unknown, key = 'stats'): Record<string, unknown>[] {\n if (!payload || typeof payload !== 'object') {\n return [];\n }\n\n const value = (payload as Record<string, unknown>)[key];\n return Array.isArray(value) ? (value as Record<string, unknown>[]) : [];\n}\n\nfunction getObject(payload: unknown, key: string): Record<string, unknown> {\n if (!payload || typeof payload !== 'object') {\n return {};\n }\n\n const value = (payload as Record<string, unknown>)[key];\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction getString(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n return String(value);\n}\n\nfunction getNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n\n return 0;\n}\n\nfunction getNullableNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n const parsed = getNumber(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction formatDateInTimeZone(date: Date, timeZone: string): string {\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n const parts = formatter.formatToParts(date);\n const year = parts.find((part) => part.type === 'year')?.value ?? '1970';\n const month = parts.find((part) => part.type === 'month')?.value ?? '01';\n const day = parts.find((part) => part.type === 'day')?.value ?? '01';\n return `${year}-${month}-${day}`;\n}\n\nfunction subtractDays(dateString: string, days: number): string {\n const [year, month, day] = dateString.split('-').map((value) => Number(value));\n const safeYear = typeof year === 'number' && Number.isFinite(year) ? year : 1970;\n const safeMonth = typeof month === 'number' && Number.isFinite(month) ? month : 1;\n const safeDay = typeof day === 'number' && Number.isFinite(day) ? day : 1;\n const date = new Date(Date.UTC(safeYear, safeMonth - 1, safeDay));\n date.setUTCDate(date.getUTCDate() - days);\n return date.toISOString().slice(0, 10);\n}\n\nfunction lastValue<T>(items: T[]): T | null {\n return items.length > 0 ? (items[items.length - 1] ?? null) : null;\n}\n\nfunction deltaOf(items: Array<number | null>): number {\n if (items.length === 0) {\n return 0;\n }\n\n const first = items.find((value) => value !== null) ?? 0;\n const last = [...items].reverse().find((value) => value !== null) ?? 0;\n return Number(last) - Number(first);\n}\n\nfunction normalizePercentValue(value: unknown): number {\n const numeric = getNumber(value);\n const normalized = numeric <= 1 ? numeric * 100 : numeric;\n return Number(normalized.toFixed(2));\n}\n\nfunction isDateWithinRange(date: string | null | undefined, range: StatsRange): boolean {\n if (!date) {\n return false;\n }\n\n const dateOnly = date.slice(0, 10);\n if (range.from && dateOnly < range.from) {\n return false;\n }\n\n return dateOnly <= range.to;\n}\n\nfunction clipDatedRows<T extends { date: string }>(rows: T[], range: StatsRange): T[] {\n return rows.filter((row) => isDateWithinRange(row.date, range));\n}\n\nfunction hasExplicitWindowOverride(\n input: Pick<StatsOverviewInput, 'range' | 'from' | 'to'>,\n): boolean {\n return Boolean(input.range || input.from || input.to);\n}\n\nfunction getRangePresetDays(preset: StatsRange['preset']): number | null {\n switch (preset) {\n case '7d':\n return 7;\n case '30d':\n return 30;\n case '90d':\n return 90;\n case '365d':\n return 365;\n case 'all':\n return null;\n }\n}\n\nfunction settingValue(settings: SettingsRecord[], key: string): unknown {\n const match = settings.find((entry) => entry.key === key);\n return match?.value;\n}\n\nfunction resolveFilters(\n input: Pick<\n StatsWebInput,\n | 'audience'\n | 'source'\n | 'location'\n | 'device'\n | 'utmSource'\n | 'utmMedium'\n | 'utmCampaign'\n | 'utmContent'\n | 'utmTerm'\n >,\n): StatsFilters {\n return {\n audience: input.audience ?? 'all',\n source: input.source ?? null,\n location: input.location ?? null,\n device: input.device ?? null,\n utm_source: input.utmSource ?? null,\n utm_medium: input.utmMedium ?? null,\n utm_campaign: input.utmCampaign ?? null,\n utm_content: input.utmContent ?? null,\n utm_term: input.utmTerm ?? null,\n };\n}\n\nfunction makeAnalyticsUnavailableError(): GhstError {\n return new GhstError('Ghost web analytics is unavailable for this site.', {\n code: 'ANALYTICS_UNAVAILABLE',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n}\n\nfunction normalizeKpis(\n kpiRows: Record<string, unknown>[],\n activeRow: Record<string, unknown> | undefined,\n): StatsKpis {\n const totals = kpiRows.reduce<{\n visits: number;\n pageviews: number;\n bounceNumerator: number;\n durationNumerator: number;\n }>(\n (acc, row) => {\n const visits = getNumber(row.visits);\n const pageviews = getNumber(row.pageviews);\n const bounceRate = normalizePercentValue(row.bounce_rate);\n const avgSessionSec = getNumber(row.avg_session_sec);\n\n return {\n visits: acc.visits + visits,\n pageviews: acc.pageviews + pageviews,\n bounceNumerator: acc.bounceNumerator + visits * bounceRate,\n durationNumerator: acc.durationNumerator + visits * avgSessionSec,\n };\n },\n {\n visits: 0,\n pageviews: 0,\n bounceNumerator: 0,\n durationNumerator: 0,\n },\n );\n\n return {\n visits: totals.visits,\n pageviews: totals.pageviews,\n bounce_rate: totals.visits > 0 ? totals.bounceNumerator / totals.visits : 0,\n avg_session_sec: totals.visits > 0 ? totals.durationNumerator / totals.visits : 0,\n active_visitors: getNumber(\n activeRow?.active_visitors ?? activeRow?.visitors ?? activeRow?.count ?? 0,\n ),\n };\n}\n\nfunction normalizeTrafficSeries(rows: Record<string, unknown>[]): StatsTrafficPoint[] {\n return rows\n .map((row) => ({\n date: getString(row.date) ?? '',\n visits: getNumber(row.visits),\n pageviews: getNumber(row.pageviews),\n bounce_rate: normalizePercentValue(row.bounce_rate),\n avg_session_sec: getNumber(row.avg_session_sec),\n }))\n .filter((row) => row.date.length > 0);\n}\n\nfunction normalizeContentRow(row: Record<string, unknown>): StatsContentRow {\n return {\n id: getString(row.id ?? row.post_id),\n uuid: getString(row.uuid ?? row.post_uuid),\n title: getString(row.title ?? row.post_title ?? row.pathname) ?? '(untitled)',\n pathname: getString(row.pathname) ?? '/',\n url: getString(row.url),\n type: getString(row.type ?? row.post_type),\n visits: getNumber(row.visits),\n pageviews: getNumber(row.pageviews ?? row.views),\n };\n}\n\nfunction normalizeBreakdownRow(\n row: Record<string, unknown>,\n keys: string[],\n fallbackLabel: string,\n): StatsBreakdownRow {\n const key =\n keys\n .map((entry) => getString(row[entry]))\n .find((entry) => Boolean(entry && entry.length > 0)) ?? fallbackLabel;\n\n return {\n key,\n label: key,\n visits: getNumber(row.visits ?? row.count),\n pageviews: getNullableNumber(row.pageviews),\n signups: getNullableNumber(row.signups ?? row.free_members),\n paid_conversions: getNullableNumber(row.paid_conversions ?? row.paid_members),\n mrr: getNullableNumber(row.mrr),\n };\n}\n\nfunction normalizeMembersSeries(rows: Record<string, unknown>[]): StatsSeriesPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: getNullableNumber(row.free_members ?? row.free),\n paid_members: getNullableNumber(row.paid_members ?? row.paid),\n total_members: getNullableNumber(\n row.total_members ??\n row.members ??\n row.all_members ??\n row.total ??\n row.count ??\n getNumber(row.free_members ?? row.free) +\n getNumber(row.paid_members ?? row.paid) +\n getNumber(row.comped),\n ),\n mrr: null,\n subscriptions: null,\n }));\n}\n\nfunction normalizeMrrSeries(rows: Record<string, unknown>[]): StatsSeriesPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: null,\n paid_members: null,\n total_members: null,\n mrr: getNullableNumber(row.mrr),\n subscriptions: null,\n }));\n}\n\nfunction normalizeSubscriptionsHistory(rows: Record<string, unknown>[]): StatsSeriesPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: null,\n paid_members: null,\n total_members: null,\n mrr: null,\n subscriptions: getNullableNumber(row.count ?? row.subscriptions),\n }));\n}\n\nfunction normalizeTopSources(rows: Record<string, unknown>[]): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, ['source'], 'Direct'));\n}\n\nfunction normalizeLocations(rows: Record<string, unknown>[]): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, ['location', 'country'], 'Unknown'));\n}\n\nfunction normalizeDevices(rows: Record<string, unknown>[]): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, ['device'], 'unknown'));\n}\n\nfunction normalizeUtm(rows: Record<string, unknown>[], field: string): StatsBreakdownRow[] {\n return rows.map((row) => normalizeBreakdownRow(row, [field], '(none)'));\n}\n\nfunction normalizePostReferrers(rows: Record<string, unknown>[]): StatsPostReferrerRow[] {\n return rows.map((row) => ({\n source: getString(row.source) ?? 'Direct',\n visits: getNumber(row.visits ?? row.count),\n signups: getNumber(row.signups ?? row.free_members),\n paid_conversions: getNumber(row.paid_conversions ?? row.paid_members),\n mrr: getNumber(row.mrr),\n }));\n}\n\nfunction normalizePostGrowth(rows: Record<string, unknown>[]): StatsPostGrowthPoint[] {\n return rows.map((row) => ({\n date: getString(row.date) ?? '',\n free_members: getNumber(row.free_members),\n paid_members: getNumber(row.paid_members),\n mrr: getNumber(row.mrr),\n }));\n}\n\nfunction normalizeTopPostsViews(rows: Record<string, unknown>[]): StatsPostViewsRow[] {\n return rows.map((row) => ({\n post_id: getString(row.post_id ?? row.id) ?? '',\n title: getString(row.title) ?? '(untitled)',\n published_at: getString(row.published_at),\n feature_image: getString(row.feature_image),\n status: getString(row.status),\n authors: getString(row.authors) ?? '',\n views: getNumber(row.views ?? row.visits),\n sent_count: getNullableNumber(row.sent_count ?? row.email_count),\n opened_count: getNullableNumber(row.opened_count),\n open_rate:\n row.open_rate === null || row.open_rate === undefined\n ? null\n : normalizePercentValue(row.open_rate),\n clicked_count: getNumber(row.clicked_count ?? row.total_clicks),\n click_rate:\n row.click_rate === null || row.click_rate === undefined\n ? null\n : normalizePercentValue(row.click_rate),\n members: getNumber(row.members),\n free_members: getNumber(row.free_members),\n paid_members: getNumber(row.paid_members),\n }));\n}\n\nfunction buildPostSummaryFallback(row: StatsPostViewsRow | null): StatsPostSummaryFallback | null {\n if (!row) {\n return null;\n }\n\n return {\n free_members: row.free_members,\n paid_members: row.paid_members,\n email_recipients: row.sent_count ?? 0,\n email_open_rate: row.open_rate ?? 0,\n email_click_rate: row.click_rate ?? 0,\n };\n}\n\nfunction normalizeNewsletterClicks(rows: Record<string, unknown>[]): StatsNewsletterClicksRow[] {\n return rows.map((row) => ({\n post_id: getString(row.post_id),\n post_title: getString(row.post_title ?? row.title) ?? '(untitled)',\n send_date: getString(row.send_date),\n recipients: getNumber(row.sent_to ?? row.recipients ?? row.email_count),\n clicks: getNumber(row.total_clicks ?? row.clicked ?? row.clicks ?? row.click_count),\n click_rate: Number(\n (getNumber(row.click_rate) * (getNumber(row.click_rate) <= 1 ? 100 : 1)).toFixed(2),\n ),\n }));\n}\n\nfunction mergeNewsletterClickStats(\n basicStatsRows: Record<string, unknown>[],\n clickRows: Record<string, unknown>[],\n): Record<string, unknown>[] {\n const clickRowsByPostId = new Map<string, Record<string, unknown>>();\n\n for (const row of clickRows) {\n const postId = getString(row.post_id);\n if (postId) {\n clickRowsByPostId.set(postId, row);\n }\n }\n\n return basicStatsRows.map((row) => {\n const postId = getString(row.post_id);\n const clickRow = postId ? clickRowsByPostId.get(postId) : undefined;\n\n return {\n ...row,\n total_clicks: clickRow?.total_clicks ?? row.total_clicks ?? 0,\n click_rate: clickRow?.click_rate ?? row.click_rate ?? 0,\n email_count: clickRow?.email_count ?? row.email_count ?? row.sent_to ?? row.recipients ?? 0,\n };\n });\n}\n\nfunction extractPostSummary(raw: unknown): StatsPostSummary {\n const statsObject = getObject(raw, 'stats');\n const dataObject = getObject(raw, 'data');\n const source = Object.keys(statsObject).length > 0 ? statsObject : dataObject;\n\n return {\n visitors: getNumber(source.visitors ?? source.visits),\n pageviews: getNumber(source.pageviews ?? source.views),\n free_members: getNumber(source.free_members),\n paid_members: getNumber(source.paid_members),\n mrr: getNumber(source.mrr),\n email_recipients: getNumber(source.email_recipients ?? source.email_recipients_count),\n email_open_rate: normalizePercentValue(source.email_open_rate ?? source.open_rate),\n email_click_rate: normalizePercentValue(source.email_click_rate ?? source.click_rate),\n };\n}\n\nfunction newsletterStatsSummary(\n newsletter: Record<string, unknown>,\n basicStatsRows: Record<string, unknown>[],\n subscriberHistory: Array<{ date: string; total: number; delta: number }>,\n): StatsNewsletterSummaryRow {\n const recipients = basicStatsRows.reduce(\n (sum, row) => sum + getNumber(row.sent_to ?? row.recipients ?? row.email_count),\n 0,\n );\n const opened = basicStatsRows.reduce(\n (sum, row) => sum + getNumber(row.total_opens ?? row.opened ?? row.opens ?? row.open_count),\n 0,\n );\n const clicked = basicStatsRows.reduce(\n (sum, row) => sum + getNumber(row.total_clicks ?? row.clicked ?? row.clicks ?? row.click_count),\n 0,\n );\n const latestSubscriber = lastValue(subscriberHistory);\n\n return {\n newsletter_id: String(newsletter.id ?? ''),\n newsletter_name: getString(newsletter.name) ?? '(untitled)',\n newsletter_slug: getString(newsletter.slug),\n sent_posts: basicStatsRows.length,\n recipients,\n opened,\n clicked,\n open_rate: recipients > 0 ? Number(((opened / recipients) * 100).toFixed(2)) : 0,\n click_rate: recipients > 0 ? Number(((clicked / recipients) * 100).toFixed(2)) : 0,\n subscribers: latestSubscriber?.total ?? 0,\n subscriber_delta: latestSubscriber?.delta ?? 0,\n };\n}\n\nfunction summarizePostGrowth(\n points: StatsPostGrowthPoint[],\n): Pick<StatsPostSummary, 'free_members' | 'paid_members' | 'mrr'> {\n const latest = lastValue(points);\n\n return {\n free_members: latest?.free_members ?? 0,\n paid_members: latest?.paid_members ?? 0,\n mrr: latest?.mrr ?? 0,\n };\n}\n\nfunction buildPostEmailSummary(\n summary: StatsPostSummary,\n range: StatsRange,\n post: StatsPostMeta,\n): Pick<StatsPostSummary, 'email_recipients' | 'email_open_rate' | 'email_click_rate'> {\n if (!post.published_at) {\n return {\n email_recipients: summary.email_recipients,\n email_open_rate: summary.email_open_rate,\n email_click_rate: summary.email_click_rate,\n };\n }\n\n if (!isDateWithinRange(post.published_at, range)) {\n return {\n email_recipients: 0,\n email_open_rate: 0,\n email_click_rate: 0,\n };\n }\n\n return {\n email_recipients: summary.email_recipients,\n email_open_rate: summary.email_open_rate,\n email_click_rate: summary.email_click_rate,\n };\n}\n\nfunction normalizeSubscriptionTotals(\n rows: Record<string, unknown>[],\n fallbackTotals: StatsSubscriptionTotal[],\n range: StatsRange,\n): StatsSubscriptionTotal[] {\n const latestByTier = new Map<string, Record<string, unknown>>();\n\n for (const row of rows) {\n const date = getString(row.date);\n if (!isDateWithinRange(date, range)) {\n continue;\n }\n\n const tier = getString(row.tier) ?? '';\n if (!tier) {\n continue;\n }\n\n const existing = latestByTier.get(tier);\n if (!existing || (getString(existing.date) ?? '') <= (date ?? '')) {\n latestByTier.set(tier, row);\n }\n }\n\n if (latestByTier.size === 0) {\n return fallbackTotals;\n }\n\n return [...latestByTier.entries()].map(([tier, row]) => ({\n tier,\n label: getString(row.label ?? row.name ?? row.tier) ?? tier,\n count: getNumber(row.count),\n }));\n}\n\nclass StatsClient {\n private readonly global: GlobalOptions;\n private connectionPromise?: Promise<Awaited<ReturnType<typeof resolveConnectionConfig>>>;\n private clientPromise?: Promise<GhostClient>;\n private bootstrapPromise?: Promise<StatsBootstrap>;\n private tokenPromise?: Promise<string>;\n private postCache = new Map<string, StatsPostMeta>();\n\n constructor(global: GlobalOptions) {\n this.global = global;\n }\n\n private async getConnection() {\n if (!this.connectionPromise) {\n this.connectionPromise = resolveConnectionConfig(this.global);\n }\n\n return this.connectionPromise;\n }\n\n private async getClient(): Promise<GhostClient> {\n if (!this.clientPromise) {\n this.clientPromise = this.getConnection().then(\n (connection) =>\n new GhostClient({\n url: connection.url,\n staffToken: connection.staffToken,\n version: connection.apiVersion,\n }),\n );\n }\n\n return this.clientPromise;\n }\n\n private async getBootstrap(): Promise<StatsBootstrap> {\n if (!this.bootstrapPromise) {\n this.bootstrapPromise = this.getClient().then(async (client) => {\n const [configResponse, settingsResponse, siteResponse] = await Promise.all([\n client.rawRequest<Record<string, unknown>>('/config/'),\n client.rawRequest<Record<string, unknown>>('/settings/'),\n client.rawRequest<Record<string, unknown>>('/site/'),\n ]);\n\n return {\n config: getObject(configResponse, 'config'),\n settings: getArray(settingsResponse, 'settings'),\n site: getObject(siteResponse, 'site'),\n };\n });\n }\n\n return this.bootstrapPromise;\n }\n\n private async getTimeZone(requested?: string): Promise<string> {\n if (requested) {\n return requested;\n }\n\n const bootstrap = await this.getBootstrap();\n const siteTz =\n getString(settingValue(bootstrap.settings, 'timezone')) ??\n getString(settingValue(bootstrap.settings, 'active_timezone'));\n if (siteTz) {\n return siteTz;\n }\n\n const systemTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n return systemTz || 'UTC';\n }\n\n private async resolveLifetimeRange(requested?: string): Promise<StatsRange> {\n const timezone = await this.getTimeZone(requested);\n const today = formatDateInTimeZone(new Date(), timezone);\n\n return {\n preset: 'all',\n from: null,\n to: today,\n timezone,\n };\n }\n\n async resolveRange(\n input: Pick<StatsOverviewInput, 'range' | 'from' | 'to' | 'timezone'>,\n ): Promise<StatsRange> {\n const timezone = await this.getTimeZone(input.timezone);\n const preset = input.range ?? '30d';\n const today = formatDateInTimeZone(new Date(), timezone);\n const to = input.to ?? today;\n const explicitRange = input.from !== undefined || input.to !== undefined;\n\n if (preset === 'all' && !input.from) {\n return {\n preset,\n from: null,\n to,\n timezone,\n };\n }\n\n const days = getRangePresetDays(preset) ?? 30;\n const from =\n input.from ?? (explicitRange ? subtractDays(to, days - 1) : subtractDays(today, days - 1));\n\n return {\n preset,\n from,\n to,\n timezone,\n };\n }\n\n private async getStatsConfig(): Promise<StatsConfigRecord> {\n const bootstrap = await this.getBootstrap();\n const stats = bootstrap.config.stats;\n if (!stats || typeof stats !== 'object' || Array.isArray(stats)) {\n throw makeAnalyticsUnavailableError();\n }\n\n return stats as StatsConfigRecord;\n }\n\n private async getTinybirdToken(): Promise<string> {\n if (!this.tokenPromise) {\n this.tokenPromise = this.getClient().then(async (client) => {\n const payload = await client.rawRequest<Record<string, unknown>>('/tinybird/token/');\n const token = getString(getObject(payload, 'tinybird').token);\n if (!token) {\n throw new GhstError('Tinybird token was not returned by Ghost.', {\n code: 'ANALYTICS_UNAVAILABLE',\n exitCode: ExitCode.GENERAL_ERROR,\n });\n }\n return token;\n });\n }\n\n return this.tokenPromise;\n }\n\n private async tinybirdQuery(pipeName: string, params: TinybirdParams): Promise<TinybirdRow[]> {\n const statsConfig = await this.getStatsConfig();\n const token = await this.getTinybirdToken();\n const baseUrl = statsConfig.local?.enabled\n ? getString(statsConfig.local.endpoint)\n : getString(statsConfig.endpointBrowser ?? statsConfig.endpoint);\n\n const siteUuid = getString(statsConfig.id);\n if (!baseUrl || !siteUuid) {\n throw makeAnalyticsUnavailableError();\n }\n\n const version = getString(statsConfig.version);\n const finalPipe = version ? `${pipeName}_${version}` : pipeName;\n const url = new URL(`/v0/pipes/${finalPipe}.json`, baseUrl);\n url.searchParams.set('site_uuid', siteUuid);\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null || value === '') {\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n\n const response = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n throw new GhstError(`Analytics request failed (${response.status})`, {\n code: 'ANALYTICS_REQUEST_FAILED',\n exitCode: mapHttpStatusToExitCode(response.status),\n status: response.status,\n });\n }\n\n const payload = (await response.json()) as Record<string, unknown>;\n return Array.isArray(payload.data) ? (payload.data as TinybirdRow[]) : [];\n }\n\n private buildRangeParams(range: StatsRange): TinybirdParams {\n return {\n date_from: range.from ?? (range.preset === 'all' ? ALL_RANGE_DATE_FROM : undefined),\n date_to: range.to,\n timezone: range.timezone,\n };\n }\n\n private buildFilterParams(\n filters: StatsFilters,\n extra: Record<string, TinybirdPrimitive> = {},\n ): TinybirdParams {\n return {\n member_status: filters.audience === 'all' ? undefined : filters.audience,\n source: filters.source ?? undefined,\n location: filters.location ?? undefined,\n device: filters.device ?? undefined,\n utm_source: filters.utm_source ?? undefined,\n utm_medium: filters.utm_medium ?? undefined,\n utm_campaign: filters.utm_campaign ?? undefined,\n utm_content: filters.utm_content ?? undefined,\n utm_term: filters.utm_term ?? undefined,\n ...extra,\n };\n }\n\n private async listNewsletters(): Promise<Record<string, unknown>[]> {\n const client = await this.getClient();\n const payload = (await collectAllPages('newsletters', (page) =>\n client.newsletters.browse({\n limit: 100,\n page,\n }),\n )) as GhostPaginatedResponse;\n return Array.isArray(payload.newsletters)\n ? (payload.newsletters as Record<string, unknown>[])\n : [];\n }\n\n async getPostMeta(id: string): Promise<StatsPostMeta> {\n const cached = this.postCache.get(id);\n if (cached) {\n return cached;\n }\n\n const client = await this.getClient();\n const payload = await client.posts.read(id);\n const posts = Array.isArray(payload.posts) ? (payload.posts as Record<string, unknown>[]) : [];\n const post = posts[0];\n\n if (!post) {\n throw new GhstError('Post not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const meta = {\n id,\n uuid: getString(post.uuid),\n title: getString(post.title) ?? '(untitled)',\n slug: getString(post.slug),\n url: getString(post.url),\n published_at: getString(post.published_at),\n };\n\n this.postCache.set(id, meta);\n return meta;\n }\n\n async getWebReport(input: StatsWebInput): Promise<StatsWebReport> {\n const range = await this.resolveRange(input);\n const filters = resolveFilters(input);\n const limit = input.limit ?? 5;\n const client = await this.getClient();\n\n const [kpisRows, activeRows, topContentPayload, sourceRows, locationRows] = await Promise.all([\n this.tinybirdQuery('api_kpis', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n }),\n this.tinybirdQuery('api_active_visitors', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n }),\n client.rawRequest<Record<string, unknown>>('/stats/top-content/', 'GET', undefined, {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n }),\n this.tinybirdQuery('api_top_sources', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n }),\n this.tinybirdQuery('api_top_locations', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n }),\n ]);\n\n return {\n range,\n filters,\n kpis: normalizeKpis(kpisRows, activeRows[0]),\n timeseries: normalizeTrafficSeries(kpisRows),\n content: getArray(topContentPayload).map(normalizeContentRow),\n sources: normalizeTopSources(sourceRows),\n locations: normalizeLocations(locationRows),\n };\n }\n\n async getWebTable(metric: string, input: StatsWebTableInput): Promise<StatsWebTableReport> {\n const range = await this.resolveRange(input);\n const filters = resolveFilters(input);\n const client = await this.getClient();\n const limit = input.limit ?? 10;\n\n if (metric === 'content') {\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/top-content/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n },\n );\n\n return {\n range,\n filters,\n metric,\n items: getArray(payload).map(normalizeContentRow),\n };\n }\n\n const pipeByMetric: Record<\n string,\n { pipe: string; normalizer: (rows: TinybirdRow[]) => StatsBreakdownRow[] }\n > = {\n sources: { pipe: 'api_top_sources', normalizer: normalizeTopSources },\n locations: { pipe: 'api_top_locations', normalizer: normalizeLocations },\n devices: { pipe: 'api_top_devices', normalizer: normalizeDevices },\n 'utm-sources': {\n pipe: 'api_top_utm_sources',\n normalizer: (rows) => normalizeUtm(rows, 'utm_source'),\n },\n 'utm-mediums': {\n pipe: 'api_top_utm_mediums',\n normalizer: (rows) => normalizeUtm(rows, 'utm_medium'),\n },\n 'utm-campaigns': {\n pipe: 'api_top_utm_campaigns',\n normalizer: (rows) => normalizeUtm(rows, 'utm_campaign'),\n },\n 'utm-contents': {\n pipe: 'api_top_utm_contents',\n normalizer: (rows) => normalizeUtm(rows, 'utm_content'),\n },\n 'utm-terms': {\n pipe: 'api_top_utm_terms',\n normalizer: (rows) => normalizeUtm(rows, 'utm_term'),\n },\n };\n\n const selected = pipeByMetric[metric];\n if (!selected) {\n throw new GhstError(`Unsupported web metric: ${metric}`, {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n });\n }\n\n const rows = await this.tinybirdQuery(selected.pipe, {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters),\n limit,\n });\n\n return {\n range,\n filters,\n metric,\n items: selected.normalizer(rows),\n };\n }\n\n async getGrowthReport(input: StatsGrowthInput): Promise<StatsGrowthReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const limit = input.limit ?? 5;\n\n const [membersPayload, mrrPayload, subscriptionsPayload, sourcesPayload] = await Promise.all([\n client.rawRequest<Record<string, unknown>>('/stats/member_count/', 'GET', undefined, {\n date_from: range.from ?? undefined,\n }),\n client.rawRequest<Record<string, unknown>>('/stats/mrr/', 'GET', undefined, {\n date_from: range.from ?? undefined,\n }),\n client.rawRequest<Record<string, unknown>>('/stats/subscriptions/'),\n client.rawRequest<Record<string, unknown>>('/stats/top-sources-growth/', 'GET', undefined, {\n ...this.buildRangeParams(range),\n limit,\n }),\n ]);\n\n const members = clipDatedRows(normalizeMembersSeries(getArray(membersPayload)), range);\n const mrr = clipDatedRows(normalizeMrrSeries(getArray(mrrPayload)), range);\n const rawSubscriptionRows = getArray(subscriptionsPayload);\n const subscriptionsHistory = clipDatedRows(\n normalizeSubscriptionsHistory(rawSubscriptionRows),\n range,\n );\n const subscriptionsMeta = getObject(subscriptionsPayload, 'meta');\n const fallbackTotals = Array.isArray(subscriptionsMeta.totals)\n ? (subscriptionsMeta.totals as Record<string, unknown>[]).map((row) => ({\n tier: getString(row.tier) ?? '',\n label: getString(row.label ?? row.name ?? row.tier) ?? '',\n count: getNumber(row.count),\n }))\n : [];\n const totals = normalizeSubscriptionTotals(rawSubscriptionRows, fallbackTotals, range);\n const latestMembers = lastValue(members);\n const latestMrr = lastValue(mrr);\n const latestSubscriptions = lastValue(subscriptionsHistory);\n\n return {\n range,\n summary: {\n free_members: latestMembers?.free_members ?? 0,\n paid_members: latestMembers?.paid_members ?? 0,\n total_members: latestMembers?.total_members ?? 0,\n member_delta: deltaOf(members.map((entry) => entry.total_members)),\n paid_delta: deltaOf(members.map((entry) => entry.paid_members)),\n mrr: latestMrr?.mrr ?? 0,\n mrr_delta: deltaOf(mrr.map((entry) => entry.mrr)),\n total_subscriptions: latestSubscriptions?.subscriptions ?? 0,\n subscription_delta: deltaOf(subscriptionsHistory.map((entry) => entry.subscriptions)),\n currency: getString(getArray(mrrPayload)[0]?.currency),\n },\n members,\n mrr,\n subscriptions: {\n history: subscriptionsHistory,\n totals,\n },\n sources: normalizeTopSources(getArray(sourcesPayload)),\n };\n }\n\n async getPostsReport(input: StatsPostsInput): Promise<StatsPostsReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/top-posts-views/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n limit: input.limit ?? 5,\n },\n );\n\n return {\n range,\n posts: normalizeTopPostsViews(getArray(payload)),\n };\n }\n\n async getNewslettersReport(input: StatsNewslettersInput): Promise<StatsNewslettersReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const allNewsletters = await this.listNewsletters();\n const selected = input.newsletterId\n ? allNewsletters.filter((newsletter) => String(newsletter.id ?? '') === input.newsletterId)\n : allNewsletters;\n\n if (input.newsletterId && selected.length === 0) {\n throw new GhstError('Newsletter not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const rows = await Promise.all(\n selected.slice(0, input.limit ?? selected.length).map(async (newsletter) => {\n const newsletterId = String(newsletter.id ?? '');\n const [basicStatsPayload, subscriberPayload] = await Promise.all([\n client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-basic-stats/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n newsletter_id: newsletterId,\n },\n ),\n client.rawRequest<Record<string, unknown>>('/stats/subscriber-count/', 'GET', undefined, {\n ...this.buildRangeParams(range),\n newsletter_id: newsletterId,\n }),\n ]);\n const basicStatsRows = getArray(basicStatsPayload);\n const postIds = basicStatsRows\n .map((row) => getString(row.post_id))\n .filter((value): value is string => Boolean(value));\n const clickPayload =\n postIds.length > 0\n ? await client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-click-stats/',\n 'GET',\n undefined,\n {\n newsletter_id: newsletterId,\n post_ids: postIds.join(','),\n },\n )\n : { stats: [] };\n const mergedRows = mergeNewsletterClickStats(basicStatsRows, getArray(clickPayload));\n\n const subscriberHistory = getArray(subscriberPayload).map((row) => ({\n date: getString(row.date) ?? '',\n total: getNumber(row.total ?? row.subscribers),\n delta: getNumber(row.delta ?? row.change),\n }));\n\n return newsletterStatsSummary(newsletter, mergedRows, subscriberHistory);\n }),\n );\n\n return {\n range,\n newsletters: rows,\n };\n }\n\n private async getPostSummaryFallback(\n postId: string,\n range: StatsRange,\n ): Promise<StatsPostSummaryFallback | null> {\n const client = await this.getClient();\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/top-posts-views/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n limit: 100,\n },\n );\n const row =\n normalizeTopPostsViews(getArray(payload)).find((item) => item.post_id === postId) ?? null;\n return buildPostSummaryFallback(row);\n }\n\n async getNewsletterClicksReport(\n input: StatsNewsletterClicksInput,\n ): Promise<StatsNewsletterClicksReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const newsletters = await this.listNewsletters();\n const newsletter = newsletters.find((entry) => String(entry.id ?? '') === input.newsletterId);\n\n if (!newsletter) {\n throw new GhstError('Newsletter not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const basicStatsPayload = await client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-basic-stats/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n newsletter_id: input.newsletterId,\n },\n );\n const basicStatsRows = getArray(basicStatsPayload);\n const selectedRows =\n input.postIds && input.postIds.length > 0\n ? basicStatsRows.filter((row) => {\n const postId = getString(row.post_id);\n return postId ? input.postIds?.includes(postId) : false;\n })\n : basicStatsRows;\n const postIds = selectedRows\n .map((row) => getString(row.post_id))\n .filter((value): value is string => Boolean(value));\n const clickPayload =\n postIds.length > 0\n ? await client.rawRequest<Record<string, unknown>>(\n '/stats/newsletter-click-stats/',\n 'GET',\n undefined,\n {\n newsletter_id: input.newsletterId,\n post_ids: postIds.join(','),\n },\n )\n : { stats: [] };\n const mergedRows = mergeNewsletterClickStats(selectedRows, getArray(clickPayload));\n\n return {\n range,\n newsletter: {\n id: input.newsletterId,\n name: getString(newsletter.name) ?? '(untitled)',\n slug: getString(newsletter.slug),\n },\n posts: input.postIds ?? [],\n clicks: normalizeNewsletterClicks(mergedRows).slice(0, input.limit ?? mergedRows.length),\n };\n }\n\n async getNewsletterSubscribersReport(\n input: StatsNewsletterSubscribersInput,\n ): Promise<StatsNewsletterSubscribersReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const newsletters = await this.listNewsletters();\n const selected = input.newsletterId\n ? newsletters.filter((newsletter) => String(newsletter.id ?? '') === input.newsletterId)\n : newsletters;\n\n if (input.newsletterId && selected.length === 0) {\n throw new GhstError('Newsletter not found', {\n code: 'NOT_FOUND',\n exitCode: ExitCode.NOT_FOUND,\n });\n }\n\n const rows = await Promise.all(\n selected.map(async (newsletter) => {\n const payload = await client.rawRequest<Record<string, unknown>>(\n '/stats/subscriber-count/',\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n newsletter_id: String(newsletter.id ?? ''),\n },\n );\n\n const history = getArray(payload).map((row) => ({\n date: getString(row.date) ?? '',\n total: getNumber(row.total ?? row.subscribers),\n delta: getNumber(row.delta ?? row.change),\n }));\n const latest = lastValue(history);\n\n return {\n newsletter_id: String(newsletter.id ?? ''),\n newsletter_name: getString(newsletter.name) ?? '(untitled)',\n newsletter_slug: getString(newsletter.slug),\n subscribers: latest?.total ?? 0,\n subscriber_delta: latest?.delta ?? 0,\n history,\n };\n }),\n );\n\n return {\n range,\n newsletters: rows,\n };\n }\n\n async getPostGrowthReport(input: StatsPostGrowthInput): Promise<StatsPostGrowthReport> {\n const range = hasExplicitWindowOverride(input)\n ? await this.resolveRange(input)\n : await this.resolveLifetimeRange(input.timezone);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n const payload = await client.rawRequest<Record<string, unknown>>(\n `/stats/posts/${input.id}/growth`,\n 'GET',\n undefined,\n this.buildRangeParams(range),\n );\n\n return {\n range,\n post,\n growth: clipDatedRows(normalizePostGrowth(getArray(payload)), range),\n };\n }\n\n async getPostReferrersReport(input: StatsPostReferrersInput): Promise<StatsPostReferrersReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n const payload = await client.rawRequest<Record<string, unknown>>(\n `/stats/posts/${input.id}/top-referrers`,\n 'GET',\n undefined,\n {\n ...this.buildRangeParams(range),\n limit: input.limit ?? 10,\n },\n );\n\n return {\n range,\n post,\n referrers: normalizePostReferrers(getArray(payload)),\n };\n }\n\n async getPostNewsletterReport(\n input: StatsPostNewsletterInput,\n ): Promise<StatsPostNewsletterReport> {\n const range = hasExplicitWindowOverride(input)\n ? await this.resolveRange(input)\n : await this.resolveLifetimeRange(input.timezone);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n if (\n hasExplicitWindowOverride(input) &&\n post.published_at &&\n !isDateWithinRange(post.published_at, range)\n ) {\n return {\n range,\n post,\n newsletter: {\n recipients: 0,\n open_rate: 0,\n click_rate: 0,\n },\n };\n }\n\n const payload = await client.rawRequest<Record<string, unknown>>(\n `/stats/posts/${input.id}/stats/`,\n );\n const summary = extractPostSummary(payload);\n const fallback =\n summary.email_recipients > 0 || summary.email_open_rate > 0 || summary.email_click_rate > 0\n ? null\n : await this.getPostSummaryFallback(input.id, range);\n\n return {\n range,\n post,\n newsletter: {\n recipients: fallback?.email_recipients ?? summary.email_recipients,\n open_rate: fallback?.email_open_rate ?? summary.email_open_rate,\n click_rate: fallback?.email_click_rate ?? summary.email_click_rate,\n },\n };\n }\n\n async getPostWebReport(input: StatsPostWebInput): Promise<StatsPostWebReport> {\n const range = await this.resolveRange(input);\n const filters = resolveFilters(input);\n const post = await this.getPostMeta(input.id);\n if (!post.uuid) {\n throw makeAnalyticsUnavailableError();\n }\n\n const limit = input.limit ?? 10;\n const [kpisRows, activeRows, sourceRows, locationRows] = await Promise.all([\n this.tinybirdQuery('api_kpis', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid }),\n }),\n this.tinybirdQuery('api_active_visitors', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid }),\n }),\n this.tinybirdQuery('api_top_sources', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid, limit }),\n }),\n this.tinybirdQuery('api_top_locations', {\n ...this.buildRangeParams(range),\n ...this.buildFilterParams(filters, { post_uuid: post.uuid, limit }),\n }),\n ]);\n\n return {\n range,\n filters,\n post,\n kpis: normalizeKpis(kpisRows, activeRows[0]),\n timeseries: normalizeTrafficSeries(kpisRows),\n sources: normalizeTopSources(sourceRows),\n locations: normalizeLocations(locationRows),\n };\n }\n\n async getPostReport(input: StatsPostInput): Promise<StatsPostReport> {\n const range = await this.resolveRange(input);\n const client = await this.getClient();\n const post = await this.getPostMeta(input.id);\n const [summaryPayload, growthReport, referrersReport, webReport, fallback] = await Promise.all([\n client.rawRequest<Record<string, unknown>>(`/stats/posts/${input.id}/stats/`),\n this.getPostGrowthReport({\n ...input,\n range: range.preset ?? undefined,\n from: range.from ?? undefined,\n to: range.to,\n timezone: range.timezone,\n }),\n this.getPostReferrersReport({ ...input, limit: 5 }),\n this.getPostWebReport({ ...input, limit: 5 }).catch((error) => {\n if (error instanceof GhstError && error.code === 'ANALYTICS_UNAVAILABLE') {\n return null;\n }\n\n throw error;\n }),\n this.getPostSummaryFallback(input.id, range),\n ]);\n const summary = extractPostSummary(summaryPayload);\n const postGrowthSummary = summarizePostGrowth(growthReport.growth);\n const emailSummary = buildPostEmailSummary(summary, range, post);\n\n return {\n range,\n post,\n summary: {\n visitors: webReport?.kpis.visits ?? summary.visitors,\n pageviews: webReport?.kpis.pageviews ?? summary.pageviews,\n free_members:\n postGrowthSummary.free_members > 0\n ? postGrowthSummary.free_members\n : (fallback?.free_members ?? 0),\n paid_members:\n postGrowthSummary.paid_members > 0\n ? postGrowthSummary.paid_members\n : (fallback?.paid_members ?? 0),\n mrr: postGrowthSummary.mrr,\n email_recipients:\n emailSummary.email_recipients > 0\n ? emailSummary.email_recipients\n : (fallback?.email_recipients ?? 0),\n email_open_rate:\n emailSummary.email_open_rate > 0\n ? emailSummary.email_open_rate\n : (fallback?.email_open_rate ?? 0),\n email_click_rate:\n emailSummary.email_click_rate > 0\n ? emailSummary.email_click_rate\n : (fallback?.email_click_rate ?? 0),\n },\n web: webReport,\n growth: growthReport.growth,\n referrers: referrersReport.referrers,\n };\n }\n}\n\nexport async function getStatsOverview(\n global: GlobalOptions,\n input: StatsOverviewInput,\n): Promise<StatsOverviewReport> {\n const client = new StatsClient(global);\n const [web, growth, newsletters] = await Promise.all([\n client.getWebReport({ ...input, limit: 5 }),\n client.getGrowthReport({ ...input, limit: 5 }),\n client.getNewslettersReport({ ...input, limit: 5 }),\n ]);\n\n return {\n range: web.range,\n summary: {\n visitors: web.kpis.visits,\n pageviews: web.kpis.pageviews,\n bounce_rate: web.kpis.bounce_rate,\n avg_session_sec: web.kpis.avg_session_sec,\n active_visitors: web.kpis.active_visitors,\n total_members: growth.summary.total_members,\n member_delta: growth.summary.member_delta,\n paid_members: growth.summary.paid_members,\n paid_delta: growth.summary.paid_delta,\n mrr: growth.summary.mrr,\n mrr_delta: growth.summary.mrr_delta,\n },\n web,\n growth,\n newsletters,\n };\n}\n\nexport async function getStatsWeb(\n global: GlobalOptions,\n input: StatsWebInput,\n): Promise<StatsWebReport> {\n return new StatsClient(global).getWebReport(input);\n}\n\nexport async function getStatsWebTable(\n global: GlobalOptions,\n metric: string,\n input: StatsWebTableInput,\n): Promise<StatsWebTableReport> {\n return new StatsClient(global).getWebTable(metric, input);\n}\n\nexport async function getStatsGrowth(\n global: GlobalOptions,\n input: StatsGrowthInput,\n): Promise<StatsGrowthReport> {\n return new StatsClient(global).getGrowthReport(input);\n}\n\nexport async function getStatsPosts(\n global: GlobalOptions,\n input: StatsPostsInput,\n): Promise<StatsPostsReport> {\n return new StatsClient(global).getPostsReport(input);\n}\n\nexport async function getStatsNewsletters(\n global: GlobalOptions,\n input: StatsNewslettersInput,\n): Promise<StatsNewslettersReport> {\n return new StatsClient(global).getNewslettersReport(input);\n}\n\nexport async function getStatsNewsletterClicks(\n global: GlobalOptions,\n input: StatsNewsletterClicksInput,\n): Promise<StatsNewsletterClicksReport> {\n return new StatsClient(global).getNewsletterClicksReport(input);\n}\n\nexport async function getStatsNewsletterSubscribers(\n global: GlobalOptions,\n input: StatsNewsletterSubscribersInput,\n): Promise<StatsNewsletterSubscribersReport> {\n return new StatsClient(global).getNewsletterSubscribersReport(input);\n}\n\nexport async function getStatsPost(\n global: GlobalOptions,\n input: StatsPostInput,\n): Promise<StatsPostReport> {\n return new StatsClient(global).getPostReport(input);\n}\n\nexport async function getStatsPostGrowth(\n global: GlobalOptions,\n input: StatsPostGrowthInput,\n): Promise<StatsPostGrowthReport> {\n return new StatsClient(global).getPostGrowthReport(input);\n}\n\nexport async function getStatsPostNewsletter(\n global: GlobalOptions,\n input: StatsPostNewsletterInput,\n): Promise<StatsPostNewsletterReport> {\n return new StatsClient(global).getPostNewsletterReport(input);\n}\n\nexport async function getStatsPostReferrers(\n global: GlobalOptions,\n input: StatsPostReferrersInput,\n): Promise<StatsPostReferrersReport> {\n return new StatsClient(global).getPostReferrersReport(input);\n}\n\nexport async function getStatsPostWeb(\n global: GlobalOptions,\n input: StatsPostWebInput,\n): Promise<StatsPostWebReport> {\n return new StatsClient(global).getPostWebReport(input);\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 function 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 uploadedTheme = themes[0] ?? payload;\n const name = String(uploadedTheme.name ?? '').trim();\n return name || undefined;\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 isLoopbackHost(host: string): boolean {\n const normalized = host.trim().toLowerCase();\n return (\n normalized === '127.0.0.1' ||\n normalized === '::1' ||\n normalized === '[::1]' ||\n normalized === 'localhost'\n );\n}\n\nfunction assertSafeBindHost(host: string, allowPublicBind: boolean): void {\n if (allowPublicBind || isLoopbackHost(host)) {\n return;\n }\n\n throw new GhstError(\n `mcp http refuses non-loopback host '${host}' without --unsafe-public-bind.`,\n {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\n },\n );\n}\n\nfunction normalizeCorsOrigin(origin: string | undefined): string | undefined {\n if (origin === undefined) {\n return undefined;\n }\n\n const trimmed = origin.trim();\n if (!trimmed) {\n throw new GhstError('cors-origin must be a single exact origin.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (trimmed === '*' || trimmed.includes(',')) {\n throw new GhstError('cors-origin must be a single exact origin and cannot use wildcards.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new GhstError('cors-origin must be a valid origin like https://app.example.com.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n if (\n parsed.username ||\n parsed.password ||\n parsed.search ||\n parsed.hash ||\n parsed.pathname !== '/'\n ) {\n throw new GhstError('cors-origin must be a single exact origin without path, query, or hash.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n return parsed.origin;\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 a single exact CORS origin')\n .option('--unsafe-public-bind', 'Allow binding mcp http to a non-loopback host')\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 assertSafeBindHost(options.host, Boolean(options.unsafePublicBind));\n const corsOrigin = normalizeCorsOrigin(options.corsOrigin as string | undefined);\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,\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 { assertFileDoesNotExist } from '../lib/file-guards.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 { confirmDestructiveAction } 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 confirmDestructiveAction(`Delete member '${parsed.data.id}'? [y/N]: `, {\n action: 'delete_member',\n target: parsed.data.id,\n reversible: false,\n site: global.site ?? null,\n sideEffects: parsed.data.cancel ? ['cancel_subscriptions'] : undefined,\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 assertFileDoesNotExist(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 fs from 'node:fs/promises';\nimport { ExitCode, GhstError } from './errors.js';\n\nexport async function assertFileDoesNotExist(filePath: string): Promise<void> {\n try {\n await fs.access(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return;\n }\n\n throw error;\n }\n\n throw new GhstError(`Refusing to overwrite existing file: ${filePath}`, {\n code: 'USAGE_ERROR',\n exitCode: ExitCode.USAGE_ERROR,\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 { assertFileDoesNotExist } from './file-guards.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 assertFileDoesNotExist(outputPath);\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 { confirmDestructiveAction } 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 confirmDestructiveAction(`Delete page '${parsed.data.id}'? [y/N]: `, {\n action: 'delete_page',\n target: parsed.data.id,\n reversible: false,\n site: global.site ?? null,\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 { confirmDestructiveAction } 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 confirmDestructiveAction(`${label}? [y/N]: `, {\n action: 'delete_post',\n target: parsed.data.filter ?? parsed.data.id ?? '(unknown)',\n count: parsed.data.filter ? undefined : 1,\n reversible: false,\n site: global.site ?? null,\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 .option('--newsletter <slug>', 'Newsletter slug for email delivery')\n .option('--email-only', 'Email only publish')\n .option('--email-segment <segment>', 'Email segment')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = PostScheduleInputSchema.safeParse({\n id,\n at: options.at,\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 schedulePost(global, parsed.data.id, parsed.data.at, {\n newsletter: parsed.data.newsletter,\n email_only: parsed.data.emailOnly,\n email_segment: parsed.data.emailSegment,\n });\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 newsletter: z.string().optional(),\n emailOnly: z.boolean().optional(),\n emailSegment: z.string().optional(),\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 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 printJson,\n printSocialWebAccountHuman,\n printSocialWebAccountsHuman,\n printSocialWebNotificationsHuman,\n printSocialWebPostsHuman,\n printSocialWebStatusHuman,\n printSocialWebThreadHuman,\n} from '../lib/output.js';\nimport { parseBooleanFlag, parseInteger } from '../lib/parse.js';\nimport { confirmDestructiveAction } from '../lib/prompts.js';\nimport {\n blockAccount,\n blockDomain,\n createNote,\n deleteSocialWebPost,\n derepostPost,\n disableSocialWeb,\n enableSocialWeb,\n followAccount,\n getNotificationsCount,\n getSocialWebPost,\n getSocialWebProfile,\n getSocialWebStatus,\n getSocialWebThread,\n likePost,\n listBlockedAccounts,\n listBlockedDomains,\n listFollowers,\n listFollowing,\n listNotes,\n listNotifications,\n listReader,\n listSocialWebLikes,\n listSocialWebPosts,\n replyToPost,\n repostPost,\n searchSocialWeb,\n unblockAccount,\n unblockDomain,\n unfollowAccount,\n unlikePost,\n updateSocialWebProfile,\n uploadSocialWebImage,\n} from '../lib/socialweb.js';\nimport { isNonInteractive } from '../lib/tty.js';\nimport {\n SocialWebBlockDomainInputSchema,\n SocialWebContentInputSchema,\n SocialWebDeleteInputSchema,\n SocialWebFollowsInputSchema,\n SocialWebHandleActionInputSchema,\n SocialWebIdInputSchema,\n SocialWebPaginatedInputSchema,\n SocialWebProfileInputSchema,\n SocialWebProfileUpdateInputSchema,\n SocialWebReplyInputSchema,\n SocialWebSearchInputSchema,\n SocialWebUploadInputSchema,\n} from '../schemas/socialweb.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues\n ?.map((issue) => issue.message)\n .join('; ') ?? 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\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 parsePagination(options: { limit?: string; next?: string; all?: unknown }) {\n return {\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n };\n}\n\nfunction printSocialWebReadPayload(\n commandName: string,\n payload: Record<string, unknown>,\n global: ReturnType<typeof getGlobalOptions>,\n): void {\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n\n switch (commandName) {\n case 'status':\n case 'enable':\n case 'disable':\n printSocialWebStatusHuman(payload, global.color !== false);\n return;\n case 'profile':\n case 'profile-update':\n case 'search':\n case 'follow':\n if (Array.isArray(payload.accounts)) {\n printSocialWebAccountsHuman(payload, global.color !== false);\n return;\n }\n printSocialWebAccountHuman(payload, global.color !== false);\n return;\n case 'notes':\n case 'reader':\n case 'posts':\n case 'likes':\n case 'post':\n case 'note':\n case 'reply':\n printSocialWebPostsHuman(payload, global.color !== false);\n return;\n case 'notifications':\n printSocialWebNotificationsHuman(payload, global.color !== false);\n return;\n case 'followers':\n case 'following':\n case 'blocked-accounts':\n case 'blocked-domains':\n printSocialWebAccountsHuman(payload, global.color !== false);\n return;\n case 'thread':\n printSocialWebThreadHuman(payload, global.color !== false);\n return;\n default:\n console.log(JSON.stringify(payload, null, 2));\n }\n}\n\nexport function registerSocialWebCommands(program: Command): void {\n const socialweb = program.command('socialweb').description('Ghost social web management');\n\n socialweb\n .command('status')\n .description('Show social web settings and connectivity status')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await getSocialWebStatus(global);\n printSocialWebReadPayload('status', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('enable')\n .description('Enable social web in Ghost settings')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await enableSocialWeb(global);\n printSocialWebReadPayload('enable', payload as unknown as Record<string, unknown>, global);\n if (global.json) {\n return;\n }\n\n const report = payload as { settings?: { social_web?: boolean }; reachable?: boolean };\n if (report.settings?.social_web && report.reachable === false) {\n console.log(\n 'Warning: Social web is enabled, but the social web service is not reachable yet.',\n );\n }\n });\n\n socialweb\n .command('disable')\n .description('Disable social web in Ghost settings')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await disableSocialWeb(global);\n printSocialWebReadPayload('disable', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('profile [handle]')\n .description('Show a social web profile')\n .action(async (handle: string | undefined, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebProfileInputSchema.safeParse({ handle: handle ?? 'me' });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSocialWebProfile(global, parsed.data.handle);\n printSocialWebReadPayload('profile', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('profile-update')\n .description('Update the current social web profile')\n .option('--name <name>', 'Profile display name')\n .option('--username <username>', 'Profile username')\n .option('--bio <bio>', 'Profile bio')\n .option('--avatar-url <url>', 'Avatar image URL')\n .option('--banner-image-url <url>', 'Banner image URL')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebProfileUpdateInputSchema.safeParse({\n name: options.name,\n username: options.username,\n bio: options.bio,\n avatarUrl: options.avatarUrl,\n bannerImageUrl: options.bannerImageUrl,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await updateSocialWebProfile(global, parsed.data);\n printSocialWebReadPayload(\n 'profile-update',\n payload as unknown as Record<string, unknown>,\n global,\n );\n });\n\n socialweb\n .command('search <query>')\n .description('Search social web accounts')\n .action(async (query: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebSearchInputSchema.safeParse({ query });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await searchSocialWeb(global, parsed.data.query);\n printSocialWebReadPayload('search', payload, global);\n });\n\n for (const entry of [\n ['notes', listNotes, 'Show note feed'],\n ['reader', listReader, 'Show reader feed'],\n ['notifications', listNotifications, 'Show notifications'],\n ['likes', listSocialWebLikes, 'Show liked posts'],\n ] as const) {\n socialweb\n .command(entry[0])\n .description(entry[2])\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebPaginatedInputSchema.safeParse(parsePagination(options));\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](\n global,\n {\n limit: parsed.data.limit,\n next: parsed.data.next,\n },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload(entry[0], payload, global);\n });\n }\n\n socialweb\n .command('notifications-count')\n .description('Show unread notification count')\n .action(async (_, command) => {\n const global = getGlobalOptions(command);\n const payload = await getNotificationsCount(global);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log(String(payload.count ?? 0));\n });\n\n socialweb\n .command('posts [handle]')\n .description('List posts for a social web account')\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (handle: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const handleValue = handle ?? 'me';\n const pagination = parsePagination(options);\n const parsedHandle = SocialWebProfileInputSchema.safeParse({ handle: handleValue });\n const parsedPagination = SocialWebPaginatedInputSchema.safeParse(pagination);\n if (!parsedHandle.success) {\n throwValidationError(parsedHandle.error);\n }\n if (!parsedPagination.success) {\n throwValidationError(parsedPagination.error);\n }\n\n const payload = await listSocialWebPosts(\n global,\n parsedHandle.data.handle,\n { limit: parsedPagination.data.limit, next: parsedPagination.data.next },\n Boolean(parsedPagination.data.all),\n );\n printSocialWebReadPayload('posts', payload, global);\n });\n\n for (const entry of [\n ['followers', listFollowers, 'List followers'],\n ['following', listFollowing, 'List following'],\n ] as const) {\n socialweb\n .command(`${entry[0]} [handle]`)\n .description(entry[2])\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (handle: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebFollowsInputSchema.safeParse({\n handle: handle ?? 'me',\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](\n global,\n parsed.data.handle,\n { limit: parsed.data.limit, next: parsed.data.next },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload(entry[0], payload, global);\n });\n }\n\n socialweb\n .command('post <id>')\n .description('Fetch a social web post by ActivityPub id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSocialWebPost(global, parsed.data.id);\n printSocialWebReadPayload('post', payload as unknown as Record<string, unknown>, global);\n });\n\n socialweb\n .command('thread <id>')\n .description('Fetch a post thread by ActivityPub id')\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getSocialWebThread(global, parsed.data.id);\n printSocialWebReadPayload('thread', payload, global);\n });\n\n for (const entry of [\n ['follow', followAccount, 'Follow an account'],\n ['unfollow', unfollowAccount, 'Unfollow an account'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <handle>`)\n .description(entry[2])\n .action(async (handle: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebHandleActionInputSchema.safeParse({ handle });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.handle);\n printSocialWebReadPayload(entry[0], payload, global);\n });\n }\n\n for (const entry of [\n ['like', likePost, 'Like a post'],\n ['unlike', unlikePost, 'Unlike a post'],\n ['repost', repostPost, 'Repost a post'],\n ['derepost', derepostPost, 'Undo repost on a post'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <id>`)\n .description(entry[2])\n .action(async (id: string, _options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log('OK');\n });\n }\n\n socialweb\n .command('delete <id>')\n .description('Delete a post')\n .option('--yes', 'Skip confirmation')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebDeleteInputSchema.safeParse({\n id,\n yes: parseBooleanFlag(options.yes),\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 confirmDestructiveAction(\n `Delete social web post '${parsed.data.id}'? [y/N]: `,\n {\n action: 'delete_socialweb_post',\n target: parsed.data.id,\n reversible: false,\n site: global.site ?? null,\n },\n );\n if (!ok) {\n throw new GhstError('Operation cancelled.', {\n code: 'OPERATION_CANCELLED',\n exitCode: ExitCode.OPERATION_CANCELLED,\n });\n }\n }\n\n const payload = await deleteSocialWebPost(global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log('Deleted post');\n });\n\n socialweb\n .command('note')\n .description('Create a social web note')\n .option('--content <text>', 'Note content')\n .option('--stdin', 'Read note content from stdin')\n .option('--image-file <path>', 'Attach an image from a local file')\n .option('--image-url <url>', 'Attach an image by URL')\n .option('--image-alt <text>', 'Image alt text')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebContentInputSchema.safeParse({\n content: options.content,\n stdin: parseBooleanFlag(options.stdin),\n imageFile: options.imageFile,\n imageUrl: options.imageUrl,\n imageAlt: options.imageAlt,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const stdin = await readOptionalStdin(parsed.data.stdin);\n const content = parsed.data.content ?? stdin;\n if (!content) {\n throw new GhstError('Note content cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const payload = await createNote(global, {\n content,\n imageFile: parsed.data.imageFile,\n imageUrl: parsed.data.imageUrl,\n imageAlt: parsed.data.imageAlt,\n });\n printSocialWebReadPayload('note', payload, global);\n });\n\n socialweb\n .command('reply <id>')\n .description('Reply to a social web post')\n .option('--content <text>', 'Reply content')\n .option('--stdin', 'Read reply content from stdin')\n .option('--image-file <path>', 'Attach an image from a local file')\n .option('--image-url <url>', 'Attach an image by URL')\n .option('--image-alt <text>', 'Image alt text')\n .action(async (id: string, options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebReplyInputSchema.safeParse({\n id,\n content: options.content,\n stdin: parseBooleanFlag(options.stdin),\n imageFile: options.imageFile,\n imageUrl: options.imageUrl,\n imageAlt: options.imageAlt,\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const stdin = await readOptionalStdin(parsed.data.stdin);\n const content = parsed.data.content ?? stdin;\n if (!content) {\n throw new GhstError('Reply content cannot be empty.', {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const payload = await replyToPost(global, parsed.data.id, {\n content,\n imageFile: parsed.data.imageFile,\n imageUrl: parsed.data.imageUrl,\n imageAlt: parsed.data.imageAlt,\n });\n printSocialWebReadPayload('reply', payload, global);\n });\n\n socialweb\n .command('blocked-accounts')\n .description('List blocked accounts')\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebFollowsInputSchema.safeParse({\n handle: 'me',\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await listBlockedAccounts(\n global,\n { limit: parsed.data.limit, next: parsed.data.next },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload('blocked-accounts', payload, global);\n });\n\n socialweb\n .command('blocked-domains')\n .description('List blocked domains')\n .option('--limit <number>', 'Items per page')\n .option('--next <cursor>', 'Pagination cursor')\n .option('--all', 'Fetch all available pages')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebFollowsInputSchema.safeParse({\n handle: 'me',\n limit: parseInteger(options.limit, 'limit'),\n next: options.next,\n all: parseBooleanFlag(options.all),\n });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await listBlockedDomains(\n global,\n { limit: parsed.data.limit, next: parsed.data.next },\n Boolean(parsed.data.all),\n );\n printSocialWebReadPayload('blocked-domains', payload, global);\n });\n\n for (const entry of [\n ['block', blockAccount, 'Block an account'],\n ['unblock', unblockAccount, 'Unblock an account'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <id>`)\n .description(entry[2])\n .action(async (id: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebIdInputSchema.safeParse({ id });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.id);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log('OK');\n });\n }\n\n for (const entry of [\n ['block-domain', blockDomain, 'Block a domain'],\n ['unblock-domain', unblockDomain, 'Unblock a domain'],\n ] as const) {\n socialweb\n .command(`${entry[0]} <url>`)\n .description(entry[2])\n .action(async (url: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebBlockDomainInputSchema.safeParse({ url });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await entry[1](global, parsed.data.url);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log('OK');\n });\n }\n\n socialweb\n .command('upload <filePath>')\n .description('Upload an image for social web notes and replies')\n .action(async (filePath: string, _, command) => {\n const global = getGlobalOptions(command);\n const parsed = SocialWebUploadInputSchema.safeParse({ filePath });\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n try {\n await fs.access(parsed.data.filePath);\n } catch {\n throw new GhstError(`File not found: ${parsed.data.filePath}`, {\n code: 'VALIDATION_ERROR',\n exitCode: ExitCode.VALIDATION_ERROR,\n });\n }\n\n const payload = await uploadSocialWebImage(global, parsed.data.filePath);\n if (global.json) {\n printJson(payload, global.jq);\n return;\n }\n console.log(String(payload.fileUrl ?? 'Uploaded image'));\n });\n}\n","import { z } from 'zod';\n\nconst HandleSchema = z\n .string()\n .min(1)\n .refine((value) => value === 'me' || /^@?[^@\\s]+@[^@\\s]+$/.test(value), {\n message: 'handle must be me or a federated handle like @user@domain',\n });\n\nconst UrlSchema = z.string().url();\n\nconst CursorSchema = z.string().min(1);\nconst LimitSchema = z.number().int().positive().max(100);\n\nconst PaginationSchema = z\n .object({\n limit: LimitSchema.optional(),\n next: CursorSchema.optional(),\n all: z.boolean().optional(),\n })\n .superRefine((value, context) => {\n if (value.all && value.next) {\n context.addIssue({\n code: 'custom',\n message: '--all cannot be combined with --next.',\n path: ['all'],\n });\n }\n });\n\nexport const SocialWebStatusInputSchema = z.object({});\n\nexport const SocialWebProfileInputSchema = z.object({\n handle: HandleSchema.default('me'),\n});\n\nexport const SocialWebProfileUpdateInputSchema = z\n .object({\n name: z.string().min(1).optional(),\n username: z.string().min(1).optional(),\n bio: z.string().optional(),\n avatarUrl: UrlSchema.optional(),\n bannerImageUrl: UrlSchema.optional(),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.username !== undefined ||\n value.bio !== undefined ||\n value.avatarUrl !== undefined ||\n value.bannerImageUrl !== undefined,\n {\n message: 'Provide at least one profile field to update.',\n path: ['name'],\n },\n );\n\nexport const SocialWebSearchInputSchema = z.object({\n query: z.string().min(1),\n});\n\nexport const SocialWebPaginatedInputSchema = PaginationSchema;\n\nexport const SocialWebFollowsInputSchema = z\n .object({\n handle: HandleSchema.default('me'),\n limit: LimitSchema.optional(),\n next: CursorSchema.optional(),\n all: z.boolean().optional(),\n })\n .superRefine((value, context) => {\n if (value.all && value.next) {\n context.addIssue({\n code: 'custom',\n message: '--all cannot be combined with --next.',\n path: ['all'],\n });\n }\n });\n\nexport const SocialWebHandleActionInputSchema = z.object({\n handle: HandleSchema.refine((value) => value !== 'me', {\n message: 'handle must be a federated handle like @user@domain',\n }),\n});\n\nexport const SocialWebIdInputSchema = z.object({\n id: UrlSchema,\n});\n\nexport const SocialWebDeleteInputSchema = z.object({\n id: UrlSchema,\n yes: z.boolean().optional(),\n});\n\nexport const SocialWebBlockDomainInputSchema = z.object({\n url: UrlSchema,\n});\n\nexport const SocialWebUploadInputSchema = z.object({\n filePath: z.string().min(1),\n});\n\nexport const SocialWebContentInputSchema = z\n .object({\n content: z.string().min(1).optional(),\n stdin: z.boolean().optional(),\n imageFile: z.string().min(1).optional(),\n imageUrl: UrlSchema.optional(),\n imageAlt: z.string().min(1).optional(),\n })\n .superRefine((value, context) => {\n const contentSources = [value.content !== undefined, value.stdin === true].filter(\n Boolean,\n ).length;\n if (contentSources !== 1) {\n context.addIssue({\n code: 'custom',\n message: 'Provide exactly one content source with --content or --stdin.',\n path: ['content'],\n });\n }\n\n const imageSources = [value.imageFile !== undefined, value.imageUrl !== undefined].filter(\n Boolean,\n ).length;\n if (imageSources > 1) {\n context.addIssue({\n code: 'custom',\n message: 'Provide at most one image source with --image-file or --image-url.',\n path: ['imageFile'],\n });\n }\n });\n\nexport const SocialWebReplyInputSchema = SocialWebContentInputSchema.extend({\n id: UrlSchema,\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 { assertFileDoesNotExist } from '../lib/file-guards.js';\nimport {\n formatCsv,\n isJsonMode,\n printJson,\n printStatsGrowthHuman,\n printStatsNewsletterClicksHuman,\n printStatsNewsletterSubscribersHuman,\n printStatsNewslettersHuman,\n printStatsOverviewHuman,\n printStatsPostGrowthHuman,\n printStatsPostHuman,\n printStatsPostNewsletterHuman,\n printStatsPostReferrersHuman,\n printStatsPostsHuman,\n printStatsPostWebHuman,\n printStatsWebHuman,\n printStatsWebTableHuman,\n} from '../lib/output.js';\nimport { parseInteger } from '../lib/parse.js';\nimport {\n getStatsGrowth,\n getStatsNewsletterClicks,\n getStatsNewsletterSubscribers,\n getStatsNewsletters,\n getStatsOverview,\n getStatsPost,\n getStatsPostGrowth,\n getStatsPostNewsletter,\n getStatsPostReferrers,\n getStatsPosts,\n getStatsPostWeb,\n getStatsWeb,\n getStatsWebTable,\n type StatsBreakdownRow,\n type StatsContentRow,\n type StatsNewsletterClicksReport,\n type StatsNewsletterSubscribersReport,\n type StatsNewslettersReport,\n type StatsPostGrowthReport,\n type StatsPostReferrersReport,\n type StatsPostsReport,\n type StatsWebTableReport,\n} from '../lib/stats.js';\nimport {\n StatsGrowthInputSchema,\n StatsNewsletterClicksInputSchema,\n StatsNewsletterSubscribersInputSchema,\n StatsNewslettersInputSchema,\n StatsOverviewInputSchema,\n StatsPostGrowthInputSchema,\n StatsPostInputSchema,\n StatsPostNewsletterInputSchema,\n StatsPostReferrersInputSchema,\n StatsPostsInputSchema,\n StatsPostWebInputSchema,\n StatsWebInputSchema,\n StatsWebTableInputSchema,\n} from '../schemas/stats.js';\n\nfunction throwValidationError(error: unknown): never {\n throw new GhstError(\n (error as { issues?: Array<{ message: string }> }).issues\n ?.map((issue) => issue.message)\n .join('; ') ?? 'Validation failed',\n {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n details: error,\n },\n );\n}\n\nfunction throwUsageError(message: string): never {\n throw new GhstError(message, {\n exitCode: ExitCode.USAGE_ERROR,\n code: 'USAGE_ERROR',\n });\n}\n\nfunction collectOption(value: string, previous: string[] = []): string[] {\n previous.push(value);\n return previous;\n}\n\nfunction parseRangeOptions(options: Record<string, unknown>) {\n return {\n range: options.range as string | undefined,\n from: options.from as string | undefined,\n to: options.to as string | undefined,\n timezone: options.timezone as string | undefined,\n };\n}\n\nfunction parseWebOptions(options: Record<string, unknown>) {\n return {\n ...parseRangeOptions(options),\n audience: options.audience as string | undefined,\n source: options.source as string | undefined,\n location: options.location as string | undefined,\n device: options.device as string | undefined,\n utmSource: options.utmSource as string | undefined,\n utmMedium: options.utmMedium as string | undefined,\n utmCampaign: options.utmCampaign as string | undefined,\n utmContent: options.utmContent as string | undefined,\n utmTerm: options.utmTerm as string | undefined,\n limit: parseInteger(options.limit as string | undefined, 'limit'),\n };\n}\n\nfunction assertCsvMode(\n global: ReturnType<typeof getGlobalOptions>,\n options: { csv?: boolean; output?: string },\n allowed: boolean,\n): void {\n const jsonMode = isJsonMode(global);\n\n if (!options.csv && options.output) {\n throw new GhstError('--output requires --csv.', {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n\n if (!allowed && options.csv) {\n throw new GhstError('--csv is only available on table-first analytics views.', {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n\n if (options.csv && jsonMode) {\n throw new GhstError('Cannot combine --csv with --json or --jq.', {\n exitCode: ExitCode.VALIDATION_ERROR,\n code: 'VALIDATION_ERROR',\n });\n }\n}\n\nfunction shouldPrintJson(global: ReturnType<typeof getGlobalOptions>): boolean {\n return isJsonMode(global);\n}\n\nfunction addRangeOptions(command: Command): Command {\n return command\n .option('--range <preset>', '7d|30d|90d|365d|all')\n .option('--from <YYYY-MM-DD>', 'Start date')\n .option('--to <YYYY-MM-DD>', 'End date')\n .option('--timezone <iana>', 'Timezone override');\n}\n\nfunction addWebFilterOptions(command: Command, includeLimit = true): Command {\n const next = command\n .option('--audience <audience>', 'all|free|paid')\n .option('--source <value>', 'Filter by traffic source')\n .option('--location <code>', 'Filter by country code')\n .option('--device <device>', 'desktop|mobile-ios|mobile-android|bot|unknown')\n .option('--utm-source <value>', 'Filter by UTM source')\n .option('--utm-medium <value>', 'Filter by UTM medium')\n .option('--utm-campaign <value>', 'Filter by UTM campaign')\n .option('--utm-content <value>', 'Filter by UTM content')\n .option('--utm-term <value>', 'Filter by UTM term')\n .addHelpText(\n 'after',\n '\\nFilter semantics: source and utm_* filters are session-scoped in Ghost analytics. Post and member-status filters are hit-scoped.',\n );\n\n if (includeLimit) {\n next.option('--limit <number>', 'Limit returned rows');\n }\n\n return next;\n}\n\nfunction webTableCsv(payload: StatsWebTableReport): string {\n if (payload.metric === 'content') {\n const rows = (payload.items as StatsContentRow[]).map((item) => [\n item.title,\n item.pathname,\n String(item.visits),\n String(item.pageviews),\n ]);\n return formatCsv(['title', 'pathname', 'visits', 'pageviews'], rows);\n }\n\n const rows = (payload.items as StatsBreakdownRow[]).map((item) => [\n item.label,\n String(item.visits),\n item.signups === null ? '' : String(item.signups),\n item.paid_conversions === null ? '' : String(item.paid_conversions),\n item.mrr === null ? '' : String(item.mrr),\n ]);\n return formatCsv(['label', 'visits', 'signups', 'paid_conversions', 'mrr'], rows);\n}\n\nfunction newslettersCsv(payload: StatsNewslettersReport): string {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_id,\n item.newsletter_name,\n item.newsletter_slug ?? '',\n String(item.sent_posts),\n String(item.recipients),\n String(item.open_rate),\n String(item.click_rate),\n String(item.subscribers),\n String(item.subscriber_delta),\n ]);\n return formatCsv(\n [\n 'newsletter_id',\n 'newsletter_name',\n 'newsletter_slug',\n 'sent_posts',\n 'recipients',\n 'open_rate',\n 'click_rate',\n 'subscribers',\n 'subscriber_delta',\n ],\n rows,\n );\n}\n\nfunction postsCsv(payload: StatsPostsReport): string {\n const rows = payload.posts.map((item) => [\n item.post_id,\n item.title,\n item.published_at ?? '',\n item.status ?? '',\n item.authors,\n String(item.views),\n item.sent_count === null ? '' : String(item.sent_count),\n item.opened_count === null ? '' : String(item.opened_count),\n item.open_rate === null ? '' : String(item.open_rate),\n String(item.clicked_count),\n item.click_rate === null ? '' : String(item.click_rate),\n String(item.members),\n String(item.free_members),\n String(item.paid_members),\n ]);\n return formatCsv(\n [\n 'post_id',\n 'title',\n 'published_at',\n 'status',\n 'authors',\n 'views',\n 'sent_count',\n 'opened_count',\n 'open_rate',\n 'clicked_count',\n 'click_rate',\n 'members',\n 'free_members',\n 'paid_members',\n ],\n rows,\n );\n}\n\nfunction newsletterClicksCsv(payload: StatsNewsletterClicksReport): string {\n const rows = payload.clicks.map((item) => [\n item.post_id ?? '',\n item.post_title,\n item.send_date ?? '',\n String(item.recipients),\n String(item.clicks),\n String(item.click_rate),\n ]);\n return formatCsv(\n ['post_id', 'post_title', 'send_date', 'recipients', 'clicks', 'click_rate'],\n rows,\n );\n}\n\nfunction newsletterSubscribersCsv(payload: StatsNewsletterSubscribersReport): string {\n const rows = payload.newsletters.map((item) => [\n item.newsletter_id,\n item.newsletter_name,\n item.newsletter_slug ?? '',\n String(item.subscribers),\n String(item.subscriber_delta),\n ]);\n return formatCsv(\n ['newsletter_id', 'newsletter_name', 'newsletter_slug', 'subscribers', 'subscriber_delta'],\n rows,\n );\n}\n\nfunction postGrowthCsv(payload: StatsPostGrowthReport): string {\n const rows = payload.growth.map((item) => [\n item.date,\n String(item.free_members),\n String(item.paid_members),\n String(item.mrr),\n ]);\n return formatCsv(['date', 'free_members', 'paid_members', 'mrr'], rows);\n}\n\nfunction postReferrersCsv(payload: StatsPostReferrersReport): string {\n const rows = payload.referrers.map((item) => [\n item.source,\n String(item.visits),\n String(item.signups),\n String(item.paid_conversions),\n String(item.mrr),\n ]);\n return formatCsv(['source', 'visits', 'signups', 'paid_conversions', 'mrr'], rows);\n}\n\nasync function emitCsv(csv: string, output?: string): Promise<void> {\n if (output) {\n await assertFileDoesNotExist(output);\n await fs.writeFile(output, `${csv}\\n`, 'utf8');\n return;\n }\n\n process.stdout.write(csv);\n if (!csv.endsWith('\\n')) {\n process.stdout.write('\\n');\n }\n}\n\nexport function registerStatsCommands(program: Command): void {\n const stats = program.command('stats').description('Analytics and reporting');\n\n addRangeOptions(stats.command('overview').description('Site analytics overview')).action(\n async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = StatsOverviewInputSchema.safeParse(\n parseRangeOptions(options as Record<string, unknown>),\n );\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsOverview(global, parsed.data);\n\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsOverviewHuman(payload, global.color !== false);\n },\n );\n\n addWebFilterOptions(\n addRangeOptions(stats.command('web [view]').description('Web traffic analytics')),\n )\n .option('--csv', 'Output CSV for table views')\n .option('--output <path>', 'Write CSV output to a file')\n .action(async (view: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const isTableView =\n view !== undefined &&\n [\n 'content',\n 'sources',\n 'locations',\n 'devices',\n 'utm-sources',\n 'utm-mediums',\n 'utm-campaigns',\n 'utm-contents',\n 'utm-terms',\n ].includes(view);\n assertCsvMode(global, { csv: options.csv, output: options.output }, isTableView);\n\n if (!view) {\n const parsed = StatsWebInputSchema.safeParse(\n parseWebOptions(options as Record<string, unknown>),\n );\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsWeb(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsWebHuman(payload, global.color !== false);\n return;\n }\n\n if (!isTableView) {\n throwUsageError(`Unsupported web analytics view: ${view}`);\n }\n\n const parsed = StatsWebTableInputSchema.safeParse(\n parseWebOptions(options as Record<string, unknown>),\n );\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsWebTable(global, view, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(webTableCsv(payload), options.output);\n return;\n }\n\n printStatsWebTableHuman(payload, global.color !== false);\n });\n\n addRangeOptions(stats.command('growth').description('Member and revenue growth'))\n .option('--limit <number>', 'Limit top source rows')\n .addHelpText(\n 'after',\n '\\nRange behavior: Ghost member_count and mrr only accept date_from, and subscriptions are returned as lifetime history. ghst clips those datasets client-side to the selected window.',\n )\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n const parsed = StatsGrowthInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n limit: parseInteger(options.limit as string | undefined, 'limit'),\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsGrowth(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsGrowthHuman(payload, global.color !== false);\n });\n\n addRangeOptions(stats.command('posts').description('Top posts by views'))\n .option('--limit <number>', 'Limit returned rows')\n .option('--csv', 'Output CSV')\n .option('--output <path>', 'Write CSV output to a file')\n .action(async (options, command) => {\n const global = getGlobalOptions(command);\n assertCsvMode(global, { csv: options.csv, output: options.output }, true);\n\n const parsed = StatsPostsInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 5,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPosts(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(postsCsv(payload), options.output);\n return;\n }\n\n printStatsPostsHuman(payload, global.color !== false);\n });\n\n const registerEmailAnalyticsCommand = (command: Command) => {\n addRangeOptions(command.description('Email analytics'))\n .option('--newsletter <id>', 'Scope to a newsletter')\n .option('--post <id>', 'Scope click stats to a post', collectOption, [])\n .option('--limit <number>', 'Limit returned rows')\n .option('--csv', 'Output CSV for table views')\n .option('--output <path>', 'Write CSV output to a file')\n .action(async (view: string | undefined, options, commandInstance) => {\n const global = getGlobalOptions(commandInstance);\n const isTableView = view === undefined || view === 'clicks' || view === 'subscribers';\n assertCsvMode(global, { csv: options.csv, output: options.output }, isTableView);\n\n if (!view) {\n const parsed = StatsNewslettersInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n newsletterId: options.newsletter as string | undefined,\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 10,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsNewsletters(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(newslettersCsv(payload), options.output);\n return;\n }\n\n printStatsNewslettersHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'clicks') {\n const parsed = StatsNewsletterClicksInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n newsletterId: options.newsletter as string | undefined,\n postIds:\n Array.isArray(options.post) && (options.post as string[]).length > 0\n ? (options.post as string[])\n : undefined,\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 10,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsNewsletterClicks(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(newsletterClicksCsv(payload), options.output);\n return;\n }\n\n printStatsNewsletterClicksHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'subscribers') {\n const parsed = StatsNewsletterSubscribersInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n newsletterId: options.newsletter as string | undefined,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsNewsletterSubscribers(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(newsletterSubscribersCsv(payload), options.output);\n return;\n }\n\n printStatsNewsletterSubscribersHuman(payload, global.color !== false);\n return;\n }\n\n throwUsageError(`Unsupported email analytics view: ${view}`);\n });\n };\n\n registerEmailAnalyticsCommand(stats.command('email [view]'));\n registerEmailAnalyticsCommand(\n stats.command('newsletters [view]').description('Email analytics (compatibility alias)'),\n );\n\n addWebFilterOptions(\n addRangeOptions(stats.command('post <id> [view]').description('Post analytics')),\n )\n .option('--csv', 'Output CSV for table views')\n .option('--output <path>', 'Write CSV output to a file')\n .addHelpText(\n 'after',\n '\\nRange behavior: `web` and `referrers` are date-scoped. Ghost post growth is returned as lifetime history and clipped client-side to the selected window. Post newsletter stats are scoped to the send date when a custom window is supplied.',\n )\n .action(async (id: string, view: string | undefined, options, command) => {\n const global = getGlobalOptions(command);\n const isTableView = view === 'growth' || view === 'referrers';\n assertCsvMode(global, { csv: options.csv, output: options.output }, isTableView);\n\n if (!view) {\n const parsed = StatsPostInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPost(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsPostHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'web') {\n const parsed = StatsPostWebInputSchema.safeParse({\n ...parseWebOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostWeb(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsPostWebHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'growth') {\n const parsed = StatsPostGrowthInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostGrowth(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(postGrowthCsv(payload), options.output);\n return;\n }\n\n printStatsPostGrowthHuman(payload, global.color !== false);\n return;\n }\n\n if (view === 'newsletter') {\n const parsed = StatsPostNewsletterInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostNewsletter(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n printStatsPostNewsletterHuman(payload);\n return;\n }\n\n if (view === 'referrers') {\n const parsed = StatsPostReferrersInputSchema.safeParse({\n ...parseRangeOptions(options as Record<string, unknown>),\n id,\n limit: parseInteger(options.limit as string | undefined, 'limit') ?? 10,\n });\n\n if (!parsed.success) {\n throwValidationError(parsed.error);\n }\n\n const payload = await getStatsPostReferrers(global, parsed.data);\n if (shouldPrintJson(global)) {\n printJson(payload, global.jq);\n return;\n }\n\n if (options.csv) {\n await emitCsv(postReferrersCsv(payload), options.output);\n return;\n }\n\n printStatsPostReferrersHuman(payload, global.color !== false);\n return;\n }\n\n throwUsageError(`Unsupported post analytics view: ${view}`);\n });\n}\n","import { z } from 'zod';\n\nconst RangePresetSchema = z.enum(['7d', '30d', '90d', '365d', 'all']);\nconst AudienceSchema = z.enum(['all', 'free', 'paid']);\nconst DeviceSchema = z.enum(['desktop', 'mobile-ios', 'mobile-android', 'bot', 'unknown']);\n\nfunction isValidDate(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n return false;\n }\n\n const parsed = new Date(`${value}T00:00:00.000Z`);\n return !Number.isNaN(parsed.getTime()) && parsed.toISOString().startsWith(value);\n}\n\nfunction isValidTimeZone(value: string): boolean {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: value }).format(new Date());\n return true;\n } catch {\n return false;\n }\n}\n\nconst DateSchema = z.string().refine(isValidDate, {\n message: 'Dates must use YYYY-MM-DD format.',\n});\n\nconst TimezoneSchema = z.string().min(1).refine(isValidTimeZone, {\n message: 'Timezone must be a valid IANA timezone name.',\n});\n\nconst LimitSchema = z.number().int().positive().max(100);\n\nconst RangeFieldsSchema = z.object({\n range: RangePresetSchema.optional(),\n from: DateSchema.optional(),\n to: DateSchema.optional(),\n timezone: TimezoneSchema.optional(),\n});\n\nfunction withRangeValidation<T extends z.ZodTypeAny>(schema: T): T {\n return schema.superRefine((data, context) => {\n const rangeData = data as { from?: string; to?: string };\n if (!rangeData.from || !rangeData.to) {\n return;\n }\n\n if (rangeData.from > rangeData.to) {\n context.addIssue({\n code: 'custom',\n message: '--from must be on or before --to.',\n path: ['from'],\n });\n }\n }) as T;\n}\n\nconst RangeInputSchema = withRangeValidation(RangeFieldsSchema);\n\nconst WebFilterSchema = z.object({\n audience: AudienceSchema.optional(),\n source: z.string().min(1).optional(),\n location: z\n .string()\n .trim()\n .min(2)\n .max(3)\n .transform((value) => value.toUpperCase())\n .optional(),\n device: DeviceSchema.optional(),\n utmSource: z.string().min(1).optional(),\n utmMedium: z.string().min(1).optional(),\n utmCampaign: z.string().min(1).optional(),\n utmContent: z.string().min(1).optional(),\n utmTerm: z.string().min(1).optional(),\n limit: LimitSchema.optional(),\n});\n\nexport const StatsOverviewInputSchema = RangeInputSchema;\n\nexport const StatsGrowthInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n limit: LimitSchema.optional(),\n }),\n);\n\nexport const StatsWebInputSchema = withRangeValidation(RangeFieldsSchema.merge(WebFilterSchema));\n\nexport const StatsWebTableInputSchema = withRangeValidation(\n RangeFieldsSchema.merge(WebFilterSchema).extend({\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsNewslettersInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n newsletterId: z.string().min(1).optional(),\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsPostsInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n limit: LimitSchema.default(5),\n }),\n);\n\nexport const StatsNewsletterClicksInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n newsletterId: z.string().min(1),\n postIds: z.array(z.string().min(1)).optional(),\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsNewsletterSubscribersInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n newsletterId: z.string().min(1).optional(),\n }),\n);\n\nexport const StatsPostInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n id: z.string().min(1),\n }),\n);\n\nexport const StatsPostGrowthInputSchema = StatsPostInputSchema;\n\nexport const StatsPostNewsletterInputSchema = StatsPostInputSchema;\n\nexport const StatsPostReferrersInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n id: z.string().min(1),\n limit: LimitSchema.default(10),\n }),\n);\n\nexport const StatsPostWebInputSchema = withRangeValidation(\n RangeFieldsSchema.extend({\n id: z.string().min(1),\n }).merge(WebFilterSchema),\n);\n\nexport type StatsOverviewInput = z.infer<typeof StatsOverviewInputSchema>;\nexport type StatsGrowthInput = z.infer<typeof StatsGrowthInputSchema>;\nexport type StatsWebInput = z.infer<typeof StatsWebInputSchema>;\nexport type StatsWebTableInput = z.infer<typeof StatsWebTableInputSchema>;\nexport type StatsNewslettersInput = z.infer<typeof StatsNewslettersInputSchema>;\nexport type StatsPostsInput = z.infer<typeof StatsPostsInputSchema>;\nexport type StatsNewsletterClicksInput = z.infer<typeof StatsNewsletterClicksInputSchema>;\nexport type StatsNewsletterSubscribersInput = z.infer<typeof StatsNewsletterSubscribersInputSchema>;\nexport type StatsPostInput = z.infer<typeof StatsPostInputSchema>;\nexport type StatsPostGrowthInput = z.infer<typeof StatsPostGrowthInputSchema>;\nexport type StatsPostNewsletterInput = z.infer<typeof StatsPostNewsletterInputSchema>;\nexport type StatsPostReferrersInput = z.infer<typeof StatsPostReferrersInputSchema>;\nexport type StatsPostWebInput = z.infer<typeof StatsPostWebInputSchema>;\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 { confirmDestructiveAction } 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 confirmDestructiveAction(`Delete tag '${parsed.data.id}'? [y/N]: `, {\n action: 'delete_tag',\n target: parsed.data.id,\n reversible: false,\n site: global.site ?? null,\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, getUploadedThemeName, 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 let resultPayload = payload;\n\n if (parsed.data.activate) {\n const name = getUploadedThemeName(payload);\n if (!name) {\n throw new GhstError(\n 'Theme uploaded, but activation could not determine the theme name.',\n {\n code: 'GENERAL_ERROR',\n exitCode: ExitCode.GENERAL_ERROR,\n },\n );\n }\n\n resultPayload = await activateTheme(global, name);\n }\n\n if (global.json) {\n printJson(resultPayload, global.jq);\n return;\n }\n\n printThemeHuman(resultPayload);\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, getUploadedThemeName, 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\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 { confirmDestructiveAction } 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 confirmDestructiveAction(`Delete webhook '${parsed.data.id}'? [y/N]: `, {\n action: 'delete_webhook',\n target: parsed.data.id,\n reversible: false,\n site: global.site ?? null,\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","process","key","fs","spawn","readline","chalk","readline","spawn","chalk","chalk","z","path","fs","path","path","getClient","fs","z","throwValidationError","getClient","z","throwValidationError","z","fs","path","getClient","fs","path","getClient","getClient","getClient","getClient","getClient","getClient","fs","path","IMAGE_MIME_BY_EXT","inferImageMimeType","path","contentType","text","fs","inferImageMimeType","path","getClient","getClient","rows","getClient","fs","path","getClient","fs","path","getClient","getClient","getClient","z","run","fs","fs","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","fs","z","UrlSchema","throwValidationError","readOptionalStdin","fs","fs","z","LimitSchema","throwValidationError","rows","fs","parsed","payload","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"]}
|