@contentrain/mcp 3.0.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/{annotations-C-tQVmot.mjs → annotations-CXHPnS-M.mjs} +8 -1
- package/dist/annotations-CXHPnS-M.mjs.map +1 -0
- package/dist/{apply-manager-BybvnUVC.mjs → apply-manager-DsNq7Zhm.mjs} +7 -7
- package/dist/{apply-manager-BybvnUVC.mjs.map → apply-manager-DsNq7Zhm.mjs.map} +1 -1
- package/dist/{astro-parser-Cb9uuBpW.mjs → astro-parser-dhFgc2wA.mjs} +3 -3
- package/dist/{astro-parser-Cb9uuBpW.mjs.map → astro-parser-dhFgc2wA.mjs.map} +1 -1
- package/dist/{availability-Dgcmvv99.mjs → availability-DYHNoP0_.mjs} +5 -1
- package/dist/availability-DYHNoP0_.mjs.map +1 -0
- package/dist/{branch-lifecycle-DhzHfzs3.d.mts → branch-lifecycle-DGlgjnC7.d.mts} +32 -2
- package/dist/branch-lifecycle-DGlgjnC7.d.mts.map +1 -0
- package/dist/{branch-lifecycle-B6PXZ2N7.mjs → branch-lifecycle-DUOoyNWn.mjs} +32 -4
- package/dist/branch-lifecycle-DUOoyNWn.mjs.map +1 -0
- package/dist/{compiler-B6hNQeCC.mjs → compiler-CR9F0wZZ.mjs} +2 -2
- package/dist/{compiler-B6hNQeCC.mjs.map → compiler-CR9F0wZZ.mjs.map} +1 -1
- package/dist/{compiler-sfc.cjs-8yY7b5bx.mjs → compiler-sfc.cjs-Cpexs92i.mjs} +2 -2
- package/dist/{compiler-sfc.cjs-8yY7b5bx.mjs.map → compiler-sfc.cjs-Cpexs92i.mjs.map} +1 -1
- package/dist/{config-VlRKRwAS.mjs → config-B8a4JBT1.mjs} +2 -2
- package/dist/{config-VlRKRwAS.mjs.map → config-B8a4JBT1.mjs.map} +1 -1
- package/dist/{content-manager-Dn4tqDw1.d.mts → content-manager-Bx94DXSF.d.mts} +2 -2
- package/dist/{content-manager-Dn4tqDw1.d.mts.map → content-manager-Bx94DXSF.d.mts.map} +1 -1
- package/dist/{context-C3x6I3cE.mjs → context-CxpTATh4.mjs} +7 -7
- package/dist/context-CxpTATh4.mjs.map +1 -0
- package/dist/core/apply-manager.mjs +10 -11
- package/dist/core/config.d.mts +1 -1
- package/dist/core/config.mjs +2 -2
- package/dist/core/content-manager.d.mts +1 -1
- package/dist/core/content-manager.mjs +3 -3
- package/dist/core/context.d.mts +1 -1
- package/dist/core/context.mjs +5 -6
- package/dist/core/contracts/index.d.mts +1 -1
- package/dist/core/doctor.mjs +8 -8
- package/dist/core/graph-builder.mjs +3 -3
- package/dist/core/meta-manager.mjs +2 -2
- package/dist/core/model-manager.d.mts +1 -1
- package/dist/core/model-manager.mjs +3 -3
- package/dist/core/ops/index.d.mts +17 -29
- package/dist/core/ops/index.d.mts.map +1 -1
- package/dist/core/ops/index.mjs +9 -6
- package/dist/core/overlay-reader.d.mts +1 -1
- package/dist/core/overlay-reader.mjs +1 -1
- package/dist/core/scan-config.mjs +2 -2
- package/dist/core/scanner.mjs +4 -4
- package/dist/core/validator/index.d.mts +1 -1
- package/dist/core/validator/index.mjs +5 -5
- package/dist/{detect-B0oXbQaP.mjs → detect-CI32ynpq.mjs} +2 -2
- package/dist/{detect-B0oXbQaP.mjs.map → detect-CI32ynpq.mjs.map} +1 -1
- package/dist/{doctor-DNPuGgcg.mjs → doctor-B7G0oFxO.mjs} +7 -7
- package/dist/{doctor-DNPuGgcg.mjs.map → doctor-B7G0oFxO.mjs.map} +1 -1
- package/dist/errors-BmLE-JSC.mjs +55 -0
- package/dist/errors-BmLE-JSC.mjs.map +1 -0
- package/dist/{errors-CvBS12e7.mjs → errors-DLkAWnzQ.mjs} +1 -1
- package/dist/{errors-CvBS12e7.mjs.map → errors-DLkAWnzQ.mjs.map} +1 -1
- package/dist/{fs-DLbVB-Ek.mjs → fs-DJv5G8uL.mjs} +1 -1
- package/dist/{fs-DLbVB-Ek.mjs.map → fs-DJv5G8uL.mjs.map} +1 -1
- package/dist/git/branch-lifecycle.d.mts +2 -2
- package/dist/git/branch-lifecycle.mjs +5 -5
- package/dist/git/errors.d.mts +30 -0
- package/dist/git/errors.d.mts.map +1 -0
- package/dist/git/errors.mjs +2 -0
- package/dist/git/identity.mjs +1 -1
- package/dist/git/reconcile.d.mts +49 -0
- package/dist/git/reconcile.d.mts.map +1 -0
- package/dist/git/reconcile.mjs +13 -0
- package/dist/git/transaction.d.mts +60 -15
- package/dist/git/transaction.d.mts.map +1 -1
- package/dist/git/transaction.mjs +10 -11
- package/dist/{graph-builder-BEocwW13.mjs → graph-builder-C9NS7y-a.mjs} +3 -3
- package/dist/{graph-builder-BEocwW13.mjs.map → graph-builder-C9NS7y-a.mjs.map} +1 -1
- package/dist/{id-BjhaIxTL.mjs → id-CjGMPP1k.mjs} +2 -2
- package/dist/{id-BjhaIxTL.mjs.map → id-CjGMPP1k.mjs.map} +1 -1
- package/dist/{identity-D8QoGxhT.mjs → identity-CxAB9Qb8.mjs} +1 -1
- package/dist/{identity-D8QoGxhT.mjs.map → identity-CxAB9Qb8.mjs.map} +1 -1
- package/dist/index-_HJVkDJa.d.mts +85 -0
- package/dist/index-_HJVkDJa.d.mts.map +1 -0
- package/dist/index.mjs +24 -22
- package/dist/index.mjs.map +1 -1
- package/dist/{local-Db5X9mjZ.mjs → local-bnn6yrG7.mjs} +83 -8
- package/dist/local-bnn6yrG7.mjs.map +1 -0
- package/dist/{meta-manager-B_Se183X.mjs → meta-manager-g3shoZES.mjs} +2 -2
- package/dist/{meta-manager-B_Se183X.mjs.map → meta-manager-g3shoZES.mjs.map} +1 -1
- package/dist/{model-manager-DgyKMjLN.mjs → model-manager-DqwL8ptm.mjs} +66 -5
- package/dist/model-manager-DqwL8ptm.mjs.map +1 -0
- package/dist/{node-DUGiIkv1.mjs → node-CpLm3qr6.mjs} +1 -1
- package/dist/{node-DUGiIkv1.mjs.map → node-CpLm3qr6.mjs.map} +1 -1
- package/dist/{ops-BzbThweu.mjs → ops-BfrdZ6GK.mjs} +24 -34
- package/dist/ops-BfrdZ6GK.mjs.map +1 -0
- package/dist/{overlay-reader-CkU_pGXZ.mjs → overlay-reader-Bx1YxGXq.mjs} +1 -1
- package/dist/{overlay-reader-CkU_pGXZ.mjs.map → overlay-reader-Bx1YxGXq.mjs.map} +1 -1
- package/dist/{paths-CdPPWpbG.mjs → paths-C6_C1gLp.mjs} +1 -1
- package/dist/{paths-CdPPWpbG.mjs.map → paths-C6_C1gLp.mjs.map} +1 -1
- package/dist/providers/github/index.d.mts +10 -1
- package/dist/providers/github/index.d.mts.map +1 -1
- package/dist/providers/github/index.mjs +104 -4
- package/dist/providers/github/index.mjs.map +1 -1
- package/dist/providers/gitlab/index.d.mts +8 -1
- package/dist/providers/gitlab/index.d.mts.map +1 -1
- package/dist/providers/gitlab/index.mjs +15 -2
- package/dist/providers/gitlab/index.mjs.map +1 -1
- package/dist/providers/local/index.d.mts +26 -2
- package/dist/providers/local/index.d.mts.map +1 -1
- package/dist/providers/local/index.mjs +13 -12
- package/dist/reconcile-D5FTVW5z.mjs +1704 -0
- package/dist/reconcile-D5FTVW5z.mjs.map +1 -0
- package/dist/reconcile-M7KBZtdn.mjs +249 -0
- package/dist/reconcile-M7KBZtdn.mjs.map +1 -0
- package/dist/{scan-config-Dx49nCqk.mjs → scan-config-C5zzygeH.mjs} +2 -2
- package/dist/{scan-config-Dx49nCqk.mjs.map → scan-config-C5zzygeH.mjs.map} +1 -1
- package/dist/{scanner-BSvXjfkp.mjs → scanner-CEiT8Tgx.mjs} +7 -7
- package/dist/{scanner-BSvXjfkp.mjs.map → scanner-CEiT8Tgx.mjs.map} +1 -1
- package/dist/server/http/index.d.mts +1 -1
- package/dist/server/http/index.mjs +24 -22
- package/dist/server/http/index.mjs.map +1 -1
- package/dist/{server-DdxWpNBH.mjs → server-BtzVY7yp.mjs} +343 -227
- package/dist/server-BtzVY7yp.mjs.map +1 -0
- package/dist/{server-CLPNnhYL.d.mts → server-SDsD0XGM.d.mts} +2 -2
- package/dist/{server-CLPNnhYL.d.mts.map → server-SDsD0XGM.d.mts.map} +1 -1
- package/dist/server.d.mts +1 -1
- package/dist/server.mjs +24 -22
- package/dist/{source-map-generator-DhjiQdV3.mjs → source-map-generator-Clb2Eqse.mjs} +1 -1
- package/dist/{source-map-generator-DhjiQdV3.mjs.map → source-map-generator-Clb2Eqse.mjs.map} +1 -1
- package/dist/{svelte-parser-CwySu9yn.mjs → svelte-parser-CBN7Jxb7.mjs} +3 -3
- package/dist/{svelte-parser-CwySu9yn.mjs.map → svelte-parser-CBN7Jxb7.mjs.map} +1 -1
- package/dist/templates/index.mjs +1 -1
- package/dist/{templates-CAkTIRkE.mjs → templates-BZbohJc8.mjs} +1 -1
- package/dist/{templates-CAkTIRkE.mjs.map → templates-BZbohJc8.mjs.map} +1 -1
- package/dist/testing/memory-provider.d.mts +26 -1
- package/dist/testing/memory-provider.d.mts.map +1 -1
- package/dist/testing/memory-provider.mjs +62 -2
- package/dist/testing/memory-provider.mjs.map +1 -1
- package/dist/tools/annotations.d.mts.map +1 -1
- package/dist/tools/annotations.mjs +1 -1
- package/dist/tools/availability.d.mts.map +1 -1
- package/dist/tools/availability.mjs +1 -1
- package/dist/{transaction-BW9ektWu.mjs → transaction-BxDiiakv.mjs} +128 -64
- package/dist/transaction-BxDiiakv.mjs.map +1 -0
- package/dist/tsx-parser-DOQpJVgK.mjs +2 -0
- package/dist/{tsx-parser-BvsK6lyG.mjs → tsx-parser-go5V9zoc.mjs} +1 -1
- package/dist/{tsx-parser-BvsK6lyG.mjs.map → tsx-parser-go5V9zoc.mjs.map} +1 -1
- package/dist/util/detect.mjs +2 -2
- package/dist/util/fs.mjs +1 -1
- package/dist/util/id.mjs +1 -1
- package/dist/{validator-0sJ9vh1j.mjs → validator-B2GhPM3L.mjs} +5 -6
- package/dist/{validator-0sJ9vh1j.mjs.map → validator-B2GhPM3L.mjs.map} +1 -1
- package/dist/{vue-parser-auedZiJG.mjs → vue-parser-5Mp8w-mb.mjs} +3 -3
- package/dist/{vue-parser-auedZiJG.mjs.map → vue-parser-5Mp8w-mb.mjs.map} +1 -1
- package/package.json +13 -5
- package/dist/annotations-C-tQVmot.mjs.map +0 -1
- package/dist/availability-Dgcmvv99.mjs.map +0 -1
- package/dist/branch-lifecycle-B6PXZ2N7.mjs.map +0 -1
- package/dist/branch-lifecycle-DhzHfzs3.d.mts.map +0 -1
- package/dist/context-C3x6I3cE.mjs.map +0 -1
- package/dist/local-Db5X9mjZ.mjs.map +0 -1
- package/dist/model-manager-DgyKMjLN.mjs.map +0 -1
- package/dist/ops-BzbThweu.mjs.map +0 -1
- package/dist/paths-CmVw5Cw2.mjs +0 -65
- package/dist/paths-CmVw5Cw2.mjs.map +0 -1
- package/dist/serialization-tmgfFBOh.mjs +0 -2
- package/dist/server-DdxWpNBH.mjs.map +0 -1
- package/dist/transaction-BW9ektWu.mjs.map +0 -1
- package/dist/tsx-parser-Byc7HlJ8.mjs +0 -2
- /package/dist/{index-BWbTJlXm.d.mts → index-ByrVsRJE.d.mts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager-DqwL8ptm.mjs","names":["validateLocale","validateEntryId","validateSlug","tryReadJsonViaReader"],"sources":["../src/core/ops/paths.ts","../src/providers/local/reader.ts","../src/core/content-manager.ts","../src/core/model-manager.ts"],"sourcesContent":["import type { ModelDefinition } from '@contentrain/types'\n\n/**\n * Content-root-relative path helpers for plan-API consumers.\n *\n * These mirror the logic inside `core/content-manager.ts:resolveJsonFilePath`\n * but return forward-slash relative strings suitable for `FileChange.path`.\n * Providers are responsible for resolving these against their backing store\n * (worktree on disk for LocalProvider, git tree path for GitHubProvider, ...).\n *\n * Kept inline to `core/ops/` for now; when Faz 2 finishes migrating every op\n * the legacy absolute-path helpers in `core/content-manager.ts` and\n * `core/meta-manager.ts` will call into these (or be replaced entirely).\n */\n\n/**\n * Content-root-relative content directory for a model (forward-slash paths).\n * Mirrors `resolveContentDir` with an empty `projectRoot`, so reader-backed\n * callers and plan-API consumers share the same path resolution.\n */\nexport function contentDirPath(\n model: Pick<ModelDefinition, 'domain' | 'id' | 'content_path'>,\n): string {\n if (model.content_path) return model.content_path\n return `.contentrain/content/${model.domain}/${model.id}`\n}\n\nfunction contentDir(model: Pick<ModelDefinition, 'domain' | 'id' | 'content_path'>): string {\n return contentDirPath(model)\n}\n\nexport function contentFilePath(\n model: Pick<ModelDefinition, 'id' | 'kind' | 'domain' | 'i18n' | 'content_path' | 'locale_strategy'>,\n locale: string,\n): string {\n const dir = contentDir(model)\n if (!model.i18n) return `${dir}/data.json`\n const strategy = model.locale_strategy ?? 'file'\n switch (strategy) {\n case 'suffix': return `${dir}/${model.id}.${locale}.json`\n case 'directory': return `${dir}/${locale}/${model.id}.json`\n case 'none': return `${dir}/${model.id}.json`\n default: return `${dir}/${locale}.json`\n }\n}\n\nexport function documentFilePath(\n model: Pick<ModelDefinition, 'id' | 'domain' | 'i18n' | 'content_path' | 'locale_strategy'>,\n locale: string,\n slug: string,\n): string {\n const dir = contentDir(model)\n if (!model.i18n) return `${dir}/${slug}.md`\n const strategy = model.locale_strategy ?? 'file'\n switch (strategy) {\n case 'suffix': return `${dir}/${slug}.${locale}.md`\n case 'directory': return `${dir}/${locale}/${slug}.md`\n case 'none': return `${dir}/${slug}.md`\n default: return `${dir}/${slug}/${locale}.md`\n }\n}\n\n/**\n * Content-root-relative meta path.\n *\n * `i18n` is in the Pick and `defaultLocale` is required on purpose. A non-i18n\n * model keeps all its content in one `data.json`, so it has exactly one meta\n * record — pinned to the default locale. Passing the caller's locale straight\n * through used to fan meta out across locales for that single content file\n * (`meta/{id}/tr.json` *and* `meta/{id}/en.json` for one `data.json`), leaving\n * every reader to guess which file was authoritative.\n */\nexport function metaFilePath(\n model: Pick<ModelDefinition, 'id' | 'kind' | 'i18n'>,\n locale: string,\n defaultLocale: string,\n slug?: string,\n): string {\n const base = `.contentrain/meta/${model.id}`\n const effective = model.i18n ? locale : defaultLocale\n if (model.kind === 'document' && slug) {\n return `${base}/${slug}/${effective}.json`\n }\n return `${base}/${effective}.json`\n}\n","import { access, readdir, readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport type { RepoReader } from '../../core/contracts/index.js'\n\n/**\n * LocalReader — `RepoReader` backed by the local filesystem.\n *\n * Paths may be absolute or relative to `projectRoot` (`node:path/resolve`\n * handles both). The `ref` parameter is accepted for interface compatibility\n * but ignored because LocalReader always reads from the working tree.\n *\n * Phase 1: provided as plumbing; core ops still use direct `fs` calls.\n * Phase 2 routes ops through this reader (and through GitHubProvider's reader\n * in Phase 5) so the same op surface works on every backing store.\n */\nexport class LocalReader implements RepoReader {\n constructor(public readonly projectRoot: string) {}\n\n async readFile(path: string, _ref?: string): Promise<string> {\n return readFile(resolve(this.projectRoot, path), 'utf-8')\n }\n\n async listDirectory(path: string, _ref?: string): Promise<string[]> {\n try {\n return await readdir(resolve(this.projectRoot, path))\n } catch {\n return []\n }\n }\n\n async fileExists(path: string, _ref?: string): Promise<boolean> {\n try {\n await access(resolve(this.projectRoot, path))\n return true\n } catch {\n return false\n }\n }\n}\n","import type { ModelDefinition, ContentrainConfig, EntryMeta, LocaleStrategy, DocumentEntry, Vocabulary } from '@contentrain/types'\nimport { validateSlug, validateEntryId, validateLocale, generateEntryId, parseMarkdownFrontmatter, serializeMarkdownFrontmatter } from '@contentrain/types'\nimport { join } from 'node:path'\nimport { rm } from 'node:fs/promises'\nimport { contentrainDir, readDir, readJson, readText, writeJson, writeText } from '../util/fs.js'\nimport { readMeta, writeMeta, deleteMeta, mergeEntryMeta } from './meta-manager.js'\nimport { readModel } from './model-manager.js'\nimport type { RepoReader } from './contracts/index.js'\nimport { contentDirPath, contentFilePath, documentFilePath } from './ops/paths.js'\n\n// Re-export for backward compatibility (MCP internal consumers)\nexport { validateSlug, validateEntryId, validateLocale }\nexport { parseMarkdownFrontmatter as parseFrontmatter, serializeMarkdownFrontmatter as serializeFrontmatter } from '@contentrain/types'\n\n/** Keys named individually in a replacement advisory before it collapses to a count. */\nconst MAX_REPORTED_KEYS = 5\n\n// ─── Content paths ───\n//\n// These take the narrowest `Pick<ModelDefinition, …>` each one actually reads,\n// mirroring `ops/paths.ts`. Path resolution has nothing to do with a model's\n// title or schema, and demanding a whole `ModelDefinition` pushed callers that\n// only have a path-shaped fragment into `as ModelDefinition` casts — which then\n// hide a genuinely missing required property from the compiler.\n\nexport type ContentPathModel = Pick<ModelDefinition, 'id' | 'domain' | 'content_path'>\nexport type LocaleStrategyModel = Pick<ModelDefinition, 'locale_strategy'>\nexport type ContentFileModel = Pick<ModelDefinition, 'id' | 'i18n' | 'locale_strategy'>\n\nexport function resolveContentDir(projectRoot: string, model: ContentPathModel): string {\n if (model.content_path) {\n return join(projectRoot, model.content_path)\n }\n return join(contentrainDir(projectRoot), 'content', model.domain, model.id)\n}\n\nexport function resolveLocaleStrategy(model: LocaleStrategyModel): LocaleStrategy {\n return model.locale_strategy ?? 'file'\n}\n\n/** Build the file path for a JSON content file (singleton/collection/dictionary) */\nexport function resolveJsonFilePath(dir: string, model: ContentFileModel, locale: string): string {\n // When i18n is disabled, always use data.json (locale parameter is ignored)\n if (!model.i18n) return join(dir, 'data.json')\n\n switch (resolveLocaleStrategy(model)) {\n case 'suffix': return join(dir, `${model.id}.${locale}.json`)\n case 'directory': return join(dir, locale, `${model.id}.json`)\n case 'none': return join(dir, `${model.id}.json`)\n case 'file':\n default: return join(dir, `${locale}.json`)\n }\n}\n\n/** Build the file path for a markdown document */\nexport function resolveMdFilePath(dir: string, model: Pick<ModelDefinition, 'i18n' | 'locale_strategy'>, locale: string, slug: string): string {\n // When i18n is disabled, always use {slug}.md (locale parameter is ignored)\n if (!model.i18n) return join(dir, `${slug}.md`)\n\n switch (resolveLocaleStrategy(model)) {\n case 'suffix': return join(dir, `${slug}.${locale}.md`)\n case 'directory': return join(dir, locale, `${slug}.md`)\n case 'none': return join(dir, `${slug}.md`)\n case 'file':\n default: return join(dir, slug, `${locale}.md`)\n }\n}\n\n// ─── Types ───\n\nexport interface ContentEntry {\n id?: string\n slug?: string\n locale?: string\n data: Record<string, unknown>\n}\n\nexport interface WriteResult {\n action: 'created' | 'updated'\n id?: string\n slug?: string\n locale: string\n advisories?: string[]\n}\n\nexport interface DeleteOpts {\n id?: string\n slug?: string\n locale?: string\n keys?: string[]\n /** `config.locales.default` — places a non-i18n model's single meta record. */\n defaultLocale: string\n}\n\nexport interface ListOpts {\n locale?: string\n filter?: Record<string, unknown>\n resolve?: boolean\n limit?: number\n offset?: number\n}\n\n// ─── writeContent ───\n\nexport async function writeContent(\n projectRoot: string,\n model: ModelDefinition,\n entries: ContentEntry[],\n config: ContentrainConfig,\n vocabulary?: Vocabulary | null,\n): Promise<WriteResult[]> {\n const results: WriteResult[] = []\n const defaultLocale = config.locales.default\n\n for (const entry of entries) {\n const locale = entry.locale ?? defaultLocale\n\n // Validate locale\n const localeErr = validateLocale(locale, config)\n if (localeErr) throw new Error(localeErr)\n\n // Validate entry ID if provided\n if (entry.id) {\n const idErr = validateEntryId(entry.id)\n if (idErr) throw new Error(idErr)\n }\n\n // Validate slug if provided\n if (entry.slug) {\n const slugErr = validateSlug(entry.slug)\n if (slugErr) throw new Error(slugErr)\n }\n\n switch (model.kind) {\n case 'singleton': {\n const filePath = resolveJsonFilePath(resolveContentDir(projectRoot, model), model, locale)\n await writeJson(filePath, entry.data)\n const prevMeta = await readMeta(projectRoot, model, { locale, defaultLocale }) as EntryMeta | null\n await writeMeta(projectRoot, model, { locale, defaultLocale }, mergeEntryMeta(prevMeta ?? undefined, entry.data))\n results.push({ action: 'updated', locale })\n break\n }\n\n case 'collection': {\n const isNew = !entry.id\n const id = entry.id ?? generateEntryId()\n const filePath = resolveJsonFilePath(resolveContentDir(projectRoot, model), model, locale)\n const existing = await readJson<Record<string, Record<string, unknown>>>(filePath) ?? {}\n\n const action: 'created' | 'updated' = (isNew || !(id in existing)) ? 'created' : 'updated'\n existing[id] = entry.data\n\n // Sort by entry ID for canonical output\n const sorted: Record<string, Record<string, unknown>> = {}\n for (const key of Object.keys(existing).toSorted()) {\n sorted[key] = existing[key]!\n }\n\n await writeJson(filePath, sorted)\n const prevMetaMap = await readMeta(projectRoot, model, { locale, defaultLocale }) as Record<string, EntryMeta> | null\n await writeMeta(projectRoot, model, { locale, entryId: id, defaultLocale }, mergeEntryMeta(prevMetaMap?.[id], entry.data))\n results.push({ action, id, locale })\n break\n }\n\n case 'document': {\n const slug = entry.slug ?? entry.data['slug'] as string\n if (!slug) throw new Error('Document entries require a slug')\n const slugErr = validateSlug(slug)\n if (slugErr) throw new Error(slugErr)\n\n const incomingFm = { ...entry.data }\n const bodySent = 'body' in incomingFm\n const incomingBody = (incomingFm['body'] as string | undefined) ?? ''\n delete incomingFm['body']\n if (!incomingFm['slug']) incomingFm['slug'] = slug\n\n // Check if existing\n const docPath = resolveMdFilePath(resolveContentDir(projectRoot, model), model, locale, slug)\n const existingRaw = await readText(docPath)\n const action: 'created' | 'updated' = existingRaw ? 'updated' : 'created'\n\n // Merge with what is there, matching `planContentSave`. This path is\n // reached by scaffold and by normalize extract; extracting into a model\n // that already has documents would otherwise replace them wholesale.\n const existingDoc = existingRaw ? parseMarkdownFrontmatter(existingRaw) : null\n const fmData = { ...existingDoc?.frontmatter, ...incomingFm }\n const bodyContent = bodySent ? incomingBody : (existingDoc?.body ?? '')\n\n const mdContent = serializeMarkdownFrontmatter(fmData, bodyContent)\n await writeText(docPath, mdContent)\n const prevMeta = await readMeta(projectRoot, model, { locale, slug, defaultLocale }) as EntryMeta | null\n await writeMeta(projectRoot, model, { locale, slug, defaultLocale }, mergeEntryMeta(prevMeta ?? undefined, entry.data))\n results.push({ action, slug, locale })\n break\n }\n\n case 'dictionary': {\n const filePath = resolveJsonFilePath(resolveContentDir(projectRoot, model), model, locale)\n const existing = await readJson<Record<string, string>>(filePath) ?? {}\n // Duplicate value advisory: warn when a new key maps to a value that already exists\n const advisories: string[] = []\n\n // Replacing a value is reported, not refused — see the same block in\n // `planContentSave`. Correcting a translation is a content decision.\n const incoming = entry.data as Record<string, string>\n const replaced = Object.keys(incoming).filter(\n k => k in existing && existing[k] !== incoming[k],\n )\n if (replaced.length > 0) {\n const shown = replaced.slice(0, MAX_REPORTED_KEYS)\n const detail = shown.map(k => `\"${k}\": \"${existing[k]}\" → \"${incoming[k]}\"`).join(', ')\n const more = replaced.length > shown.length ? `, and ${replaced.length - shown.length} more` : ''\n advisories.push(\n `Dictionary \"${model.id}\" (${locale}): replaced ${replaced.length} existing value(s) — ${detail}${more}.`,\n )\n }\n const reverseMap = new Map<string, string>()\n for (const [k, v] of Object.entries(existing)) {\n reverseMap.set(v, k)\n }\n for (const [newKey, newValue] of Object.entries(entry.data as Record<string, string>)) {\n if (newKey in existing) continue\n const existingKey = reverseMap.get(newValue as string)\n if (existingKey && existingKey !== newKey) {\n advisories.push(\n `Value \"${newValue}\" already exists as key \"${existingKey}\". Consider reusing instead of creating \"${newKey}\".`,\n )\n }\n }\n\n // Vocabulary cross-reference: warn when a value matches a known vocabulary term\n if (vocabulary && Object.keys(vocabulary.terms).length > 0) {\n for (const [newKey, newValue] of Object.entries(entry.data as Record<string, string>)) {\n if (newKey in existing) continue\n for (const [, translations] of Object.entries(vocabulary.terms)) {\n if (Object.values(translations).includes(newValue as string)) {\n advisories.push(\n `Value \"${newValue}\" matches a vocabulary term. Use the canonical form for consistency.`,\n )\n break\n }\n }\n }\n }\n\n const merged = { ...existing, ...entry.data as Record<string, string> }\n await writeJson(filePath, merged)\n const prevMeta = await readMeta(projectRoot, model, { locale, defaultLocale }) as EntryMeta | null\n await writeMeta(projectRoot, model, { locale, defaultLocale }, mergeEntryMeta(prevMeta ?? undefined, entry.data))\n results.push({ action: 'updated', locale, ...(advisories.length > 0 ? { advisories } : {}) })\n break\n }\n }\n }\n\n return results\n}\n\n// ─── deleteContent ───\n\nexport async function deleteContent(\n projectRoot: string,\n model: ModelDefinition,\n opts: DeleteOpts,\n): Promise<string[]> {\n // A non-i18n model stores content locale-agnostically in data.json with a\n // single meta record at the default locale, so a locale-scoped delete is\n // meaningless and destructive (the locale maps onto data.json + the default\n // meta, deleting the shared content and the wrong meta). Reject it; mirrors\n // the same guard in the plan API (`planContentDelete`).\n if (!model.i18n && opts.locale) {\n throw new Error(\n `Model \"${model.id}\" has i18n disabled — its content is locale-agnostic (stored in data.json), `\n + 'so a locale-scoped delete is invalid. Omit \"locale\" to delete the entry, '\n + 'or run contentrain_validate fix:true to remove stray per-locale meta files.',\n )\n }\n\n const removed: string[] = []\n const cDir = resolveContentDir(projectRoot, model)\n\n switch (model.kind) {\n case 'collection': {\n if (!opts.id) throw new Error('Collection delete requires an entry ID')\n const locales = opts.locale\n ? [opts.locale]\n : (await readDir(cDir)).filter(f => f.endsWith('.json')).map(f => f.replace('.json', '').replace(`${model.id}.`, ''))\n\n for (const loc of locales) {\n const filePath = resolveJsonFilePath(cDir, model, loc)\n const data = await readJson<Record<string, unknown>>(filePath)\n if (data && opts.id in data) {\n delete data[opts.id]\n await writeJson(filePath, data)\n removed.push(`content/${model.domain}/${model.id}/${loc}.json#${opts.id}`)\n }\n }\n\n for (const loc of locales) {\n await deleteMeta(projectRoot, model, { locale: loc, entryId: opts.id, defaultLocale: opts.defaultLocale })\n }\n break\n }\n\n case 'document': {\n if (!opts.slug) throw new Error('Document delete requires a slug')\n const slugDelErr = validateSlug(opts.slug)\n if (slugDelErr) throw new Error(slugDelErr)\n\n const strategy = resolveLocaleStrategy(model)\n if (!model.i18n) {\n // No i18n: single {slug}.md file\n await rm(join(cDir, `${opts.slug}.md`), { force: true })\n } else if (strategy === 'file') {\n // slug is a directory — remove entire slug directory\n await rm(join(cDir, opts.slug), { recursive: true, force: true })\n } else if (opts.locale) {\n // Remove specific locale file\n const filePath = resolveMdFilePath(cDir, model, opts.locale, opts.slug)\n await rm(filePath, { force: true })\n } else {\n // Remove all locale files for this slug\n const files = await readDir(strategy === 'directory' ? cDir : cDir)\n for (const f of files) {\n if (strategy === 'suffix' && f.startsWith(`${opts.slug}.`) && f.endsWith('.md')) {\n await rm(join(cDir, f), { force: true })\n } else if (strategy === 'directory') {\n // f is a locale dir — remove slug.md from it\n await rm(join(cDir, f, `${opts.slug}.md`), { force: true })\n } else if (strategy === 'none') {\n if (f === `${opts.slug}.md`) await rm(join(cDir, f), { force: true })\n }\n }\n }\n removed.push(`${model.content_path ?? `content/${model.domain}/${model.id}`}/${opts.slug}`)\n\n await deleteMeta(projectRoot, model, { slug: opts.slug, locale: opts.locale, defaultLocale: opts.defaultLocale })\n break\n }\n\n case 'singleton': {\n if (model.i18n && !opts.locale) throw new Error('Singleton delete requires a locale when i18n is enabled')\n const locale = opts.locale ?? 'data'\n const filePath = resolveJsonFilePath(cDir, model, locale)\n await rm(filePath, { force: true })\n removed.push(model.i18n\n ? `content/${model.domain}/${model.id}/${locale}.json`\n : `content/${model.domain}/${model.id}/data.json`)\n await deleteMeta(projectRoot, model, { locale: model.i18n ? locale : undefined, defaultLocale: opts.defaultLocale })\n break\n }\n\n case 'dictionary': {\n if (model.i18n && !opts.locale) throw new Error('Dictionary delete requires a locale when i18n is enabled')\n const locale = opts.locale ?? 'data'\n const filePath = resolveJsonFilePath(cDir, model, locale)\n\n if (opts.keys?.length) {\n // Delete specific keys from dictionary\n const existing = await readJson<Record<string, string>>(filePath) ?? {}\n const notFound: string[] = []\n for (const key of opts.keys) {\n if (key in existing) {\n delete existing[key]\n } else {\n notFound.push(key)\n }\n }\n if (notFound.length > 0) {\n throw new Error(`Dictionary \"${model.id}\" (${locale}): keys not found — [${notFound.join(', ')}]`)\n }\n await writeJson(filePath, existing)\n removed.push(...opts.keys.map(k => `${model.id}/${locale}:${k}`))\n } else {\n // Delete entire locale file\n await rm(filePath, { force: true })\n removed.push(model.i18n\n ? `content/${model.domain}/${model.id}/${locale}.json`\n : `content/${model.domain}/${model.id}/data.json`)\n await deleteMeta(projectRoot, model, { locale: model.i18n ? locale : undefined, defaultLocale: opts.defaultLocale })\n }\n break\n }\n }\n\n return removed\n}\n\n// ─── listContent ───\n\n/**\n * List content entries for a model. Dual signature:\n *\n * - `listContent(projectRoot, model, opts, config)` — legacy local flow,\n * uses direct filesystem reads and supports `opts.resolve` for\n * cross-model relation hydration.\n * - `listContent(reader, model, opts, config)` — reader-backed flow for\n * remote providers. Basic list works across all four model kinds.\n * `opts.resolve: true` is rejected with an error on remote readers\n * because the cross-model walk requires local filesystem access.\n *\n * The reader-based function lives in {@link listContentViaReader}; the\n * projectRoot-based entry point continues to call the legacy body to\n * preserve bit-for-bit behaviour for every existing caller.\n */\nexport function listContent(\n projectRoot: string,\n model: ModelDefinition,\n opts: ListOpts,\n config: ContentrainConfig,\n): Promise<unknown>\nexport function listContent(\n reader: RepoReader,\n model: ModelDefinition,\n opts: ListOpts,\n config: ContentrainConfig,\n): Promise<unknown>\nexport async function listContent(\n input: string | RepoReader,\n model: ModelDefinition,\n opts: ListOpts,\n config: ContentrainConfig,\n): Promise<unknown> {\n if (typeof input !== 'string') {\n return listContentViaReader(input, model, opts, config)\n }\n return listContentLocal(input, model, opts, config)\n}\n\nasync function listContentLocal(\n projectRoot: string,\n model: ModelDefinition,\n opts: ListOpts,\n config: ContentrainConfig,\n): Promise<unknown> {\n const cDir = resolveContentDir(projectRoot, model)\n const locale = opts.locale ?? config.locales.default\n\n switch (model.kind) {\n case 'singleton': {\n const data = await readJson<Record<string, unknown>>(resolveJsonFilePath(cDir, model, locale))\n return { kind: 'singleton', data: data ?? {}, locale }\n }\n\n case 'collection': {\n const data = await readJson<Record<string, Record<string, unknown>>>(resolveJsonFilePath(cDir, model, locale)) ?? {}\n let entries: Array<Record<string, unknown>> = Object.entries(data).map(([id, fields]) => {\n const entry: Record<string, unknown> = { id }\n Object.assign(entry, fields)\n return entry\n })\n\n // Filter\n if (opts.filter) {\n entries = entries.filter(entry => {\n for (const [key, value] of Object.entries(opts.filter!)) {\n if (entry[key] !== value) return false\n }\n return true\n })\n }\n\n const total = entries.length\n\n // Pagination\n const offset = opts.offset ?? 0\n const limit = opts.limit ?? entries.length\n entries = entries.slice(offset, offset + limit)\n\n // Resolve relations\n if (opts.resolve && model.fields) {\n entries = await resolveRelations(projectRoot, model, entries, locale)\n }\n\n return { kind: 'collection', data: entries, total, locale, offset, limit }\n }\n\n case 'document': {\n const entries: DocumentEntry[] = []\n const strategy = resolveLocaleStrategy(model)\n\n if (!model.i18n) {\n // No i18n: flat {slug}.md files, no locale in path\n const files = await readDir(cDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace('.md', '')\n const raw = await readText(join(cDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n entries.push({ slug, frontmatter, body })\n }\n } else if (strategy === 'file') {\n // Each slug is a subdirectory containing locale.md files\n const slugDirs = await readDir(cDir)\n for (const slug of slugDirs) {\n const raw = await readText(join(cDir, slug, `${locale}.md`))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n entries.push({ slug, frontmatter, body })\n }\n } else if (strategy === 'suffix') {\n // Files like {slug}.{locale}.md in flat directory\n const files = await readDir(cDir)\n const suffix = `.${locale}.md`\n for (const f of files) {\n if (!f.endsWith(suffix)) continue\n const slug = f.slice(0, -suffix.length)\n const raw = await readText(join(cDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n entries.push({ slug, frontmatter, body })\n }\n } else if (strategy === 'directory') {\n // Files in {locale}/ directory as {slug}.md\n const localeDir = join(cDir, locale)\n const files = await readDir(localeDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace('.md', '')\n const raw = await readText(join(localeDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n entries.push({ slug, frontmatter, body })\n }\n } else {\n // none — {slug}.md, no locale in filename\n const files = await readDir(cDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace('.md', '')\n const raw = await readText(join(cDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n entries.push({ slug, frontmatter, body })\n }\n }\n\n const total = entries.length\n const offset = opts.offset ?? 0\n const limit = opts.limit ?? entries.length\n const paged = entries.slice(offset, offset + limit)\n\n return { kind: 'document', data: paged, total, locale, offset, limit }\n }\n\n case 'dictionary': {\n const data = await readJson<Record<string, string>>(resolveJsonFilePath(cDir, model, locale)) ?? {}\n return { kind: 'dictionary', data, total_keys: Object.keys(data).length, locale }\n }\n }\n}\n\nasync function tryReadJsonViaReader<T>(reader: RepoReader, path: string): Promise<T | null> {\n try {\n return JSON.parse(await reader.readFile(path)) as T\n } catch {\n return null\n }\n}\n\nasync function tryReadTextViaReader(reader: RepoReader, path: string): Promise<string | null> {\n try {\n return await reader.readFile(path)\n } catch {\n return null\n }\n}\n\nasync function listContentViaReader(\n reader: RepoReader,\n model: ModelDefinition,\n opts: ListOpts,\n config: ContentrainConfig,\n): Promise<unknown> {\n if (opts.resolve) {\n throw new Error(\n 'contentrain_content_list with resolve:true requires local filesystem access. '\n + 'Use a LocalProvider (stdio or HTTP+LocalProvider) or omit resolve:true.',\n )\n }\n\n const cDir = contentDirPath(model)\n const locale = opts.locale ?? config.locales.default\n\n switch (model.kind) {\n case 'singleton': {\n const data = await tryReadJsonViaReader<Record<string, unknown>>(reader, contentFilePath(model, locale))\n return { kind: 'singleton', data: data ?? {}, locale }\n }\n\n case 'collection': {\n const data = await tryReadJsonViaReader<Record<string, Record<string, unknown>>>(\n reader,\n contentFilePath(model, locale),\n ) ?? {}\n let entries: Array<Record<string, unknown>> = Object.entries(data).map(([id, fields]) => {\n const entry: Record<string, unknown> = { id }\n Object.assign(entry, fields)\n return entry\n })\n\n if (opts.filter) {\n entries = entries.filter(entry => {\n for (const [key, value] of Object.entries(opts.filter!)) {\n if (entry[key] !== value) return false\n }\n return true\n })\n }\n\n const total = entries.length\n const offset = opts.offset ?? 0\n const limit = opts.limit ?? entries.length\n entries = entries.slice(offset, offset + limit)\n\n return { kind: 'collection', data: entries, total, locale, offset, limit }\n }\n\n case 'document': {\n const entries: DocumentEntry[] = []\n const strategy = resolveLocaleStrategy(model)\n\n const collectEntry = async (relPath: string, slug: string): Promise<void> => {\n const raw = await tryReadTextViaReader(reader, relPath)\n if (!raw) return\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n entries.push({ slug, frontmatter, body })\n }\n\n if (!model.i18n) {\n const files = await reader.listDirectory(cDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n await collectEntry(documentFilePath(model, locale, f.replace(/\\.md$/u, '')), f.replace(/\\.md$/u, ''))\n }\n } else if (strategy === 'file') {\n const slugDirs = await reader.listDirectory(cDir)\n for (const slug of slugDirs) {\n await collectEntry(documentFilePath(model, locale, slug), slug)\n }\n } else if (strategy === 'suffix') {\n const files = await reader.listDirectory(cDir)\n const suffix = `.${locale}.md`\n for (const f of files) {\n if (!f.endsWith(suffix)) continue\n const slug = f.slice(0, -suffix.length)\n await collectEntry(documentFilePath(model, locale, slug), slug)\n }\n } else if (strategy === 'directory') {\n const files = await reader.listDirectory(`${cDir}/${locale}`)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace(/\\.md$/u, '')\n await collectEntry(documentFilePath(model, locale, slug), slug)\n }\n } else {\n const files = await reader.listDirectory(cDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace(/\\.md$/u, '')\n await collectEntry(documentFilePath(model, locale, slug), slug)\n }\n }\n\n const total = entries.length\n const offset = opts.offset ?? 0\n const limit = opts.limit ?? entries.length\n const paged = entries.slice(offset, offset + limit)\n\n return { kind: 'document', data: paged, total, locale, offset, limit }\n }\n\n case 'dictionary': {\n const data = await tryReadJsonViaReader<Record<string, string>>(reader, contentFilePath(model, locale)) ?? {}\n return { kind: 'dictionary', data, total_keys: Object.keys(data).length, locale }\n }\n }\n}\n\n// ─── readContent (for external use / relation resolving) ───\n\nexport async function readContent(\n projectRoot: string,\n model: ModelDefinition,\n opts: { locale: string; entryId?: string; slug?: string },\n): Promise<unknown> {\n const cDir = resolveContentDir(projectRoot, model)\n\n switch (model.kind) {\n case 'singleton':\n return readJson<Record<string, unknown>>(resolveJsonFilePath(cDir, model, opts.locale))\n\n case 'collection': {\n if (!opts.entryId) return null\n const data = await readJson<Record<string, Record<string, unknown>>>(resolveJsonFilePath(cDir, model, opts.locale))\n return data?.[opts.entryId] ? { id: opts.entryId, ...data[opts.entryId] } : null\n }\n\n case 'document': {\n if (!opts.slug) return null\n const raw = await readText(resolveMdFilePath(cDir, model, opts.locale, opts.slug))\n if (!raw) return null\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n return { slug: opts.slug, ...frontmatter, body }\n }\n\n case 'dictionary':\n return readJson<Record<string, string>>(resolveJsonFilePath(cDir, model, opts.locale))\n }\n}\n\n// ─── Relation resolving ───\n\nasync function resolveRelations(\n projectRoot: string,\n model: ModelDefinition,\n entries: Array<Record<string, unknown>>,\n locale: string,\n): Promise<Array<Record<string, unknown>>> {\n if (!model.fields) return entries\n\n const relationFields: Array<{ name: string; targetModels: string[]; multi: boolean }> = []\n for (const [name, field] of Object.entries(model.fields)) {\n if (field.type === 'relation' || field.type === 'relations') {\n const targets = Array.isArray(field.model) ? field.model : field.model ? [field.model] : []\n relationFields.push({ name, targetModels: targets, multi: field.type === 'relations' })\n }\n }\n\n if (relationFields.length === 0) return entries\n\n // Load target model contents into cache (with circular reference protection)\n const targetCache: Record<string, Record<string, Record<string, unknown>>> = {}\n const visited = new Set<string>([model.id])\n\n for (const rf of relationFields) {\n for (const targetModelId of rf.targetModels) {\n if (targetCache[targetModelId] || visited.has(targetModelId)) continue\n visited.add(targetModelId)\n\n const targetModel = await readModel(projectRoot, targetModelId)\n if (!targetModel) continue\n\n if (targetModel.kind === 'collection') {\n const targetData = await readJson<Record<string, Record<string, unknown>>>(\n resolveJsonFilePath(resolveContentDir(projectRoot, targetModel), targetModel, locale),\n ) ?? {}\n targetCache[targetModelId] = targetData\n } else if (targetModel.kind === 'document') {\n // Build slug-keyed cache by listing document entries for this locale\n const docCache: Record<string, Record<string, unknown>> = {}\n const cDir = resolveContentDir(projectRoot, targetModel)\n const strategy = resolveLocaleStrategy(targetModel)\n\n if (!targetModel.i18n) {\n const files = await readDir(cDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace('.md', '')\n const raw = await readText(join(cDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n docCache[slug] = { slug, ...frontmatter, body }\n }\n } else if (strategy === 'file') {\n const slugDirs = await readDir(cDir)\n for (const slug of slugDirs) {\n const raw = await readText(join(cDir, slug, `${locale}.md`))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n docCache[slug] = { slug, ...frontmatter, body }\n }\n } else if (strategy === 'suffix') {\n const files = await readDir(cDir)\n const suffix = `.${locale}.md`\n for (const f of files) {\n if (!f.endsWith(suffix)) continue\n const slug = f.slice(0, -suffix.length)\n const raw = await readText(join(cDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n docCache[slug] = { slug, ...frontmatter, body }\n }\n } else if (strategy === 'directory') {\n const localeDir = join(cDir, locale)\n const files = await readDir(localeDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace('.md', '')\n const raw = await readText(join(localeDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n docCache[slug] = { slug, ...frontmatter, body }\n }\n } else {\n // 'none' strategy\n const files = await readDir(cDir)\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n const slug = f.replace('.md', '')\n const raw = await readText(join(cDir, f))\n if (!raw) continue\n const { frontmatter, body } = parseMarkdownFrontmatter(raw)\n docCache[slug] = { slug, ...frontmatter, body }\n }\n }\n\n targetCache[targetModelId] = docCache\n }\n }\n }\n\n return entries.map(entry => {\n const resolved = { ...entry }\n for (const rf of relationFields) {\n const value = resolved[rf.name]\n if (!value) continue\n\n if (rf.multi && Array.isArray(value)) {\n resolved[rf.name] = value.map(id => {\n for (const targetModelId of rf.targetModels) {\n const cached = targetCache[targetModelId]?.[id as string]\n if (cached) return { id, ...cached }\n }\n return id\n })\n } else if (typeof value === 'string') {\n for (const targetModelId of rf.targetModels) {\n const cached = targetCache[targetModelId]?.[value]\n if (cached) {\n resolved[rf.name] = { id: value, ...cached }\n break\n }\n }\n }\n }\n return resolved\n })\n}\n","import type { FieldType, ModelDefinition, ModelSummary } from '@contentrain/types'\nimport { DICTIONARY_TITLE_FIELD, isTitleFieldType, LOCALE_PATTERN, MODEL_FIELD_ORDER, TITLE_FIELD_TYPES } from '@contentrain/types'\nimport { join } from 'node:path'\nimport { rm } from 'node:fs/promises'\nimport { z } from 'zod'\nimport { contentrainDir, ensureDir, readDir, readJson, writeJson } from '../util/fs.js'\nimport type { RepoReader } from './contracts/index.js'\nimport { LocalReader } from '../providers/local/reader.js'\nimport { resolveContentDir, resolveLocaleStrategy } from './content-manager.js'\nimport { contentDirPath } from './ops/paths.js'\n\nexport type { ModelSummary } from '@contentrain/types'\n// Re-exported so `packages/rules` and `packages/skills` — which devDep\n// @contentrain/mcp but not @contentrain/types — can assert docs parity\n// against the canonical key list without taking a new dependency.\nexport { MODEL_FIELD_ORDER } from '@contentrain/types'\n\nconst MODELS_DIR_PATH = '.contentrain/models'\n\nasync function tryReadJsonViaReader<T>(reader: RepoReader, path: string): Promise<T | null> {\n try {\n return JSON.parse(await reader.readFile(path)) as T\n } catch {\n return null\n }\n}\n\n/**\n * List every model defined under `.contentrain/models/*.json`.\n *\n * Accepts either a legacy `projectRoot` string (filesystem walk) or any\n * `RepoReader` — HTTP-hosted callers pass their `GitHubProvider` so the\n * same helper resolves model metadata over the Git Data API.\n */\nexport function listModels(projectRoot: string): Promise<ModelSummary[]>\nexport function listModels(reader: RepoReader): Promise<ModelSummary[]>\nexport async function listModels(input: string | RepoReader): Promise<ModelSummary[]> {\n let files: string[]\n let load: (file: string) => Promise<ModelDefinition | null>\n\n if (typeof input === 'string') {\n const modelsDir = join(contentrainDir(input), 'models')\n files = await readDir(modelsDir)\n load = file => readJson<ModelDefinition>(join(modelsDir, file))\n } else {\n files = await input.listDirectory(MODELS_DIR_PATH)\n load = file => tryReadJsonViaReader<ModelDefinition>(input, `${MODELS_DIR_PATH}/${file}`)\n }\n\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n const models = await Promise.all(jsonFiles.map(load))\n\n return models\n .filter((m): m is ModelDefinition => m !== null && !!m.id)\n .map(model => ({\n id: model.id,\n kind: model.kind,\n domain: model.domain,\n i18n: model.i18n,\n fields: model.fields ? Object.keys(model.fields).length : 0,\n }))\n .toSorted((a, b) => a.id.localeCompare(b.id, 'en'))\n}\n\n/**\n * Read a single model definition. Same dual signature as {@link listModels}.\n */\nexport function readModel(projectRoot: string, modelId: string): Promise<ModelDefinition | null>\nexport function readModel(reader: RepoReader, modelId: string): Promise<ModelDefinition | null>\nexport async function readModel(input: string | RepoReader, modelId: string): Promise<ModelDefinition | null> {\n if (typeof input === 'string') {\n const filePath = join(contentrainDir(input), 'models', `${modelId}.json`)\n return readJson<ModelDefinition>(filePath)\n }\n return tryReadJsonViaReader<ModelDefinition>(input, `${MODELS_DIR_PATH}/${modelId}.json`)\n}\n\nasync function countDocumentFileStrategy(\n reader: RepoReader,\n contentDir: string,\n entries: string[],\n): Promise<{ total: number, locales: Record<string, number> }> {\n const locales: Record<string, number> = {}\n let total = 0\n\n const results = await Promise.all(\n entries.map(async (entry) => {\n const localeFiles = await reader.listDirectory(`${contentDir}/${entry}`)\n return localeFiles\n .map(lf => lf.replace(/\\.(json|md|mdx)$/, ''))\n .filter((locale, i) => locale !== localeFiles[i])\n }),\n )\n\n for (const entryLocales of results) {\n for (const locale of entryLocales) {\n locales[locale] = (locales[locale] ?? 0) + 1\n total++\n }\n }\n\n return { total, locales }\n}\n\nasync function countDocumentSuffixStrategy(\n _reader: RepoReader,\n _contentDir: string,\n files: string[],\n): Promise<{ total: number, locales: Record<string, number> }> {\n const locales: Record<string, number> = {}\n const slugsByLocale: Record<string, Set<string>> = {}\n\n for (const f of files) {\n if (!f.endsWith('.md')) continue\n // Pattern: {slug}.{locale}.md\n const match = f.match(/^(.+)\\.([a-z]{2}(?:-[A-Z]{2})?)\\.md$/)\n if (!match) continue\n const locale = match[2]!\n if (!slugsByLocale[locale]) slugsByLocale[locale] = new Set()\n slugsByLocale[locale].add(match[1]!)\n }\n\n let total = 0\n for (const [locale, slugs] of Object.entries(slugsByLocale)) {\n locales[locale] = slugs.size\n total += slugs.size\n }\n\n return { total, locales }\n}\n\nasync function countDocumentDirectoryStrategy(\n reader: RepoReader,\n contentDir: string,\n localeDirs: string[],\n): Promise<{ total: number, locales: Record<string, number> }> {\n const locales: Record<string, number> = {}\n let total = 0\n\n const results = await Promise.all(\n localeDirs.map(async (localeDir) => {\n const files = await reader.listDirectory(`${contentDir}/${localeDir}`)\n const mdFiles = files.filter(f => f.endsWith('.md'))\n return { locale: localeDir, count: mdFiles.length }\n }),\n )\n\n for (const { locale, count } of results) {\n locales[locale] = count\n total += count\n }\n\n return { total, locales }\n}\n\nasync function countDocumentNoneStrategy(\n reader: RepoReader,\n modelId: string,\n files: string[],\n i18n: boolean,\n): Promise<{ total: number, locales: Record<string, number> }> {\n const mdFiles = files.filter(f => f.endsWith('.md'))\n\n if (!i18n) {\n return { total: mdFiles.length, locales: { _: mdFiles.length } }\n }\n\n // With i18n + none strategy, content files have no locale info.\n // Use meta/{modelId}/{slug}/ directories to determine locale counts.\n const metaDir = `.contentrain/meta/${modelId}`\n const locales: Record<string, number> = {}\n let total = 0\n\n const slugs = mdFiles.map(f => f.replace('.md', ''))\n const results = await Promise.all(\n slugs.map(async (slug) => {\n const metaFiles = await reader.listDirectory(`${metaDir}/${slug}`)\n return metaFiles\n .filter(f => f.endsWith('.json'))\n .map(f => f.replace('.json', ''))\n }),\n )\n\n for (const slugLocales of results) {\n for (const locale of slugLocales) {\n locales[locale] = (locales[locale] ?? 0) + 1\n total++\n }\n }\n\n return { total, locales }\n}\n\nasync function countCollectionEntries(\n reader: RepoReader,\n contentDir: string,\n jsonFiles: string[],\n): Promise<{ total: number, locales: Record<string, number> }> {\n const locales: Record<string, number> = {}\n let total = 0\n\n const results = await Promise.all(\n jsonFiles.map(async (file) => {\n const locale = file.replace(/\\.json$/, '')\n const data = await tryReadJsonViaReader<Record<string, unknown>>(reader, `${contentDir}/${file}`)\n return { locale, count: data ? Object.keys(data).length : 0 }\n }),\n )\n\n for (const { locale, count } of results) {\n locales[locale] = count\n total += count\n }\n\n return { total, locales }\n}\n\n/**\n * Count content entries across locales for a model.\n *\n * Accepts either a legacy `projectRoot` string (wraps LocalReader internally)\n * or any `RepoReader` — so remote providers (GitHubProvider) feed the same\n * counting logic via the Git Data API.\n */\nexport function countEntries(\n projectRoot: string,\n model: ModelDefinition,\n): Promise<{ total: number, locales: Record<string, number> }>\nexport function countEntries(\n reader: RepoReader,\n model: ModelDefinition,\n): Promise<{ total: number, locales: Record<string, number> }>\nexport async function countEntries(\n input: string | RepoReader,\n model: ModelDefinition,\n): Promise<{ total: number, locales: Record<string, number> }> {\n const reader: RepoReader = typeof input === 'string' ? new LocalReader(input) : input\n const cDir = contentDirPath(model)\n const strategy = resolveLocaleStrategy(model)\n const files = await reader.listDirectory(cDir)\n\n if (model.kind === 'document') {\n if (!model.i18n) {\n // No i18n: flat {slug}.md files\n return countDocumentNoneStrategy(reader, model.id, files, false)\n }\n\n switch (strategy) {\n case 'file':\n return countDocumentFileStrategy(reader, cDir, files)\n case 'suffix':\n return countDocumentSuffixStrategy(reader, cDir, files)\n case 'directory':\n return countDocumentDirectoryStrategy(reader, cDir, files)\n case 'none':\n return countDocumentNoneStrategy(reader, model.id, files, true)\n }\n }\n\n if (model.kind === 'collection') {\n if (!model.i18n) {\n // Non-i18n: single data.json\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n return countCollectionEntries(reader, cDir, jsonFiles)\n }\n switch (strategy) {\n case 'suffix': {\n // Files: {model}.{locale}.json\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n const locales: Record<string, number> = {}\n for (const f of jsonFiles) {\n const match = f.match(/^.+\\.([a-z]{2}(?:-[A-Z]{2})?)\\.json$/)\n if (match) {\n const data = await tryReadJsonViaReader<Record<string, unknown>>(reader, `${cDir}/${f}`)\n locales[match[1]!] = data ? Object.keys(data).length : 0\n }\n }\n const total = Object.values(locales).reduce((a, b) => a + b, 0)\n return { total, locales }\n }\n case 'directory': {\n // Dirs: {locale}/... containing json files\n const locales: Record<string, number> = {}\n let total = 0\n for (const localeDir of files) {\n const subFiles = await reader.listDirectory(`${cDir}/${localeDir}`)\n const jsonFile = subFiles.find(f => f.endsWith('.json'))\n if (jsonFile) {\n const data = await tryReadJsonViaReader<Record<string, unknown>>(reader, `${cDir}/${localeDir}/${jsonFile}`)\n const count = data ? Object.keys(data).length : 0\n locales[localeDir] = count\n total += count\n }\n }\n return { total, locales }\n }\n case 'none': {\n // Single file: {model}.json — count entries inside\n const noneFile = files.find(f => f === `${model.id}.json`)\n if (!noneFile) return { total: 0, locales: {} }\n const data = await tryReadJsonViaReader<Record<string, unknown>>(reader, `${cDir}/${noneFile}`)\n const count = data ? Object.keys(data).length : 0\n return { total: count, locales: { _: count } }\n }\n default: {\n // 'file': {locale}.json\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n return countCollectionEntries(reader, cDir, jsonFiles)\n }\n }\n }\n\n // singleton / dictionary — one entry per locale file\n if (!model.i18n) {\n // Non-i18n: single data.json\n const hasData = files.some(f => f === 'data.json')\n return { total: hasData ? 1 : 0, locales: {} }\n }\n\n switch (strategy) {\n case 'suffix': {\n // Files: {model}.{locale}.json\n const locales: Record<string, number> = {}\n for (const f of files) {\n const match = f.match(/^.+\\.([a-z]{2}(?:-[A-Z]{2})?)\\.json$/)\n if (match) locales[match[1]!] = 1\n }\n return { total: Object.keys(locales).length, locales }\n }\n case 'directory': {\n // Dirs: {locale}/...\n const locales: Record<string, number> = {}\n for (const localeDir of files) {\n const subFiles = await reader.listDirectory(`${cDir}/${localeDir}`)\n if (subFiles.some(f => f.endsWith('.json'))) {\n locales[localeDir] = 1\n }\n }\n return { total: Object.keys(locales).length, locales }\n }\n case 'none': {\n // Single file: {model}.json\n const hasFile = files.some(f => f === `${model.id}.json`)\n return { total: hasFile ? 1 : 0, locales: {} }\n }\n default: {\n // 'file': {locale}.json\n const jsonFiles = files.filter(f => f.endsWith('.json'))\n const locales: Record<string, number> = {}\n for (const file of jsonFiles) {\n locales[file.replace(/\\.json$/, '')] = 1\n }\n return { total: jsonFiles.length, locales }\n }\n }\n}\n\nexport async function writeModel(projectRoot: string, model: ModelDefinition): Promise<void> {\n const filePath = join(contentrainDir(projectRoot), 'models', `${model.id}.json`)\n await writeJson(filePath, model, MODEL_FIELD_ORDER)\n\n // Ensure content and meta directories exist (respects content_path)\n await ensureDir(resolveContentDir(projectRoot, model))\n await ensureDir(join(contentrainDir(projectRoot), 'meta', model.id))\n}\n\nexport async function deleteModel(projectRoot: string, modelId: string): Promise<string[]> {\n const model = await readModel(projectRoot, modelId)\n if (!model) return []\n\n const crDir = contentrainDir(projectRoot)\n const removed: string[] = []\n\n const modelPath = join(crDir, 'models', `${modelId}.json`)\n const contentPath = resolveContentDir(projectRoot, model)\n const metaPath = join(crDir, 'meta', modelId)\n\n await rm(modelPath, { force: true })\n removed.push(`models/${modelId}.json`)\n\n try {\n await rm(contentPath, { recursive: true, force: true })\n removed.push(model.content_path ?? `content/${model.domain}/${modelId}/`)\n } catch {\n // directory may not exist\n }\n\n try {\n await rm(metaPath, { recursive: true, force: true })\n removed.push(`meta/${modelId}/`)\n } catch {\n // directory may not exist\n }\n\n return removed\n}\n\nexport interface ModelReference {\n model: string\n field: string\n type: 'relation' | 'relations'\n}\n\n/**\n * Enumerate models that reference `modelId` through relation or relations\n * fields. Used by `model_delete` to block destructive deletes when other\n * models still depend on the target.\n *\n * Accepts either a legacy `projectRoot` string (LocalReader wraps internally)\n * or any `RepoReader` — remote providers get the same pre-check.\n */\nexport function checkReferences(projectRoot: string, modelId: string): Promise<ModelReference[]>\nexport function checkReferences(reader: RepoReader, modelId: string): Promise<ModelReference[]>\nexport async function checkReferences(\n input: string | RepoReader,\n modelId: string,\n): Promise<ModelReference[]> {\n const summaries = typeof input === 'string' ? await listModels(input) : await listModels(input)\n const others = summaries.filter(s => s.id !== modelId)\n\n const models = await Promise.all(\n others.map(s => typeof input === 'string' ? readModel(input, s.id) : readModel(input, s.id)),\n )\n\n const refs: ModelReference[] = []\n for (const model of models) {\n if (!model?.fields) continue\n\n for (const [fieldName, fieldDef] of Object.entries(model.fields)) {\n if (fieldDef.type !== 'relation' && fieldDef.type !== 'relations') continue\n const targets = Array.isArray(fieldDef.model) ? fieldDef.model : [fieldDef.model]\n if (targets.includes(modelId)) {\n refs.push({ model: model.id, field: fieldName, type: fieldDef.type })\n }\n }\n }\n\n return refs\n}\n\n// ─── Shared Field Type Catalog ───\n\nexport const FIELD_TYPE_ENUM = [\n 'string', 'text', 'email', 'url', 'slug', 'color', 'phone', 'code', 'icon',\n 'markdown', 'richtext',\n 'number', 'integer', 'decimal', 'percent', 'rating',\n 'boolean', 'date', 'datetime',\n 'image', 'video', 'file',\n 'relation', 'relations',\n 'select', 'array', 'object',\n] as const\n\n/**\n * Shared Zod schema for field definitions.\n * Used by both model_save and normalize extract for full parity.\n *\n * `.strict()` is load-bearing: the default `z.object` *strips* unknown keys, so a\n * typo'd constraint (`requird: true`) used to vanish without a word and the field\n * silently lost the rule its author thought they had declared.\n */\nexport const fieldDefZodSchema: z.ZodType<Record<string, unknown>> = z.record(z.string(), z.object({\n type: z.enum(FIELD_TYPE_ENUM).describe('Field type from the 27-type catalog'),\n required: z.boolean().optional(),\n unique: z.boolean().optional(),\n default: z.unknown().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n pattern: z.string().optional(),\n options: z.array(z.string()).optional(),\n model: z.union([z.string(), z.array(z.string())]).optional(),\n items: z.union([z.string(), z.lazy(() => z.record(z.string(), z.unknown()))]).optional(),\n fields: z.lazy(() => z.record(z.string(), z.unknown())).optional(),\n accept: z.string().optional(),\n maxSize: z.number().optional(),\n description: z.string().optional(),\n label: z.union([z.string(), z.record(z.string(), z.string())]).optional()\n .describe('Editor label. A string is one label for all locales; an object keyed by locale carries a translation each.'),\n order: z.number().optional()\n .describe('Display position, ascending. Fields without one sort last, alphabetically. Fractional values allowed.'),\n}).strict().refine(\n (f) => {\n if ((f.type === 'relation' || f.type === 'relations') && !f.model) return false\n if (f.type === 'select' && (!f.options || f.options.length === 0)) return false\n return true\n },\n { message: 'relation/relations requires \"model\", select requires non-empty \"options\"' },\n))\n\n// ─── Model Validation (shared between model_save and normalize extract) ───\n\nconst VALID_FIELD_TYPES = new Set<string>(FIELD_TYPE_ENUM)\n\n/** Field types whose value is a path/URL to a media asset. */\nconst MEDIA_FIELD_TYPES = new Set<string>(['image', 'video', 'file'])\n/** Bounds `items`/`fields` nesting; far above any real schema. */\nconst MAX_SCHEMA_DEPTH = 10\n\nexport interface ModelDefinitionIssues {\n /** Block the write. */\n errors: string[]\n /** Surface to the caller; the write proceeds. */\n warnings: string[]\n}\n\ninterface RawFieldDef {\n type?: string\n required?: unknown\n unique?: unknown\n default?: unknown\n min?: unknown\n max?: unknown\n pattern?: unknown\n options?: unknown\n model?: unknown\n items?: unknown\n fields?: unknown\n accept?: unknown\n maxSize?: unknown\n label?: unknown\n order?: unknown\n}\n\n/**\n * Check one field definition, recursing into `fields` and `items`.\n *\n * The governing rule: **do not accept a constraint that will not be enforced.**\n * A constraint that silently does nothing is worse than no constraint, because\n * the author stops looking. So a property declared where it cannot apply is an\n * error, and a property we genuinely cannot enforce says so out loud.\n */\nfunction checkFieldDef(\n raw: unknown,\n path: string,\n modelKind: string,\n errors: string[],\n warnings: string[],\n depth: number,\n): void {\n if (typeof raw !== 'object' || raw === null) {\n errors.push(`Field \"${path}\": must be an object`)\n return\n }\n if (depth > MAX_SCHEMA_DEPTH) {\n errors.push(`Field \"${path}\": exceeds the maximum nesting depth of ${MAX_SCHEMA_DEPTH}`)\n return\n }\n\n const def = raw as RawFieldDef\n const type = def.type\n\n if (!type || !VALID_FIELD_TYPES.has(type)) {\n errors.push(`Field \"${path}\": invalid type \"${type}\"`)\n return\n }\n\n // Presentation. Wrong here is not fatal to a write, but a locale-keyed label\n // whose keys are not locales is the same inversion the vocabulary hits, and\n // it silently resolves to nothing.\n if (def.label !== undefined) {\n if (typeof def.label === 'string') {\n if (def.label.trim() === '') errors.push(`Field \"${path}\": \"label\" is empty`)\n } else if (typeof def.label === 'object' && def.label !== null && !Array.isArray(def.label)) {\n const entries = Object.entries(def.label as Record<string, unknown>)\n if (entries.length === 0) errors.push(`Field \"${path}\": \"label\" has no translations`)\n for (const [locale, value] of entries) {\n if (!LOCALE_PATTERN.test(locale)) {\n errors.push(`Field \"${path}\": \"label\" key \"${locale}\" is not a locale code. A per-locale label nests as { \"en\": \"…\", \"tr\": \"…\" }.`)\n }\n if (typeof value !== 'string' || value.trim() === '') {\n errors.push(`Field \"${path}\": \"label\" for \"${locale}\" must be a non-empty string`)\n }\n }\n } else {\n errors.push(`Field \"${path}\": \"label\" must be a string, or an object keyed by locale`)\n }\n }\n if (def.order !== undefined && (typeof def.order !== 'number' || !Number.isFinite(def.order))) {\n errors.push(`Field \"${path}\": \"order\" must be a finite number`)\n }\n\n if ((type === 'relation' || type === 'relations') && !def.model) {\n errors.push(`Field \"${path}\": ${type} type requires \"model\" property`)\n }\n if (type === 'select' && (!Array.isArray(def.options) || def.options.length === 0)) {\n errors.push(`Field \"${path}\": select type requires non-empty \"options\" array`)\n }\n\n // An object with no shape is a field nothing can validate and no editor can\n // render — it shows as an empty frame. A warning, not an error: it is a\n // legitimate intermediate state while a schema is being designed.\n if (type === 'object' && (!def.fields || typeof def.fields !== 'object' || Object.keys(def.fields as Record<string, unknown>).length === 0)) {\n warnings.push(`Field \"${path}\": \"object\" with no \"fields\" — nothing validates it and no editor can render it. Declare its shape, or use a plain type.`)\n }\n // The reverse direction was never checked, so `options` on a string field was\n // accepted and then silently ignored at validation time.\n if (def.options !== undefined && type !== 'select') {\n errors.push(`Field \"${path}\": \"options\" only applies to select fields — it is ignored on \"${type}\"`)\n }\n if (def.items !== undefined && type !== 'array') {\n errors.push(`Field \"${path}\": \"items\" only applies to array fields — it is ignored on \"${type}\"`)\n }\n if (def.fields !== undefined && type !== 'object') {\n errors.push(`Field \"${path}\": \"fields\" only applies to object fields — it is ignored on \"${type}\"`)\n }\n if (def.accept !== undefined && !MEDIA_FIELD_TYPES.has(type)) {\n errors.push(`Field \"${path}\": \"accept\" only applies to image/video/file fields — it is ignored on \"${type}\"`)\n }\n if (def.maxSize !== undefined && !MEDIA_FIELD_TYPES.has(type)) {\n errors.push(`Field \"${path}\": \"maxSize\" only applies to image/video/file fields — it is ignored on \"${type}\"`)\n }\n\n // A singleton holds one record per locale, so there is nothing for a value to\n // be unique against.\n if (def.unique === true && modelKind === 'singleton') {\n errors.push(`Field \"${path}\": \"unique\" has no meaning on a singleton — the model holds a single record per locale`)\n }\n\n if (typeof def.min === 'number' && typeof def.max === 'number' && def.min > def.max) {\n errors.push(`Field \"${path}\": min (${def.min}) is greater than max (${def.max})`)\n }\n\n // Compile the regex here rather than let it fail once per entry at validation\n // time, where it degrades to a warning and silently disables the constraint.\n if (typeof def.pattern === 'string') {\n try {\n // eslint-disable-next-line no-new\n new RegExp(def.pattern)\n } catch {\n errors.push(`Field \"${path}\": \"pattern\" is not a valid regular expression — /${def.pattern}/`)\n }\n }\n\n if (def.default !== undefined) {\n checkDefaultCoherence(def, type, path, errors)\n }\n\n // `max` on a media field measures the length of the stored path string, not\n // the file — almost certainly not what the author meant.\n if (typeof def.max === 'number' && MEDIA_FIELD_TYPES.has(type)) {\n warnings.push(\n `Field \"${path}\": \"max\" on a ${type} field limits the length of the stored path string, not the file size. Use \"maxSize\" for bytes.`,\n )\n }\n\n // Said plainly rather than accepted in silence: MCP holds a path, never the\n // bytes, so it cannot check this. The provider owns the policy at ingest.\n if (def.maxSize !== undefined && MEDIA_FIELD_TYPES.has(type)) {\n warnings.push(\n `Field \"${path}\": \"maxSize\" is not enforced by MCP — it has no access to the file. Your media provider enforces it when the asset is ingested.`,\n )\n }\n\n if (def.fields !== undefined && typeof def.fields === 'object' && def.fields !== null) {\n for (const [nested, nestedDef] of Object.entries(def.fields as Record<string, unknown>)) {\n if (!/^[a-z][a-z0-9_]*$/.test(nested)) {\n errors.push(`Field \"${path}.${nested}\": invalid name — must be snake_case starting with letter`)\n }\n checkFieldDef(nestedDef, `${path}.${nested}`, modelKind, errors, warnings, depth + 1)\n }\n }\n\n if (typeof def.items === 'string') {\n if (!VALID_FIELD_TYPES.has(def.items)) {\n errors.push(`Field \"${path}.items\": invalid type \"${def.items}\"`)\n }\n } else if (def.items !== undefined) {\n checkFieldDef(def.items, `${path}.items`, modelKind, errors, warnings, depth + 1)\n }\n}\n\n/** A default that its own field would reject is a schema bug, not a content one. */\nfunction checkDefaultCoherence(def: RawFieldDef, type: string, path: string, errors: string[]): void {\n const value = def.default\n const isString = typeof value === 'string'\n const isNumber = typeof value === 'number'\n\n if (type === 'select' && Array.isArray(def.options) && isString && !def.options.includes(value)) {\n errors.push(`Field \"${path}\": default \"${value}\" is not one of its own options [${(def.options as string[]).join(', ')}]`)\n return\n }\n const wantsNumber = ['number', 'integer', 'decimal', 'percent', 'rating'].includes(type)\n const wantsBoolean = type === 'boolean'\n const wantsArray = type === 'array'\n\n if (wantsNumber && !isNumber) {\n errors.push(`Field \"${path}\": default must be a number for type \"${type}\"`)\n } else if (wantsBoolean && typeof value !== 'boolean') {\n errors.push(`Field \"${path}\": default must be a boolean for type \"${type}\"`)\n } else if (wantsArray && !Array.isArray(value)) {\n errors.push(`Field \"${path}\": default must be an array for type \"${type}\"`)\n }\n}\n\n// ─── title_field ───\n\n/** Field names that announce themselves as a title, most explicit first. */\nconst TITLE_NAME_HINTS = ['title', 'name', 'label', 'heading'] as const\n\n/**\n * Preference among displayable types, short scalars first. A title is a label,\n * not a body: given both `question: string` and `answer: text`, the string wins.\n * Without this, \"first required text field\" resolves alphabetically and a FAQ\n * model gets titled by its answers.\n */\nconst TITLE_TYPE_PRIORITY: readonly FieldType[] = [\n 'string', 'slug', 'email', 'url', 'code', 'text', 'markdown', 'richtext',\n]\n\nexport interface TitleFieldPick {\n field: string\n /** Which rule chose it — surfaced to the user so an inferred title can be overruled. */\n rule: 'dictionary' | 'name-match' | 'required-displayable' | 'displayable'\n}\n\ninterface TitleCandidate {\n field: string\n type: FieldType\n required: boolean\n}\n\n/** Fields that could carry a title at all. Everything else is out of the running. */\nfunction titleCandidates(fields?: Record<string, unknown>): TitleCandidate[] {\n if (!fields) return []\n const out: TitleCandidate[] = []\n for (const [field, raw] of Object.entries(fields)) {\n const def = raw as { type?: unknown; required?: unknown } | null\n const type = def?.type\n if (typeof type !== 'string' || !isTitleFieldType(type as FieldType)) continue\n out.push({ field, type: type as FieldType, required: def?.required === true })\n }\n return out\n}\n\nfunction byTypeThenName(a: TitleCandidate, b: TitleCandidate): number {\n const byType = TITLE_TYPE_PRIORITY.indexOf(a.type) - TITLE_TYPE_PRIORITY.indexOf(b.type)\n return byType !== 0 ? byType : a.field.localeCompare(b.field, 'en')\n}\n\n/**\n * How strongly a field name reads as a title. Exact matches outrank snake_case\n * token matches, so `name` beats `brand_name`, and `filename` matches nothing —\n * it tokenizes to `[\"filename\"]`, not `[\"file\", \"name\"]`.\n */\nfunction titleNameRank(field: string): number {\n const exact = (TITLE_NAME_HINTS as readonly string[]).indexOf(field)\n if (exact !== -1) return exact\n\n const tokens = field.split('_')\n const token = TITLE_NAME_HINTS.findIndex(hint => tokens.includes(hint))\n return token === -1 ? Number.POSITIVE_INFINITY : TITLE_NAME_HINTS.length + token\n}\n\n/**\n * Pick the field a model should title its entries by.\n *\n * Migration aid only — it exists to backfill models authored before `title_field`\n * was required, and `contentrain validate --fix` is its one caller. New models\n * declare the field; nothing here runs on the write path.\n *\n * Every rung filters by `isTitleFieldType` first. That filter is the whole point:\n * an unfiltered name match hands the title to a field called `name` that happens\n * to be typed `icon`, which is the exact bug this contract replaces.\n *\n * Returns `null` when no field can render as a title. That is a real answer, not a\n * failure — guessing `image` or `relation` here would re-create the bug, so the\n * validation error stands and a human picks.\n */\nexport function inferTitleField(kind: string, fields?: Record<string, unknown>): TitleFieldPick | null {\n // A dictionary has no fields to point at — its key is the title.\n if (kind === 'dictionary') return { field: DICTIONARY_TITLE_FIELD, rule: 'dictionary' }\n\n const candidates = titleCandidates(fields)\n if (candidates.length === 0) return null\n\n const named = candidates.filter(c => Number.isFinite(titleNameRank(c.field)))\n if (named.length > 0) {\n const best = named.toSorted((a, b) => {\n const byName = titleNameRank(a.field) - titleNameRank(b.field)\n return byName !== 0 ? byName : byTypeThenName(a, b)\n })[0]!\n return { field: best.field, rule: 'name-match' }\n }\n\n const required = candidates.filter(c => c.required)\n if (required.length > 0) {\n return { field: required.toSorted(byTypeThenName)[0]!.field, rule: 'required-displayable' }\n }\n\n return { field: candidates.toSorted(byTypeThenName)[0]!.field, rule: 'displayable' }\n}\n\n/**\n * The `title_field` rule table.\n *\n * Extracted so `validateModelDefinition` (write path) and the project validator\n * (read path) report the same wording from one place, rather than one of them\n * sniffing the other's strings.\n *\n * Chained so a model gets one title_field error, not a cascade of five.\n */\nexport function titleFieldIssues(\n input: { kind: string; title_field?: unknown; fields?: Record<string, unknown> },\n): ModelDefinitionIssues {\n const errors: string[] = []\n const warnings: string[] = []\n const titleField = input.title_field\n\n if (titleField === undefined || titleField === null || titleField === '') {\n errors.push('Missing \"title_field\". Every model must name the field shown as its title. Dictionary models use \"key\".')\n } else if (typeof titleField !== 'string') {\n errors.push(`Invalid \"title_field\": must be a string, got ${typeof titleField}.`)\n } else if (input.kind === 'dictionary') {\n if (titleField !== DICTIONARY_TITLE_FIELD) {\n errors.push(`Dictionary models must use title_field: \"${DICTIONARY_TITLE_FIELD}\". Dictionaries have no fields — the key is the title. Got \"${titleField}\".`)\n }\n } else if (!input.fields || Object.keys(input.fields).length === 0) {\n errors.push(`Invalid \"title_field\": \"${titleField}\" cannot resolve — the model declares no fields.`)\n } else if (!(titleField in input.fields)) {\n // A non-dictionary model may legitimately own a field named \"key\" — the\n // sentinel only collides where there are no fields at all.\n errors.push(\n `Invalid \"title_field\": field \"${titleField}\" is not defined in fields.`\n + (titleField === DICTIONARY_TITLE_FIELD ? ` \"${DICTIONARY_TITLE_FIELD}\" is reserved for dictionary models.` : ''),\n )\n } else {\n const def = input.fields[titleField] as { type?: unknown; required?: unknown } | undefined\n const type = def?.type\n if (typeof type === 'string' && !isTitleFieldType(type as FieldType)) {\n errors.push(`Invalid \"title_field\": field \"${titleField}\" has type \"${type}\" — a title must be one of: ${TITLE_FIELD_TYPES.join(', ')}.`)\n } else if (def?.required !== true) {\n warnings.push(`\"title_field\" points at optional field \"${titleField}\" — entries may render with an empty title. Consider required: true.`)\n }\n // A non-string `type` falls through: the per-field loop already reports it,\n // and repeating it here would double-count one mistake.\n }\n\n return { errors, warnings }\n}\n\n/**\n * Validate a model definition before writing.\n * Used by both the model_save tool and normalize extract.\n */\nexport function validateModelDefinition(\n // `title_field` is `unknown`, not `string?`: a model read back off disk is an\n // unvalidated cast, so the runtime check has to see a value the type system\n // already believes is a string.\n input: { id: string; kind: string; title_field?: unknown; fields?: Record<string, unknown> },\n): ModelDefinitionIssues {\n const errors: string[] = []\n const warnings: string[] = []\n\n // ID format: kebab-case\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(input.id)) {\n errors.push(`Invalid model ID \"${input.id}\": must be kebab-case`)\n }\n\n // Dictionary models cannot have fields\n if (input.kind === 'dictionary' && input.fields && Object.keys(input.fields).length > 0) {\n errors.push('Dictionary models cannot have fields. Dictionaries store flat key-value pairs.')\n }\n\n // Reported above the per-field loop: a broken title_field explains the model,\n // the field errors only explain one field.\n const titleIssues = titleFieldIssues(input)\n errors.push(...titleIssues.errors)\n warnings.push(...titleIssues.warnings)\n\n if (input.fields) {\n for (const [fieldName, fieldDef] of Object.entries(input.fields)) {\n if (!/^[a-z][a-z0-9_]*$/.test(fieldName)) {\n errors.push(`Field \"${fieldName}\": invalid name — must be snake_case starting with letter`)\n }\n checkFieldDef(fieldDef, fieldName, input.kind, errors, warnings, 0)\n }\n }\n\n return { errors, warnings }\n}\n"],"mappings":"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"}
|
|
@@ -297,4 +297,4 @@ var w = async (t, s) => i().then((r) => r.transform(t, s)), l = async (t, s) =>
|
|
|
297
297
|
//#endregion
|
|
298
298
|
export { P as compile, b as convertToTSX, l as parse, g as teardown, w as transform };
|
|
299
299
|
|
|
300
|
-
//# sourceMappingURL=node-
|
|
300
|
+
//# sourceMappingURL=node-CpLm3qr6.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-DUGiIkv1.mjs","names":["g","y","v","w","b","d","m","c","f"],"sources":["../../../node_modules/.pnpm/@astrojs+compiler@2.13.1/node_modules/@astrojs/compiler/dist/chunk-W5DTLHV4.js","../../../node_modules/.pnpm/@astrojs+compiler@2.13.1/node_modules/@astrojs/compiler/dist/node/index.js"],"sourcesContent":["import g from\"crypto\";import _ from\"fs\";import{TextDecoder as b,TextEncoder as v}from\"util\";globalThis.fs||Object.defineProperty(globalThis,\"fs\",{value:_});globalThis.process||Object.defineProperties(globalThis,\"process\",{value:process});globalThis.crypto||Object.defineProperty(globalThis,\"crypto\",{value:g.webcrypto?g.webcrypto:{getRandomValues(m){return g.randomFillSync(m)}}});globalThis.performance||Object.defineProperty(globalThis,\"performance\",{value:{now(){let[m,o]=process.hrtime();return m*1e3+o/1e6}}});var y=new v(\"utf-8\"),w=new b(\"utf-8\");var d=class{constructor(){this.argv=[\"js\"],this.env={},this.exit=t=>{t!==0&&console.warn(\"exit code:\",t)},this._exitPromise=new Promise(t=>{this._resolveExitPromise=t}),this._pendingEvent=null,this._scheduledTimeouts=new Map,this._nextCallbackTimeoutID=1;let o=(t,e)=>{this.mem.setUint32(t+0,e,!0),this.mem.setUint32(t+4,Math.floor(e/4294967296),!0)},n=t=>{let e=this.mem.getUint32(t+0,!0),s=this.mem.getInt32(t+4,!0);return e+s*4294967296},r=t=>{let e=this.mem.getFloat64(t,!0);if(e===0)return;if(!isNaN(e))return e;let s=this.mem.getUint32(t,!0);return this._values[s]},l=(t,e)=>{if(typeof e==\"number\"&&e!==0){if(isNaN(e)){this.mem.setUint32(t+4,2146959360,!0),this.mem.setUint32(t,0,!0);return}this.mem.setFloat64(t,e,!0);return}if(e===void 0){this.mem.setFloat64(t,0,!0);return}let i=this._ids.get(e);i===void 0&&(i=this._idPool.pop(),i===void 0&&(i=this._values.length),this._values[i]=e,this._goRefCounts[i]=0,this._ids.set(e,i)),this._goRefCounts[i]++;let a=0;switch(typeof e){case\"object\":e!==null&&(a=1);break;case\"string\":a=2;break;case\"symbol\":a=3;break;case\"function\":a=4;break}this.mem.setUint32(t+4,2146959360|a,!0),this.mem.setUint32(t,i,!0)},c=t=>{let e=n(t+0),s=n(t+8);return new Uint8Array(this._inst.exports.mem.buffer,e,s)},f=t=>{let e=n(t+0),s=n(t+8),i=new Array(s);for(let a=0;a<s;a++)i[a]=r(e+a*8);return i},u=t=>{let e=n(t+0),s=n(t+8);return w.decode(new DataView(this._inst.exports.mem.buffer,e,s))},h=Date.now()-performance.now();this.importObject={gojs:{\"runtime.wasmExit\":t=>{t>>>=0;let e=this.mem.getInt32(t+8,!0);this.exited=!0,delete this._inst,delete this._values,delete this._goRefCounts,delete this._ids,delete this._idPool,this.exit(e)},\"runtime.wasmWrite\":t=>{t>>>=0;let e=n(t+8),s=n(t+16),i=this.mem.getInt32(t+24,!0);_.writeSync(e,new Uint8Array(this._inst.exports.mem.buffer,s,i))},\"runtime.resetMemoryDataView\":t=>{t>>>=0,this.mem=new DataView(this._inst.exports.mem.buffer)},\"runtime.nanotime1\":t=>{t>>>=0,o(t+8,(h+performance.now())*1e6)},\"runtime.walltime\":t=>{t>>>=0;let e=new Date().getTime();o(t+8,e/1e3),this.mem.setInt32(t+16,e%1e3*1e6,!0)},\"runtime.scheduleTimeoutEvent\":t=>{t>>>=0;let e=this._nextCallbackTimeoutID;this._nextCallbackTimeoutID++,this._scheduledTimeouts.set(e,setTimeout(()=>{for(this._resume();this._scheduledTimeouts.has(e);)console.warn(\"scheduleTimeoutEvent: missed timeout event\"),this._resume()},n(t+8)+1)),this.mem.setInt32(t+16,e,!0)},\"runtime.clearTimeoutEvent\":t=>{t>>>=0;let e=this.mem.getInt32(t+8,!0);clearTimeout(this._scheduledTimeouts.get(e)),this._scheduledTimeouts.delete(e)},\"runtime.getRandomData\":t=>{t>>>=0,globalThis.crypto.getRandomValues(c(t+8))},\"syscall/js.finalizeRef\":t=>{t>>>=0;let e=this.mem.getUint32(t+8,!0);if(this._goRefCounts[e]--,this._goRefCounts[e]===0){let s=this._values[e];this._values[e]=null,this._ids.delete(s),this._idPool.push(e)}},\"syscall/js.stringVal\":t=>{t>>>=0,l(t+24,u(t+8))},\"syscall/js.valueGet\":t=>{t>>>=0;let e=Reflect.get(r(t+8),u(t+16));t=this._inst.exports.getsp()>>>0,l(t+32,e)},\"syscall/js.valueSet\":t=>{t>>>=0,Reflect.set(r(t+8),u(t+16),r(t+32))},\"syscall/js.valueDelete\":t=>{t>>>=0,Reflect.deleteProperty(r(t+8),u(t+16))},\"syscall/js.valueIndex\":t=>{t>>>=0,l(t+24,Reflect.get(r(t+8),n(t+16)))},\"syscall/js.valueSetIndex\":t=>{t>>>=0,Reflect.set(r(t+8),n(t+16),r(t+24))},\"syscall/js.valueCall\":t=>{t>>>=0;try{let e=r(t+8),s=Reflect.get(e,u(t+16)),i=f(t+32),a=Reflect.apply(s,e,i);t=this._inst.exports.getsp()>>>0,l(t+56,a),this.mem.setUint8(t+64,1)}catch(e){t=this._inst.exports.getsp()>>>0,l(t+56,e),this.mem.setUint8(t+64,0)}},\"syscall/js.valueInvoke\":t=>{t>>>=0;try{let e=r(t+8),s=f(t+16),i=Reflect.apply(e,void 0,s);t=this._inst.exports.getsp()>>>0,l(t+40,i),this.mem.setUint8(t+48,1)}catch(e){t=this._inst.exports.getsp()>>>0,l(t+40,e),this.mem.setUint8(t+48,0)}},\"syscall/js.valueNew\":t=>{t>>>=0;try{let e=r(t+8),s=f(t+16),i=Reflect.construct(e,s);t=this._inst.exports.getsp()>>>0,l(t+40,i),this.mem.setUint8(t+48,1)}catch(e){t=this._inst.exports.getsp()>>>0,l(t+40,e),this.mem.setUint8(t+48,0)}},\"syscall/js.valueLength\":t=>{t>>>=0,o(t+16,Number.parseInt(r(t+8).length))},\"syscall/js.valuePrepareString\":t=>{t>>>=0;let e=y.encode(String(r(t+8)));l(t+16,e),o(t+24,e.length)},\"syscall/js.valueLoadString\":t=>{t>>>=0;let e=r(t+8);c(t+16).set(e)},\"syscall/js.valueInstanceOf\":t=>{t>>>=0,this.mem.setUint8(t+24,r(t+8)instanceof r(t+16)?1:0)},\"syscall/js.copyBytesToGo\":t=>{t>>>=0;let e=c(t+8),s=r(t+32);if(!(s instanceof Uint8Array||s instanceof Uint8ClampedArray)){this.mem.setUint8(t+48,0);return}let i=s.subarray(0,e.length);e.set(i),o(t+40,i.length),this.mem.setUint8(t+48,1)},\"syscall/js.copyBytesToJS\":t=>{t>>>=0;let e=r(t+8),s=c(t+16);if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)){this.mem.setUint8(t+48,0);return}let i=s.subarray(0,e.length);e.set(i),o(t+40,i.length),this.mem.setUint8(t+48,1)},debug:t=>{console.log(t)}}}}async run(o){if(!(o instanceof WebAssembly.Instance))throw new Error(\"Go.run: WebAssembly.Instance expected\");this._inst=o,this.mem=new DataView(this._inst.exports.mem.buffer),this._values=[Number.NaN,0,null,!0,!1,globalThis,this],this._goRefCounts=new Array(this._values.length).fill(Number.POSITIVE_INFINITY),this._ids=new Map([[0,1],[null,2],[!0,3],[!1,4],[globalThis,5],[this,6]]),this._idPool=[],this.exited=!1;let n=4096,r=h=>{let t=n,e=y.encode(`${h}\\0`);return new Uint8Array(this.mem.buffer,n,e.length).set(e),n+=e.length,n%8!==0&&(n+=8-n%8),t},l=this.argv.length,c=[];this.argv.forEach(h=>{c.push(r(h))}),c.push(0),Object.keys(this.env).sort().forEach(h=>{c.push(r(`${h}=${this.env[h]}`))}),c.push(0);let u=n;c.forEach(h=>{this.mem.setUint32(n,h,!0),this.mem.setUint32(n+4,0,!0),n+=8}),this._inst.exports.run(l,u),this.exited&&this._resolveExitPromise(),await this._exitPromise}_resume(){if(this.exited)throw new Error(\"Go program has already exited\");this._inst.exports.resume(),this.exited&&this._resolveExitPromise()}_makeFuncWrapper(o){let n=this;return function(){let r={id:o,this:this,args:arguments};return n._pendingEvent=r,n._resume(),r.result}}};export{d as a};\n","import{a as c}from\"../chunk-W5DTLHV4.js\";import{promises as m}from\"fs\";import{fileURLToPath as f}from\"url\";var w=async(t,s)=>i().then(r=>r.transform(t,s)),l=async(t,s)=>i().then(r=>r.parse(t,s)),b=async(t,s)=>i().then(r=>r.convertToTSX(t,s)),P=async t=>{let{default:s}=await import(`data:text/javascript;charset=utf-8;base64,${Buffer.from(t).toString(\"base64\")}`);return s},n,g=()=>{n=void 0,globalThis[\"@astrojs/compiler\"]=void 0},i=()=>(n||(n=d().catch(t=>{throw n=void 0,t})),n),y=async(t,s)=>{let r;return r=await(async()=>{let o=await m.readFile(t).then(e=>e.buffer);return WebAssembly.instantiate(new Uint8Array(o),s)})(),r},d=async()=>{let t=new c,s=await y(f(new URL(\"../astro.wasm\",import.meta.url)),t.importObject);t.run(s.instance);let r=globalThis[\"@astrojs/compiler\"];return{transform:(a,o)=>new Promise(e=>{try{e(r.transform(a,o||{}))}catch(p){throw n=void 0,p}}),parse:(a,o)=>new Promise(e=>e(r.parse(a,o||{}))).catch(e=>{throw n=void 0,e}).then(e=>({...e,ast:JSON.parse(e.ast)})),convertToTSX:(a,o)=>new Promise(e=>e(r.convertToTSX(a,o||{}))).catch(e=>{throw n=void 0,e}).then(e=>({...e,map:JSON.parse(e.map)}))}};export{P as compile,b as convertToTSX,l as parse,g as teardown,w as transform};\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-CpLm3qr6.mjs","names":["g","y","v","w","b","d","m","c","f"],"sources":["../../../node_modules/.pnpm/@astrojs+compiler@2.13.1/node_modules/@astrojs/compiler/dist/chunk-W5DTLHV4.js","../../../node_modules/.pnpm/@astrojs+compiler@2.13.1/node_modules/@astrojs/compiler/dist/node/index.js"],"sourcesContent":["import g from\"crypto\";import _ from\"fs\";import{TextDecoder as b,TextEncoder as v}from\"util\";globalThis.fs||Object.defineProperty(globalThis,\"fs\",{value:_});globalThis.process||Object.defineProperties(globalThis,\"process\",{value:process});globalThis.crypto||Object.defineProperty(globalThis,\"crypto\",{value:g.webcrypto?g.webcrypto:{getRandomValues(m){return g.randomFillSync(m)}}});globalThis.performance||Object.defineProperty(globalThis,\"performance\",{value:{now(){let[m,o]=process.hrtime();return m*1e3+o/1e6}}});var y=new v(\"utf-8\"),w=new b(\"utf-8\");var d=class{constructor(){this.argv=[\"js\"],this.env={},this.exit=t=>{t!==0&&console.warn(\"exit code:\",t)},this._exitPromise=new Promise(t=>{this._resolveExitPromise=t}),this._pendingEvent=null,this._scheduledTimeouts=new Map,this._nextCallbackTimeoutID=1;let o=(t,e)=>{this.mem.setUint32(t+0,e,!0),this.mem.setUint32(t+4,Math.floor(e/4294967296),!0)},n=t=>{let e=this.mem.getUint32(t+0,!0),s=this.mem.getInt32(t+4,!0);return e+s*4294967296},r=t=>{let e=this.mem.getFloat64(t,!0);if(e===0)return;if(!isNaN(e))return e;let s=this.mem.getUint32(t,!0);return this._values[s]},l=(t,e)=>{if(typeof e==\"number\"&&e!==0){if(isNaN(e)){this.mem.setUint32(t+4,2146959360,!0),this.mem.setUint32(t,0,!0);return}this.mem.setFloat64(t,e,!0);return}if(e===void 0){this.mem.setFloat64(t,0,!0);return}let i=this._ids.get(e);i===void 0&&(i=this._idPool.pop(),i===void 0&&(i=this._values.length),this._values[i]=e,this._goRefCounts[i]=0,this._ids.set(e,i)),this._goRefCounts[i]++;let a=0;switch(typeof e){case\"object\":e!==null&&(a=1);break;case\"string\":a=2;break;case\"symbol\":a=3;break;case\"function\":a=4;break}this.mem.setUint32(t+4,2146959360|a,!0),this.mem.setUint32(t,i,!0)},c=t=>{let e=n(t+0),s=n(t+8);return new Uint8Array(this._inst.exports.mem.buffer,e,s)},f=t=>{let e=n(t+0),s=n(t+8),i=new Array(s);for(let a=0;a<s;a++)i[a]=r(e+a*8);return i},u=t=>{let e=n(t+0),s=n(t+8);return w.decode(new DataView(this._inst.exports.mem.buffer,e,s))},h=Date.now()-performance.now();this.importObject={gojs:{\"runtime.wasmExit\":t=>{t>>>=0;let e=this.mem.getInt32(t+8,!0);this.exited=!0,delete this._inst,delete this._values,delete this._goRefCounts,delete this._ids,delete this._idPool,this.exit(e)},\"runtime.wasmWrite\":t=>{t>>>=0;let e=n(t+8),s=n(t+16),i=this.mem.getInt32(t+24,!0);_.writeSync(e,new Uint8Array(this._inst.exports.mem.buffer,s,i))},\"runtime.resetMemoryDataView\":t=>{t>>>=0,this.mem=new DataView(this._inst.exports.mem.buffer)},\"runtime.nanotime1\":t=>{t>>>=0,o(t+8,(h+performance.now())*1e6)},\"runtime.walltime\":t=>{t>>>=0;let e=new Date().getTime();o(t+8,e/1e3),this.mem.setInt32(t+16,e%1e3*1e6,!0)},\"runtime.scheduleTimeoutEvent\":t=>{t>>>=0;let e=this._nextCallbackTimeoutID;this._nextCallbackTimeoutID++,this._scheduledTimeouts.set(e,setTimeout(()=>{for(this._resume();this._scheduledTimeouts.has(e);)console.warn(\"scheduleTimeoutEvent: missed timeout event\"),this._resume()},n(t+8)+1)),this.mem.setInt32(t+16,e,!0)},\"runtime.clearTimeoutEvent\":t=>{t>>>=0;let e=this.mem.getInt32(t+8,!0);clearTimeout(this._scheduledTimeouts.get(e)),this._scheduledTimeouts.delete(e)},\"runtime.getRandomData\":t=>{t>>>=0,globalThis.crypto.getRandomValues(c(t+8))},\"syscall/js.finalizeRef\":t=>{t>>>=0;let e=this.mem.getUint32(t+8,!0);if(this._goRefCounts[e]--,this._goRefCounts[e]===0){let s=this._values[e];this._values[e]=null,this._ids.delete(s),this._idPool.push(e)}},\"syscall/js.stringVal\":t=>{t>>>=0,l(t+24,u(t+8))},\"syscall/js.valueGet\":t=>{t>>>=0;let e=Reflect.get(r(t+8),u(t+16));t=this._inst.exports.getsp()>>>0,l(t+32,e)},\"syscall/js.valueSet\":t=>{t>>>=0,Reflect.set(r(t+8),u(t+16),r(t+32))},\"syscall/js.valueDelete\":t=>{t>>>=0,Reflect.deleteProperty(r(t+8),u(t+16))},\"syscall/js.valueIndex\":t=>{t>>>=0,l(t+24,Reflect.get(r(t+8),n(t+16)))},\"syscall/js.valueSetIndex\":t=>{t>>>=0,Reflect.set(r(t+8),n(t+16),r(t+24))},\"syscall/js.valueCall\":t=>{t>>>=0;try{let e=r(t+8),s=Reflect.get(e,u(t+16)),i=f(t+32),a=Reflect.apply(s,e,i);t=this._inst.exports.getsp()>>>0,l(t+56,a),this.mem.setUint8(t+64,1)}catch(e){t=this._inst.exports.getsp()>>>0,l(t+56,e),this.mem.setUint8(t+64,0)}},\"syscall/js.valueInvoke\":t=>{t>>>=0;try{let e=r(t+8),s=f(t+16),i=Reflect.apply(e,void 0,s);t=this._inst.exports.getsp()>>>0,l(t+40,i),this.mem.setUint8(t+48,1)}catch(e){t=this._inst.exports.getsp()>>>0,l(t+40,e),this.mem.setUint8(t+48,0)}},\"syscall/js.valueNew\":t=>{t>>>=0;try{let e=r(t+8),s=f(t+16),i=Reflect.construct(e,s);t=this._inst.exports.getsp()>>>0,l(t+40,i),this.mem.setUint8(t+48,1)}catch(e){t=this._inst.exports.getsp()>>>0,l(t+40,e),this.mem.setUint8(t+48,0)}},\"syscall/js.valueLength\":t=>{t>>>=0,o(t+16,Number.parseInt(r(t+8).length))},\"syscall/js.valuePrepareString\":t=>{t>>>=0;let e=y.encode(String(r(t+8)));l(t+16,e),o(t+24,e.length)},\"syscall/js.valueLoadString\":t=>{t>>>=0;let e=r(t+8);c(t+16).set(e)},\"syscall/js.valueInstanceOf\":t=>{t>>>=0,this.mem.setUint8(t+24,r(t+8)instanceof r(t+16)?1:0)},\"syscall/js.copyBytesToGo\":t=>{t>>>=0;let e=c(t+8),s=r(t+32);if(!(s instanceof Uint8Array||s instanceof Uint8ClampedArray)){this.mem.setUint8(t+48,0);return}let i=s.subarray(0,e.length);e.set(i),o(t+40,i.length),this.mem.setUint8(t+48,1)},\"syscall/js.copyBytesToJS\":t=>{t>>>=0;let e=r(t+8),s=c(t+16);if(!(e instanceof Uint8Array||e instanceof Uint8ClampedArray)){this.mem.setUint8(t+48,0);return}let i=s.subarray(0,e.length);e.set(i),o(t+40,i.length),this.mem.setUint8(t+48,1)},debug:t=>{console.log(t)}}}}async run(o){if(!(o instanceof WebAssembly.Instance))throw new Error(\"Go.run: WebAssembly.Instance expected\");this._inst=o,this.mem=new DataView(this._inst.exports.mem.buffer),this._values=[Number.NaN,0,null,!0,!1,globalThis,this],this._goRefCounts=new Array(this._values.length).fill(Number.POSITIVE_INFINITY),this._ids=new Map([[0,1],[null,2],[!0,3],[!1,4],[globalThis,5],[this,6]]),this._idPool=[],this.exited=!1;let n=4096,r=h=>{let t=n,e=y.encode(`${h}\\0`);return new Uint8Array(this.mem.buffer,n,e.length).set(e),n+=e.length,n%8!==0&&(n+=8-n%8),t},l=this.argv.length,c=[];this.argv.forEach(h=>{c.push(r(h))}),c.push(0),Object.keys(this.env).sort().forEach(h=>{c.push(r(`${h}=${this.env[h]}`))}),c.push(0);let u=n;c.forEach(h=>{this.mem.setUint32(n,h,!0),this.mem.setUint32(n+4,0,!0),n+=8}),this._inst.exports.run(l,u),this.exited&&this._resolveExitPromise(),await this._exitPromise}_resume(){if(this.exited)throw new Error(\"Go program has already exited\");this._inst.exports.resume(),this.exited&&this._resolveExitPromise()}_makeFuncWrapper(o){let n=this;return function(){let r={id:o,this:this,args:arguments};return n._pendingEvent=r,n._resume(),r.result}}};export{d as a};\n","import{a as c}from\"../chunk-W5DTLHV4.js\";import{promises as m}from\"fs\";import{fileURLToPath as f}from\"url\";var w=async(t,s)=>i().then(r=>r.transform(t,s)),l=async(t,s)=>i().then(r=>r.parse(t,s)),b=async(t,s)=>i().then(r=>r.convertToTSX(t,s)),P=async t=>{let{default:s}=await import(`data:text/javascript;charset=utf-8;base64,${Buffer.from(t).toString(\"base64\")}`);return s},n,g=()=>{n=void 0,globalThis[\"@astrojs/compiler\"]=void 0},i=()=>(n||(n=d().catch(t=>{throw n=void 0,t})),n),y=async(t,s)=>{let r;return r=await(async()=>{let o=await m.readFile(t).then(e=>e.buffer);return WebAssembly.instantiate(new Uint8Array(o),s)})(),r},d=async()=>{let t=new c,s=await y(f(new URL(\"../astro.wasm\",import.meta.url)),t.importObject);t.run(s.instance);let r=globalThis[\"@astrojs/compiler\"];return{transform:(a,o)=>new Promise(e=>{try{e(r.transform(a,o||{}))}catch(p){throw n=void 0,p}}),parse:(a,o)=>new Promise(e=>e(r.parse(a,o||{}))).catch(e=>{throw n=void 0,e}).then(e=>({...e,ast:JSON.parse(e.ast)})),convertToTSX:(a,o)=>new Promise(e=>e(r.convertToTSX(a,o||{}))).catch(e=>{throw n=void 0,e}).then(e=>({...e,map:JSON.parse(e.map)}))}};export{P as compile,b as convertToTSX,l as parse,g as teardown,w as transform};\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,36 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { r as mergeEntryMeta } from "./meta-manager-
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
1
|
+
import { a as serializeMarkdownFrontmatter$1, i as parseMarkdownFrontmatter$1, o as canonicalStringify$1 } from "./context-CxpTATh4.mjs";
|
|
2
|
+
import { A as metaFilePath, O as contentFilePath, k as documentFilePath } from "./model-manager-DqwL8ptm.mjs";
|
|
3
|
+
import { r as mergeEntryMeta } from "./meta-manager-g3shoZES.mjs";
|
|
5
4
|
import { LOCALE_PATTERN, MODEL_FIELD_ORDER, SLUG_PATTERN, canonicalStringify, generateEntryId, validateEntryId, validateLocale, validateSlug } from "@contentrain/types";
|
|
6
|
-
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
7
|
-
//#region src/core/ops/apply-to-worktree.ts
|
|
8
|
-
/**
|
|
9
|
-
* Phase 2 shim — applies a `FileChange[]` to a local worktree directory.
|
|
10
|
-
*
|
|
11
|
-
* Phase 3 replaces this with `LocalProvider.applyPlan` (same logic, owned by
|
|
12
|
-
* the provider) while a `GitHubProvider.applyPlan` produces the equivalent
|
|
13
|
-
* commit through the Git Data API. Until then, tool handlers call this shim
|
|
14
|
-
* inside the existing `createTransaction` flow so Phase 2 gets plan/apply
|
|
15
|
-
* semantics without rewriting the transaction machinery.
|
|
16
|
-
*
|
|
17
|
-
* - `content: string` → `writeFile` (creates parent dirs).
|
|
18
|
-
* - `content: null` → `rm`; missing files are tolerated.
|
|
19
|
-
* - Changes are applied in their given order; callers should sort for
|
|
20
|
-
* determinism.
|
|
21
|
-
*/
|
|
22
|
-
async function applyChangesToWorktree(worktree, changes) {
|
|
23
|
-
for (const change of changes) {
|
|
24
|
-
const absolute = join(worktree, change.path);
|
|
25
|
-
if (change.content === null) {
|
|
26
|
-
await rm(absolute, { force: true }).catch(() => {});
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
await mkdir(dirname(absolute), { recursive: true });
|
|
30
|
-
await writeFile(absolute, change.content, "utf-8");
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
//#endregion
|
|
34
5
|
//#region src/core/ops/content-delete.ts
|
|
35
6
|
function contentDir(model) {
|
|
36
7
|
return model.content_path ?? `.contentrain/content/${model.domain}/${model.id}`;
|
|
@@ -579,6 +550,25 @@ async function planModelSave(reader, input) {
|
|
|
579
550
|
};
|
|
580
551
|
}
|
|
581
552
|
//#endregion
|
|
553
|
+
//#region src/core/bind-ref.ts
|
|
554
|
+
/**
|
|
555
|
+
* Pin a `RepoReader` to one ref. The reconcile planner takes three of these
|
|
556
|
+
* (merge-base / contentrain / base branch) and stays entirely ignorant of
|
|
557
|
+
* refs — executors and tools decide what to bind, the planner just reads.
|
|
558
|
+
*
|
|
559
|
+
* For readers that honour the per-call `ref?` parameter (GitHub, GitLab)
|
|
560
|
+
* this is the whole story; a reader that ignores it (LocalReader reads the
|
|
561
|
+
* working tree) needs a ref-aware implementation instead — see
|
|
562
|
+
* `git/ref-reader.ts`.
|
|
563
|
+
*/
|
|
564
|
+
function bindRef(reader, ref) {
|
|
565
|
+
return {
|
|
566
|
+
readFile: (path) => reader.readFile(path, ref),
|
|
567
|
+
listDirectory: (path) => reader.listDirectory(path, ref),
|
|
568
|
+
fileExists: (path) => reader.fileExists(path, ref)
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
//#endregion
|
|
582
572
|
//#region src/core/ops/vocabulary-save.ts
|
|
583
573
|
const VOCABULARY_PATH = ".contentrain/vocabulary.json";
|
|
584
574
|
/** Terms named individually in an advisory before it collapses to a count. */
|
|
@@ -709,6 +699,6 @@ async function planVocabularyDelete(reader, input) {
|
|
|
709
699
|
};
|
|
710
700
|
}
|
|
711
701
|
//#endregion
|
|
712
|
-
export {
|
|
702
|
+
export { planModelDelete as a, planModelSave as i, planVocabularySave as n, planContentSave as o, bindRef as r, planContentDelete as s, planVocabularyDelete as t };
|
|
713
703
|
|
|
714
|
-
//# sourceMappingURL=ops-
|
|
704
|
+
//# sourceMappingURL=ops-BfrdZ6GK.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-BfrdZ6GK.mjs","names":["canonicalStringify","parseMarkdownFrontmatter","serializeMarkdownFrontmatter","canonicalStringify","canonicalStringify"],"sources":["../src/core/ops/content-delete.ts","../src/core/media/media-rewrite.ts","../src/core/ops/content-save.ts","../src/core/ops/model-delete.ts","../src/core/ops/model-save.ts","../src/core/bind-ref.ts","../src/core/ops/vocabulary-save.ts"],"sourcesContent":["import type { EntryMeta, ModelDefinition } from '@contentrain/types'\nimport { validateSlug } from '@contentrain/types'\nimport type { FileChange, RepoReader } from '../contracts/index.js'\nimport { canonicalStringify } from '../serialization/index.js'\nimport { contentFilePath, documentFilePath, metaFilePath } from './paths.js'\nimport type { OpPlan } from './types.js'\n\nexport interface ContentDeleteInput {\n model: ModelDefinition\n id?: string\n slug?: string\n locale?: string\n keys?: string[]\n /**\n * `config.locales.default` — where a non-i18n model's single meta record\n * lives. Required to resolve meta paths; see `metaFilePath`.\n */\n defaultLocale: string\n}\n\nexport type ContentDeletePlan = OpPlan<string[]>\n\nfunction contentDir(model: Pick<ModelDefinition, 'domain' | 'id' | 'content_path'>): string {\n return model.content_path ?? `.contentrain/content/${model.domain}/${model.id}`\n}\n\nasync function tryReadJson<T>(reader: RepoReader, path: string): Promise<T | null> {\n try {\n return JSON.parse(await reader.readFile(path)) as T\n } catch {\n return null\n }\n}\n\nasync function discoverCollectionLocales(\n reader: RepoReader,\n model: ModelDefinition,\n): Promise<string[]> {\n const dir = contentDir(model)\n const files = await reader.listDirectory(dir)\n const strategy = model.locale_strategy ?? 'file'\n if (strategy === 'directory') {\n return files\n }\n return files\n .filter(f => f.endsWith('.json'))\n .map(f => f.replace('.json', '').replace(`${model.id}.`, ''))\n}\n\n/**\n * Build the FileChange[] required to delete content. Pure — touches no disk.\n *\n * Semantics preserved from legacy `deleteContent`:\n * - Collection: remove the entry ID from each locale's content file and its\n * meta file. Meta file is deleted outright if the removal empties it.\n * - Singleton: delete the locale's content + meta file (locale-scoped when\n * i18n, non-i18n removes whatever meta lives under `.contentrain/meta/{id}/`).\n * - Dictionary: two modes — key-scoped removal updates the file in place,\n * or locale-scoped removes the content + meta pair.\n * - Document: strategy-aware delete (file/suffix/directory/none), plus\n * meta removal under `.contentrain/meta/{id}/{slug}/`.\n */\nexport async function planContentDelete(\n reader: RepoReader,\n input: ContentDeleteInput,\n): Promise<ContentDeletePlan> {\n const { model } = input\n\n // A non-i18n model stores content locale-agnostically in data.json and keeps\n // exactly one meta record, pinned to the default locale. A locale-scoped\n // delete is therefore meaningless — and actively destructive: the locale\n // silently maps onto data.json and the default-locale meta, so passing a\n // non-default locale deletes the shared content and the wrong meta while the\n // named locale's stray meta is never touched. Reject it; stray per-locale\n // meta is cleaned up by `contentrain_validate fix:true`.\n if (!model.i18n && input.locale) {\n throw new Error(\n `Model \"${model.id}\" has i18n disabled — its content is locale-agnostic (stored in data.json), `\n + 'so a locale-scoped delete is invalid. Omit \"locale\" to delete the entry, '\n + 'or run contentrain_validate fix:true to remove stray per-locale meta files.',\n )\n }\n\n const changes: FileChange[] = []\n const removed: string[] = []\n\n switch (model.kind) {\n case 'collection': {\n if (!input.id) throw new Error('Collection delete requires an entry ID')\n\n const locales = input.locale\n ? [input.locale]\n : await discoverCollectionLocales(reader, model)\n\n for (const loc of locales) {\n const cPath = contentFilePath(model, loc)\n const data = await tryReadJson<Record<string, unknown>>(reader, cPath)\n if (!data || !(input.id in data)) continue\n delete data[input.id]\n const sorted: Record<string, unknown> = {}\n for (const k of Object.keys(data).toSorted()) sorted[k] = data[k]\n changes.push({ path: cPath, content: canonicalStringify(sorted) })\n removed.push(`content/${model.domain}/${model.id}/${loc}.json#${input.id}`)\n }\n\n for (const loc of locales) {\n // For a non-i18n model `loc` is the pseudo-locale \"data\" (discovered from\n // data.json); metaFilePath maps it onto the default locale regardless.\n const mPath = metaFilePath(model, loc, input.defaultLocale)\n const meta = await tryReadJson<Record<string, EntryMeta>>(reader, mPath)\n if (!meta || !(input.id in meta)) continue\n delete meta[input.id]\n if (Object.keys(meta).length > 0) {\n changes.push({ path: mPath, content: canonicalStringify(meta) })\n } else {\n changes.push({ path: mPath, content: null })\n }\n }\n break\n }\n\n case 'singleton': {\n if (model.i18n && !input.locale) {\n throw new Error('Singleton delete requires a locale when i18n is enabled')\n }\n const locale = input.locale ?? 'data'\n const cPath = contentFilePath(model, locale)\n changes.push({ path: cPath, content: null })\n removed.push(model.i18n\n ? `content/${model.domain}/${model.id}/${locale}.json`\n : `content/${model.domain}/${model.id}/data.json`)\n\n if (model.i18n) {\n changes.push({ path: metaFilePath(model, locale, input.defaultLocale), content: null })\n } else {\n // Removing data.json leaves a non-i18n model with no content at all, so\n // every meta file under it goes — including strays left by older writes.\n await pushAllMetaForModel(reader, model.id, changes)\n }\n break\n }\n\n case 'dictionary': {\n if (model.i18n && !input.locale) {\n throw new Error('Dictionary delete requires a locale when i18n is enabled')\n }\n const locale = input.locale ?? 'data'\n const cPath = contentFilePath(model, locale)\n\n if (input.keys?.length) {\n const existing = (await tryReadJson<Record<string, string>>(reader, cPath)) ?? {}\n const notFound: string[] = []\n for (const key of input.keys) {\n if (key in existing) delete existing[key]\n else notFound.push(key)\n }\n if (notFound.length > 0) {\n throw new Error(`Dictionary \"${model.id}\" (${locale}): keys not found — [${notFound.join(', ')}]`)\n }\n changes.push({ path: cPath, content: canonicalStringify(existing) })\n removed.push(...input.keys.map(k => `${model.id}/${locale}:${k}`))\n } else {\n changes.push({ path: cPath, content: null })\n removed.push(model.i18n\n ? `content/${model.domain}/${model.id}/${locale}.json`\n : `content/${model.domain}/${model.id}/data.json`)\n if (model.i18n) {\n changes.push({ path: metaFilePath(model, locale, input.defaultLocale), content: null })\n } else {\n await pushAllMetaForModel(reader, model.id, changes)\n }\n }\n break\n }\n\n case 'document': {\n if (!input.slug) throw new Error('Document delete requires a slug')\n const slugErr = validateSlug(input.slug)\n if (slugErr) throw new Error(slugErr)\n\n const dir = contentDir(model)\n const strategy = model.locale_strategy ?? 'file'\n\n if (!model.i18n) {\n changes.push({ path: `${dir}/${input.slug}.md`, content: null })\n } else if (strategy === 'file') {\n const slugDir = `${dir}/${input.slug}`\n const files = await reader.listDirectory(slugDir)\n for (const f of files) changes.push({ path: `${slugDir}/${f}`, content: null })\n } else if (input.locale) {\n changes.push({ path: documentFilePath(model, input.locale, input.slug), content: null })\n } else if (strategy === 'suffix') {\n const files = await reader.listDirectory(dir)\n for (const f of files) {\n if (f.startsWith(`${input.slug}.`) && f.endsWith('.md')) {\n changes.push({ path: `${dir}/${f}`, content: null })\n }\n }\n } else if (strategy === 'directory') {\n const subdirs = await reader.listDirectory(dir)\n for (const d of subdirs) {\n const filePath = `${dir}/${d}/${input.slug}.md`\n if (await reader.fileExists(filePath)) {\n changes.push({ path: filePath, content: null })\n }\n }\n } else if (strategy === 'none') {\n const files = await reader.listDirectory(dir)\n if (files.includes(`${input.slug}.md`)) {\n changes.push({ path: `${dir}/${input.slug}.md`, content: null })\n }\n }\n\n removed.push(`${model.content_path ?? `content/${model.domain}/${model.id}`}/${input.slug}`)\n\n const metaSlugDir = `.contentrain/meta/${model.id}/${input.slug}`\n if (input.locale) {\n changes.push({ path: `${metaSlugDir}/${input.locale}.json`, content: null })\n } else {\n const metaFiles = await reader.listDirectory(metaSlugDir)\n for (const f of metaFiles) changes.push({ path: `${metaSlugDir}/${f}`, content: null })\n }\n break\n }\n }\n\n changes.sort((a, b) => a.path.localeCompare(b.path))\n return { changes, result: removed, advisories: [] }\n}\n\nasync function pushAllMetaForModel(reader: RepoReader, modelId: string, changes: FileChange[]): Promise<void> {\n const metaDir = `.contentrain/meta/${modelId}`\n const files = await reader.listDirectory(metaDir)\n for (const f of files) changes.push({ path: `${metaDir}/${f}`, content: null })\n}\n","import type { FieldDef, FieldType } from '@contentrain/types'\n\n/**\n * Media path → delivery URL rewriting for MCP content writes.\n *\n * Ported from Studio's `server/utils/media-rewrite.ts`, with one deliberate\n * difference: Studio derives the delivery base from a `projectId` plus its\n * runtime config, whereas MCP receives the fully-qualified per-project base\n * directly via `RepoProvider.mediaBaseUrl`\n * (`{siteUrl}/api/cdn/v1/{projectId}` — the project segment is already\n * included). So here `toDeliveryUrl` is a single `{base}/{path}` join.\n *\n * Why this exists: Studio stores uploaded media in CDN/R2 and references it\n * from content by a relative storage path (`media/...`). That path renders\n * nowhere on its own — it must become an absolute, public delivery URL before\n * it reaches a browser. When an external agent writes through MCP Cloud, the\n * write bypasses Studio's content-engine and goes straight through\n * `planContentSave`, so this is where the normalization has to happen: the\n * git-committed value is then already a ready-to-use URL for any consumer\n * (`@contentrain/query`, raw markdown, a plain landing page) with no SDK.\n *\n * Only image/video/file fields (resolved via the model schema, including those\n * nested in object/array fields) and `media/...` src/href targets in\n * markdown/HTML are rewritten. External URLs (`http(s)://`, `//`, `data:`) and\n * already-absolute delivery URLs pass through untouched, so every entry point\n * is idempotent and safe to call repeatedly. In local mode (no base) media\n * stays a relative path — the OSS file model.\n */\n\nconst MEDIA_FIELD_TYPES = new Set<FieldType>(['image', 'video', 'file'])\n\n/**\n * Whether a stored field value is a relative media-storage path (`media/...`)\n * rather than an already-absolute URL or external link. Only these are\n * rewritten to delivery URLs — `http(s)://`, `//`, and `data:` are left as-is.\n */\nexport function isStoredMediaPath(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith('media/')\n}\n\n/** Join a relative media path onto the per-project delivery base. */\nexport function toDeliveryUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, '')}/${path}`\n}\n\n/**\n * Rewrite a stored media path to its absolute delivery URL. Non-media values\n * (external URLs, empty, non-strings) pass through untouched, so this is safe\n * to call on any field value.\n */\nexport function rewriteMediaUrl(base: string, value: unknown): unknown {\n return isStoredMediaPath(value) ? toDeliveryUrl(base, value) : value\n}\n\n/**\n * Rewrite media paths within a single field value, guided by its FieldDef so\n * only media fields — including those nested inside object/array fields — are\n * touched. Non-media values pass through.\n */\nexport function rewriteFieldMedia(value: unknown, field: FieldDef, base: string): unknown {\n if (value == null) return value\n\n if (MEDIA_FIELD_TYPES.has(field.type))\n return rewriteMediaUrl(base, value)\n\n if (field.type === 'object' && field.fields && typeof value === 'object' && !Array.isArray(value))\n return rewriteEntryMedia(value as Record<string, unknown>, field.fields, base)\n\n if (field.type === 'array' && Array.isArray(value)) {\n const itemDef: FieldDef | null = typeof field.items === 'string'\n ? { type: field.items as FieldType }\n : field.items ?? null\n if (!itemDef) return value\n return value.map(v => rewriteFieldMedia(v, itemDef, base))\n }\n\n return value\n}\n\n/**\n * Rewrite media paths across one entry/frontmatter object using a field map.\n * Returns a shallow copy (the input is never mutated); a no-op when the object\n * has no media fields.\n */\nexport function rewriteEntryMedia(\n entry: Record<string, unknown>,\n fields: Record<string, FieldDef>,\n base: string,\n): Record<string, unknown> {\n const out = { ...entry }\n for (const [fieldId, field] of Object.entries(fields)) {\n if (fieldId in out)\n out[fieldId] = rewriteFieldMedia(out[fieldId], field, base)\n }\n return out\n}\n\n/** Rewrite `media/...` markdown image/link targets and inline src/href attrs. */\nexport function rewriteMarkdownMedia(body: string, base: string): string {\n return body\n // markdown image/link target: ](media/...) — stops at whitespace, ) or \"\n .replace(/(\\]\\()(media\\/[^)\\s\"]+)/g, (_m, open, p) => `${open}${toDeliveryUrl(base, p)}`)\n // inline HTML src=/href=\"media/...\"\n .replace(/(\\s(?:src|href)=)([\"'])(media\\/[^\"']+)\\2/gi,\n (_m, attr, quote, p) => `${attr}${quote}${toDeliveryUrl(base, p)}${quote}`)\n}\n","import type { ContentrainConfig, EntryMeta, ModelDefinition, Vocabulary } from '@contentrain/types'\nimport { generateEntryId, validateEntryId, validateLocale, validateSlug } from '@contentrain/types'\nimport type { FileChange, RepoReader } from '../contracts/index.js'\nimport type { ContentEntry } from '../content-manager.js'\nimport { canonicalStringify, parseMarkdownFrontmatter, serializeMarkdownFrontmatter } from '../serialization/index.js'\nimport { rewriteEntryMedia, rewriteMarkdownMedia } from '../media/media-rewrite.js'\nimport type { ContentSaveEntryResult, ContentSavePlan } from './types.js'\nimport { contentFilePath, documentFilePath, metaFilePath } from './paths.js'\nimport { mergeEntryMeta } from '../meta-manager.js'\n\n/** Keys named individually in a replacement advisory before it collapses to a count. */\nconst MAX_REPORTED_KEYS = 5\n\ninterface PlanInput {\n model: ModelDefinition\n entries: ContentEntry[]\n config: ContentrainConfig\n vocabulary?: Vocabulary | null\n /**\n * Per-project public media delivery base (`RepoProvider.mediaBaseUrl`). When\n * set (hosted/cloud mode), relative `media/...` references in media fields\n * and markdown bodies are normalized to absolute delivery URLs before the\n * value is committed. Undefined in local mode — paths are kept verbatim.\n */\n mediaBaseUrl?: string\n}\n\n/**\n * Build the FileChange[] required to save a batch of content entries. The\n * plan is deterministic, pure, and does not touch disk — it reads existing\n * state through `reader` and returns changes for a single atomic commit.\n *\n * Grouping: multiple entries targeting the same (model, locale) share a\n * single content file and a single meta file. Reads are cached in-memory\n * so repeated reads of the same path during a plan are one IO.\n */\nexport async function planContentSave(reader: RepoReader, input: PlanInput): Promise<ContentSavePlan> {\n const { model, entries, config, vocabulary, mediaBaseUrl } = input\n const result: ContentSaveEntryResult[] = []\n const advisories: string[] = []\n\n // Hosted/cloud mode: normalize relative `media/...` references to absolute\n // delivery URLs so the committed value renders anywhere with no SDK. A no-op\n // in local mode (no base) or for field-less models (e.g. dictionaries).\n const normalizeMedia = (data: Record<string, unknown>): Record<string, unknown> =>\n mediaBaseUrl && model.fields ? rewriteEntryMedia(data, model.fields, mediaBaseUrl) : data\n\n // In-memory accumulators keyed by content-root-relative path.\n const contentByPath = new Map<string, unknown>()\n const metaByPath = new Map<string, unknown>()\n const markdownChanges = new Map<string, string>()\n\n async function readJsonOrEmpty<T>(path: string): Promise<T> {\n try {\n return JSON.parse(await reader.readFile(path)) as T\n } catch {\n return {} as T\n }\n }\n\n /** Absent file and absent entry both mean \"no prior meta\" — hence undefined, not `{}`. */\n async function readJsonOrUndefined<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await reader.readFile(path)) as T\n } catch {\n return undefined\n }\n }\n\n /** Prior meta for a whole-file (non-collection) meta path, honouring the accumulator. */\n async function priorMeta(mPath: string): Promise<EntryMeta | undefined> {\n return (metaByPath.get(mPath) as EntryMeta | undefined)\n ?? await readJsonOrUndefined<EntryMeta>(mPath)\n }\n\n const defaultLocale = config.locales.default\n\n for (const entry of entries) {\n const locale = entry.locale ?? defaultLocale\n\n const localeErr = validateLocale(locale, config)\n if (localeErr) throw new Error(localeErr)\n if (entry.id) {\n const err = validateEntryId(entry.id)\n if (err) throw new Error(err)\n }\n if (entry.slug) {\n const err = validateSlug(entry.slug)\n if (err) throw new Error(err)\n }\n\n switch (model.kind) {\n case 'singleton': {\n const cPath = contentFilePath(model, locale)\n const mPath = metaFilePath(model, locale, defaultLocale)\n contentByPath.set(cPath, normalizeMedia(entry.data))\n metaByPath.set(mPath, mergeEntryMeta(await priorMeta(mPath), entry.data))\n result.push({ action: 'updated', locale })\n break\n }\n\n case 'collection': {\n const isNew = !entry.id\n const id = entry.id ?? generateEntryId()\n const cPath = contentFilePath(model, locale)\n const mPath = metaFilePath(model, locale, defaultLocale)\n\n const existing = (contentByPath.get(cPath) as Record<string, unknown> | undefined)\n ?? await readJsonOrEmpty<Record<string, unknown>>(cPath)\n\n const action: 'created' | 'updated' = isNew || !(id in existing) ? 'created' : 'updated'\n existing[id] = normalizeMedia(entry.data)\n\n const sorted: Record<string, unknown> = {}\n for (const key of Object.keys(existing).toSorted()) {\n sorted[key] = existing[key]\n }\n contentByPath.set(cPath, sorted)\n\n const existingMeta = (metaByPath.get(mPath) as Record<string, EntryMeta> | undefined)\n ?? await readJsonOrEmpty<Record<string, EntryMeta>>(mPath)\n existingMeta[id] = mergeEntryMeta(existingMeta[id], entry.data)\n metaByPath.set(mPath, existingMeta)\n\n result.push({ action, id, locale })\n break\n }\n\n case 'dictionary': {\n const cPath = contentFilePath(model, locale)\n const mPath = metaFilePath(model, locale, defaultLocale)\n\n const existing = (contentByPath.get(cPath) as Record<string, string> | undefined)\n ?? await readJsonOrEmpty<Record<string, string>>(cPath)\n\n const newData = entry.data as Record<string, string>\n const entryAdvisories: string[] = []\n\n // Overwriting a key used to be refused outright, which made the most\n // ordinary dictionary operation — correcting a translation — impossible:\n // the workaround was delete, merge, save, merge. Four operations and two\n // branches to fix one string. The refusal also advised \"include all keys\n // in a single save call\", which cannot work, because the check compares\n // values per key rather than counting them.\n //\n // Choosing a translation is a content decision, and MCP does not make\n // those. It reports them — the same way the duplicate-value case two\n // blocks below already does — and the branch diff shows the rest.\n const replaced = Object.keys(newData).filter(\n k => k in existing && existing[k] !== newData[k],\n )\n if (replaced.length > 0) {\n const shown = replaced.slice(0, MAX_REPORTED_KEYS)\n const detail = shown.map(k => `\"${k}\": \"${existing[k]}\" → \"${newData[k]}\"`).join(', ')\n const more = replaced.length > shown.length ? `, and ${replaced.length - shown.length} more` : ''\n entryAdvisories.push(\n `Dictionary \"${model.id}\" (${locale}): replaced ${replaced.length} existing value(s) — ${detail}${more}.`,\n )\n }\n\n const reverseMap = new Map<string, string>()\n for (const [k, v] of Object.entries(existing)) reverseMap.set(v, k)\n for (const [newKey, newValue] of Object.entries(newData)) {\n if (newKey in existing) continue\n const existingKey = reverseMap.get(newValue)\n if (existingKey && existingKey !== newKey) {\n entryAdvisories.push(\n `Value \"${newValue}\" already exists as key \"${existingKey}\". Consider reusing instead of creating \"${newKey}\".`,\n )\n }\n }\n\n if (vocabulary && Object.keys(vocabulary.terms).length > 0) {\n outer:\n for (const [newKey, newValue] of Object.entries(newData)) {\n if (newKey in existing) continue\n for (const translations of Object.values(vocabulary.terms)) {\n if (Object.values(translations).includes(newValue)) {\n entryAdvisories.push(\n `Value \"${newValue}\" matches a vocabulary term. Use the canonical form for consistency.`,\n )\n continue outer\n }\n }\n }\n }\n\n advisories.push(...entryAdvisories)\n\n contentByPath.set(cPath, { ...existing, ...newData })\n metaByPath.set(mPath, mergeEntryMeta(await priorMeta(mPath), entry.data))\n\n result.push({\n action: 'updated',\n locale,\n ...(entryAdvisories.length > 0 ? { advisories: entryAdvisories } : {}),\n })\n break\n }\n\n case 'document': {\n const entryAdvisories: string[] = []\n const slug = entry.slug ?? (entry.data['slug'] as string | undefined)\n if (!slug) throw new Error('Document entries require a slug')\n const slugErr = validateSlug(slug)\n if (slugErr) throw new Error(slugErr)\n\n const incomingFm = { ...entry.data }\n const bodySent = 'body' in incomingFm\n const incomingBody = (incomingFm['body'] as string | undefined) ?? ''\n delete incomingFm['body']\n if (!incomingFm['slug']) incomingFm['slug'] = slug\n\n const dPath = documentFilePath(model, locale, slug)\n const mPath = metaFilePath(model, locale, defaultLocale, slug)\n\n // Accumulator before disk, as the collection branch does: two entries\n // touching one document in a single call must compose, not race.\n let existingRaw: string | null = markdownChanges.get(dPath) ?? null\n if (existingRaw === null) {\n try { existingRaw = await reader.readFile(dPath) }\n catch { /* not yet */ }\n }\n // Same rule the collection branch uses: anything already present —\n // on disk or produced earlier in this plan — makes this an update.\n const action: 'created' | 'updated' = existingRaw ? 'updated' : 'created'\n\n // Merge with what is on disk, the way collections and singletons above\n // already do. Documents were the only kind that replaced instead of\n // merging, so a save that touched one frontmatter field wrote a file\n // containing only that field — and an entirely empty body. Nothing\n // reported it: the response said `valid: true`, because validation runs\n // over the plan's own output, which was internally consistent and\n // wrong. Under auto-merge that reaches the default branch directly.\n const existing = existingRaw ? parseMarkdownFrontmatter(existingRaw) : null\n const fmData = { ...existing?.frontmatter, ...incomingFm }\n\n // Absent `body` means \"I am not editing the body\" — keep what is there.\n // A `body` that is present, even empty, is an instruction, and is\n // honoured; clearing real content that way is announced rather than\n // silent, because it is indistinguishable from a templating mistake.\n const bodyContent = bodySent ? incomingBody : (existing?.body ?? '')\n if (bodySent && !incomingBody.trim() && existing?.body.trim()) {\n const notice = `Document \"${slug}\" (${locale}): body cleared — an explicit empty \"body\" replaced ${existing.body.length} characters. Omit \"body\" to leave it untouched.`\n entryAdvisories.push(notice)\n advisories.push(notice)\n }\n\n // Frontmatter media fields go through the schema-guided rewrite; the\n // markdown body has its `media/...` image/link targets rewritten too.\n const normalizedBody = mediaBaseUrl ? rewriteMarkdownMedia(bodyContent, mediaBaseUrl) : bodyContent\n markdownChanges.set(dPath, serializeMarkdownFrontmatter(normalizeMedia(fmData), normalizedBody))\n metaByPath.set(mPath, mergeEntryMeta(await priorMeta(mPath), entry.data))\n\n result.push({\n action,\n slug,\n locale,\n ...(entryAdvisories.length > 0 ? { advisories: entryAdvisories } : {}),\n })\n break\n }\n }\n }\n\n const changes: FileChange[] = []\n for (const [path, data] of contentByPath) {\n changes.push({ path, content: canonicalStringify(data) })\n }\n for (const [path, meta] of metaByPath) {\n changes.push({ path, content: canonicalStringify(meta) })\n }\n for (const [path, content] of markdownChanges) {\n changes.push({ path, content })\n }\n changes.sort((a, b) => a.path.localeCompare(b.path))\n\n return { changes, result, advisories }\n}\n","import type { ModelDefinition } from '@contentrain/types'\nimport type { FileChange, RepoReader } from '../contracts/index.js'\nimport type { OpPlan } from './types.js'\n\nexport interface ModelDeleteInput {\n model: ModelDefinition\n}\n\nexport type ModelDeletePlan = OpPlan<string[]>\n\n/**\n * Build the FileChange[] required to delete a model and its associated\n * content/meta files.\n *\n * The schema is at most two directory levels deep (e.g. document meta at\n * `.contentrain/meta/{id}/{slug}/{locale}.json`). The helper below walks\n * that much, which is enough for every model kind + locale strategy and\n * keeps us free of a general-purpose recursive lister for now.\n *\n * `result` is the legacy three-entry summary:\n * - `models/{id}.json`\n * - `content/{domain}/{id}/` (only if any content files existed)\n * - `meta/{id}/` (only if any meta files existed)\n */\nexport async function planModelDelete(reader: RepoReader, input: ModelDeleteInput): Promise<ModelDeletePlan> {\n const { model } = input\n const changes: FileChange[] = []\n const removed: string[] = []\n\n changes.push({ path: `.contentrain/models/${model.id}.json`, content: null })\n removed.push(`models/${model.id}.json`)\n\n const contentDir = model.content_path ?? `.contentrain/content/${model.domain}/${model.id}`\n const contentFiles = await enumerateTwoLevels(reader, contentDir)\n for (const path of contentFiles) {\n changes.push({ path, content: null })\n }\n if (contentFiles.length > 0) {\n removed.push(model.content_path ?? `content/${model.domain}/${model.id}/`)\n }\n\n const metaDir = `.contentrain/meta/${model.id}`\n const metaFiles = await enumerateTwoLevels(reader, metaDir)\n for (const path of metaFiles) {\n changes.push({ path, content: null })\n }\n if (metaFiles.length > 0) {\n removed.push(`meta/${model.id}/`)\n }\n\n changes.sort((a, b) => a.path.localeCompare(b.path))\n return { changes, result: removed, advisories: [] }\n}\n\n/** List files up to two directory levels deep. Filters to `.json` and `.md`. */\nasync function enumerateTwoLevels(reader: RepoReader, dir: string): Promise<string[]> {\n const results: string[] = []\n const entries = await reader.listDirectory(dir)\n for (const entry of entries) {\n const path = `${dir}/${entry}`\n if (entry.endsWith('.json') || entry.endsWith('.md')) {\n results.push(path)\n continue\n }\n const subEntries = await reader.listDirectory(path)\n for (const sub of subEntries) {\n if (sub.endsWith('.json') || sub.endsWith('.md')) {\n results.push(`${path}/${sub}`)\n }\n }\n }\n return results\n}\n","import type { ModelDefinition } from '@contentrain/types'\nimport { MODEL_FIELD_ORDER } from '@contentrain/types'\nimport type { FileChange, RepoReader } from '../contracts/index.js'\nimport { canonicalStringify } from '../serialization/index.js'\nimport type { OpPlan } from './types.js'\n\nexport interface ModelSaveInput {\n model: ModelDefinition\n}\n\nexport interface ModelSaveResult {\n action: 'created' | 'updated'\n id: string\n}\n\nexport type ModelSavePlan = OpPlan<ModelSaveResult>\n\n/**\n * Build the FileChange[] required to create or update a model definition.\n *\n * The only disk change is the model JSON file itself. Content and meta\n * directories are created on-demand when their first write lands — git does\n * not track empty directories, and MCP's write helpers `mkdir -p` before\n * every file write, so there is no operational reason to emit an empty-dir\n * ensure step here.\n */\nexport async function planModelSave(reader: RepoReader, input: ModelSaveInput): Promise<ModelSavePlan> {\n const { model } = input\n const modelPath = `.contentrain/models/${model.id}.json`\n\n let action: 'created' | 'updated' = 'created'\n try {\n await reader.readFile(modelPath)\n action = 'updated'\n } catch { /* not yet exists */ }\n\n const changes: FileChange[] = [\n { path: modelPath, content: canonicalStringify(model, MODEL_FIELD_ORDER) },\n ]\n\n return {\n changes,\n result: { action, id: model.id },\n advisories: [],\n }\n}\n","import type { RepoReader } from './contracts/index.js'\n\n/**\n * Pin a `RepoReader` to one ref. The reconcile planner takes three of these\n * (merge-base / contentrain / base branch) and stays entirely ignorant of\n * refs — executors and tools decide what to bind, the planner just reads.\n *\n * For readers that honour the per-call `ref?` parameter (GitHub, GitLab)\n * this is the whole story; a reader that ignores it (LocalReader reads the\n * working tree) needs a ref-aware implementation instead — see\n * `git/ref-reader.ts`.\n */\nexport function bindRef(reader: RepoReader, ref: string): RepoReader {\n return {\n readFile: path => reader.readFile(path, ref),\n listDirectory: path => reader.listDirectory(path, ref),\n fileExists: path => reader.fileExists(path, ref),\n }\n}\n","import type { Vocabulary } from '@contentrain/types'\nimport { canonicalStringify, LOCALE_PATTERN, SLUG_PATTERN } from '@contentrain/types'\nimport type { FileChange, RepoReader } from '../contracts/index.js'\nimport type { OpPlan } from './types.js'\n\nconst VOCABULARY_PATH = '.contentrain/vocabulary.json'\n\n/** Terms named individually in an advisory before it collapses to a count. */\nconst MAX_REPORTED_TERMS = 5\n\nexport interface VocabularySaveInput {\n /**\n * Terms to add or update, keyed by term slug, each holding its translations\n * keyed by locale. Merged with what is already there — a term absent from\n * this map is untouched.\n */\n terms: Record<string, Record<string, string>>\n}\n\nexport interface VocabularyDeleteInput {\n /** Term slugs to remove. A slug that is not present is reported, not an error. */\n terms: string[]\n}\n\nexport interface VocabularySaveResult {\n added: string[]\n updated: string[]\n total: number\n}\n\nexport interface VocabularyDeleteResult {\n deleted: string[]\n missing: string[]\n total: number\n}\n\nexport type VocabularySavePlan = OpPlan<VocabularySaveResult>\nexport type VocabularyDeletePlan = OpPlan<VocabularyDeleteResult>\n\nasync function readVocabulary(reader: RepoReader): Promise<Vocabulary> {\n try {\n const parsed = JSON.parse(await reader.readFile(VOCABULARY_PATH)) as Partial<Vocabulary>\n return { version: parsed.version ?? 1, terms: parsed.terms ?? {} }\n } catch {\n return { version: 1, terms: {} }\n }\n}\n\n/**\n * Validate the shape callers get wrong.\n *\n * The nesting is `term -> locale -> translation`, and it reads identically the\n * other way round, so a caller that groups by locale at the top level produces\n * a structurally valid file that matches nothing. That is not a typo anyone\n * notices — the vocabulary simply stops having any effect. Checking that outer\n * keys are term slugs and inner keys are locale codes catches the inversion at\n * the point of writing.\n */\nfunction validateTerms(terms: Record<string, Record<string, string>>): string[] {\n const errors: string[] = []\n\n for (const [term, translations] of Object.entries(terms)) {\n if (!SLUG_PATTERN.test(term)) {\n errors.push(`Term \"${term}\": must be kebab-case. The outer key is the term, not a locale.`)\n }\n if (typeof translations !== 'object' || translations === null || Array.isArray(translations)) {\n errors.push(`Term \"${term}\": expected an object of locale → translation.`)\n continue\n }\n if (Object.keys(translations).length === 0) {\n errors.push(`Term \"${term}\": has no translations.`)\n }\n for (const [locale, value] of Object.entries(translations)) {\n if (!LOCALE_PATTERN.test(locale)) {\n errors.push(\n `Term \"${term}\": \"${locale}\" is not a locale code. Terms nest as { \"${term}\": { \"en\": \"…\" } } — one term, its translations inside.`,\n )\n }\n if (typeof value !== 'string') {\n errors.push(`Term \"${term}\" (${locale}): translation must be a string, got ${typeof value}.`)\n }\n }\n }\n\n return errors\n}\n\n/**\n * Build the FileChange[] to add or update vocabulary terms.\n *\n * Vocabulary had no write tool at all: the rules forbid editing `.contentrain/`\n * by hand, and there was no supported way to obey that. This closes it through\n * the same plan/apply path every other write uses, so it lands on a `cr/*`\n * branch and follows the project's workflow like anything else.\n */\nexport async function planVocabularySave(\n reader: RepoReader,\n input: VocabularySaveInput,\n): Promise<VocabularySavePlan> {\n const errors = validateTerms(input.terms)\n if (errors.length > 0) {\n throw new Error(`Vocabulary validation failed:\\n- ${errors.join('\\n- ')}`)\n }\n\n const existing = await readVocabulary(reader)\n const added: string[] = []\n const updated: string[] = []\n const advisories: string[] = []\n\n const merged: Record<string, Record<string, string>> = { ...existing.terms }\n for (const [term, translations] of Object.entries(input.terms)) {\n const prior = existing.terms[term]\n if (!prior) {\n added.push(term)\n merged[term] = { ...translations }\n continue\n }\n updated.push(term)\n // Merge per locale: adding a Turkish translation must not drop the English.\n merged[term] = { ...prior, ...translations }\n\n const changed = Object.entries(translations).filter(([l, v]) => l in prior && prior[l] !== v)\n if (changed.length > 0) {\n const shown = changed.slice(0, MAX_REPORTED_TERMS)\n const detail = shown.map(([l, v]) => `${l}: \"${prior[l]}\" → \"${v}\"`).join(', ')\n const more = changed.length > shown.length ? `, and ${changed.length - shown.length} more` : ''\n advisories.push(`Term \"${term}\": replaced ${changed.length} translation(s) — ${detail}${more}.`)\n }\n }\n\n // A canonical term whose value duplicates another term's is the whole thing\n // this file exists to prevent, so it is worth saying out loud.\n const byValue = new Map<string, string>()\n for (const [term, translations] of Object.entries(merged)) {\n for (const value of Object.values(translations)) {\n const owner = byValue.get(value)\n if (owner && owner !== term) {\n advisories.push(`Terms \"${owner}\" and \"${term}\" share the translation \"${value}\".`)\n } else {\n byValue.set(value, term)\n }\n }\n }\n\n const next: Vocabulary = { version: existing.version, terms: merged }\n const changes: FileChange[] = [\n { path: VOCABULARY_PATH, content: canonicalStringify(next) },\n ]\n\n return {\n changes,\n result: { added, updated, total: Object.keys(merged).length },\n advisories,\n }\n}\n\n/** Build the FileChange[] to remove vocabulary terms. */\nexport async function planVocabularyDelete(\n reader: RepoReader,\n input: VocabularyDeleteInput,\n): Promise<VocabularyDeletePlan> {\n const existing = await readVocabulary(reader)\n\n const deleted: string[] = []\n const missing: string[] = []\n const remaining = { ...existing.terms }\n\n for (const term of input.terms) {\n if (term in remaining) {\n delete remaining[term]\n deleted.push(term)\n } else {\n missing.push(term)\n }\n }\n\n const advisories = missing.length > 0\n ? [`Not in the vocabulary, so nothing to delete: ${missing.join(', ')}.`]\n : []\n\n // Nothing changed — emit no FileChange, so the caller can skip the commit\n // rather than create an empty branch.\n const changes: FileChange[] = deleted.length > 0\n ? [{ path: VOCABULARY_PATH, content: canonicalStringify({ version: existing.version, terms: remaining } satisfies Vocabulary) }]\n : []\n\n return {\n changes,\n result: { deleted, missing, total: Object.keys(remaining).length },\n advisories,\n }\n}\n"],"mappings":"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"}
|