@myna-sh/cli 0.12.2 → 0.13.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/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/auth-check.ts","../src/config.ts","../src/output.ts","../src/client.ts","../src/runtime.ts","../src/util.ts","../src/commands/auth.ts","../src/commands/workspace.ts","../src/commands/schema.ts","../src/schema-loader.ts","../../schema/src/canonical.ts","../src/dsl-emit.ts","../src/git.ts","../src/content-files.ts","../src/commands/entries.ts","../src/commands/changes.ts","../src/commands/releases.ts","../src/commands/pull.ts","../../sdk/src/lock.ts","../../shared/src/lock.ts","../../shared/src/ids.ts","../../shared/src/dates.ts","../../shared/src/origins.ts","../../shared/src/plans.ts","../../shared/src/rank.ts","../../shared/src/release.ts","../../shared/src/lock.ts","../src/commands/previews.ts","../src/commands/assets.ts","../src/commands/admin.ts","../src/commands/doctor.ts","../src/registry.ts","../src/version.ts","../src/commands/update.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command, CommanderError } from \"commander\";\nimport { registerAuth } from \"./commands/auth.js\";\nimport { registerWorkspace } from \"./commands/workspace.js\";\nimport { registerSchema } from \"./commands/schema.js\";\nimport { registerEntries } from \"./commands/entries.js\";\nimport { registerChanges } from \"./commands/changes.js\";\nimport { registerReleases } from \"./commands/releases.js\";\nimport { registerPull } from \"./commands/pull.js\";\nimport { registerPreviews } from \"./commands/previews.js\";\nimport { registerAssets } from \"./commands/assets.js\";\nimport { registerAdmin } from \"./commands/admin.js\";\nimport { registerDoctor } from \"./commands/doctor.js\";\nimport { registerUpdate } from \"./commands/update.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { VERSION } from \"./version.js\";\n\nexport { VERSION };\n\nconst GLOBAL_VALUE_FLAGS = new Set([\"--project\", \"--organization\", \"--token\", \"--api-url\"]);\nconst GLOBAL_BOOL_FLAGS = new Set([\"--json\", \"--no-interactive\", \"--interactive\"]);\n\n/**\n * Hoist global flags (which may appear anywhere) to the front so Commander,\n * which only recognizes them on the root program, always parses them.\n */\nfunction normalizeGlobals(argv: string[]): string[] {\n const [node, script, ...rest] = argv;\n const globals: string[] = [];\n const remaining: string[] = [];\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i]!;\n const eq = arg.indexOf(\"=\");\n const name = eq === -1 ? arg : arg.slice(0, eq);\n if (GLOBAL_BOOL_FLAGS.has(name)) {\n globals.push(arg);\n } else if (GLOBAL_VALUE_FLAGS.has(name)) {\n if (eq === -1) {\n globals.push(arg);\n if (i + 1 < rest.length) globals.push(rest[++i]!);\n } else {\n globals.push(arg);\n }\n } else {\n remaining.push(arg);\n }\n }\n return [node!, script!, ...globals, ...remaining];\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"myna\")\n .description(\"Myna — content infrastructure for developers and agents\")\n .version(VERSION, \"-v, --version\")\n .option(\"--json\", \"emit a single machine-readable JSON value on stdout\")\n .option(\"--project <ref>\", \"project id or slug\")\n .option(\"--organization <ref>\", \"organization id or slug\")\n .option(\"--token <token>\", \"API token (overrides stored credentials)\")\n .option(\"--api-url <url>\", \"API base URL\")\n .option(\"--no-interactive\", \"disable prompts and browser opening\")\n .showHelpAfterError();\n\n registerAuth(program);\n registerDoctor(program);\n registerUpdate(program);\n registerWorkspace(program);\n registerSchema(program);\n registerEntries(program);\n registerSync(program);\n registerChanges(program);\n registerReleases(program);\n registerPull(program);\n registerPreviews(program);\n registerAssets(program);\n registerAdmin(program);\n\n return program;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const program = buildProgram();\n program.exitOverride();\n try {\n await program.parseAsync(normalizeGlobals(argv));\n } catch (error) {\n if (error instanceof CommanderError) {\n if (\n error.code === \"commander.helpDisplayed\" ||\n error.code === \"commander.version\" ||\n error.code === \"commander.help\"\n ) {\n process.exitCode = 0;\n return;\n }\n process.exitCode = 2;\n return;\n }\n process.stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n }\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /**\n * Maximum number of retries (in addition to the first attempt).\n * Defaults to 3 on a server and 1 in a browser — see `defaultMaxRetries`.\n */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n /**\n * Retries for transport-level failures (`fetch` rejecting outright).\n * Defaults to 1, and to 0 in a browser.\n *\n * In a browser these are usually permanent, not transient: a blocked CORS\n * response, a disallowed origin, an extension cancelling the request. They\n * are indistinguishable from a dropped connection — `fetch` rejects with an\n * opaque `TypeError` either way — so retrying converts one clear failure into\n * an identical wall of them, which is what buries the real cause.\n */\n maxNetworkRetries?: number;\n}\n\n/** Browsers get conservative retry defaults; servers keep the aggressive ones. */\nfunction inBrowser(): boolean {\n return typeof globalThis === \"object\" && \"document\" in globalThis;\n}\n\nfunction defaultMaxRetries(): number {\n return inBrowser() ? 1 : 3;\n}\n\nfunction defaultMaxNetworkRetries(): number {\n return inBrowser() ? 0 : 1;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries(),\n };\n }\n\n /**\n * Share one in-flight request between identical concurrent safe reads.\n *\n * Several components asking for the same collection on first paint is the\n * normal shape of a page, not a mistake, and issuing N identical requests\n * multiplies both latency and any failure. Only GET/HEAD are pooled, and only\n * while in flight — this is request coalescing, not a cache.\n */\n private readonly inFlight = new Map<string, Promise<Response>>();\n\n private dedupe(key: string, run: () => Promise<Response>): Promise<Response> {\n const existing = this.inFlight.get(key);\n // Each caller needs its own Response: a body can only be read once.\n if (existing) return existing.then((response) => response.clone());\n const started = run();\n this.inFlight.set(key, started);\n const cleanup = (): void => {\n if (this.inFlight.get(key) === started) this.inFlight.delete(key);\n };\n started.then(cleanup, cleanup);\n return started.then((response) => response.clone());\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const upper = method.toUpperCase();\n const safe = SAFE_METHODS.has(upper);\n const idempotent = safe || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n // Coalesce identical concurrent safe reads. Requests carrying a signal opt\n // out: one caller aborting must not cancel another's request.\n if (safe && !options.signal && (upper === \"GET\" || upper === \"HEAD\")) {\n const key = `${upper} ${url} ${token ?? \"\"}`;\n return this.dedupe(key, () => this.attempt(url, init, idempotent, options));\n }\n return this.attempt(url, init, idempotent, options);\n }\n\n private async attempt(\n url: string,\n init: RequestInit,\n idempotent: boolean,\n options: RequestOptions,\n ): Promise<Response> {\n let attempt = 0;\n let networkAttempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n // A rejected fetch is a transport failure, budgeted separately from\n // HTTP-level retries: in a browser it is usually permanent (CORS, a\n // blocked request), and repeating it only multiplies the noise.\n if (\n idempotent &&\n networkAttempt < this.retry.maxNetworkRetries &&\n attempt < this.retry.maxRetries &&\n !isAbort(error)\n ) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n networkAttempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n SimilarAssetContract,\n SimilarAssetsResponse,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetDiffResponse,\n ChangeSetReviewContract,\n ProjectCheckContract,\n RebaseChangeSetRequest,\n RebaseChangeSetResponse,\n ReportCheckResultRequest,\n UpsertProjectCheckRequest,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n ReleaseContract,\n RevertReleaseRequest,\n RevertReleaseResponse,\n} from \"../../api-contracts/src/releases.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n TranslationCoverageResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n ReorderEntriesRequest,\n ReorderEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n AccessCheckResponse,\n CorsCheckResponse,\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n /**\n * Paged GET. Extra filters are merged into the query rather than appended to\n * the path: the client builds its own query string from `options.query`, so a\n * path that already carries one produces `?a=1?limit=25` — a second `?` that\n * silently becomes part of the previous value.\n */\n private async page<T>(\n path: string,\n opts: ListOptions = {},\n filters: Record<string, unknown> = {},\n ): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n /** Why a browser at `origin` can or cannot read this project's content. */\n corsCheck: (\n project: string,\n origin: string,\n collection?: string,\n signal?: AbortSignal,\n ): Promise<CorsCheckResponse> =>\n this.get<CorsCheckResponse>(\n `/projects/${enc(project)}/cors-check`,\n collection ? { origin, collection } : { origin },\n signal,\n ),\n /**\n * Why a call into this project would be denied: whether the credential\n * holds a capability, whether it is confined to other collections, and\n * whether the collection exists at all.\n */\n access: (\n project: string,\n opts: { capability?: string; collection?: string } = {},\n signal?: AbortSignal,\n ): Promise<AccessCheckResponse> =>\n this.get<AccessCheckResponse>(\n `/projects/${enc(project)}/access`,\n { capability: opts.capability, collection: opts.collection },\n signal,\n ),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n /** What is still untranslated in a collection, per project locale. */\n translations: (project: string, key: string, signal?: AbortSignal): Promise<TranslationCoverageResponse> =>\n this.get<TranslationCoverageResponse>(\n `/projects/${enc(project)}/collections/${enc(key)}/translations`,\n undefined,\n signal,\n ),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n // Environments as projects\n drift: (project: string, against: string, signal?: AbortSignal): Promise<SchemaDriftResponse> =>\n this.get<SchemaDriftResponse>(`/projects/${enc(project)}/schema/drift`, { against }, signal),\n promote: (\n project: string,\n fromProject: string,\n opts: { allowDestructive?: boolean } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/promote`, {\n fromProject,\n allowDestructive: opts.allowDestructive ?? false,\n confirm: true,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string; q?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n q: opts.q,\n }),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n /**\n * Set a collection's editorial order. Not staged on a change set — ranks\n * are arrangement rather than content and take effect immediately, which\n * is why `confirm` is required.\n */\n reorder: (\n project: string,\n collection: string,\n body: Omit<ReorderEntriesRequest, \"confirm\">,\n ): Promise<ReorderEntriesResponse> =>\n this.mutate<ReorderEntriesResponse>(\n \"POST\",\n `/projects/${enc(project)}/collections/${enc(collection)}/reorder`,\n { ...body, confirm: true },\n ),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n /** Report a verdict Myna cannot compute, against the current contents. */\n reportCheck: (\n project: string,\n changeSet: string,\n name: string,\n body: ReportCheckResultRequest,\n ): Promise<ChangeSetCheckContract> =>\n this.mutate<ChangeSetCheckContract>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/${enc(name)}`,\n body,\n ),\n /** Field-level before/after for everything this change set would change. */\n /**\n * Replay the change set's edits on top of what is published now.\n *\n * Refuses by default when a field changed on both sides; pass\n * `onConflict` to take one side, or `dryRun` to see the plan first.\n */\n rebase: (\n project: string,\n changeSet: string,\n body: RebaseChangeSetRequest = {},\n ): Promise<RebaseChangeSetResponse> =>\n this.mutate<RebaseChangeSetResponse>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/rebase`,\n body,\n ),\n diff: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetDiffResponse> =>\n this.get<ChangeSetDiffResponse>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/diff`,\n undefined,\n signal,\n ),\n };\n\n // --- Releases -------------------------------------------------------------\n /**\n * What shipped, and how to take it back.\n *\n * `revert` returns an open change set rather than publishing: it goes through\n * the same review, preview, and gate path as anything written by hand.\n */\n readonly releases = {\n list: (project: string, opts: ListOptions = {}): Promise<Page<ReleaseContract>> =>\n this.page<ReleaseContract>(`/projects/${enc(project)}/releases`, opts),\n /** `release` is a release number or the published change set's id. */\n get: (project: string, release: string | number, signal?: AbortSignal): Promise<ReleaseContract> =>\n this.get<ReleaseContract>(`/projects/${enc(project)}/releases/${enc(String(release))}`, undefined, signal),\n revert: (\n project: string,\n release: string | number,\n body: RevertReleaseRequest = {},\n ): Promise<RevertReleaseResponse> =>\n this.mutate<RevertReleaseResponse>(\n \"POST\",\n `/projects/${enc(project)}/releases/${enc(String(release))}/revert`,\n body,\n ),\n };\n\n // --- Declared external checks ---------------------------------------------\n readonly checks = {\n list: (project: string, signal?: AbortSignal): Promise<ProjectCheckContract[]> =>\n this.get<ProjectCheckContract[]>(`/projects/${enc(project)}/checks`, undefined, signal),\n declare: (project: string, body: UpsertProjectCheckRequest): Promise<ProjectCheckContract> =>\n this.mutate<ProjectCheckContract>(\"POST\", `/projects/${enc(project)}/checks`, body),\n remove: (project: string, name: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/checks/${enc(name)}`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (\n project: string,\n opts: ListOptions & { tag?: string; checksum?: string; orphaned?: boolean } = {},\n ): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts, {\n tag: opts.tag,\n checksum: opts.checksum,\n orphaned: opts.orphaned ? \"true\" : undefined,\n }),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n /**\n * Assets that look like the same picture, by perceptual hash — a resized or\n * re-encoded copy, which `checksum` cannot see. `maxDistance` is in bits out\n * of 64 (default 5, maximum 16).\n */\n similar: (\n project: string,\n asset: string,\n opts: { maxDistance?: number; limit?: number } = {},\n signal?: AbortSignal,\n ): Promise<SimilarAssetContract[]> =>\n this.get<SimilarAssetsResponse>(\n `/projects/${enc(project)}/assets/${enc(asset)}/similar`,\n {\n maxDistance: opts.maxDistance === undefined ? undefined : String(opts.maxDistance),\n limit: opts.limit === undefined ? undefined : String(opts.limit),\n },\n signal,\n ).then((r) => r.similar),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(`/projects/${enc(project)}/activity`, opts, {\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n });\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted.map((c) => registryEntry(c)).join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\n${REGISTRY_DOC}\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nconst REGISTRY_DOC = [\n \"/**\",\n \" * Collection registry consumed by `createMyna<MynaCollections>()`.\",\n \" *\",\n \" * `fields` types the entry payload; `sortable` and `reference` carry the\",\n \" * distinctions the field types alone cannot express — a markdown body and a\",\n \" * text title are both `string`, but only one of them can be ordered on.\",\n \" */\",\n].join(\"\\n\");\n\n/**\n * Fields the query engine can order and filter by: scalars, excluding localized\n * fields, which hold one value per locale rather than a comparable value. This\n * mirrors `SCALAR_TYPES` in the API's public content service; the two must agree\n * or the types will promise a query the server rejects.\n */\nconst SORTABLE_TYPES = new Set([\"text\", \"number\", \"boolean\", \"date\", \"datetime\", \"slug\"]);\n\nfunction registryEntry(collection: CollectionSchema): string {\n const sortable = collection.fields\n .filter((f) => SORTABLE_TYPES.has(f.type) && !f.localized)\n .map((f) => JSON.stringify(f.key));\n const references = collection.fields\n .filter((f) => f.type === \"reference\")\n .map((f) => JSON.stringify(f.key));\n return [\n ` ${JSON.stringify(collection.name)}: {`,\n ` fields: ${pascal(collection.name)};`,\n ` sortable: ${sortable.length > 0 ? sortable.join(\" | \") : \"never\"};`,\n ` reference: ${references.length > 0 ? references.join(\" | \") : \"never\"};`,\n ` };`,\n ].join(\"\\n\");\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import type { MetaResponse, WhoamiResponse } from \"@myna-sh/api-contracts\";\nimport type { TokenSource } from \"./config.js\";\n\n/**\n * Credential and server checks shared by `whoami`, `auth verify`, and `doctor`.\n *\n * The rule these enforce: **a stored credential is not an authenticated one.**\n * Reporting \"authenticated\" because a token file exists is how an agent ends up\n * confidently issuing calls that every endpoint answers with 401. Everything\n * here validates against the API and reports presence and validity as separate\n * facts.\n */\n\nexport interface CredentialStatus {\n apiUrl: string;\n /** A credential was found (flag, environment, or stored). */\n credentialPresent: boolean;\n /** The API accepted it. False whenever it was not verified successfully. */\n credentialValid: boolean;\n source: TokenSource;\n identity: WhoamiResponse | null;\n /** Why validation failed, when it did. */\n error: { code: string; detail: string } | null;\n}\n\ninterface ProblemBody {\n code?: string;\n detail?: string;\n title?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction timeoutSignal(ms: number): AbortSignal {\n return AbortSignal.timeout(ms);\n}\n\n/**\n * Read the server's capability descriptor. Returns undefined when the API is\n * unreachable or too old to expose `/v1/meta`, which callers report as its own\n * diagnosis rather than conflating with an auth failure.\n */\nexport async function fetchMeta(\n apiUrl: string,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<MetaResponse | undefined> {\n try {\n const res = await fetch(`${apiUrl}/v1/meta`, {\n headers: { accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { data?: MetaResponse };\n return body.data;\n } catch {\n return undefined;\n }\n}\n\n/** Validate a credential against the API. Never throws: the failure is the answer. */\nexport async function checkCredential(\n apiUrl: string,\n token: string | undefined,\n source: TokenSource,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<CredentialStatus> {\n const base: CredentialStatus = {\n apiUrl,\n credentialPresent: Boolean(token),\n credentialValid: false,\n source,\n identity: null,\n error: null,\n };\n\n if (!token) {\n return { ...base, error: { code: \"NO_CREDENTIAL\", detail: \"No credential found.\" } };\n }\n\n try {\n const res = await fetch(`${apiUrl}/v1/auth/whoami`, {\n headers: { authorization: `Bearer ${token}`, accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n const body = (await res.json().catch(() => ({}))) as { data?: WhoamiResponse } & ProblemBody;\n if (!res.ok || !body.data) {\n return {\n ...base,\n error: {\n code: body.code ?? `HTTP_${res.status}`,\n detail: body.detail ?? body.title ?? `The API rejected the credential (${res.status}).`,\n },\n };\n }\n return { ...base, credentialValid: true, identity: body.data };\n } catch (error) {\n // Unreachable API is not an invalid credential. Say which one it is.\n return {\n ...base,\n error: {\n code: \"UNREACHABLE\",\n detail: `Could not reach ${apiUrl}: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n }\n}\n\n/** Human-readable one-liner for an identity. */\nexport function describeIdentity(identity: WhoamiResponse): string {\n switch (identity.credential) {\n case \"user\":\n return `user ${identity.user.username ?? identity.user.email}`;\n case \"api_key\":\n return `API key${identity.label ? ` \"${identity.label}\"` : \"\"} (${identity.scopes.length} scope(s))`;\n case \"preview\":\n return \"preview token\";\n }\n}\n\n/** Scopes carried by the credential, or undefined when scopes do not apply. */\nexport function scopesOf(identity: WhoamiResponse | null): string[] | undefined {\n return identity?.credential === \"api_key\" ? identity.scopes : undefined;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync, rmSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/**\n * Configuration resolution and credential storage (SPEC 11).\n *\n * Resolution order for every value: explicit flag > environment variable >\n * linked project (`.myna/project.json`) > user default (`config.json`).\n * Credentials are never written to the linked project file; they live in the OS\n * keychain when possible, otherwise a `0600` config file.\n */\n\nexport const DEFAULT_API_URL = \"https://api.myna.sh\";\nconst KEYCHAIN_SERVICE = \"sh.myna.cli\";\n\nexport interface GlobalFlags {\n apiUrl?: string;\n project?: string;\n organization?: string;\n token?: string;\n json?: boolean;\n interactive?: boolean;\n}\n\nexport interface LinkedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n}\n\nexport interface UserConfig {\n apiUrl?: string;\n defaultOrganization?: string;\n defaultProject?: string;\n}\n\n/** Where the active credential came from — reported by `whoami` and `doctor`. */\nexport type TokenSource = \"flag\" | \"environment\" | \"stored\" | \"none\";\n\nexport interface ResolvedContext {\n apiUrl: string;\n token: string | undefined;\n tokenSource: TokenSource;\n project: string | undefined;\n organization: string | undefined;\n json: boolean;\n interactive: boolean;\n linked: LinkedProject | undefined;\n linkedRoot: string | undefined;\n}\n\nfunction configDir(): string {\n const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n return join(base, \"myna\");\n}\n\nfunction configFile(): string {\n return join(configDir(), \"config.json\");\n}\n\nfunction credentialsFile(): string {\n return join(configDir(), \"credentials.json\");\n}\n\nexport function readUserConfig(): UserConfig {\n try {\n return JSON.parse(readFileSync(configFile(), \"utf8\")) as UserConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeUserConfig(patch: Partial<UserConfig>): UserConfig {\n const current = readUserConfig();\n const next = { ...current, ...patch };\n ensureDir(configDir());\n writeFileSync(configFile(), JSON.stringify(next, null, 2) + \"\\n\");\n return next;\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n\n// --- Linked project ---------------------------------------------------------\n\nexport function findLinkedProject(startDir = process.cwd()): { linked: LinkedProject; root: string } | undefined {\n let dir = resolve(startDir);\n for (;;) {\n const file = join(dir, \".myna\", \"project.json\");\n if (existsSync(file)) {\n try {\n const linked = JSON.parse(readFileSync(file, \"utf8\")) as LinkedProject;\n return { linked, root: dir };\n } catch {\n return undefined;\n }\n }\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\nexport function writeLinkedProject(root: string, linked: LinkedProject): void {\n const dir = join(root, \".myna\");\n ensureDir(dir);\n writeFileSync(join(dir, \"project.json\"), JSON.stringify(linked, null, 2) + \"\\n\");\n}\n\nexport function removeLinkedProject(root: string): boolean {\n const file = join(root, \".myna\", \"project.json\");\n if (existsSync(file)) {\n rmSync(file);\n return true;\n }\n return false;\n}\n\n// --- Credential storage -----------------------------------------------------\n\nfunction isMac(): boolean {\n return platform() === \"darwin\";\n}\n\nfunction keychainAccount(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, \"\");\n}\n\nexport function storeToken(apiUrl: string, token: string): \"keychain\" | \"file\" {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\n \"security\",\n [\"add-generic-password\", \"-U\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\", token],\n { stdio: \"ignore\" },\n );\n return \"keychain\";\n } catch {\n // Fall through to file storage.\n }\n }\n const file = credentialsFile();\n const store = readCredentialFile();\n store[account] = token;\n ensureDir(configDir());\n writeFileSync(file, JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(file, 0o600);\n return \"file\";\n}\n\nexport function loadToken(apiUrl: string): string | undefined {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n const out = execFileSync(\n \"security\",\n [\"find-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\"],\n { stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n const token = out.toString(\"utf8\").trim();\n if (token) return token;\n } catch {\n // Not in keychain; try file.\n }\n }\n return readCredentialFile()[account];\n}\n\nexport function clearToken(apiUrl: string): void {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\"security\", [\"delete-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account], {\n stdio: \"ignore\",\n });\n } catch {\n // Ignore.\n }\n }\n const store = readCredentialFile();\n if (account in store) {\n delete store[account];\n writeFileSync(credentialsFile(), JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(credentialsFile(), 0o600);\n }\n}\n\nfunction readCredentialFile(): Record<string, string> {\n try {\n return JSON.parse(readFileSync(credentialsFile(), \"utf8\")) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\n// --- Resolution -------------------------------------------------------------\n\nexport function resolveContext(flags: GlobalFlags): ResolvedContext {\n const link = findLinkedProject();\n const user = readUserConfig();\n\n const apiUrl =\n flags.apiUrl ??\n process.env.MYNA_API_URL ??\n link?.linked.apiUrl ??\n user.apiUrl ??\n DEFAULT_API_URL;\n\n const stored = loadToken(apiUrl);\n const token = flags.token ?? process.env.MYNA_TOKEN ?? stored;\n const tokenSource: TokenSource = flags.token\n ? \"flag\"\n : process.env.MYNA_TOKEN\n ? \"environment\"\n : stored\n ? \"stored\"\n : \"none\";\n\n const project =\n flags.project ??\n process.env.MYNA_PROJECT ??\n link?.linked.project ??\n user.defaultProject;\n\n const organization =\n flags.organization ??\n process.env.MYNA_ORGANIZATION ??\n link?.linked.organization ??\n user.defaultOrganization;\n\n return {\n apiUrl: apiUrl.replace(/\\/+$/, \"\"),\n token,\n tokenSource,\n project,\n organization,\n json: Boolean(flags.json),\n interactive: flags.interactive !== false && process.stdout.isTTY === true,\n linked: link?.linked,\n linkedRoot: link?.root,\n };\n}\n","import { isMynaApiError } from \"@myna-sh/sdk/management\";\n\n/** Structured output, tables, and exit-code discipline (SPEC 11). */\n\nexport const CLI_JSON_VERSION = 1;\n\n/** Usage error → exit code 2. */\nexport class UsageError extends Error {}\n\n/** Operational error → exit code 1. */\nexport class CliError extends Error {}\n\nexport interface OutputMode {\n json: boolean;\n}\n\nlet mode: OutputMode = { json: false };\n\nexport function setOutputMode(next: OutputMode): void {\n mode = next;\n}\n\nexport function isJson(): boolean {\n return mode.json;\n}\n\n/** Diagnostics go to stderr and are suppressed in JSON mode. */\nexport function diag(message: string): void {\n if (!mode.json) process.stderr.write(message + \"\\n\");\n}\n\n/** Emit the single result value. JSON mode prints one versioned document. */\nexport function emit(value: unknown, human?: () => void): void {\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, data: value }) + \"\\n\");\n return;\n }\n if (human) {\n human();\n } else {\n process.stdout.write(prettyValue(value) + \"\\n\");\n }\n}\n\n/** Render an error and return the process exit code. */\nexport function reportError(error: unknown): number {\n if (isMynaApiError(error)) {\n const problem = {\n code: error.code,\n status: error.status,\n title: error.title,\n detail: error.detail,\n requestId: error.requestId,\n fields: error.fields,\n };\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, error: problem }) + \"\\n\");\n } else {\n process.stderr.write(`error: ${error.code} — ${error.detail ?? error.title}\\n`);\n for (const f of error.fields ?? []) {\n process.stderr.write(` · ${f.path}: ${f.message}\\n`);\n }\n if (error.requestId) process.stderr.write(` requestId: ${error.requestId}\\n`);\n }\n return 1;\n }\n\n const usage = error instanceof UsageError;\n const message = error instanceof Error ? error.message : String(error);\n if (mode.json) {\n process.stdout.write(\n JSON.stringify({ version: CLI_JSON_VERSION, error: { code: usage ? \"USAGE\" : \"ERROR\", detail: message } }) + \"\\n\",\n );\n } else {\n process.stderr.write(`error: ${message}\\n`);\n }\n return usage ? 2 : 1;\n}\n\n// --- Human tables -----------------------------------------------------------\n\nexport interface Column<T> {\n header: string;\n value: (row: T) => string;\n}\n\nexport function table<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(none)\\n\");\n return;\n }\n const headers = columns.map((c) => c.header);\n const cells = rows.map((r) => columns.map((c) => c.value(r) ?? \"\"));\n const widths = headers.map((h, i) => Math.max(h.length, ...cells.map((row) => stripLen(row[i] ?? \"\"))));\n const line = (values: string[]): string =>\n values.map((v, i) => pad(v, widths[i] ?? v.length)).join(\" \").replace(/\\s+$/, \"\");\n process.stdout.write(line(headers) + \"\\n\");\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n for (const row of cells) process.stdout.write(line(row) + \"\\n\");\n}\n\nexport function keyValues(pairs: Array<[string, string]>): void {\n const width = Math.max(...pairs.map(([k]) => k.length));\n for (const [k, v] of pairs) {\n process.stdout.write(`${pad(k + \":\", width + 1)} ${v}\\n`);\n }\n}\n\nfunction pad(value: string, width: number): string {\n const len = stripLen(value);\n return len >= width ? value : value + \" \".repeat(width - len);\n}\n\nfunction stripLen(value: string): number {\n return value.length;\n}\n\nfunction prettyValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value, null, 2);\n}\n","import { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\nimport { resolveContext, type GlobalFlags, type ResolvedContext } from \"./config.js\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Per-command context: resolved config plus lazily-built API clients. */\nexport interface Ctx extends ResolvedContext {\n management(): ManagementClient;\n requireProject(): string;\n requireOrganization(): string;\n}\n\nexport function buildContext(flags: GlobalFlags): Ctx {\n const resolved = resolveContext(flags);\n let mgmt: ManagementClient | undefined;\n\n return {\n ...resolved,\n management(): ManagementClient {\n if (!resolved.token) {\n throw new CliError(\"Not authenticated. Run `myna login` or pass --token / set MYNA_TOKEN.\");\n }\n mgmt ??= createManagementClient({ token: resolved.token, apiUrl: resolved.apiUrl });\n return mgmt;\n },\n requireProject(): string {\n if (!resolved.project) {\n throw new UsageError(\"No project selected. Pass --project, set MYNA_PROJECT, or run `myna link`.\");\n }\n return resolved.project;\n },\n requireOrganization(): string {\n if (!resolved.organization) {\n throw new UsageError(\"No organization selected. Pass --organization or set a default with `myna organizations use`.\");\n }\n return resolved.organization;\n },\n };\n}\n","import type { Command } from \"commander\";\nimport { buildContext, type Ctx } from \"./client.js\";\nimport type { GlobalFlags } from \"./config.js\";\nimport { reportError, setOutputMode } from \"./output.js\";\n\n/**\n * Wrap a command action: build the resolved context, set the output mode from\n * `--json`, run the handler, and translate thrown errors into exit codes.\n */\nexport function handle(\n fn: (ctx: Ctx, args: unknown[], opts: Record<string, unknown>) => Promise<void>,\n): (...cbArgs: unknown[]) => Promise<void> {\n return async (...cbArgs: unknown[]): Promise<void> => {\n const command = cbArgs[cbArgs.length - 1] as Command;\n const ctx = buildContext(command.optsWithGlobals() as GlobalFlags);\n setOutputMode({ json: ctx.json });\n try {\n await fn(ctx, command.processedArgs as unknown[], command.opts());\n } catch (error) {\n process.exitCode = reportError(error);\n }\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Parse `--data <json-or-@file>` into an object. */\nexport function parseData(input: string | undefined): Record<string, unknown> {\n if (!input) return {};\n const raw = input.startsWith(\"@\") ? readFileSync(input.slice(1), \"utf8\") : input;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new UsageError(`Invalid JSON for --data: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new UsageError(\"--data must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Apply `--set path=value` assignments (dot paths, JSON-or-string values). */\nexport function applySets(target: Record<string, unknown>, sets: string[] | undefined): Record<string, unknown> {\n if (!sets) return target;\n for (const assignment of sets) {\n const eq = assignment.indexOf(\"=\");\n if (eq === -1) throw new UsageError(`Invalid --set \"${assignment}\". Expected path=value.`);\n const path = assignment.slice(0, eq);\n const rawValue = assignment.slice(eq + 1);\n let value: unknown;\n try {\n value = JSON.parse(rawValue);\n } catch {\n value = rawValue;\n }\n setPath(target, path.split(\".\"), value);\n }\n return target;\n}\n\nfunction setPath(obj: Record<string, unknown>, parts: string[], value: unknown): void {\n let cursor: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof cursor[key] !== \"object\" || cursor[key] === null) cursor[key] = {};\n cursor = cursor[key] as Record<string, unknown>;\n }\n cursor[parts[parts.length - 1]!] = value;\n}\n\n/** Open a URL in the default browser (best effort; never throws). */\nexport function openBrowser(url: string): void {\n const cmd = platform() === \"darwin\" ? \"open\" : platform() === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform() === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n execFile(cmd, args, () => undefined);\n}\n\nexport interface EntryRef {\n collection?: string;\n slugOrId: string;\n}\n\n/** Parse `<collection>/<slug-or-id>` or a bare entry id. */\nexport function parseEntryRef(ref: string): EntryRef {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return { slugOrId: ref };\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return { slugOrId: ref };\n return { collection: ref.slice(0, slash), slugOrId: ref.slice(slash + 1) };\n}\n\n/** Resolve an entry ref to a concrete entry id, listing by slug when needed. */\nexport async function resolveEntryId(\n mgmt: ManagementClient,\n project: string,\n ref: string,\n): Promise<string> {\n const parsed = parseEntryRef(ref);\n if (parsed.slugOrId.startsWith(\"ent_\")) return parsed.slugOrId;\n if (!parsed.collection) {\n throw new UsageError(`Provide the entry as <collection>/<slug> or an ent_ id (got \"${ref}\").`);\n }\n let cursor: string | undefined;\n for (let guard = 0; guard < 50; guard++) {\n const page = await mgmt.entries.list(project, { collection: parsed.collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === parsed.slugOrId || e.id === parsed.slugOrId);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new CliError(`Entry not found: ${ref}`);\n}\n","import type { Command } from \"commander\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { checkCredential, describeIdentity } from \"../auth-check.js\";\nimport { clearToken, loadToken, storeToken } from \"../config.js\";\nimport { CliError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\ninterface DeviceStart {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface DeviceToken {\n status: \"pending\" | \"approved\" | \"denied\" | \"expired\";\n token?: string;\n}\n\nasync function apiPost<T>(apiUrl: string, path: string, body: unknown): Promise<T> {\n const res = await fetch(`${apiUrl}/v1${path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify(body),\n });\n const json = (await res.json().catch(() => ({}))) as { data?: T; detail?: string };\n if (!res.ok) throw new CliError(json.detail ?? `Request failed (${res.status}).`);\n return json.data as T;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\nfunction startDevice(apiUrl: string): Promise<DeviceStart> {\n return apiPost<DeviceStart>(apiUrl, \"/auth/device\", {});\n}\n\nfunction pollDevice(apiUrl: string, deviceCode: string): Promise<DeviceToken> {\n return apiPost<DeviceToken>(apiUrl, `/auth/device/${deviceCode}/token`, { deviceCode });\n}\n\n/**\n * Why a call would be denied, before spending another one finding out.\n *\n * Lives under `auth` because the question is about the credential, not the\n * content: a 403 and a 404 are the same \"no\" from the outside, and the three\n * causes behind them — a missing capability, a collection confinement, a\n * resource that is not there — have three different fixes.\n */\nfunction registerAccess(program: Command): void {\n program\n .command(\"access\")\n .description(\"Explain what this credential may do in a project, and why a call was denied\")\n .option(\"--capability <cap>\", \"capability to check, e.g. content:publish\")\n .option(\"--collection <key>\", \"collection the denied call touched\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const access = await ctx.management().projects.access(project, {\n capability: opts.capability as string | undefined,\n collection: opts.collection as string | undefined,\n });\n emit(access, () => {\n keyValues([\n [\"Project\", access.projectSlug],\n [\"Credential\", access.credential + (access.role ? ` (${access.role})` : \"\")],\n [\"Capabilities\", access.capabilities.join(\", \") || \"(none)\"],\n [\"Collections\", access.allowedCollections?.join(\", \") ?? \"all\"],\n ]);\n for (const check of access.checks) {\n diag(` ${check.ok ? \"ok \" : \"fail\"} ${check.id} — ${check.detail}`);\n }\n if (access.remedy) diag(`\\n remedy: ${access.remedy}`);\n });\n if (!access.allowed) process.exitCode = 1;\n }),\n );\n}\n\nexport function registerAuth(program: Command): void {\n registerAccess(program);\n const login = program\n .command(\"login\")\n .description(\"Authenticate via the browser device-authorization flow\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n diag(`\\n To authenticate, open:\\n ${start.verificationUri}\\n and enter the code: ${start.userCode}\\n`);\n if (ctx.interactive) openBrowser(start.verificationUri);\n\n const deadline = Date.now() + start.expiresIn * 1000;\n let token: string | undefined;\n while (Date.now() < deadline) {\n await sleep(Math.max(1, start.interval) * 1000);\n const poll = await pollDevice(ctx.apiUrl, start.deviceCode);\n if (poll.status === \"approved\" && poll.token) {\n token = poll.token;\n break;\n }\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n throw new CliError(`Authorization ${poll.status}.`);\n }\n }\n if (!token) throw new CliError(\"Device authorization timed out.\");\n\n const location = storeToken(ctx.apiUrl, token);\n diag(` Stored credential (${location}).`);\n emit(\n { ok: true, apiUrl: ctx.apiUrl, storage: location },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl}\\n`),\n );\n }),\n );\n\n /**\n * Non-blocking halves of the same flow.\n *\n * `myna login` blocks until a human approves in a browser, which is useless\n * to an automated caller: it cannot surface the code to whoever must approve\n * it, and it cannot do anything else while waiting. Splitting start from poll\n * lets a caller print the verification URI, hand it to a human, and poll on\n * its own schedule.\n */\n login\n .command(\"start\")\n .description(\"Begin device authorization and print the code without waiting\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n emit(\n {\n deviceCode: start.deviceCode,\n userCode: start.userCode,\n verificationUri: start.verificationUri,\n expiresIn: start.expiresIn,\n interval: start.interval,\n apiUrl: ctx.apiUrl,\n },\n () => {\n process.stdout.write(`${start.verificationUri}\\n`);\n diag(` Enter the code: ${start.userCode}`);\n diag(` Then run: myna login poll ${start.deviceCode}`);\n },\n );\n }),\n );\n\n login\n .command(\"poll\")\n .description(\"Check a pending device authorization once, or wait for it\")\n .argument(\"<device-code>\", \"device code from `myna login start`\")\n .option(\"--wait\", \"keep polling until approved, denied, or expired\", false)\n .option(\"--interval <seconds>\", \"seconds between attempts when waiting\", \"2\")\n .option(\"--timeout <seconds>\", \"give up after this long when waiting\", \"300\")\n .action(\n handle(async (ctx, args, opts) => {\n const deviceCode = args[0] as string;\n const wait = Boolean(opts.wait);\n const interval = Math.max(1, Number(opts.interval)) * 1000;\n const deadline = Date.now() + Math.max(1, Number(opts.timeout)) * 1000;\n\n for (;;) {\n const poll = await pollDevice(ctx.apiUrl, deviceCode);\n\n if (poll.status === \"approved\" && poll.token) {\n const location = storeToken(ctx.apiUrl, poll.token);\n emit(\n { status: \"approved\", stored: true, storage: location, apiUrl: ctx.apiUrl },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl} (stored in ${location})\\n`),\n );\n return;\n }\n\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n // A terminal answer is a result, not a crash: report it in the same\n // shape as success so a caller can branch on `status`.\n emit({ status: poll.status, stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(`Authorization ${poll.status}.\\n`),\n );\n process.exitCode = 1;\n return;\n }\n\n if (!wait) {\n emit({ status: \"pending\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stdout.write(\"pending\\n\"),\n );\n return;\n }\n\n if (Date.now() + interval > deadline) {\n emit({ status: \"timeout\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(\"Timed out waiting for approval.\\n\"),\n );\n process.exitCode = 1;\n return;\n }\n await sleep(interval);\n }\n }),\n );\n\n program\n .command(\"logout\")\n .description(\"Remove the stored credential for the current API URL\")\n .action(\n handle(async (ctx) => {\n clearToken(ctx.apiUrl);\n emit({ ok: true }, () => process.stdout.write(`Logged out of ${ctx.apiUrl}\\n`));\n }),\n );\n\n const auth = program.command(\"auth\").description(\"Inspect and verify credentials\");\n\n /**\n * The machine-readable counterpart to `whoami`: always exits 0 with a\n * definite answer, so a caller can branch on `credentialValid` instead of\n * parsing an error.\n */\n auth\n .command(\"verify\")\n .description(\"Check whether the current credential actually works\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n emit(status, () => {\n keyValues([\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n [\"Source\", status.source],\n [\"Identity\", status.identity ? describeIdentity(status.identity) : \"—\"],\n ]);\n if (status.error) process.stderr.write(`\\n${status.error.code}: ${status.error.detail}\\n`);\n });\n }),\n );\n\n program\n .command(\"whoami\")\n .description(\"Show the authenticated identity, validating it against the API\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token ?? loadToken(ctx.apiUrl), ctx.tokenSource);\n\n let organization: { name: string; role: string; slug: string } | undefined;\n if (status.credentialValid && ctx.organization) {\n organization = await ctx\n .management()\n .organizations.get(ctx.organization)\n .then((o) => ({ name: o.name, role: o.role, slug: o.slug }))\n .catch((e: unknown) => {\n if (isMynaApiError(e)) return undefined;\n throw e;\n });\n }\n\n emit({ ...status, organization: organization ?? null }, () => {\n const pairs: Array<[string, string]> = [\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n ];\n if (status.identity) pairs.push([\"Identity\", describeIdentity(status.identity)]);\n if (organization) pairs.push([\"Organization\", `${organization.name} (${organization.role})`]);\n keyValues(pairs);\n if (status.error) {\n process.stderr.write(`\\n${status.error.detail}\\n`);\n if (status.error.code !== \"UNREACHABLE\") {\n process.stderr.write(\"Run `myna login` to authenticate again.\\n\");\n }\n }\n });\n\n // Presence without validity is the failure the old behavior hid.\n if (!status.credentialValid) process.exitCode = 1;\n }),\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport {\n findLinkedProject,\n loadToken,\n removeLinkedProject,\n writeLinkedProject,\n DEFAULT_API_URL,\n} from \"../config.js\";\nimport { CliError, UsageError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nconst EXAMPLE_SCHEMA = `import { collection, field } from \"@myna-sh/sdk/schema\";\n\n/**\n * Example collection. Edit freely, then run:\n * myna schema diff\n * myna schema push\n */\nexport const posts = collection({\n name: \"posts\",\n label: \"Blog posts\",\n visibility: \"public\",\n titleField: \"title\",\n path: \"/blog/{slug}\",\n fields: {\n title: field.text({ required: true, maxLength: 120 }),\n slug: field.slug({ from: \"title\", required: true }),\n description: field.text({ multiline: true }),\n body: field.markdown({ required: true }),\n cover: field.asset({ allowed: [\"image/*\"] }),\n publishedAt: field.datetime(),\n },\n});\n`;\n\nfunction appUrlFor(apiUrl: string): string {\n try {\n const url = new URL(apiUrl);\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = \"app.\" + url.hostname.slice(4);\n return url.origin;\n }\n return apiUrl;\n } catch {\n return apiUrl;\n }\n}\n\nexport function registerWorkspace(program: Command): void {\n program\n .command(\"init\")\n .description(\"Scaffold a local `myna/` schema directory (and link if a project is set)\")\n .option(\"--schema-dir <dir>\", \"schema directory\", \"myna\")\n .action(\n handle(async (ctx, _args, opts) => {\n const dir = (opts.schemaDir as string) ?? \"myna\";\n mkdirSync(dir, { recursive: true });\n const file = join(dir, \"posts.ts\");\n const created: string[] = [];\n if (!existsSync(file)) {\n writeFileSync(file, EXAMPLE_SCHEMA);\n created.push(file);\n }\n let linked = false;\n if (ctx.project) {\n writeLinkedProject(process.cwd(), {\n project: ctx.project,\n organization: ctx.organization,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n created.push(\".myna/project.json\");\n linked = true;\n }\n emit({ schemaDir: dir, created, linked }, () => {\n diag(`Initialized ${dir}/`);\n for (const c of created) process.stdout.write(` created ${c}\\n`);\n if (!linked) process.stdout.write(` run \\`myna link --project <ref>\\` to link a project\\n`);\n });\n }),\n );\n\n program\n .command(\"link\")\n .description(\"Link the current directory to a project (writes .myna/project.json, no secrets)\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const project = (args[0] as string | undefined) ?? ctx.project;\n if (!project) throw new UsageError(\"Provide a project: `myna link <project>` or --project.\");\n // Validate the project exists and capture its organization.\n const resolved = await ctx.management().projects.get(project);\n writeLinkedProject(process.cwd(), {\n project,\n organization: ctx.organization ?? resolved.organizationId,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n emit({ linked: true, project: resolved.slug, organizationId: resolved.organizationId }, () =>\n process.stdout.write(`Linked to ${resolved.name} (${resolved.slug})\\n`),\n );\n }),\n );\n\n program\n .command(\"unlink\")\n .description(\"Remove the project link from the current directory tree\")\n .action(\n handle(async () => {\n const found = findLinkedProject();\n if (!found) throw new CliError(\"No linked project found.\");\n removeLinkedProject(found.root);\n emit({ unlinked: true }, () => process.stdout.write(`Unlinked ${found.linked.project}\\n`));\n }),\n );\n\n program\n .command(\"status\")\n .description(\"Show the resolved configuration and project link\")\n .action(\n handle(async (ctx) => {\n // `status` reads local configuration only — it deliberately makes no\n // network call. It therefore reports whether a credential is *present*,\n // never whether it works: use `myna auth verify` or `myna doctor` for\n // that. Calling mere presence \"authenticated\" is what let an expired\n // credential look healthy.\n const credentialPresent = Boolean(ctx.token ?? loadToken(ctx.apiUrl));\n emit(\n {\n apiUrl: ctx.apiUrl,\n credentialPresent,\n credentialSource: ctx.tokenSource,\n project: ctx.project ?? null,\n organization: ctx.organization ?? null,\n linkedRoot: ctx.linkedRoot ?? null,\n },\n () => {\n keyValues([\n [\"API URL\", ctx.apiUrl],\n [\"Credential present\", credentialPresent ? `yes (${ctx.tokenSource})` : \"no\"],\n [\"Project\", ctx.project ?? \"(none)\"],\n [\"Organization\", ctx.organization ?? \"(none)\"],\n [\"Linked at\", ctx.linkedRoot ?? \"(none)\"],\n ]);\n if (credentialPresent) diag(\"\\nNot verified against the API. Run `myna auth verify`.\");\n },\n );\n }),\n );\n\n program\n .command(\"open\")\n .description(\"Open the current project in the dashboard\")\n .action(\n handle(async (ctx) => {\n const app = appUrlFor(ctx.apiUrl);\n const path = ctx.organization && ctx.project ? `/${ctx.organization}/${ctx.project}` : \"\";\n const url = `${app}${path}`;\n if (ctx.interactive) openBrowser(url);\n emit({ url }, () => process.stdout.write(`${url}\\n`));\n }),\n );\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { isMynaApiError, generateTypesModule } from \"@myna-sh/sdk/management\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError, UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { canonicalJson, loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { schemaToDsl } from \"../dsl-emit.js\";\nimport { branchForContent, dirtyFiles, openPullRequest } from \"../git.js\";\nimport type { Ctx } from \"../client.js\";\n\n/** Fetch deployed canonical schemas (latest version per collection). */\nasync function deployedSchemas(ctx: Ctx, project: string): Promise<CollectionSchema[]> {\n const mgmt = ctx.management();\n const collections = await mgmt.schema.collections(project);\n const out: CollectionSchema[] = [];\n for (const c of collections) {\n const versions = await mgmt.schema.versions(project, c.key);\n const latest = versions[0];\n if (latest) out.push(latest.schemaJson as unknown as CollectionSchema);\n }\n return out.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function registerSchema(program: Command): void {\n const schema = program.command(\"schema\").description(\"Inspect and deploy code-owned schemas\");\n\n schema\n .command(\"inspect\")\n .description(\"Show deployed collections, or one collection's fields\")\n .argument(\"[collection]\", \"collection key\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const key = args[0] as string | undefined;\n if (!key) {\n const collections = await ctx.management().schema.collections(project);\n emit(collections, () =>\n table(collections, [\n { header: \"KEY\", value: (c) => c.key },\n { header: \"NAME\", value: (c) => c.displayName },\n { header: \"KIND\", value: (c) => c.kind },\n { header: \"VISIBILITY\", value: (c) => c.visibility },\n ]),\n );\n return;\n }\n const versions = await ctx.management().schema.versions(project, key);\n const latest = versions[0];\n if (!latest) throw new CliError(`Collection ${key} has no versions.`);\n const s = latest.schemaJson as unknown as CollectionSchema;\n emit({ collection: key, version: latest.version, schema: s }, () => {\n diag(`${key} — v${latest.version} (${s.kind}, ${s.visibility})`);\n table(s.fields, [\n { header: \"FIELD\", value: (f) => f.key },\n { header: \"TYPE\", value: (f) => f.type },\n { header: \"REQUIRED\", value: (f) => (f.required ? \"yes\" : \"\") },\n ]);\n });\n }),\n );\n\n schema\n .command(\"pull\")\n .description(\"Write deployed schemas to local DSL files\")\n .option(\"--schema-dir <dir>\", \"target schema directory\")\n .option(\"--open-pr\", \"commit the drift onto a branch and open a pull request instead of writing in place\", false)\n .option(\"--branch <name>\", \"branch to use with --open-pr (default: derived from the content)\")\n .option(\"--base <branch>\", \"branch to open the pull request against (default: the current branch)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const schemas = await deployedSchemas(ctx, project);\n const rendered = schemas.map((s) => ({ file: join(dir, `${s.name}.ts`), code: schemaToDsl(s) }));\n const changed = rendered.filter(\n (r) => !existsSync(r.file) || readFileSync(r.file, \"utf8\") !== r.code,\n );\n\n const write = (): string[] => {\n mkdirSync(dir, { recursive: true });\n for (const r of rendered) writeFileSync(r.file, r.code);\n return rendered.map((r) => r.file);\n };\n\n if (!opts.openPr) {\n const written = write();\n emit({ pulled: schemas.length, files: written, changed: changed.map((c) => c.file) }, () => {\n for (const f of written) process.stdout.write(` wrote ${f}\\n`);\n });\n return;\n }\n\n if (changed.length === 0) {\n emit({ pulled: schemas.length, changed: [], pullRequest: null }, () =>\n diag(\"No drift: the local schema files already match the deployed schema.\"),\n );\n return;\n }\n\n // Anything already modified under the schema directory would be swept\n // into the commit, and a pull request nobody meant to open is worse than\n // one that was not opened.\n const root = ctx.linkedRoot ?? process.cwd();\n const dirty = dirtyFiles(root, [dir]);\n if (dirty.length > 0) {\n throw new UsageError(\n `Commit or stash changes under ${dir} first: ${dirty.join(\", \")}.`,\n );\n }\n\n // Described before the files move: the drift is what the local schema\n // said a moment ago, and overwriting it first would report no drift.\n const body = await driftBody(ctx, project, dir, changed.map((c) => c.file));\n write();\n\n const branch = (opts.branch as string | undefined) ?? branchForContent(changed.map((c) => c.code));\n const result = openPullRequest({\n cwd: root,\n files: changed.map((c) => c.file),\n branch,\n base: opts.base as string | undefined,\n title: `chore(schema): sync ${changed.length} collection(s) from ${project}`,\n body,\n });\n\n emit({ pulled: schemas.length, changed: changed.map((c) => c.file), pullRequest: result }, () => {\n if (!result.opened) {\n diag(`Branch ${result.branch} already exists — this drift is already proposed.`);\n return;\n }\n diag(`Opened ${result.url ?? `pull request from ${result.branch}`} against ${result.base}.`);\n });\n }),\n );\n\n schema\n .command(\"diff\")\n .description(\"Diff local schemas against the deployed schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const result = await ctx.management().schema.diff(project, canonicalJson(local));\n emit(result, () => renderDiff(result));\n }),\n );\n\n schema\n .command(\"drift\")\n .description(\"Show schema drift between this project and another (e.g. staging)\")\n .requiredOption(\"--against <project>\", \"project id or slug to compare with\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.drift(project, opts.against as string);\n emit(result, () => {\n if (result.inSync) diag(\"Schemas are in sync.\");\n else {\n diag(`${result.ops.length} op(s) of drift (${result.classification}):`);\n for (const op of result.ops) {\n process.stderr.write(` ${op.kind} ${op.collection}${op.field ? `.${op.field}` : \"\"} — ${op.detail}\\n`);\n }\n }\n });\n if (!result.inSync) process.exitCode = 1;\n }),\n );\n\n schema\n .command(\"promote\")\n .description(\"Promote another project's deployed schemas into this project\")\n .requiredOption(\"--from <project>\", \"source project id or slug\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.promote(project, opts.from as string, {\n allowDestructive: Boolean(opts.allowDestructive),\n });\n emit(result, () => {\n renderDiff(result.diff);\n diag(result.applied ? `Promoted ${result.versions.length} version(s).` : \"Nothing to promote.\");\n });\n }),\n );\n\n schema\n .command(\"push\")\n .description(\"Apply local schemas, creating immutable versions\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const collections = canonicalJson(local);\n const allowDestructive = Boolean(opts.allowDestructive);\n\n const plan = await ctx.management().schema.diff(project, collections);\n if (!ctx.json) renderDiff(plan);\n\n if (plan.hasDestructive && !allowDestructive) {\n throw new UsageError(\n \"This change is destructive. Re-run with --allow-destructive to proceed.\",\n );\n }\n if (plan.ops.length === 0) {\n emit({ applied: false, reason: \"no-changes\", diff: plan }, () => diag(\"No schema changes to apply.\"));\n return;\n }\n\n const pushed = await ctx\n .management()\n .schema.push(project, collections, { allowDestructive, changeSummary: opts.summary as string | undefined })\n .catch((error: unknown) => {\n if (isMynaApiError(error) && error.code === \"SCHEMA_CHANGE_DESTRUCTIVE\") {\n throw new UsageError(\"Destructive schema change rejected. Pass --allow-destructive.\");\n }\n throw error;\n });\n emit(pushed, () =>\n diag(`Applied ${pushed.versions.length} schema version(s) (${pushed.diff.classification}).`),\n );\n }),\n );\n\n\n schema\n .command(\"translations\")\n .description(\"Report what is still untranslated in a collection\")\n .argument(\"<collection>\", \"collection key\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const report = await ctx.management().schema.translations(project, args[0] as string);\n emit(report, () => {\n if (report.locales.length === 0) {\n diag(\"Localization is not configured for this project.\");\n return;\n }\n if (report.fields.length === 0) {\n diag(`No localized fields in \"${report.collection}\".`);\n return;\n }\n diag(`${report.totalEntries} entr(y/ies), localized fields: ${report.fields.join(\", \")}`);\n table(report.coverage, [\n { header: \"LOCALE\", value: (c) => c.locale },\n { header: \"COMPLETE\", value: (c) => `${c.completeEntries}/${c.totalEntries}` },\n { header: \"PERCENT\", value: (c) => `${c.percent}%` },\n { header: \"MISSING FIELDS\", value: (c) => String(c.missingFields) },\n ]);\n });\n }),\n );\n\n const types = program.command(\"types\").description(\"Generate content types\");\n types\n .command(\"generate\")\n .description(\"Generate deterministic TypeScript types from schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--deployed\", \"use deployed schemas instead of local files\", false)\n .option(\"--out <file>\", \"write to a file instead of stdout\")\n .action(\n handle(async (ctx, _args, opts) => {\n let schemas: CollectionSchema[];\n if (opts.deployed) {\n schemas = await deployedSchemas(ctx, ctx.requireProject());\n } else {\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n schemas = await loadLocalSchemas(dir);\n }\n const code = generateTypesModule(schemas);\n const out = opts.out as string | undefined;\n if (out) {\n writeFileSync(out, code);\n emit({ written: out, collections: schemas.length }, () => diag(`Wrote ${out}`));\n } else if (ctx.json) {\n emit({ code, collections: schemas.length });\n } else {\n process.stdout.write(code);\n }\n }),\n );\n}\n\n/**\n * The pull request's description: which files move, and what the drift actually\n * was. The drift is read from the same `schema diff` a push would run, so the\n * body describes the change in the direction a reviewer thinks in — \"pushing\n * this repo would have done X\" — rather than restating the file list twice.\n *\n * Best-effort: local schema files that no longer compile are exactly the case\n * where the deployed schema is worth pulling, so a failure here must not stop\n * the pull request.\n */\nasync function driftBody(ctx: Ctx, project: string, dir: string, files: string[]): Promise<string> {\n const lines = [\n `Deployed schema for \\`${project}\\`, pulled into this repository by \\`myna schema pull --open-pr\\`.`,\n \"\",\n \"Files:\",\n ...files.map((f) => `- \\`${f}\\``),\n ];\n try {\n const local = await loadLocalSchemas(dir);\n const diff = await ctx.management().schema.diff(project, canonicalJson(local));\n if (diff.ops.length > 0) {\n lines.push(\n \"\",\n `Before this change, pushing this repository would have applied ${diff.ops.length} operation(s) (${diff.classification}):`,\n \"\",\n ...diff.ops.map((op) => `- \\`${op.kind}\\` ${op.collection}${op.field ? `.${op.field}` : \"\"} — ${op.detail}`),\n );\n }\n } catch {\n lines.push(\"\", \"_The local schema could not be diffed; review the file changes directly._\");\n }\n return lines.join(\"\\n\");\n}\n\ninterface DiffLike {\n ops: Array<{ kind: string; collection: string; field?: string; classification: string; detail: string }>;\n classification: string;\n hasDestructive: boolean;\n contentValidationErrors: Array<{ collection: string; path: string; message: string }>;\n}\n\nfunction renderDiff(diff: DiffLike): void {\n if (diff.ops.length === 0) {\n diag(\"No changes.\");\n return;\n }\n for (const op of diff.ops) {\n const marker = op.classification === \"destructive\" ? \"!\" : op.classification === \"conditionally_destructive\" ? \"~\" : \"+\";\n const target = op.field ? `${op.collection}.${op.field}` : op.collection;\n process.stdout.write(` ${marker} ${op.kind} ${target} — ${op.detail}\\n`);\n }\n process.stdout.write(` classification: ${diff.classification}\\n`);\n for (const err of diff.contentValidationErrors) {\n process.stderr.write(` content error: ${err.collection} ${err.path} — ${err.message}\\n`);\n }\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { build, type Plugin } from \"esbuild\";\nimport { toCanonical, type CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError } from \"./output.js\";\n\n/**\n * Load local schema definitions through a controlled esbuild bundle-to-memory,\n * then import the compiled module (SPEC 7 / 11). Each `.ts`/`.js`/`.mjs` file in\n * the schema directory may default-export a collection, export an array of\n * collections, or export several named collections.\n */\n\nexport const DEFAULT_SCHEMA_DIR = \"myna\";\n\n/**\n * Resolve DSL imports in user schema files to the copy bundled with the CLI\n * (`dsl.ts`, built to a sibling `dsl.js`). Schema loading therefore works\n * without `@myna-sh/sdk` installed, and canonicalization always runs against\n * the exact DSL version this CLI ships.\n */\nfunction dslAliasPlugin(): Plugin {\n let dslPath = fileURLToPath(new URL(\"./dsl.js\", import.meta.url));\n if (!existsSync(dslPath)) dslPath = dslPath.replace(/\\.js$/, \".ts\");\n return {\n name: \"myna-dsl-alias\",\n setup(builder) {\n builder.onResolve({ filter: /^@myna-sh\\/(schema|sdk\\/schema)$/ }, () => ({\n path: dslPath,\n }));\n },\n };\n}\n\nfunction looksLikeCollection(value: unknown): value is CollectionSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { name?: unknown }).name === \"string\" &&\n Array.isArray((value as { fields?: unknown }).fields)\n );\n}\n\nfunction collectFromModule(mod: Record<string, unknown>, out: Map<string, CollectionSchema>): void {\n const consider = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const v of value) consider(v);\n return;\n }\n if (looksLikeCollection(value)) out.set(value.name, value);\n };\n for (const value of Object.values(mod)) consider(value);\n}\n\nfunction listSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir)) {\n if (entry.startsWith(\".\") || entry === \"node_modules\" || entry === \"dist\") continue;\n const full = join(dir, entry);\n const st = statSync(full);\n if (st.isDirectory()) {\n files.push(...listSchemaFiles(full));\n } else if (/\\.(ts|mts|js|mjs)$/.test(entry) && !/\\.d\\.ts$/.test(entry)) {\n files.push(full);\n }\n }\n return files.sort();\n}\n\nexport async function loadLocalSchemas(schemaDir = DEFAULT_SCHEMA_DIR): Promise<CollectionSchema[]> {\n const dir = resolve(schemaDir);\n if (!existsSync(dir)) {\n throw new CliError(`Schema directory not found: ${schemaDir}. Run \\`myna init\\` to scaffold it.`);\n }\n const files = listSchemaFiles(dir);\n if (files.length === 0) {\n throw new CliError(`No schema files found in ${schemaDir}.`);\n }\n\n const collections = new Map<string, CollectionSchema>();\n for (const file of files) {\n const result = await build({\n entryPoints: [file],\n bundle: true,\n write: false,\n format: \"esm\",\n platform: \"node\",\n target: \"node20\",\n logLevel: \"silent\",\n absWorkingDir: process.cwd(),\n plugins: [dslAliasPlugin()],\n }).catch((error: unknown) => {\n throw new CliError(`Failed to compile ${file}: ${error instanceof Error ? error.message : String(error)}`);\n });\n\n const code = result.outputFiles[0]?.text ?? \"\";\n const dataUrl = `data:text/javascript;base64,${Buffer.from(code).toString(\"base64\")}`;\n const mod = (await import(dataUrl)) as Record<string, unknown>;\n collectFromModule(mod, collections);\n }\n\n if (collections.size === 0) {\n throw new CliError(\"No collections were exported from the schema directory.\");\n }\n\n return [...collections.values()]\n .map((c) => toCanonical(c))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function canonicalJson(schemas: CollectionSchema[]): Record<string, unknown>[] {\n return schemas.map((s) => s as unknown as Record<string, unknown>);\n}\n\n/** Resolve the schema directory relative to the linked project root if set. */\nexport function schemaDirFor(root: string | undefined, override?: string): string {\n if (override) return override;\n if (root) {\n const candidate = join(root, DEFAULT_SCHEMA_DIR);\n if (existsSync(candidate)) return candidate;\n }\n return DEFAULT_SCHEMA_DIR;\n}\n","import type { CollectionSchema } from \"./types.js\";\n\n/**\n * Deterministic JSON serialization: object keys are emitted in sorted order,\n * arrays preserve their order (field order is significant). Produces a stable\n * string suitable for hashing and equality checks.\n */\nexport function canonicalStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const v = (value as Record<string, unknown>)[key];\n if (v === undefined) continue;\n out[key] = sortValue(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Return a deep-cloned, canonically-ordered copy of a schema. This is the exact\n * shape persisted as `collection_versions.schema_json`.\n */\nexport function toCanonical(schema: CollectionSchema): CollectionSchema {\n return JSON.parse(canonicalStringify(schema)) as CollectionSchema;\n}\n","import type { CollectionSchema, FieldDef, ListItem } from \"@myna-sh/schema\";\n\n/**\n * Emit editable `@myna-sh/sdk/schema` DSL source from a canonical collection schema.\n * Used by `myna schema pull` to materialize deployed schemas as local TS.\n */\nexport function schemaToDsl(schema: CollectionSchema): string {\n const opts: string[] = [\n `name: ${str(schema.name)}`,\n `label: ${str(schema.label)}`,\n ];\n if (schema.kind !== \"collection\") opts.push(`kind: ${str(schema.kind)}`);\n opts.push(`visibility: ${str(schema.visibility)}`);\n if (schema.titleField) opts.push(`titleField: ${str(schema.titleField)}`);\n if (schema.path) opts.push(`path: ${str(schema.path)}`);\n if (schema.guidance) opts.push(`guidance: ${str(schema.guidance)}`);\n\n const fieldLines = schema.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)},`).join(\"\\n\");\n\n return [\n `import { collection, field, item } from \"@myna-sh/sdk/schema\";`,\n ``,\n `export const ${varName(schema.name)} = collection({`,\n ` ${opts.join(\",\\n \")},`,\n ` fields: {`,\n fieldLines,\n ` },`,\n `});`,\n ``,\n ].join(\"\\n\");\n}\n\nfunction emitField(field: FieldDef): string {\n const o: Record<string, unknown> = {};\n if (field.label && field.label !== field.key) o.label = field.label;\n if (field.description) o.description = field.description;\n if (field.required) o.required = true;\n\n switch (field.type) {\n case \"text\":\n assign(o, { multiline: field.multiline || undefined, minLength: field.minLength, maxLength: field.maxLength, pattern: field.pattern, enum: field.enum, default: field.default });\n return call(\"text\", o);\n case \"slug\":\n assign(o, { from: field.from });\n return call(\"slug\", o);\n case \"markdown\":\n assign(o, { minLength: field.minLength, maxLength: field.maxLength, default: field.default });\n return call(\"markdown\", o);\n case \"number\":\n assign(o, { integer: field.integer || undefined, min: field.min, max: field.max, default: field.default });\n return call(\"number\", o);\n case \"boolean\":\n assign(o, { default: field.default });\n return call(\"boolean\", o);\n case \"date\":\n case \"datetime\":\n assign(o, { min: field.min, max: field.max, default: field.default });\n return call(field.type, o);\n case \"json\":\n assign(o, { default: field.default });\n return call(\"json\", o);\n case \"asset\":\n assign(o, { allowed: field.allowed, multiple: field.multiple || undefined });\n return call(\"asset\", o);\n case \"reference\":\n assign(o, { to: field.target, multiple: field.multiple || undefined });\n return call(\"reference\", o);\n case \"object\": {\n const inner = field.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n o.fields = `__RAW__{\\n${inner},\\n }`;\n return call(\"object\", o);\n }\n case \"list\":\n o.of = `__RAW__${emitItem(field.item)}`;\n assign(o, { minItems: field.minItems, maxItems: field.maxItems });\n return call(\"list\", o);\n default:\n return `field.json({})`;\n }\n}\n\nfunction emitItem(item: ListItem): string {\n switch (item.kind) {\n case \"reference\":\n return `item.reference({ to: ${str(item.target)} })`;\n case \"asset\":\n return `item.asset({ allowed: ${JSON.stringify(item.allowed)} })`;\n case \"object\": {\n const inner = item.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n return `item.object({ fields: {\\n${inner},\\n } })`;\n }\n default:\n return `item.${item.kind}()`;\n }\n}\n\nfunction call(name: string, opts: Record<string, unknown>): string {\n const entries = Object.entries(opts);\n if (entries.length === 0) return `field.${name}()`;\n const body = entries.map(([k, v]) => `${ident(k)}: ${literal(v)}`).join(\", \");\n return `field.${name}({ ${body} })`;\n}\n\nfunction assign(target: Record<string, unknown>, values: Record<string, unknown>): void {\n for (const [k, v] of Object.entries(values)) {\n if (v !== undefined) target[k] = v;\n }\n}\n\nfunction literal(value: unknown): string {\n if (typeof value === \"string\" && value.startsWith(\"__RAW__\")) return value.slice(\"__RAW__\".length);\n return JSON.stringify(value);\n}\n\nfunction str(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction ident(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction varName(name: string): string {\n const camel = name.replace(/[-_\\s]+(.)/g, (_, c: string) => c.toUpperCase());\n return /^[A-Za-z_$]/.test(camel) ? camel : `_${camel}`;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { CliError } from \"./output.js\";\n\n/**\n * Just enough git and `gh` to turn drift into a reviewable proposal.\n *\n * Schemas are code, so the honest place for a schema someone changed in the\n * dashboard is a pull request against the repository that owns it — not a\n * warning in `myna doctor` that everybody has learned to scroll past. This\n * shells out rather than speaking to the GitHub API: the credential, the remote,\n * and the review conventions all already exist in the developer's `gh`, and\n * reproducing them here would be a second, worse copy of them.\n */\n\nfunction run(command: string, args: string[], cwd: string): string {\n try {\n return execFileSync(command, args, { cwd, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch (error) {\n const stderr = (error as { stderr?: Buffer | string }).stderr;\n const detail = typeof stderr === \"string\" ? stderr : stderr?.toString(\"utf8\");\n throw new CliError(`${command} ${args[0]} failed: ${(detail || (error as Error).message).trim()}`);\n }\n}\n\nfunction git(args: string[], cwd: string): string {\n return run(\"git\", args, cwd).trim();\n}\n\n/** For cleanup after a failure, where a second error would only obscure the first. */\nfunction gitQuiet(args: string[], cwd: string): void {\n try {\n execFileSync(\"git\", args, { cwd, stdio: \"ignore\" });\n } catch {\n // Nothing to do: the caller is already unwinding.\n }\n}\n\nfunction available(command: string): boolean {\n try {\n execFileSync(command, [\"--version\"], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\n/** A branch name that is the same for the same content, so re-running does not\n * open a second pull request for drift that is already proposed. */\nexport function branchForContent(contents: string[]): string {\n const digest = createHash(\"sha256\").update(contents.join(\"\\0\")).digest(\"hex\").slice(0, 8);\n return `myna/schema-${digest}`;\n}\n\n/** Whether `branch` exists here or on `origin`. */\nfunction branchExists(cwd: string, branch: string): boolean {\n try {\n execFileSync(\"git\", [\"rev-parse\", \"--verify\", `refs/heads/${branch}`], { cwd, stdio: \"ignore\" });\n return true;\n } catch {\n // Not local. Ask the remote, where another proposer would have put it.\n }\n try {\n const out = execFileSync(\"git\", [\"ls-remote\", \"--heads\", \"origin\", branch], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return out.trim().length > 0;\n } catch {\n // No remote, or it is unreachable. Pushing is what will say so, and it says\n // it better than a guess here would.\n return false;\n }\n}\n\nexport interface PullRequestInput {\n cwd: string;\n /** Absolute paths of the files to commit. They must already be written. */\n files: string[];\n branch: string;\n /** Branch to open against. Defaults to whatever is checked out now. */\n base?: string;\n title: string;\n body: string;\n}\n\nexport interface PullRequestResult {\n opened: boolean;\n branch: string;\n base: string;\n url: string | null;\n /** Why nothing was opened, when nothing was. */\n reason?: \"branch-exists\";\n}\n\n/**\n * Commit the given files onto a fresh branch and open a pull request.\n *\n * The working tree is put back the way it was found: the change lives on its own\n * branch and in the pull request, and the checkout the developer was using does\n * not silently acquire a schema they have not read yet.\n */\nexport function openPullRequest(input: PullRequestInput): PullRequestResult {\n if (!available(\"git\")) throw new CliError(\"git is required to open a pull request.\");\n if (!available(\"gh\")) {\n throw new CliError(\"The GitHub CLI (gh) is required to open a pull request. See https://cli.github.com.\");\n }\n if (git([\"rev-parse\", \"--is-inside-work-tree\"], input.cwd) !== \"true\") {\n throw new CliError(`${input.cwd} is not inside a git repository.`);\n }\n\n const base = input.base ?? git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], input.cwd);\n if (base === \"HEAD\") {\n throw new CliError(\"HEAD is detached; pass --base to say which branch to open the pull request against.\");\n }\n\n // An existing branch means this was already proposed. Opening a second pull\n // request for it would be noise, and force-pushing over the first would\n // discard review that may already have happened.\n //\n // Checked on the remote as well as locally, because the other proposer is\n // usually not this process: the GitHub App opens the same branch server-side,\n // and a second CI runner has its own empty checkout. A local-only check passes\n // in both cases and then fails at `git push` with a non-fast-forward, which is\n // a confusing way to discover that the work was already done.\n if (branchExists(input.cwd, input.branch)) {\n return { opened: false, branch: input.branch, base, url: null, reason: \"branch-exists\" };\n }\n\n git([\"checkout\", \"-b\", input.branch], input.cwd);\n let pushed = false;\n try {\n git([\"add\", \"--\", ...input.files], input.cwd);\n git([\"commit\", \"-m\", input.title, \"-m\", input.body], input.cwd);\n git([\"push\", \"--set-upstream\", \"origin\", input.branch], input.cwd);\n pushed = true;\n const url = run(\n \"gh\",\n [\"pr\", \"create\", \"--base\", base, \"--head\", input.branch, \"--title\", input.title, \"--body\", input.body],\n input.cwd,\n )\n .trim()\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"http\"))\n .pop();\n git([\"checkout\", base], input.cwd);\n return { opened: true, branch: input.branch, base, url: url ?? null };\n } catch (error) {\n // Unwind everything this call created. A half-finished attempt that leaves\n // the branch behind is worse than no attempt: the branch name is derived\n // from the content, so the next run would find it and report the drift as\n // already proposed when no pull request exists.\n gitQuiet([\"checkout\", base], input.cwd);\n if (pushed) gitQuiet([\"push\", \"origin\", \"--delete\", input.branch], input.cwd);\n gitQuiet([\"branch\", \"-D\", input.branch], input.cwd);\n throw error;\n }\n}\n\n/** Paths with uncommitted changes under `paths`, relative to the repository. */\nexport function dirtyFiles(cwd: string, paths: string[]): string[] {\n if (paths.length === 0) return [];\n // Porcelain v1 is `XY <path>`; the status characters are positional, so the\n // lines must not be trimmed before the path is taken off them.\n return run(\"git\", [\"status\", \"--porcelain\", \"--\", ...paths], cwd)\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => line.slice(3).trim());\n}\n\n/** Absolute path of the repository `cwd` sits in, or undefined outside one. */\nexport function repositoryRoot(cwd: string): string | undefined {\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return undefined;\n }\n}\n\n/** Every tracked `myna.lock` in the repository, absolute. */\nexport function trackedLockfiles(cwd: string): string[] {\n const root = repositoryRoot(cwd);\n if (!root) return [];\n try {\n return execFileSync(\"git\", [\"ls-files\", \"--full-name\", \"*myna.lock\", \"myna.lock\"], {\n cwd: root,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .split(\"\\n\")\n .filter(Boolean)\n .map((f) => join(root, f));\n } catch {\n return [];\n }\n}\n\nexport interface WorktreeChange {\n /** Absolute path. Porcelain reports repository-relative, which `git add` in a\n * subdirectory would resolve against the wrong base. */\n file: string;\n /** True when git has never seen this path, so undoing it means deleting it. */\n untracked: boolean;\n}\n\n/** Everything currently changed in the working tree, tracked or not. */\nexport function worktreeChanges(cwd: string): WorktreeChange[] {\n const root = repositoryRoot(cwd);\n // Only reached from inside a repository — `openPullRequest` has already\n // refused otherwise — so this is a type narrowing, not a fallback.\n if (!root) throw new CliError(`${cwd} is not inside a git repository.`);\n return run(\"git\", [\"status\", \"--porcelain\"], cwd)\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => ({\n file: join(root, line.slice(3).trim()),\n untracked: line.startsWith(\"??\"),\n }));\n}\n\n/**\n * Put the working tree back, given the changes a step introduced.\n *\n * Only safe because the caller established the tree was clean beforehand:\n * everything listed here was created by the step being undone, so restoring the\n * tracked ones and deleting the untracked ones loses no one else's work.\n */\nexport function discardChanges(cwd: string, changes: WorktreeChange[]): void {\n for (const change of changes) {\n if (change.untracked) rmSync(change.file, { force: true, recursive: true });\n else gitQuiet([\"checkout\", \"--\", change.file], cwd);\n }\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { basename, extname, join } from \"node:path\";\nimport { UsageError } from \"./output.js\";\n\n/**\n * Reading content from files: JSON documents and Markdown-with-frontmatter\n * directories, normalized into the rows the import API accepts.\n *\n * Migrating a site usually means the content already exists as files. Without\n * a reader here, every migration starts by writing a throwaway script to walk a\n * directory and reshape it — which is exactly the orchestration this is meant\n * to remove.\n */\n\nexport interface ContentRow {\n slug?: string;\n data: Record<string, unknown>;\n /** Where the row came from, for error messages that point at a file. */\n source: string;\n}\n\nexport type ContentFormat = \"json\" | \"markdown\";\n\n/** Guess the format from a path: a directory of `.md` files, or a JSON file. */\nexport async function detectFormat(path: string): Promise<ContentFormat> {\n const info = await stat(path).catch(() => undefined);\n if (!info) throw new UsageError(`No such file or directory: ${path}`);\n if (info.isDirectory()) return \"markdown\";\n return extname(path).toLowerCase() === \".json\" ? \"json\" : \"markdown\";\n}\n\n/**\n * Parse a frontmatter block.\n *\n * Deliberately a small subset of YAML — quoted and bare scalars, numbers,\n * booleans, null, and inline `[a, b]` arrays — because that is what content\n * frontmatter actually contains. Anything outside it fails loudly rather than\n * being silently misread, since a value quietly parsed as the wrong type\n * becomes a validation error pointing at the wrong place.\n */\nexport function parseFrontmatter(raw: string, source: string): { meta: Record<string, unknown>; body: string } {\n if (!raw.startsWith(\"---\")) return { meta: {}, body: raw };\n const end = raw.indexOf(\"\\n---\", 3);\n if (end === -1) throw new UsageError(`${source}: unterminated frontmatter block.`);\n const block = raw.slice(raw.indexOf(\"\\n\") + 1, end);\n const body = raw.slice(raw.indexOf(\"\\n\", end + 1) + 1);\n\n const meta: Record<string, unknown> = {};\n for (const [lineNumber, line] of block.split(\"\\n\").entries()) {\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n const separator = line.indexOf(\":\");\n if (separator === -1) {\n throw new UsageError(`${source}:${lineNumber + 2}: expected \"key: value\" in frontmatter.`);\n }\n const key = line.slice(0, separator).trim();\n meta[key] = parseScalar(line.slice(separator + 1).trim());\n }\n return { meta, body };\n}\n\nfunction parseScalar(value: string): unknown {\n if (value === \"\" || value === \"null\" || value === \"~\") return null;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n return inner === \"\" ? [] : inner.split(\",\").map((item) => parseScalar(item.trim()));\n }\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n return value.slice(1, -1);\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n return value;\n}\n\n/** Read a JSON import file: `{ collection, entries: [...] }` or a bare array. */\nexport async function readJsonRows(\n file: string,\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(file, \"utf8\"));\n } catch (error) {\n throw new UsageError(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const toRow = (value: unknown, index: number): ContentRow => {\n if (typeof value !== \"object\" || value === null) {\n throw new UsageError(`${file}: entry ${index} is not an object.`);\n }\n const record = value as Record<string, unknown>;\n // Accept both `{ slug, data }` and a bare field object.\n if (record.data && typeof record.data === \"object\") {\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record.data as Record<string, unknown>,\n source: `${file}#${index}`,\n };\n }\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record,\n source: `${file}#${index}`,\n };\n };\n\n if (Array.isArray(parsed)) {\n return { rows: parsed.map(toRow) };\n }\n const doc = parsed as { collection?: unknown; entries?: unknown };\n if (!Array.isArray(doc.entries)) {\n throw new UsageError(`${file}: expected { \"collection\": \"...\", \"entries\": [...] } or a JSON array.`);\n }\n return {\n collection: typeof doc.collection === \"string\" ? doc.collection : undefined,\n rows: doc.entries.map(toRow),\n };\n}\n\n/**\n * Read a directory of Markdown files as rows.\n *\n * The filename becomes the slug and the document body is placed on `bodyField`,\n * so a conventional content directory imports without a mapping file.\n */\nexport async function readMarkdownRows(dir: string, bodyField: string): Promise<ContentRow[]> {\n const info = await stat(dir).catch(() => undefined);\n const files = info?.isDirectory()\n ? (await readdir(dir))\n .filter((name) => [\".md\", \".markdown\"].includes(extname(name).toLowerCase()))\n .sort()\n .map((name) => join(dir, name))\n : [dir];\n\n if (files.length === 0) throw new UsageError(`No .md files found in ${dir}`);\n\n const rows: ContentRow[] = [];\n for (const file of files) {\n const raw = await readFile(file, \"utf8\");\n const { meta, body } = parseFrontmatter(raw, file);\n const slug = typeof meta.slug === \"string\" ? meta.slug : basename(file, extname(file));\n rows.push({\n slug,\n data: { ...meta, slug, [bodyField]: body.trim() },\n source: file,\n });\n }\n return rows;\n}\n\n/** Read rows from a file or directory in the requested (or detected) format. */\nexport async function readContentRows(\n path: string,\n opts: { format?: ContentFormat; bodyField: string },\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n const format = opts.format ?? (await detectFormat(path));\n if (format === \"json\") return readJsonRows(path);\n return { rows: await readMarkdownRows(path, opts.bodyField) };\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport { applySets, parseData, resolveEntryId } from \"../util.js\";\n\n/** Accept the documented spelling and the shorter one people reach for. */\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n\nexport function registerEntries(program: Command): void {\n const entries = program.command(\"entries\").description(\"Create, read, update, and manage entries\");\n\n entries\n .command(\"list\")\n .description(\"List entries in a collection\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--search <query>\", \"full-text query across the entry's text\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().entries.list(project, {\n collection: args[0] as string,\n status: opts.status as string | undefined,\n q: opts.search as string | undefined,\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (e) => e.id },\n { header: \"SLUG\", value: (e) => e.slug ?? \"\" },\n { header: \"STATUS\", value: (e) => e.status },\n { header: \"UPDATED\", value: (e) => e.updatedAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"get\")\n .description(\"Get one entry by <collection>/<slug-or-id>\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.get(project, id);\n emit(entry, () => {\n process.stdout.write(JSON.stringify(entry, null, 2) + \"\\n\");\n // Printed after the payload rather than buried in it: someone about to\n // edit this entry needs to see the collision, not find it.\n for (const cs of entry.openChangeSets ?? []) {\n const who = cs.actor?.displayName ?? \"someone\";\n const what = cs.fields.length ? cs.fields.join(\", \") : cs.operation;\n diag(` open change set ${cs.id} — ${cs.title} (${who}): ${what}`);\n }\n if (entry.contendedFields?.length) {\n diag(` contended by more than one: ${entry.contendedFields.join(\", \")}`);\n }\n });\n }),\n );\n\n entries\n .command(\"create\")\n .description(\"Create an entry\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--data <json-or-@file>\", \"entry data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"explicit slug\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const data = applySets(parseData(opts.data as string | undefined), opts.set as string[]);\n const entry = await ctx.management().entries.create(project, {\n collection: args[0] as string,\n data,\n slug: opts.slug as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Created ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"update\")\n .description(\"Update an entry\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--data <json-or-@file>\", \"replacement data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"new slug\")\n .option(\"--expected-revision <id>\", \"optimistic concurrency guard\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const sets = opts.set as string[];\n let data: Record<string, unknown> | undefined;\n if (opts.data !== undefined || sets.length > 0) {\n const base = opts.data !== undefined ? parseData(opts.data as string) : (await ctx.management().entries.get(project, id)).data;\n data = applySets(base, sets);\n }\n if (!data && !opts.slug) throw new UsageError(\"Nothing to update. Pass --data, --set, or --slug.\");\n const entry = await ctx.management().entries.update(project, id, {\n data,\n slug: opts.slug as string | undefined,\n expectedRevisionId: opts.expectedRevision as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Updated ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"delete\")\n .description(\"Stage an entry deletion on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.delete(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged delete of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"unpublish\")\n .description(\"Stage an entry unpublish on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.unpublish(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged unpublish of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"revisions\")\n .description(\"List an entry's revisions\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const revisions = await ctx.management().entries.revisions(project, id);\n emit(revisions, () =>\n table(revisions, [\n { header: \"ID\", value: (r) => r.id },\n { header: \"#\", value: (r) => String(r.revisionNumber) },\n { header: \"BY\", value: (r) => r.createdByType },\n { header: \"CREATED\", value: (r) => r.createdAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"duplicate\")\n .description(\"Duplicate an entry into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.duplicate(project, id, opts.changeSet as string | undefined);\n emit(entry, () => diag(`Duplicated into ${entry.id} (${entry.slug ?? \"no slug\"}).`));\n }),\n );\n\n entries\n .command(\"bulk\")\n .description(\"Stage a delete or unpublish for many entries at once\")\n .requiredOption(\"--action <action>\", \"delete or unpublish\")\n .requiredOption(\"--ids <ids>\", \"comma-separated entry ids\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, _args, opts) => {\n const action = opts.action as string;\n if (action !== \"delete\" && action !== \"unpublish\") {\n throw new UsageError(\"--action must be delete or unpublish.\");\n }\n const project = ctx.requireProject();\n const result = await ctx.management().entries.bulk(project, {\n action,\n entryIds: (opts.ids as string).split(\",\").map((s) => s.trim()).filter(Boolean),\n changeSetId: opts.changeSet as string | undefined,\n });\n emit(result, () =>\n table(result.results, [\n { header: \"ENTRY\", value: (r) => r.entryId },\n { header: \"OK\", value: (r) => (r.ok ? \"yes\" : \"no\") },\n { header: \"CHANGE SET\", value: (r) => r.changeSetId ?? \"—\" },\n { header: \"ERROR\", value: (r) => r.error ?? \"\" },\n ]),\n );\n if (result.results.some((r) => !r.ok)) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"import\")\n .description(\"Import entries from JSON or a Markdown directory, with dry-run validation\")\n .argument(\"<path>\", \"JSON file, or a directory of Markdown files with frontmatter\")\n .option(\"--collection <key>\", \"target collection (required unless the JSON file names one)\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the path by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set instead of a new one\")\n .option(\"--mode <mode>\", \"upsert (default) updates rows whose slug exists; create rejects them\", \"upsert\")\n .option(\"--dry-run\", \"validate without writing anything\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const format = parseFormat(opts.format as string | undefined);\n const mode = opts.mode as string;\n if (mode !== \"upsert\" && mode !== \"create\") {\n throw new UsageError(\"--mode must be upsert or create.\");\n }\n\n const source = await readContentRows(args[0] as string, {\n format,\n bodyField: opts.bodyField as string,\n });\n const collection = (opts.collection as string | undefined) ?? source.collection;\n if (!collection) {\n throw new UsageError(\"No collection. Pass --collection, or use a JSON file with a `collection` key.\");\n }\n if (source.rows.length === 0) throw new UsageError(\"Nothing to import.\");\n\n const result = await ctx.management().entries.import(project, {\n collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun: Boolean(opts.dryRun),\n changeSetId: opts.changeSet as string | undefined,\n mode,\n });\n\n emit(result, () => {\n const s = result.summary;\n const counts = `${s.created} created, ${s.updated} updated, ${s.unchanged} unchanged, ${s.invalid} invalid, ${s.skipped} skipped`;\n diag(\n result.dryRun\n ? `Dry run (${result.valid ? \"would apply\" : \"blocked\"}): ${counts}.`\n : `Imported into change set ${result.changeSetId}: ${counts}.`,\n );\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"reorder\")\n .description(\"Set a collection's editorial order (applies immediately; not staged)\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--slugs <list>\", \"comma-separated slugs or ids, in the desired order\")\n .option(\"--move <ref>\", \"reposition a single entry\")\n .option(\"--before <ref>\", \"with --move: place immediately before this entry\")\n .option(\"--after <ref>\", \"with --move: place immediately after this entry\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const collection = args[0] as string;\n const slugs = opts.slugs as string | undefined;\n const move = opts.move as string | undefined;\n if (Boolean(slugs) === Boolean(move)) {\n throw new UsageError(\"Provide either --slugs or --move.\");\n }\n if (!move && (opts.before || opts.after)) {\n throw new UsageError(\"--before and --after only apply with --move.\");\n }\n\n const body = slugs\n ? { order: slugs.split(\",\").map((s) => s.trim()).filter(Boolean) }\n : {\n move: {\n entry: move!,\n ...(opts.before ? { before: opts.before as string } : {}),\n ...(opts.after ? { after: opts.after as string } : {}),\n },\n };\n\n const result = await ctx.management().entries.reorder(project, collection, body);\n emit(result, () => {\n diag(\n `Reordered ${result.collection}: ${result.writes} row(s) written. ` +\n \"Ordering is not staged — this is live for readers now.\",\n );\n table(result.updated, [\n { header: \"ENTRY\", value: (r) => r.slug ?? r.id },\n { header: \"RANK\", value: (r) => r.rank },\n ]);\n });\n }),\n );\n\n entries\n .command(\"references\")\n .description(\"Show which entries reference this one and what it references\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const refs = await ctx.management().entries.references(project, id);\n emit(refs, () => {\n diag(`Referenced by ${refs.referencedBy.length} entr(y/ies):`);\n table(refs.referencedBy, [\n { header: \"ENTRY\", value: (r) => `${r.collectionKey}/${r.slug ?? r.id}` },\n { header: \"IN DRAFT\", value: (r) => (r.inDraft ? \"yes\" : \"no\") },\n { header: \"IN PUBLISHED\", value: (r) => (r.inPublished ? \"yes\" : \"no\") },\n ]);\n diag(`References ${refs.references.length} entr(y/ies):`);\n table(refs.references, [\n { header: \"ENTRY\", value: (r) => (r.collectionKey ? `${r.collectionKey}/${r.slug ?? r.id}` : r.id) },\n { header: \"STATE\", value: (r) => (!r.exists ? \"missing\" : r.published ? \"published\" : \"unpublished\") },\n ]);\n });\n }),\n );\n\n entries\n .command(\"restore\")\n .description(\"Restore a historical revision into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .requiredOption(\"--revision <id>\", \"revision id to restore\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.restoreRevision(project, id, opts.revision as string);\n emit(result, () => diag(`Restored revision ${opts.revision as string} into ${result.revision.id}.`));\n }),\n );\n\n entries\n .command(\"search\")\n .description(\"Full-text search entries across a project\")\n .argument(\"<query>\", \"words to search for\")\n .option(\"--collection <key>\", \"restrict to one collection\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().entries.list(project, {\n q: args[0] as string,\n collection: opts.collection as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (e) => e.id },\n { header: \"COLLECTION\", value: (e) => e.collection },\n { header: \"SLUG\", value: (e) => e.slug ?? \"\" },\n { header: \"STATUS\", value: (e) => e.status },\n ]),\n );\n }),\n );\n}\n\nfunction collect(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n","import type { Command } from \"commander\";\nimport type { TextSegmentContract } from \"@myna-sh/api-contracts\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerChanges(program: Command): void {\n const changes = program.command(\"changes\").description(\"Manage change sets: validate, preview, publish\");\n\n changes\n .command(\"list\")\n .description(\"List change sets\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().changeSets.list(project, {\n status: opts.status as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (c) => c.id },\n { header: \"TITLE\", value: (c) => c.title },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"ITEMS\", value: (c) => String(c.items.length) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"create\")\n .description(\"Create a change set\")\n .requiredOption(\"--title <title>\", \"change set title\")\n .option(\"--description <text>\", \"change set description\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.create(project, {\n title: opts.title as string,\n description: opts.description as string | undefined,\n });\n emit(cs, () => diag(`Created change set ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"inspect\")\n .description(\"Show a change set and its items\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.get(project, args[0] as string);\n emit(cs, () => {\n diag(`${cs.title} — ${cs.status}`);\n table(cs.items, [\n { header: \"TYPE\", value: (i) => i.resourceType },\n { header: \"RESOURCE\", value: (i) => i.resourceId },\n { header: \"OP\", value: (i) => i.operation },\n ]);\n });\n }),\n );\n\n changes\n .command(\"validate\")\n .description(\"Validate a change set against deployed schemas\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.validate(project, args[0] as string);\n emit(result, () => {\n if (result.valid) {\n diag(\"valid\");\n } else {\n for (const e of result.errors) {\n process.stderr.write(` ${e.resourceId} ${e.path} — ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"preview\")\n .description(\"Create a preview for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const preview = await ctx.management().previews.create(project, { changeSetId: args[0] as string });\n emit(preview, () => {\n process.stdout.write(`${preview.url}\\n`);\n diag(`fallback: ${preview.fallbackUrl}`);\n });\n }),\n );\n\n changes\n .command(\"publish\")\n .description(\"Atomically publish a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--confirm-publish\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmPublish) throw new UsageError(\"Publishing requires --confirm-publish.\");\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.publish(project, args[0] as string);\n emit(result, () =>\n diag(`Published ${result.publishedEntryIds.length} entr(y/ies): ${result.publishedEntryIds.join(\", \")}`),\n );\n }),\n );\n\n changes\n .command(\"close\")\n .description(\"Close a change set without publishing\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.close(project, args[0] as string);\n emit(cs, () => diag(`Closed ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"schedule\")\n .description(\"Schedule, reschedule, or cancel a change set's publish\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--at <datetime>\", \"ISO 8601 datetime to publish at\")\n .option(\"--cancel\", \"cancel the scheduled publish\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (Boolean(opts.at) === Boolean(opts.cancel)) {\n throw new UsageError(\"Provide exactly one of --at <datetime> or --cancel.\");\n }\n const client = ctx.management();\n const cs = opts.cancel\n ? await client.changeSets.cancelSchedule(project, args[0] as string)\n : await client.changeSets.schedule(project, args[0] as string, new Date(opts.at as string).toISOString());\n emit(cs, () =>\n diag(cs.scheduledAt ? `Scheduled to publish at ${cs.scheduledAt}.` : \"Schedule cancelled.\"),\n );\n }),\n );\n\n changes\n .command(\"reviews\")\n .description(\"List reviews and approvals for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.reviews(project, args[0] as string);\n emit(reviews, () =>\n table(reviews, [\n { header: \"REVIEWER\", value: (r) => `${r.reviewerType}:${r.reviewerId}` },\n { header: \"STATUS\", value: (r) => r.status },\n { header: \"STALE\", value: (r) => (r.stale ? \"yes\" : \"no\") },\n { header: \"DECIDED\", value: (r) => r.decidedAt ?? \"—\" },\n ]),\n );\n }),\n );\n\n changes\n .command(\"request-review\")\n .description(\"Assign a reviewer to a change set\")\n .argument(\"<id>\", \"change set id\")\n .requiredOption(\"--reviewer <id>\", \"reviewer id (user, api key, or agent id)\")\n .option(\"--reviewer-type <type>\", \"reviewer actor type\", \"user\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestReview(project, args[0] as string, {\n reviewerType: opts.reviewerType as \"user\" | \"api_key\" | \"agent\" | \"system\",\n reviewerId: opts.reviewer as string,\n });\n emit(reviews, () => diag(`Requested review from ${opts.reviewer as string}.`));\n }),\n );\n\n changes\n .command(\"approve\")\n .description(\"Approve a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.approve(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Approved.\"));\n }),\n );\n\n changes\n .command(\"request-changes\")\n .description(\"Request changes on a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestChanges(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Requested changes.\"));\n }),\n );\n\n changes\n .command(\"comments\")\n .description(\"List comments on a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const comments = await ctx.management().changeSets.comments(project, args[0] as string);\n emit(comments, () =>\n table(comments, [\n { header: \"AUTHOR\", value: (c) => `${c.authorType}:${c.authorId ?? \"—\"}` },\n { header: \"ANCHOR\", value: (c) => (c.resourceId ? `${c.resourceId}${c.fieldPath ? `#${c.fieldPath}` : \"\"}` : \"—\") },\n { header: \"RESOLVED\", value: (c) => (c.resolvedAt ? \"yes\" : \"no\") },\n { header: \"BODY\", value: (c) => (c.body.length > 60 ? `${c.body.slice(0, 57)}...` : c.body) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"comment\")\n .description(\"Comment on a change set (optionally anchored to a field)\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<body>\", \"comment body\")\n .option(\"--entry <id>\", \"anchor to an entry in the change set\")\n .option(\"--field <path>\", \"anchor to a field path, e.g. fields.title\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const comment = await ctx.management().changeSets.comment(project, args[0] as string, {\n body: args[1] as string,\n resourceType: opts.entry ? \"entry\" : undefined,\n resourceId: opts.entry as string | undefined,\n fieldPath: opts.field as string | undefined,\n });\n emit(comment, () => diag(`Commented ${comment.id}.`));\n }),\n );\n\n changes\n .command(\"checks\")\n .description(\"Show the latest check run for a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--run\", \"run checks before showing results\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const client = ctx.management();\n const checks = opts.run\n ? (await client.changeSets.runChecks(project, args[0] as string)).checks\n : await client.changeSets.checks(project, args[0] as string);\n emit(checks, () =>\n table(checks, [\n { header: \"CHECK\", value: (c) => c.name },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"STALE\", value: (c) => (c.stale ? \"yes\" : \"no\") },\n { header: \"ISSUES\", value: (c) => String(c.details?.length ?? 0) },\n ]),\n );\n if (checks.some((c) => c.status === \"failed\")) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"diff\")\n .description(\"Show what a change set would change, field by field\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const diff = await ctx.management().changeSets.diff(project, args[0] as string);\n emit(diff, () => {\n for (const item of diff.items) {\n const label = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n diag(`${item.operation} ${label}${item.changeSummary ? ` — ${item.changeSummary}` : \"\"}`);\n table(item.changes, [\n { header: \"FIELD\", value: (c) => c.path },\n { header: \"KIND\", value: (c) => c.kind },\n { header: \"BEFORE\", value: (c) => preview(c.before) },\n { header: \"AFTER\", value: (c) => preview(c.after) },\n ]);\n // A body field truncated to 48 characters in the table says nothing.\n // Where the API sent word-level segments, print the words instead.\n for (const change of item.changes) {\n if (change.segments) diag(` ${change.path}: ${inlineWords(change.segments)}`);\n }\n }\n if (diff.items.length === 0) diag(\"No items.\");\n });\n }),\n );\n\n changes\n .command(\"rebase\")\n .description(\"Replay a change set's edits on top of what is published now\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--dry-run\", \"show what a rebase would do without writing\", false)\n .option(\"--take-mine\", \"on conflict, keep this change set's value\", false)\n .option(\"--take-theirs\", \"on conflict, accept what was published\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (opts.takeMine && opts.takeTheirs) {\n throw new UsageError(\"Provide at most one of --take-mine or --take-theirs.\");\n }\n const result = await ctx.management().changeSets.rebase(project, args[0] as string, {\n ...(opts.dryRun ? { dryRun: true } : {}),\n ...(opts.takeMine ? { onConflict: \"take-mine\" as const } : {}),\n ...(opts.takeTheirs ? { onConflict: \"take-theirs\" as const } : {}),\n });\n emit(result, () => {\n if (result.items.length === 0) {\n diag(`Nothing to rebase; ${result.upToDate.length} item(s) already on the current head.`);\n return;\n }\n for (const item of result.items) {\n const label = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.entryId;\n diag(`${label} — ${item.appliedPaths.length} field(s) replayed, ${item.conflicts.length} conflict(s)`);\n if (item.conflicts.length > 0) {\n table(item.conflicts, [\n { header: \"FIELD\", value: (c) => c.path },\n { header: \"MINE\", value: (c) => preview(c.mine) },\n { header: \"THEIRS\", value: (c) => preview(c.theirs) },\n ]);\n }\n }\n diag(result.dryRun ? \"Dry run — nothing written.\" : \"Rebased. Approvals are now stale; re-review.\");\n });\n if (result.items.some((i) => i.conflicts.length > 0) && result.dryRun) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"update\")\n .description(\"Retitle a change set or mark it ready for review\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--title <title>\", \"new title\")\n .option(\"--description <text>\", \"new description\")\n .option(\"--ready\", \"mark ready for review\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (!opts.title && !opts.description && !opts.ready) {\n throw new UsageError(\"Provide --title, --description, or --ready.\");\n }\n const cs = await ctx.management().changeSets.update(project, args[0] as string, {\n ...(opts.title ? { title: opts.title as string } : {}),\n ...(opts.description ? { description: opts.description as string } : {}),\n ...(opts.ready ? { status: \"ready\" as const } : {}),\n });\n emit(cs, () => diag(`${cs.id} is ${cs.status}.`));\n }),\n );\n\n changes\n .command(\"remove-reviewer\")\n .description(\"Unassign a reviewer from a change set\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<reviewer>\", \"reviewer user id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const reviews = await ctx\n .management()\n .changeSets.removeReviewer(project, args[0] as string, args[1] as string);\n emit(reviews, () => diag(`${reviews.length} reviewer(s) remain.`));\n }),\n );\n\n changes\n .command(\"resolve-comment\")\n .description(\"Resolve or reopen a comment on a change set\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<comment>\", \"comment id\")\n .option(\"--reopen\", \"reopen instead of resolving\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const comment = await ctx\n .management()\n .changeSets.resolveComment(project, args[0] as string, args[1] as string, !opts.reopen);\n emit(comment, () => diag(comment.resolvedAt ? \"Resolved.\" : \"Reopened.\"));\n }),\n );\n\n changes\n .command(\"report-check\")\n .description(\"Report the result of an external check on a change set\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<name>\", \"declared check name\")\n .requiredOption(\"--status <status>\", \"passed, failed, or skipped\")\n .option(\"--message <text>\", \"detail shown to the reviewer\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const status = opts.status as string;\n if (status !== \"passed\" && status !== \"failed\" && status !== \"skipped\") {\n throw new UsageError(\"--status must be passed, failed, or skipped.\");\n }\n const check = await ctx.management().changeSets.reportCheck(project, args[0] as string, args[1] as string, {\n status,\n ...(opts.message ? { details: [{ message: opts.message as string }] } : {}),\n });\n emit(check, () => diag(`Reported ${check.name}: ${check.status}.`));\n if (check.status === \"failed\") process.exitCode = 1;\n }),\n );\n}\n\n/**\n * A prose change in `wdiff` notation — `[-removed-]`, `{+added+}` — with long\n * unchanged runs elided, so the line is the edit rather than the document.\n */\nfunction inlineWords(segments: TextSegmentContract[]): string {\n const KEEP = 32;\n return segments\n .map((s) => {\n const flat = s.value.replaceAll(/\\s+/g, \" \");\n if (s.op === \"insert\") return `{+${flat}+}`;\n if (s.op === \"delete\") return `[-${flat}-]`;\n return flat.length > KEEP * 2 ? `${flat.slice(0, KEEP)} … ${flat.slice(-KEEP)}` : flat;\n })\n .join(\"\");\n}\n\n/** One-line preview of a field value for the diff table. */\nfunction preview(value: unknown): string {\n if (value === undefined || value === null) return \"—\";\n const text = typeof value === \"string\" ? value : JSON.stringify(value);\n const flat = text.replaceAll(/\\s+/g, \" \");\n return flat.length > 48 ? `${flat.slice(0, 47)}…` : flat;\n}\n","import type { Command } from \"commander\";\nimport { diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerReleases(program: Command): void {\n const releases = program\n .command(\"releases\")\n .description(\"Inspect what shipped and generate a revert\");\n\n releases\n .command(\"list\")\n .description(\"List releases, newest first\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().releases.list(project, { limit: Number(opts.limit) });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"#\", value: (r) => String(r.number) },\n { header: \"TITLE\", value: (r) => r.title },\n { header: \"PUBLISHED\", value: (r) => r.publishedAt },\n { header: \"BY\", value: (r) => r.publishedBy?.displayName ?? \"—\" },\n { header: \"ITEMS\", value: (r) => String(r.itemCount) },\n {\n header: \"STATE\",\n value: (r) =>\n r.revertedBy\n ? r.revertedBy.status === \"published\"\n ? `reverted by #${r.revertedBy.releaseNumber ?? \"?\"}`\n : `revert ${r.revertedBy.status}`\n : r.revertsReleaseNumber\n ? `reverts #${r.revertsReleaseNumber}`\n : \"live\",\n },\n ]),\n );\n }),\n );\n\n releases\n .command(\"inspect\")\n .description(\"Show one release\")\n .argument(\"<release>\", \"release number or published change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const release = await ctx.management().releases.get(project, args[0] as string);\n emit(release, () => {\n diag(`#${release.number} — ${release.title}`);\n diag(`published ${release.publishedAt} by ${release.publishedBy?.displayName ?? \"unknown\"}`);\n diag(`${release.itemCount} item(s), change set ${release.id}`);\n if (release.revertsReleaseNumber) diag(`reverts release #${release.revertsReleaseNumber}`);\n if (release.revertedBy) {\n diag(`revert ${release.revertedBy.status}: change set ${release.revertedBy.changeSetId}`);\n }\n });\n }),\n );\n\n releases\n .command(\"diff\")\n .description(\"Show what a release changed, field by field\")\n .argument(\"<release>\", \"release number or published change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const release = await ctx.management().releases.get(project, args[0] as string);\n // A release *is* a published change set, so its diff is the change-set\n // diff — the same one the reviewer read before publishing it.\n const diff = await ctx.management().changeSets.diff(project, release.id);\n emit({ release, ...diff }, () => {\n diag(`#${release.number} — ${release.title} (${diff.items.length} item(s))`);\n for (const item of diff.items) {\n const name = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n process.stdout.write(` ${item.operation} ${name}\\n`);\n for (const change of item.changes) {\n process.stdout.write(` ${change.kind} ${change.path}\\n`);\n }\n }\n });\n }),\n );\n\n releases\n .command(\"revert\")\n .description(\"Generate a change set restoring the state before a release\")\n .argument(\"<release>\", \"release number or published change set id\")\n .option(\"--title <title>\", \"title for the generated change set\")\n .option(\"--force\", \"revert resources a later release already changed\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().releases.revert(project, args[0] as string, {\n ...(opts.title ? { title: opts.title as string } : {}),\n ...(opts.force ? { force: true } : {}),\n });\n emit(result, () => {\n diag(`Created change set ${result.changeSet.id} — ${result.changeSet.title}`);\n table(result.reverted, [\n { header: \"OP\", value: (r) => r.operation },\n {\n header: \"RESOURCE\",\n value: (r) => (r.collection && r.slug ? `${r.collection}/${r.slug}` : r.resourceId),\n },\n { header: \"RESTORES\", value: (r) => r.restoredFromRevisionId ?? \"—\" },\n ]);\n if (result.skipped.length > 0) {\n diag(`${result.skipped.length} resource(s) skipped:`);\n for (const s of result.skipped) {\n const label = s.collection && s.slug ? `${s.collection}/${s.slug}` : s.resourceId;\n process.stderr.write(` ${label} — ${s.reason}: ${s.message}\\n`);\n }\n }\n // The revert is a draft on purpose. Saying so here is the difference\n // between someone believing the rollback is live and knowing it isn't.\n diag(`Not published. Review, then: myna changes publish ${result.changeSet.id} --confirm-publish`);\n });\n }),\n );\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { LOCKFILE_NAME, findLockfile, formatLock, parseLock, writeLock, type MynaLock } from \"@myna-sh/sdk/lock\";\nimport {\n branchForRelease,\n releasePullRequestBody,\n releasePullRequestTitle,\n type ReleaseSummary,\n} from \"@myna-sh/shared\";\nimport type { ReleaseContract } from \"@myna-sh/api-contracts\";\nimport { CliError, UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport {\n discardChanges,\n dirtyFiles,\n openPullRequest,\n repositoryRoot,\n trackedLockfiles,\n worktreeChanges,\n} from \"../git.js\";\nimport type { Ctx } from \"../client.js\";\n\n/**\n * `myna pull` — move this repository's content pin forward.\n *\n * The build reads at `myna.lock`, so bumping the lock is the act of accepting\n * new content, and it is an edit to a tracked file. With `--open-pr` that edit\n * arrives as a pull request whose body is the field-level diff of every release\n * being taken on, and the repository's own CI — the real build, the real tests —\n * runs against the content before anyone merges it.\n *\n * The point is not the file. It is that \"the CMS changed and the site broke\"\n * stops being a deploy failure and becomes a failing check on a pull request\n * somebody has to read.\n */\n\n/**\n * Where this repository's lockfile is, or where to create one.\n *\n * Bumps the lockfile that already exists rather than writing a second one\n * beside the working directory. That distinction is the whole point: a\n * repository can be pinned from a subdirectory, from its root, or by the GitHub\n * App writing to a path configured in the dashboard, and those must all land on\n * the same file. `readLock` walks up and stops at the first one it finds, so a\n * stray second lockfile does not conflict — it silently wins, and the site\n * builds from a release nobody chose.\n *\n * The search is bounded to the repository, so a lockfile in some unrelated\n * parent directory is never adopted.\n */\nfunction lockPath(ctx: Ctx): string {\n const cwd = ctx.linkedRoot ?? process.cwd();\n const found = findLockfile(cwd);\n if (found) {\n const boundary = repositoryRoot(cwd);\n if (!boundary || found.startsWith(boundary)) return found;\n }\n return join(cwd, LOCKFILE_NAME);\n}\n\n/**\n * Refuse to guess when a repository has more than one lockfile.\n *\n * Two pins for one repository is not a state anything can resolve correctly:\n * whichever sits nearest the build wins, and it may not be the one being moved.\n * Naming both and stopping is the only honest answer.\n */\nfunction assertOneLockfile(cwd: string, active: string): void {\n const all = trackedLockfiles(cwd);\n if (all.length <= 1) return;\n throw new UsageError(\n `This repository has ${all.length} lockfiles:\\n` +\n all.map((f) => ` ${f}${f === active ? \" (the one this would move)\" : \"\"}`).join(\"\\n\") +\n `\\nReads take the one nearest the build, which may not be that one. Delete the extras and keep a single ${LOCKFILE_NAME}.`,\n );\n}\n\nfunction readLockAt(file: string): MynaLock | undefined {\n if (!existsSync(file)) return undefined;\n return parseLock(readFileSync(file, \"utf8\"), file);\n}\n\nasync function latestRelease(ctx: Ctx, project: string): Promise<ReleaseContract> {\n const page = await ctx.management().releases.list(project, { limit: 1 });\n const latest = page.data[0];\n if (!latest) {\n throw new CliError(\n `Project ${project} has not published a release yet. There is nothing to pin — publish a change set first.`,\n );\n }\n return latest;\n}\n\n/**\n * Every release strictly after `from`, up to and including `to`, oldest first.\n *\n * Pages backwards from the newest and stops as soon as it walks past `from`,\n * so bumping a lock that is one release behind costs one request whether the\n * project has ten releases or ten thousand.\n */\nasync function releasesBetween(\n ctx: Ctx,\n project: string,\n from: number,\n to: number,\n): Promise<ReleaseContract[]> {\n const found: ReleaseContract[] = [];\n let cursor: string | undefined;\n for (;;) {\n const page = await ctx.management().releases.list(project, { limit: 50, ...(cursor ? { cursor } : {}) });\n for (const release of page.data) {\n if (release.number > to) continue;\n if (release.number <= from) return found.reverse();\n found.push(release);\n }\n if (!page.nextCursor) return found.reverse();\n cursor = page.nextCursor;\n }\n}\n\n/**\n * Assemble the pull request text.\n *\n * The rendering itself lives in `@myna-sh/shared`, because the GitHub App opens\n * the same pull request from the API side. If the two rendered differently, the\n * App and a CI job watching the same project would each open one for the same\n * release and neither would recognize the other's as already proposed.\n */\nasync function pullRequestText(\n ctx: Ctx,\n project: string,\n from: MynaLock | undefined,\n to: ReleaseContract,\n releases: ReleaseContract[],\n rollback: boolean,\n): Promise<{ title: string; body: string }> {\n const summaries: ReleaseSummary[] = await Promise.all(\n releases.map(async (release) => ({\n number: release.number,\n title: release.title,\n description: release.description,\n itemCount: release.itemCount,\n // A release whose diff cannot be read is still a release worth naming.\n diff: await ctx\n .management()\n .changeSets.diff(project, release.id)\n .catch(() => null),\n })),\n );\n const input = {\n project,\n from: from?.release ?? null,\n to: { number: to.number, title: to.title, description: to.description, itemCount: to.itemCount },\n releases: summaries,\n rollback,\n };\n return { title: releasePullRequestTitle(input), body: releasePullRequestBody(input) };\n}\n\nexport function registerPull(program: Command): void {\n program\n .command(\"pull\")\n .description(`Pin this repository's content to a release in ${LOCKFILE_NAME}`)\n .option(\"--release <n>\", \"release number to pin to (default: the newest)\")\n .option(\"--check\", \"report whether the pin is behind and exit non-zero if it is\", false)\n .option(\"--open-pr\", \"commit the bump onto a branch and open a pull request\", false)\n .option(\n \"--run <command>\",\n \"shell command to run after moving the pin; anything it changes is committed with the lockfile\",\n )\n .option(\"--branch <name>\", \"branch to use with --open-pr (default: derived from the release)\")\n .option(\"--base <branch>\", \"branch to open the pull request against (default: the current branch)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const file = lockPath(ctx);\n assertOneLockfile(ctx.linkedRoot ?? process.cwd(), file);\n const current = readLockAt(file);\n\n if (current && current.project !== project) {\n throw new UsageError(\n `${LOCKFILE_NAME} pins project \"${current.project}\" but the selected project is \"${project}\". Pass --project ${current.project}, or delete the lockfile.`,\n );\n }\n\n const target = opts.release\n ? await ctx.management().releases.get(project, String(opts.release))\n : await latestRelease(ctx, project);\n\n // --check answers one question — is the build reading stale content? —\n // and answers it with an exit code, because that is what CI reads.\n if (opts.check) {\n if (!current) {\n throw new UsageError(`No ${LOCKFILE_NAME} here. Run \\`myna pull\\` to create one.`);\n }\n const behind = await releasesBetween(ctx, project, current.release, target.number);\n emit(\n { lockfile: file, release: current.release, latest: target.number, behind: behind.map((r) => r.number) },\n () => {\n if (behind.length === 0) {\n diag(`${LOCKFILE_NAME} is at release #${current.release} — current.`);\n return;\n }\n diag(`${LOCKFILE_NAME} is at release #${current.release}; #${target.number} is available.`);\n table(behind, [\n { header: \"#\", value: (r) => String(r.number) },\n { header: \"TITLE\", value: (r) => r.title },\n { header: \"PUBLISHED\", value: (r) => r.publishedAt },\n { header: \"ITEMS\", value: (r) => String(r.itemCount) },\n ]);\n },\n );\n if (behind.length > 0) process.exitCode = 1;\n return;\n }\n\n const next: MynaLock = {\n project,\n release: target.number,\n publishedAt: target.publishedAt,\n title: target.title,\n ...(ctx.apiUrl && !ctx.apiUrl.startsWith(\"https://api.myna.sh\") ? { apiUrl: ctx.apiUrl } : {}),\n };\n\n if (current && formatLock(current) === formatLock(next)) {\n emit({ lockfile: file, release: target.number, changed: false, pullRequest: null }, () =>\n diag(`${LOCKFILE_NAME} is already at release #${target.number}.`),\n );\n return;\n }\n\n // `--release` can point backwards, and a rollback is a legitimate reason\n // to pull: the previous release is the fastest way to get a green build\n // back. The span is the same set of releases either way — it is only the\n // direction of travel, and therefore the wording, that differs.\n const rollback = current !== undefined && target.number < current.release;\n const releases = rollback\n ? await releasesBetween(ctx, project, target.number, current.release)\n : await releasesBetween(ctx, project, current?.release ?? 0, target.number);\n\n if (!opts.openPr) {\n writeLock(file, next);\n if (opts.run) execSync(opts.run as string, { cwd: ctx.linkedRoot ?? process.cwd(), stdio: \"inherit\" });\n emit(\n {\n lockfile: file,\n release: target.number,\n from: current?.release ?? null,\n changed: true,\n rollback,\n releases: releases.map((r) => r.number),\n },\n () => {\n if (!current) {\n diag(`${LOCKFILE_NAME}: pinned to #${target.number}.`);\n return;\n }\n diag(\n rollback\n ? `${LOCKFILE_NAME}: #${current.release} → #${target.number}, rolling back ${releases.length} release(s).`\n : `${LOCKFILE_NAME}: #${current.release} → #${target.number} (${releases.length} release(s)).`,\n );\n },\n );\n return;\n }\n\n const root = ctx.linkedRoot ?? process.cwd();\n const command = opts.run as string | undefined;\n // Anything already modified would be swept into the commit, and a pull\n // request nobody meant to open is worse than one that was not opened.\n // With --run the guard has to cover the whole repository rather than the\n // lockfile, and cover exactly what the commit will: the command may write\n // anywhere, and a check narrower than the commit is not a check.\n const dirty = command\n ? worktreeChanges(root).map((c) => c.file)\n : dirtyFiles(root, [file]);\n if (dirty.length > 0) {\n throw new UsageError(`Commit or stash ${dirty.join(\", \")} first.`);\n }\n\n // Described before anything moves: the span is what the pin was a moment\n // ago, and bumping it first would describe the wrong one.\n const text = await pullRequestText(ctx, project, current, target, releases, rollback);\n writeLock(file, next);\n\n // The pin moves before the command runs, so the command reads content at\n // the new release — a generated snapshot, a prerendered page, a search\n // index. Whatever it produces is committed with the pin that produced it,\n // which keeps a derived artifact and its source release in one reviewable\n // unit instead of two commits that can disagree.\n if (command) {\n try {\n execSync(command, { cwd: root, stdio: \"inherit\" });\n } catch (error) {\n discardChanges(root, worktreeChanges(root));\n throw new CliError(`--run command failed: ${(error as Error).message}`);\n }\n }\n\n const changes = worktreeChanges(root);\n const branch = (opts.branch as string | undefined) ?? branchForRelease(project, target.number);\n let result;\n try {\n result = openPullRequest({\n cwd: root,\n files: changes.map((c) => c.file),\n branch,\n base: opts.base as string | undefined,\n title: text.title,\n body: text.body,\n });\n } catch (error) {\n discardChanges(root, changes);\n throw error;\n }\n // On success `openPullRequest` checks the base branch back out, which\n // restores tracked files; untracked ones it created are still here.\n if (!result.opened) discardChanges(root, changes);\n\n emit({ lockfile: file, release: target.number, from: current?.release ?? null, releases: releases.map((r) => r.number), pullRequest: result }, () => {\n if (!result.opened) {\n diag(`Branch ${result.branch} already exists — release #${target.number} is already proposed.`);\n return;\n }\n diag(`Opened ${result.url ?? `pull request from ${result.branch}`} against ${result.base}.`);\n });\n }),\n );\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n formatLock as formatLockImpl,\n parseLock as parseLockImpl,\n type MynaLock as SharedMynaLock,\n} from \"@myna-sh/shared/lock\";\n\n/**\n * `myna.lock` — the release a repository builds against.\n *\n * Content is the one input to a build that is normally left unpinned. Source is\n * a commit, dependencies are a lockfile, and content is \"whatever the API said\n * when the runner started\" — so the same commit builds two different sites on\n * two different days, and a content change that breaks the build surfaces as a\n * failed deploy rather than a failed check.\n *\n * A lockfile fixes that. It names a release, `createMyna({ release })` reads at\n * it, and the build becomes reproducible: same commit plus same lock produces\n * the same bytes. Moving to newer content is then an edit to a tracked file,\n * which is to say a pull request — opened by the GitHub App, or by\n * `myna pull --open-pr` for repositories that would rather not install one.\n *\n * The file *format* is implemented in `@myna-sh/shared`, because Myna's own API\n * writes this file too and the two must produce identical bytes. What is here is\n * the filesystem handling, kept in a separate entry point (`@myna-sh/sdk/lock`)\n * precisely so importing it cannot drag `node:fs` into a browser bundle.\n *\n * The public shape below is *declared* here rather than re-exported, which looks\n * like duplication and is not. `@myna-sh/shared` is private and never published,\n * so anything the published declarations name has to be inlined — and tsup does\n * not inline a pass-through `export ... from`. It emitted a re-export pointing at\n * a package no consumer can install, which typechecked inside this repository\n * and failed for everyone outside it. The runtime was fine either way, which is\n * exactly why it would have shipped.\n *\n * The implementations are still the shared ones, and the two assertions below\n * fail the build if the definitions of `MynaLock` ever drift apart.\n */\n\nexport const LOCKFILE_NAME = \"myna.lock\";\n\nexport interface MynaLock {\n /** Project id or slug the release number belongs to. */\n project: string;\n /** Release number this repository reads at. */\n release: number;\n /** When that release published. Informational; the number is the pin. */\n publishedAt: string;\n /** Title of the release, so a diff of this file reads like a changelog. */\n title?: string;\n /** API origin, when it is not the default `https://api.myna.sh`. */\n apiUrl?: string;\n}\n\n/**\n * Compile-time proof that the declaration above still matches the shared one.\n *\n * Two assertions, because one is not enough. Mutual assignability catches a\n * changed or removed field, but silently allows a *new optional* one — and an\n * optional field added to the shared type and not here is precisely the drift\n * this is guarding against, since consumers would have no way to set it. So the\n * key sets are compared as well.\n *\n * Both are erased at build time; their whole job is to fail `tsc`.\n */\ntype MutuallyAssignable<A, B> = [A] extends [B] ? ([B] extends [A] ? true : never) : never;\ntype SameKeys<A, B> = MutuallyAssignable<keyof A, keyof B>;\n\nconst _lockShapesAgree: MutuallyAssignable<MynaLock, SharedMynaLock> = true;\nconst _lockKeysAgree: SameKeys<MynaLock, SharedMynaLock> = true;\nvoid _lockShapesAgree;\nvoid _lockKeysAgree;\n\n/** Serialize a lockfile. Key order is fixed and the file ends in a newline. */\nexport function formatLock(lock: MynaLock): string {\n return formatLockImpl(lock);\n}\n\n/**\n * Parse a lockfile, throwing when it exists but is malformed — a build that\n * believes it is pinned and is not is the failure pinning exists to prevent.\n */\nexport function parseLock(source: string, origin = LOCKFILE_NAME): MynaLock {\n return parseLockImpl(source, origin);\n}\n\n/** Walk up from `startDir` looking for a lockfile. Returns its path. */\nexport function findLockfile(startDir: string = process.cwd()): string | undefined {\n let dir = resolve(startDir);\n for (;;) {\n const file = join(dir, LOCKFILE_NAME);\n if (existsSync(file)) return file;\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\n/**\n * Read the nearest lockfile, or `undefined` if there is none.\n *\n * A missing lockfile is an ordinary state — the repository has not opted in —\n * and reads live. A lockfile that exists but does not parse is not: it means a\n * build is about to read content nobody pinned while believing it pinned it, so\n * it throws rather than silently falling back.\n */\nexport function readLock(startDir: string = process.cwd()): MynaLock | undefined {\n const file = findLockfile(startDir);\n if (!file) return undefined;\n return parseLock(readFileSync(file, \"utf8\"), file);\n}\n\nexport function writeLock(file: string, lock: MynaLock): void {\n writeFileSync(file, formatLock(lock));\n}\n","/**\n * `myna.lock` — the release a repository builds against — and the pull request\n * that moves it.\n *\n * All of this lives here rather than in the CLI because two things now open\n * that pull request: `myna pull --open-pr`, run from someone's CI, and the\n * GitHub App, run from Myna's own job runner when a change set publishes. They\n * have to agree on the bytes of the lockfile, the name of the branch, and the\n * text of the body — otherwise the App and the CLI would each open a pull\n * request for the same release, differing only in formatting, and neither would\n * recognize the other's as already proposed.\n *\n * Nothing here touches the filesystem or the network, so it is safe in a\n * browser bundle, in the API, and in the CLI alike. The Node-only file handling\n * is `@myna-sh/sdk/lock`.\n */\n\nexport const LOCKFILE_NAME = \"myna.lock\";\n\nexport interface MynaLock {\n /** Project id or slug the release number belongs to. */\n project: string;\n /** Release number this repository reads at. */\n release: number;\n /** When that release published. Informational; the number is the pin. */\n publishedAt: string;\n /** Title of the release, so a diff of this file reads like a changelog. */\n title?: string;\n /** API origin, when it is not the default `https://api.myna.sh`. */\n apiUrl?: string;\n}\n\n/**\n * Serialize a lockfile.\n *\n * Key order is fixed and the file ends in a newline, so bumping the release\n * produces a one-or-two-line diff rather than a reshuffle a reviewer has to\n * read in full. Both writers call this, so a repository that has been updated\n * by the App and then by the CLI shows no spurious churn.\n */\nexport function formatLock(lock: MynaLock): string {\n const ordered: Record<string, unknown> = {\n project: lock.project,\n release: lock.release,\n publishedAt: lock.publishedAt,\n };\n if (lock.title) ordered.title = lock.title;\n if (lock.apiUrl) ordered.apiUrl = lock.apiUrl;\n return `${JSON.stringify(ordered, null, 2)}\\n`;\n}\n\n/**\n * Parse a lockfile.\n *\n * A malformed lockfile throws rather than degrading to live reads: a build that\n * believes it is pinned and is not is the failure pinning exists to prevent.\n */\nexport function parseLock(source: string, origin = LOCKFILE_NAME): MynaLock {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`${origin} is not valid JSON: ${(error as Error).message}`);\n }\n const lock = parsed as Partial<MynaLock>;\n if (typeof lock?.project !== \"string\" || !lock.project) {\n throw new Error(`${origin} is missing \"project\".`);\n }\n if (typeof lock.release !== \"number\" || !Number.isInteger(lock.release) || lock.release < 0) {\n throw new Error(`${origin} is missing a non-negative integer \"release\".`);\n }\n return {\n project: lock.project,\n release: lock.release,\n publishedAt: typeof lock.publishedAt === \"string\" ? lock.publishedAt : \"\",\n ...(lock.title ? { title: lock.title } : {}),\n ...(lock.apiUrl ? { apiUrl: lock.apiUrl } : {}),\n };\n}\n\n/**\n * The branch a content pull uses: one per project and target release.\n *\n * Deterministic, and that is the whole point. A publish can be announced more\n * than once — a webhook retry, a replayed delivery, a nightly safety net, or\n * both the App and a CI job watching the same project — and every one of those\n * has to land on the same branch name so the second finds the first already\n * there and opens nothing.\n */\nexport function branchForRelease(project: string, release: number): string {\n const slug = project.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"project\";\n return `myna/content-${slug}-r${release}`;\n}\n\n/** How many releases a pull request body describes in full before summarizing. */\nconst MAX_DETAILED_RELEASES = 20;\n\n/** The shape the body renderer needs, structural so this file depends on nothing. */\nexport interface ReleaseSummary {\n number: number;\n title: string;\n description?: string | null;\n itemCount?: number;\n /** Absent when the diff could not be read; the release is still named. */\n diff?: ReleaseDiff | null;\n}\n\nexport interface ReleaseDiff {\n items: {\n operation: string;\n collection?: string | null;\n slug?: string | null;\n resourceId: string;\n changeSummary?: string | null;\n changes: { path: string; kind: string }[];\n }[];\n}\n\nexport interface PullRequestTextInput {\n project: string;\n /** The pin being left, or null when this is the first one. */\n from: number | null;\n to: ReleaseSummary;\n /** Every release in the span, oldest first. */\n releases: ReleaseSummary[];\n /** True when the pin is moving backwards. */\n rollback: boolean;\n}\n\nexport function releasePullRequestTitle(input: PullRequestTextInput): string {\n return input.rollback\n ? `chore(content): roll ${input.project} back to release #${input.to.number}`\n : `chore(content): ${input.project} release #${input.to.number} — ${input.to.title}`;\n}\n\n/**\n * The pull request body: what taking this content on actually changes.\n *\n * Field paths, not just entry names. A reviewer looking at a lockfile bump can\n * otherwise only see a number move, which tells them nothing about whether the\n * build that is about to run will still pass.\n */\nexport function releasePullRequestBody(input: PullRequestTextInput): string {\n const { project, from, to, releases, rollback } = input;\n const lines = [\n from === null\n ? `Pins \\`${LOCKFILE_NAME}\\` for \\`${project}\\` to release #${to.number}.`\n : rollback\n ? `Rolls \\`${LOCKFILE_NAME}\\` for \\`${project}\\` back from release #${from} to #${to.number}.`\n : `Moves \\`${LOCKFILE_NAME}\\` for \\`${project}\\` from release #${from} to #${to.number}.`,\n \"\",\n rollback\n ? `${releases.length} release(s) are being undone for this repository. The content itself is untouched — nothing is unpublished — this only changes which release the build reads.`\n : `${releases.length} release(s). The build reads content at this release, so CI on this pull request is running against exactly the content that will ship.`,\n ];\n\n const detailed = releases.slice(-MAX_DETAILED_RELEASES);\n if (detailed.length < releases.length) {\n const omitted = releases.length - detailed.length;\n lines.push(\n \"\",\n `_Showing the newest ${detailed.length} of ${releases.length} releases. The remaining ${omitted} are listed without field detail._`,\n \"\",\n ...releases.slice(0, omitted).map((r) => `- #${r.number} — ${r.title} (${r.itemCount ?? 0} item(s))`),\n );\n }\n\n for (const release of detailed) {\n lines.push(\"\", `### #${release.number} — ${release.title}`);\n if (release.description) lines.push(\"\", release.description);\n if (!release.diff) {\n lines.push(\"\", `_Diff unavailable; ${release.itemCount ?? 0} item(s) changed._`);\n continue;\n }\n for (const item of release.diff.items) {\n const name = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n lines.push(\"\", `- **${item.operation} ${name}**`);\n if (item.changeSummary) lines.push(` - _${item.changeSummary}_`);\n for (const change of item.changes) lines.push(` - \\`${change.path}\\` ${change.kind}`);\n }\n }\n return lines.join(\"\\n\");\n}\n","import { ulid } from \"ulid\";\n\n/**\n * Prefixed, monotonic, URL-safe application identifiers.\n *\n * Every resource has a stable short prefix. The body is a lowercased ULID,\n * which is monotonic (time-ordered), URL-safe (Crockford base32), and globally\n * unique. Example: `usr_01jb& ...` lowercased.\n */\nexport const ID_PREFIXES = {\n user: \"usr\",\n oauthAccount: \"oau\",\n session: \"ses\",\n organization: \"org\",\n organizationMember: \"mem\",\n organizationInvitation: \"inv\",\n project: \"prj\",\n projectOrigin: \"por\",\n apiKey: \"key\",\n collection: \"col\",\n collectionVersion: \"clv\",\n entry: \"ent\",\n entrySlugAlias: \"als\",\n entryRevision: \"rev\",\n changeSet: \"chs\",\n changeSetItem: \"csi\",\n changeSetReview: \"csr\",\n changeSetComment: \"csc\",\n changeSetCheck: \"chk\",\n projectCheck: \"pck\",\n asset: \"ast\",\n assetUpload: \"upl\",\n savedView: \"viw\",\n previewToken: \"prv\",\n webhookEndpoint: \"whk\",\n webhookEvent: \"whe\",\n webhookDelivery: \"whd\",\n auditEvent: \"aud\",\n job: \"job\",\n idempotencyKey: \"idm\",\n billingCustomer: \"bcu\",\n billingSubscription: \"bsu\",\n billingProviderEvent: \"evt\",\n usagePeriod: \"usp\",\n mcpClient: \"mcl\",\n mcpGrant: \"mgr\",\n mcpAuthorizationCode: \"mac\",\n mcpToken: \"mtk\",\n deviceAuthorization: \"dev\",\n githubInstallation: \"ghi\",\n projectRepository: \"prp\",\n} as const;\n\nexport type IdResource = keyof typeof ID_PREFIXES;\nexport type IdPrefix = (typeof ID_PREFIXES)[IdResource];\n\n/**\n * A branded string type for prefixed IDs of a given resource.\n * `PrefixedId<\"user\">` narrows to `` `usr_${string}` ``.\n */\nexport type PrefixedId<R extends IdResource> = `${(typeof ID_PREFIXES)[R]}_${string}`;\n\n/** Generate a new prefixed monotonic ID for a resource kind. */\nexport function newId<R extends IdResource>(resource: R): PrefixedId<R> {\n const prefix = ID_PREFIXES[resource];\n return `${prefix}_${ulid().toLowerCase()}` as PrefixedId<R>;\n}\n\n/** Generate a new ID from a raw prefix string (escape hatch). */\nexport function newIdWithPrefix(prefix: string): string {\n return `${prefix}_${ulid().toLowerCase()}`;\n}\n\nconst PREFIX_SET: ReadonlySet<string> = new Set(Object.values(ID_PREFIXES));\n\n/** Split a prefixed ID into `{ prefix, body }`, or `null` if malformed. */\nexport function parseId(id: string): { prefix: string; body: string } | null {\n const idx = id.indexOf(\"_\");\n if (idx <= 0 || idx === id.length - 1) return null;\n return { prefix: id.slice(0, idx), body: id.slice(idx + 1) };\n}\n\n/** True if `id` is a well-formed ID for the given resource kind. */\nexport function isId<R extends IdResource>(resource: R, id: string): id is PrefixedId<R> {\n const parsed = parseId(id);\n return parsed !== null && parsed.prefix === ID_PREFIXES[resource];\n}\n\n/** True if `id` carries any known Myna resource prefix. */\nexport function isKnownId(id: string): boolean {\n const parsed = parseId(id);\n return parsed !== null && PREFIX_SET.has(parsed.prefix);\n}\n","/** UTC / date utilities. All Myna timestamps are UTC. */\n\n/** Current instant. */\nexport function now(): Date {\n return new Date();\n}\n\n/** ISO-8601 UTC string (millisecond precision). */\nexport function toIso(date: Date): string {\n return date.toISOString();\n}\n\n/** Parse an ISO string; returns `null` when invalid. */\nexport function parseIso(value: string): Date | null {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nexport function addSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() + seconds * 1000);\n}\n\nexport function addDays(date: Date, days: number): Date {\n return addSeconds(date, days * 86_400);\n}\n\nexport function isPast(date: Date, reference: Date = now()): boolean {\n return date.getTime() < reference.getTime();\n}\n\n/** Start of the current UTC calendar month (used for Free-plan usage periods). */\nexport function startOfUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0));\n}\n\n/** Start of the next UTC calendar month. */\nexport function startOfNextUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 1, 0, 0, 0, 0));\n}\n\nexport const SECONDS = 1;\nexport const MINUTES = 60;\nexport const HOURS = 60 * 60;\nexport const DAYS = 24 * 60 * 60;\n","/**\n * Browser origin normalization.\n *\n * An `Origin` request header is always exactly `scheme://host[:port]` — never a\n * trailing slash, never a path. What people configure is whatever their address\n * bar showed them, which usually *does* carry a trailing slash. Comparing the\n * two as raw strings means a perfectly reasonable `https://example.com/` never\n * matches the `https://example.com` the browser sends, and CORS fails with no\n * error anywhere: the API returns 200, the browser discards the response, and\n * the developer sees an unexplained network failure.\n *\n * Normalizing both sides of that comparison is what makes configuration behave\n * the way people expect.\n */\n\n/**\n * Reduce a user-supplied origin to its canonical `scheme://host[:port]` form.\n * Returns undefined for anything that is not an http(s) URL.\n *\n * Paths, queries, and fragments are dropped rather than rejected: someone who\n * pastes `https://example.com/blog` means that site, and refusing it teaches\n * nothing.\n */\nexport function normalizeOrigin(value: string): string | undefined {\n try {\n const url = new URL(value.trim());\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n // `URL.origin` is already the canonical form and drops the default port.\n return url.origin;\n } catch {\n return undefined;\n }\n}\n\n/** Normalize a list, dropping unparseable entries and duplicates, order preserved. */\nexport function normalizeOrigins(values: readonly string[]): string[] {\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = normalizeOrigin(value);\n if (normalized) seen.add(normalized);\n }\n return [...seen];\n}\n","/**\n * Plan and entitlement constants (SPEC section 16).\n *\n * Polar identifiers never drive authorization directly; they map to these\n * internal plan keys and entitlements.\n */\n\nexport const PLAN_KEYS = [\"free\", \"pro\", \"internal\"] as const;\nexport type PlanKey = (typeof PLAN_KEYS)[number];\n\n/** Plans a customer can actually buy. `internal` is not one of them. */\nexport const PURCHASABLE_PLAN_KEYS = [\"free\", \"pro\"] as const;\nexport type PurchasablePlanKey = (typeof PURCHASABLE_PLAN_KEYS)[number];\n\n/** Metered usage metrics tracked per organization. */\nexport const USAGE_METRICS = [\n \"public_api_requests\",\n \"storage_bytes\",\n \"asset_bandwidth_bytes\",\n \"webhook_deliveries\",\n] as const;\nexport type UsageMetric = (typeof USAGE_METRICS)[number];\n\nconst GB = 1024 ** 3;\nconst MB = 1024 ** 2;\n\n/**\n * Sentinel for an allowance that is not enforced.\n *\n * `Infinity` would be the honest value, but every one of these numbers is\n * serialized into a JSON usage report, and `JSON.stringify(Infinity)` is\n * `null` — which a client cannot tell apart from \"no limit tracked for this\n * metric\". A finite ceiling no organization can reach survives the round trip\n * and still compares correctly against real usage.\n */\nexport const UNLIMITED = Number.MAX_SAFE_INTEGER;\n\n/** True when an entitlement value is the unenforced sentinel. */\nexport function isUnlimited(value: number | null): boolean {\n return value === UNLIMITED;\n}\n\nexport interface PlanEntitlements {\n key: PlanKey;\n /** Display price for UI only; billing is owned by Polar. */\n priceEurMonthly: number;\n priceEurYearly: number | null;\n maxProjects: number;\n maxMembers: number;\n /** Hard storage allowance in bytes. */\n storageBytes: number;\n /** Soft monthly asset bandwidth allowance in bytes. */\n monthlyBandwidthBytes: number;\n /** Soft monthly public content API request allowance. */\n monthlyPublicApiRequests: number;\n maxWebhookEndpoints: number;\n /** Revision retention in days; `null` means indefinite. */\n revisionRetentionDays: number | null;\n /** Per-file upload ceiling in bytes. */\n maxUploadBytes: number;\n}\n\nexport const PLANS: Record<PlanKey, PlanEntitlements> = {\n free: {\n key: \"free\",\n priceEurMonthly: 0,\n priceEurYearly: 0,\n maxProjects: 2,\n maxMembers: 2,\n storageBytes: 1 * GB,\n monthlyBandwidthBytes: 25 * GB,\n monthlyPublicApiRequests: 10_000,\n maxWebhookEndpoints: 1,\n revisionRetentionDays: 30,\n maxUploadBytes: 50 * MB,\n },\n pro: {\n key: \"pro\",\n priceEurMonthly: 9,\n priceEurYearly: 90,\n maxProjects: 10,\n maxMembers: 5,\n storageBytes: 10 * GB,\n monthlyBandwidthBytes: 250 * GB,\n monthlyPublicApiRequests: 500_000,\n maxWebhookEndpoints: 10,\n revisionRetentionDays: null,\n maxUploadBytes: 250 * MB,\n },\n /**\n * Myna's own organizations — the changelog, and anything else we run on the\n * product we sell. It is never sold, never offered at checkout, and cannot be\n * reached through the API: `scripts/bootstrap-internal-org.mjs` writes it\n * directly, and billing refuses to move an organization on or off it.\n */\n internal: {\n key: \"internal\",\n priceEurMonthly: 0,\n priceEurYearly: null,\n maxProjects: UNLIMITED,\n maxMembers: UNLIMITED,\n storageBytes: UNLIMITED,\n monthlyBandwidthBytes: UNLIMITED,\n monthlyPublicApiRequests: UNLIMITED,\n maxWebhookEndpoints: UNLIMITED,\n revisionRetentionDays: null,\n maxUploadBytes: UNLIMITED,\n },\n};\n\nexport function planFor(key: PlanKey): PlanEntitlements {\n return PLANS[key];\n}\n\n/** Display name for a plan. One spelling, every surface. */\nexport function planLabel(key: PlanKey): string {\n return { free: \"Free\", pro: \"Pro\", internal: \"Internal\" }[key];\n}\n\n/** Soft-limit warning thresholds for metered usage (SPEC 16). */\nexport const USAGE_THRESHOLDS = {\n warn: 0.8,\n atLimit: 1.0,\n throttle: 1.2,\n} as const;\n\n/** Failed-payment grace windows in days (SPEC 16). */\nexport const DUNNING = {\n fullAccessUntilDay: 7,\n restrictedUntilDay: 14,\n downgradeAtDay: 15,\n} as const;\n\n/** Soft-deletion / recovery windows in days. */\nexport const RETENTION = {\n organizationDeletionDays: 30,\n assetDeletionDays: 30,\n pendingUploadHours: 24,\n previewTokenDefaultHours: 24,\n previewTokenMaxDays: 7,\n sessionDays: 30,\n} as const;\n","/**\n * Fractional ranking for editorial ordering.\n *\n * Ranks are strings compared lexicographically, and between any two of them\n * another can always be generated: `\"a0\" < \"a1\" < \"a1V\" < \"a2\"`. That property\n * is the whole point. A numeric `order` field means moving one entry rewrites\n * the position of every entry after it — reordering twenty projects produces\n * twenty revisions, nineteen of which record no editorial decision and bury the\n * one that does. A subdividable string means one move touches one row.\n *\n * Two invariants make it work, and both are maintained by the generators here:\n *\n * 1. A rank is never empty.\n * 2. A rank never ends in the smallest digit. Without this, `\"0\"` could exist,\n * and nothing sorts before `\"0\"` — inserting at the top would be impossible.\n */\n\nconst DIGITS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst MIN_DIGIT = DIGITS[0]!;\nconst LAST_INDEX = DIGITS.length - 1;\n/** Midpoint digit, used whenever an unconstrained choice is needed. */\nconst MID_DIGIT = DIGITS[Math.floor(DIGITS.length / 2)]!;\n\nexport class RankError extends Error {}\n\nfunction indexOf(digit: string): number {\n const index = DIGITS.indexOf(digit);\n if (index === -1) throw new RankError(`\"${digit}\" is not a valid rank digit.`);\n return index;\n}\n\n/** A rank strictly greater than `after` (which may be an empty suffix). */\nfunction rankAfterSuffix(after: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= after.length) {\n // Everything consumed: any appended digit sorts after a proper prefix.\n return prefix + MID_DIGIT;\n }\n const index = indexOf(after[i]!);\n if (index < LAST_INDEX) {\n // Halfway between this digit and the top; never the smallest digit.\n return prefix + DIGITS[Math.floor((index + DIGITS.length) / 2)]!;\n }\n // Already the largest digit — keep it and decide at the next position.\n prefix += after[i]!;\n }\n}\n\n/** A rank strictly less than `before`. */\nfunction rankBeforeString(before: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= before.length) {\n // Only reachable if `before` is all smallest-digits, which invariant 2\n // forbids. Guard rather than loop forever on corrupted data.\n throw new RankError(`Cannot rank before \"${before}\".`);\n }\n const index = indexOf(before[i]!);\n if (index > 1) return prefix + DIGITS[Math.floor(index / 2)]!;\n if (index === 1) {\n // Anything starting with the smallest digit sorts first; append a\n // non-smallest digit so invariant 2 holds.\n return prefix + MIN_DIGIT + MID_DIGIT;\n }\n prefix += MIN_DIGIT;\n }\n}\n\n/**\n * A rank strictly between `a` and `b`. `null` means unbounded on that side.\n * Throws when `a >= b`, which would have no answer.\n */\nexport function rankBetween(a: string | null, b: string | null): string {\n if (a !== null && b !== null && a >= b) {\n throw new RankError(`Cannot rank between \"${a}\" and \"${b}\": out of order.`);\n }\n if (a === null && b === null) return MID_DIGIT;\n if (a === null) return rankBeforeString(b!);\n if (b === null) return rankAfterSuffix(a);\n\n let prefix = \"\";\n for (let i = 0; ; i++) {\n // A shorter `a` behaves as if padded with the smallest digit.\n const digitA = i < a.length ? a[i]! : MIN_DIGIT;\n const digitB = i < b.length ? b[i] : undefined;\n\n if (digitB !== undefined && digitA === digitB) {\n prefix += digitA;\n continue;\n }\n\n const indexA = indexOf(digitA);\n const indexB = digitB !== undefined ? indexOf(digitB) : DIGITS.length;\n\n if (indexB - indexA > 1) {\n // Room between them: take the middle. It exceeds `a` and precedes `b`,\n // and is never the smallest digit because the gap is at least two.\n return prefix + DIGITS[Math.floor((indexA + indexB) / 2)]!;\n }\n\n // Adjacent digits leave no room here. Stay on `a`'s branch — anything under\n // it sorts before `b` — and go past `a`'s remainder.\n return prefix + digitA + rankAfterSuffix(a.slice(i + 1));\n }\n}\n\n/** Largest width to spread a sequence over; 62^4 stays well inside safe integers. */\nconst MAX_WIDTH = 4;\n\n/**\n * Evenly spaced ranks for `count` items, for a full (re)ordering.\n *\n * Spread across the digit space rather than generated by repeated append:\n * appending halves the remaining room each time, so a 200-item collection would\n * end up with 30-character ranks. Even spacing keeps them at two or three\n * characters and leaves room between every neighbouring pair for later\n * single-item moves.\n */\nexport function rankSequence(count: number): string[] {\n if (count <= 0) return [];\n\n let width = 1;\n while (width < MAX_WIDTH && Math.floor(DIGITS.length ** width / (count + 1)) < 2) {\n width += 1;\n }\n const step = Math.floor(DIGITS.length ** width / (count + 1));\n if (step < 1) {\n // More items than the widest spread can separate: fall back to subdivision,\n // which always works even though the ranks grow longer.\n const ranks: string[] = [];\n let previous: string | null = null;\n for (let i = 0; i < count; i++) {\n previous = rankBetween(previous, null);\n ranks.push(previous);\n }\n return ranks;\n }\n\n const ranks: string[] = [];\n for (let i = 1; i <= count; i++) {\n let value = i * step;\n let encoded = \"\";\n for (let d = 0; d < width; d++) {\n encoded = DIGITS[value % DIGITS.length]! + encoded;\n value = Math.floor(value / DIGITS.length);\n }\n // Fixed-width encoding already sorts correctly; a trailing smallest digit\n // would break invariant 2, and appending keeps it below the next value.\n ranks.push(encoded.endsWith(MIN_DIGIT) ? encoded + MID_DIGIT : encoded);\n }\n return ranks;\n}\n\n/** True when `value` is a well-formed rank. */\nexport function isValidRank(value: string): boolean {\n if (value.length === 0) return false;\n if (value.endsWith(MIN_DIGIT)) return false;\n return [...value].every((digit) => DIGITS.includes(digit));\n}\n","/**\n * Release and compatibility contract.\n *\n * `@myna-sh/sdk`, `@myna-sh/cli`, `@myna-sh/mcp`, and `@myna-sh/react` ship as\n * one lockstep version: they are always published together from the same commit\n * and always carry the same version number. `scripts/check-versions.mjs`\n * enforces that in CI, and `scripts/set-version.mjs` is the only supported way\n * to bump it.\n *\n * The API declares what it speaks through `GET /v1/meta`, so a client never has\n * to guess. `myna doctor` reads it to tell an operator — or an agent — exactly\n * which side is out of date.\n */\n\n/**\n * Dated version of the HTTP API surface. Bump it when request or response\n * shapes change in a way a client can observe. Additive, backward-compatible\n * changes do not need a bump; they are announced through `API_CAPABILITIES`.\n */\nexport const API_VERSION = \"2026-07-27\";\n\n/**\n * Oldest `@myna-sh/{sdk,cli,mcp,react}` release this API still supports. Clients\n * below this must upgrade; the API does not promise correct behavior for them.\n * Raising this is a breaking change and needs an `API_VERSION` bump.\n */\nexport const MIN_CLIENT_VERSION = \"0.2.0\";\n\n/**\n * Feature flags a client can detect before calling. Add an entry the moment a\n * feature ships; never remove one without bumping `API_VERSION`, because\n * clients branch on these.\n */\nexport const API_CAPABILITIES = [\n \"assets\",\n /** Bounded, cached image derivatives on delivery: `?w=`, `?format=`, `?q=`. */\n \"assets.images\",\n /**\n * Images carry a `perceptualHash`, and `GET /assets/:asset/similar` finds\n * re-encoded or resized copies that a checksum comparison cannot see.\n */\n \"assets.similar\",\n /** `GET /v1/auth/whoami` reports an API key's scopes and label. */\n \"auth.whoami.scopes\",\n \"billing\",\n \"change-sets\",\n \"change-sets.checks\",\n /** Checks re-run automatically (debounced) when change-set items change. */\n \"change-sets.checks.auto\",\n /** Checks declared per project and reported from outside Myna. */\n \"change-sets.checks.external\",\n /**\n * Collections declare their own content rules (`policy`), evaluated by the\n * `policy` check. The built-in `seo` and `alt-text` checks are gone: both were\n * editorial opinions imposed on every project, and `seo` inspected field names\n * Myna invented, so it reported `passed` on collections it had never read.\n */\n \"change-sets.checks.policy\",\n /** Custom checks are declarable from the dashboard, not only the API/CLI. */\n \"change-sets.checks.settings-ui\",\n /** `GET .../checks` lists not-yet-run checks with `status: \"pending\"`. */\n \"change-sets.checks.pending\",\n /** Reviews and comments carry a resolved `reviewer`/`author` identity. */\n \"change-sets.actor-identity\",\n \"change-sets.comments\",\n /** `GET /change-sets/:id/diff` — per-item, per-field before and after. */\n \"change-sets.diff\",\n /** Prose fields carry word-level `segments`, so a long body is not just \"changed\". */\n \"change-sets.diff.words\",\n /**\n * An entry may be staged on several open change sets at once, so parallel\n * agents no longer serialize on a collection.\n */\n \"change-sets.concurrent\",\n /**\n * `POST /change-sets/:id/rebase` — field-level three-way merge onto the\n * current head, with a `conflicts` built-in check reporting overlaps first.\n */\n \"change-sets.rebase\",\n \"change-sets.ready-for-review\",\n \"change-sets.reviews\",\n \"change-sets.schedule\",\n \"entries.bulk\",\n \"entries.duplicate\",\n \"entries.import\",\n /** Import matches by slug, updates in place, and skips identical rows. */\n \"entries.import.upsert\",\n /** Fractional-rank editorial ordering; a move writes one row. */\n \"entries.reorder\",\n \"entries.references\",\n /** `?q=` full-text search on the management and public entry lists. */\n \"entries.search\",\n \"entries.restore\",\n /**\n * A single-entry read carries `openChangeSets` and `contendedFields`: who\n * else is mid-edit and where, before any tokens are spent on a colliding\n * write rather than after the `conflicts` check reports it.\n */\n \"entries.contention\",\n /** API keys may be confined to a set of collections. */\n \"keys.collection-scope\",\n \"localization\",\n /** Localized fields are filterable and sortable under the requested locale. */\n \"localization.filters\",\n /** `GET /collections/:key/translations` — per-locale coverage report. */\n \"localization.coverage\",\n /** Hosted MCP server at `/mcp` (streamable HTTP), no local process needed. */\n \"mcp.hosted\",\n /** Myna is an OAuth 2.1 AS for `/mcp`: RFC 7591 registration, PKCE, RFC 8707. */\n \"mcp.oauth\",\n /** `planKey` may be `internal`: an unmetered organization Myna runs itself. */\n \"plans.internal\",\n /** Collection and project `guidance`: house style read by writing tools. */\n \"guidance\",\n /** Every publish is a numbered release, listable and readable back. */\n \"releases\",\n /**\n * `POST /releases/:release/revert` generates a change set restoring the state\n * that preceded a release, so granting `content:publish` is reversible.\n */\n \"releases.revert\",\n \"previews\",\n /** `?preview=<token>` on content reads composes published + change-set state. */\n \"previews.overlay\",\n \"projects.cors-check\",\n /**\n * `GET /projects/:project/access` — distinguishes a missing capability from a\n * collection confinement from a missing resource, so a denial is actionable.\n */\n \"projects.access-check\",\n \"projects.export\",\n \"projects.origins\",\n /** `GET /collections/:key/entries/:slug/references` on the content API. */\n \"content.references\",\n /**\n * Myna is a GitHub App: connect a repository to a project and publishing\n * opens a pull request bumping `myna.lock`, with no CI wiring on the\n * customer's side. `myna pull --open-pr` remains for repositories that would\n * rather not install one, or that generate artifacts from content.\n */\n \"github.app\",\n /**\n * `?at=<release>` on the content API reads the collection as a numbered\n * release served it, addressed by the slugs that release carried. Pinned\n * responses are `immutable`, because a release is.\n */\n \"content.at\",\n \"projects.views\",\n \"schema.drift\",\n \"schema.promote\",\n \"schema.push\",\n \"webhooks\",\n /** Endpoints can carry custom request headers, so a delivery can authenticate. */\n \"webhooks.headers\",\n /** Endpoints can send a fixed body, for receivers with their own contract. */\n \"webhooks.body-template\",\n] as const;\n\nexport type ApiCapability = (typeof API_CAPABILITIES)[number];\n\n/** Parsed semantic version. Pre-release and build metadata are ignored. */\nexport interface SemVer {\n major: number;\n minor: number;\n patch: number;\n}\n\n/** Parse `1.2.3` (with optional `v` prefix and pre-release suffix). */\nexport function parseSemVer(version: string): SemVer | undefined {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version.trim());\n if (!match) return undefined;\n return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) };\n}\n\n/** Compare two versions: negative if `a` is older, 0 if equal, positive if newer. */\nexport function compareSemVer(a: string, b: string): number {\n const left = parseSemVer(a);\n const right = parseSemVer(b);\n if (!left || !right) throw new Error(`Cannot compare versions \"${a}\" and \"${b}\".`);\n return left.major - right.major || left.minor - right.minor || left.patch - right.patch;\n}\n\n/** True when `version` is at least `minimum`. */\nexport function satisfiesMinimum(version: string, minimum: string): boolean {\n return compareSemVer(version, minimum) >= 0;\n}\n","/**\n * `myna.lock` — the release a repository builds against — and the pull request\n * that moves it.\n *\n * All of this lives here rather than in the CLI because two things now open\n * that pull request: `myna pull --open-pr`, run from someone's CI, and the\n * GitHub App, run from Myna's own job runner when a change set publishes. They\n * have to agree on the bytes of the lockfile, the name of the branch, and the\n * text of the body — otherwise the App and the CLI would each open a pull\n * request for the same release, differing only in formatting, and neither would\n * recognize the other's as already proposed.\n *\n * Nothing here touches the filesystem or the network, so it is safe in a\n * browser bundle, in the API, and in the CLI alike. The Node-only file handling\n * is `@myna-sh/sdk/lock`.\n */\n\nexport const LOCKFILE_NAME = \"myna.lock\";\n\nexport interface MynaLock {\n /** Project id or slug the release number belongs to. */\n project: string;\n /** Release number this repository reads at. */\n release: number;\n /** When that release published. Informational; the number is the pin. */\n publishedAt: string;\n /** Title of the release, so a diff of this file reads like a changelog. */\n title?: string;\n /** API origin, when it is not the default `https://api.myna.sh`. */\n apiUrl?: string;\n}\n\n/**\n * Serialize a lockfile.\n *\n * Key order is fixed and the file ends in a newline, so bumping the release\n * produces a one-or-two-line diff rather than a reshuffle a reviewer has to\n * read in full. Both writers call this, so a repository that has been updated\n * by the App and then by the CLI shows no spurious churn.\n */\nexport function formatLock(lock: MynaLock): string {\n const ordered: Record<string, unknown> = {\n project: lock.project,\n release: lock.release,\n publishedAt: lock.publishedAt,\n };\n if (lock.title) ordered.title = lock.title;\n if (lock.apiUrl) ordered.apiUrl = lock.apiUrl;\n return `${JSON.stringify(ordered, null, 2)}\\n`;\n}\n\n/**\n * Parse a lockfile.\n *\n * A malformed lockfile throws rather than degrading to live reads: a build that\n * believes it is pinned and is not is the failure pinning exists to prevent.\n */\nexport function parseLock(source: string, origin = LOCKFILE_NAME): MynaLock {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`${origin} is not valid JSON: ${(error as Error).message}`);\n }\n const lock = parsed as Partial<MynaLock>;\n if (typeof lock?.project !== \"string\" || !lock.project) {\n throw new Error(`${origin} is missing \"project\".`);\n }\n if (typeof lock.release !== \"number\" || !Number.isInteger(lock.release) || lock.release < 0) {\n throw new Error(`${origin} is missing a non-negative integer \"release\".`);\n }\n return {\n project: lock.project,\n release: lock.release,\n publishedAt: typeof lock.publishedAt === \"string\" ? lock.publishedAt : \"\",\n ...(lock.title ? { title: lock.title } : {}),\n ...(lock.apiUrl ? { apiUrl: lock.apiUrl } : {}),\n };\n}\n\n/**\n * The branch a content pull uses: one per project and target release.\n *\n * Deterministic, and that is the whole point. A publish can be announced more\n * than once — a webhook retry, a replayed delivery, a nightly safety net, or\n * both the App and a CI job watching the same project — and every one of those\n * has to land on the same branch name so the second finds the first already\n * there and opens nothing.\n */\nexport function branchForRelease(project: string, release: number): string {\n const slug = project.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"project\";\n return `myna/content-${slug}-r${release}`;\n}\n\n/** How many releases a pull request body describes in full before summarizing. */\nconst MAX_DETAILED_RELEASES = 20;\n\n/** The shape the body renderer needs, structural so this file depends on nothing. */\nexport interface ReleaseSummary {\n number: number;\n title: string;\n description?: string | null;\n itemCount?: number;\n /** Absent when the diff could not be read; the release is still named. */\n diff?: ReleaseDiff | null;\n}\n\nexport interface ReleaseDiff {\n items: {\n operation: string;\n collection?: string | null;\n slug?: string | null;\n resourceId: string;\n changeSummary?: string | null;\n changes: { path: string; kind: string }[];\n }[];\n}\n\nexport interface PullRequestTextInput {\n project: string;\n /** The pin being left, or null when this is the first one. */\n from: number | null;\n to: ReleaseSummary;\n /** Every release in the span, oldest first. */\n releases: ReleaseSummary[];\n /** True when the pin is moving backwards. */\n rollback: boolean;\n}\n\nexport function releasePullRequestTitle(input: PullRequestTextInput): string {\n return input.rollback\n ? `chore(content): roll ${input.project} back to release #${input.to.number}`\n : `chore(content): ${input.project} release #${input.to.number} — ${input.to.title}`;\n}\n\n/**\n * The pull request body: what taking this content on actually changes.\n *\n * Field paths, not just entry names. A reviewer looking at a lockfile bump can\n * otherwise only see a number move, which tells them nothing about whether the\n * build that is about to run will still pass.\n */\nexport function releasePullRequestBody(input: PullRequestTextInput): string {\n const { project, from, to, releases, rollback } = input;\n const lines = [\n from === null\n ? `Pins \\`${LOCKFILE_NAME}\\` for \\`${project}\\` to release #${to.number}.`\n : rollback\n ? `Rolls \\`${LOCKFILE_NAME}\\` for \\`${project}\\` back from release #${from} to #${to.number}.`\n : `Moves \\`${LOCKFILE_NAME}\\` for \\`${project}\\` from release #${from} to #${to.number}.`,\n \"\",\n rollback\n ? `${releases.length} release(s) are being undone for this repository. The content itself is untouched — nothing is unpublished — this only changes which release the build reads.`\n : `${releases.length} release(s). The build reads content at this release, so CI on this pull request is running against exactly the content that will ship.`,\n ];\n\n const detailed = releases.slice(-MAX_DETAILED_RELEASES);\n if (detailed.length < releases.length) {\n const omitted = releases.length - detailed.length;\n lines.push(\n \"\",\n `_Showing the newest ${detailed.length} of ${releases.length} releases. The remaining ${omitted} are listed without field detail._`,\n \"\",\n ...releases.slice(0, omitted).map((r) => `- #${r.number} — ${r.title} (${r.itemCount ?? 0} item(s))`),\n );\n }\n\n for (const release of detailed) {\n lines.push(\"\", `### #${release.number} — ${release.title}`);\n if (release.description) lines.push(\"\", release.description);\n if (!release.diff) {\n lines.push(\"\", `_Diff unavailable; ${release.itemCount ?? 0} item(s) changed._`);\n continue;\n }\n for (const item of release.diff.items) {\n const name = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n lines.push(\"\", `- **${item.operation} ${name}**`);\n if (item.changeSummary) lines.push(` - _${item.changeSummary}_`);\n for (const change of item.changes) lines.push(` - \\`${change.path}\\` ${change.kind}`);\n }\n }\n return lines.join(\"\\n\");\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\nimport type { Ctx } from \"../client.js\";\nimport type { CreatePreviewRequest } from \"@myna-sh/api-contracts\";\n\nfunction previewTarget(ref: string): CreatePreviewRequest {\n if (ref.startsWith(\"chs_\")) return { changeSetId: ref };\n if (ref.startsWith(\"ent_\")) return { entryId: ref };\n throw new UsageError(`Preview target must be a change-set (chs_) or entry (ent_) id: ${ref}`);\n}\n\nasync function create(ctx: Ctx, ref: string) {\n return ctx.management().previews.create(ctx.requireProject(), previewTarget(ref));\n}\n\nexport function registerPreviews(program: Command): void {\n const preview = program.command(\"preview\").description(\"Create and manage preview links\");\n\n preview\n .command(\"create\")\n .description(\"Create a preview for a change set or entry\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n emit(p, () => {\n process.stdout.write(`${p.url}\\n`);\n diag(`fallback: ${p.fallbackUrl}`);\n });\n }),\n );\n\n preview\n .command(\"open\")\n .description(\"Create a preview and open it in the browser\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n if (ctx.interactive) openBrowser(p.url);\n emit(p, () => process.stdout.write(`${p.url}\\n`));\n }),\n );\n\n preview\n .command(\"list\")\n .description(\"List preview tokens for the project\")\n .action(\n handle(async (ctx) => {\n const previews = await ctx.management().previews.list(ctx.requireProject());\n emit(previews, () =>\n table(previews, [\n { header: \"ID\", value: (p) => p.id },\n { header: \"SCOPE\", value: (p) => p.changeSetId ?? p.entryId ?? \"\" },\n { header: \"EXPIRES\", value: (p) => p.expiresAt },\n { header: \"REVOKED\", value: (p) => (p.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n preview\n .command(\"revoke\")\n .description(\"Revoke a preview token\")\n .argument(\"<id>\", \"preview id (prv_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().previews.revoke(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport type { AssetContract } from \"@myna-sh/api-contracts\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerAssets(program: Command): void {\n const assets = program.command(\"assets\").description(\"Upload and manage assets\");\n\n assets\n .command(\"upload\")\n .description(\"Upload one or more files via the presigned flow\")\n .argument(\"<path...>\", \"file path(s)\")\n .option(\"--alt <text>\", \"default alt text applied to each asset\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const paths = args[0] as string[];\n const uploaded: AssetContract[] = [];\n for (const path of paths) {\n diag(`uploading ${path} …`);\n let asset = await ctx.management().assets.upload(project, path);\n if (opts.alt) asset = await ctx.management().assets.update(project, asset.id, { defaultAlt: opts.alt as string });\n uploaded.push(asset);\n // The moment to hear \"you already have this picture\" is now, while\n // deleting the copy is still free. `myna assets similar` asks the\n // same question later, and is what --json callers use.\n const similar = await ctx.management().assets.similar(project, asset.id).catch(() => []);\n for (const match of similar) {\n diag(` looks like ${match.asset.id} (${match.asset.displayFilename}), distance ${match.distance}`);\n }\n }\n emit(uploaded.length === 1 ? uploaded[0] : uploaded, () =>\n table(uploaded, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"SIZE\", value: (a) => String(a.byteSize) },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"list\")\n .description(\"List assets\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().assets.list(project, {\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"similar\")\n .description(\"Find images that look like the same picture as this one\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--max-distance <n>\", \"how many of the fingerprint's 64 bits may differ\", \"5\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const similar = await ctx.management().assets.similar(project, args[0] as string, {\n maxDistance: Number(opts.maxDistance),\n });\n emit(similar, () => {\n if (similar.length === 0) {\n diag(\"No near-duplicates. (Images uploaded before fingerprinting shipped have none.)\");\n return;\n }\n table(similar, [\n { header: \"ID\", value: (s) => s.asset.id },\n { header: \"FILENAME\", value: (s) => s.asset.displayFilename },\n { header: \"DISTANCE\", value: (s) => String(s.distance) },\n { header: \"STATE\", value: (s) => s.asset.state },\n ]);\n });\n }),\n );\n\n assets\n .command(\"inspect\")\n .description(\"Show an asset and its usage\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().assets.usage(project, args[0] as string);\n emit(result, () => {\n keyValues([\n [\"ID\", result.asset.id],\n [\"Filename\", result.asset.displayFilename],\n [\"Type\", result.asset.contentType],\n [\"Size\", String(result.asset.byteSize)],\n [\"State\", result.asset.state],\n [\"URL\", result.asset.url],\n [\"Referenced by\", result.usage.entryIds.join(\", \") || \"(none)\"],\n ]);\n });\n }),\n );\n\n assets\n .command(\"delete\")\n .description(\"Soft-delete an asset\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n await ctx.management().assets.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n\n assets\n .command(\"update\")\n .description(\"Set an asset's alt text, caption, filename, or tags\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--alt <text>\", \"default alt text\")\n .option(\"--caption <text>\", \"caption\")\n .option(\"--filename <name>\", \"display filename\")\n .option(\"--tag <tag...>\", \"replace the asset's tags\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (!opts.alt && !opts.caption && !opts.filename && !opts.tag) {\n throw new UsageError(\"Provide --alt, --caption, --filename, or --tag.\");\n }\n const asset = await ctx.management().assets.update(project, args[0] as string, {\n ...(opts.alt !== undefined ? { defaultAlt: opts.alt as string } : {}),\n ...(opts.caption !== undefined ? { caption: opts.caption as string } : {}),\n ...(opts.filename !== undefined ? { displayFilename: opts.filename as string } : {}),\n ...(opts.tag !== undefined ? { tags: opts.tag as string[] } : {}),\n });\n emit(asset, () => diag(`Updated ${asset.id}.`));\n }),\n );\n\n assets\n .command(\"replace\")\n .description(\"Replace an asset's binary, keeping its id and references\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .argument(\"<file>\", \"path to the replacement file\")\n .option(\"--confirm-replace\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n // Replacing swaps the bytes behind every URL and every entry already\n // referencing this asset, which no revision records — so it is gated the\n // same way deletion is.\n if (!opts.confirmReplace) throw new UsageError(\"Replacing an asset requires --confirm-replace.\");\n const project = ctx.requireProject();\n const client = ctx.management();\n const uploaded = await client.assets.upload(project, args[1] as string);\n const asset = await client.assets.replace(project, args[0] as string, { uploadId: uploaded.id });\n emit(asset, () => diag(`Replaced ${asset.id} (${asset.byteSize} bytes).`));\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport type { ApiKeyScope, OrgRole, UpdateProjectRequest, WebhookEventType } from \"@myna-sh/api-contracts\";\nimport { normalizeOrigin } from \"@myna-sh/shared\";\nimport { writeUserConfig } from \"../config.js\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nfunction csv<T extends string>(value: string): T[] {\n return value.split(\",\").map((s) => s.trim()).filter(Boolean) as T[];\n}\n\nexport function registerAdmin(program: Command): void {\n registerOrganizations(program);\n registerProjects(program);\n registerCors(program);\n registerKeys(program);\n registerMembers(program);\n registerViews(program);\n registerChecks(program);\n registerWebhooks(program);\n registerActivity(program);\n registerBilling(program);\n}\n\nfunction registerOrganizations(program: Command): void {\n const orgs = program.command(\"organizations\").alias(\"orgs\").description(\"Manage organizations\");\n\n orgs\n .command(\"list\")\n .description(\"List organizations you belong to\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().organizations.list();\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (o) => o.slug },\n { header: \"NAME\", value: (o) => o.name },\n { header: \"ROLE\", value: (o) => o.role },\n { header: \"PLAN\", value: (o) => o.planKey },\n ]),\n );\n }),\n );\n\n orgs\n .command(\"create\")\n .description(\"Create an organization\")\n .requiredOption(\"--name <name>\", \"organization name\")\n .option(\"--slug <slug>\", \"organization slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const org = await ctx.management().organizations.create({\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n });\n emit(org, () => diag(`Created ${org.slug} (${org.id}).`));\n }),\n );\n\n orgs\n .command(\"use\")\n .description(\"Set the default organization\")\n .argument(\"<slug>\", \"organization slug or id\")\n .action(\n handle(async (_ctx, args) => {\n writeUserConfig({ defaultOrganization: args[0] as string });\n emit({ defaultOrganization: args[0] as string }, () => diag(`Default organization set to ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerProjects(program: Command): void {\n const projects = program.command(\"projects\").description(\"Manage projects\");\n\n projects\n .command(\"list\")\n .description(\"List projects in the organization\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().projects.list(ctx.requireOrganization());\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (p) => p.slug },\n { header: \"NAME\", value: (p) => p.name },\n { header: \"PUBLIC API\", value: (p) => (p.publicApiEnabled ? \"on\" : \"off\") },\n { header: \"ARCHIVED\", value: (p) => (p.archivedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n projects\n .command(\"create\")\n .description(\"Create a project\")\n .requiredOption(\"--name <name>\", \"project name\")\n .option(\"--slug <slug>\", \"project slug\")\n .option(\"--timezone <tz>\", \"project timezone\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = await ctx.management().projects.create(ctx.requireOrganization(), {\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n timezone: opts.timezone as string | undefined,\n });\n emit(project, () => diag(`Created ${project.slug} (${project.id}).`));\n }),\n );\n\n projects\n .command(\"inspect\")\n .description(\"Show project details\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project, () =>\n keyValues([\n [\"ID\", project.id],\n [\"Name\", project.name],\n [\"Slug\", project.slug],\n [\"Timezone\", project.timezone],\n [\"Public API\", project.publicApiEnabled ? \"on\" : \"off\"],\n [\"Origins\", project.origins.join(\", \") || \"(none)\"],\n ]),\n );\n }),\n );\n\n projects\n .command(\"export\")\n .description(\"Export the full project (schemas, entries, asset metadata) as JSON\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const data = await ctx.management().projects.export(ref);\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n }),\n );\n\n projects\n .command(\"update\")\n .description(\"Update project settings\")\n .argument(\"[project]\", \"project id or slug\")\n .option(\"--name <name>\", \"project name\")\n .option(\"--timezone <timezone>\", \"IANA timezone\")\n .option(\"--public-api <state>\", \"public API state (on|off)\")\n .option(\"--default-preview-template <template>\", \"default preview URL template\")\n .option(\"--clear-default-preview-template\", \"remove the default preview URL template\")\n .option(\"--origins <urls>\", \"comma-separated allowed origins\")\n .option(\"--clear-origins\", \"remove all allowed origins\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const patch: UpdateProjectRequest = {};\n if (opts.name !== undefined) patch.name = opts.name as string;\n if (opts.timezone !== undefined) patch.timezone = opts.timezone as string;\n if (opts.publicApi !== undefined) {\n const state = String(opts.publicApi).toLowerCase();\n if (![\"on\", \"off\", \"true\", \"false\"].includes(state)) {\n throw new UsageError(\"--public-api must be on or off.\");\n }\n patch.publicApiEnabled = state === \"on\" || state === \"true\";\n }\n if (opts.defaultPreviewTemplate !== undefined && opts.clearDefaultPreviewTemplate) {\n throw new UsageError(\"Use either --default-preview-template or --clear-default-preview-template, not both.\");\n }\n if (opts.defaultPreviewTemplate !== undefined) {\n patch.defaultPreviewTemplate = opts.defaultPreviewTemplate as string;\n }\n if (opts.clearDefaultPreviewTemplate) patch.defaultPreviewTemplate = null;\n if (opts.origins !== undefined && opts.clearOrigins) {\n throw new UsageError(\"Use either --origins or --clear-origins, not both.\");\n }\n if (opts.origins !== undefined) patch.origins = csv<string>(opts.origins as string);\n if (opts.clearOrigins) patch.origins = [];\n if (Object.keys(patch).length === 0) {\n throw new UsageError(\"Specify at least one project setting to update.\");\n }\n const project = await ctx.management().projects.update(ref, patch);\n emit(project, () => diag(`Updated ${project.slug}.`));\n }),\n );\n\n /**\n * Incremental origin management.\n *\n * `projects update --origins` replaces the whole list, so adding one site\n * means restating every other — and forgetting one silently breaks a live\n * page. These read the current list and write back the change.\n */\n const origins = projects.command(\"origins\").description(\"Manage allowed browser origins\");\n\n origins\n .command(\"list\")\n .description(\"List the project's allowed browser origins\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project.origins, () =>\n table(\n project.origins.map((origin) => ({ origin })),\n [{ header: \"ORIGIN\", value: (r) => r.origin }],\n ),\n );\n }),\n );\n\n origins\n .command(\"add\")\n .description(\"Allow one or more browser origins\")\n .argument(\"<origins...>\", \"origins, e.g. https://example.com\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = [...new Set([...project.origins, ...requested])];\n const added = requested.filter((o) => !project.origins.includes(o));\n if (added.length === 0) {\n emit({ origins: project.origins, added: [] }, () => diag(\"Already allowed; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, added }, () =>\n diag(`Allowed ${added.join(\", \")} on ${updated.slug}.`),\n );\n }),\n );\n\n origins\n .command(\"remove\")\n .description(\"Stop allowing one or more browser origins\")\n .argument(\"<origins...>\", \"origins to remove\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = project.origins.filter((o) => !requested.includes(o));\n const removed = project.origins.filter((o) => requested.includes(o));\n if (removed.length === 0) {\n emit({ origins: project.origins, removed: [] }, () => diag(\"Not configured; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, removed }, () =>\n diag(`Removed ${removed.join(\", \")} from ${updated.slug}.`),\n );\n }),\n );\n\n projects\n .command(\"archive\")\n .description(\"Archive a project\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.archive(ref);\n emit(project, () => diag(`Archived ${project.slug}.`));\n }),\n );\n}\n\n/** Canonicalize an origin the same way the API does, failing loudly on nonsense. */\nfunction normalizeOne(value: string): string {\n const normalized = normalizeOrigin(value);\n if (!normalized) throw new UsageError(`\"${value}\" is not a valid http(s) origin.`);\n return normalized;\n}\n\nfunction registerCors(program: Command): void {\n program\n .command(\"cors\")\n .description(\"Diagnose browser access to published content\")\n .command(\"check\")\n .description(\"Explain whether a browser at an origin can read this project\")\n .requiredOption(\"--origin <url>\", \"the browser origin to test\")\n .option(\"--collection <key>\", \"also check a specific collection's visibility\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const result = await ctx\n .management()\n .projects.corsCheck(ref, opts.origin as string, opts.collection as string | undefined);\n emit(result, () => {\n for (const c of result.checks) {\n process.stdout.write(`${c.ok ? \"✓\" : \"✗\"} ${c.detail}\\n`);\n }\n if (!result.allowed) {\n const failed = result.checks.find((c) => !c.ok);\n if (failed?.id === \"origin\") {\n diag(`\\nAllow it with: myna projects origins add ${result.origin}`);\n } else if (failed?.id === \"publicApi\") {\n diag(\"\\nEnable it with: myna projects update --public-api on\");\n }\n }\n });\n if (!result.allowed) process.exitCode = 1;\n }),\n );\n}\n\nfunction registerKeys(program: Command): void {\n const keys = program.command(\"keys\").description(\"Manage API keys\");\n\n keys\n .command(\"list\")\n .description(\"List API keys for the project (or organization with --org-scope)\")\n .option(\"--org-scope\", \"list organization-scoped keys\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const list = opts.orgScope\n ? await ctx.management().apiKeys.listForOrganization(ctx.requireOrganization())\n : await ctx.management().apiKeys.listForProject(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (k) => k.id },\n { header: \"NAME\", value: (k) => k.name },\n { header: \"SCOPES\", value: (k) => k.scopes.join(\",\") },\n { header: \"COLLECTIONS\", value: (k) => k.collectionKeys?.join(\",\") ?? \"all\" },\n { header: \"REVOKED\", value: (k) => (k.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n keys\n .command(\"create\")\n .description(\"Create an API key (project-scoped by default)\")\n .requiredOption(\"--name <name>\", \"key name\")\n .requiredOption(\"--scopes <scopes>\", \"comma-separated scopes\")\n .option(\"--label <label>\", \"agent/integration label\")\n .option(\"--org-scope\", \"create an organization-scoped key\", false)\n .option(\"--collections <keys>\", \"confine the key to these collections (comma-separated)\")\n .option(\"--expires-at <iso>\", \"expiry (ISO 8601)\")\n .action(\n handle(async (ctx, _args, opts) => {\n if (opts.collections && opts.orgScope) {\n throw new UsageError(\"--collections requires a project-scoped key; drop --org-scope.\");\n }\n const body = {\n name: opts.name as string,\n scopes: csv<ApiKeyScope>(opts.scopes as string),\n label: opts.label as string | undefined,\n collectionKeys: opts.collections ? csv<string>(opts.collections as string) : undefined,\n expiresAt: opts.expiresAt as string | undefined,\n };\n const result = opts.orgScope\n ? await ctx.management().apiKeys.createForOrganization(ctx.requireOrganization(), body)\n : await ctx.management().apiKeys.createForProject(ctx.requireProject(), body);\n emit(result, () => {\n diag(\"Store this secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.key.id],\n [\"Name\", result.key.name],\n [\"Collections\", result.key.collectionKeys?.join(\", \") ?? \"(all)\"],\n [\"Secret\", result.secret],\n ]);\n });\n }),\n );\n\n keys\n .command(\"revoke\")\n .description(\"Revoke an API key\")\n .argument(\"<id>\", \"key id (key_)\")\n .option(\"--org-scope\", \"revoke an organization-scoped key\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (opts.orgScope) {\n await ctx.management().apiKeys.revokeForOrganization(ctx.requireOrganization(), args[0] as string);\n } else {\n await ctx.management().apiKeys.revokeForProject(ctx.requireProject(), args[0] as string);\n }\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerMembers(program: Command): void {\n const members = program.command(\"members\").description(\"Manage organization members\");\n\n members\n .command(\"list\")\n .description(\"List members and pending invitations\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [list, invites] = await Promise.all([\n ctx.management().members.list(org),\n ctx.management().invitations.list(org).catch(() => []),\n ]);\n emit({ members: list, invitations: invites }, () => {\n table(list, [\n { header: \"USER\", value: (m) => m.username ?? m.userId },\n { header: \"EMAIL\", value: (m) => m.email },\n { header: \"ROLE\", value: (m) => m.role },\n ]);\n if (invites.length > 0) {\n diag(\"\\nPending invitations:\");\n table(invites, [\n { header: \"EMAIL\", value: (i) => i.email },\n { header: \"ROLE\", value: (i) => i.role },\n { header: \"EXPIRES\", value: (i) => i.expiresAt },\n ]);\n }\n });\n }),\n );\n\n members\n .command(\"invite\")\n .description(\"Invite a member by email\")\n .requiredOption(\"--email <email>\", \"invitee email\")\n .requiredOption(\"--role <role>\", \"role (admin|editor|viewer)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const invite = await ctx.management().invitations.create(ctx.requireOrganization(), {\n email: opts.email as string,\n role: opts.role as Exclude<OrgRole, \"owner\">,\n });\n emit(invite, () =>\n diag(\n `Invited ${invite.email} as ${invite.role}. An email with the accept link is on its way; it expires ${invite.expiresAt}.`,\n ),\n );\n }),\n );\n\n members\n .command(\"update\")\n .description(\"Update a member's role\")\n .argument(\"<user>\", \"user id\")\n .requiredOption(\"--role <role>\", \"new role\")\n .action(\n handle(async (ctx, args, opts) => {\n await ctx.management().members.update(ctx.requireOrganization(), args[0] as string, {\n role: opts.role as OrgRole,\n });\n emit({ ok: true }, () => diag(`Updated ${args[0] as string} to ${opts.role as string}.`));\n }),\n );\n\n members\n .command(\"remove\")\n .description(\"Remove a member\")\n .argument(\"<user>\", \"user id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().members.remove(ctx.requireOrganization(), args[0] as string);\n emit({ ok: true }, () => diag(`Removed ${args[0] as string}.`));\n }),\n );\n\n members\n .command(\"revoke-invite\")\n .description(\"Revoke a pending invitation\")\n .argument(\"<invitation>\", \"invitation id (inv_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().invitations.revoke(ctx.requireOrganization(), args[0] as string);\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n\n/**\n * Saved views: named filter presets the dashboard's entry table offers.\n *\n * They are shared per project, so the CLI is how a project sets up the views\n * its team should have without each person recreating them by hand.\n */\nfunction registerViews(program: Command): void {\n const views = program.command(\"views\").description(\"Manage saved entry-table views\");\n\n views\n .command(\"list\")\n .description(\"List saved views\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().projects.views(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (v) => v.id },\n { header: \"NAME\", value: (v) => v.name },\n { header: \"FILTERS\", value: (v) => JSON.stringify(v.filters) },\n ]),\n );\n }),\n );\n\n views\n .command(\"create\")\n .description(\"Create a saved view from a JSON filter object\")\n .requiredOption(\"--name <name>\", \"view name\")\n .requiredOption(\"--filters <json>\", 'filter object, e.g. \\'{\"status\":\"draft\"}\\'')\n .action(\n handle(async (ctx, _args, opts) => {\n let filters: Record<string, unknown>;\n try {\n filters = JSON.parse(opts.filters as string) as Record<string, unknown>;\n } catch {\n throw new UsageError(\"--filters must be valid JSON.\");\n }\n const view = await ctx.management().projects.createView(ctx.requireProject(), {\n name: opts.name as string,\n filters,\n });\n emit(view, () => diag(`Created view ${view.id}.`));\n }),\n );\n\n views\n .command(\"delete\")\n .description(\"Delete a saved view\")\n .argument(\"<id>\", \"view id (viw_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().projects.deleteView(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n}\n\n/**\n * Checks a project expects from outside Myna.\n *\n * Declaring one is how a link checker or a house-style reviewer gets a place to\n * report to; marking it required is how its verdict starts blocking publish.\n */\nfunction registerChecks(program: Command): void {\n const checks = program.command(\"checks\").description(\"Declare external publish checks\");\n\n checks\n .command(\"list\")\n .description(\"List declared external checks\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().checks.list(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"NAME\", value: (c) => c.name },\n { header: \"REQUIRED\", value: (c) => (c.required ? \"yes\" : \"no\") },\n { header: \"DESCRIPTION\", value: (c) => c.description ?? \"\" },\n ]),\n );\n }),\n );\n\n checks\n .command(\"declare\")\n .description(\"Declare (or update) an external check\")\n .argument(\"<name>\", \"check name, e.g. links\")\n .option(\"--description <text>\", \"what the check verifies\")\n .option(\"--required\", \"block publish until it passes\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const check = await ctx.management().checks.declare(ctx.requireProject(), {\n name: args[0] as string,\n ...(opts.description ? { description: opts.description as string } : {}),\n required: Boolean(opts.required),\n });\n emit(check, () =>\n diag(`Declared ${check.name}${check.required ? \" (required before publish)\" : \"\"}.`),\n );\n }),\n );\n\n checks\n .command(\"remove\")\n .description(\"Remove a declared external check\")\n .argument(\"<name>\", \"check name\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().checks.remove(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Removed ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerWebhooks(program: Command): void {\n const webhooks = program.command(\"webhooks\").description(\"Manage webhook endpoints\");\n\n webhooks\n .command(\"list\")\n .description(\"List webhook endpoints\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().webhooks.list(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (w) => w.id },\n { header: \"URL\", value: (w) => w.url },\n { header: \"EVENTS\", value: (w) => w.events.join(\",\") },\n { header: \"ENABLED\", value: (w) => (w.enabled ? \"yes\" : \"no\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"create\")\n .description(\"Create a webhook endpoint\")\n .requiredOption(\"--url <url>\", \"endpoint URL\")\n .requiredOption(\"--events <events>\", \"comma-separated event types\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().webhooks.create(ctx.requireProject(), {\n url: opts.url as string,\n events: csv<WebhookEventType>(opts.events as string),\n enabled: true,\n });\n emit(result, () => {\n diag(\"Store this signing secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.endpoint.id],\n [\"URL\", result.endpoint.url],\n [\"Signing secret\", result.signingSecret],\n ]);\n });\n }),\n );\n\n webhooks\n .command(\"update\")\n .description(\"Update a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"--url <url>\", \"new URL\")\n .option(\"--events <events>\", \"comma-separated event types\")\n .option(\"--enabled <bool>\", \"enable/disable (true|false)\")\n .action(\n handle(async (ctx, args, opts) => {\n const patch: { url?: string; events?: WebhookEventType[]; enabled?: boolean } = {};\n if (opts.url) patch.url = opts.url as string;\n if (opts.events) patch.events = csv<WebhookEventType>(opts.events as string);\n if (opts.enabled !== undefined) patch.enabled = opts.enabled === \"true\";\n const endpoint = await ctx.management().webhooks.update(ctx.requireProject(), args[0] as string, patch);\n emit(endpoint, () => diag(`Updated ${endpoint.id}.`));\n }),\n );\n\n webhooks\n .command(\"delete\")\n .description(\"Delete a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n\n webhooks\n .command(\"deliveries\")\n .description(\"List recent deliveries for a webhook\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n const list = await ctx.management().webhooks.deliveries(ctx.requireProject(), args[0] as string);\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (d) => d.id },\n { header: \"EVENT\", value: (d) => d.eventType },\n { header: \"ATTEMPT\", value: (d) => String(d.attempt) },\n { header: \"STATUS\", value: (d) => d.status },\n { header: \"HTTP\", value: (d) => (d.responseStatus ? String(d.responseStatus) : \"\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"retry\")\n .description(\"Retry a webhook delivery\")\n .argument(\"<webhook>\", \"webhook id\")\n .argument(\"<delivery>\", \"delivery id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.retry(ctx.requireProject(), args[0] as string, args[1] as string);\n emit({ ok: true }, () => diag(`Retrying delivery ${args[1] as string}.`));\n }),\n );\n}\n\nfunction registerActivity(program: Command): void {\n program\n .command(\"activity\")\n .description(\"Show the project activity feed\")\n .option(\"--actor-type <type>\", \"filter by actor type\")\n .option(\"--action <action>\", \"filter by action\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const page = await ctx.management().activity(ctx.requireProject(), {\n actorType: opts.actorType as string | undefined,\n action: opts.action as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"WHEN\", value: (a) => a.createdAt },\n { header: \"ACTOR\", value: (a) => a.actorType },\n { header: \"ACTION\", value: (a) => a.action },\n { header: \"TARGET\", value: (a) => `${a.targetType ?? \"\"} ${a.targetId ?? \"\"}`.trim() },\n ]),\n );\n }),\n );\n}\n\nfunction registerBilling(program: Command): void {\n const billing = program.command(\"billing\").description(\"Billing status and management\");\n\n billing\n .command(\"status\")\n .description(\"Show the organization's plan and usage\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [status, usage] = await Promise.all([\n ctx.management().billing.status(org),\n ctx.management().organizations.usage(org).catch(() => undefined),\n ]);\n emit({ billing: status, usage }, () => {\n keyValues([\n [\"Plan\", status.subscription.planKey],\n [\"Status\", status.subscription.status],\n [\"Provider customer\", status.hasProviderCustomer ? \"yes\" : \"no\"],\n ]);\n if (usage) {\n diag(\"\\nUsage:\");\n table(usage.metrics, [\n { header: \"METRIC\", value: (m) => m.metric },\n { header: \"USED\", value: (m) => String(m.quantity) },\n { header: \"LIMIT\", value: (m) => (m.limit === null ? \"∞\" : String(m.limit)) },\n ]);\n }\n });\n }),\n );\n\n billing\n .command(\"upgrade\")\n .description(\"Start a Pro checkout\")\n .option(\"--interval <interval>\", \"month|year\", \"month\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().billing.checkout(ctx.requireOrganization(), {\n interval: (opts.interval as \"month\" | \"year\") ?? \"month\",\n });\n if (ctx.interactive) openBrowser(result.checkoutUrl);\n emit(result, () => process.stdout.write(`${result.checkoutUrl}\\n`));\n }),\n );\n\n billing\n .command(\"portal\")\n .description(\"Open the billing portal\")\n .action(\n handle(async (ctx) => {\n const result = await ctx.management().billing.portal(ctx.requireOrganization());\n if (ctx.interactive) openBrowser(result.portalUrl);\n emit(result, () => process.stdout.write(`${result.portalUrl}\\n`));\n }),\n );\n}\n","import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { generateTypesModule, isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { compareSemVer, normalizeOrigin, parseSemVer } from \"@myna-sh/shared\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { checkCredential, describeIdentity, fetchMeta, scopesOf } from \"../auth-check.js\";\nimport type { Ctx } from \"../client.js\";\nimport { diag, emit } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { latestPublished } from \"../registry.js\";\nimport { loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { IS_RELEASE_BUILD, VERSION } from \"../version.js\";\n\n/**\n * `myna doctor` — one command that answers \"why isn't this working?\".\n *\n * Every check reports the same shape so an agent can act on it without parsing\n * prose: an id, a status, what was observed, and the command that fixes it.\n * Checks never throw; a check that cannot run reports `skip` with the reason,\n * because a diagnostic that dies on the first problem cannot diagnose the rest.\n */\n\ntype Status = \"pass\" | \"warn\" | \"fail\" | \"skip\";\n\ninterface Check {\n id: string;\n title: string;\n status: Status;\n detail: string;\n remedy?: string;\n}\n\nconst SCAN_IGNORE = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".react-router\", \".turbo\", \"coverage\"]);\n\n/**\n * Both markers must be present to call a file \"generated types\".\n *\n * Matching the header alone also matches any source file that merely mentions\n * it — including this one, which is exactly the false positive that shipped the\n * first time. Requiring the emitted registry interface as well keeps the test\n * on output rather than on prose.\n */\nconst GENERATED_MARKERS = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"export interface MynaCollections {\",\n];\n\nfunction looksGenerated(contents: string): boolean {\n return GENERATED_MARKERS.every((marker) => contents.includes(marker));\n}\n\nfunction check(id: string, title: string, status: Status, detail: string, remedy?: string): Check {\n return remedy ? { id, title, status, detail, remedy } : { id, title, status, detail };\n}\n\nasync function checkCliVersion(): Promise<Check> {\n if (!IS_RELEASE_BUILD) {\n return check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `Running an unreleased build (${VERSION}).`,\n \"Install a published release: npm install -g @myna-sh/cli\",\n );\n }\n const latest = await latestPublished(\"@myna-sh/cli\");\n if (!latest) {\n return check(\"cli.version\", \"CLI version\", \"skip\", `${VERSION} (could not reach npm to compare).`);\n }\n const behind = compareSemVer(VERSION, latest) < 0;\n return behind\n ? check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `${VERSION} is behind the latest release ${latest}.`,\n `npm install -g @myna-sh/cli@${latest}`,\n )\n : check(\"cli.version\", \"CLI version\", \"pass\", `${VERSION} is current.`);\n}\n\nfunction checkApi(meta: Awaited<ReturnType<typeof fetchMeta>>, apiUrl: string): Check[] {\n if (!meta) {\n return [\n check(\n \"api.reachable\",\n \"API reachable\",\n \"fail\",\n `No capability descriptor from ${apiUrl}/v1/meta.`,\n \"Check --api-url / MYNA_API_URL and network access. An API older than 0.2.0 does not serve /v1/meta.\",\n ),\n ];\n }\n\n const checks = [\n check(\"api.reachable\", \"API reachable\", \"pass\", `${apiUrl} speaks API ${meta.apiVersion}.`),\n ];\n\n if (!IS_RELEASE_BUILD) {\n checks.push(\n check(\"api.compatibility\", \"Client compatibility\", \"skip\", \"Unreleased CLI build; nothing to compare.\"),\n );\n return checks;\n }\n\n const supported = compareSemVer(VERSION, meta.minClientVersion) >= 0;\n checks.push(\n supported\n ? check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"pass\",\n `CLI ${VERSION} meets the minimum supported client ${meta.minClientVersion}.`,\n )\n : check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"fail\",\n `CLI ${VERSION} is older than the minimum client ${meta.minClientVersion} this API supports.`,\n `npm install -g @myna-sh/cli@latest`,\n ),\n );\n return checks;\n}\n\nasync function checkAuth(ctx: Ctx): Promise<Check[]> {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n\n if (!status.credentialPresent) {\n return [\n check(\"auth.credential\", \"Credential\", \"fail\", \"No credential found.\", \"myna login\"),\n ];\n }\n if (!status.credentialValid) {\n return [\n check(\n \"auth.credential\",\n \"Credential\",\n \"fail\",\n // The distinction the old `whoami` collapsed.\n `A credential is present (from ${status.source}) but the API rejected it: ${status.error?.detail ?? \"unknown reason\"}.`,\n status.error?.code === \"UNREACHABLE\" ? undefined : \"myna login\",\n ),\n ];\n }\n\n const checks = [\n check(\"auth.credential\", \"Credential\", \"pass\", `Valid — ${describeIdentity(status.identity!)}.`),\n ];\n\n const scopes = scopesOf(status.identity);\n if (scopes) {\n checks.push(\n scopes.length > 0\n ? check(\"auth.scopes\", \"Key scopes\", \"pass\", scopes.join(\", \"))\n : check(\n \"auth.scopes\",\n \"Key scopes\",\n \"fail\",\n \"The key carries no scopes, so every authorized call will be denied.\",\n \"Mint a scoped key: myna keys create --scopes content:read,content:write\",\n ),\n );\n }\n return checks;\n}\n\nasync function checkProject(ctx: Ctx): Promise<Check[]> {\n if (!ctx.project) {\n return [\n check(\n \"project.link\",\n \"Project\",\n \"warn\",\n \"No project selected.\",\n \"myna link --project <project>, or pass --project\",\n ),\n ];\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n const where = ctx.linkedRoot ? ` (linked at ${ctx.linkedRoot})` : \"\";\n return [\n check(\"project.link\", \"Project\", \"pass\", `${project.slug}${where}.`),\n project.publicApiEnabled\n ? check(\"project.publicApi\", \"Public API\", \"pass\", \"Enabled.\")\n : check(\n \"project.publicApi\",\n \"Public API\",\n \"warn\",\n \"Disabled — browser and unauthenticated reads will 404.\",\n \"myna projects update --public-api\",\n ),\n ];\n } catch (error) {\n const detail = isMynaApiError(error)\n ? `${error.code} — ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return [\n check(\n \"project.link\",\n \"Project\",\n \"fail\",\n `Cannot read project \"${ctx.project}\": ${detail}`,\n \"Check the project ref and that your credential has access to it.\",\n ),\n ];\n }\n}\n\nasync function checkOrigin(ctx: Ctx, origin: string): Promise<Check> {\n const canonical = normalizeOrigin(origin);\n if (!canonical) {\n return check(\"origins\", \"Browser origin\", \"fail\", `\"${origin}\" is not a valid http(s) origin.`);\n }\n if (!ctx.project) {\n return check(\"origins\", \"Browser origin\", \"skip\", \"No project selected.\");\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n // Compare canonical forms: a configured trailing slash is the same origin.\n const allowed = project.origins.some((o) => normalizeOrigin(o) === canonical);\n return allowed\n ? check(\"origins\", \"Browser origin\", \"pass\", `${canonical} is allowed on ${project.slug}.`)\n : check(\n \"origins\",\n \"Browser origin\",\n \"fail\",\n `${canonical} is not allowed on ${project.slug}. A browser will discard responses from it. Configured: ${\n project.origins.length > 0 ? project.origins.join(\", \") : \"(none)\"\n }`,\n `myna projects update --origins ${[...project.origins, canonical].join(\",\")}`,\n );\n } catch {\n return check(\"origins\", \"Browser origin\", \"skip\", \"Could not read the project's origins.\");\n }\n}\n\nasync function checkSchema(ctx: Ctx, schemaDir: string | undefined): Promise<Check> {\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No schema directory at ${dir}.`);\n }\n if (!ctx.project) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", \"No project selected.\");\n }\n let local: CollectionSchema[];\n try {\n local = await loadLocalSchemas(dir);\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"fail\",\n `Could not load schemas from ${dir}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n if (local.length === 0) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No collections defined in ${dir}.`);\n }\n try {\n const diff = await ctx\n .management()\n .schema.diff(ctx.project, local as unknown as Record<string, unknown>[]);\n return diff.ops.length === 0\n ? check(\"schema.drift\", \"Local schema\", \"pass\", `${local.length} collection(s) match the deployed schema.`)\n : check(\n \"schema.drift\",\n \"Local schema\",\n \"warn\",\n `${diff.ops.length} undeployed change(s) (${diff.classification}).`,\n // Drift has two directions and two fixes: push local ahead, or pull\n // the deployed schema back into the repository as a reviewable change.\n \"myna schema diff, then myna schema push — or myna schema pull --open-pr if the deployed schema is the one to keep\",\n );\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"skip\",\n `Could not diff against the deployed schema: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/** Shallow scan for a file written by `myna types generate`. */\nfunction findGeneratedTypes(root: string, depth = 4): string | undefined {\n let entries: string[];\n try {\n entries = readdirSync(root);\n } catch {\n return undefined;\n }\n const dirs: string[] = [];\n for (const entry of entries) {\n if (SCAN_IGNORE.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(root, entry);\n let stats;\n try {\n stats = statSync(full);\n } catch {\n continue;\n }\n if (stats.isDirectory()) {\n dirs.push(full);\n continue;\n }\n if (!/\\.(ts|d\\.ts)$/.test(entry)) continue;\n try {\n if (looksGenerated(readFileSync(full, \"utf8\"))) return full;\n } catch {\n // Unreadable file; keep scanning.\n }\n }\n if (depth <= 0) return undefined;\n for (const dir of dirs) {\n const found = findGeneratedTypes(dir, depth - 1);\n if (found) return found;\n }\n return undefined;\n}\n\nasync function checkTypes(ctx: Ctx, explicit: string | undefined, schemaDir: string | undefined): Promise<Check> {\n const root = ctx.linkedRoot ?? process.cwd();\n const file = explicit ?? findGeneratedTypes(root);\n if (!file) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", \"No generated types file found.\");\n }\n if (!existsSync(file)) {\n return check(\"types.freshness\", \"Generated types\", \"fail\", `${file} does not exist.`);\n }\n\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", `Found ${file} but no schema directory to compare against.`);\n }\n\n try {\n const expected = generateTypesModule(await loadLocalSchemas(dir));\n // Codegen is deterministic, so an exact match is a real freshness signal.\n return readFileSync(file, \"utf8\") === expected\n ? check(\"types.freshness\", \"Generated types\", \"pass\", `${file} matches the local schema.`)\n : check(\n \"types.freshness\",\n \"Generated types\",\n \"warn\",\n `${file} is out of date with the local schema.`,\n `myna types generate --out ${file}`,\n );\n } catch (error) {\n return check(\n \"types.freshness\",\n \"Generated types\",\n \"skip\",\n `Could not regenerate types for comparison: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nconst ICON: Record<Status, string> = { pass: \"✓\", warn: \"!\", fail: \"✗\", skip: \"–\" };\n\nexport function registerDoctor(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"Diagnose CLI, API, credential, project, schema, and origin configuration\")\n .option(\"--origin <url>\", \"also check whether this browser origin is allowed\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--types <file>\", \"generated types file to check for freshness\")\n .action(\n handle(async (ctx, _args, opts) => {\n const checks: Check[] = [];\n\n checks.push(await checkCliVersion());\n\n const meta = await fetchMeta(ctx.apiUrl);\n checks.push(...checkApi(meta, ctx.apiUrl));\n\n const auth = await checkAuth(ctx);\n checks.push(...auth);\n\n // Everything below needs a working credential; running it without one\n // produces a wall of failures that all restate the same cause.\n const authed = auth[0]?.status === \"pass\";\n if (authed) {\n checks.push(...(await checkProject(ctx)));\n checks.push(await checkSchema(ctx, opts.schemaDir as string | undefined));\n checks.push(await checkTypes(ctx, opts.types as string | undefined, opts.schemaDir as string | undefined));\n if (opts.origin) checks.push(await checkOrigin(ctx, opts.origin as string));\n } else {\n const deferred: Array<[string, string]> = [\n [\"project.link\", \"Project\"],\n [\"schema.drift\", \"Local schema\"],\n [\"types.freshness\", \"Generated types\"],\n ];\n for (const [id, title] of deferred) {\n checks.push(check(id, title, \"skip\", \"Requires a valid credential.\"));\n }\n }\n\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n emit({ ok: failed === 0, failed, warned, checks }, () => {\n for (const c of checks) {\n process.stdout.write(`${ICON[c.status]} ${c.title}: ${c.detail}\\n`);\n if (c.remedy && c.status !== \"pass\") process.stdout.write(` → ${c.remedy}\\n`);\n }\n diag(\n failed === 0\n ? warned === 0\n ? \"\\nAll checks passed.\"\n : `\\n${warned} warning(s), no failures.`\n : `\\n${failed} failure(s), ${warned} warning(s).`,\n );\n });\n\n if (failed > 0) process.exitCode = 1;\n }),\n );\n}\n","/** npm registry lookups, shared by `myna doctor` and `myna update`. */\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\n\n/** Latest published version of a package, or undefined when npm is unreachable. */\nexport async function latestPublished(pkg: string): Promise<string | undefined> {\n try {\n const res = await fetch(`${NPM_REGISTRY}/${pkg}/latest`, {\n headers: { accept: \"application/json\" },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { version?: string };\n return body.version;\n } catch {\n return undefined;\n }\n}\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Which package manager installed this binary, guessed from where it lives.\n *\n * A guess, and treated like one: `myna update` prints the command before\n * running it, so a wrong guess is visible rather than silently installing a\n * second copy somewhere the shell will not find.\n */\nexport function detectPackageManager(binPath: string): PackageManager {\n const path = binPath.replaceAll(\"\\\\\", \"/\");\n if (path.includes(\"/.bun/\")) return \"bun\";\n if (path.includes(\"/pnpm/\") || path.includes(\"/.pnpm/\")) return \"pnpm\";\n if (path.includes(\"/yarn/\") || path.includes(\"/.yarn/\")) return \"yarn\";\n return \"npm\";\n}\n\n/** The global-install command for `@myna-sh/cli` at a given version. */\nexport function installCommand(manager: PackageManager, version: string): string[] {\n const spec = `@myna-sh/cli@${version}`;\n switch (manager) {\n case \"pnpm\":\n return [\"pnpm\", \"add\", \"-g\", spec];\n case \"yarn\":\n return [\"yarn\", \"global\", \"add\", spec];\n case \"bun\":\n return [\"bun\", \"add\", \"-g\", spec];\n case \"npm\":\n return [\"npm\", \"install\", \"-g\", spec];\n }\n}\n","/**\n * Build-time version stamp.\n *\n * `tsup` substitutes `__MYNA_VERSION__` with the value from `package.json`\n * (see `tsup.config.ts`), so a published binary can never disagree with the\n * package it was published from — the drift class simply stops existing.\n * Running from source (tsx, `turbo dev`) leaves the identifier undefined and\n * falls back to a marker that is obviously not a release.\n */\ndeclare const __MYNA_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __MYNA_VERSION__ === \"string\" ? __MYNA_VERSION__ : \"0.0.0-dev\";\n\n/**\n * Whether this is a published build rather than a source checkout.\n *\n * Tested on the substitution itself, not on the shape of the string. The\n * fallback `0.0.0-dev` is a *valid* semantic version — `parseSemVer` accepts the\n * pre-release suffix — so code that asked \"does this parse?\" to mean \"is this a\n * release?\" got `true` and went on to compare a dev build against the registry,\n * or tell a contributor running from source to `npm install -g`.\n */\nexport const IS_RELEASE_BUILD: boolean = typeof __MYNA_VERSION__ === \"string\";\n","import { execFileSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Command } from \"commander\";\nimport { compareSemVer } from \"@myna-sh/shared\";\nimport { CliError, diag, emit } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { detectPackageManager, installCommand, latestPublished } from \"../registry.js\";\nimport { IS_RELEASE_BUILD, VERSION } from \"../version.js\";\n\n/**\n * Update the CLI in place.\n *\n * `myna doctor` already reports that a newer release exists and prints the\n * install command; this runs it. The gap it closes is small and real — an\n * upgrade the tool tells you about but will not perform is an upgrade people\n * put off, and a CLI that is several releases behind the API is how a missing\n * command gets reported as a bug.\n *\n * It only touches the globally installed CLI. `@myna-sh/sdk` and\n * `@myna-sh/react` are project dependencies, released in lockstep with this\n * package but owned by your project's manifest, so updating them is your\n * package manager's job and is deliberately not attempted here.\n */\nexport function registerUpdate(program: Command): void {\n program\n .command(\"update\")\n .description(\"Update the CLI to the latest published release\")\n .option(\"--check\", \"report whether an update exists without installing it\", false)\n .action(\n handle(async (_ctx, _args, opts) => {\n const current = VERSION;\n const checkOnly = Boolean(opts.check);\n\n if (!IS_RELEASE_BUILD) {\n // A source checkout has no release to move to, and running a global\n // install from one would replace the build under someone's feet.\n emit({ current, latest: null, upToDate: false, updated: false, reason: \"unreleased\" }, () =>\n diag(`Running an unreleased build (${current}); nothing to update. Install a release with: npm install -g @myna-sh/cli`),\n );\n return;\n }\n\n const latest = await latestPublished(\"@myna-sh/cli\");\n if (!latest) {\n throw new CliError(\"Could not reach the npm registry to check for updates.\");\n }\n\n if (compareSemVer(current, latest) >= 0) {\n emit({ current, latest, upToDate: true, updated: false }, () =>\n diag(`${current} is the latest release.`),\n );\n return;\n }\n\n const manager = detectPackageManager(fileURLToPath(import.meta.url));\n const command = installCommand(manager, latest);\n\n if (checkOnly) {\n emit({ current, latest, upToDate: false, updated: false, command: command.join(\" \") }, () =>\n diag(`${current} is behind ${latest}. Update with: ${command.join(\" \")}`),\n );\n // Non-zero so CI can gate on a stale CLI the same way `myna doctor` does.\n process.exitCode = 1;\n return;\n }\n\n diag(`Updating ${current} → ${latest} with: ${command.join(\" \")}`);\n try {\n execFileSync(command[0]!, command.slice(1), { stdio: \"inherit\" });\n } catch (error) {\n throw new CliError(\n `Update failed: ${error instanceof Error ? error.message : String(error)}. Run it yourself with: ${command.join(\" \")}`,\n );\n }\n emit({ current, latest, upToDate: false, updated: true, command: command.join(\" \") }, () =>\n diag(`Updated to ${latest}. Run \\`myna doctor\\` to confirm the API agrees.`),\n );\n }),\n );\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport type { Ctx } from \"../client.js\";\n\n/**\n * `myna sync` — reconcile a content directory into a collection.\n *\n * Migrating a site otherwise means writing a throwaway script that walks files\n * and drives the API once per entry. This does the whole reconciliation in one\n * staged change set: rows that exist are updated, rows that match byte for byte\n * are left alone, new rows are created, and — only when asked — entries with no\n * corresponding file are staged for deletion.\n *\n * Nothing publishes. The result is a change set to review.\n */\n\ninterface SyncPlanEntry {\n collection: string;\n path: string;\n}\n\nasync function isDirectory(path: string): Promise<boolean> {\n const info = await stat(path).catch(() => undefined);\n return Boolean(info?.isDirectory());\n}\n\n/**\n * Work out what to sync.\n *\n * With `--collection`, the directory is that collection's content. Without it,\n * each immediate subdirectory is a collection named after it — the layout most\n * content repositories already have.\n */\nasync function planDirectories(dir: string, collection: string | undefined): Promise<SyncPlanEntry[]> {\n if (!(await isDirectory(dir))) {\n if (!collection) throw new UsageError(\"Syncing a single file needs --collection.\");\n return [{ collection, path: dir }];\n }\n if (collection) return [{ collection, path: dir }];\n\n const children = await readdir(dir);\n const plan: SyncPlanEntry[] = [];\n for (const name of children.sort()) {\n if (name.startsWith(\".\")) continue;\n const full = join(dir, name);\n if (await isDirectory(full)) plan.push({ collection: name, path: full });\n }\n if (plan.length === 0) {\n throw new UsageError(\n `No collection subdirectories in ${dir}. Pass --collection to sync it as one collection.`,\n );\n }\n return plan;\n}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Reconcile a content directory into collections, staged on one change set\")\n .argument(\"<dir>\", \"content directory\")\n .option(\"--collection <key>\", \"treat the directory as one collection instead of one per subdirectory\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the files by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set\")\n .option(\"--dry-run\", \"report what would change without writing\", false)\n .option(\"--delete-missing\", \"also stage deletion of entries with no matching file\", false)\n .option(\"--confirm-delete\", \"required consequence flag for --delete-missing\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const dryRun = Boolean(opts.dryRun);\n const deleteMissing = Boolean(opts.deleteMissing);\n if (deleteMissing && !opts.confirmDelete && !dryRun) {\n throw new UsageError(\"--delete-missing removes published content. Add --confirm-delete, or use --dry-run.\");\n }\n\n const plan = await planDirectories(args[0] as string, opts.collection as string | undefined);\n const mgmt = ctx.management();\n\n // One change set for the whole sync, so a migration reviews and\n // publishes as a single decision rather than one per collection.\n let changeSetId = opts.changeSet as string | undefined;\n\n const report: {\n collection: string;\n created: number;\n updated: number;\n unchanged: number;\n invalid: number;\n deleted: number;\n deletedSlugs: string[];\n }[] = [];\n let failed = false;\n\n for (const target of plan) {\n const source = await readContentRows(target.path, {\n format: parseFormat(opts.format as string | undefined),\n bodyField: opts.bodyField as string,\n });\n if (source.rows.length === 0) continue;\n\n const result = await mgmt.entries.import(project, {\n collection: target.collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun,\n changeSetId,\n mode: \"upsert\",\n });\n if (!result.valid) {\n failed = true;\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n }\n // Reuse the change set the first import created for the rest.\n changeSetId ??= result.changeSetId ?? undefined;\n\n let deleted = 0;\n let deletedSlugs: string[] = [];\n if (deleteMissing && result.valid) {\n const staged = await stageMissingDeletions(\n ctx,\n project,\n target.collection,\n new Set(source.rows.map((r) => r.slug).filter((s): s is string => Boolean(s))),\n changeSetId,\n dryRun,\n );\n deleted = staged.count;\n deletedSlugs = staged.slugs;\n // Deletions can be the only thing a sync does; without capturing\n // their change set the run would report \"nothing to do\" while\n // having staged removals.\n changeSetId ??= staged.changeSetId;\n }\n\n report.push({\n collection: target.collection,\n created: result.summary.created,\n updated: result.summary.updated,\n unchanged: result.summary.unchanged,\n invalid: result.summary.invalid,\n deleted,\n deletedSlugs,\n });\n }\n\n emit({ dryRun, changeSetId: changeSetId ?? null, collections: report, ok: !failed }, () => {\n table(report, [\n { header: \"COLLECTION\", value: (r) => r.collection },\n { header: \"CREATED\", value: (r) => String(r.created) },\n { header: \"UPDATED\", value: (r) => String(r.updated) },\n { header: \"UNCHANGED\", value: (r) => String(r.unchanged) },\n { header: \"DELETED\", value: (r) => String(r.deleted) },\n { header: \"INVALID\", value: (r) => String(r.invalid) },\n ]);\n // A destructive operation must name what it removes. A count alone\n // reads as harmless right up until it is not.\n const removals = report.flatMap((r) => r.deletedSlugs.map((slug) => `${r.collection}/${slug}`));\n if (removals.length > 0) {\n diag(`\\n${dryRun ? \"Would stage\" : \"Staged\"} deletion of ${removals.length} entr(y/ies) with no file:`);\n for (const slug of removals) diag(` − ${slug}`);\n }\n if (dryRun) {\n diag(\"\\nDry run — nothing was written.\");\n } else if (changeSetId) {\n diag(`\\nStaged on change set ${changeSetId}. Review and publish it to go live.`);\n } else {\n diag(\"\\nNothing to do — every file already matches.\");\n }\n });\n\n if (failed) process.exitCode = 1;\n }),\n );\n}\n\n/** Stage deletion of entries whose slug has no file. */\nasync function stageMissingDeletions(\n ctx: Ctx,\n project: string,\n collection: string,\n presentSlugs: Set<string>,\n changeSetId: string | undefined,\n dryRun: boolean,\n): Promise<{ count: number; slugs: string[]; changeSetId: string | undefined }> {\n const mgmt = ctx.management();\n const missing: { id: string; slug: string }[] = [];\n let cursor: string | undefined;\n do {\n const page = await mgmt.entries.list(project, { collection, limit: 100, cursor });\n for (const entry of page.data) {\n if (entry.slug && !presentSlugs.has(entry.slug)) missing.push({ id: entry.id, slug: entry.slug });\n }\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n\n const slugs = missing.map((m) => m.slug).sort();\n if (missing.length === 0 || dryRun) return { count: missing.length, slugs, changeSetId };\n\n const result = await mgmt.entries.bulk(project, {\n action: \"delete\",\n entryIds: missing.map((m) => m.id),\n changeSetId,\n });\n const succeeded = result.results.filter((r) => r.ok);\n return {\n count: succeeded.length,\n slugs,\n changeSetId: changeSetId ?? succeeded.find((r) => r.changeSetId)?.changeSetId,\n };\n}\n\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n"],"mappings":"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","names":["resolve","run","preview","bytes","DEFAULT_API_URL","readFileSync","platform","readFileSync","platform","sleep","check","existsSync","mkdirSync","writeFileSync","join","mkdirSync","join","existsSync","writeFileSync","DEFAULT_API_URL","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","join","resolve","existsSync","join","resolve","execFileSync","createHash","rmSync","join","execFileSync","createHash","join","rmSync","join","existsSync","readFileSync","mkdirSync","writeFileSync","readFile","basename","join","readFile","join","basename","mode","preview","check","existsSync","readFileSync","join","existsSync","readFileSync","writeFileSync","dirname","join","resolve","LOCKFILE_NAME","formatLock","parseLock","writeFileSync","formatLock","LOCKFILE_NAME","LOCKFILE_NAME","join","existsSync","readFileSync","preview","check","existsSync","readFileSync","readdirSync","statSync","join","existsSync","readdirSync","join","statSync","readFileSync","execFileSync","fileURLToPath","fileURLToPath","execFileSync","readdir","stat","join","stat","readdir","join","parseFormat"]}
1
+ {"version":3,"sources":["../src/main.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/auth-check.ts","../src/config.ts","../src/output.ts","../src/client.ts","../src/runtime.ts","../src/util.ts","../src/commands/auth.ts","../src/commands/workspace.ts","../src/commands/schema.ts","../src/schema-loader.ts","../../schema/src/canonical.ts","../src/dsl-emit.ts","../src/git.ts","../src/content-files.ts","../src/commands/entries.ts","../src/commands/changes.ts","../src/commands/releases.ts","../src/commands/pull.ts","../../sdk/src/lock.ts","../../shared/src/lock.ts","../../shared/src/ids.ts","../../shared/src/dates.ts","../../shared/src/origins.ts","../../shared/src/plans.ts","../../shared/src/rank.ts","../../shared/src/release.ts","../../shared/src/lock.ts","../src/commands/previews.ts","../src/commands/assets.ts","../src/commands/admin.ts","../src/commands/api.ts","../src/agent-clients.ts","../src/commands/mcp.ts","../src/commands/skills.ts","../src/skills/index.ts","../src/commands/doctor.ts","../src/registry.ts","../src/version.ts","../src/commands/update.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command, CommanderError } from \"commander\";\nimport { registerAuth } from \"./commands/auth.js\";\nimport { registerWorkspace } from \"./commands/workspace.js\";\nimport { registerSchema } from \"./commands/schema.js\";\nimport { registerEntries } from \"./commands/entries.js\";\nimport { registerChanges } from \"./commands/changes.js\";\nimport { registerReleases } from \"./commands/releases.js\";\nimport { registerPull } from \"./commands/pull.js\";\nimport { registerPreviews } from \"./commands/previews.js\";\nimport { registerAssets } from \"./commands/assets.js\";\nimport { registerAdmin } from \"./commands/admin.js\";\nimport { registerApi } from \"./commands/api.js\";\nimport { registerMcp } from \"./commands/mcp.js\";\nimport { registerSkills } from \"./commands/skills.js\";\nimport { registerDoctor } from \"./commands/doctor.js\";\nimport { registerUpdate } from \"./commands/update.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { VERSION } from \"./version.js\";\n\nexport { VERSION };\n\nconst GLOBAL_VALUE_FLAGS = new Set([\"--project\", \"--organization\", \"--token\", \"--api-url\"]);\nconst GLOBAL_BOOL_FLAGS = new Set([\"--json\", \"--no-interactive\", \"--interactive\"]);\n\n/**\n * Hoist global flags (which may appear anywhere) to the front so Commander,\n * which only recognizes them on the root program, always parses them.\n */\nfunction normalizeGlobals(argv: string[]): string[] {\n const [node, script, ...rest] = argv;\n const globals: string[] = [];\n const remaining: string[] = [];\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i]!;\n const eq = arg.indexOf(\"=\");\n const name = eq === -1 ? arg : arg.slice(0, eq);\n if (GLOBAL_BOOL_FLAGS.has(name)) {\n globals.push(arg);\n } else if (GLOBAL_VALUE_FLAGS.has(name)) {\n if (eq === -1) {\n globals.push(arg);\n if (i + 1 < rest.length) globals.push(rest[++i]!);\n } else {\n globals.push(arg);\n }\n } else {\n remaining.push(arg);\n }\n }\n return [node!, script!, ...globals, ...remaining];\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"myna\")\n .description(\"Myna — content infrastructure for developers and agents\")\n .version(VERSION, \"-v, --version\")\n .option(\"--json\", \"emit a single machine-readable JSON value on stdout\")\n .option(\"--project <ref>\", \"project id or slug\")\n .option(\"--organization <ref>\", \"organization id or slug\")\n .option(\"--token <token>\", \"API token (overrides stored credentials)\")\n .option(\"--api-url <url>\", \"API base URL\")\n .option(\"--no-interactive\", \"disable prompts and browser opening\")\n .showHelpAfterError();\n\n registerAuth(program);\n registerDoctor(program);\n registerUpdate(program);\n registerWorkspace(program);\n registerSchema(program);\n registerEntries(program);\n registerSync(program);\n registerChanges(program);\n registerReleases(program);\n registerPull(program);\n registerPreviews(program);\n registerAssets(program);\n registerMcp(program);\n registerSkills(program);\n registerApi(program);\n registerAdmin(program);\n\n return program;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const program = buildProgram();\n program.exitOverride();\n try {\n await program.parseAsync(normalizeGlobals(argv));\n } catch (error) {\n if (error instanceof CommanderError) {\n if (\n error.code === \"commander.helpDisplayed\" ||\n error.code === \"commander.version\" ||\n error.code === \"commander.help\"\n ) {\n process.exitCode = 0;\n return;\n }\n process.exitCode = 2;\n return;\n }\n process.stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n }\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /**\n * Maximum number of retries (in addition to the first attempt).\n * Defaults to 3 on a server and 1 in a browser — see `defaultMaxRetries`.\n */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n /**\n * Retries for transport-level failures (`fetch` rejecting outright).\n * Defaults to 1, and to 0 in a browser.\n *\n * In a browser these are usually permanent, not transient: a blocked CORS\n * response, a disallowed origin, an extension cancelling the request. They\n * are indistinguishable from a dropped connection — `fetch` rejects with an\n * opaque `TypeError` either way — so retrying converts one clear failure into\n * an identical wall of them, which is what buries the real cause.\n */\n maxNetworkRetries?: number;\n}\n\n/** Browsers get conservative retry defaults; servers keep the aggressive ones. */\nfunction inBrowser(): boolean {\n return typeof globalThis === \"object\" && \"document\" in globalThis;\n}\n\nfunction defaultMaxRetries(): number {\n return inBrowser() ? 1 : 3;\n}\n\nfunction defaultMaxNetworkRetries(): number {\n return inBrowser() ? 0 : 1;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries(),\n };\n }\n\n /**\n * Share one in-flight request between identical concurrent safe reads.\n *\n * Several components asking for the same collection on first paint is the\n * normal shape of a page, not a mistake, and issuing N identical requests\n * multiplies both latency and any failure. Only GET/HEAD are pooled, and only\n * while in flight — this is request coalescing, not a cache.\n */\n private readonly inFlight = new Map<string, Promise<Response>>();\n\n private dedupe(key: string, run: () => Promise<Response>): Promise<Response> {\n const existing = this.inFlight.get(key);\n // Each caller needs its own Response: a body can only be read once.\n if (existing) return existing.then((response) => response.clone());\n const started = run();\n this.inFlight.set(key, started);\n const cleanup = (): void => {\n if (this.inFlight.get(key) === started) this.inFlight.delete(key);\n };\n started.then(cleanup, cleanup);\n return started.then((response) => response.clone());\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const upper = method.toUpperCase();\n const safe = SAFE_METHODS.has(upper);\n const idempotent = safe || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n // Coalesce identical concurrent safe reads. Requests carrying a signal opt\n // out: one caller aborting must not cancel another's request.\n if (safe && !options.signal && (upper === \"GET\" || upper === \"HEAD\")) {\n const key = `${upper} ${url} ${token ?? \"\"}`;\n return this.dedupe(key, () => this.attempt(url, init, idempotent, options));\n }\n return this.attempt(url, init, idempotent, options);\n }\n\n private async attempt(\n url: string,\n init: RequestInit,\n idempotent: boolean,\n options: RequestOptions,\n ): Promise<Response> {\n let attempt = 0;\n let networkAttempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n // A rejected fetch is a transport failure, budgeted separately from\n // HTTP-level retries: in a browser it is usually permanent (CORS, a\n // blocked request), and repeating it only multiplies the noise.\n if (\n idempotent &&\n networkAttempt < this.retry.maxNetworkRetries &&\n attempt < this.retry.maxRetries &&\n !isAbort(error)\n ) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n networkAttempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n SimilarAssetContract,\n SimilarAssetsResponse,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetDiffResponse,\n ChangeSetReviewContract,\n ProjectCheckContract,\n RebaseChangeSetRequest,\n RebaseChangeSetResponse,\n ReportCheckResultRequest,\n UpsertProjectCheckRequest,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n ReleaseContract,\n RevertReleaseRequest,\n RevertReleaseResponse,\n} from \"../../api-contracts/src/releases.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n TranslationCoverageResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n ReorderEntriesRequest,\n ReorderEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n AccessCheckResponse,\n CorsCheckResponse,\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RequestOptions, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n /**\n * Paged GET. Extra filters are merged into the query rather than appended to\n * the path: the client builds its own query string from `options.query`, so a\n * path that already carries one produces `?a=1?limit=25` — a second `?` that\n * silently becomes part of the previous value.\n */\n private async page<T>(\n path: string,\n opts: ListOptions = {},\n filters: Record<string, unknown> = {},\n ): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n /**\n * Escape hatch: call any management endpoint, wrapped or not.\n *\n * The typed methods above cover the API, but never all of it at once — a\n * route ships before its wrapper, or a caller needs a header the wrapper does\n * not take. Without a documented way around the client, that caller hand-rolls\n * `fetch` and loses everything this class provides: credential handling,\n * retry policy, and RFC 9457 errors thrown as `MynaApiError` rather than left\n * as an opaque body to parse. The escape hatch keeps all of it.\n *\n * `path` is version-relative (`/projects/x`), and a leading `/v1` is accepted\n * and stripped — this is the one method whose paths are written by hand, and\n * every example a caller copies from the docs carries the prefix.\n *\n * Unlike the typed mutations, no idempotency key is generated: sending one\n * makes a request retry-eligible, and only the caller knows whether replaying\n * this particular one is safe. Pass `idempotencyKey` to opt in.\n *\n * Returns the response envelope untouched — `{ data, pagination }` and all —\n * because an escape hatch that reshapes the response is not one.\n */\n async raw(\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<{ status: number; headers: Record<string, string>; body: unknown }> {\n const relative = path.startsWith(\"/v1/\") ? path.slice(3) : path.startsWith(\"/\") ? path : `/${path}`;\n const response = await this.http.requestRaw(method, relative, options);\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n if (response.status === 204 || response.status === 304) {\n return { status: response.status, headers, body: undefined };\n }\n const text = await response.text();\n if (!text) return { status: response.status, headers, body: undefined };\n try {\n return { status: response.status, headers, body: JSON.parse(text) as unknown };\n } catch {\n // A non-JSON 2xx is still a successful response; hand it back verbatim.\n return { status: response.status, headers, body: text };\n }\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n /** Why a browser at `origin` can or cannot read this project's content. */\n corsCheck: (\n project: string,\n origin: string,\n collection?: string,\n signal?: AbortSignal,\n ): Promise<CorsCheckResponse> =>\n this.get<CorsCheckResponse>(\n `/projects/${enc(project)}/cors-check`,\n collection ? { origin, collection } : { origin },\n signal,\n ),\n /**\n * Why a call into this project would be denied: whether the credential\n * holds a capability, whether it is confined to other collections, and\n * whether the collection exists at all.\n */\n access: (\n project: string,\n opts: { capability?: string; collection?: string } = {},\n signal?: AbortSignal,\n ): Promise<AccessCheckResponse> =>\n this.get<AccessCheckResponse>(\n `/projects/${enc(project)}/access`,\n { capability: opts.capability, collection: opts.collection },\n signal,\n ),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n /** What is still untranslated in a collection, per project locale. */\n translations: (project: string, key: string, signal?: AbortSignal): Promise<TranslationCoverageResponse> =>\n this.get<TranslationCoverageResponse>(\n `/projects/${enc(project)}/collections/${enc(key)}/translations`,\n undefined,\n signal,\n ),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n // Environments as projects\n drift: (project: string, against: string, signal?: AbortSignal): Promise<SchemaDriftResponse> =>\n this.get<SchemaDriftResponse>(`/projects/${enc(project)}/schema/drift`, { against }, signal),\n promote: (\n project: string,\n fromProject: string,\n opts: { allowDestructive?: boolean } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/promote`, {\n fromProject,\n allowDestructive: opts.allowDestructive ?? false,\n confirm: true,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string; q?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n q: opts.q,\n }),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n /**\n * Set a collection's editorial order. Not staged on a change set — ranks\n * are arrangement rather than content and take effect immediately, which\n * is why `confirm` is required.\n */\n reorder: (\n project: string,\n collection: string,\n body: Omit<ReorderEntriesRequest, \"confirm\">,\n ): Promise<ReorderEntriesResponse> =>\n this.mutate<ReorderEntriesResponse>(\n \"POST\",\n `/projects/${enc(project)}/collections/${enc(collection)}/reorder`,\n { ...body, confirm: true },\n ),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n /** Report a verdict Myna cannot compute, against the current contents. */\n reportCheck: (\n project: string,\n changeSet: string,\n name: string,\n body: ReportCheckResultRequest,\n ): Promise<ChangeSetCheckContract> =>\n this.mutate<ChangeSetCheckContract>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/${enc(name)}`,\n body,\n ),\n /** Field-level before/after for everything this change set would change. */\n /**\n * Replay the change set's edits on top of what is published now.\n *\n * Refuses by default when a field changed on both sides; pass\n * `onConflict` to take one side, or `dryRun` to see the plan first.\n */\n rebase: (\n project: string,\n changeSet: string,\n body: RebaseChangeSetRequest = {},\n ): Promise<RebaseChangeSetResponse> =>\n this.mutate<RebaseChangeSetResponse>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/rebase`,\n body,\n ),\n diff: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetDiffResponse> =>\n this.get<ChangeSetDiffResponse>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/diff`,\n undefined,\n signal,\n ),\n };\n\n // --- Releases -------------------------------------------------------------\n /**\n * What shipped, and how to take it back.\n *\n * `revert` returns an open change set rather than publishing: it goes through\n * the same review, preview, and gate path as anything written by hand.\n */\n readonly releases = {\n list: (project: string, opts: ListOptions = {}): Promise<Page<ReleaseContract>> =>\n this.page<ReleaseContract>(`/projects/${enc(project)}/releases`, opts),\n /** `release` is a release number or the published change set's id. */\n get: (project: string, release: string | number, signal?: AbortSignal): Promise<ReleaseContract> =>\n this.get<ReleaseContract>(`/projects/${enc(project)}/releases/${enc(String(release))}`, undefined, signal),\n revert: (\n project: string,\n release: string | number,\n body: RevertReleaseRequest = {},\n ): Promise<RevertReleaseResponse> =>\n this.mutate<RevertReleaseResponse>(\n \"POST\",\n `/projects/${enc(project)}/releases/${enc(String(release))}/revert`,\n body,\n ),\n };\n\n // --- Declared external checks ---------------------------------------------\n readonly checks = {\n list: (project: string, signal?: AbortSignal): Promise<ProjectCheckContract[]> =>\n this.get<ProjectCheckContract[]>(`/projects/${enc(project)}/checks`, undefined, signal),\n declare: (project: string, body: UpsertProjectCheckRequest): Promise<ProjectCheckContract> =>\n this.mutate<ProjectCheckContract>(\"POST\", `/projects/${enc(project)}/checks`, body),\n remove: (project: string, name: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/checks/${enc(name)}`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (\n project: string,\n opts: ListOptions & { tag?: string; checksum?: string; orphaned?: boolean } = {},\n ): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts, {\n tag: opts.tag,\n checksum: opts.checksum,\n orphaned: opts.orphaned ? \"true\" : undefined,\n }),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n /**\n * Assets that look like the same picture, by perceptual hash — a resized or\n * re-encoded copy, which `checksum` cannot see. `maxDistance` is in bits out\n * of 64 (default 5, maximum 16).\n */\n similar: (\n project: string,\n asset: string,\n opts: { maxDistance?: number; limit?: number } = {},\n signal?: AbortSignal,\n ): Promise<SimilarAssetContract[]> =>\n this.get<SimilarAssetsResponse>(\n `/projects/${enc(project)}/assets/${enc(asset)}/similar`,\n {\n maxDistance: opts.maxDistance === undefined ? undefined : String(opts.maxDistance),\n limit: opts.limit === undefined ? undefined : String(opts.limit),\n },\n signal,\n ).then((r) => r.similar),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(`/projects/${enc(project)}/activity`, opts, {\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n });\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RequestOptions, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted.map((c) => registryEntry(c)).join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\n${REGISTRY_DOC}\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nconst REGISTRY_DOC = [\n \"/**\",\n \" * Collection registry consumed by `createMyna<MynaCollections>()`.\",\n \" *\",\n \" * `fields` types the entry payload; `sortable` and `reference` carry the\",\n \" * distinctions the field types alone cannot express — a markdown body and a\",\n \" * text title are both `string`, but only one of them can be ordered on.\",\n \" */\",\n].join(\"\\n\");\n\n/**\n * Fields the query engine can order and filter by: scalars, excluding localized\n * fields, which hold one value per locale rather than a comparable value. This\n * mirrors `SCALAR_TYPES` in the API's public content service; the two must agree\n * or the types will promise a query the server rejects.\n */\nconst SORTABLE_TYPES = new Set([\"text\", \"number\", \"boolean\", \"date\", \"datetime\", \"slug\"]);\n\nfunction registryEntry(collection: CollectionSchema): string {\n const sortable = collection.fields\n .filter((f) => SORTABLE_TYPES.has(f.type) && !f.localized)\n .map((f) => JSON.stringify(f.key));\n const references = collection.fields\n .filter((f) => f.type === \"reference\")\n .map((f) => JSON.stringify(f.key));\n return [\n ` ${JSON.stringify(collection.name)}: {`,\n ` fields: ${pascal(collection.name)};`,\n ` sortable: ${sortable.length > 0 ? sortable.join(\" | \") : \"never\"};`,\n ` reference: ${references.length > 0 ? references.join(\" | \") : \"never\"};`,\n ` };`,\n ].join(\"\\n\");\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import type { MetaResponse, WhoamiResponse } from \"@myna-sh/api-contracts\";\nimport type { TokenSource } from \"./config.js\";\n\n/**\n * Credential and server checks shared by `whoami`, `auth verify`, and `doctor`.\n *\n * The rule these enforce: **a stored credential is not an authenticated one.**\n * Reporting \"authenticated\" because a token file exists is how an agent ends up\n * confidently issuing calls that every endpoint answers with 401. Everything\n * here validates against the API and reports presence and validity as separate\n * facts.\n */\n\nexport interface CredentialStatus {\n apiUrl: string;\n /** A credential was found (flag, environment, or stored). */\n credentialPresent: boolean;\n /** The API accepted it. False whenever it was not verified successfully. */\n credentialValid: boolean;\n source: TokenSource;\n identity: WhoamiResponse | null;\n /** Why validation failed, when it did. */\n error: { code: string; detail: string } | null;\n}\n\ninterface ProblemBody {\n code?: string;\n detail?: string;\n title?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction timeoutSignal(ms: number): AbortSignal {\n return AbortSignal.timeout(ms);\n}\n\n/**\n * Read the server's capability descriptor. Returns undefined when the API is\n * unreachable or too old to expose `/v1/meta`, which callers report as its own\n * diagnosis rather than conflating with an auth failure.\n */\nexport async function fetchMeta(\n apiUrl: string,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<MetaResponse | undefined> {\n try {\n const res = await fetch(`${apiUrl}/v1/meta`, {\n headers: { accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { data?: MetaResponse };\n return body.data;\n } catch {\n return undefined;\n }\n}\n\n/** Validate a credential against the API. Never throws: the failure is the answer. */\nexport async function checkCredential(\n apiUrl: string,\n token: string | undefined,\n source: TokenSource,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<CredentialStatus> {\n const base: CredentialStatus = {\n apiUrl,\n credentialPresent: Boolean(token),\n credentialValid: false,\n source,\n identity: null,\n error: null,\n };\n\n if (!token) {\n return { ...base, error: { code: \"NO_CREDENTIAL\", detail: \"No credential found.\" } };\n }\n\n try {\n const res = await fetch(`${apiUrl}/v1/auth/whoami`, {\n headers: { authorization: `Bearer ${token}`, accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n const body = (await res.json().catch(() => ({}))) as { data?: WhoamiResponse } & ProblemBody;\n if (!res.ok || !body.data) {\n return {\n ...base,\n error: {\n code: body.code ?? `HTTP_${res.status}`,\n detail: body.detail ?? body.title ?? `The API rejected the credential (${res.status}).`,\n },\n };\n }\n return { ...base, credentialValid: true, identity: body.data };\n } catch (error) {\n // Unreachable API is not an invalid credential. Say which one it is.\n return {\n ...base,\n error: {\n code: \"UNREACHABLE\",\n detail: `Could not reach ${apiUrl}: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n }\n}\n\n/** Human-readable one-liner for an identity. */\nexport function describeIdentity(identity: WhoamiResponse): string {\n switch (identity.credential) {\n case \"user\":\n return `user ${identity.user.username ?? identity.user.email}`;\n case \"api_key\":\n return `API key${identity.label ? ` \"${identity.label}\"` : \"\"} (${identity.scopes.length} scope(s))`;\n case \"preview\":\n return \"preview token\";\n }\n}\n\n/** Scopes carried by the credential, or undefined when scopes do not apply. */\nexport function scopesOf(identity: WhoamiResponse | null): string[] | undefined {\n return identity?.credential === \"api_key\" ? identity.scopes : undefined;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync, rmSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/**\n * Configuration resolution and credential storage (SPEC 11).\n *\n * Resolution order for every value: explicit flag > environment variable >\n * linked project (`.myna/project.json`) > user default (`config.json`).\n * Credentials are never written to the linked project file; they live in the OS\n * keychain when possible, otherwise a `0600` config file.\n */\n\nexport const DEFAULT_API_URL = \"https://api.myna.sh\";\nconst KEYCHAIN_SERVICE = \"sh.myna.cli\";\n\nexport interface GlobalFlags {\n apiUrl?: string;\n project?: string;\n organization?: string;\n token?: string;\n json?: boolean;\n interactive?: boolean;\n}\n\nexport interface LinkedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n}\n\nexport interface UserConfig {\n apiUrl?: string;\n defaultOrganization?: string;\n defaultProject?: string;\n}\n\n/** Where the active credential came from — reported by `whoami` and `doctor`. */\nexport type TokenSource = \"flag\" | \"environment\" | \"stored\" | \"none\";\n\nexport interface ResolvedContext {\n apiUrl: string;\n token: string | undefined;\n tokenSource: TokenSource;\n project: string | undefined;\n organization: string | undefined;\n json: boolean;\n interactive: boolean;\n linked: LinkedProject | undefined;\n linkedRoot: string | undefined;\n}\n\nfunction configDir(): string {\n const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n return join(base, \"myna\");\n}\n\nfunction configFile(): string {\n return join(configDir(), \"config.json\");\n}\n\nfunction credentialsFile(): string {\n return join(configDir(), \"credentials.json\");\n}\n\nexport function readUserConfig(): UserConfig {\n try {\n return JSON.parse(readFileSync(configFile(), \"utf8\")) as UserConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeUserConfig(patch: Partial<UserConfig>): UserConfig {\n const current = readUserConfig();\n const next = { ...current, ...patch };\n ensureDir(configDir());\n writeFileSync(configFile(), JSON.stringify(next, null, 2) + \"\\n\");\n return next;\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n\n// --- Linked project ---------------------------------------------------------\n\nexport function findLinkedProject(startDir = process.cwd()): { linked: LinkedProject; root: string } | undefined {\n let dir = resolve(startDir);\n for (;;) {\n const file = join(dir, \".myna\", \"project.json\");\n if (existsSync(file)) {\n try {\n const linked = JSON.parse(readFileSync(file, \"utf8\")) as LinkedProject;\n return { linked, root: dir };\n } catch {\n return undefined;\n }\n }\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\nexport function writeLinkedProject(root: string, linked: LinkedProject): void {\n const dir = join(root, \".myna\");\n ensureDir(dir);\n writeFileSync(join(dir, \"project.json\"), JSON.stringify(linked, null, 2) + \"\\n\");\n}\n\nexport function removeLinkedProject(root: string): boolean {\n const file = join(root, \".myna\", \"project.json\");\n if (existsSync(file)) {\n rmSync(file);\n return true;\n }\n return false;\n}\n\n// --- Credential storage -----------------------------------------------------\n\nfunction isMac(): boolean {\n return platform() === \"darwin\";\n}\n\nfunction keychainAccount(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, \"\");\n}\n\nexport function storeToken(apiUrl: string, token: string): \"keychain\" | \"file\" {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\n \"security\",\n [\"add-generic-password\", \"-U\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\", token],\n { stdio: \"ignore\" },\n );\n return \"keychain\";\n } catch {\n // Fall through to file storage.\n }\n }\n const file = credentialsFile();\n const store = readCredentialFile();\n store[account] = token;\n ensureDir(configDir());\n writeFileSync(file, JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(file, 0o600);\n return \"file\";\n}\n\nexport function loadToken(apiUrl: string): string | undefined {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n const out = execFileSync(\n \"security\",\n [\"find-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\"],\n { stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n const token = out.toString(\"utf8\").trim();\n if (token) return token;\n } catch {\n // Not in keychain; try file.\n }\n }\n return readCredentialFile()[account];\n}\n\nexport function clearToken(apiUrl: string): void {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\"security\", [\"delete-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account], {\n stdio: \"ignore\",\n });\n } catch {\n // Ignore.\n }\n }\n const store = readCredentialFile();\n if (account in store) {\n delete store[account];\n writeFileSync(credentialsFile(), JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(credentialsFile(), 0o600);\n }\n}\n\nfunction readCredentialFile(): Record<string, string> {\n try {\n return JSON.parse(readFileSync(credentialsFile(), \"utf8\")) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\n// --- MCP server configuration -----------------------------------------------\n\n/**\n * The file `@myna-sh/mcp` reads for its credential and default project.\n *\n * Its shape is defined by `McpConfigFile` in `packages/mcp/src/config.ts` and\n * restated here rather than imported: the CLI does not depend on the MCP server\n * package, and taking a dependency on it so that `myna mcp install` can write\n * one JSON object would pull an executable into the CLI's bundle.\n *\n * This is the only place `myna mcp install` puts a token. The alternative —\n * inlining it into a client's own config file — writes a secret into whatever\n * the client happens to use, and for most of them that file lives in the\n * repository. Here it lands in the `0700` config directory at `0600`, next to\n * the credential store, which is where a secret on this machine already lives.\n */\nexport interface McpServerConfig {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, { project: string; organization?: string; apiUrl?: string; token?: string }>;\n}\n\nexport function mcpConfigFile(): string {\n return process.env.MYNA_MCP_CONFIG ?? join(configDir(), \"mcp.json\");\n}\n\nexport function readMcpConfig(): McpServerConfig {\n try {\n return JSON.parse(readFileSync(mcpConfigFile(), \"utf8\")) as McpServerConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeMcpConfig(patch: McpServerConfig): McpServerConfig {\n const next = { ...readMcpConfig(), ...patch };\n const file = mcpConfigFile();\n ensureDir(dirname(file));\n writeFileSync(file, JSON.stringify(next, null, 2) + \"\\n\");\n chmodSync(file, 0o600);\n return next;\n}\n\n// --- Resolution -------------------------------------------------------------\n\nexport function resolveContext(flags: GlobalFlags): ResolvedContext {\n const link = findLinkedProject();\n const user = readUserConfig();\n\n const apiUrl =\n flags.apiUrl ??\n process.env.MYNA_API_URL ??\n link?.linked.apiUrl ??\n user.apiUrl ??\n DEFAULT_API_URL;\n\n const stored = loadToken(apiUrl);\n const token = flags.token ?? process.env.MYNA_TOKEN ?? stored;\n const tokenSource: TokenSource = flags.token\n ? \"flag\"\n : process.env.MYNA_TOKEN\n ? \"environment\"\n : stored\n ? \"stored\"\n : \"none\";\n\n const project =\n flags.project ??\n process.env.MYNA_PROJECT ??\n link?.linked.project ??\n user.defaultProject;\n\n const organization =\n flags.organization ??\n process.env.MYNA_ORGANIZATION ??\n link?.linked.organization ??\n user.defaultOrganization;\n\n return {\n apiUrl: apiUrl.replace(/\\/+$/, \"\"),\n token,\n tokenSource,\n project,\n organization,\n json: Boolean(flags.json),\n interactive: flags.interactive !== false && process.stdout.isTTY === true,\n linked: link?.linked,\n linkedRoot: link?.root,\n };\n}\n","import { isMynaApiError } from \"@myna-sh/sdk/management\";\n\n/** Structured output, tables, and exit-code discipline (SPEC 11). */\n\nexport const CLI_JSON_VERSION = 1;\n\n/** Usage error → exit code 2. */\nexport class UsageError extends Error {}\n\n/** Operational error → exit code 1. */\nexport class CliError extends Error {}\n\nexport interface OutputMode {\n json: boolean;\n}\n\nlet mode: OutputMode = { json: false };\n\nexport function setOutputMode(next: OutputMode): void {\n mode = next;\n}\n\nexport function isJson(): boolean {\n return mode.json;\n}\n\n/** Diagnostics go to stderr and are suppressed in JSON mode. */\nexport function diag(message: string): void {\n if (!mode.json) process.stderr.write(message + \"\\n\");\n}\n\n/** Emit the single result value. JSON mode prints one versioned document. */\nexport function emit(value: unknown, human?: () => void): void {\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, data: value }) + \"\\n\");\n return;\n }\n if (human) {\n human();\n } else {\n process.stdout.write(prettyValue(value) + \"\\n\");\n }\n}\n\n/** Render an error and return the process exit code. */\nexport function reportError(error: unknown): number {\n if (isMynaApiError(error)) {\n const problem = {\n code: error.code,\n status: error.status,\n title: error.title,\n detail: error.detail,\n requestId: error.requestId,\n fields: error.fields,\n };\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, error: problem }) + \"\\n\");\n } else {\n process.stderr.write(`error: ${error.code} — ${error.detail ?? error.title}\\n`);\n for (const f of error.fields ?? []) {\n process.stderr.write(` · ${f.path}: ${f.message}\\n`);\n }\n if (error.requestId) process.stderr.write(` requestId: ${error.requestId}\\n`);\n }\n return 1;\n }\n\n const usage = error instanceof UsageError;\n const message = error instanceof Error ? error.message : String(error);\n if (mode.json) {\n process.stdout.write(\n JSON.stringify({ version: CLI_JSON_VERSION, error: { code: usage ? \"USAGE\" : \"ERROR\", detail: message } }) + \"\\n\",\n );\n } else {\n process.stderr.write(`error: ${message}\\n`);\n }\n return usage ? 2 : 1;\n}\n\n// --- Human tables -----------------------------------------------------------\n\nexport interface Column<T> {\n header: string;\n value: (row: T) => string;\n}\n\nexport function table<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(none)\\n\");\n return;\n }\n const headers = columns.map((c) => c.header);\n const cells = rows.map((r) => columns.map((c) => c.value(r) ?? \"\"));\n const widths = headers.map((h, i) => Math.max(h.length, ...cells.map((row) => stripLen(row[i] ?? \"\"))));\n const line = (values: string[]): string =>\n values.map((v, i) => pad(v, widths[i] ?? v.length)).join(\" \").replace(/\\s+$/, \"\");\n process.stdout.write(line(headers) + \"\\n\");\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n for (const row of cells) process.stdout.write(line(row) + \"\\n\");\n}\n\nexport function keyValues(pairs: Array<[string, string]>): void {\n const width = Math.max(...pairs.map(([k]) => k.length));\n for (const [k, v] of pairs) {\n process.stdout.write(`${pad(k + \":\", width + 1)} ${v}\\n`);\n }\n}\n\nfunction pad(value: string, width: number): string {\n const len = stripLen(value);\n return len >= width ? value : value + \" \".repeat(width - len);\n}\n\nfunction stripLen(value: string): number {\n return value.length;\n}\n\nfunction prettyValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value, null, 2);\n}\n","import { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\nimport { resolveContext, type GlobalFlags, type ResolvedContext } from \"./config.js\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Per-command context: resolved config plus lazily-built API clients. */\nexport interface Ctx extends ResolvedContext {\n management(): ManagementClient;\n requireProject(): string;\n requireOrganization(): string;\n}\n\nexport function buildContext(flags: GlobalFlags): Ctx {\n const resolved = resolveContext(flags);\n let mgmt: ManagementClient | undefined;\n\n return {\n ...resolved,\n management(): ManagementClient {\n if (!resolved.token) {\n throw new CliError(\"Not authenticated. Run `myna login` or pass --token / set MYNA_TOKEN.\");\n }\n mgmt ??= createManagementClient({ token: resolved.token, apiUrl: resolved.apiUrl });\n return mgmt;\n },\n requireProject(): string {\n if (!resolved.project) {\n throw new UsageError(\"No project selected. Pass --project, set MYNA_PROJECT, or run `myna link`.\");\n }\n return resolved.project;\n },\n requireOrganization(): string {\n if (!resolved.organization) {\n throw new UsageError(\"No organization selected. Pass --organization or set a default with `myna organizations use`.\");\n }\n return resolved.organization;\n },\n };\n}\n","import type { Command } from \"commander\";\nimport { buildContext, type Ctx } from \"./client.js\";\nimport type { GlobalFlags } from \"./config.js\";\nimport { reportError, setOutputMode } from \"./output.js\";\n\n/**\n * Wrap a command action: build the resolved context, set the output mode from\n * `--json`, run the handler, and translate thrown errors into exit codes.\n */\nexport function handle(\n fn: (ctx: Ctx, args: unknown[], opts: Record<string, unknown>) => Promise<void>,\n): (...cbArgs: unknown[]) => Promise<void> {\n return async (...cbArgs: unknown[]): Promise<void> => {\n const command = cbArgs[cbArgs.length - 1] as Command;\n const ctx = buildContext(command.optsWithGlobals() as GlobalFlags);\n setOutputMode({ json: ctx.json });\n try {\n await fn(ctx, command.processedArgs as unknown[], command.opts());\n } catch (error) {\n process.exitCode = reportError(error);\n }\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Parse `--data <json-or-@file>` into an object. */\nexport function parseData(input: string | undefined): Record<string, unknown> {\n if (!input) return {};\n const raw = input.startsWith(\"@\") ? readFileSync(input.slice(1), \"utf8\") : input;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new UsageError(`Invalid JSON for --data: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new UsageError(\"--data must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Apply `--set path=value` assignments (dot paths, JSON-or-string values). */\nexport function applySets(target: Record<string, unknown>, sets: string[] | undefined): Record<string, unknown> {\n if (!sets) return target;\n for (const assignment of sets) {\n const eq = assignment.indexOf(\"=\");\n if (eq === -1) throw new UsageError(`Invalid --set \"${assignment}\". Expected path=value.`);\n const path = assignment.slice(0, eq);\n const rawValue = assignment.slice(eq + 1);\n let value: unknown;\n try {\n value = JSON.parse(rawValue);\n } catch {\n value = rawValue;\n }\n setPath(target, path.split(\".\"), value);\n }\n return target;\n}\n\nfunction setPath(obj: Record<string, unknown>, parts: string[], value: unknown): void {\n let cursor: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof cursor[key] !== \"object\" || cursor[key] === null) cursor[key] = {};\n cursor = cursor[key] as Record<string, unknown>;\n }\n cursor[parts[parts.length - 1]!] = value;\n}\n\n/** Open a URL in the default browser (best effort; never throws). */\nexport function openBrowser(url: string): void {\n const cmd = platform() === \"darwin\" ? \"open\" : platform() === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform() === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n execFile(cmd, args, () => undefined);\n}\n\nexport interface EntryRef {\n collection?: string;\n slugOrId: string;\n}\n\n/** Parse `<collection>/<slug-or-id>` or a bare entry id. */\nexport function parseEntryRef(ref: string): EntryRef {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return { slugOrId: ref };\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return { slugOrId: ref };\n return { collection: ref.slice(0, slash), slugOrId: ref.slice(slash + 1) };\n}\n\n/** Resolve an entry ref to a concrete entry id, listing by slug when needed. */\nexport async function resolveEntryId(\n mgmt: ManagementClient,\n project: string,\n ref: string,\n): Promise<string> {\n const parsed = parseEntryRef(ref);\n if (parsed.slugOrId.startsWith(\"ent_\")) return parsed.slugOrId;\n if (!parsed.collection) {\n throw new UsageError(`Provide the entry as <collection>/<slug> or an ent_ id (got \"${ref}\").`);\n }\n let cursor: string | undefined;\n for (let guard = 0; guard < 50; guard++) {\n const page = await mgmt.entries.list(project, { collection: parsed.collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === parsed.slugOrId || e.id === parsed.slugOrId);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new CliError(`Entry not found: ${ref}`);\n}\n","import type { Command } from \"commander\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { checkCredential, describeIdentity } from \"../auth-check.js\";\nimport { clearToken, loadToken, storeToken } from \"../config.js\";\nimport { CliError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\ninterface DeviceStart {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface DeviceToken {\n status: \"pending\" | \"approved\" | \"denied\" | \"expired\";\n token?: string;\n}\n\nasync function apiPost<T>(apiUrl: string, path: string, body: unknown): Promise<T> {\n const res = await fetch(`${apiUrl}/v1${path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify(body),\n });\n const json = (await res.json().catch(() => ({}))) as { data?: T; detail?: string };\n if (!res.ok) throw new CliError(json.detail ?? `Request failed (${res.status}).`);\n return json.data as T;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\nfunction startDevice(apiUrl: string): Promise<DeviceStart> {\n return apiPost<DeviceStart>(apiUrl, \"/auth/device\", {});\n}\n\nfunction pollDevice(apiUrl: string, deviceCode: string): Promise<DeviceToken> {\n return apiPost<DeviceToken>(apiUrl, `/auth/device/${deviceCode}/token`, { deviceCode });\n}\n\n/**\n * Why a call would be denied, before spending another one finding out.\n *\n * Lives under `auth` because the question is about the credential, not the\n * content: a 403 and a 404 are the same \"no\" from the outside, and the three\n * causes behind them — a missing capability, a collection confinement, a\n * resource that is not there — have three different fixes.\n */\nfunction registerAccess(program: Command): void {\n program\n .command(\"access\")\n .description(\"Explain what this credential may do in a project, and why a call was denied\")\n .option(\"--capability <cap>\", \"capability to check, e.g. content:publish\")\n .option(\"--collection <key>\", \"collection the denied call touched\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const access = await ctx.management().projects.access(project, {\n capability: opts.capability as string | undefined,\n collection: opts.collection as string | undefined,\n });\n emit(access, () => {\n keyValues([\n [\"Project\", access.projectSlug],\n [\"Credential\", access.credential + (access.role ? ` (${access.role})` : \"\")],\n [\"Capabilities\", access.capabilities.join(\", \") || \"(none)\"],\n [\"Collections\", access.allowedCollections?.join(\", \") ?? \"all\"],\n ]);\n for (const check of access.checks) {\n diag(` ${check.ok ? \"ok \" : \"fail\"} ${check.id} — ${check.detail}`);\n }\n if (access.remedy) diag(`\\n remedy: ${access.remedy}`);\n });\n if (!access.allowed) process.exitCode = 1;\n }),\n );\n}\n\nexport function registerAuth(program: Command): void {\n registerAccess(program);\n const login = program\n .command(\"login\")\n .description(\"Authenticate via the browser device-authorization flow\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n diag(`\\n To authenticate, open:\\n ${start.verificationUri}\\n and enter the code: ${start.userCode}\\n`);\n if (ctx.interactive) openBrowser(start.verificationUri);\n\n const deadline = Date.now() + start.expiresIn * 1000;\n let token: string | undefined;\n while (Date.now() < deadline) {\n await sleep(Math.max(1, start.interval) * 1000);\n const poll = await pollDevice(ctx.apiUrl, start.deviceCode);\n if (poll.status === \"approved\" && poll.token) {\n token = poll.token;\n break;\n }\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n throw new CliError(`Authorization ${poll.status}.`);\n }\n }\n if (!token) throw new CliError(\"Device authorization timed out.\");\n\n const location = storeToken(ctx.apiUrl, token);\n diag(` Stored credential (${location}).`);\n emit(\n { ok: true, apiUrl: ctx.apiUrl, storage: location },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl}\\n`),\n );\n }),\n );\n\n /**\n * Non-blocking halves of the same flow.\n *\n * `myna login` blocks until a human approves in a browser, which is useless\n * to an automated caller: it cannot surface the code to whoever must approve\n * it, and it cannot do anything else while waiting. Splitting start from poll\n * lets a caller print the verification URI, hand it to a human, and poll on\n * its own schedule.\n */\n login\n .command(\"start\")\n .description(\"Begin device authorization and print the code without waiting\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n emit(\n {\n deviceCode: start.deviceCode,\n userCode: start.userCode,\n verificationUri: start.verificationUri,\n expiresIn: start.expiresIn,\n interval: start.interval,\n apiUrl: ctx.apiUrl,\n },\n () => {\n process.stdout.write(`${start.verificationUri}\\n`);\n diag(` Enter the code: ${start.userCode}`);\n diag(` Then run: myna login poll ${start.deviceCode}`);\n },\n );\n }),\n );\n\n login\n .command(\"poll\")\n .description(\"Check a pending device authorization once, or wait for it\")\n .argument(\"<device-code>\", \"device code from `myna login start`\")\n .option(\"--wait\", \"keep polling until approved, denied, or expired\", false)\n .option(\"--interval <seconds>\", \"seconds between attempts when waiting\", \"2\")\n .option(\"--timeout <seconds>\", \"give up after this long when waiting\", \"300\")\n .action(\n handle(async (ctx, args, opts) => {\n const deviceCode = args[0] as string;\n const wait = Boolean(opts.wait);\n const interval = Math.max(1, Number(opts.interval)) * 1000;\n const deadline = Date.now() + Math.max(1, Number(opts.timeout)) * 1000;\n\n for (;;) {\n const poll = await pollDevice(ctx.apiUrl, deviceCode);\n\n if (poll.status === \"approved\" && poll.token) {\n const location = storeToken(ctx.apiUrl, poll.token);\n emit(\n { status: \"approved\", stored: true, storage: location, apiUrl: ctx.apiUrl },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl} (stored in ${location})\\n`),\n );\n return;\n }\n\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n // A terminal answer is a result, not a crash: report it in the same\n // shape as success so a caller can branch on `status`.\n emit({ status: poll.status, stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(`Authorization ${poll.status}.\\n`),\n );\n process.exitCode = 1;\n return;\n }\n\n if (!wait) {\n emit({ status: \"pending\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stdout.write(\"pending\\n\"),\n );\n return;\n }\n\n if (Date.now() + interval > deadline) {\n emit({ status: \"timeout\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(\"Timed out waiting for approval.\\n\"),\n );\n process.exitCode = 1;\n return;\n }\n await sleep(interval);\n }\n }),\n );\n\n program\n .command(\"logout\")\n .description(\"Remove the stored credential for the current API URL\")\n .action(\n handle(async (ctx) => {\n clearToken(ctx.apiUrl);\n emit({ ok: true }, () => process.stdout.write(`Logged out of ${ctx.apiUrl}\\n`));\n }),\n );\n\n const auth = program.command(\"auth\").description(\"Inspect and verify credentials\");\n\n /**\n * The machine-readable counterpart to `whoami`: always exits 0 with a\n * definite answer, so a caller can branch on `credentialValid` instead of\n * parsing an error.\n */\n auth\n .command(\"verify\")\n .description(\"Check whether the current credential actually works\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n emit(status, () => {\n keyValues([\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n [\"Source\", status.source],\n [\"Identity\", status.identity ? describeIdentity(status.identity) : \"—\"],\n ]);\n if (status.error) process.stderr.write(`\\n${status.error.code}: ${status.error.detail}\\n`);\n });\n }),\n );\n\n program\n .command(\"whoami\")\n .description(\"Show the authenticated identity, validating it against the API\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token ?? loadToken(ctx.apiUrl), ctx.tokenSource);\n\n let organization: { name: string; role: string; slug: string } | undefined;\n if (status.credentialValid && ctx.organization) {\n organization = await ctx\n .management()\n .organizations.get(ctx.organization)\n .then((o) => ({ name: o.name, role: o.role, slug: o.slug }))\n .catch((e: unknown) => {\n if (isMynaApiError(e)) return undefined;\n throw e;\n });\n }\n\n emit({ ...status, organization: organization ?? null }, () => {\n const pairs: Array<[string, string]> = [\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n ];\n if (status.identity) pairs.push([\"Identity\", describeIdentity(status.identity)]);\n if (organization) pairs.push([\"Organization\", `${organization.name} (${organization.role})`]);\n keyValues(pairs);\n if (status.error) {\n process.stderr.write(`\\n${status.error.detail}\\n`);\n if (status.error.code !== \"UNREACHABLE\") {\n process.stderr.write(\"Run `myna login` to authenticate again.\\n\");\n }\n }\n });\n\n // Presence without validity is the failure the old behavior hid.\n if (!status.credentialValid) process.exitCode = 1;\n }),\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport {\n findLinkedProject,\n loadToken,\n removeLinkedProject,\n writeLinkedProject,\n DEFAULT_API_URL,\n} from \"../config.js\";\nimport { CliError, UsageError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nconst EXAMPLE_SCHEMA = `import { collection, field } from \"@myna-sh/sdk/schema\";\n\n/**\n * Example collection. Edit freely, then run:\n * myna schema diff\n * myna schema push\n */\nexport const posts = collection({\n name: \"posts\",\n label: \"Blog posts\",\n visibility: \"public\",\n titleField: \"title\",\n path: \"/blog/{slug}\",\n fields: {\n title: field.text({ required: true, maxLength: 120 }),\n slug: field.slug({ from: \"title\", required: true }),\n description: field.text({ multiline: true }),\n body: field.markdown({ required: true }),\n cover: field.asset({ allowed: [\"image/*\"] }),\n publishedAt: field.datetime(),\n },\n});\n`;\n\nfunction appUrlFor(apiUrl: string): string {\n try {\n const url = new URL(apiUrl);\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = \"app.\" + url.hostname.slice(4);\n return url.origin;\n }\n return apiUrl;\n } catch {\n return apiUrl;\n }\n}\n\nexport function registerWorkspace(program: Command): void {\n program\n .command(\"init\")\n .description(\"Scaffold a local `myna/` schema directory (and link if a project is set)\")\n .option(\"--schema-dir <dir>\", \"schema directory\", \"myna\")\n .action(\n handle(async (ctx, _args, opts) => {\n const dir = (opts.schemaDir as string) ?? \"myna\";\n mkdirSync(dir, { recursive: true });\n const file = join(dir, \"posts.ts\");\n const created: string[] = [];\n if (!existsSync(file)) {\n writeFileSync(file, EXAMPLE_SCHEMA);\n created.push(file);\n }\n let linked = false;\n if (ctx.project) {\n writeLinkedProject(process.cwd(), {\n project: ctx.project,\n organization: ctx.organization,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n created.push(\".myna/project.json\");\n linked = true;\n }\n emit({ schemaDir: dir, created, linked }, () => {\n diag(`Initialized ${dir}/`);\n for (const c of created) process.stdout.write(` created ${c}\\n`);\n if (!linked) process.stdout.write(` run \\`myna link --project <ref>\\` to link a project\\n`);\n });\n }),\n );\n\n program\n .command(\"link\")\n .description(\"Link the current directory to a project (writes .myna/project.json, no secrets)\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const project = (args[0] as string | undefined) ?? ctx.project;\n if (!project) throw new UsageError(\"Provide a project: `myna link <project>` or --project.\");\n // Validate the project exists and capture its organization.\n const resolved = await ctx.management().projects.get(project);\n writeLinkedProject(process.cwd(), {\n project,\n organization: ctx.organization ?? resolved.organizationId,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n emit({ linked: true, project: resolved.slug, organizationId: resolved.organizationId }, () =>\n process.stdout.write(`Linked to ${resolved.name} (${resolved.slug})\\n`),\n );\n }),\n );\n\n program\n .command(\"unlink\")\n .description(\"Remove the project link from the current directory tree\")\n .action(\n handle(async () => {\n const found = findLinkedProject();\n if (!found) throw new CliError(\"No linked project found.\");\n removeLinkedProject(found.root);\n emit({ unlinked: true }, () => process.stdout.write(`Unlinked ${found.linked.project}\\n`));\n }),\n );\n\n program\n .command(\"status\")\n .description(\"Show the resolved configuration and project link\")\n .action(\n handle(async (ctx) => {\n // `status` reads local configuration only — it deliberately makes no\n // network call. It therefore reports whether a credential is *present*,\n // never whether it works: use `myna auth verify` or `myna doctor` for\n // that. Calling mere presence \"authenticated\" is what let an expired\n // credential look healthy.\n const credentialPresent = Boolean(ctx.token ?? loadToken(ctx.apiUrl));\n emit(\n {\n apiUrl: ctx.apiUrl,\n credentialPresent,\n credentialSource: ctx.tokenSource,\n project: ctx.project ?? null,\n organization: ctx.organization ?? null,\n linkedRoot: ctx.linkedRoot ?? null,\n },\n () => {\n keyValues([\n [\"API URL\", ctx.apiUrl],\n [\"Credential present\", credentialPresent ? `yes (${ctx.tokenSource})` : \"no\"],\n [\"Project\", ctx.project ?? \"(none)\"],\n [\"Organization\", ctx.organization ?? \"(none)\"],\n [\"Linked at\", ctx.linkedRoot ?? \"(none)\"],\n ]);\n if (credentialPresent) diag(\"\\nNot verified against the API. Run `myna auth verify`.\");\n },\n );\n }),\n );\n\n program\n .command(\"open\")\n .description(\"Open the current project in the dashboard\")\n .action(\n handle(async (ctx) => {\n const app = appUrlFor(ctx.apiUrl);\n const path = ctx.organization && ctx.project ? `/${ctx.organization}/${ctx.project}` : \"\";\n const url = `${app}${path}`;\n if (ctx.interactive) openBrowser(url);\n emit({ url }, () => process.stdout.write(`${url}\\n`));\n }),\n );\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { isMynaApiError, generateTypesModule } from \"@myna-sh/sdk/management\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError, UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { canonicalJson, loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { schemaToDsl } from \"../dsl-emit.js\";\nimport { branchForContent, dirtyFiles, openPullRequest } from \"../git.js\";\nimport type { Ctx } from \"../client.js\";\n\n/** Fetch deployed canonical schemas (latest version per collection). */\nasync function deployedSchemas(ctx: Ctx, project: string): Promise<CollectionSchema[]> {\n const mgmt = ctx.management();\n const collections = await mgmt.schema.collections(project);\n const out: CollectionSchema[] = [];\n for (const c of collections) {\n const versions = await mgmt.schema.versions(project, c.key);\n const latest = versions[0];\n if (latest) out.push(latest.schemaJson as unknown as CollectionSchema);\n }\n return out.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function registerSchema(program: Command): void {\n const schema = program.command(\"schema\").description(\"Inspect and deploy code-owned schemas\");\n\n schema\n .command(\"inspect\")\n .description(\"Show deployed collections, or one collection's fields\")\n .argument(\"[collection]\", \"collection key\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const key = args[0] as string | undefined;\n if (!key) {\n const collections = await ctx.management().schema.collections(project);\n emit(collections, () =>\n table(collections, [\n { header: \"KEY\", value: (c) => c.key },\n { header: \"NAME\", value: (c) => c.displayName },\n { header: \"KIND\", value: (c) => c.kind },\n { header: \"VISIBILITY\", value: (c) => c.visibility },\n ]),\n );\n return;\n }\n const versions = await ctx.management().schema.versions(project, key);\n const latest = versions[0];\n if (!latest) throw new CliError(`Collection ${key} has no versions.`);\n const s = latest.schemaJson as unknown as CollectionSchema;\n emit({ collection: key, version: latest.version, schema: s }, () => {\n diag(`${key} — v${latest.version} (${s.kind}, ${s.visibility})`);\n table(s.fields, [\n { header: \"FIELD\", value: (f) => f.key },\n { header: \"TYPE\", value: (f) => f.type },\n { header: \"REQUIRED\", value: (f) => (f.required ? \"yes\" : \"\") },\n ]);\n });\n }),\n );\n\n schema\n .command(\"pull\")\n .description(\"Write deployed schemas to local DSL files\")\n .option(\"--schema-dir <dir>\", \"target schema directory\")\n .option(\"--open-pr\", \"commit the drift onto a branch and open a pull request instead of writing in place\", false)\n .option(\"--branch <name>\", \"branch to use with --open-pr (default: derived from the content)\")\n .option(\"--base <branch>\", \"branch to open the pull request against (default: the current branch)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const schemas = await deployedSchemas(ctx, project);\n const rendered = schemas.map((s) => ({ file: join(dir, `${s.name}.ts`), code: schemaToDsl(s) }));\n const changed = rendered.filter(\n (r) => !existsSync(r.file) || readFileSync(r.file, \"utf8\") !== r.code,\n );\n\n const write = (): string[] => {\n mkdirSync(dir, { recursive: true });\n for (const r of rendered) writeFileSync(r.file, r.code);\n return rendered.map((r) => r.file);\n };\n\n if (!opts.openPr) {\n const written = write();\n emit({ pulled: schemas.length, files: written, changed: changed.map((c) => c.file) }, () => {\n for (const f of written) process.stdout.write(` wrote ${f}\\n`);\n });\n return;\n }\n\n if (changed.length === 0) {\n emit({ pulled: schemas.length, changed: [], pullRequest: null }, () =>\n diag(\"No drift: the local schema files already match the deployed schema.\"),\n );\n return;\n }\n\n // Anything already modified under the schema directory would be swept\n // into the commit, and a pull request nobody meant to open is worse than\n // one that was not opened.\n const root = ctx.linkedRoot ?? process.cwd();\n const dirty = dirtyFiles(root, [dir]);\n if (dirty.length > 0) {\n throw new UsageError(\n `Commit or stash changes under ${dir} first: ${dirty.join(\", \")}.`,\n );\n }\n\n // Described before the files move: the drift is what the local schema\n // said a moment ago, and overwriting it first would report no drift.\n const body = await driftBody(ctx, project, dir, changed.map((c) => c.file));\n write();\n\n const branch = (opts.branch as string | undefined) ?? branchForContent(changed.map((c) => c.code));\n const result = openPullRequest({\n cwd: root,\n files: changed.map((c) => c.file),\n branch,\n base: opts.base as string | undefined,\n title: `chore(schema): sync ${changed.length} collection(s) from ${project}`,\n body,\n });\n\n emit({ pulled: schemas.length, changed: changed.map((c) => c.file), pullRequest: result }, () => {\n if (!result.opened) {\n diag(`Branch ${result.branch} already exists — this drift is already proposed.`);\n return;\n }\n diag(`Opened ${result.url ?? `pull request from ${result.branch}`} against ${result.base}.`);\n });\n }),\n );\n\n schema\n .command(\"diff\")\n .description(\"Diff local schemas against the deployed schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const result = await ctx.management().schema.diff(project, canonicalJson(local));\n emit(result, () => renderDiff(result));\n }),\n );\n\n schema\n .command(\"drift\")\n .description(\"Show schema drift between this project and another (e.g. staging)\")\n .requiredOption(\"--against <project>\", \"project id or slug to compare with\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.drift(project, opts.against as string);\n emit(result, () => {\n if (result.inSync) diag(\"Schemas are in sync.\");\n else {\n diag(`${result.ops.length} op(s) of drift (${result.classification}):`);\n for (const op of result.ops) {\n process.stderr.write(` ${op.kind} ${op.collection}${op.field ? `.${op.field}` : \"\"} — ${op.detail}\\n`);\n }\n }\n });\n if (!result.inSync) process.exitCode = 1;\n }),\n );\n\n schema\n .command(\"promote\")\n .description(\"Promote another project's deployed schemas into this project\")\n .requiredOption(\"--from <project>\", \"source project id or slug\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.promote(project, opts.from as string, {\n allowDestructive: Boolean(opts.allowDestructive),\n });\n emit(result, () => {\n renderDiff(result.diff);\n diag(result.applied ? `Promoted ${result.versions.length} version(s).` : \"Nothing to promote.\");\n });\n }),\n );\n\n schema\n .command(\"push\")\n .description(\"Apply local schemas, creating immutable versions\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const collections = canonicalJson(local);\n const allowDestructive = Boolean(opts.allowDestructive);\n\n const plan = await ctx.management().schema.diff(project, collections);\n if (!ctx.json) renderDiff(plan);\n\n if (plan.hasDestructive && !allowDestructive) {\n throw new UsageError(\n \"This change is destructive. Re-run with --allow-destructive to proceed.\",\n );\n }\n if (plan.ops.length === 0) {\n emit({ applied: false, reason: \"no-changes\", diff: plan }, () => diag(\"No schema changes to apply.\"));\n return;\n }\n\n const pushed = await ctx\n .management()\n .schema.push(project, collections, { allowDestructive, changeSummary: opts.summary as string | undefined })\n .catch((error: unknown) => {\n if (isMynaApiError(error) && error.code === \"SCHEMA_CHANGE_DESTRUCTIVE\") {\n throw new UsageError(\"Destructive schema change rejected. Pass --allow-destructive.\");\n }\n throw error;\n });\n emit(pushed, () =>\n diag(`Applied ${pushed.versions.length} schema version(s) (${pushed.diff.classification}).`),\n );\n }),\n );\n\n\n schema\n .command(\"translations\")\n .description(\"Report what is still untranslated in a collection\")\n .argument(\"<collection>\", \"collection key\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const report = await ctx.management().schema.translations(project, args[0] as string);\n emit(report, () => {\n if (report.locales.length === 0) {\n diag(\"Localization is not configured for this project.\");\n return;\n }\n if (report.fields.length === 0) {\n diag(`No localized fields in \"${report.collection}\".`);\n return;\n }\n diag(`${report.totalEntries} entr(y/ies), localized fields: ${report.fields.join(\", \")}`);\n table(report.coverage, [\n { header: \"LOCALE\", value: (c) => c.locale },\n { header: \"COMPLETE\", value: (c) => `${c.completeEntries}/${c.totalEntries}` },\n { header: \"PERCENT\", value: (c) => `${c.percent}%` },\n { header: \"MISSING FIELDS\", value: (c) => String(c.missingFields) },\n ]);\n });\n }),\n );\n\n const types = program.command(\"types\").description(\"Generate content types\");\n types\n .command(\"generate\")\n .description(\"Generate deterministic TypeScript types from schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--deployed\", \"use deployed schemas instead of local files\", false)\n .option(\"--out <file>\", \"write to a file instead of stdout\")\n .action(\n handle(async (ctx, _args, opts) => {\n let schemas: CollectionSchema[];\n if (opts.deployed) {\n schemas = await deployedSchemas(ctx, ctx.requireProject());\n } else {\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n schemas = await loadLocalSchemas(dir);\n }\n const code = generateTypesModule(schemas);\n const out = opts.out as string | undefined;\n if (out) {\n writeFileSync(out, code);\n emit({ written: out, collections: schemas.length }, () => diag(`Wrote ${out}`));\n } else if (ctx.json) {\n emit({ code, collections: schemas.length });\n } else {\n process.stdout.write(code);\n }\n }),\n );\n}\n\n/**\n * The pull request's description: which files move, and what the drift actually\n * was. The drift is read from the same `schema diff` a push would run, so the\n * body describes the change in the direction a reviewer thinks in — \"pushing\n * this repo would have done X\" — rather than restating the file list twice.\n *\n * Best-effort: local schema files that no longer compile are exactly the case\n * where the deployed schema is worth pulling, so a failure here must not stop\n * the pull request.\n */\nasync function driftBody(ctx: Ctx, project: string, dir: string, files: string[]): Promise<string> {\n const lines = [\n `Deployed schema for \\`${project}\\`, pulled into this repository by \\`myna schema pull --open-pr\\`.`,\n \"\",\n \"Files:\",\n ...files.map((f) => `- \\`${f}\\``),\n ];\n try {\n const local = await loadLocalSchemas(dir);\n const diff = await ctx.management().schema.diff(project, canonicalJson(local));\n if (diff.ops.length > 0) {\n lines.push(\n \"\",\n `Before this change, pushing this repository would have applied ${diff.ops.length} operation(s) (${diff.classification}):`,\n \"\",\n ...diff.ops.map((op) => `- \\`${op.kind}\\` ${op.collection}${op.field ? `.${op.field}` : \"\"} — ${op.detail}`),\n );\n }\n } catch {\n lines.push(\"\", \"_The local schema could not be diffed; review the file changes directly._\");\n }\n return lines.join(\"\\n\");\n}\n\ninterface DiffLike {\n ops: Array<{ kind: string; collection: string; field?: string; classification: string; detail: string }>;\n classification: string;\n hasDestructive: boolean;\n contentValidationErrors: Array<{ collection: string; path: string; message: string }>;\n}\n\nfunction renderDiff(diff: DiffLike): void {\n if (diff.ops.length === 0) {\n diag(\"No changes.\");\n return;\n }\n for (const op of diff.ops) {\n const marker = op.classification === \"destructive\" ? \"!\" : op.classification === \"conditionally_destructive\" ? \"~\" : \"+\";\n const target = op.field ? `${op.collection}.${op.field}` : op.collection;\n process.stdout.write(` ${marker} ${op.kind} ${target} — ${op.detail}\\n`);\n }\n process.stdout.write(` classification: ${diff.classification}\\n`);\n for (const err of diff.contentValidationErrors) {\n process.stderr.write(` content error: ${err.collection} ${err.path} — ${err.message}\\n`);\n }\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { build, type Plugin } from \"esbuild\";\nimport { toCanonical, type CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError } from \"./output.js\";\n\n/**\n * Load local schema definitions through a controlled esbuild bundle-to-memory,\n * then import the compiled module (SPEC 7 / 11). Each `.ts`/`.js`/`.mjs` file in\n * the schema directory may default-export a collection, export an array of\n * collections, or export several named collections.\n */\n\nexport const DEFAULT_SCHEMA_DIR = \"myna\";\n\n/**\n * Resolve DSL imports in user schema files to the copy bundled with the CLI\n * (`dsl.ts`, built to a sibling `dsl.js`). Schema loading therefore works\n * without `@myna-sh/sdk` installed, and canonicalization always runs against\n * the exact DSL version this CLI ships.\n */\nfunction dslAliasPlugin(): Plugin {\n let dslPath = fileURLToPath(new URL(\"./dsl.js\", import.meta.url));\n if (!existsSync(dslPath)) dslPath = dslPath.replace(/\\.js$/, \".ts\");\n return {\n name: \"myna-dsl-alias\",\n setup(builder) {\n builder.onResolve({ filter: /^@myna-sh\\/(schema|sdk\\/schema)$/ }, () => ({\n path: dslPath,\n }));\n },\n };\n}\n\nfunction looksLikeCollection(value: unknown): value is CollectionSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { name?: unknown }).name === \"string\" &&\n Array.isArray((value as { fields?: unknown }).fields)\n );\n}\n\nfunction collectFromModule(mod: Record<string, unknown>, out: Map<string, CollectionSchema>): void {\n const consider = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const v of value) consider(v);\n return;\n }\n if (looksLikeCollection(value)) out.set(value.name, value);\n };\n for (const value of Object.values(mod)) consider(value);\n}\n\nfunction listSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir)) {\n if (entry.startsWith(\".\") || entry === \"node_modules\" || entry === \"dist\") continue;\n const full = join(dir, entry);\n const st = statSync(full);\n if (st.isDirectory()) {\n files.push(...listSchemaFiles(full));\n } else if (/\\.(ts|mts|js|mjs)$/.test(entry) && !/\\.d\\.ts$/.test(entry)) {\n files.push(full);\n }\n }\n return files.sort();\n}\n\nexport async function loadLocalSchemas(schemaDir = DEFAULT_SCHEMA_DIR): Promise<CollectionSchema[]> {\n const dir = resolve(schemaDir);\n if (!existsSync(dir)) {\n throw new CliError(`Schema directory not found: ${schemaDir}. Run \\`myna init\\` to scaffold it.`);\n }\n const files = listSchemaFiles(dir);\n if (files.length === 0) {\n throw new CliError(`No schema files found in ${schemaDir}.`);\n }\n\n const collections = new Map<string, CollectionSchema>();\n for (const file of files) {\n const result = await build({\n entryPoints: [file],\n bundle: true,\n write: false,\n format: \"esm\",\n platform: \"node\",\n target: \"node20\",\n logLevel: \"silent\",\n absWorkingDir: process.cwd(),\n plugins: [dslAliasPlugin()],\n }).catch((error: unknown) => {\n throw new CliError(`Failed to compile ${file}: ${error instanceof Error ? error.message : String(error)}`);\n });\n\n const code = result.outputFiles[0]?.text ?? \"\";\n const dataUrl = `data:text/javascript;base64,${Buffer.from(code).toString(\"base64\")}`;\n const mod = (await import(dataUrl)) as Record<string, unknown>;\n collectFromModule(mod, collections);\n }\n\n if (collections.size === 0) {\n throw new CliError(\"No collections were exported from the schema directory.\");\n }\n\n return [...collections.values()]\n .map((c) => toCanonical(c))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function canonicalJson(schemas: CollectionSchema[]): Record<string, unknown>[] {\n return schemas.map((s) => s as unknown as Record<string, unknown>);\n}\n\n/** Resolve the schema directory relative to the linked project root if set. */\nexport function schemaDirFor(root: string | undefined, override?: string): string {\n if (override) return override;\n if (root) {\n const candidate = join(root, DEFAULT_SCHEMA_DIR);\n if (existsSync(candidate)) return candidate;\n }\n return DEFAULT_SCHEMA_DIR;\n}\n","import type { CollectionSchema } from \"./types.js\";\n\n/**\n * Deterministic JSON serialization: object keys are emitted in sorted order,\n * arrays preserve their order (field order is significant). Produces a stable\n * string suitable for hashing and equality checks.\n */\nexport function canonicalStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const v = (value as Record<string, unknown>)[key];\n if (v === undefined) continue;\n out[key] = sortValue(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Return a deep-cloned, canonically-ordered copy of a schema. This is the exact\n * shape persisted as `collection_versions.schema_json`.\n */\nexport function toCanonical(schema: CollectionSchema): CollectionSchema {\n return JSON.parse(canonicalStringify(schema)) as CollectionSchema;\n}\n","import type { CollectionSchema, FieldDef, ListItem } from \"@myna-sh/schema\";\n\n/**\n * Emit editable `@myna-sh/sdk/schema` DSL source from a canonical collection schema.\n * Used by `myna schema pull` to materialize deployed schemas as local TS.\n */\nexport function schemaToDsl(schema: CollectionSchema): string {\n const opts: string[] = [\n `name: ${str(schema.name)}`,\n `label: ${str(schema.label)}`,\n ];\n if (schema.kind !== \"collection\") opts.push(`kind: ${str(schema.kind)}`);\n opts.push(`visibility: ${str(schema.visibility)}`);\n if (schema.titleField) opts.push(`titleField: ${str(schema.titleField)}`);\n if (schema.path) opts.push(`path: ${str(schema.path)}`);\n if (schema.guidance) opts.push(`guidance: ${str(schema.guidance)}`);\n\n const fieldLines = schema.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)},`).join(\"\\n\");\n\n return [\n `import { collection, field, item } from \"@myna-sh/sdk/schema\";`,\n ``,\n `export const ${varName(schema.name)} = collection({`,\n ` ${opts.join(\",\\n \")},`,\n ` fields: {`,\n fieldLines,\n ` },`,\n `});`,\n ``,\n ].join(\"\\n\");\n}\n\nfunction emitField(field: FieldDef): string {\n const o: Record<string, unknown> = {};\n if (field.label && field.label !== field.key) o.label = field.label;\n if (field.description) o.description = field.description;\n if (field.required) o.required = true;\n\n switch (field.type) {\n case \"text\":\n assign(o, { multiline: field.multiline || undefined, minLength: field.minLength, maxLength: field.maxLength, pattern: field.pattern, enum: field.enum, default: field.default });\n return call(\"text\", o);\n case \"slug\":\n assign(o, { from: field.from });\n return call(\"slug\", o);\n case \"markdown\":\n assign(o, { minLength: field.minLength, maxLength: field.maxLength, default: field.default });\n return call(\"markdown\", o);\n case \"number\":\n assign(o, { integer: field.integer || undefined, min: field.min, max: field.max, default: field.default });\n return call(\"number\", o);\n case \"boolean\":\n assign(o, { default: field.default });\n return call(\"boolean\", o);\n case \"date\":\n case \"datetime\":\n assign(o, { min: field.min, max: field.max, default: field.default });\n return call(field.type, o);\n case \"json\":\n assign(o, { default: field.default });\n return call(\"json\", o);\n case \"asset\":\n assign(o, { allowed: field.allowed, multiple: field.multiple || undefined });\n return call(\"asset\", o);\n case \"reference\":\n assign(o, { to: field.target, multiple: field.multiple || undefined });\n return call(\"reference\", o);\n case \"object\": {\n const inner = field.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n o.fields = `__RAW__{\\n${inner},\\n }`;\n return call(\"object\", o);\n }\n case \"list\":\n o.of = `__RAW__${emitItem(field.item)}`;\n assign(o, { minItems: field.minItems, maxItems: field.maxItems });\n return call(\"list\", o);\n default:\n return `field.json({})`;\n }\n}\n\nfunction emitItem(item: ListItem): string {\n switch (item.kind) {\n case \"reference\":\n return `item.reference({ to: ${str(item.target)} })`;\n case \"asset\":\n return `item.asset({ allowed: ${JSON.stringify(item.allowed)} })`;\n case \"object\": {\n const inner = item.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n return `item.object({ fields: {\\n${inner},\\n } })`;\n }\n default:\n return `item.${item.kind}()`;\n }\n}\n\nfunction call(name: string, opts: Record<string, unknown>): string {\n const entries = Object.entries(opts);\n if (entries.length === 0) return `field.${name}()`;\n const body = entries.map(([k, v]) => `${ident(k)}: ${literal(v)}`).join(\", \");\n return `field.${name}({ ${body} })`;\n}\n\nfunction assign(target: Record<string, unknown>, values: Record<string, unknown>): void {\n for (const [k, v] of Object.entries(values)) {\n if (v !== undefined) target[k] = v;\n }\n}\n\nfunction literal(value: unknown): string {\n if (typeof value === \"string\" && value.startsWith(\"__RAW__\")) return value.slice(\"__RAW__\".length);\n return JSON.stringify(value);\n}\n\nfunction str(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction ident(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction varName(name: string): string {\n const camel = name.replace(/[-_\\s]+(.)/g, (_, c: string) => c.toUpperCase());\n return /^[A-Za-z_$]/.test(camel) ? camel : `_${camel}`;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { CliError } from \"./output.js\";\n\n/**\n * Just enough git and `gh` to turn drift into a reviewable proposal.\n *\n * Schemas are code, so the honest place for a schema someone changed in the\n * dashboard is a pull request against the repository that owns it — not a\n * warning in `myna doctor` that everybody has learned to scroll past. This\n * shells out rather than speaking to the GitHub API: the credential, the remote,\n * and the review conventions all already exist in the developer's `gh`, and\n * reproducing them here would be a second, worse copy of them.\n */\n\nfunction run(command: string, args: string[], cwd: string): string {\n try {\n return execFileSync(command, args, { cwd, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n } catch (error) {\n const stderr = (error as { stderr?: Buffer | string }).stderr;\n const detail = typeof stderr === \"string\" ? stderr : stderr?.toString(\"utf8\");\n throw new CliError(`${command} ${args[0]} failed: ${(detail || (error as Error).message).trim()}`);\n }\n}\n\nfunction git(args: string[], cwd: string): string {\n return run(\"git\", args, cwd).trim();\n}\n\n/** For cleanup after a failure, where a second error would only obscure the first. */\nfunction gitQuiet(args: string[], cwd: string): void {\n try {\n execFileSync(\"git\", args, { cwd, stdio: \"ignore\" });\n } catch {\n // Nothing to do: the caller is already unwinding.\n }\n}\n\nfunction available(command: string): boolean {\n try {\n execFileSync(command, [\"--version\"], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\n/** A branch name that is the same for the same content, so re-running does not\n * open a second pull request for drift that is already proposed. */\nexport function branchForContent(contents: string[]): string {\n const digest = createHash(\"sha256\").update(contents.join(\"\\0\")).digest(\"hex\").slice(0, 8);\n return `myna/schema-${digest}`;\n}\n\n/** Whether `branch` exists here or on `origin`. */\nfunction branchExists(cwd: string, branch: string): boolean {\n try {\n execFileSync(\"git\", [\"rev-parse\", \"--verify\", `refs/heads/${branch}`], { cwd, stdio: \"ignore\" });\n return true;\n } catch {\n // Not local. Ask the remote, where another proposer would have put it.\n }\n try {\n const out = execFileSync(\"git\", [\"ls-remote\", \"--heads\", \"origin\", branch], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n return out.trim().length > 0;\n } catch {\n // No remote, or it is unreachable. Pushing is what will say so, and it says\n // it better than a guess here would.\n return false;\n }\n}\n\nexport interface PullRequestInput {\n cwd: string;\n /** Absolute paths of the files to commit. They must already be written. */\n files: string[];\n branch: string;\n /** Branch to open against. Defaults to whatever is checked out now. */\n base?: string;\n title: string;\n body: string;\n}\n\nexport interface PullRequestResult {\n opened: boolean;\n branch: string;\n base: string;\n url: string | null;\n /** Why nothing was opened, when nothing was. */\n reason?: \"branch-exists\";\n}\n\n/**\n * Commit the given files onto a fresh branch and open a pull request.\n *\n * The working tree is put back the way it was found: the change lives on its own\n * branch and in the pull request, and the checkout the developer was using does\n * not silently acquire a schema they have not read yet.\n */\nexport function openPullRequest(input: PullRequestInput): PullRequestResult {\n if (!available(\"git\")) throw new CliError(\"git is required to open a pull request.\");\n if (!available(\"gh\")) {\n throw new CliError(\"The GitHub CLI (gh) is required to open a pull request. See https://cli.github.com.\");\n }\n if (git([\"rev-parse\", \"--is-inside-work-tree\"], input.cwd) !== \"true\") {\n throw new CliError(`${input.cwd} is not inside a git repository.`);\n }\n\n const base = input.base ?? git([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], input.cwd);\n if (base === \"HEAD\") {\n throw new CliError(\"HEAD is detached; pass --base to say which branch to open the pull request against.\");\n }\n\n // An existing branch means this was already proposed. Opening a second pull\n // request for it would be noise, and force-pushing over the first would\n // discard review that may already have happened.\n //\n // Checked on the remote as well as locally, because the other proposer is\n // usually not this process: the GitHub App opens the same branch server-side,\n // and a second CI runner has its own empty checkout. A local-only check passes\n // in both cases and then fails at `git push` with a non-fast-forward, which is\n // a confusing way to discover that the work was already done.\n if (branchExists(input.cwd, input.branch)) {\n return { opened: false, branch: input.branch, base, url: null, reason: \"branch-exists\" };\n }\n\n git([\"checkout\", \"-b\", input.branch], input.cwd);\n let pushed = false;\n try {\n git([\"add\", \"--\", ...input.files], input.cwd);\n git([\"commit\", \"-m\", input.title, \"-m\", input.body], input.cwd);\n git([\"push\", \"--set-upstream\", \"origin\", input.branch], input.cwd);\n pushed = true;\n const url = run(\n \"gh\",\n [\"pr\", \"create\", \"--base\", base, \"--head\", input.branch, \"--title\", input.title, \"--body\", input.body],\n input.cwd,\n )\n .trim()\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"http\"))\n .pop();\n git([\"checkout\", base], input.cwd);\n return { opened: true, branch: input.branch, base, url: url ?? null };\n } catch (error) {\n // Unwind everything this call created. A half-finished attempt that leaves\n // the branch behind is worse than no attempt: the branch name is derived\n // from the content, so the next run would find it and report the drift as\n // already proposed when no pull request exists.\n gitQuiet([\"checkout\", base], input.cwd);\n if (pushed) gitQuiet([\"push\", \"origin\", \"--delete\", input.branch], input.cwd);\n gitQuiet([\"branch\", \"-D\", input.branch], input.cwd);\n throw error;\n }\n}\n\n/** Paths with uncommitted changes under `paths`, relative to the repository. */\nexport function dirtyFiles(cwd: string, paths: string[]): string[] {\n if (paths.length === 0) return [];\n // Porcelain v1 is `XY <path>`; the status characters are positional, so the\n // lines must not be trimmed before the path is taken off them.\n return run(\"git\", [\"status\", \"--porcelain\", \"--\", ...paths], cwd)\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => line.slice(3).trim());\n}\n\n/** Absolute path of the repository `cwd` sits in, or undefined outside one. */\nexport function repositoryRoot(cwd: string): string | undefined {\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return undefined;\n }\n}\n\n/** Every tracked `myna.lock` in the repository, absolute. */\nexport function trackedLockfiles(cwd: string): string[] {\n const root = repositoryRoot(cwd);\n if (!root) return [];\n try {\n return execFileSync(\"git\", [\"ls-files\", \"--full-name\", \"*myna.lock\", \"myna.lock\"], {\n cwd: root,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .split(\"\\n\")\n .filter(Boolean)\n .map((f) => join(root, f));\n } catch {\n return [];\n }\n}\n\nexport interface WorktreeChange {\n /** Absolute path. Porcelain reports repository-relative, which `git add` in a\n * subdirectory would resolve against the wrong base. */\n file: string;\n /** True when git has never seen this path, so undoing it means deleting it. */\n untracked: boolean;\n}\n\n/** Everything currently changed in the working tree, tracked or not. */\nexport function worktreeChanges(cwd: string): WorktreeChange[] {\n const root = repositoryRoot(cwd);\n // Only reached from inside a repository — `openPullRequest` has already\n // refused otherwise — so this is a type narrowing, not a fallback.\n if (!root) throw new CliError(`${cwd} is not inside a git repository.`);\n return run(\"git\", [\"status\", \"--porcelain\"], cwd)\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => ({\n file: join(root, line.slice(3).trim()),\n untracked: line.startsWith(\"??\"),\n }));\n}\n\n/**\n * Put the working tree back, given the changes a step introduced.\n *\n * Only safe because the caller established the tree was clean beforehand:\n * everything listed here was created by the step being undone, so restoring the\n * tracked ones and deleting the untracked ones loses no one else's work.\n */\nexport function discardChanges(cwd: string, changes: WorktreeChange[]): void {\n for (const change of changes) {\n if (change.untracked) rmSync(change.file, { force: true, recursive: true });\n else gitQuiet([\"checkout\", \"--\", change.file], cwd);\n }\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { basename, extname, join } from \"node:path\";\nimport { UsageError } from \"./output.js\";\n\n/**\n * Reading content from files: JSON documents and Markdown-with-frontmatter\n * directories, normalized into the rows the import API accepts.\n *\n * Migrating a site usually means the content already exists as files. Without\n * a reader here, every migration starts by writing a throwaway script to walk a\n * directory and reshape it — which is exactly the orchestration this is meant\n * to remove.\n */\n\nexport interface ContentRow {\n slug?: string;\n data: Record<string, unknown>;\n /** Where the row came from, for error messages that point at a file. */\n source: string;\n}\n\nexport type ContentFormat = \"json\" | \"markdown\";\n\n/** Guess the format from a path: a directory of `.md` files, or a JSON file. */\nexport async function detectFormat(path: string): Promise<ContentFormat> {\n const info = await stat(path).catch(() => undefined);\n if (!info) throw new UsageError(`No such file or directory: ${path}`);\n if (info.isDirectory()) return \"markdown\";\n return extname(path).toLowerCase() === \".json\" ? \"json\" : \"markdown\";\n}\n\n/**\n * Parse a frontmatter block.\n *\n * Deliberately a small subset of YAML — quoted and bare scalars, numbers,\n * booleans, null, and inline `[a, b]` arrays — because that is what content\n * frontmatter actually contains. Anything outside it fails loudly rather than\n * being silently misread, since a value quietly parsed as the wrong type\n * becomes a validation error pointing at the wrong place.\n */\nexport function parseFrontmatter(raw: string, source: string): { meta: Record<string, unknown>; body: string } {\n if (!raw.startsWith(\"---\")) return { meta: {}, body: raw };\n const end = raw.indexOf(\"\\n---\", 3);\n if (end === -1) throw new UsageError(`${source}: unterminated frontmatter block.`);\n const block = raw.slice(raw.indexOf(\"\\n\") + 1, end);\n const body = raw.slice(raw.indexOf(\"\\n\", end + 1) + 1);\n\n const meta: Record<string, unknown> = {};\n for (const [lineNumber, line] of block.split(\"\\n\").entries()) {\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n const separator = line.indexOf(\":\");\n if (separator === -1) {\n throw new UsageError(`${source}:${lineNumber + 2}: expected \"key: value\" in frontmatter.`);\n }\n const key = line.slice(0, separator).trim();\n meta[key] = parseScalar(line.slice(separator + 1).trim());\n }\n return { meta, body };\n}\n\nfunction parseScalar(value: string): unknown {\n if (value === \"\" || value === \"null\" || value === \"~\") return null;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n return inner === \"\" ? [] : inner.split(\",\").map((item) => parseScalar(item.trim()));\n }\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n return value.slice(1, -1);\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n return value;\n}\n\n/** Read a JSON import file: `{ collection, entries: [...] }` or a bare array. */\nexport async function readJsonRows(\n file: string,\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(file, \"utf8\"));\n } catch (error) {\n throw new UsageError(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const toRow = (value: unknown, index: number): ContentRow => {\n if (typeof value !== \"object\" || value === null) {\n throw new UsageError(`${file}: entry ${index} is not an object.`);\n }\n const record = value as Record<string, unknown>;\n // Accept both `{ slug, data }` and a bare field object.\n if (record.data && typeof record.data === \"object\") {\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record.data as Record<string, unknown>,\n source: `${file}#${index}`,\n };\n }\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record,\n source: `${file}#${index}`,\n };\n };\n\n if (Array.isArray(parsed)) {\n return { rows: parsed.map(toRow) };\n }\n const doc = parsed as { collection?: unknown; entries?: unknown };\n if (!Array.isArray(doc.entries)) {\n throw new UsageError(`${file}: expected { \"collection\": \"...\", \"entries\": [...] } or a JSON array.`);\n }\n return {\n collection: typeof doc.collection === \"string\" ? doc.collection : undefined,\n rows: doc.entries.map(toRow),\n };\n}\n\n/**\n * Read a directory of Markdown files as rows.\n *\n * The filename becomes the slug and the document body is placed on `bodyField`,\n * so a conventional content directory imports without a mapping file.\n */\nexport async function readMarkdownRows(dir: string, bodyField: string): Promise<ContentRow[]> {\n const info = await stat(dir).catch(() => undefined);\n const files = info?.isDirectory()\n ? (await readdir(dir))\n .filter((name) => [\".md\", \".markdown\"].includes(extname(name).toLowerCase()))\n .sort()\n .map((name) => join(dir, name))\n : [dir];\n\n if (files.length === 0) throw new UsageError(`No .md files found in ${dir}`);\n\n const rows: ContentRow[] = [];\n for (const file of files) {\n const raw = await readFile(file, \"utf8\");\n const { meta, body } = parseFrontmatter(raw, file);\n const slug = typeof meta.slug === \"string\" ? meta.slug : basename(file, extname(file));\n rows.push({\n slug,\n data: { ...meta, slug, [bodyField]: body.trim() },\n source: file,\n });\n }\n return rows;\n}\n\n/** Read rows from a file or directory in the requested (or detected) format. */\nexport async function readContentRows(\n path: string,\n opts: { format?: ContentFormat; bodyField: string },\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n const format = opts.format ?? (await detectFormat(path));\n if (format === \"json\") return readJsonRows(path);\n return { rows: await readMarkdownRows(path, opts.bodyField) };\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport { applySets, parseData, resolveEntryId } from \"../util.js\";\n\n/** Accept the documented spelling and the shorter one people reach for. */\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n\nexport function registerEntries(program: Command): void {\n const entries = program.command(\"entries\").description(\"Create, read, update, and manage entries\");\n\n entries\n .command(\"list\")\n .description(\"List entries in a collection\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--search <query>\", \"full-text query across the entry's text\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().entries.list(project, {\n collection: args[0] as string,\n status: opts.status as string | undefined,\n q: opts.search as string | undefined,\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (e) => e.id },\n { header: \"SLUG\", value: (e) => e.slug ?? \"\" },\n { header: \"STATUS\", value: (e) => e.status },\n { header: \"UPDATED\", value: (e) => e.updatedAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"get\")\n .description(\"Get one entry by <collection>/<slug-or-id>\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.get(project, id);\n emit(entry, () => {\n process.stdout.write(JSON.stringify(entry, null, 2) + \"\\n\");\n // Printed after the payload rather than buried in it: someone about to\n // edit this entry needs to see the collision, not find it.\n for (const cs of entry.openChangeSets ?? []) {\n const who = cs.actor?.displayName ?? \"someone\";\n const what = cs.fields.length ? cs.fields.join(\", \") : cs.operation;\n diag(` open change set ${cs.id} — ${cs.title} (${who}): ${what}`);\n }\n if (entry.contendedFields?.length) {\n diag(` contended by more than one: ${entry.contendedFields.join(\", \")}`);\n }\n });\n }),\n );\n\n entries\n .command(\"create\")\n .description(\"Create an entry\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--data <json-or-@file>\", \"entry data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"explicit slug\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const data = applySets(parseData(opts.data as string | undefined), opts.set as string[]);\n const entry = await ctx.management().entries.create(project, {\n collection: args[0] as string,\n data,\n slug: opts.slug as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Created ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"update\")\n .description(\"Update an entry\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--data <json-or-@file>\", \"replacement data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"new slug\")\n .option(\"--expected-revision <id>\", \"optimistic concurrency guard\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const sets = opts.set as string[];\n let data: Record<string, unknown> | undefined;\n if (opts.data !== undefined || sets.length > 0) {\n const base = opts.data !== undefined ? parseData(opts.data as string) : (await ctx.management().entries.get(project, id)).data;\n data = applySets(base, sets);\n }\n if (!data && !opts.slug) throw new UsageError(\"Nothing to update. Pass --data, --set, or --slug.\");\n const entry = await ctx.management().entries.update(project, id, {\n data,\n slug: opts.slug as string | undefined,\n expectedRevisionId: opts.expectedRevision as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Updated ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"delete\")\n .description(\"Stage an entry deletion on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.delete(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged delete of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"unpublish\")\n .description(\"Stage an entry unpublish on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.unpublish(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged unpublish of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"revisions\")\n .description(\"List an entry's revisions\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const revisions = await ctx.management().entries.revisions(project, id);\n emit(revisions, () =>\n table(revisions, [\n { header: \"ID\", value: (r) => r.id },\n { header: \"#\", value: (r) => String(r.revisionNumber) },\n { header: \"BY\", value: (r) => r.createdByType },\n { header: \"CREATED\", value: (r) => r.createdAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"duplicate\")\n .description(\"Duplicate an entry into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.duplicate(project, id, opts.changeSet as string | undefined);\n emit(entry, () => diag(`Duplicated into ${entry.id} (${entry.slug ?? \"no slug\"}).`));\n }),\n );\n\n entries\n .command(\"bulk\")\n .description(\"Stage a delete or unpublish for many entries at once\")\n .requiredOption(\"--action <action>\", \"delete or unpublish\")\n .requiredOption(\"--ids <ids>\", \"comma-separated entry ids\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, _args, opts) => {\n const action = opts.action as string;\n if (action !== \"delete\" && action !== \"unpublish\") {\n throw new UsageError(\"--action must be delete or unpublish.\");\n }\n const project = ctx.requireProject();\n const result = await ctx.management().entries.bulk(project, {\n action,\n entryIds: (opts.ids as string).split(\",\").map((s) => s.trim()).filter(Boolean),\n changeSetId: opts.changeSet as string | undefined,\n });\n emit(result, () =>\n table(result.results, [\n { header: \"ENTRY\", value: (r) => r.entryId },\n { header: \"OK\", value: (r) => (r.ok ? \"yes\" : \"no\") },\n { header: \"CHANGE SET\", value: (r) => r.changeSetId ?? \"—\" },\n { header: \"ERROR\", value: (r) => r.error ?? \"\" },\n ]),\n );\n if (result.results.some((r) => !r.ok)) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"import\")\n .description(\"Import entries from JSON or a Markdown directory, with dry-run validation\")\n .argument(\"<path>\", \"JSON file, or a directory of Markdown files with frontmatter\")\n .option(\"--collection <key>\", \"target collection (required unless the JSON file names one)\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the path by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set instead of a new one\")\n .option(\"--mode <mode>\", \"upsert (default) updates rows whose slug exists; create rejects them\", \"upsert\")\n .option(\"--dry-run\", \"validate without writing anything\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const format = parseFormat(opts.format as string | undefined);\n const mode = opts.mode as string;\n if (mode !== \"upsert\" && mode !== \"create\") {\n throw new UsageError(\"--mode must be upsert or create.\");\n }\n\n const source = await readContentRows(args[0] as string, {\n format,\n bodyField: opts.bodyField as string,\n });\n const collection = (opts.collection as string | undefined) ?? source.collection;\n if (!collection) {\n throw new UsageError(\"No collection. Pass --collection, or use a JSON file with a `collection` key.\");\n }\n if (source.rows.length === 0) throw new UsageError(\"Nothing to import.\");\n\n const result = await ctx.management().entries.import(project, {\n collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun: Boolean(opts.dryRun),\n changeSetId: opts.changeSet as string | undefined,\n mode,\n });\n\n emit(result, () => {\n const s = result.summary;\n const counts = `${s.created} created, ${s.updated} updated, ${s.unchanged} unchanged, ${s.invalid} invalid, ${s.skipped} skipped`;\n diag(\n result.dryRun\n ? `Dry run (${result.valid ? \"would apply\" : \"blocked\"}): ${counts}.`\n : `Imported into change set ${result.changeSetId}: ${counts}.`,\n );\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"reorder\")\n .description(\"Set a collection's editorial order (applies immediately; not staged)\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--slugs <list>\", \"comma-separated slugs or ids, in the desired order\")\n .option(\"--move <ref>\", \"reposition a single entry\")\n .option(\"--before <ref>\", \"with --move: place immediately before this entry\")\n .option(\"--after <ref>\", \"with --move: place immediately after this entry\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const collection = args[0] as string;\n const slugs = opts.slugs as string | undefined;\n const move = opts.move as string | undefined;\n if (Boolean(slugs) === Boolean(move)) {\n throw new UsageError(\"Provide either --slugs or --move.\");\n }\n if (!move && (opts.before || opts.after)) {\n throw new UsageError(\"--before and --after only apply with --move.\");\n }\n\n const body = slugs\n ? { order: slugs.split(\",\").map((s) => s.trim()).filter(Boolean) }\n : {\n move: {\n entry: move!,\n ...(opts.before ? { before: opts.before as string } : {}),\n ...(opts.after ? { after: opts.after as string } : {}),\n },\n };\n\n const result = await ctx.management().entries.reorder(project, collection, body);\n emit(result, () => {\n diag(\n `Reordered ${result.collection}: ${result.writes} row(s) written. ` +\n \"Ordering is not staged — this is live for readers now.\",\n );\n table(result.updated, [\n { header: \"ENTRY\", value: (r) => r.slug ?? r.id },\n { header: \"RANK\", value: (r) => r.rank },\n ]);\n });\n }),\n );\n\n entries\n .command(\"references\")\n .description(\"Show which entries reference this one and what it references\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const refs = await ctx.management().entries.references(project, id);\n emit(refs, () => {\n diag(`Referenced by ${refs.referencedBy.length} entr(y/ies):`);\n table(refs.referencedBy, [\n { header: \"ENTRY\", value: (r) => `${r.collectionKey}/${r.slug ?? r.id}` },\n { header: \"IN DRAFT\", value: (r) => (r.inDraft ? \"yes\" : \"no\") },\n { header: \"IN PUBLISHED\", value: (r) => (r.inPublished ? \"yes\" : \"no\") },\n ]);\n diag(`References ${refs.references.length} entr(y/ies):`);\n table(refs.references, [\n { header: \"ENTRY\", value: (r) => (r.collectionKey ? `${r.collectionKey}/${r.slug ?? r.id}` : r.id) },\n { header: \"STATE\", value: (r) => (!r.exists ? \"missing\" : r.published ? \"published\" : \"unpublished\") },\n ]);\n });\n }),\n );\n\n entries\n .command(\"restore\")\n .description(\"Restore a historical revision into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .requiredOption(\"--revision <id>\", \"revision id to restore\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.restoreRevision(project, id, opts.revision as string);\n emit(result, () => diag(`Restored revision ${opts.revision as string} into ${result.revision.id}.`));\n }),\n );\n\n entries\n .command(\"search\")\n .description(\"Full-text search entries across a project\")\n .argument(\"<query>\", \"words to search for\")\n .option(\"--collection <key>\", \"restrict to one collection\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().entries.list(project, {\n q: args[0] as string,\n collection: opts.collection as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (e) => e.id },\n { header: \"COLLECTION\", value: (e) => e.collection },\n { header: \"SLUG\", value: (e) => e.slug ?? \"\" },\n { header: \"STATUS\", value: (e) => e.status },\n ]),\n );\n }),\n );\n}\n\nfunction collect(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n","import type { Command } from \"commander\";\nimport type { TextSegmentContract } from \"@myna-sh/api-contracts\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerChanges(program: Command): void {\n const changes = program.command(\"changes\").description(\"Manage change sets: validate, preview, publish\");\n\n changes\n .command(\"list\")\n .description(\"List change sets\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().changeSets.list(project, {\n status: opts.status as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (c) => c.id },\n { header: \"TITLE\", value: (c) => c.title },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"ITEMS\", value: (c) => String(c.items.length) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"create\")\n .description(\"Create a change set\")\n .requiredOption(\"--title <title>\", \"change set title\")\n .option(\"--description <text>\", \"change set description\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.create(project, {\n title: opts.title as string,\n description: opts.description as string | undefined,\n });\n emit(cs, () => diag(`Created change set ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"inspect\")\n .description(\"Show a change set and its items\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.get(project, args[0] as string);\n emit(cs, () => {\n diag(`${cs.title} — ${cs.status}`);\n table(cs.items, [\n { header: \"TYPE\", value: (i) => i.resourceType },\n { header: \"RESOURCE\", value: (i) => i.resourceId },\n { header: \"OP\", value: (i) => i.operation },\n ]);\n });\n }),\n );\n\n changes\n .command(\"validate\")\n .description(\"Validate a change set against deployed schemas\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.validate(project, args[0] as string);\n emit(result, () => {\n if (result.valid) {\n diag(\"valid\");\n } else {\n for (const e of result.errors) {\n process.stderr.write(` ${e.resourceId} ${e.path} — ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"preview\")\n .description(\"Create a preview for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const preview = await ctx.management().previews.create(project, { changeSetId: args[0] as string });\n emit(preview, () => {\n process.stdout.write(`${preview.url}\\n`);\n diag(`fallback: ${preview.fallbackUrl}`);\n });\n }),\n );\n\n changes\n .command(\"publish\")\n .description(\"Atomically publish a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--confirm-publish\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmPublish) throw new UsageError(\"Publishing requires --confirm-publish.\");\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.publish(project, args[0] as string);\n emit(result, () =>\n diag(`Published ${result.publishedEntryIds.length} entr(y/ies): ${result.publishedEntryIds.join(\", \")}`),\n );\n }),\n );\n\n changes\n .command(\"close\")\n .description(\"Close a change set without publishing\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.close(project, args[0] as string);\n emit(cs, () => diag(`Closed ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"schedule\")\n .description(\"Schedule, reschedule, or cancel a change set's publish\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--at <datetime>\", \"ISO 8601 datetime to publish at\")\n .option(\"--cancel\", \"cancel the scheduled publish\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (Boolean(opts.at) === Boolean(opts.cancel)) {\n throw new UsageError(\"Provide exactly one of --at <datetime> or --cancel.\");\n }\n const client = ctx.management();\n const cs = opts.cancel\n ? await client.changeSets.cancelSchedule(project, args[0] as string)\n : await client.changeSets.schedule(project, args[0] as string, new Date(opts.at as string).toISOString());\n emit(cs, () =>\n diag(cs.scheduledAt ? `Scheduled to publish at ${cs.scheduledAt}.` : \"Schedule cancelled.\"),\n );\n }),\n );\n\n changes\n .command(\"reviews\")\n .description(\"List reviews and approvals for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.reviews(project, args[0] as string);\n emit(reviews, () =>\n table(reviews, [\n { header: \"REVIEWER\", value: (r) => `${r.reviewerType}:${r.reviewerId}` },\n { header: \"STATUS\", value: (r) => r.status },\n { header: \"STALE\", value: (r) => (r.stale ? \"yes\" : \"no\") },\n { header: \"DECIDED\", value: (r) => r.decidedAt ?? \"—\" },\n ]),\n );\n }),\n );\n\n changes\n .command(\"request-review\")\n .description(\"Assign a reviewer to a change set\")\n .argument(\"<id>\", \"change set id\")\n .requiredOption(\"--reviewer <id>\", \"reviewer id (user, api key, or agent id)\")\n .option(\"--reviewer-type <type>\", \"reviewer actor type\", \"user\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestReview(project, args[0] as string, {\n reviewerType: opts.reviewerType as \"user\" | \"api_key\" | \"agent\" | \"system\",\n reviewerId: opts.reviewer as string,\n });\n emit(reviews, () => diag(`Requested review from ${opts.reviewer as string}.`));\n }),\n );\n\n changes\n .command(\"approve\")\n .description(\"Approve a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.approve(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Approved.\"));\n }),\n );\n\n changes\n .command(\"request-changes\")\n .description(\"Request changes on a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestChanges(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Requested changes.\"));\n }),\n );\n\n changes\n .command(\"comments\")\n .description(\"List comments on a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const comments = await ctx.management().changeSets.comments(project, args[0] as string);\n emit(comments, () =>\n table(comments, [\n { header: \"AUTHOR\", value: (c) => `${c.authorType}:${c.authorId ?? \"—\"}` },\n { header: \"ANCHOR\", value: (c) => (c.resourceId ? `${c.resourceId}${c.fieldPath ? `#${c.fieldPath}` : \"\"}` : \"—\") },\n { header: \"RESOLVED\", value: (c) => (c.resolvedAt ? \"yes\" : \"no\") },\n { header: \"BODY\", value: (c) => (c.body.length > 60 ? `${c.body.slice(0, 57)}...` : c.body) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"comment\")\n .description(\"Comment on a change set (optionally anchored to a field)\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<body>\", \"comment body\")\n .option(\"--entry <id>\", \"anchor to an entry in the change set\")\n .option(\"--field <path>\", \"anchor to a field path, e.g. fields.title\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const comment = await ctx.management().changeSets.comment(project, args[0] as string, {\n body: args[1] as string,\n resourceType: opts.entry ? \"entry\" : undefined,\n resourceId: opts.entry as string | undefined,\n fieldPath: opts.field as string | undefined,\n });\n emit(comment, () => diag(`Commented ${comment.id}.`));\n }),\n );\n\n changes\n .command(\"checks\")\n .description(\"Show the latest check run for a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--run\", \"run checks before showing results\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const client = ctx.management();\n const checks = opts.run\n ? (await client.changeSets.runChecks(project, args[0] as string)).checks\n : await client.changeSets.checks(project, args[0] as string);\n emit(checks, () =>\n table(checks, [\n { header: \"CHECK\", value: (c) => c.name },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"STALE\", value: (c) => (c.stale ? \"yes\" : \"no\") },\n { header: \"ISSUES\", value: (c) => String(c.details?.length ?? 0) },\n ]),\n );\n if (checks.some((c) => c.status === \"failed\")) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"diff\")\n .description(\"Show what a change set would change, field by field\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const diff = await ctx.management().changeSets.diff(project, args[0] as string);\n emit(diff, () => {\n for (const item of diff.items) {\n const label = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n diag(`${item.operation} ${label}${item.changeSummary ? ` — ${item.changeSummary}` : \"\"}`);\n table(item.changes, [\n { header: \"FIELD\", value: (c) => c.path },\n { header: \"KIND\", value: (c) => c.kind },\n { header: \"BEFORE\", value: (c) => preview(c.before) },\n { header: \"AFTER\", value: (c) => preview(c.after) },\n ]);\n // A body field truncated to 48 characters in the table says nothing.\n // Where the API sent word-level segments, print the words instead.\n for (const change of item.changes) {\n if (change.segments) diag(` ${change.path}: ${inlineWords(change.segments)}`);\n }\n }\n if (diff.items.length === 0) diag(\"No items.\");\n });\n }),\n );\n\n changes\n .command(\"rebase\")\n .description(\"Replay a change set's edits on top of what is published now\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--dry-run\", \"show what a rebase would do without writing\", false)\n .option(\"--take-mine\", \"on conflict, keep this change set's value\", false)\n .option(\"--take-theirs\", \"on conflict, accept what was published\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (opts.takeMine && opts.takeTheirs) {\n throw new UsageError(\"Provide at most one of --take-mine or --take-theirs.\");\n }\n const result = await ctx.management().changeSets.rebase(project, args[0] as string, {\n ...(opts.dryRun ? { dryRun: true } : {}),\n ...(opts.takeMine ? { onConflict: \"take-mine\" as const } : {}),\n ...(opts.takeTheirs ? { onConflict: \"take-theirs\" as const } : {}),\n });\n emit(result, () => {\n if (result.items.length === 0) {\n diag(`Nothing to rebase; ${result.upToDate.length} item(s) already on the current head.`);\n return;\n }\n for (const item of result.items) {\n const label = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.entryId;\n diag(`${label} — ${item.appliedPaths.length} field(s) replayed, ${item.conflicts.length} conflict(s)`);\n if (item.conflicts.length > 0) {\n table(item.conflicts, [\n { header: \"FIELD\", value: (c) => c.path },\n { header: \"MINE\", value: (c) => preview(c.mine) },\n { header: \"THEIRS\", value: (c) => preview(c.theirs) },\n ]);\n }\n }\n diag(result.dryRun ? \"Dry run — nothing written.\" : \"Rebased. Approvals are now stale; re-review.\");\n });\n if (result.items.some((i) => i.conflicts.length > 0) && result.dryRun) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"update\")\n .description(\"Retitle a change set or mark it ready for review\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--title <title>\", \"new title\")\n .option(\"--description <text>\", \"new description\")\n .option(\"--ready\", \"mark ready for review\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (!opts.title && !opts.description && !opts.ready) {\n throw new UsageError(\"Provide --title, --description, or --ready.\");\n }\n const cs = await ctx.management().changeSets.update(project, args[0] as string, {\n ...(opts.title ? { title: opts.title as string } : {}),\n ...(opts.description ? { description: opts.description as string } : {}),\n ...(opts.ready ? { status: \"ready\" as const } : {}),\n });\n emit(cs, () => diag(`${cs.id} is ${cs.status}.`));\n }),\n );\n\n changes\n .command(\"remove-reviewer\")\n .description(\"Unassign a reviewer from a change set\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<reviewer>\", \"reviewer user id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const reviews = await ctx\n .management()\n .changeSets.removeReviewer(project, args[0] as string, args[1] as string);\n emit(reviews, () => diag(`${reviews.length} reviewer(s) remain.`));\n }),\n );\n\n changes\n .command(\"resolve-comment\")\n .description(\"Resolve or reopen a comment on a change set\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<comment>\", \"comment id\")\n .option(\"--reopen\", \"reopen instead of resolving\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const comment = await ctx\n .management()\n .changeSets.resolveComment(project, args[0] as string, args[1] as string, !opts.reopen);\n emit(comment, () => diag(comment.resolvedAt ? \"Resolved.\" : \"Reopened.\"));\n }),\n );\n\n changes\n .command(\"report-check\")\n .description(\"Report the result of an external check on a change set\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<name>\", \"declared check name\")\n .requiredOption(\"--status <status>\", \"passed, failed, or skipped\")\n .option(\"--message <text>\", \"detail shown to the reviewer\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const status = opts.status as string;\n if (status !== \"passed\" && status !== \"failed\" && status !== \"skipped\") {\n throw new UsageError(\"--status must be passed, failed, or skipped.\");\n }\n const check = await ctx.management().changeSets.reportCheck(project, args[0] as string, args[1] as string, {\n status,\n ...(opts.message ? { details: [{ message: opts.message as string }] } : {}),\n });\n emit(check, () => diag(`Reported ${check.name}: ${check.status}.`));\n if (check.status === \"failed\") process.exitCode = 1;\n }),\n );\n}\n\n/**\n * A prose change in `wdiff` notation — `[-removed-]`, `{+added+}` — with long\n * unchanged runs elided, so the line is the edit rather than the document.\n */\nfunction inlineWords(segments: TextSegmentContract[]): string {\n const KEEP = 32;\n return segments\n .map((s) => {\n const flat = s.value.replaceAll(/\\s+/g, \" \");\n if (s.op === \"insert\") return `{+${flat}+}`;\n if (s.op === \"delete\") return `[-${flat}-]`;\n return flat.length > KEEP * 2 ? `${flat.slice(0, KEEP)} … ${flat.slice(-KEEP)}` : flat;\n })\n .join(\"\");\n}\n\n/** One-line preview of a field value for the diff table. */\nfunction preview(value: unknown): string {\n if (value === undefined || value === null) return \"—\";\n const text = typeof value === \"string\" ? value : JSON.stringify(value);\n const flat = text.replaceAll(/\\s+/g, \" \");\n return flat.length > 48 ? `${flat.slice(0, 47)}…` : flat;\n}\n","import type { Command } from \"commander\";\nimport { diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerReleases(program: Command): void {\n const releases = program\n .command(\"releases\")\n .description(\"Inspect what shipped and generate a revert\");\n\n releases\n .command(\"list\")\n .description(\"List releases, newest first\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().releases.list(project, { limit: Number(opts.limit) });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"#\", value: (r) => String(r.number) },\n { header: \"TITLE\", value: (r) => r.title },\n { header: \"PUBLISHED\", value: (r) => r.publishedAt },\n { header: \"BY\", value: (r) => r.publishedBy?.displayName ?? \"—\" },\n { header: \"ITEMS\", value: (r) => String(r.itemCount) },\n {\n header: \"STATE\",\n value: (r) =>\n r.revertedBy\n ? r.revertedBy.status === \"published\"\n ? `reverted by #${r.revertedBy.releaseNumber ?? \"?\"}`\n : `revert ${r.revertedBy.status}`\n : r.revertsReleaseNumber\n ? `reverts #${r.revertsReleaseNumber}`\n : \"live\",\n },\n ]),\n );\n }),\n );\n\n releases\n .command(\"inspect\")\n .description(\"Show one release\")\n .argument(\"<release>\", \"release number or published change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const release = await ctx.management().releases.get(project, args[0] as string);\n emit(release, () => {\n diag(`#${release.number} — ${release.title}`);\n diag(`published ${release.publishedAt} by ${release.publishedBy?.displayName ?? \"unknown\"}`);\n diag(`${release.itemCount} item(s), change set ${release.id}`);\n if (release.revertsReleaseNumber) diag(`reverts release #${release.revertsReleaseNumber}`);\n if (release.revertedBy) {\n diag(`revert ${release.revertedBy.status}: change set ${release.revertedBy.changeSetId}`);\n }\n });\n }),\n );\n\n releases\n .command(\"diff\")\n .description(\"Show what a release changed, field by field\")\n .argument(\"<release>\", \"release number or published change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const release = await ctx.management().releases.get(project, args[0] as string);\n // A release *is* a published change set, so its diff is the change-set\n // diff — the same one the reviewer read before publishing it.\n const diff = await ctx.management().changeSets.diff(project, release.id);\n emit({ release, ...diff }, () => {\n diag(`#${release.number} — ${release.title} (${diff.items.length} item(s))`);\n for (const item of diff.items) {\n const name = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n process.stdout.write(` ${item.operation} ${name}\\n`);\n for (const change of item.changes) {\n process.stdout.write(` ${change.kind} ${change.path}\\n`);\n }\n }\n });\n }),\n );\n\n releases\n .command(\"revert\")\n .description(\"Generate a change set restoring the state before a release\")\n .argument(\"<release>\", \"release number or published change set id\")\n .option(\"--title <title>\", \"title for the generated change set\")\n .option(\"--force\", \"revert resources a later release already changed\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().releases.revert(project, args[0] as string, {\n ...(opts.title ? { title: opts.title as string } : {}),\n ...(opts.force ? { force: true } : {}),\n });\n emit(result, () => {\n diag(`Created change set ${result.changeSet.id} — ${result.changeSet.title}`);\n table(result.reverted, [\n { header: \"OP\", value: (r) => r.operation },\n {\n header: \"RESOURCE\",\n value: (r) => (r.collection && r.slug ? `${r.collection}/${r.slug}` : r.resourceId),\n },\n { header: \"RESTORES\", value: (r) => r.restoredFromRevisionId ?? \"—\" },\n ]);\n if (result.skipped.length > 0) {\n diag(`${result.skipped.length} resource(s) skipped:`);\n for (const s of result.skipped) {\n const label = s.collection && s.slug ? `${s.collection}/${s.slug}` : s.resourceId;\n process.stderr.write(` ${label} — ${s.reason}: ${s.message}\\n`);\n }\n }\n // The revert is a draft on purpose. Saying so here is the difference\n // between someone believing the rollback is live and knowing it isn't.\n diag(`Not published. Review, then: myna changes publish ${result.changeSet.id} --confirm-publish`);\n });\n }),\n );\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { LOCKFILE_NAME, findLockfile, formatLock, parseLock, writeLock, type MynaLock } from \"@myna-sh/sdk/lock\";\nimport {\n branchForRelease,\n releasePullRequestBody,\n releasePullRequestTitle,\n type ReleaseSummary,\n} from \"@myna-sh/shared\";\nimport type { ReleaseContract } from \"@myna-sh/api-contracts\";\nimport { CliError, UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport {\n discardChanges,\n dirtyFiles,\n openPullRequest,\n repositoryRoot,\n trackedLockfiles,\n worktreeChanges,\n} from \"../git.js\";\nimport type { Ctx } from \"../client.js\";\n\n/**\n * `myna pull` — move this repository's content pin forward.\n *\n * The build reads at `myna.lock`, so bumping the lock is the act of accepting\n * new content, and it is an edit to a tracked file. With `--open-pr` that edit\n * arrives as a pull request whose body is the field-level diff of every release\n * being taken on, and the repository's own CI — the real build, the real tests —\n * runs against the content before anyone merges it.\n *\n * The point is not the file. It is that \"the CMS changed and the site broke\"\n * stops being a deploy failure and becomes a failing check on a pull request\n * somebody has to read.\n */\n\n/**\n * Where this repository's lockfile is, or where to create one.\n *\n * Bumps the lockfile that already exists rather than writing a second one\n * beside the working directory. That distinction is the whole point: a\n * repository can be pinned from a subdirectory, from its root, or by the GitHub\n * App writing to a path configured in the dashboard, and those must all land on\n * the same file. `readLock` walks up and stops at the first one it finds, so a\n * stray second lockfile does not conflict — it silently wins, and the site\n * builds from a release nobody chose.\n *\n * The search is bounded to the repository, so a lockfile in some unrelated\n * parent directory is never adopted.\n */\nfunction lockPath(ctx: Ctx): string {\n const cwd = ctx.linkedRoot ?? process.cwd();\n const found = findLockfile(cwd);\n if (found) {\n const boundary = repositoryRoot(cwd);\n if (!boundary || found.startsWith(boundary)) return found;\n }\n return join(cwd, LOCKFILE_NAME);\n}\n\n/**\n * Refuse to guess when a repository has more than one lockfile.\n *\n * Two pins for one repository is not a state anything can resolve correctly:\n * whichever sits nearest the build wins, and it may not be the one being moved.\n * Naming both and stopping is the only honest answer.\n */\nfunction assertOneLockfile(cwd: string, active: string): void {\n const all = trackedLockfiles(cwd);\n if (all.length <= 1) return;\n throw new UsageError(\n `This repository has ${all.length} lockfiles:\\n` +\n all.map((f) => ` ${f}${f === active ? \" (the one this would move)\" : \"\"}`).join(\"\\n\") +\n `\\nReads take the one nearest the build, which may not be that one. Delete the extras and keep a single ${LOCKFILE_NAME}.`,\n );\n}\n\nfunction readLockAt(file: string): MynaLock | undefined {\n if (!existsSync(file)) return undefined;\n return parseLock(readFileSync(file, \"utf8\"), file);\n}\n\nasync function latestRelease(ctx: Ctx, project: string): Promise<ReleaseContract> {\n const page = await ctx.management().releases.list(project, { limit: 1 });\n const latest = page.data[0];\n if (!latest) {\n throw new CliError(\n `Project ${project} has not published a release yet. There is nothing to pin — publish a change set first.`,\n );\n }\n return latest;\n}\n\n/**\n * Every release strictly after `from`, up to and including `to`, oldest first.\n *\n * Pages backwards from the newest and stops as soon as it walks past `from`,\n * so bumping a lock that is one release behind costs one request whether the\n * project has ten releases or ten thousand.\n */\nasync function releasesBetween(\n ctx: Ctx,\n project: string,\n from: number,\n to: number,\n): Promise<ReleaseContract[]> {\n const found: ReleaseContract[] = [];\n let cursor: string | undefined;\n for (;;) {\n const page = await ctx.management().releases.list(project, { limit: 50, ...(cursor ? { cursor } : {}) });\n for (const release of page.data) {\n if (release.number > to) continue;\n if (release.number <= from) return found.reverse();\n found.push(release);\n }\n if (!page.nextCursor) return found.reverse();\n cursor = page.nextCursor;\n }\n}\n\n/**\n * Assemble the pull request text.\n *\n * The rendering itself lives in `@myna-sh/shared`, because the GitHub App opens\n * the same pull request from the API side. If the two rendered differently, the\n * App and a CI job watching the same project would each open one for the same\n * release and neither would recognize the other's as already proposed.\n */\nasync function pullRequestText(\n ctx: Ctx,\n project: string,\n from: MynaLock | undefined,\n to: ReleaseContract,\n releases: ReleaseContract[],\n rollback: boolean,\n): Promise<{ title: string; body: string }> {\n const summaries: ReleaseSummary[] = await Promise.all(\n releases.map(async (release) => ({\n number: release.number,\n title: release.title,\n description: release.description,\n itemCount: release.itemCount,\n // A release whose diff cannot be read is still a release worth naming.\n diff: await ctx\n .management()\n .changeSets.diff(project, release.id)\n .catch(() => null),\n })),\n );\n const input = {\n project,\n from: from?.release ?? null,\n to: { number: to.number, title: to.title, description: to.description, itemCount: to.itemCount },\n releases: summaries,\n rollback,\n };\n return { title: releasePullRequestTitle(input), body: releasePullRequestBody(input) };\n}\n\nexport function registerPull(program: Command): void {\n program\n .command(\"pull\")\n .description(`Pin this repository's content to a release in ${LOCKFILE_NAME}`)\n .option(\"--release <n>\", \"release number to pin to (default: the newest)\")\n .option(\"--check\", \"report whether the pin is behind and exit non-zero if it is\", false)\n .option(\"--open-pr\", \"commit the bump onto a branch and open a pull request\", false)\n .option(\n \"--run <command>\",\n \"shell command to run after moving the pin; anything it changes is committed with the lockfile\",\n )\n .option(\"--branch <name>\", \"branch to use with --open-pr (default: derived from the release)\")\n .option(\"--base <branch>\", \"branch to open the pull request against (default: the current branch)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const file = lockPath(ctx);\n assertOneLockfile(ctx.linkedRoot ?? process.cwd(), file);\n const current = readLockAt(file);\n\n if (current && current.project !== project) {\n throw new UsageError(\n `${LOCKFILE_NAME} pins project \"${current.project}\" but the selected project is \"${project}\". Pass --project ${current.project}, or delete the lockfile.`,\n );\n }\n\n const target = opts.release\n ? await ctx.management().releases.get(project, String(opts.release))\n : await latestRelease(ctx, project);\n\n // --check answers one question — is the build reading stale content? —\n // and answers it with an exit code, because that is what CI reads.\n if (opts.check) {\n if (!current) {\n throw new UsageError(`No ${LOCKFILE_NAME} here. Run \\`myna pull\\` to create one.`);\n }\n const behind = await releasesBetween(ctx, project, current.release, target.number);\n emit(\n { lockfile: file, release: current.release, latest: target.number, behind: behind.map((r) => r.number) },\n () => {\n if (behind.length === 0) {\n diag(`${LOCKFILE_NAME} is at release #${current.release} — current.`);\n return;\n }\n diag(`${LOCKFILE_NAME} is at release #${current.release}; #${target.number} is available.`);\n table(behind, [\n { header: \"#\", value: (r) => String(r.number) },\n { header: \"TITLE\", value: (r) => r.title },\n { header: \"PUBLISHED\", value: (r) => r.publishedAt },\n { header: \"ITEMS\", value: (r) => String(r.itemCount) },\n ]);\n },\n );\n if (behind.length > 0) process.exitCode = 1;\n return;\n }\n\n const next: MynaLock = {\n project,\n release: target.number,\n publishedAt: target.publishedAt,\n title: target.title,\n ...(ctx.apiUrl && !ctx.apiUrl.startsWith(\"https://api.myna.sh\") ? { apiUrl: ctx.apiUrl } : {}),\n };\n\n if (current && formatLock(current) === formatLock(next)) {\n emit({ lockfile: file, release: target.number, changed: false, pullRequest: null }, () =>\n diag(`${LOCKFILE_NAME} is already at release #${target.number}.`),\n );\n return;\n }\n\n // `--release` can point backwards, and a rollback is a legitimate reason\n // to pull: the previous release is the fastest way to get a green build\n // back. The span is the same set of releases either way — it is only the\n // direction of travel, and therefore the wording, that differs.\n const rollback = current !== undefined && target.number < current.release;\n const releases = rollback\n ? await releasesBetween(ctx, project, target.number, current.release)\n : await releasesBetween(ctx, project, current?.release ?? 0, target.number);\n\n if (!opts.openPr) {\n writeLock(file, next);\n if (opts.run) execSync(opts.run as string, { cwd: ctx.linkedRoot ?? process.cwd(), stdio: \"inherit\" });\n emit(\n {\n lockfile: file,\n release: target.number,\n from: current?.release ?? null,\n changed: true,\n rollback,\n releases: releases.map((r) => r.number),\n },\n () => {\n if (!current) {\n diag(`${LOCKFILE_NAME}: pinned to #${target.number}.`);\n return;\n }\n diag(\n rollback\n ? `${LOCKFILE_NAME}: #${current.release} → #${target.number}, rolling back ${releases.length} release(s).`\n : `${LOCKFILE_NAME}: #${current.release} → #${target.number} (${releases.length} release(s)).`,\n );\n },\n );\n return;\n }\n\n const root = ctx.linkedRoot ?? process.cwd();\n const command = opts.run as string | undefined;\n // Anything already modified would be swept into the commit, and a pull\n // request nobody meant to open is worse than one that was not opened.\n // With --run the guard has to cover the whole repository rather than the\n // lockfile, and cover exactly what the commit will: the command may write\n // anywhere, and a check narrower than the commit is not a check.\n const dirty = command\n ? worktreeChanges(root).map((c) => c.file)\n : dirtyFiles(root, [file]);\n if (dirty.length > 0) {\n throw new UsageError(`Commit or stash ${dirty.join(\", \")} first.`);\n }\n\n // Described before anything moves: the span is what the pin was a moment\n // ago, and bumping it first would describe the wrong one.\n const text = await pullRequestText(ctx, project, current, target, releases, rollback);\n writeLock(file, next);\n\n // The pin moves before the command runs, so the command reads content at\n // the new release — a generated snapshot, a prerendered page, a search\n // index. Whatever it produces is committed with the pin that produced it,\n // which keeps a derived artifact and its source release in one reviewable\n // unit instead of two commits that can disagree.\n if (command) {\n try {\n execSync(command, { cwd: root, stdio: \"inherit\" });\n } catch (error) {\n discardChanges(root, worktreeChanges(root));\n throw new CliError(`--run command failed: ${(error as Error).message}`);\n }\n }\n\n const changes = worktreeChanges(root);\n const branch = (opts.branch as string | undefined) ?? branchForRelease(project, target.number);\n let result;\n try {\n result = openPullRequest({\n cwd: root,\n files: changes.map((c) => c.file),\n branch,\n base: opts.base as string | undefined,\n title: text.title,\n body: text.body,\n });\n } catch (error) {\n discardChanges(root, changes);\n throw error;\n }\n // On success `openPullRequest` checks the base branch back out, which\n // restores tracked files; untracked ones it created are still here.\n if (!result.opened) discardChanges(root, changes);\n\n emit({ lockfile: file, release: target.number, from: current?.release ?? null, releases: releases.map((r) => r.number), pullRequest: result }, () => {\n if (!result.opened) {\n diag(`Branch ${result.branch} already exists — release #${target.number} is already proposed.`);\n return;\n }\n diag(`Opened ${result.url ?? `pull request from ${result.branch}`} against ${result.base}.`);\n });\n }),\n );\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n formatLock as formatLockImpl,\n parseLock as parseLockImpl,\n type MynaLock as SharedMynaLock,\n} from \"@myna-sh/shared/lock\";\n\n/**\n * `myna.lock` — the release a repository builds against.\n *\n * Content is the one input to a build that is normally left unpinned. Source is\n * a commit, dependencies are a lockfile, and content is \"whatever the API said\n * when the runner started\" — so the same commit builds two different sites on\n * two different days, and a content change that breaks the build surfaces as a\n * failed deploy rather than a failed check.\n *\n * A lockfile fixes that. It names a release, `createMyna({ release })` reads at\n * it, and the build becomes reproducible: same commit plus same lock produces\n * the same bytes. Moving to newer content is then an edit to a tracked file,\n * which is to say a pull request — opened by the GitHub App, or by\n * `myna pull --open-pr` for repositories that would rather not install one.\n *\n * The file *format* is implemented in `@myna-sh/shared`, because Myna's own API\n * writes this file too and the two must produce identical bytes. What is here is\n * the filesystem handling, kept in a separate entry point (`@myna-sh/sdk/lock`)\n * precisely so importing it cannot drag `node:fs` into a browser bundle.\n *\n * The public shape below is *declared* here rather than re-exported, which looks\n * like duplication and is not. `@myna-sh/shared` is private and never published,\n * so anything the published declarations name has to be inlined — and tsup does\n * not inline a pass-through `export ... from`. It emitted a re-export pointing at\n * a package no consumer can install, which typechecked inside this repository\n * and failed for everyone outside it. The runtime was fine either way, which is\n * exactly why it would have shipped.\n *\n * The implementations are still the shared ones, and the two assertions below\n * fail the build if the definitions of `MynaLock` ever drift apart.\n */\n\nexport const LOCKFILE_NAME = \"myna.lock\";\n\nexport interface MynaLock {\n /** Project id or slug the release number belongs to. */\n project: string;\n /** Release number this repository reads at. */\n release: number;\n /** When that release published. Informational; the number is the pin. */\n publishedAt: string;\n /** Title of the release, so a diff of this file reads like a changelog. */\n title?: string;\n /** API origin, when it is not the default `https://api.myna.sh`. */\n apiUrl?: string;\n}\n\n/**\n * Compile-time proof that the declaration above still matches the shared one.\n *\n * Two assertions, because one is not enough. Mutual assignability catches a\n * changed or removed field, but silently allows a *new optional* one — and an\n * optional field added to the shared type and not here is precisely the drift\n * this is guarding against, since consumers would have no way to set it. So the\n * key sets are compared as well.\n *\n * Both are erased at build time; their whole job is to fail `tsc`.\n */\ntype MutuallyAssignable<A, B> = [A] extends [B] ? ([B] extends [A] ? true : never) : never;\ntype SameKeys<A, B> = MutuallyAssignable<keyof A, keyof B>;\n\nconst _lockShapesAgree: MutuallyAssignable<MynaLock, SharedMynaLock> = true;\nconst _lockKeysAgree: SameKeys<MynaLock, SharedMynaLock> = true;\nvoid _lockShapesAgree;\nvoid _lockKeysAgree;\n\n/** Serialize a lockfile. Key order is fixed and the file ends in a newline. */\nexport function formatLock(lock: MynaLock): string {\n return formatLockImpl(lock);\n}\n\n/**\n * Parse a lockfile, throwing when it exists but is malformed — a build that\n * believes it is pinned and is not is the failure pinning exists to prevent.\n */\nexport function parseLock(source: string, origin = LOCKFILE_NAME): MynaLock {\n return parseLockImpl(source, origin);\n}\n\n/** Walk up from `startDir` looking for a lockfile. Returns its path. */\nexport function findLockfile(startDir: string = process.cwd()): string | undefined {\n let dir = resolve(startDir);\n for (;;) {\n const file = join(dir, LOCKFILE_NAME);\n if (existsSync(file)) return file;\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\n/**\n * Read the nearest lockfile, or `undefined` if there is none.\n *\n * A missing lockfile is an ordinary state — the repository has not opted in —\n * and reads live. A lockfile that exists but does not parse is not: it means a\n * build is about to read content nobody pinned while believing it pinned it, so\n * it throws rather than silently falling back.\n */\nexport function readLock(startDir: string = process.cwd()): MynaLock | undefined {\n const file = findLockfile(startDir);\n if (!file) return undefined;\n return parseLock(readFileSync(file, \"utf8\"), file);\n}\n\nexport function writeLock(file: string, lock: MynaLock): void {\n writeFileSync(file, formatLock(lock));\n}\n","/**\n * `myna.lock` — the release a repository builds against — and the pull request\n * that moves it.\n *\n * All of this lives here rather than in the CLI because two things now open\n * that pull request: `myna pull --open-pr`, run from someone's CI, and the\n * GitHub App, run from Myna's own job runner when a change set publishes. They\n * have to agree on the bytes of the lockfile, the name of the branch, and the\n * text of the body — otherwise the App and the CLI would each open a pull\n * request for the same release, differing only in formatting, and neither would\n * recognize the other's as already proposed.\n *\n * Nothing here touches the filesystem or the network, so it is safe in a\n * browser bundle, in the API, and in the CLI alike. The Node-only file handling\n * is `@myna-sh/sdk/lock`.\n */\n\nexport const LOCKFILE_NAME = \"myna.lock\";\n\nexport interface MynaLock {\n /** Project id or slug the release number belongs to. */\n project: string;\n /** Release number this repository reads at. */\n release: number;\n /** When that release published. Informational; the number is the pin. */\n publishedAt: string;\n /** Title of the release, so a diff of this file reads like a changelog. */\n title?: string;\n /** API origin, when it is not the default `https://api.myna.sh`. */\n apiUrl?: string;\n}\n\n/**\n * Serialize a lockfile.\n *\n * Key order is fixed and the file ends in a newline, so bumping the release\n * produces a one-or-two-line diff rather than a reshuffle a reviewer has to\n * read in full. Both writers call this, so a repository that has been updated\n * by the App and then by the CLI shows no spurious churn.\n */\nexport function formatLock(lock: MynaLock): string {\n const ordered: Record<string, unknown> = {\n project: lock.project,\n release: lock.release,\n publishedAt: lock.publishedAt,\n };\n if (lock.title) ordered.title = lock.title;\n if (lock.apiUrl) ordered.apiUrl = lock.apiUrl;\n return `${JSON.stringify(ordered, null, 2)}\\n`;\n}\n\n/**\n * Parse a lockfile.\n *\n * A malformed lockfile throws rather than degrading to live reads: a build that\n * believes it is pinned and is not is the failure pinning exists to prevent.\n */\nexport function parseLock(source: string, origin = LOCKFILE_NAME): MynaLock {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`${origin} is not valid JSON: ${(error as Error).message}`);\n }\n const lock = parsed as Partial<MynaLock>;\n if (typeof lock?.project !== \"string\" || !lock.project) {\n throw new Error(`${origin} is missing \"project\".`);\n }\n if (typeof lock.release !== \"number\" || !Number.isInteger(lock.release) || lock.release < 0) {\n throw new Error(`${origin} is missing a non-negative integer \"release\".`);\n }\n return {\n project: lock.project,\n release: lock.release,\n publishedAt: typeof lock.publishedAt === \"string\" ? lock.publishedAt : \"\",\n ...(lock.title ? { title: lock.title } : {}),\n ...(lock.apiUrl ? { apiUrl: lock.apiUrl } : {}),\n };\n}\n\n/**\n * The branch a content pull uses: one per project and target release.\n *\n * Deterministic, and that is the whole point. A publish can be announced more\n * than once — a webhook retry, a replayed delivery, a nightly safety net, or\n * both the App and a CI job watching the same project — and every one of those\n * has to land on the same branch name so the second finds the first already\n * there and opens nothing.\n */\nexport function branchForRelease(project: string, release: number): string {\n const slug = project.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"project\";\n return `myna/content-${slug}-r${release}`;\n}\n\n/** How many releases a pull request body describes in full before summarizing. */\nconst MAX_DETAILED_RELEASES = 20;\n\n/** The shape the body renderer needs, structural so this file depends on nothing. */\nexport interface ReleaseSummary {\n number: number;\n title: string;\n description?: string | null;\n itemCount?: number;\n /** Absent when the diff could not be read; the release is still named. */\n diff?: ReleaseDiff | null;\n}\n\nexport interface ReleaseDiff {\n items: {\n operation: string;\n collection?: string | null;\n slug?: string | null;\n resourceId: string;\n changeSummary?: string | null;\n changes: { path: string; kind: string }[];\n }[];\n}\n\nexport interface PullRequestTextInput {\n project: string;\n /** The pin being left, or null when this is the first one. */\n from: number | null;\n to: ReleaseSummary;\n /** Every release in the span, oldest first. */\n releases: ReleaseSummary[];\n /** True when the pin is moving backwards. */\n rollback: boolean;\n}\n\nexport function releasePullRequestTitle(input: PullRequestTextInput): string {\n return input.rollback\n ? `chore(content): roll ${input.project} back to release #${input.to.number}`\n : `chore(content): ${input.project} release #${input.to.number} — ${input.to.title}`;\n}\n\n/**\n * The pull request body: what taking this content on actually changes.\n *\n * Field paths, not just entry names. A reviewer looking at a lockfile bump can\n * otherwise only see a number move, which tells them nothing about whether the\n * build that is about to run will still pass.\n */\nexport function releasePullRequestBody(input: PullRequestTextInput): string {\n const { project, from, to, releases, rollback } = input;\n const lines = [\n from === null\n ? `Pins \\`${LOCKFILE_NAME}\\` for \\`${project}\\` to release #${to.number}.`\n : rollback\n ? `Rolls \\`${LOCKFILE_NAME}\\` for \\`${project}\\` back from release #${from} to #${to.number}.`\n : `Moves \\`${LOCKFILE_NAME}\\` for \\`${project}\\` from release #${from} to #${to.number}.`,\n \"\",\n rollback\n ? `${releases.length} release(s) are being undone for this repository. The content itself is untouched — nothing is unpublished — this only changes which release the build reads.`\n : `${releases.length} release(s). The build reads content at this release, so CI on this pull request is running against exactly the content that will ship.`,\n ];\n\n const detailed = releases.slice(-MAX_DETAILED_RELEASES);\n if (detailed.length < releases.length) {\n const omitted = releases.length - detailed.length;\n lines.push(\n \"\",\n `_Showing the newest ${detailed.length} of ${releases.length} releases. The remaining ${omitted} are listed without field detail._`,\n \"\",\n ...releases.slice(0, omitted).map((r) => `- #${r.number} — ${r.title} (${r.itemCount ?? 0} item(s))`),\n );\n }\n\n for (const release of detailed) {\n lines.push(\"\", `### #${release.number} — ${release.title}`);\n if (release.description) lines.push(\"\", release.description);\n if (!release.diff) {\n lines.push(\"\", `_Diff unavailable; ${release.itemCount ?? 0} item(s) changed._`);\n continue;\n }\n for (const item of release.diff.items) {\n const name = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n lines.push(\"\", `- **${item.operation} ${name}**`);\n if (item.changeSummary) lines.push(` - _${item.changeSummary}_`);\n for (const change of item.changes) lines.push(` - \\`${change.path}\\` ${change.kind}`);\n }\n }\n return lines.join(\"\\n\");\n}\n","import { ulid } from \"ulid\";\n\n/**\n * Prefixed, monotonic, URL-safe application identifiers.\n *\n * Every resource has a stable short prefix. The body is a lowercased ULID,\n * which is monotonic (time-ordered), URL-safe (Crockford base32), and globally\n * unique. Example: `usr_01jb& ...` lowercased.\n */\nexport const ID_PREFIXES = {\n user: \"usr\",\n oauthAccount: \"oau\",\n session: \"ses\",\n organization: \"org\",\n organizationMember: \"mem\",\n organizationInvitation: \"inv\",\n project: \"prj\",\n projectOrigin: \"por\",\n apiKey: \"key\",\n collection: \"col\",\n collectionVersion: \"clv\",\n entry: \"ent\",\n entrySlugAlias: \"als\",\n entryRevision: \"rev\",\n changeSet: \"chs\",\n changeSetItem: \"csi\",\n changeSetReview: \"csr\",\n changeSetComment: \"csc\",\n changeSetCheck: \"chk\",\n projectCheck: \"pck\",\n asset: \"ast\",\n assetUpload: \"upl\",\n savedView: \"viw\",\n previewToken: \"prv\",\n webhookEndpoint: \"whk\",\n webhookEvent: \"whe\",\n webhookDelivery: \"whd\",\n auditEvent: \"aud\",\n job: \"job\",\n idempotencyKey: \"idm\",\n billingCustomer: \"bcu\",\n billingSubscription: \"bsu\",\n billingProviderEvent: \"evt\",\n usagePeriod: \"usp\",\n mcpClient: \"mcl\",\n mcpGrant: \"mgr\",\n mcpAuthorizationCode: \"mac\",\n mcpToken: \"mtk\",\n deviceAuthorization: \"dev\",\n webauthnCredential: \"pky\",\n webauthnChallenge: \"wac\",\n githubInstallation: \"ghi\",\n projectRepository: \"prp\",\n} as const;\n\nexport type IdResource = keyof typeof ID_PREFIXES;\nexport type IdPrefix = (typeof ID_PREFIXES)[IdResource];\n\n/**\n * A branded string type for prefixed IDs of a given resource.\n * `PrefixedId<\"user\">` narrows to `` `usr_${string}` ``.\n */\nexport type PrefixedId<R extends IdResource> = `${(typeof ID_PREFIXES)[R]}_${string}`;\n\n/** Generate a new prefixed monotonic ID for a resource kind. */\nexport function newId<R extends IdResource>(resource: R): PrefixedId<R> {\n const prefix = ID_PREFIXES[resource];\n return `${prefix}_${ulid().toLowerCase()}` as PrefixedId<R>;\n}\n\n/** Generate a new ID from a raw prefix string (escape hatch). */\nexport function newIdWithPrefix(prefix: string): string {\n return `${prefix}_${ulid().toLowerCase()}`;\n}\n\nconst PREFIX_SET: ReadonlySet<string> = new Set(Object.values(ID_PREFIXES));\n\n/** Split a prefixed ID into `{ prefix, body }`, or `null` if malformed. */\nexport function parseId(id: string): { prefix: string; body: string } | null {\n const idx = id.indexOf(\"_\");\n if (idx <= 0 || idx === id.length - 1) return null;\n return { prefix: id.slice(0, idx), body: id.slice(idx + 1) };\n}\n\n/** True if `id` is a well-formed ID for the given resource kind. */\nexport function isId<R extends IdResource>(resource: R, id: string): id is PrefixedId<R> {\n const parsed = parseId(id);\n return parsed !== null && parsed.prefix === ID_PREFIXES[resource];\n}\n\n/** True if `id` carries any known Myna resource prefix. */\nexport function isKnownId(id: string): boolean {\n const parsed = parseId(id);\n return parsed !== null && PREFIX_SET.has(parsed.prefix);\n}\n","/** UTC / date utilities. All Myna timestamps are UTC. */\n\n/** Current instant. */\nexport function now(): Date {\n return new Date();\n}\n\n/** ISO-8601 UTC string (millisecond precision). */\nexport function toIso(date: Date): string {\n return date.toISOString();\n}\n\n/** Parse an ISO string; returns `null` when invalid. */\nexport function parseIso(value: string): Date | null {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nexport function addSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() + seconds * 1000);\n}\n\nexport function addDays(date: Date, days: number): Date {\n return addSeconds(date, days * 86_400);\n}\n\nexport function isPast(date: Date, reference: Date = now()): boolean {\n return date.getTime() < reference.getTime();\n}\n\n/** Start of the current UTC calendar month (used for Free-plan usage periods). */\nexport function startOfUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0));\n}\n\n/** Start of the next UTC calendar month. */\nexport function startOfNextUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 1, 0, 0, 0, 0));\n}\n\nexport const SECONDS = 1;\nexport const MINUTES = 60;\nexport const HOURS = 60 * 60;\nexport const DAYS = 24 * 60 * 60;\n","/**\n * Browser origin normalization.\n *\n * An `Origin` request header is always exactly `scheme://host[:port]` — never a\n * trailing slash, never a path. What people configure is whatever their address\n * bar showed them, which usually *does* carry a trailing slash. Comparing the\n * two as raw strings means a perfectly reasonable `https://example.com/` never\n * matches the `https://example.com` the browser sends, and CORS fails with no\n * error anywhere: the API returns 200, the browser discards the response, and\n * the developer sees an unexplained network failure.\n *\n * Normalizing both sides of that comparison is what makes configuration behave\n * the way people expect.\n */\n\n/**\n * Reduce a user-supplied origin to its canonical `scheme://host[:port]` form.\n * Returns undefined for anything that is not an http(s) URL.\n *\n * Paths, queries, and fragments are dropped rather than rejected: someone who\n * pastes `https://example.com/blog` means that site, and refusing it teaches\n * nothing.\n */\nexport function normalizeOrigin(value: string): string | undefined {\n try {\n const url = new URL(value.trim());\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n // `URL.origin` is already the canonical form and drops the default port.\n return url.origin;\n } catch {\n return undefined;\n }\n}\n\n/** Normalize a list, dropping unparseable entries and duplicates, order preserved. */\nexport function normalizeOrigins(values: readonly string[]): string[] {\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = normalizeOrigin(value);\n if (normalized) seen.add(normalized);\n }\n return [...seen];\n}\n","/**\n * Plan and entitlement constants (SPEC section 16).\n *\n * Polar identifiers never drive authorization directly; they map to these\n * internal plan keys and entitlements.\n */\n\nexport const PLAN_KEYS = [\"free\", \"pro\", \"internal\"] as const;\nexport type PlanKey = (typeof PLAN_KEYS)[number];\n\n/** Plans a customer can actually buy. `internal` is not one of them. */\nexport const PURCHASABLE_PLAN_KEYS = [\"free\", \"pro\"] as const;\nexport type PurchasablePlanKey = (typeof PURCHASABLE_PLAN_KEYS)[number];\n\n/** Metered usage metrics tracked per organization. */\nexport const USAGE_METRICS = [\n \"public_api_requests\",\n \"storage_bytes\",\n \"asset_bandwidth_bytes\",\n \"webhook_deliveries\",\n] as const;\nexport type UsageMetric = (typeof USAGE_METRICS)[number];\n\nconst GB = 1024 ** 3;\nconst MB = 1024 ** 2;\n\n/**\n * Sentinel for an allowance that is not enforced.\n *\n * `Infinity` would be the honest value, but every one of these numbers is\n * serialized into a JSON usage report, and `JSON.stringify(Infinity)` is\n * `null` — which a client cannot tell apart from \"no limit tracked for this\n * metric\". A finite ceiling no organization can reach survives the round trip\n * and still compares correctly against real usage.\n */\nexport const UNLIMITED = Number.MAX_SAFE_INTEGER;\n\n/** True when an entitlement value is the unenforced sentinel. */\nexport function isUnlimited(value: number | null): boolean {\n return value === UNLIMITED;\n}\n\nexport interface PlanEntitlements {\n key: PlanKey;\n /** Display price for UI only; billing is owned by Polar. */\n priceEurMonthly: number;\n priceEurYearly: number | null;\n maxProjects: number;\n maxMembers: number;\n /** Hard storage allowance in bytes. */\n storageBytes: number;\n /** Soft monthly asset bandwidth allowance in bytes. */\n monthlyBandwidthBytes: number;\n /** Soft monthly public content API request allowance. */\n monthlyPublicApiRequests: number;\n maxWebhookEndpoints: number;\n /** Revision retention in days; `null` means indefinite. */\n revisionRetentionDays: number | null;\n /** Per-file upload ceiling in bytes. */\n maxUploadBytes: number;\n}\n\nexport const PLANS: Record<PlanKey, PlanEntitlements> = {\n free: {\n key: \"free\",\n priceEurMonthly: 0,\n priceEurYearly: 0,\n maxProjects: 2,\n maxMembers: 2,\n storageBytes: 1 * GB,\n monthlyBandwidthBytes: 25 * GB,\n monthlyPublicApiRequests: 10_000,\n maxWebhookEndpoints: 1,\n revisionRetentionDays: 30,\n maxUploadBytes: 50 * MB,\n },\n pro: {\n key: \"pro\",\n priceEurMonthly: 9,\n priceEurYearly: 90,\n maxProjects: 10,\n maxMembers: 5,\n storageBytes: 10 * GB,\n monthlyBandwidthBytes: 250 * GB,\n monthlyPublicApiRequests: 500_000,\n maxWebhookEndpoints: 10,\n revisionRetentionDays: null,\n maxUploadBytes: 250 * MB,\n },\n /**\n * Myna's own organizations — the changelog, and anything else we run on the\n * product we sell. It is never sold, never offered at checkout, and cannot be\n * reached through the API: `scripts/bootstrap-internal-org.mjs` writes it\n * directly, and billing refuses to move an organization on or off it.\n */\n internal: {\n key: \"internal\",\n priceEurMonthly: 0,\n priceEurYearly: null,\n maxProjects: UNLIMITED,\n maxMembers: UNLIMITED,\n storageBytes: UNLIMITED,\n monthlyBandwidthBytes: UNLIMITED,\n monthlyPublicApiRequests: UNLIMITED,\n maxWebhookEndpoints: UNLIMITED,\n revisionRetentionDays: null,\n maxUploadBytes: UNLIMITED,\n },\n};\n\nexport function planFor(key: PlanKey): PlanEntitlements {\n return PLANS[key];\n}\n\n/** Display name for a plan. One spelling, every surface. */\nexport function planLabel(key: PlanKey): string {\n return { free: \"Free\", pro: \"Pro\", internal: \"Internal\" }[key];\n}\n\n/** Soft-limit warning thresholds for metered usage (SPEC 16). */\nexport const USAGE_THRESHOLDS = {\n warn: 0.8,\n atLimit: 1.0,\n throttle: 1.2,\n} as const;\n\n/** Failed-payment grace windows in days (SPEC 16). */\nexport const DUNNING = {\n fullAccessUntilDay: 7,\n restrictedUntilDay: 14,\n downgradeAtDay: 15,\n} as const;\n\n/** Soft-deletion / recovery windows in days. */\nexport const RETENTION = {\n organizationDeletionDays: 30,\n assetDeletionDays: 30,\n pendingUploadHours: 24,\n previewTokenDefaultHours: 24,\n previewTokenMaxDays: 7,\n sessionDays: 30,\n} as const;\n","/**\n * Fractional ranking for editorial ordering.\n *\n * Ranks are strings compared lexicographically, and between any two of them\n * another can always be generated: `\"a0\" < \"a1\" < \"a1V\" < \"a2\"`. That property\n * is the whole point. A numeric `order` field means moving one entry rewrites\n * the position of every entry after it — reordering twenty projects produces\n * twenty revisions, nineteen of which record no editorial decision and bury the\n * one that does. A subdividable string means one move touches one row.\n *\n * Two invariants make it work, and both are maintained by the generators here:\n *\n * 1. A rank is never empty.\n * 2. A rank never ends in the smallest digit. Without this, `\"0\"` could exist,\n * and nothing sorts before `\"0\"` — inserting at the top would be impossible.\n */\n\nconst DIGITS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst MIN_DIGIT = DIGITS[0]!;\nconst LAST_INDEX = DIGITS.length - 1;\n/** Midpoint digit, used whenever an unconstrained choice is needed. */\nconst MID_DIGIT = DIGITS[Math.floor(DIGITS.length / 2)]!;\n\nexport class RankError extends Error {}\n\nfunction indexOf(digit: string): number {\n const index = DIGITS.indexOf(digit);\n if (index === -1) throw new RankError(`\"${digit}\" is not a valid rank digit.`);\n return index;\n}\n\n/** A rank strictly greater than `after` (which may be an empty suffix). */\nfunction rankAfterSuffix(after: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= after.length) {\n // Everything consumed: any appended digit sorts after a proper prefix.\n return prefix + MID_DIGIT;\n }\n const index = indexOf(after[i]!);\n if (index < LAST_INDEX) {\n // Halfway between this digit and the top; never the smallest digit.\n return prefix + DIGITS[Math.floor((index + DIGITS.length) / 2)]!;\n }\n // Already the largest digit — keep it and decide at the next position.\n prefix += after[i]!;\n }\n}\n\n/** A rank strictly less than `before`. */\nfunction rankBeforeString(before: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= before.length) {\n // Only reachable if `before` is all smallest-digits, which invariant 2\n // forbids. Guard rather than loop forever on corrupted data.\n throw new RankError(`Cannot rank before \"${before}\".`);\n }\n const index = indexOf(before[i]!);\n if (index > 1) return prefix + DIGITS[Math.floor(index / 2)]!;\n if (index === 1) {\n // Anything starting with the smallest digit sorts first; append a\n // non-smallest digit so invariant 2 holds.\n return prefix + MIN_DIGIT + MID_DIGIT;\n }\n prefix += MIN_DIGIT;\n }\n}\n\n/**\n * A rank strictly between `a` and `b`. `null` means unbounded on that side.\n * Throws when `a >= b`, which would have no answer.\n */\nexport function rankBetween(a: string | null, b: string | null): string {\n if (a !== null && b !== null && a >= b) {\n throw new RankError(`Cannot rank between \"${a}\" and \"${b}\": out of order.`);\n }\n if (a === null && b === null) return MID_DIGIT;\n if (a === null) return rankBeforeString(b!);\n if (b === null) return rankAfterSuffix(a);\n\n let prefix = \"\";\n for (let i = 0; ; i++) {\n // A shorter `a` behaves as if padded with the smallest digit.\n const digitA = i < a.length ? a[i]! : MIN_DIGIT;\n const digitB = i < b.length ? b[i] : undefined;\n\n if (digitB !== undefined && digitA === digitB) {\n prefix += digitA;\n continue;\n }\n\n const indexA = indexOf(digitA);\n const indexB = digitB !== undefined ? indexOf(digitB) : DIGITS.length;\n\n if (indexB - indexA > 1) {\n // Room between them: take the middle. It exceeds `a` and precedes `b`,\n // and is never the smallest digit because the gap is at least two.\n return prefix + DIGITS[Math.floor((indexA + indexB) / 2)]!;\n }\n\n // Adjacent digits leave no room here. Stay on `a`'s branch — anything under\n // it sorts before `b` — and go past `a`'s remainder.\n return prefix + digitA + rankAfterSuffix(a.slice(i + 1));\n }\n}\n\n/** Largest width to spread a sequence over; 62^4 stays well inside safe integers. */\nconst MAX_WIDTH = 4;\n\n/**\n * Evenly spaced ranks for `count` items, for a full (re)ordering.\n *\n * Spread across the digit space rather than generated by repeated append:\n * appending halves the remaining room each time, so a 200-item collection would\n * end up with 30-character ranks. Even spacing keeps them at two or three\n * characters and leaves room between every neighbouring pair for later\n * single-item moves.\n */\nexport function rankSequence(count: number): string[] {\n if (count <= 0) return [];\n\n let width = 1;\n while (width < MAX_WIDTH && Math.floor(DIGITS.length ** width / (count + 1)) < 2) {\n width += 1;\n }\n const step = Math.floor(DIGITS.length ** width / (count + 1));\n if (step < 1) {\n // More items than the widest spread can separate: fall back to subdivision,\n // which always works even though the ranks grow longer.\n const ranks: string[] = [];\n let previous: string | null = null;\n for (let i = 0; i < count; i++) {\n previous = rankBetween(previous, null);\n ranks.push(previous);\n }\n return ranks;\n }\n\n const ranks: string[] = [];\n for (let i = 1; i <= count; i++) {\n let value = i * step;\n let encoded = \"\";\n for (let d = 0; d < width; d++) {\n encoded = DIGITS[value % DIGITS.length]! + encoded;\n value = Math.floor(value / DIGITS.length);\n }\n // Fixed-width encoding already sorts correctly; a trailing smallest digit\n // would break invariant 2, and appending keeps it below the next value.\n ranks.push(encoded.endsWith(MIN_DIGIT) ? encoded + MID_DIGIT : encoded);\n }\n return ranks;\n}\n\n/** True when `value` is a well-formed rank. */\nexport function isValidRank(value: string): boolean {\n if (value.length === 0) return false;\n if (value.endsWith(MIN_DIGIT)) return false;\n return [...value].every((digit) => DIGITS.includes(digit));\n}\n","/**\n * Release and compatibility contract.\n *\n * `@myna-sh/sdk`, `@myna-sh/cli`, `@myna-sh/mcp`, and `@myna-sh/react` ship as\n * one lockstep version: they are always published together from the same commit\n * and always carry the same version number. `scripts/check-versions.mjs`\n * enforces that in CI, and `scripts/set-version.mjs` is the only supported way\n * to bump it.\n *\n * The API declares what it speaks through `GET /v1/meta`, so a client never has\n * to guess. `myna doctor` reads it to tell an operator — or an agent — exactly\n * which side is out of date.\n */\n\n/**\n * Dated version of the HTTP API surface. Bump it when request or response\n * shapes change in a way a client can observe. Additive, backward-compatible\n * changes do not need a bump; they are announced through `API_CAPABILITIES`.\n */\nexport const API_VERSION = \"2026-07-27\";\n\n/**\n * Oldest `@myna-sh/{sdk,cli,mcp,react}` release this API still supports. Clients\n * below this must upgrade; the API does not promise correct behavior for them.\n * Raising this is a breaking change and needs an `API_VERSION` bump.\n */\nexport const MIN_CLIENT_VERSION = \"0.2.0\";\n\n/**\n * Feature flags a client can detect before calling. Add an entry the moment a\n * feature ships; never remove one without bumping `API_VERSION`, because\n * clients branch on these.\n */\nexport const API_CAPABILITIES = [\n \"assets\",\n /** Bounded, cached image derivatives on delivery: `?w=`, `?format=`, `?q=`. */\n \"assets.images\",\n /**\n * Images carry a `perceptualHash`, and `GET /assets/:asset/similar` finds\n * re-encoded or resized copies that a checksum comparison cannot see.\n */\n \"assets.similar\",\n /** `GET /v1/auth/whoami` reports an API key's scopes and label. */\n \"auth.whoami.scopes\",\n /**\n * Passkey (WebAuthn) sign-in for browser sessions. A login accelerator on a\n * GitHub-linked account, not a second factor: the session it mints is\n * indistinguishable from an OAuth one. Availability still depends on the\n * deployment — `GET /v1/auth/config` reports `passkeysEnabled`.\n */\n \"auth.passkeys\",\n /**\n * Approving a CLI device code or an MCP connector requires a recent\n * re-authentication, answered as `REAUTHENTICATION_REQUIRED` with the methods\n * that would satisfy it. Clients that drive either flow in a browser need to\n * handle that denial rather than treat it as a permanent refusal.\n */\n \"auth.reauth\",\n \"billing\",\n \"change-sets\",\n \"change-sets.checks\",\n /** Checks re-run automatically (debounced) when change-set items change. */\n \"change-sets.checks.auto\",\n /** Checks declared per project and reported from outside Myna. */\n \"change-sets.checks.external\",\n /**\n * Collections declare their own content rules (`policy`), evaluated by the\n * `policy` check. The built-in `seo` and `alt-text` checks are gone: both were\n * editorial opinions imposed on every project, and `seo` inspected field names\n * Myna invented, so it reported `passed` on collections it had never read.\n */\n \"change-sets.checks.policy\",\n /** Custom checks are declarable from the dashboard, not only the API/CLI. */\n \"change-sets.checks.settings-ui\",\n /** `GET .../checks` lists not-yet-run checks with `status: \"pending\"`. */\n \"change-sets.checks.pending\",\n /** Reviews and comments carry a resolved `reviewer`/`author` identity. */\n \"change-sets.actor-identity\",\n \"change-sets.comments\",\n /** `GET /change-sets/:id/diff` — per-item, per-field before and after. */\n \"change-sets.diff\",\n /** Prose fields carry word-level `segments`, so a long body is not just \"changed\". */\n \"change-sets.diff.words\",\n /**\n * An entry may be staged on several open change sets at once, so parallel\n * agents no longer serialize on a collection.\n */\n \"change-sets.concurrent\",\n /**\n * `POST /change-sets/:id/rebase` — field-level three-way merge onto the\n * current head, with a `conflicts` built-in check reporting overlaps first.\n */\n \"change-sets.rebase\",\n \"change-sets.ready-for-review\",\n \"change-sets.reviews\",\n \"change-sets.schedule\",\n \"entries.bulk\",\n \"entries.duplicate\",\n \"entries.import\",\n /** Import matches by slug, updates in place, and skips identical rows. */\n \"entries.import.upsert\",\n /** Fractional-rank editorial ordering; a move writes one row. */\n \"entries.reorder\",\n \"entries.references\",\n /** `?q=` full-text search on the management and public entry lists. */\n \"entries.search\",\n \"entries.restore\",\n /**\n * A single-entry read carries `openChangeSets` and `contendedFields`: who\n * else is mid-edit and where, before any tokens are spent on a colliding\n * write rather than after the `conflicts` check reports it.\n */\n \"entries.contention\",\n /** API keys may be confined to a set of collections. */\n \"keys.collection-scope\",\n \"localization\",\n /** Localized fields are filterable and sortable under the requested locale. */\n \"localization.filters\",\n /** `GET /collections/:key/translations` — per-locale coverage report. */\n \"localization.coverage\",\n /** Hosted MCP server at `/mcp` (streamable HTTP), no local process needed. */\n \"mcp.hosted\",\n /** Myna is an OAuth 2.1 AS for `/mcp`: RFC 7591 registration, PKCE, RFC 8707. */\n \"mcp.oauth\",\n /** `planKey` may be `internal`: an unmetered organization Myna runs itself. */\n \"plans.internal\",\n /** Collection and project `guidance`: house style read by writing tools. */\n \"guidance\",\n /** Every publish is a numbered release, listable and readable back. */\n \"releases\",\n /**\n * `POST /releases/:release/revert` generates a change set restoring the state\n * that preceded a release, so granting `content:publish` is reversible.\n */\n \"releases.revert\",\n \"previews\",\n /** `?preview=<token>` on content reads composes published + change-set state. */\n \"previews.overlay\",\n \"projects.cors-check\",\n /**\n * `GET /projects/:project/access` — distinguishes a missing capability from a\n * collection confinement from a missing resource, so a denial is actionable.\n */\n \"projects.access-check\",\n \"projects.export\",\n \"projects.origins\",\n /** `GET /collections/:key/entries/:slug/references` on the content API. */\n \"content.references\",\n /**\n * Myna is a GitHub App: connect a repository to a project and publishing\n * opens a pull request bumping `myna.lock`, with no CI wiring on the\n * customer's side. `myna pull --open-pr` remains for repositories that would\n * rather not install one, or that generate artifacts from content.\n */\n \"github.app\",\n /**\n * `?at=<release>` on the content API reads the collection as a numbered\n * release served it, addressed by the slugs that release carried. Pinned\n * responses are `immutable`, because a release is.\n */\n \"content.at\",\n \"projects.views\",\n \"schema.drift\",\n \"schema.promote\",\n \"schema.push\",\n \"webhooks\",\n /** Endpoints can carry custom request headers, so a delivery can authenticate. */\n \"webhooks.headers\",\n /** Endpoints can send a fixed body, for receivers with their own contract. */\n \"webhooks.body-template\",\n] as const;\n\nexport type ApiCapability = (typeof API_CAPABILITIES)[number];\n\n/** Parsed semantic version. Pre-release and build metadata are ignored. */\nexport interface SemVer {\n major: number;\n minor: number;\n patch: number;\n}\n\n/** Parse `1.2.3` (with optional `v` prefix and pre-release suffix). */\nexport function parseSemVer(version: string): SemVer | undefined {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version.trim());\n if (!match) return undefined;\n return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) };\n}\n\n/** Compare two versions: negative if `a` is older, 0 if equal, positive if newer. */\nexport function compareSemVer(a: string, b: string): number {\n const left = parseSemVer(a);\n const right = parseSemVer(b);\n if (!left || !right) throw new Error(`Cannot compare versions \"${a}\" and \"${b}\".`);\n return left.major - right.major || left.minor - right.minor || left.patch - right.patch;\n}\n\n/** True when `version` is at least `minimum`. */\nexport function satisfiesMinimum(version: string, minimum: string): boolean {\n return compareSemVer(version, minimum) >= 0;\n}\n","/**\n * `myna.lock` — the release a repository builds against — and the pull request\n * that moves it.\n *\n * All of this lives here rather than in the CLI because two things now open\n * that pull request: `myna pull --open-pr`, run from someone's CI, and the\n * GitHub App, run from Myna's own job runner when a change set publishes. They\n * have to agree on the bytes of the lockfile, the name of the branch, and the\n * text of the body — otherwise the App and the CLI would each open a pull\n * request for the same release, differing only in formatting, and neither would\n * recognize the other's as already proposed.\n *\n * Nothing here touches the filesystem or the network, so it is safe in a\n * browser bundle, in the API, and in the CLI alike. The Node-only file handling\n * is `@myna-sh/sdk/lock`.\n */\n\nexport const LOCKFILE_NAME = \"myna.lock\";\n\nexport interface MynaLock {\n /** Project id or slug the release number belongs to. */\n project: string;\n /** Release number this repository reads at. */\n release: number;\n /** When that release published. Informational; the number is the pin. */\n publishedAt: string;\n /** Title of the release, so a diff of this file reads like a changelog. */\n title?: string;\n /** API origin, when it is not the default `https://api.myna.sh`. */\n apiUrl?: string;\n}\n\n/**\n * Serialize a lockfile.\n *\n * Key order is fixed and the file ends in a newline, so bumping the release\n * produces a one-or-two-line diff rather than a reshuffle a reviewer has to\n * read in full. Both writers call this, so a repository that has been updated\n * by the App and then by the CLI shows no spurious churn.\n */\nexport function formatLock(lock: MynaLock): string {\n const ordered: Record<string, unknown> = {\n project: lock.project,\n release: lock.release,\n publishedAt: lock.publishedAt,\n };\n if (lock.title) ordered.title = lock.title;\n if (lock.apiUrl) ordered.apiUrl = lock.apiUrl;\n return `${JSON.stringify(ordered, null, 2)}\\n`;\n}\n\n/**\n * Parse a lockfile.\n *\n * A malformed lockfile throws rather than degrading to live reads: a build that\n * believes it is pinned and is not is the failure pinning exists to prevent.\n */\nexport function parseLock(source: string, origin = LOCKFILE_NAME): MynaLock {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`${origin} is not valid JSON: ${(error as Error).message}`);\n }\n const lock = parsed as Partial<MynaLock>;\n if (typeof lock?.project !== \"string\" || !lock.project) {\n throw new Error(`${origin} is missing \"project\".`);\n }\n if (typeof lock.release !== \"number\" || !Number.isInteger(lock.release) || lock.release < 0) {\n throw new Error(`${origin} is missing a non-negative integer \"release\".`);\n }\n return {\n project: lock.project,\n release: lock.release,\n publishedAt: typeof lock.publishedAt === \"string\" ? lock.publishedAt : \"\",\n ...(lock.title ? { title: lock.title } : {}),\n ...(lock.apiUrl ? { apiUrl: lock.apiUrl } : {}),\n };\n}\n\n/**\n * The branch a content pull uses: one per project and target release.\n *\n * Deterministic, and that is the whole point. A publish can be announced more\n * than once — a webhook retry, a replayed delivery, a nightly safety net, or\n * both the App and a CI job watching the same project — and every one of those\n * has to land on the same branch name so the second finds the first already\n * there and opens nothing.\n */\nexport function branchForRelease(project: string, release: number): string {\n const slug = project.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"project\";\n return `myna/content-${slug}-r${release}`;\n}\n\n/** How many releases a pull request body describes in full before summarizing. */\nconst MAX_DETAILED_RELEASES = 20;\n\n/** The shape the body renderer needs, structural so this file depends on nothing. */\nexport interface ReleaseSummary {\n number: number;\n title: string;\n description?: string | null;\n itemCount?: number;\n /** Absent when the diff could not be read; the release is still named. */\n diff?: ReleaseDiff | null;\n}\n\nexport interface ReleaseDiff {\n items: {\n operation: string;\n collection?: string | null;\n slug?: string | null;\n resourceId: string;\n changeSummary?: string | null;\n changes: { path: string; kind: string }[];\n }[];\n}\n\nexport interface PullRequestTextInput {\n project: string;\n /** The pin being left, or null when this is the first one. */\n from: number | null;\n to: ReleaseSummary;\n /** Every release in the span, oldest first. */\n releases: ReleaseSummary[];\n /** True when the pin is moving backwards. */\n rollback: boolean;\n}\n\nexport function releasePullRequestTitle(input: PullRequestTextInput): string {\n return input.rollback\n ? `chore(content): roll ${input.project} back to release #${input.to.number}`\n : `chore(content): ${input.project} release #${input.to.number} — ${input.to.title}`;\n}\n\n/**\n * The pull request body: what taking this content on actually changes.\n *\n * Field paths, not just entry names. A reviewer looking at a lockfile bump can\n * otherwise only see a number move, which tells them nothing about whether the\n * build that is about to run will still pass.\n */\nexport function releasePullRequestBody(input: PullRequestTextInput): string {\n const { project, from, to, releases, rollback } = input;\n const lines = [\n from === null\n ? `Pins \\`${LOCKFILE_NAME}\\` for \\`${project}\\` to release #${to.number}.`\n : rollback\n ? `Rolls \\`${LOCKFILE_NAME}\\` for \\`${project}\\` back from release #${from} to #${to.number}.`\n : `Moves \\`${LOCKFILE_NAME}\\` for \\`${project}\\` from release #${from} to #${to.number}.`,\n \"\",\n rollback\n ? `${releases.length} release(s) are being undone for this repository. The content itself is untouched — nothing is unpublished — this only changes which release the build reads.`\n : `${releases.length} release(s). The build reads content at this release, so CI on this pull request is running against exactly the content that will ship.`,\n ];\n\n const detailed = releases.slice(-MAX_DETAILED_RELEASES);\n if (detailed.length < releases.length) {\n const omitted = releases.length - detailed.length;\n lines.push(\n \"\",\n `_Showing the newest ${detailed.length} of ${releases.length} releases. The remaining ${omitted} are listed without field detail._`,\n \"\",\n ...releases.slice(0, omitted).map((r) => `- #${r.number} — ${r.title} (${r.itemCount ?? 0} item(s))`),\n );\n }\n\n for (const release of detailed) {\n lines.push(\"\", `### #${release.number} — ${release.title}`);\n if (release.description) lines.push(\"\", release.description);\n if (!release.diff) {\n lines.push(\"\", `_Diff unavailable; ${release.itemCount ?? 0} item(s) changed._`);\n continue;\n }\n for (const item of release.diff.items) {\n const name = item.collection && item.slug ? `${item.collection}/${item.slug}` : item.resourceId;\n lines.push(\"\", `- **${item.operation} ${name}**`);\n if (item.changeSummary) lines.push(` - _${item.changeSummary}_`);\n for (const change of item.changes) lines.push(` - \\`${change.path}\\` ${change.kind}`);\n }\n }\n return lines.join(\"\\n\");\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\nimport type { Ctx } from \"../client.js\";\nimport type { CreatePreviewRequest } from \"@myna-sh/api-contracts\";\n\nfunction previewTarget(ref: string): CreatePreviewRequest {\n if (ref.startsWith(\"chs_\")) return { changeSetId: ref };\n if (ref.startsWith(\"ent_\")) return { entryId: ref };\n throw new UsageError(`Preview target must be a change-set (chs_) or entry (ent_) id: ${ref}`);\n}\n\nasync function create(ctx: Ctx, ref: string) {\n return ctx.management().previews.create(ctx.requireProject(), previewTarget(ref));\n}\n\nexport function registerPreviews(program: Command): void {\n const preview = program.command(\"preview\").description(\"Create and manage preview links\");\n\n preview\n .command(\"create\")\n .description(\"Create a preview for a change set or entry\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n emit(p, () => {\n process.stdout.write(`${p.url}\\n`);\n diag(`fallback: ${p.fallbackUrl}`);\n });\n }),\n );\n\n preview\n .command(\"open\")\n .description(\"Create a preview and open it in the browser\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n if (ctx.interactive) openBrowser(p.url);\n emit(p, () => process.stdout.write(`${p.url}\\n`));\n }),\n );\n\n preview\n .command(\"list\")\n .description(\"List preview tokens for the project\")\n .action(\n handle(async (ctx) => {\n const previews = await ctx.management().previews.list(ctx.requireProject());\n emit(previews, () =>\n table(previews, [\n { header: \"ID\", value: (p) => p.id },\n { header: \"SCOPE\", value: (p) => p.changeSetId ?? p.entryId ?? \"\" },\n { header: \"EXPIRES\", value: (p) => p.expiresAt },\n { header: \"REVOKED\", value: (p) => (p.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n preview\n .command(\"revoke\")\n .description(\"Revoke a preview token\")\n .argument(\"<id>\", \"preview id (prv_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().previews.revoke(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport type { AssetContract } from \"@myna-sh/api-contracts\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerAssets(program: Command): void {\n const assets = program.command(\"assets\").description(\"Upload and manage assets\");\n\n assets\n .command(\"upload\")\n .description(\"Upload one or more files via the presigned flow\")\n .argument(\"<path...>\", \"file path(s)\")\n .option(\"--alt <text>\", \"default alt text applied to each asset\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const paths = args[0] as string[];\n const uploaded: AssetContract[] = [];\n for (const path of paths) {\n diag(`uploading ${path} …`);\n let asset = await ctx.management().assets.upload(project, path);\n if (opts.alt) asset = await ctx.management().assets.update(project, asset.id, { defaultAlt: opts.alt as string });\n uploaded.push(asset);\n // The moment to hear \"you already have this picture\" is now, while\n // deleting the copy is still free. `myna assets similar` asks the\n // same question later, and is what --json callers use.\n const similar = await ctx.management().assets.similar(project, asset.id).catch(() => []);\n for (const match of similar) {\n diag(` looks like ${match.asset.id} (${match.asset.displayFilename}), distance ${match.distance}`);\n }\n }\n emit(uploaded.length === 1 ? uploaded[0] : uploaded, () =>\n table(uploaded, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"SIZE\", value: (a) => String(a.byteSize) },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"list\")\n .description(\"List assets\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().assets.list(project, {\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"similar\")\n .description(\"Find images that look like the same picture as this one\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--max-distance <n>\", \"how many of the fingerprint's 64 bits may differ\", \"5\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const similar = await ctx.management().assets.similar(project, args[0] as string, {\n maxDistance: Number(opts.maxDistance),\n });\n emit(similar, () => {\n if (similar.length === 0) {\n diag(\"No near-duplicates. (Images uploaded before fingerprinting shipped have none.)\");\n return;\n }\n table(similar, [\n { header: \"ID\", value: (s) => s.asset.id },\n { header: \"FILENAME\", value: (s) => s.asset.displayFilename },\n { header: \"DISTANCE\", value: (s) => String(s.distance) },\n { header: \"STATE\", value: (s) => s.asset.state },\n ]);\n });\n }),\n );\n\n assets\n .command(\"inspect\")\n .description(\"Show an asset and its usage\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().assets.usage(project, args[0] as string);\n emit(result, () => {\n keyValues([\n [\"ID\", result.asset.id],\n [\"Filename\", result.asset.displayFilename],\n [\"Type\", result.asset.contentType],\n [\"Size\", String(result.asset.byteSize)],\n [\"State\", result.asset.state],\n [\"URL\", result.asset.url],\n [\"Referenced by\", result.usage.entryIds.join(\", \") || \"(none)\"],\n ]);\n });\n }),\n );\n\n assets\n .command(\"delete\")\n .description(\"Soft-delete an asset\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n await ctx.management().assets.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n\n assets\n .command(\"update\")\n .description(\"Set an asset's alt text, caption, filename, or tags\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--alt <text>\", \"default alt text\")\n .option(\"--caption <text>\", \"caption\")\n .option(\"--filename <name>\", \"display filename\")\n .option(\"--tag <tag...>\", \"replace the asset's tags\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (!opts.alt && !opts.caption && !opts.filename && !opts.tag) {\n throw new UsageError(\"Provide --alt, --caption, --filename, or --tag.\");\n }\n const asset = await ctx.management().assets.update(project, args[0] as string, {\n ...(opts.alt !== undefined ? { defaultAlt: opts.alt as string } : {}),\n ...(opts.caption !== undefined ? { caption: opts.caption as string } : {}),\n ...(opts.filename !== undefined ? { displayFilename: opts.filename as string } : {}),\n ...(opts.tag !== undefined ? { tags: opts.tag as string[] } : {}),\n });\n emit(asset, () => diag(`Updated ${asset.id}.`));\n }),\n );\n\n assets\n .command(\"replace\")\n .description(\"Replace an asset's binary, keeping its id and references\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .argument(\"<file>\", \"path to the replacement file\")\n .option(\"--confirm-replace\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n // Replacing swaps the bytes behind every URL and every entry already\n // referencing this asset, which no revision records — so it is gated the\n // same way deletion is.\n if (!opts.confirmReplace) throw new UsageError(\"Replacing an asset requires --confirm-replace.\");\n const project = ctx.requireProject();\n const client = ctx.management();\n const uploaded = await client.assets.upload(project, args[1] as string);\n const asset = await client.assets.replace(project, args[0] as string, { uploadId: uploaded.id });\n emit(asset, () => diag(`Replaced ${asset.id} (${asset.byteSize} bytes).`));\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport type { ApiKeyScope, OrgRole, UpdateProjectRequest, WebhookEventType } from \"@myna-sh/api-contracts\";\nimport { normalizeOrigin } from \"@myna-sh/shared\";\nimport { writeUserConfig } from \"../config.js\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nfunction csv<T extends string>(value: string): T[] {\n return value.split(\",\").map((s) => s.trim()).filter(Boolean) as T[];\n}\n\nexport function registerAdmin(program: Command): void {\n registerOrganizations(program);\n registerProjects(program);\n registerCors(program);\n registerKeys(program);\n registerMembers(program);\n registerViews(program);\n registerChecks(program);\n registerWebhooks(program);\n registerActivity(program);\n registerBilling(program);\n}\n\nfunction registerOrganizations(program: Command): void {\n const orgs = program.command(\"organizations\").alias(\"orgs\").description(\"Manage organizations\");\n\n orgs\n .command(\"list\")\n .description(\"List organizations you belong to\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().organizations.list();\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (o) => o.slug },\n { header: \"NAME\", value: (o) => o.name },\n { header: \"ROLE\", value: (o) => o.role },\n { header: \"PLAN\", value: (o) => o.planKey },\n ]),\n );\n }),\n );\n\n orgs\n .command(\"create\")\n .description(\"Create an organization\")\n .requiredOption(\"--name <name>\", \"organization name\")\n .option(\"--slug <slug>\", \"organization slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const org = await ctx.management().organizations.create({\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n });\n emit(org, () => diag(`Created ${org.slug} (${org.id}).`));\n }),\n );\n\n orgs\n .command(\"use\")\n .description(\"Set the default organization\")\n .argument(\"<slug>\", \"organization slug or id\")\n .action(\n handle(async (_ctx, args) => {\n writeUserConfig({ defaultOrganization: args[0] as string });\n emit({ defaultOrganization: args[0] as string }, () => diag(`Default organization set to ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerProjects(program: Command): void {\n const projects = program.command(\"projects\").description(\"Manage projects\");\n\n projects\n .command(\"list\")\n .description(\"List projects in the organization\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().projects.list(ctx.requireOrganization());\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (p) => p.slug },\n { header: \"NAME\", value: (p) => p.name },\n { header: \"PUBLIC API\", value: (p) => (p.publicApiEnabled ? \"on\" : \"off\") },\n { header: \"ARCHIVED\", value: (p) => (p.archivedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n projects\n .command(\"create\")\n .description(\"Create a project\")\n .requiredOption(\"--name <name>\", \"project name\")\n .option(\"--slug <slug>\", \"project slug\")\n .option(\"--timezone <tz>\", \"project timezone\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = await ctx.management().projects.create(ctx.requireOrganization(), {\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n timezone: opts.timezone as string | undefined,\n });\n emit(project, () => diag(`Created ${project.slug} (${project.id}).`));\n }),\n );\n\n projects\n .command(\"inspect\")\n .description(\"Show project details\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project, () =>\n keyValues([\n [\"ID\", project.id],\n [\"Name\", project.name],\n [\"Slug\", project.slug],\n [\"Timezone\", project.timezone],\n [\"Public API\", project.publicApiEnabled ? \"on\" : \"off\"],\n [\"Origins\", project.origins.join(\", \") || \"(none)\"],\n ]),\n );\n }),\n );\n\n projects\n .command(\"export\")\n .description(\"Export the full project (schemas, entries, asset metadata) as JSON\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const data = await ctx.management().projects.export(ref);\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n }),\n );\n\n projects\n .command(\"update\")\n .description(\"Update project settings\")\n .argument(\"[project]\", \"project id or slug\")\n .option(\"--name <name>\", \"project name\")\n .option(\"--timezone <timezone>\", \"IANA timezone\")\n .option(\"--public-api <state>\", \"public API state (on|off)\")\n .option(\"--default-preview-template <template>\", \"default preview URL template\")\n .option(\"--clear-default-preview-template\", \"remove the default preview URL template\")\n .option(\"--origins <urls>\", \"comma-separated allowed origins\")\n .option(\"--clear-origins\", \"remove all allowed origins\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const patch: UpdateProjectRequest = {};\n if (opts.name !== undefined) patch.name = opts.name as string;\n if (opts.timezone !== undefined) patch.timezone = opts.timezone as string;\n if (opts.publicApi !== undefined) {\n const state = String(opts.publicApi).toLowerCase();\n if (![\"on\", \"off\", \"true\", \"false\"].includes(state)) {\n throw new UsageError(\"--public-api must be on or off.\");\n }\n patch.publicApiEnabled = state === \"on\" || state === \"true\";\n }\n if (opts.defaultPreviewTemplate !== undefined && opts.clearDefaultPreviewTemplate) {\n throw new UsageError(\"Use either --default-preview-template or --clear-default-preview-template, not both.\");\n }\n if (opts.defaultPreviewTemplate !== undefined) {\n patch.defaultPreviewTemplate = opts.defaultPreviewTemplate as string;\n }\n if (opts.clearDefaultPreviewTemplate) patch.defaultPreviewTemplate = null;\n if (opts.origins !== undefined && opts.clearOrigins) {\n throw new UsageError(\"Use either --origins or --clear-origins, not both.\");\n }\n if (opts.origins !== undefined) patch.origins = csv<string>(opts.origins as string);\n if (opts.clearOrigins) patch.origins = [];\n if (Object.keys(patch).length === 0) {\n throw new UsageError(\"Specify at least one project setting to update.\");\n }\n const project = await ctx.management().projects.update(ref, patch);\n emit(project, () => diag(`Updated ${project.slug}.`));\n }),\n );\n\n /**\n * Incremental origin management.\n *\n * `projects update --origins` replaces the whole list, so adding one site\n * means restating every other — and forgetting one silently breaks a live\n * page. These read the current list and write back the change.\n */\n const origins = projects.command(\"origins\").description(\"Manage allowed browser origins\");\n\n origins\n .command(\"list\")\n .description(\"List the project's allowed browser origins\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project.origins, () =>\n table(\n project.origins.map((origin) => ({ origin })),\n [{ header: \"ORIGIN\", value: (r) => r.origin }],\n ),\n );\n }),\n );\n\n origins\n .command(\"add\")\n .description(\"Allow one or more browser origins\")\n .argument(\"<origins...>\", \"origins, e.g. https://example.com\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = [...new Set([...project.origins, ...requested])];\n const added = requested.filter((o) => !project.origins.includes(o));\n if (added.length === 0) {\n emit({ origins: project.origins, added: [] }, () => diag(\"Already allowed; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, added }, () =>\n diag(`Allowed ${added.join(\", \")} on ${updated.slug}.`),\n );\n }),\n );\n\n origins\n .command(\"remove\")\n .description(\"Stop allowing one or more browser origins\")\n .argument(\"<origins...>\", \"origins to remove\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = project.origins.filter((o) => !requested.includes(o));\n const removed = project.origins.filter((o) => requested.includes(o));\n if (removed.length === 0) {\n emit({ origins: project.origins, removed: [] }, () => diag(\"Not configured; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, removed }, () =>\n diag(`Removed ${removed.join(\", \")} from ${updated.slug}.`),\n );\n }),\n );\n\n projects\n .command(\"archive\")\n .description(\"Archive a project\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.archive(ref);\n emit(project, () => diag(`Archived ${project.slug}.`));\n }),\n );\n}\n\n/** Canonicalize an origin the same way the API does, failing loudly on nonsense. */\nfunction normalizeOne(value: string): string {\n const normalized = normalizeOrigin(value);\n if (!normalized) throw new UsageError(`\"${value}\" is not a valid http(s) origin.`);\n return normalized;\n}\n\nfunction registerCors(program: Command): void {\n program\n .command(\"cors\")\n .description(\"Diagnose browser access to published content\")\n .command(\"check\")\n .description(\"Explain whether a browser at an origin can read this project\")\n .requiredOption(\"--origin <url>\", \"the browser origin to test\")\n .option(\"--collection <key>\", \"also check a specific collection's visibility\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const result = await ctx\n .management()\n .projects.corsCheck(ref, opts.origin as string, opts.collection as string | undefined);\n emit(result, () => {\n for (const c of result.checks) {\n process.stdout.write(`${c.ok ? \"✓\" : \"✗\"} ${c.detail}\\n`);\n }\n if (!result.allowed) {\n const failed = result.checks.find((c) => !c.ok);\n if (failed?.id === \"origin\") {\n diag(`\\nAllow it with: myna projects origins add ${result.origin}`);\n } else if (failed?.id === \"publicApi\") {\n diag(\"\\nEnable it with: myna projects update --public-api on\");\n }\n }\n });\n if (!result.allowed) process.exitCode = 1;\n }),\n );\n}\n\nfunction registerKeys(program: Command): void {\n const keys = program.command(\"keys\").description(\"Manage API keys\");\n\n keys\n .command(\"list\")\n .description(\"List API keys for the project (or organization with --org-scope)\")\n .option(\"--org-scope\", \"list organization-scoped keys\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const list = opts.orgScope\n ? await ctx.management().apiKeys.listForOrganization(ctx.requireOrganization())\n : await ctx.management().apiKeys.listForProject(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (k) => k.id },\n { header: \"NAME\", value: (k) => k.name },\n { header: \"SCOPES\", value: (k) => k.scopes.join(\",\") },\n { header: \"COLLECTIONS\", value: (k) => k.collectionKeys?.join(\",\") ?? \"all\" },\n { header: \"REVOKED\", value: (k) => (k.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n keys\n .command(\"create\")\n .description(\"Create an API key (project-scoped by default)\")\n .requiredOption(\"--name <name>\", \"key name\")\n .requiredOption(\"--scopes <scopes>\", \"comma-separated scopes\")\n .option(\"--label <label>\", \"agent/integration label\")\n .option(\"--org-scope\", \"create an organization-scoped key\", false)\n .option(\"--collections <keys>\", \"confine the key to these collections (comma-separated)\")\n .option(\"--expires-at <iso>\", \"expiry (ISO 8601)\")\n .action(\n handle(async (ctx, _args, opts) => {\n if (opts.collections && opts.orgScope) {\n throw new UsageError(\"--collections requires a project-scoped key; drop --org-scope.\");\n }\n const body = {\n name: opts.name as string,\n scopes: csv<ApiKeyScope>(opts.scopes as string),\n label: opts.label as string | undefined,\n collectionKeys: opts.collections ? csv<string>(opts.collections as string) : undefined,\n expiresAt: opts.expiresAt as string | undefined,\n };\n const result = opts.orgScope\n ? await ctx.management().apiKeys.createForOrganization(ctx.requireOrganization(), body)\n : await ctx.management().apiKeys.createForProject(ctx.requireProject(), body);\n emit(result, () => {\n diag(\"Store this secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.key.id],\n [\"Name\", result.key.name],\n [\"Collections\", result.key.collectionKeys?.join(\", \") ?? \"(all)\"],\n [\"Secret\", result.secret],\n ]);\n });\n }),\n );\n\n keys\n .command(\"revoke\")\n .description(\"Revoke an API key\")\n .argument(\"<id>\", \"key id (key_)\")\n .option(\"--org-scope\", \"revoke an organization-scoped key\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (opts.orgScope) {\n await ctx.management().apiKeys.revokeForOrganization(ctx.requireOrganization(), args[0] as string);\n } else {\n await ctx.management().apiKeys.revokeForProject(ctx.requireProject(), args[0] as string);\n }\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerMembers(program: Command): void {\n const members = program.command(\"members\").description(\"Manage organization members\");\n\n members\n .command(\"list\")\n .description(\"List members and pending invitations\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [list, invites] = await Promise.all([\n ctx.management().members.list(org),\n ctx.management().invitations.list(org).catch(() => []),\n ]);\n emit({ members: list, invitations: invites }, () => {\n table(list, [\n { header: \"USER\", value: (m) => m.username ?? m.userId },\n { header: \"EMAIL\", value: (m) => m.email },\n { header: \"ROLE\", value: (m) => m.role },\n ]);\n if (invites.length > 0) {\n diag(\"\\nPending invitations:\");\n table(invites, [\n { header: \"EMAIL\", value: (i) => i.email },\n { header: \"ROLE\", value: (i) => i.role },\n { header: \"EXPIRES\", value: (i) => i.expiresAt },\n ]);\n }\n });\n }),\n );\n\n members\n .command(\"invite\")\n .description(\"Invite a member by email\")\n .requiredOption(\"--email <email>\", \"invitee email\")\n .requiredOption(\"--role <role>\", \"role (admin|editor|viewer)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const invite = await ctx.management().invitations.create(ctx.requireOrganization(), {\n email: opts.email as string,\n role: opts.role as Exclude<OrgRole, \"owner\">,\n });\n emit(invite, () =>\n diag(\n `Invited ${invite.email} as ${invite.role}. An email with the accept link is on its way; it expires ${invite.expiresAt}.`,\n ),\n );\n }),\n );\n\n members\n .command(\"update\")\n .description(\"Update a member's role\")\n .argument(\"<user>\", \"user id\")\n .requiredOption(\"--role <role>\", \"new role\")\n .action(\n handle(async (ctx, args, opts) => {\n await ctx.management().members.update(ctx.requireOrganization(), args[0] as string, {\n role: opts.role as OrgRole,\n });\n emit({ ok: true }, () => diag(`Updated ${args[0] as string} to ${opts.role as string}.`));\n }),\n );\n\n members\n .command(\"remove\")\n .description(\"Remove a member\")\n .argument(\"<user>\", \"user id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().members.remove(ctx.requireOrganization(), args[0] as string);\n emit({ ok: true }, () => diag(`Removed ${args[0] as string}.`));\n }),\n );\n\n members\n .command(\"revoke-invite\")\n .description(\"Revoke a pending invitation\")\n .argument(\"<invitation>\", \"invitation id (inv_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().invitations.revoke(ctx.requireOrganization(), args[0] as string);\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n\n/**\n * Saved views: named filter presets the dashboard's entry table offers.\n *\n * They are shared per project, so the CLI is how a project sets up the views\n * its team should have without each person recreating them by hand.\n */\nfunction registerViews(program: Command): void {\n const views = program.command(\"views\").description(\"Manage saved entry-table views\");\n\n views\n .command(\"list\")\n .description(\"List saved views\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().projects.views(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (v) => v.id },\n { header: \"NAME\", value: (v) => v.name },\n { header: \"FILTERS\", value: (v) => JSON.stringify(v.filters) },\n ]),\n );\n }),\n );\n\n views\n .command(\"create\")\n .description(\"Create a saved view from a JSON filter object\")\n .requiredOption(\"--name <name>\", \"view name\")\n .requiredOption(\"--filters <json>\", 'filter object, e.g. \\'{\"status\":\"draft\"}\\'')\n .action(\n handle(async (ctx, _args, opts) => {\n let filters: Record<string, unknown>;\n try {\n filters = JSON.parse(opts.filters as string) as Record<string, unknown>;\n } catch {\n throw new UsageError(\"--filters must be valid JSON.\");\n }\n const view = await ctx.management().projects.createView(ctx.requireProject(), {\n name: opts.name as string,\n filters,\n });\n emit(view, () => diag(`Created view ${view.id}.`));\n }),\n );\n\n views\n .command(\"delete\")\n .description(\"Delete a saved view\")\n .argument(\"<id>\", \"view id (viw_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().projects.deleteView(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n}\n\n/**\n * Checks a project expects from outside Myna.\n *\n * Declaring one is how a link checker or a house-style reviewer gets a place to\n * report to; marking it required is how its verdict starts blocking publish.\n */\nfunction registerChecks(program: Command): void {\n const checks = program.command(\"checks\").description(\"Declare external publish checks\");\n\n checks\n .command(\"list\")\n .description(\"List declared external checks\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().checks.list(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"NAME\", value: (c) => c.name },\n { header: \"REQUIRED\", value: (c) => (c.required ? \"yes\" : \"no\") },\n { header: \"DESCRIPTION\", value: (c) => c.description ?? \"\" },\n ]),\n );\n }),\n );\n\n checks\n .command(\"declare\")\n .description(\"Declare (or update) an external check\")\n .argument(\"<name>\", \"check name, e.g. links\")\n .option(\"--description <text>\", \"what the check verifies\")\n .option(\"--required\", \"block publish until it passes\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const check = await ctx.management().checks.declare(ctx.requireProject(), {\n name: args[0] as string,\n ...(opts.description ? { description: opts.description as string } : {}),\n required: Boolean(opts.required),\n });\n emit(check, () =>\n diag(`Declared ${check.name}${check.required ? \" (required before publish)\" : \"\"}.`),\n );\n }),\n );\n\n checks\n .command(\"remove\")\n .description(\"Remove a declared external check\")\n .argument(\"<name>\", \"check name\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().checks.remove(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Removed ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerWebhooks(program: Command): void {\n const webhooks = program.command(\"webhooks\").description(\"Manage webhook endpoints\");\n\n webhooks\n .command(\"list\")\n .description(\"List webhook endpoints\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().webhooks.list(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (w) => w.id },\n { header: \"URL\", value: (w) => w.url },\n { header: \"EVENTS\", value: (w) => w.events.join(\",\") },\n { header: \"ENABLED\", value: (w) => (w.enabled ? \"yes\" : \"no\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"create\")\n .description(\"Create a webhook endpoint\")\n .requiredOption(\"--url <url>\", \"endpoint URL\")\n .requiredOption(\"--events <events>\", \"comma-separated event types\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().webhooks.create(ctx.requireProject(), {\n url: opts.url as string,\n events: csv<WebhookEventType>(opts.events as string),\n enabled: true,\n });\n emit(result, () => {\n diag(\"Store this signing secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.endpoint.id],\n [\"URL\", result.endpoint.url],\n [\"Signing secret\", result.signingSecret],\n ]);\n });\n }),\n );\n\n webhooks\n .command(\"update\")\n .description(\"Update a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"--url <url>\", \"new URL\")\n .option(\"--events <events>\", \"comma-separated event types\")\n .option(\"--enabled <bool>\", \"enable/disable (true|false)\")\n .action(\n handle(async (ctx, args, opts) => {\n const patch: { url?: string; events?: WebhookEventType[]; enabled?: boolean } = {};\n if (opts.url) patch.url = opts.url as string;\n if (opts.events) patch.events = csv<WebhookEventType>(opts.events as string);\n if (opts.enabled !== undefined) patch.enabled = opts.enabled === \"true\";\n const endpoint = await ctx.management().webhooks.update(ctx.requireProject(), args[0] as string, patch);\n emit(endpoint, () => diag(`Updated ${endpoint.id}.`));\n }),\n );\n\n webhooks\n .command(\"delete\")\n .description(\"Delete a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n\n webhooks\n .command(\"deliveries\")\n .description(\"List recent deliveries for a webhook\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n const list = await ctx.management().webhooks.deliveries(ctx.requireProject(), args[0] as string);\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (d) => d.id },\n { header: \"EVENT\", value: (d) => d.eventType },\n { header: \"ATTEMPT\", value: (d) => String(d.attempt) },\n { header: \"STATUS\", value: (d) => d.status },\n { header: \"HTTP\", value: (d) => (d.responseStatus ? String(d.responseStatus) : \"\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"retry\")\n .description(\"Retry a webhook delivery\")\n .argument(\"<webhook>\", \"webhook id\")\n .argument(\"<delivery>\", \"delivery id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.retry(ctx.requireProject(), args[0] as string, args[1] as string);\n emit({ ok: true }, () => diag(`Retrying delivery ${args[1] as string}.`));\n }),\n );\n}\n\nfunction registerActivity(program: Command): void {\n program\n .command(\"activity\")\n .description(\"Show the project activity feed\")\n .option(\"--actor-type <type>\", \"filter by actor type\")\n .option(\"--action <action>\", \"filter by action\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const page = await ctx.management().activity(ctx.requireProject(), {\n actorType: opts.actorType as string | undefined,\n action: opts.action as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"WHEN\", value: (a) => a.createdAt },\n { header: \"ACTOR\", value: (a) => a.actorType },\n { header: \"ACTION\", value: (a) => a.action },\n { header: \"TARGET\", value: (a) => `${a.targetType ?? \"\"} ${a.targetId ?? \"\"}`.trim() },\n ]),\n );\n }),\n );\n}\n\nfunction registerBilling(program: Command): void {\n const billing = program.command(\"billing\").description(\"Billing status and management\");\n\n billing\n .command(\"status\")\n .description(\"Show the organization's plan and usage\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [status, usage] = await Promise.all([\n ctx.management().billing.status(org),\n ctx.management().organizations.usage(org).catch(() => undefined),\n ]);\n emit({ billing: status, usage }, () => {\n keyValues([\n [\"Plan\", status.subscription.planKey],\n [\"Status\", status.subscription.status],\n [\"Provider customer\", status.hasProviderCustomer ? \"yes\" : \"no\"],\n ]);\n if (usage) {\n diag(\"\\nUsage:\");\n table(usage.metrics, [\n { header: \"METRIC\", value: (m) => m.metric },\n { header: \"USED\", value: (m) => String(m.quantity) },\n { header: \"LIMIT\", value: (m) => (m.limit === null ? \"∞\" : String(m.limit)) },\n ]);\n }\n });\n }),\n );\n\n billing\n .command(\"upgrade\")\n .description(\"Start a Pro checkout\")\n .option(\"--interval <interval>\", \"month|year\", \"month\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().billing.checkout(ctx.requireOrganization(), {\n interval: (opts.interval as \"month\" | \"year\") ?? \"month\",\n });\n if (ctx.interactive) openBrowser(result.checkoutUrl);\n emit(result, () => process.stdout.write(`${result.checkoutUrl}\\n`));\n }),\n );\n\n billing\n .command(\"portal\")\n .description(\"Open the billing portal\")\n .action(\n handle(async (ctx) => {\n const result = await ctx.management().billing.portal(ctx.requireOrganization());\n if (ctx.interactive) openBrowser(result.portalUrl);\n emit(result, () => process.stdout.write(`${result.portalUrl}\\n`));\n }),\n );\n}\n","import { readFileSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { UsageError, diag, emit } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\n/**\n * `myna api` — call the management API directly.\n *\n * The rest of this CLI is a curated surface, which means there is always\n * something it does not wrap yet: a route that shipped before its command, a\n * query parameter nobody has needed twice, a response field to read once. The\n * workaround for that gap is hand-rolled `curl`, and hand-rolled `curl` has to\n * reimplement the credential chain, the `/v1` prefix, and problem-details\n * parsing — badly, and in every script that needs it.\n *\n * So the gap gets a command instead. It resolves credentials exactly as every\n * other command does, emits the same versioned JSON envelope, and reports\n * failures through the same RFC 9457 rendering and exit codes. What it does not\n * do is interpret the response: the API's envelope is passed through whole,\n * because a passthrough that reshapes its payload is not one.\n */\n\nconst METHODS = new Set([\"GET\", \"HEAD\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"]);\n\n/** Mutations are only replayed when the caller says replaying is safe. */\nconst SAFE = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\ninterface Target {\n method: string;\n path: string;\n}\n\n/**\n * Accept both `myna api /projects` and `myna api POST /projects`.\n *\n * Reads are the overwhelming majority of what this command is used for, so\n * requiring `GET` in front of every one of them is friction with no payoff. A\n * method is recognized by being a method, not by position, which also means a\n * path that happens to be spelled in capitals is still a path.\n */\nfunction parseTarget(args: string[]): Target {\n const [first, second] = args;\n if (!first) throw new UsageError(\"Provide a path, e.g. `myna api /projects`.\");\n const asMethod = first.toUpperCase();\n if (METHODS.has(asMethod)) {\n if (!second) throw new UsageError(`Provide a path after ${asMethod}, e.g. \\`myna api ${asMethod} /projects\\`.`);\n return { method: asMethod, path: second };\n }\n if (second) {\n throw new UsageError(\n `Unknown method \"${first}\". Expected one of ${[...METHODS].join(\", \")}, or a single path argument.`,\n );\n }\n return { method: \"GET\", path: first };\n}\n\n/** `--data` accepts inline JSON or `@file`, and any JSON value, not just an object. */\nfunction parseBody(input: string | undefined): unknown {\n if (input === undefined) return undefined;\n const raw = input.startsWith(\"@\") ? readFileSync(input.slice(1), \"utf8\") : input;\n try {\n return JSON.parse(raw) as unknown;\n } catch (error) {\n throw new UsageError(`Invalid JSON for --data: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nfunction parseHeaders(values: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const value of values ?? []) {\n const colon = value.indexOf(\":\");\n if (colon === -1) throw new UsageError(`Invalid --header \"${value}\". Expected name:value.`);\n headers[value.slice(0, colon).trim().toLowerCase()] = value.slice(colon + 1).trim();\n }\n return headers;\n}\n\nexport function registerApi(program: Command): void {\n program\n .command(\"api\")\n .description(\"Call a management API endpoint directly, using the resolved credential\")\n .argument(\"<method-or-path>\", \"HTTP method, or the path when the method is GET\")\n .argument(\"[path]\", \"request path, e.g. /projects/my-site/entries?collection=posts\")\n .option(\"--data <json>\", \"request body as inline JSON or @file\")\n .option(\"--header <name:value>\", \"extra request header (repeatable)\", (value: string, previous: string[] = []) => [...previous, value], [])\n .option(\n \"--idempotency-key <key>\",\n \"send Idempotency-Key, which also makes the request eligible for automatic retry\",\n )\n .option(\"--include\", \"also report the response status and headers on stderr\")\n .action(\n handle(async (ctx, args, opts) => {\n const { method, path } = parseTarget(args as string[]);\n const body = parseBody(opts.data as string | undefined);\n\n if (body !== undefined && SAFE.has(method)) {\n throw new UsageError(`--data cannot be sent with ${method}.`);\n }\n\n const response = await ctx.management().raw(method, path, {\n headers: parseHeaders(opts.header as string[] | undefined),\n ...(body !== undefined ? { body } : {}),\n ...(opts.idempotencyKey ? { idempotencyKey: opts.idempotencyKey as string } : {}),\n });\n\n if (opts.include) {\n diag(`${response.status}`);\n for (const [name, value] of Object.entries(response.headers)) diag(`${name}: ${value}`);\n diag(\"\");\n }\n\n // A 204 has nothing to print, but silence reads like a failure — and in\n // JSON mode the contract still owes the caller exactly one document.\n emit(response.body ?? { status: response.status }, () => {\n process.stdout.write(\n (response.body === undefined ? `${response.status} (no content)` : JSON.stringify(response.body, null, 2)) + \"\\n\",\n );\n });\n }),\n );\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/**\n * Where coding agents keep their MCP server configuration.\n *\n * Every client in this table stores the same three facts — how to start the\n * server, or what URL to call, and what environment it needs — in a slightly\n * different file under a slightly different key. That is the whole reason\n * `myna mcp install` exists: the differences are not interesting enough for a\n * person to learn, but they are fatal to get wrong, and the setup page that\n * documents them by hand is the page nobody should have to follow.\n *\n * Adding a client means adding a row here. Nothing else in the CLI knows the\n * shape of a client's configuration file.\n */\n\nexport type Scope = \"project\" | \"user\";\nexport type Transport = \"stdio\" | \"http\";\n\n/**\n * How a client spells a server entry.\n *\n * `standard` is the `mcpServers` shape Claude Code, Cursor, and Windsurf share.\n * `vscode` keys servers under `servers` and requires an explicit `type` on\n * stdio entries too. `toml` clients are described but never written: merging\n * TOML correctly needs a parser this package has no reason to carry, and a\n * half-correct merge into someone's editor configuration is worse than a\n * snippet they paste themselves.\n */\ntype Dialect = \"standard\" | \"vscode\" | \"toml\";\n\nexport interface AgentClient {\n id: string;\n label: string;\n dialect: Dialect;\n /** Config file relative to the project root, when the client has project scope. */\n projectPath?: string;\n /** Config file relative to the home directory, when the client has user scope. */\n userPath?: string;\n /** Home-relative directory whose existence means the client is installed here. */\n marker: string;\n /** Why a client cannot be written to, when it cannot. */\n note?: string;\n}\n\nexport const AGENT_CLIENTS: AgentClient[] = [\n {\n id: \"claude-code\",\n label: \"Claude Code\",\n dialect: \"standard\",\n projectPath: \".mcp.json\",\n userPath: \".claude.json\",\n marker: \".claude\",\n },\n {\n id: \"cursor\",\n label: \"Cursor\",\n dialect: \"standard\",\n projectPath: \".cursor/mcp.json\",\n userPath: \".cursor/mcp.json\",\n marker: \".cursor\",\n },\n {\n id: \"vscode\",\n label: \"VS Code\",\n dialect: \"vscode\",\n projectPath: \".vscode/mcp.json\",\n marker: \".vscode\",\n },\n {\n id: \"windsurf\",\n label: \"Windsurf\",\n dialect: \"standard\",\n userPath: \".codeium/windsurf/mcp_config.json\",\n marker: \".codeium\",\n },\n {\n id: \"codex\",\n label: \"Codex\",\n dialect: \"toml\",\n userPath: \".codex/config.toml\",\n marker: \".codex\",\n note: \"Codex configuration is TOML; the CLI prints the block to paste rather than editing it.\",\n },\n];\n\nexport function findClient(id: string): AgentClient {\n const client = AGENT_CLIENTS.find((c) => c.id === id);\n if (!client) {\n throw new UsageError(\n `Unknown client \"${id}\". Known clients: ${AGENT_CLIENTS.map((c) => c.id).join(\", \")}.`,\n );\n }\n return client;\n}\n\n/** Installed on this machine, as far as a config directory can tell. */\nexport function isDetected(client: AgentClient): boolean {\n return existsSync(join(homedir(), client.marker));\n}\n\n/** The scopes a client supports, most specific first. */\nexport function scopesFor(client: AgentClient): Scope[] {\n const scopes: Scope[] = [];\n if (client.projectPath) scopes.push(\"project\");\n if (client.userPath) scopes.push(\"user\");\n return scopes;\n}\n\nexport function configPath(client: AgentClient, scope: Scope, projectRoot: string): string {\n if (scope === \"project\") {\n if (!client.projectPath) {\n throw new UsageError(\n `${client.label} has no project-scoped configuration file. Use --scope user.`,\n );\n }\n return join(projectRoot, client.projectPath);\n }\n if (!client.userPath) {\n throw new UsageError(\n `${client.label} has no user-scoped configuration file. Use --scope project.`,\n );\n }\n return join(homedir(), client.userPath);\n}\n\nexport interface ServerSpec {\n transport: Transport;\n /** Hosted endpoint, for `http`. */\n url: string;\n /** Environment for the spawned server, for `stdio`. Never contains a secret. */\n env: Record<string, string>;\n}\n\n/** The server entry as a given client wants it spelled. */\nexport function serverEntry(client: AgentClient, spec: ServerSpec): Record<string, unknown> {\n if (spec.transport === \"http\") {\n return { type: \"http\", url: spec.url };\n }\n const stdio: Record<string, unknown> = {\n command: \"npx\",\n args: [\"-y\", \"@myna-sh/mcp\"],\n };\n if (client.dialect === \"vscode\") stdio.type = \"stdio\";\n if (Object.keys(spec.env).length > 0) stdio.env = spec.env;\n return stdio;\n}\n\n/** TOML block for the clients this CLI describes but does not edit. */\nexport function tomlBlock(name: string, spec: ServerSpec): string {\n const lines = [`[mcp_servers.${name}]`];\n if (spec.transport === \"http\") {\n lines.push(`url = ${JSON.stringify(spec.url)}`);\n } else {\n lines.push(`command = \"npx\"`, `args = [\"-y\", \"@myna-sh/mcp\"]`);\n for (const [key, value] of Object.entries(spec.env)) {\n lines.push(`env.${key} = ${JSON.stringify(value)}`);\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction serversKey(client: AgentClient): string {\n return client.dialect === \"vscode\" ? \"servers\" : \"mcpServers\";\n}\n\n/**\n * Read a client's configuration document.\n *\n * A file that exists but does not parse is an error, never an empty document.\n * These files hold state a person cannot reconstruct — `~/.claude.json` holds\n * far more than MCP servers — and treating a parse failure as \"start fresh\"\n * turns one bad character into total data loss.\n */\nfunction readDocument(path: string): Record<string, unknown> {\n if (!existsSync(path)) return {};\n const raw = readFileSync(path, \"utf8\");\n if (raw.trim() === \"\") return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"expected a JSON object\");\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n throw new CliError(\n `${path} is not valid JSON (${error instanceof Error ? error.message : String(error)}). ` +\n \"Fix or move it; refusing to overwrite a file that may hold configuration.\",\n );\n }\n}\n\n/** Whether a server of this name is already configured. */\nexport function existingEntry(\n client: AgentClient,\n path: string,\n name: string,\n): Record<string, unknown> | undefined {\n const servers = readDocument(path)[serversKey(client)];\n if (typeof servers !== \"object\" || servers === null) return undefined;\n const entry = (servers as Record<string, unknown>)[name];\n return typeof entry === \"object\" && entry !== null ? (entry as Record<string, unknown>) : undefined;\n}\n\n/** Merge a server entry into a client's configuration, preserving everything else. */\nexport function writeEntry(\n client: AgentClient,\n path: string,\n name: string,\n entry: Record<string, unknown>,\n): void {\n const doc = readDocument(path);\n const key = serversKey(client);\n const servers = typeof doc[key] === \"object\" && doc[key] !== null ? (doc[key] as Record<string, unknown>) : {};\n servers[name] = entry;\n doc[key] = servers;\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(doc, null, 2) + \"\\n\");\n}\n\n/** Remove a server entry. Returns false when there was nothing to remove. */\nexport function removeEntry(client: AgentClient, path: string, name: string): boolean {\n if (!existsSync(path)) return false;\n const doc = readDocument(path);\n const key = serversKey(client);\n const servers = doc[key];\n if (typeof servers !== \"object\" || servers === null) return false;\n const map = servers as Record<string, unknown>;\n if (!(name in map)) return false;\n delete map[name];\n writeFileSync(path, JSON.stringify(doc, null, 2) + \"\\n\");\n return true;\n}\n","import type { Command } from \"commander\";\nimport {\n AGENT_CLIENTS,\n configPath,\n existingEntry,\n findClient,\n isDetected,\n removeEntry,\n scopesFor,\n serverEntry,\n tomlBlock,\n writeEntry,\n type AgentClient,\n type ServerSpec,\n type Scope,\n type Transport,\n} from \"../agent-clients.js\";\nimport type { Ctx } from \"../client.js\";\nimport { DEFAULT_API_URL, mcpConfigFile, writeMcpConfig } from \"../config.js\";\nimport { CliError, UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\n/**\n * `myna mcp` — connect coding agents to Myna without following a setup page.\n *\n * The hosted and local MCP servers already expose the whole management API to\n * agents; what stood between a developer and that was a page of per-client JSON\n * to transcribe. Transcription is not a design decision, so it should not be a\n * manual step.\n *\n * Two rules this command keeps. It never writes a secret into a client's\n * configuration file — most of those files live in the repository — putting the\n * credential in `~/.config/myna/mcp.json` at `0600` instead, which is where\n * `@myna-sh/mcp` already looks for one. And it never overwrites an existing\n * server entry without `--force`: a config it did not write is a config someone\n * meant.\n */\n\nconst HOSTED_PATH = \"/mcp\";\n\nfunction resolveTransport(value: unknown): Transport {\n if (value === undefined) return \"stdio\";\n if (value === \"stdio\" || value === \"http\") return value;\n throw new UsageError(`--transport must be \"stdio\" or \"http\" (got \"${String(value)}\").`);\n}\n\nfunction resolveScope(client: AgentClient, requested: unknown): Scope {\n const supported = scopesFor(client);\n if (requested === undefined) return supported[0]!;\n if (requested !== \"project\" && requested !== \"user\") {\n throw new UsageError(`--scope must be \"project\" or \"user\" (got \"${String(requested)}\").`);\n }\n if (!supported.includes(requested)) {\n throw new UsageError(\n `${client.label} has no ${requested}-scoped configuration file. Supported: ${supported.join(\", \")}.`,\n );\n }\n return requested;\n}\n\n/** Named clients, or every client this machine appears to have installed. */\nfunction resolveClients(names: string[]): AgentClient[] {\n if (names.length > 0) return names.map(findClient);\n const detected = AGENT_CLIENTS.filter(isDetected);\n if (detected.length === 0) {\n throw new CliError(\n `No MCP client detected. Name one explicitly: ${AGENT_CLIENTS.map((c) => c.id).join(\", \")}.`,\n );\n }\n return detected;\n}\n\nfunction buildSpec(ctx: Ctx, transport: Transport): ServerSpec {\n const env: Record<string, string> = {};\n // Only non-default values are written: an inlined default is a value that\n // silently stops tracking the CLI when the default moves.\n if (ctx.apiUrl !== DEFAULT_API_URL) env.MYNA_API_URL = ctx.apiUrl;\n if (ctx.organization) env.MYNA_ORGANIZATION = ctx.organization;\n if (ctx.project) env.MYNA_PROJECT = ctx.project;\n return { transport, url: `${ctx.apiUrl}${HOSTED_PATH}`, env };\n}\n\ninterface Written {\n client: string;\n scope: Scope | null;\n path: string;\n action: \"written\" | \"printed\" | \"skipped\";\n reason?: string;\n}\n\nexport function registerMcp(program: Command): void {\n const mcp = program.command(\"mcp\").description(\"Connect coding agents to Myna's MCP server\");\n\n mcp\n .command(\"install\")\n .description(\"Write Myna's MCP server into the configuration of one or more coding agents\")\n .argument(\"[clients...]\", \"client ids (default: every client detected on this machine)\")\n .option(\"--transport <mode>\", \"stdio (local server, default) or http (hosted server over OAuth)\")\n .option(\"--scope <scope>\", \"project or user (default: the most specific the client supports)\")\n .option(\"--name <name>\", \"server name in the client's configuration\", \"myna\")\n .option(\"--key <token>\", \"credential to store for the local server (default: the resolved credential)\")\n .option(\"--no-credential\", \"do not write ~/.config/myna/mcp.json\")\n .option(\"--dir <dir>\", \"project root for project-scoped files (default: the linked project or cwd)\")\n .option(\"--print\", \"show what would be written, and write nothing\")\n .option(\"--force\", \"replace an existing server entry of the same name\")\n .action(\n handle(async (ctx, args, opts) => {\n const transport = resolveTransport(opts.transport);\n const name = opts.name as string;\n const root = (opts.dir as string | undefined) ?? ctx.linkedRoot ?? process.cwd();\n const clients = resolveClients((args[0] as string[] | undefined) ?? []);\n const spec = buildSpec(ctx, transport);\n const dryRun = Boolean(opts.print);\n\n // The hosted server authorizes each user through OAuth, so it needs no\n // credential from here at all; the local one is spawned by the client\n // and can only read what this command leaves behind.\n const token = transport === \"stdio\" ? ((opts.key as string | undefined) ?? ctx.token) : undefined;\n if (transport === \"stdio\" && !token) {\n throw new CliError(\n \"No credential to give the local MCP server. Run `myna login`, pass --key, or use --transport http.\",\n );\n }\n\n const results: Written[] = [];\n for (const client of clients) {\n if (client.dialect === \"toml\") {\n results.push({ client: client.id, scope: null, path: client.userPath ?? \"\", action: \"printed\", reason: client.note });\n continue;\n }\n const scope = resolveScope(client, opts.scope);\n const path = configPath(client, scope, root);\n const entry = serverEntry(client, spec);\n\n if (!opts.force && existingEntry(client, path, name)) {\n results.push({\n client: client.id,\n scope,\n path,\n action: \"skipped\",\n reason: `\"${name}\" is already configured; pass --force to replace it.`,\n });\n continue;\n }\n if (!dryRun) writeEntry(client, path, name, entry);\n results.push({ client: client.id, scope, path, action: dryRun ? \"printed\" : \"written\" });\n }\n\n let credentialPath: string | undefined;\n if (token && opts.credential !== false && !dryRun) {\n const patch: { token: string; apiUrl?: string } = { token };\n if (ctx.apiUrl !== DEFAULT_API_URL) patch.apiUrl = ctx.apiUrl;\n writeMcpConfig(patch);\n credentialPath = mcpConfigFile();\n }\n\n emit({ transport, name, results, credentialPath: credentialPath ?? null }, () => {\n for (const r of results) {\n const where = r.scope ? ` (${r.scope})` : \"\";\n process.stdout.write(`${r.action === \"written\" ? \"✓\" : r.action === \"skipped\" ? \"–\" : \"·\"} ${r.client}${where}: ${r.path}\\n`);\n if (r.reason) process.stdout.write(` ${r.reason}\\n`);\n }\n for (const client of clients.filter((c) => c.dialect === \"toml\")) {\n process.stdout.write(`\\nAdd to ~/${client.userPath}:\\n\\n${tomlBlock(name, spec)}\\n`);\n }\n if (credentialPath) diag(`\\nCredential written to ${credentialPath} (0600).`);\n if (transport === \"stdio\" && token && !token.startsWith(\"myna_sk_\")) {\n diag(\n \"\\nThis is your personal credential, so the agent inherits everything you can do.\" +\n \"\\nPrefer a scoped key: myna keys create --scopes content:read,content:write,assets:read,assets:write,preview:write,schema:read\",\n );\n }\n if (dryRun) {\n diag(\"\\nNothing written (--print).\");\n } else if (results.some((r) => r.action === \"written\")) {\n diag(\"\\nRestart the client to pick up the new server.\");\n }\n });\n }),\n );\n\n mcp\n .command(\"list\")\n .description(\"Show known MCP clients, whether they are installed here, and whether Myna is configured\")\n .option(\"--name <name>\", \"server name to look for\", \"myna\")\n .option(\"--dir <dir>\", \"project root for project-scoped files (default: the linked project or cwd)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const name = opts.name as string;\n const root = (opts.dir as string | undefined) ?? ctx.linkedRoot ?? process.cwd();\n const rows = AGENT_CLIENTS.map((client) => {\n const scopes = scopesFor(client);\n const configured =\n client.dialect === \"toml\"\n ? null\n : scopes.filter((scope) => existingEntry(client, configPath(client, scope, root), name) !== undefined);\n return {\n id: client.id,\n label: client.label,\n detected: isDetected(client),\n scopes,\n configured,\n };\n });\n emit(rows, () =>\n table(rows, [\n { header: \"CLIENT\", value: (r) => r.id },\n { header: \"DETECTED\", value: (r) => (r.detected ? \"yes\" : \"\") },\n { header: \"SCOPES\", value: (r) => r.scopes.join(\", \") },\n {\n header: \"MYNA\",\n value: (r) => (r.configured === null ? \"(manual)\" : r.configured.length > 0 ? r.configured.join(\", \") : \"\"),\n },\n ]),\n );\n }),\n );\n\n mcp\n .command(\"uninstall\")\n .description(\"Remove Myna's MCP server entry from one or more coding agents\")\n .argument(\"[clients...]\", \"client ids (default: every client detected on this machine)\")\n .option(\"--scope <scope>\", \"project or user (default: every scope the client supports)\")\n .option(\"--name <name>\", \"server name in the client's configuration\", \"myna\")\n .option(\"--dir <dir>\", \"project root for project-scoped files (default: the linked project or cwd)\")\n .action(\n handle(async (ctx, args, opts) => {\n const name = opts.name as string;\n const root = (opts.dir as string | undefined) ?? ctx.linkedRoot ?? process.cwd();\n const clients = resolveClients((args[0] as string[] | undefined) ?? []);\n const removed: Array<{ client: string; scope: Scope; path: string }> = [];\n\n for (const client of clients) {\n if (client.dialect === \"toml\") continue;\n const scopes = opts.scope ? [resolveScope(client, opts.scope)] : scopesFor(client);\n for (const scope of scopes) {\n const path = configPath(client, scope, root);\n if (removeEntry(client, path, name)) removed.push({ client: client.id, scope, path });\n }\n }\n\n emit({ name, removed }, () => {\n if (removed.length === 0) {\n diag(`No \"${name}\" server entry found.`);\n return;\n }\n for (const r of removed) process.stdout.write(`✓ ${r.client} (${r.scope}): ${r.path}\\n`);\n // The credential is left alone deliberately: it is shared with any\n // other client still configured, and removing one entry is not a\n // statement about the rest.\n diag(`\\nThe credential in ${mcpConfigFile()} was left in place. Remove it by hand if nothing else uses it.`);\n });\n }),\n );\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { SKILLS } from \"../skills/index.js\";\n\n/**\n * `myna skills` — put Myna's operating rules where agents will read them.\n *\n * The MCP server gives an agent the tools; it does not give it the discipline.\n * An agent that can call `myna_publish_change_set` and has never been told that\n * publishing is a separate authorization will publish, reasonably, because\n * nothing said otherwise. These files say otherwise.\n *\n * Skills are written to the vendor-neutral `~/.agents/skills` and to any\n * tool-specific directory that already exists. A file that exists and differs is\n * left alone: a skill someone edited is a skill someone meant, and silently\n * reverting it on every CLI upgrade would make editing pointless.\n */\n\ninterface Destination {\n id: string;\n dir: string;\n /** Only written when it already exists — this is detection, not installation. */\n requiresExisting?: string;\n}\n\nfunction destinations(scope: string, root: string, extra: string[]): Destination[] {\n const home = homedir();\n if (scope === \"project\") {\n return [\n { id: \"project\", dir: join(root, \".claude\", \"skills\") },\n ...extra.map((dir, i) => ({ id: `target-${i + 1}`, dir })),\n ];\n }\n return [\n // The convention Claude Code, Codex, and others now read from.\n { id: \"agents\", dir: join(home, \".agents\", \"skills\") },\n { id: \"claude\", dir: join(home, \".claude\", \"skills\"), requiresExisting: join(home, \".claude\") },\n ...extra.map((dir, i) => ({ id: `target-${i + 1}`, dir })),\n ];\n}\n\ntype Action = \"written\" | \"unchanged\" | \"skipped\";\n\ninterface Result {\n skill: string;\n path: string;\n action: Action;\n}\n\nexport function registerSkills(program: Command): void {\n const skills = program.command(\"skills\").description(\"Install Myna's agent skills for coding agents\");\n\n skills\n .command(\"install\")\n .description(\"Write Myna's agent skills into the skill directories on this machine\")\n .option(\"--scope <scope>\", \"user (default) or project\", \"user\")\n .option(\"--target <dir>\", \"additional skill directory to write to (repeatable)\", (value: string, previous: string[] = []) => [...previous, value], [])\n .option(\"--dir <dir>\", \"project root for --scope project (default: the linked project or cwd)\")\n .option(\"--print\", \"show what would be written, and write nothing\")\n .option(\"--force\", \"overwrite skill files that have been edited\")\n .action(\n handle(async (ctx, _args, opts) => {\n const scope = opts.scope as string;\n if (scope !== \"user\" && scope !== \"project\") {\n throw new UsageError(`--scope must be \"user\" or \"project\" (got \"${scope}\").`);\n }\n const root = (opts.dir as string | undefined) ?? ctx.linkedRoot ?? process.cwd();\n const dryRun = Boolean(opts.print);\n const targets = destinations(scope, root, (opts.target as string[] | undefined) ?? []).filter(\n (d) => !d.requiresExisting || existsSync(d.requiresExisting),\n );\n\n const results: Result[] = [];\n for (const target of targets) {\n for (const skill of SKILLS) {\n const path = join(target.dir, skill.name, \"SKILL.md\");\n const current = existsSync(path) ? readFileSync(path, \"utf8\") : undefined;\n if (current === skill.body) {\n results.push({ skill: skill.name, path, action: \"unchanged\" });\n continue;\n }\n if (current !== undefined && !opts.force) {\n results.push({ skill: skill.name, path, action: \"skipped\" });\n continue;\n }\n if (!dryRun) {\n mkdirSync(join(target.dir, skill.name), { recursive: true });\n writeFileSync(path, skill.body);\n }\n results.push({ skill: skill.name, path, action: \"written\" });\n }\n }\n\n const written = results.filter((r) => r.action === \"written\").length;\n const skipped = results.filter((r) => r.action === \"skipped\").length;\n\n emit({ scope, written, skipped, results }, () => {\n if (targets.length === 0) {\n diag(\"No skill directory to write to.\");\n return;\n }\n for (const r of results) {\n const icon = r.action === \"written\" ? \"✓\" : r.action === \"unchanged\" ? \"=\" : \"–\";\n process.stdout.write(`${icon} ${r.path}\\n`);\n }\n if (skipped > 0) diag(`\\n${skipped} file(s) differ from the bundled version and were left alone. Pass --force to update them.`);\n diag(dryRun ? \"\\nNothing written (--print).\" : `\\n${written} skill file(s) written.`);\n });\n }),\n );\n\n skills\n .command(\"list\")\n .description(\"List the agent skills bundled with this CLI\")\n .action(\n handle(async () => {\n emit(\n SKILLS.map((s) => ({ name: s.name, description: s.description })),\n () =>\n table(SKILLS, [\n { header: \"SKILL\", value: (s) => s.name },\n { header: \"DESCRIPTION\", value: (s) => s.description.split(\". \")[0] + \".\" },\n ]),\n );\n }),\n );\n}\n","/**\n * Agent skills bundled with the CLI.\n *\n * An agent connected to Myna's MCP server can see every tool but not the rules\n * the tools exist to enforce: that a write is a draft, that validation precedes\n * a preview, that publishing is a separate authorization. Those rules are what\n * make an agent useful here rather than dangerous, and they are exactly the kind\n * of thing a model will invent a plausible alternative to if nobody states it.\n *\n * So they ship as skills, deposited where the agent will read them.\n *\n * The bodies are arrays of lines rather than template literals because they are\n * mostly fenced code blocks, and a fence inside a template literal has to be\n * escaped character by character — a formatting mistake waiting to happen in\n * text whose whole purpose is to be read literally.\n */\n\nexport interface Skill {\n name: string;\n description: string;\n body: string;\n}\n\nfunction skill(name: string, description: string, lines: string[]): Skill {\n return {\n name,\n description,\n // The description is quoted: these sentences contain colons, and a plain\n // YAML scalar containing \": \" is a mapping, not a string. An unquoted one\n // makes the whole frontmatter block fail to parse.\n body: [\"---\", `name: ${name}`, `description: ${JSON.stringify(description)}`, \"---\", \"\", ...lines, \"\"].join(\"\\n\"),\n };\n}\n\nconst CHANGE_SETS = skill(\n \"myna-change-sets\",\n \"How to write content in Myna: every write is a draft on a change set, validated and previewed before a human publishes it. Use when creating, updating, or deleting entries or assets in Myna.\",\n [\n \"# Writing content in Myna\",\n \"\",\n \"Myna has one product invariant, and it governs everything below:\",\n \"\",\n \"> Writes create reviewable drafts on a change set. They never publish implicitly.\",\n \"> Validation and preview precede a separately authorized, atomic publish.\",\n \"\",\n \"There is no way to write directly to published content, and you should not look\",\n \"for one. A tool that appears to offer it is staging a draft.\",\n \"\",\n \"## The workflow\",\n \"\",\n \"1. **Create a change set.** It is the unit of work — one coherent edit, however\",\n \" many entries it touches. Give it a title a reviewer can act on.\",\n \"2. **Stage the writes.** Create, update, or delete entries and assets against\",\n \" that change set. Each one becomes a draft item on it.\",\n \"3. **Validate the whole set.** Not each entry — the set. Cross-entry problems\",\n \" (a broken reference, a required translation missing) only appear here.\",\n \"4. **Create one preview.** One URL covers the entire change set. Creating a\",\n \" preview per entry is a misuse of the API and floods the project's tokens.\",\n \"5. **Stop.** Report the change set id and the preview URL, and let a human\",\n \" review it — unless publishing was explicitly requested *and* your credential\",\n \" holds `content:publish`.\",\n \"\",\n \"```bash\",\n \"myna changes create --set title='Autumn refresh'\",\n \"myna entries update posts/welcome --change-set chs_... --set title='New title'\",\n \"myna changes validate chs_...\",\n \"myna preview create chs_...\",\n \"```\",\n \"\",\n \"The MCP equivalents are `myna_create_change_set`, `myna_update_entry`,\",\n \"`myna_validate_change_set`, and `myna_create_preview`.\",\n \"\",\n \"## Read the collection before you write to it\",\n \"\",\n \"Collections carry `guidance`: the house style anyone writing into them is\",\n \"expected to follow, plus `policy` rules that will fail validation if broken\",\n \"(length budgets, required fields, allowed values). Fetch the schema first —\",\n \"`myna_get_collection_schema`, or `myna schema get <collection>` — and follow it.\",\n \"A title that busts a length budget fails at validation, not at publish, so\",\n \"there is no reason to discover it late.\",\n \"\",\n \"## Concurrency\",\n \"\",\n \"- Pass `expectedRevisionId` when updating an entry you have read. Without it,\",\n \" two writers silently overwrite each other; with it, the loser gets a clear\",\n \" conflict.\",\n \"- An entry may be staged on several open change sets at once. Yours builds on\",\n \" your change set's own base, not on anyone else's draft.\",\n \"- If publish reports `STALE_REVISION`, the entry moved underneath you. Run a\",\n \" rebase (`myna changes rebase`, `myna_rebase_change_set`) — it performs the\",\n \" three-way merge and re-opens review, because the merged result is not what\",\n \" the reviewer approved. Never work around it by re-staging over the top.\",\n \"\",\n \"## Deleting\",\n \"\",\n \"Deletes are staged like any other write, and they need explicit confirmation:\",\n \"`--confirm-delete` on the CLI, `confirm: true` on the MCP tool. An unconfirmed\",\n \"destructive call is refused, not queued.\",\n \"\",\n \"## What to report back\",\n \"\",\n \"The change set id, what it contains, the validation result, and the preview\",\n \"URL. Not \\\"published\\\" — you did not publish.\",\n ],\n);\n\nconst SCHEMA = skill(\n \"myna-schema\",\n \"How Myna collection schemas work: code-defined, immutably versioned, deployed with a reviewed diff. Use when adding or changing a collection, field, or generated content types.\",\n [\n \"# Schemas in Myna\",\n \"\",\n \"Schemas are code. They live in the project's schema directory (`myna/` by\",\n \"default), are written with the DSL from `@myna-sh/sdk/schema`, and are deployed\",\n \"by pushing a diff — never edited through a UI, and never edited in the database.\",\n \"Every deployed version is immutable; a change creates a new version.\",\n \"\",\n \"## Changing a schema\",\n \"\",\n \"```bash\",\n \"myna schema diff # what would change, and how dangerous it is\",\n \"myna schema push # deploy it\",\n \"myna types generate # regenerate the typed client surface\",\n \"```\",\n \"\",\n \"`schema diff` classifies the change. An **additive** diff is safe. A diff that\",\n \"removes a field, narrows a type, or changes a key is **destructive** and\",\n \"`push` refuses it without `--allow-destructive`. That flag is a statement that\",\n \"the data loss is intended — check what is stored in the affected fields first.\",\n \"\",\n \"## Drift goes both ways\",\n \"\",\n \"`myna schema drift` compares the repository against what is deployed. When they\",\n \"disagree, decide which one is right before acting:\",\n \"\",\n \"- the repository is right → `myna schema push`\",\n \"- the deployed schema is right → `myna schema pull --open-pr`, which brings it\",\n \" back as a reviewable pull request rather than a silent local edit\",\n \"\",\n \"## Generated types\",\n \"\",\n \"`myna types generate` writes a file carrying a \\\"do not edit by hand\\\" header.\",\n \"Believe the header. Codegen is deterministic, so any hand edit is reverted by\",\n \"the next run and `myna doctor` reports the file as stale in the meantime.\",\n \"\",\n \"## Guidance and policy belong in the schema\",\n \"\",\n \"If a collection has a rule — a title budget, a required summary, an allowed set\",\n \"of values — express it as schema `policy` so validation enforces it for every\",\n \"writer, human or agent. Do not enforce it in a build script: a build-time gate\",\n \"fails after the content is already staged, and only for the one pipeline that\",\n \"runs it. A rule that cannot be expressed as policy is a gap in Myna worth\",\n \"reporting, not a script worth writing.\",\n ],\n);\n\nconst PUBLISHING = skill(\n \"myna-publishing\",\n \"How publishing, releases, and reverts work in Myna, and when an agent may publish. Use before publishing a change set, reverting a release, or reading content as of a past release.\",\n [\n \"# Publishing, releases, and reverts\",\n \"\",\n \"Publishing is a separate, explicitly authorized action. It is atomic over the\",\n \"whole change set, and it assigns the set a sequential release number — that\",\n \"number is what makes it a release.\",\n \"\",\n \"## Before you publish\",\n \"\",\n \"Do not publish unless **both** are true:\",\n \"\",\n \"1. The user asked for it, in this task, in so many words. \\\"Update the pricing\",\n \" page\\\" is not a request to publish it.\",\n \"2. Your credential holds `content:publish`. Many agent keys deliberately do not,\",\n \" and that is the design working, not an obstacle to route around.\",\n \"\",\n \"Publishing needs explicit confirmation — `--confirm-publish` on the CLI,\",\n \"`confirm: true` on `myna_publish_change_set` — and it can still be refused by\",\n \"the project's gates:\",\n \"\",\n \"- a number of required approvals\",\n \"- the built-in check suite passing\",\n \"- any check the project declared `required`, reported by an outside system\",\n \"\",\n \"A refused publish is information. Report which gate is unmet; do not try to\",\n \"disable the gate.\",\n \"\",\n \"## Reverting\",\n \"\",\n \"A revert does not undo anything directly. It generates a **new open change set**\",\n \"staging the inverse of every item in the release, which then goes through\",\n \"validation, review, and the same publish gates as any other change. It needs\",\n \"only `content:write`, because it publishes nothing.\",\n \"\",\n \"```bash\",\n \"myna releases list\",\n \"myna releases revert <release> # creates a change set; review it, then publish\",\n \"```\",\n \"\",\n \"## Reading a past release\",\n \"\",\n \"The public content API takes `?at=<release>`, which serves a collection exactly\",\n \"as that release served it — including the slug each entry carried at the time.\",\n \"Two properties matter when reasoning about it:\",\n \"\",\n \"- Visibility is read live, never at the pin. Pinning reproduces content, not\",\n \" access decisions: a collection made private since is private now.\",\n \"- `?at=` and `?preview=` are mutually exclusive. One reads what shipped, the\",\n \" other what has not. Asking for both is an error rather than a guess.\",\n \"\",\n \"A site that pins its content sets the release in `myna.lock`, and publishing\",\n \"opens a pull request moving that pin. Nothing deploys behind the repository's\",\n \"back.\",\n ],\n);\n\nexport const SKILLS: Skill[] = [CHANGE_SETS, SCHEMA, PUBLISHING];\n","import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { generateTypesModule, isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { compareSemVer, normalizeOrigin, parseSemVer } from \"@myna-sh/shared\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { checkCredential, describeIdentity, fetchMeta, scopesOf } from \"../auth-check.js\";\nimport type { Ctx } from \"../client.js\";\nimport { diag, emit } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { latestPublished } from \"../registry.js\";\nimport { loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { IS_RELEASE_BUILD, VERSION } from \"../version.js\";\n\n/**\n * `myna doctor` — one command that answers \"why isn't this working?\".\n *\n * Every check reports the same shape so an agent can act on it without parsing\n * prose: an id, a status, what was observed, and the command that fixes it.\n * Checks never throw; a check that cannot run reports `skip` with the reason,\n * because a diagnostic that dies on the first problem cannot diagnose the rest.\n */\n\ntype Status = \"pass\" | \"warn\" | \"fail\" | \"skip\";\n\ninterface Check {\n id: string;\n title: string;\n status: Status;\n detail: string;\n remedy?: string;\n}\n\nconst SCAN_IGNORE = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".react-router\", \".turbo\", \"coverage\"]);\n\n/**\n * Both markers must be present to call a file \"generated types\".\n *\n * Matching the header alone also matches any source file that merely mentions\n * it — including this one, which is exactly the false positive that shipped the\n * first time. Requiring the emitted registry interface as well keeps the test\n * on output rather than on prose.\n */\nconst GENERATED_MARKERS = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"export interface MynaCollections {\",\n];\n\nfunction looksGenerated(contents: string): boolean {\n return GENERATED_MARKERS.every((marker) => contents.includes(marker));\n}\n\nfunction check(id: string, title: string, status: Status, detail: string, remedy?: string): Check {\n return remedy ? { id, title, status, detail, remedy } : { id, title, status, detail };\n}\n\nasync function checkCliVersion(): Promise<Check> {\n if (!IS_RELEASE_BUILD) {\n return check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `Running an unreleased build (${VERSION}).`,\n \"Install a published release: npm install -g @myna-sh/cli\",\n );\n }\n const latest = await latestPublished(\"@myna-sh/cli\");\n if (!latest) {\n return check(\"cli.version\", \"CLI version\", \"skip\", `${VERSION} (could not reach npm to compare).`);\n }\n const behind = compareSemVer(VERSION, latest) < 0;\n return behind\n ? check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `${VERSION} is behind the latest release ${latest}.`,\n `npm install -g @myna-sh/cli@${latest}`,\n )\n : check(\"cli.version\", \"CLI version\", \"pass\", `${VERSION} is current.`);\n}\n\nfunction checkApi(meta: Awaited<ReturnType<typeof fetchMeta>>, apiUrl: string): Check[] {\n if (!meta) {\n return [\n check(\n \"api.reachable\",\n \"API reachable\",\n \"fail\",\n `No capability descriptor from ${apiUrl}/v1/meta.`,\n \"Check --api-url / MYNA_API_URL and network access. An API older than 0.2.0 does not serve /v1/meta.\",\n ),\n ];\n }\n\n const checks = [\n check(\"api.reachable\", \"API reachable\", \"pass\", `${apiUrl} speaks API ${meta.apiVersion}.`),\n ];\n\n if (!IS_RELEASE_BUILD) {\n checks.push(\n check(\"api.compatibility\", \"Client compatibility\", \"skip\", \"Unreleased CLI build; nothing to compare.\"),\n );\n return checks;\n }\n\n const supported = compareSemVer(VERSION, meta.minClientVersion) >= 0;\n checks.push(\n supported\n ? check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"pass\",\n `CLI ${VERSION} meets the minimum supported client ${meta.minClientVersion}.`,\n )\n : check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"fail\",\n `CLI ${VERSION} is older than the minimum client ${meta.minClientVersion} this API supports.`,\n `npm install -g @myna-sh/cli@latest`,\n ),\n );\n return checks;\n}\n\nasync function checkAuth(ctx: Ctx): Promise<Check[]> {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n\n if (!status.credentialPresent) {\n return [\n check(\"auth.credential\", \"Credential\", \"fail\", \"No credential found.\", \"myna login\"),\n ];\n }\n if (!status.credentialValid) {\n return [\n check(\n \"auth.credential\",\n \"Credential\",\n \"fail\",\n // The distinction the old `whoami` collapsed.\n `A credential is present (from ${status.source}) but the API rejected it: ${status.error?.detail ?? \"unknown reason\"}.`,\n status.error?.code === \"UNREACHABLE\" ? undefined : \"myna login\",\n ),\n ];\n }\n\n const checks = [\n check(\"auth.credential\", \"Credential\", \"pass\", `Valid — ${describeIdentity(status.identity!)}.`),\n ];\n\n const scopes = scopesOf(status.identity);\n if (scopes) {\n checks.push(\n scopes.length > 0\n ? check(\"auth.scopes\", \"Key scopes\", \"pass\", scopes.join(\", \"))\n : check(\n \"auth.scopes\",\n \"Key scopes\",\n \"fail\",\n \"The key carries no scopes, so every authorized call will be denied.\",\n \"Mint a scoped key: myna keys create --scopes content:read,content:write\",\n ),\n );\n }\n return checks;\n}\n\nasync function checkProject(ctx: Ctx): Promise<Check[]> {\n if (!ctx.project) {\n return [\n check(\n \"project.link\",\n \"Project\",\n \"warn\",\n \"No project selected.\",\n \"myna link --project <project>, or pass --project\",\n ),\n ];\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n const where = ctx.linkedRoot ? ` (linked at ${ctx.linkedRoot})` : \"\";\n return [\n check(\"project.link\", \"Project\", \"pass\", `${project.slug}${where}.`),\n project.publicApiEnabled\n ? check(\"project.publicApi\", \"Public API\", \"pass\", \"Enabled.\")\n : check(\n \"project.publicApi\",\n \"Public API\",\n \"warn\",\n \"Disabled — browser and unauthenticated reads will 404.\",\n \"myna projects update --public-api\",\n ),\n ];\n } catch (error) {\n const detail = isMynaApiError(error)\n ? `${error.code} — ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return [\n check(\n \"project.link\",\n \"Project\",\n \"fail\",\n `Cannot read project \"${ctx.project}\": ${detail}`,\n \"Check the project ref and that your credential has access to it.\",\n ),\n ];\n }\n}\n\nasync function checkOrigin(ctx: Ctx, origin: string): Promise<Check> {\n const canonical = normalizeOrigin(origin);\n if (!canonical) {\n return check(\"origins\", \"Browser origin\", \"fail\", `\"${origin}\" is not a valid http(s) origin.`);\n }\n if (!ctx.project) {\n return check(\"origins\", \"Browser origin\", \"skip\", \"No project selected.\");\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n // Compare canonical forms: a configured trailing slash is the same origin.\n const allowed = project.origins.some((o) => normalizeOrigin(o) === canonical);\n return allowed\n ? check(\"origins\", \"Browser origin\", \"pass\", `${canonical} is allowed on ${project.slug}.`)\n : check(\n \"origins\",\n \"Browser origin\",\n \"fail\",\n `${canonical} is not allowed on ${project.slug}. A browser will discard responses from it. Configured: ${\n project.origins.length > 0 ? project.origins.join(\", \") : \"(none)\"\n }`,\n `myna projects update --origins ${[...project.origins, canonical].join(\",\")}`,\n );\n } catch {\n return check(\"origins\", \"Browser origin\", \"skip\", \"Could not read the project's origins.\");\n }\n}\n\nasync function checkSchema(ctx: Ctx, schemaDir: string | undefined): Promise<Check> {\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No schema directory at ${dir}.`);\n }\n if (!ctx.project) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", \"No project selected.\");\n }\n let local: CollectionSchema[];\n try {\n local = await loadLocalSchemas(dir);\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"fail\",\n `Could not load schemas from ${dir}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n if (local.length === 0) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No collections defined in ${dir}.`);\n }\n try {\n const diff = await ctx\n .management()\n .schema.diff(ctx.project, local as unknown as Record<string, unknown>[]);\n return diff.ops.length === 0\n ? check(\"schema.drift\", \"Local schema\", \"pass\", `${local.length} collection(s) match the deployed schema.`)\n : check(\n \"schema.drift\",\n \"Local schema\",\n \"warn\",\n `${diff.ops.length} undeployed change(s) (${diff.classification}).`,\n // Drift has two directions and two fixes: push local ahead, or pull\n // the deployed schema back into the repository as a reviewable change.\n \"myna schema diff, then myna schema push — or myna schema pull --open-pr if the deployed schema is the one to keep\",\n );\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"skip\",\n `Could not diff against the deployed schema: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/** Shallow scan for a file written by `myna types generate`. */\nfunction findGeneratedTypes(root: string, depth = 4): string | undefined {\n let entries: string[];\n try {\n entries = readdirSync(root);\n } catch {\n return undefined;\n }\n const dirs: string[] = [];\n for (const entry of entries) {\n if (SCAN_IGNORE.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(root, entry);\n let stats;\n try {\n stats = statSync(full);\n } catch {\n continue;\n }\n if (stats.isDirectory()) {\n dirs.push(full);\n continue;\n }\n if (!/\\.(ts|d\\.ts)$/.test(entry)) continue;\n try {\n if (looksGenerated(readFileSync(full, \"utf8\"))) return full;\n } catch {\n // Unreadable file; keep scanning.\n }\n }\n if (depth <= 0) return undefined;\n for (const dir of dirs) {\n const found = findGeneratedTypes(dir, depth - 1);\n if (found) return found;\n }\n return undefined;\n}\n\nasync function checkTypes(ctx: Ctx, explicit: string | undefined, schemaDir: string | undefined): Promise<Check> {\n const root = ctx.linkedRoot ?? process.cwd();\n const file = explicit ?? findGeneratedTypes(root);\n if (!file) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", \"No generated types file found.\");\n }\n if (!existsSync(file)) {\n return check(\"types.freshness\", \"Generated types\", \"fail\", `${file} does not exist.`);\n }\n\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", `Found ${file} but no schema directory to compare against.`);\n }\n\n try {\n const expected = generateTypesModule(await loadLocalSchemas(dir));\n // Codegen is deterministic, so an exact match is a real freshness signal.\n return readFileSync(file, \"utf8\") === expected\n ? check(\"types.freshness\", \"Generated types\", \"pass\", `${file} matches the local schema.`)\n : check(\n \"types.freshness\",\n \"Generated types\",\n \"warn\",\n `${file} is out of date with the local schema.`,\n `myna types generate --out ${file}`,\n );\n } catch (error) {\n return check(\n \"types.freshness\",\n \"Generated types\",\n \"skip\",\n `Could not regenerate types for comparison: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nconst ICON: Record<Status, string> = { pass: \"✓\", warn: \"!\", fail: \"✗\", skip: \"–\" };\n\nexport function registerDoctor(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"Diagnose CLI, API, credential, project, schema, and origin configuration\")\n .option(\"--origin <url>\", \"also check whether this browser origin is allowed\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--types <file>\", \"generated types file to check for freshness\")\n .action(\n handle(async (ctx, _args, opts) => {\n const checks: Check[] = [];\n\n checks.push(await checkCliVersion());\n\n const meta = await fetchMeta(ctx.apiUrl);\n checks.push(...checkApi(meta, ctx.apiUrl));\n\n const auth = await checkAuth(ctx);\n checks.push(...auth);\n\n // Everything below needs a working credential; running it without one\n // produces a wall of failures that all restate the same cause.\n const authed = auth[0]?.status === \"pass\";\n if (authed) {\n checks.push(...(await checkProject(ctx)));\n checks.push(await checkSchema(ctx, opts.schemaDir as string | undefined));\n checks.push(await checkTypes(ctx, opts.types as string | undefined, opts.schemaDir as string | undefined));\n if (opts.origin) checks.push(await checkOrigin(ctx, opts.origin as string));\n } else {\n const deferred: Array<[string, string]> = [\n [\"project.link\", \"Project\"],\n [\"schema.drift\", \"Local schema\"],\n [\"types.freshness\", \"Generated types\"],\n ];\n for (const [id, title] of deferred) {\n checks.push(check(id, title, \"skip\", \"Requires a valid credential.\"));\n }\n }\n\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n emit({ ok: failed === 0, failed, warned, checks }, () => {\n for (const c of checks) {\n process.stdout.write(`${ICON[c.status]} ${c.title}: ${c.detail}\\n`);\n if (c.remedy && c.status !== \"pass\") process.stdout.write(` → ${c.remedy}\\n`);\n }\n diag(\n failed === 0\n ? warned === 0\n ? \"\\nAll checks passed.\"\n : `\\n${warned} warning(s), no failures.`\n : `\\n${failed} failure(s), ${warned} warning(s).`,\n );\n });\n\n if (failed > 0) process.exitCode = 1;\n }),\n );\n}\n","/** npm registry lookups, shared by `myna doctor` and `myna update`. */\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\n\n/** Latest published version of a package, or undefined when npm is unreachable. */\nexport async function latestPublished(pkg: string): Promise<string | undefined> {\n try {\n const res = await fetch(`${NPM_REGISTRY}/${pkg}/latest`, {\n headers: { accept: \"application/json\" },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { version?: string };\n return body.version;\n } catch {\n return undefined;\n }\n}\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Which package manager installed this binary, guessed from where it lives.\n *\n * A guess, and treated like one: `myna update` prints the command before\n * running it, so a wrong guess is visible rather than silently installing a\n * second copy somewhere the shell will not find.\n */\nexport function detectPackageManager(binPath: string): PackageManager {\n const path = binPath.replaceAll(\"\\\\\", \"/\");\n if (path.includes(\"/.bun/\")) return \"bun\";\n if (path.includes(\"/pnpm/\") || path.includes(\"/.pnpm/\")) return \"pnpm\";\n if (path.includes(\"/yarn/\") || path.includes(\"/.yarn/\")) return \"yarn\";\n return \"npm\";\n}\n\n/** The global-install command for `@myna-sh/cli` at a given version. */\nexport function installCommand(manager: PackageManager, version: string): string[] {\n const spec = `@myna-sh/cli@${version}`;\n switch (manager) {\n case \"pnpm\":\n return [\"pnpm\", \"add\", \"-g\", spec];\n case \"yarn\":\n return [\"yarn\", \"global\", \"add\", spec];\n case \"bun\":\n return [\"bun\", \"add\", \"-g\", spec];\n case \"npm\":\n return [\"npm\", \"install\", \"-g\", spec];\n }\n}\n","/**\n * Build-time version stamp.\n *\n * `tsup` substitutes `__MYNA_VERSION__` with the value from `package.json`\n * (see `tsup.config.ts`), so a published binary can never disagree with the\n * package it was published from — the drift class simply stops existing.\n * Running from source (tsx, `turbo dev`) leaves the identifier undefined and\n * falls back to a marker that is obviously not a release.\n */\ndeclare const __MYNA_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __MYNA_VERSION__ === \"string\" ? __MYNA_VERSION__ : \"0.0.0-dev\";\n\n/**\n * Whether this is a published build rather than a source checkout.\n *\n * Tested on the substitution itself, not on the shape of the string. The\n * fallback `0.0.0-dev` is a *valid* semantic version — `parseSemVer` accepts the\n * pre-release suffix — so code that asked \"does this parse?\" to mean \"is this a\n * release?\" got `true` and went on to compare a dev build against the registry,\n * or tell a contributor running from source to `npm install -g`.\n */\nexport const IS_RELEASE_BUILD: boolean = typeof __MYNA_VERSION__ === \"string\";\n","import { execFileSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Command } from \"commander\";\nimport { compareSemVer } from \"@myna-sh/shared\";\nimport { CliError, diag, emit } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { detectPackageManager, installCommand, latestPublished } from \"../registry.js\";\nimport { IS_RELEASE_BUILD, VERSION } from \"../version.js\";\n\n/**\n * Update the CLI in place.\n *\n * `myna doctor` already reports that a newer release exists and prints the\n * install command; this runs it. The gap it closes is small and real — an\n * upgrade the tool tells you about but will not perform is an upgrade people\n * put off, and a CLI that is several releases behind the API is how a missing\n * command gets reported as a bug.\n *\n * It only touches the globally installed CLI. `@myna-sh/sdk` and\n * `@myna-sh/react` are project dependencies, released in lockstep with this\n * package but owned by your project's manifest, so updating them is your\n * package manager's job and is deliberately not attempted here.\n */\nexport function registerUpdate(program: Command): void {\n program\n .command(\"update\")\n .description(\"Update the CLI to the latest published release\")\n .option(\"--check\", \"report whether an update exists without installing it\", false)\n .action(\n handle(async (_ctx, _args, opts) => {\n const current = VERSION;\n const checkOnly = Boolean(opts.check);\n\n if (!IS_RELEASE_BUILD) {\n // A source checkout has no release to move to, and running a global\n // install from one would replace the build under someone's feet.\n emit({ current, latest: null, upToDate: false, updated: false, reason: \"unreleased\" }, () =>\n diag(`Running an unreleased build (${current}); nothing to update. Install a release with: npm install -g @myna-sh/cli`),\n );\n return;\n }\n\n const latest = await latestPublished(\"@myna-sh/cli\");\n if (!latest) {\n throw new CliError(\"Could not reach the npm registry to check for updates.\");\n }\n\n if (compareSemVer(current, latest) >= 0) {\n emit({ current, latest, upToDate: true, updated: false }, () =>\n diag(`${current} is the latest release.`),\n );\n return;\n }\n\n const manager = detectPackageManager(fileURLToPath(import.meta.url));\n const command = installCommand(manager, latest);\n\n if (checkOnly) {\n emit({ current, latest, upToDate: false, updated: false, command: command.join(\" \") }, () =>\n diag(`${current} is behind ${latest}. Update with: ${command.join(\" \")}`),\n );\n // Non-zero so CI can gate on a stale CLI the same way `myna doctor` does.\n process.exitCode = 1;\n return;\n }\n\n diag(`Updating ${current} → ${latest} with: ${command.join(\" \")}`);\n try {\n execFileSync(command[0]!, command.slice(1), { stdio: \"inherit\" });\n } catch (error) {\n throw new CliError(\n `Update failed: ${error instanceof Error ? error.message : String(error)}. Run it yourself with: ${command.join(\" \")}`,\n );\n }\n emit({ current, latest, upToDate: false, updated: true, command: command.join(\" \") }, () =>\n diag(`Updated to ${latest}. Run \\`myna doctor\\` to confirm the API agrees.`),\n );\n }),\n );\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport type { Ctx } from \"../client.js\";\n\n/**\n * `myna sync` — reconcile a content directory into a collection.\n *\n * Migrating a site otherwise means writing a throwaway script that walks files\n * and drives the API once per entry. This does the whole reconciliation in one\n * staged change set: rows that exist are updated, rows that match byte for byte\n * are left alone, new rows are created, and — only when asked — entries with no\n * corresponding file are staged for deletion.\n *\n * Nothing publishes. The result is a change set to review.\n */\n\ninterface SyncPlanEntry {\n collection: string;\n path: string;\n}\n\nasync function isDirectory(path: string): Promise<boolean> {\n const info = await stat(path).catch(() => undefined);\n return Boolean(info?.isDirectory());\n}\n\n/**\n * Work out what to sync.\n *\n * With `--collection`, the directory is that collection's content. Without it,\n * each immediate subdirectory is a collection named after it — the layout most\n * content repositories already have.\n */\nasync function planDirectories(dir: string, collection: string | undefined): Promise<SyncPlanEntry[]> {\n if (!(await isDirectory(dir))) {\n if (!collection) throw new UsageError(\"Syncing a single file needs --collection.\");\n return [{ collection, path: dir }];\n }\n if (collection) return [{ collection, path: dir }];\n\n const children = await readdir(dir);\n const plan: SyncPlanEntry[] = [];\n for (const name of children.sort()) {\n if (name.startsWith(\".\")) continue;\n const full = join(dir, name);\n if (await isDirectory(full)) plan.push({ collection: name, path: full });\n }\n if (plan.length === 0) {\n throw new UsageError(\n `No collection subdirectories in ${dir}. Pass --collection to sync it as one collection.`,\n );\n }\n return plan;\n}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Reconcile a content directory into collections, staged on one change set\")\n .argument(\"<dir>\", \"content directory\")\n .option(\"--collection <key>\", \"treat the directory as one collection instead of one per subdirectory\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the files by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set\")\n .option(\"--dry-run\", \"report what would change without writing\", false)\n .option(\"--delete-missing\", \"also stage deletion of entries with no matching file\", false)\n .option(\"--confirm-delete\", \"required consequence flag for --delete-missing\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const dryRun = Boolean(opts.dryRun);\n const deleteMissing = Boolean(opts.deleteMissing);\n if (deleteMissing && !opts.confirmDelete && !dryRun) {\n throw new UsageError(\"--delete-missing removes published content. Add --confirm-delete, or use --dry-run.\");\n }\n\n const plan = await planDirectories(args[0] as string, opts.collection as string | undefined);\n const mgmt = ctx.management();\n\n // One change set for the whole sync, so a migration reviews and\n // publishes as a single decision rather than one per collection.\n let changeSetId = opts.changeSet as string | undefined;\n\n const report: {\n collection: string;\n created: number;\n updated: number;\n unchanged: number;\n invalid: number;\n deleted: number;\n deletedSlugs: string[];\n }[] = [];\n let failed = false;\n\n for (const target of plan) {\n const source = await readContentRows(target.path, {\n format: parseFormat(opts.format as string | undefined),\n bodyField: opts.bodyField as string,\n });\n if (source.rows.length === 0) continue;\n\n const result = await mgmt.entries.import(project, {\n collection: target.collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun,\n changeSetId,\n mode: \"upsert\",\n });\n if (!result.valid) {\n failed = true;\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n }\n // Reuse the change set the first import created for the rest.\n changeSetId ??= result.changeSetId ?? undefined;\n\n let deleted = 0;\n let deletedSlugs: string[] = [];\n if (deleteMissing && result.valid) {\n const staged = await stageMissingDeletions(\n ctx,\n project,\n target.collection,\n new Set(source.rows.map((r) => r.slug).filter((s): s is string => Boolean(s))),\n changeSetId,\n dryRun,\n );\n deleted = staged.count;\n deletedSlugs = staged.slugs;\n // Deletions can be the only thing a sync does; without capturing\n // their change set the run would report \"nothing to do\" while\n // having staged removals.\n changeSetId ??= staged.changeSetId;\n }\n\n report.push({\n collection: target.collection,\n created: result.summary.created,\n updated: result.summary.updated,\n unchanged: result.summary.unchanged,\n invalid: result.summary.invalid,\n deleted,\n deletedSlugs,\n });\n }\n\n emit({ dryRun, changeSetId: changeSetId ?? null, collections: report, ok: !failed }, () => {\n table(report, [\n { header: \"COLLECTION\", value: (r) => r.collection },\n { header: \"CREATED\", value: (r) => String(r.created) },\n { header: \"UPDATED\", value: (r) => String(r.updated) },\n { header: \"UNCHANGED\", value: (r) => String(r.unchanged) },\n { header: \"DELETED\", value: (r) => String(r.deleted) },\n { header: \"INVALID\", value: (r) => String(r.invalid) },\n ]);\n // A destructive operation must name what it removes. A count alone\n // reads as harmless right up until it is not.\n const removals = report.flatMap((r) => r.deletedSlugs.map((slug) => `${r.collection}/${slug}`));\n if (removals.length > 0) {\n diag(`\\n${dryRun ? \"Would stage\" : \"Staged\"} deletion of ${removals.length} entr(y/ies) with no file:`);\n for (const slug of removals) diag(` − ${slug}`);\n }\n if (dryRun) {\n diag(\"\\nDry run — nothing was written.\");\n } else if (changeSetId) {\n diag(`\\nStaged on change set ${changeSetId}. Review and publish it to go live.`);\n } else {\n diag(\"\\nNothing to do — every file already matches.\");\n }\n });\n\n if (failed) process.exitCode = 1;\n }),\n );\n}\n\n/** Stage deletion of entries whose slug has no file. */\nasync function stageMissingDeletions(\n ctx: Ctx,\n project: string,\n collection: string,\n presentSlugs: Set<string>,\n changeSetId: string | undefined,\n dryRun: boolean,\n): Promise<{ count: number; slugs: string[]; changeSetId: string | undefined }> {\n const mgmt = ctx.management();\n const missing: { id: string; slug: string }[] = [];\n let cursor: string | undefined;\n do {\n const page = await mgmt.entries.list(project, { collection, limit: 100, cursor });\n for (const entry of page.data) {\n if (entry.slug && !presentSlugs.has(entry.slug)) missing.push({ id: entry.id, slug: entry.slug });\n }\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n\n const slugs = missing.map((m) => m.slug).sort();\n if (missing.length === 0 || dryRun) return { count: missing.length, slugs, changeSetId };\n\n const result = await mgmt.entries.bulk(project, {\n action: \"delete\",\n entryIds: missing.map((m) => m.id),\n changeSetId,\n });\n const succeeded = result.results.filter((r) => r.ok);\n return {\n count: succeeded.length,\n slugs,\n changeSetId: changeSetId ?? succeeded.find((r) => r.changeSetId)?.changeSetId,\n };\n}\n\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n"],"mappings":"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,UAAU,WAAW,CAAC,IAAI,OAAO,IAAI,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI;AAAA,EAClH;AACF;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IA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","names":["resolve","run","preview","bytes","DEFAULT_API_URL","readFileSync","platform","readFileSync","platform","sleep","check","existsSync","mkdirSync","writeFileSync","join","mkdirSync","join","existsSync","writeFileSync","DEFAULT_API_URL","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","join","resolve","existsSync","join","resolve","execFileSync","createHash","rmSync","join","execFileSync","createHash","join","rmSync","join","existsSync","readFileSync","mkdirSync","writeFileSync","readFile","basename","join","readFile","join","basename","mode","preview","check","existsSync","readFileSync","join","existsSync","readFileSync","writeFileSync","dirname","join","resolve","LOCKFILE_NAME","formatLock","parseLock","writeFileSync","formatLock","LOCKFILE_NAME","LOCKFILE_NAME","join","existsSync","readFileSync","preview","check","readFileSync","readFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","existsSync","join","homedir","readFileSync","mkdirSync","dirname","writeFileSync","DEFAULT_API_URL","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","homedir","join","existsSync","skill","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","readdirSync","statSync","join","existsSync","readdirSync","join","statSync","readFileSync","execFileSync","fileURLToPath","fileURLToPath","execFileSync","readdir","stat","join","stat","readdir","join","parseFormat"]}