Skip to content

fix(content): pin non-i18n meta to default locale; upgrade contentrain to 2.x#155

Merged
ABB65 merged 1 commit into
mainfrom
chore/contentrain-2.0.1-upgrade
Jul 17, 2026
Merged

fix(content): pin non-i18n meta to default locale; upgrade contentrain to 2.x#155
ABB65 merged 1 commit into
mainfrom
chore/contentrain-2.0.1-upgrade

Conversation

@ABB65

@ABB65 ABB65 commented Jul 17, 2026

Copy link
Copy Markdown
Member

Ne / neden

Contentrain ekosistem paketlerinin üçünde de 2026-07-16'da büyük sürüm çıktı. Studio üçüne de bağımlı; bu koordineli bir geçiş (mcp 2.0.1 ve query 7.0.1 ikisi de @contentrain/types@0.9.0'a exact bağlı — ayrı ayrı bump'lanamaz).

Paket Önce Sonra
@contentrain/mcp 1.10.0 2.0.1
@contentrain/types 0.8.0 0.9.0
@contentrain/query ^6.2.1 ^7.0.1

Değişiklikler

Kesin kırılma (derleme): MCP 2.x'te planContentDelete artık defaultLocale istiyor → delete-content.ts'e config.locales.default threadlendi.

Canlı hata (non-i18n meta): MCP 2.x metaFilePath'i i18n:false bir modelin tek meta kaydını default locale'e sabitliyor. Studio ham request locale'i kullanıyordu; non-i18n bir model default-olmayan locale ile kaydedilince/status değişince/silinince meta, okuyucuların (brain/CDN) hiç bakmadığı bir yola yazılıyordu → status override sessizce düşüyor, kayıt draft'a dönüyor, CDN build'den kayboluyordu. Content editor API, status PATCH ve chat agent tool'ları üzerinden erişilebilirdi.

Çözüm: content-paths.ts'te content + meta path üretimi MCP'nin contentFilePath/documentFilePath/metaFilePath'ine devredildi — Studio artık planContentSave'in yazma yolundan sapamaz. Studio yalnız MCP'nin bilinçli olarak kapsamadığını tutuyor: content_path güvenlik guard'ı (assertSafeContentPath), contentRoot prefix'i, ve slug'sız dizin dönüşü. defaultLocale tüm resolveMetaPath çağıranlarına threadlendi; read-side === 'data' workaround'ları kalktı.

Süreç (ekosistem senkron): dependabot'a @contentrain/* grubu (majör bump'lar tek PR); CI/release npx contentrain generatepnpm exec contentrain-query generate (pinlenmiş doğru bin); docs/CONTENTRAIN_UPGRADE.md runbook.

Doğrulama

  • pnpm typecheck ✅ · pnpm lint ✅ (0 hata) · pnpm test ✅ (1068/1068) · pnpm build ✅ (v7 client + Nuxt)

Merge sonrası (staging'de doğrulanacak)

Mock'lu git testleri MCP write-path davranışını gizler. Railway staging'de gerçek write-path:

  • Non-i18n bir model'i default-olmayan locale ile kaydet / status değiştir / sil → meta default-locale yolunda, status korunuyor, CDN build'de görünüyor
  • Canlı projede contentrain_validate → types 0.9.0'ın yeni semantik hatalarının (bozuk slug/date/percent) kapsamını çıkar

Not (upstream fırsatı)

@contentrain/mcp/core/ops contentDirPath'i export etmiyor; edilirse Studio son yerel content-dir helper'ını da bırakabilir (bu PR gerektirmiyor).

…n to 2.x

Coordinated upgrade of the Contentrain ecosystem trio (forced — mcp 2.0.1 and
query 7.0.1 both pin @contentrain/types@0.9.0 exactly):

- @contentrain/mcp   1.10.0 -> 2.0.1
- @contentrain/types 0.8.0  -> 0.9.0
- @contentrain/query ^6.2.1 -> ^7.0.1

MCP 2.x changed two contracts Studio depends on:

- planContentDelete now requires `defaultLocale`; thread config.locales.default
  through delete-content.ts.
- metaFilePath pins a non-i18n model's single meta record to the default
  locale. Studio's resolveMetaPath used the raw request locale, so a non-i18n
  save / status-change / delete at a non-default locale wrote meta to a path the
  readers never looked at — the status override silently no-op'd, the entry
  reset to draft, and it dropped from the CDN build. Reachable via the content
  editor API, the status PATCH route, and the chat agent tools.

Delegate content + meta path assembly to MCP's contentFilePath /
documentFilePath / metaFilePath so Studio can no longer drift from
planContentSave's write path. Studio keeps only what MCP deliberately omits:
the content_path security guard (assertSafeContentPath), the contentRoot
prefix, and the slug-absent directory return. Thread defaultLocale through
every resolveMetaPath caller (save-content, save-document, update-status incl.
copyLocale/copyDocumentLocale, init-project, brain-cache, cdn-builder) and drop
the now-redundant read-side `=== 'data' ? defaultLocale : locale` workarounds.

Ecosystem-sync process: group @contentrain/* in dependabot so ecosystem bumps
land as one reviewable PR; align CI/release to the pinned `contentrain-query
generate` bin (no `contentrain` bin exists); add docs/CONTENTRAIN_UPGRADE.md.

Tests updated for types@0.9.0's stricter validator messages, the resolveMetaPath
signature, and the new config read in updateEntryStatus/copyLocale.
@ABB65
ABB65 merged commit c2b2d05 into main Jul 17, 2026
2 checks passed
@ABB65
ABB65 deleted the chore/contentrain-2.0.1-upgrade branch July 17, 2026 12:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant