@roottale/cms-mcp 0.70.0 → 0.71.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @roottale/cms-mcp
2
2
 
3
+ ## 0.71.0
4
+
5
+ ### Patch Changes
6
+
7
+ - e55e0ae: 공용 RootTaleImage와 서버·브라우저 공용 delivery 서브패스를 추가합니다. 래퍼 없는 네이티브 img, ref, 정적 import 크기, CF 반응형 직접 전달, 원본 대체, 미리 읽기를 지원하며 사이트별 원본 매핑과 CMS 데이터는 보존합니다. 기존 CfImage와 default export는 유지합니다.
8
+
9
+ ## 0.70.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 7cef947: FRONT 전용 상세 주소를 쓰는 콘텐츠의 ROOT-ADMIN 사이트 열기 규칙과 Next.js 계약 예시를 추가합니다. 저장 주소·공개 API·리다이렉트는 변경하지 않습니다.
14
+
3
15
  ## 0.70.0
4
16
 
5
17
  ### Minor Changes
package/dist/index.js CHANGED
@@ -1855,7 +1855,7 @@ function registerTools(server) {
1855
1855
  }
1856
1856
 
1857
1857
  // src/server.ts
1858
- var VERSION = true ? "0.70.0" : "dev";
1858
+ var VERSION = true ? "0.71.0" : "dev";
1859
1859
  var SERVER_INSTRUCTIONS = `
1860
1860
  roottale-cms-mcp\uB294 RootTale CMS\uB97C \uC678\uBD80 \uC0AC\uC774\uD2B8(\uC8FC\uB85C Next.js)\uC5D0 \uC5F0\uB3D9\uD558\uACE0
1861
1861
  \uAE00\xB7\uC378\uB124\uC77C\xB7\uBCF8\uBB38 \uC774\uBBF8\uC9C0\uB97C \uC790\uB3D9\uD654\uD558\uAE30 \uC704\uD55C \uBB38\uC11C\xB7\uC608\uC2DC \uCF54\uB4DC\xB7API tool\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4.
@@ -517,3 +517,22 @@ export default async function Layout({ children }: { children: React.ReactNode }
517
517
  - `GET /v1/cms/public/posts?model_key=team-member`
518
518
  - `GET /v1/cms/public/categories?collection_key=faq` (`id`, `parent_id` 포함)
519
519
  - `GET /v1/cms/public/exposures?slot_key=global-popup&path=%2Fabout`
520
+
521
+
522
+ ## FRONT 전용 상세 주소로 사이트 열기
523
+
524
+ 한 모델의 일부 형식만 별도 상세 화면을 쓰면 사이트 콘텐츠 계약의 해당 `models` 항목에 `siteLinkRules`를 선언합니다. 예를 들어 `blog`의 `content_format=media`는 다음처럼 연결합니다.
525
+
526
+ ```json
527
+ {
528
+ "modelKey": "blog",
529
+ "preset": "article",
530
+ "siteLinkRules": [
531
+ { "field": "content_format", "equals": "media", "detailPath": "/news/media/:slug" }
532
+ ]
533
+ }
534
+ ```
535
+
536
+ ROOT-ADMIN 글 목록·편집 화면의 공개/검수 사이트 열기가 저장된 `metaJson.acf` 값과 규칙을 대조합니다. 해당 형식만 선언한 내부 상세 주소로 열며, 다른 형식은 기존 주소를 유지합니다. 규칙이 충돌하거나 저장 주소가 없는 글에는 링크를 만들지 않습니다. 예시는 `examples/nextjs/cms/site-link-rules.example.json`에 있습니다.
537
+
538
+ 이 선언은 글의 저장 주소·공개 API·주소 이력·리다이렉트를 바꾸지 않습니다. FRONT는 저장 주소를 검증하고 실제 상세·canonical·목록을 같은 전용 경로로 구현해야 합니다. 해당 FRONT 배포를 확인한 뒤 계약을 등록하세요. 관리자 링크를 고치기 위해 폐기한 개발 주소를 다시 열지 않습니다.
@@ -38,6 +38,13 @@ description: 어드민 "설정 > 주소 이동"에서 정의한 임의 경로
38
38
  기존 캐시가 있으면 오래된 규칙을 우선 사용하고(stale-first), 캐시가
39
39
  없으면 트래픽을 막지 않고 통과시킵니다(fail-soft).
40
40
 
41
+ Proxy는 모든 페이지 요청 앞에서 실행되므로 API 장애가 사이트 전체를 멈추지
42
+ 않도록 다음과 같이 동작합니다.
43
+
44
+ - 규칙 조회는 최대 `timeoutMs`(기본 1.5초)만 기다립니다.
45
+ - 캐시가 만료돼도 기존 규칙이 있으면 기다리지 않고 쓰고, 갱신은 뒤에서 한 번만 합니다.
46
+ - 조회가 실패하면 30초 동안 다시 조회하지 않고, 그동안 기존 규칙(없으면 통과)을 씁니다.
47
+
41
48
  ```ts
42
49
  // proxy.ts
43
50
  import { NextResponse } from "next/server";
@@ -45,7 +52,7 @@ import { createRedirectMiddleware } from "@roottale/cms-renderer-next/routes";
45
52
 
46
53
  const redirects = createRedirectMiddleware({
47
54
  apiKey: process.env.ROOTTALE_API_KEY!,
48
- // apiBase, siteId, cacheTtlMs 는 선택.
55
+ // apiBase, siteId, cacheTtlMs, timeoutMs 는 선택.
49
56
  });
50
57
 
51
58
  export async function proxy(req: Request) {
@@ -103,6 +103,24 @@ pnpm add @roottale/cms-client @roottale/cms-renderer-next
103
103
 
104
104
  요구사항: Node ≥ 18.18, React 19, Next.js 14+ (renderer-next 사용 시).
105
105
 
106
+ 사이트 이미지에는 `@roottale/cms-media/react`의 `RootTaleImage`를 사용합니다.
107
+ 이는 공용 네이티브 img 컴포넌트로, CF Images에서 반응형 이미지를 직접 전달합니다.
108
+ 새 export는 해당 변경을 포함한 패키지 릴리스 후 사용할 수 있습니다.
109
+
110
+ ```tsx
111
+ import { RootTaleImage } from "@roottale/cms-media/react";
112
+
113
+ <RootTaleImage src={coverUrl} alt="대표 이미지" width={800} height={556}
114
+ sizes="(max-width: 880px) calc(100vw - 36px), 840px" />
115
+ ```
116
+
117
+ 이미지 사용 사이트는 `@roottale/cms-media`를 직접 의존성으로 설치합니다.
118
+ CF Flexible variants가 필요하며 `next/image`·Vercel 변환은 사용하지 않습니다.
119
+ 등록된 R2·로컬 자산의 매핑은 사이트에 두고 `@roottale/cms-media/delivery`의
120
+ `createImageDelivery`로 `imageAttributes`·`fallbackSrc`만 계산합니다.
121
+ CMS 저장 주소와 원본은 유지합니다. 정적 import·ref·fill·priority도 지원합니다.
122
+ 기존 `CfImage`·default export는 호환성을 유지합니다.
123
+
106
124
  분류 선택·공개 콘텐츠 정책 API는 SDK **0.69.0부터** 제공합니다. 이 API를 직접
107
125
  사용하는 사이트는 `@roottale/cms-core`도 직접 의존성으로 설치하고 세 패키지의
108
126
  버전을 맞추세요.
package/docs/seo.md CHANGED
@@ -103,6 +103,10 @@ SDK 0.69.0의 `ContentPolicy`·`ContentQuery`는 `@roottale/cms-core`에서 제
103
103
  `visibility`를 통과한 글만 화면에 표시하고, `indexing`까지 통과한 글만 검색에
104
104
  허용합니다. 결과의 `visible`과 `indexable`은 별개이며 `robots`를 메타데이터
105
105
  빌더에 전달해야 직접 설정한 `noindex: false`가 강제 제한을 풀지 못합니다.
106
+ 관리자·공개 메타데이터 응답의 `robots.noindexReasons`는 같은 공통 스키마로
107
+ 검증한 차단 사유 코드입니다. `robots` 전체를 보존해 전달하고, 사유 코드로
108
+ 강제 제한을 해제하지 마세요. `version`은 정책 의존 값이 포함될 수 있는
109
+ 불투명 문자열이므로 그대로 전달하며 숫자로 변환하거나 증가시키지 않습니다.
106
110
 
107
111
  ```ts
108
112
  import type { ContentPolicy, ContentQuery } from "@roottale/cms-core";
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 1,
3
+ "models": [
4
+ {
5
+ "modelKey": "blog",
6
+ "preset": "article",
7
+ "siteLinkRules": [
8
+ { "field": "content_format", "equals": "media", "detailPath": "/news/media/:slug" }
9
+ ]
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,15 @@
1
+ "use client";
2
+
3
+ import { forwardRef } from "react";
4
+ import { RootTaleImage, type RootTaleImageProps } from "@roottale/cms-media/react";
5
+ import { createImageDelivery } from "@roottale/cms-media/delivery";
6
+
7
+ // 고객 사이트에서 검증한 등록 매핑·CF 계정·정적 자산 origin을 주입한다.
8
+ // 전체 CMS 본문 매핑은 서버에서 처리하고 여기에 넣지 않는다.
9
+ const images = createImageDelivery();
10
+
11
+ export const SiteImage = forwardRef<HTMLImageElement, RootTaleImageProps>(function SiteImage(props, ref) {
12
+ return <RootTaleImage {...props} ref={ref}
13
+ imageAttributes={props.imageAttributes ?? (props.srcSet ? undefined : images.imageAttributes(props.src, props.sizes))}
14
+ fallbackSrc={props.fallbackSrc ?? images.imageFallback(props.src)} />;
15
+ });
@@ -20,6 +20,7 @@ export async function routeMetadata(
20
20
  return buildPageMetadata({
21
21
  ...route,
22
22
  fallback: options.fallback,
23
+ // noindexReasons를 포함한 공통 정책을 보존하며 직접 false로 강제 차단을 풀지 않는다.
23
24
  robots: { ...route?.robots, forceNoindex: options.forceNoindex || route?.robots?.forceNoindex },
24
25
  }, {
25
26
  canonical: options.canonical,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roottale/cms-mcp",
3
- "version": "0.70.0",
3
+ "version": "0.71.0",
4
4
  "type": "module",
5
5
  "description": "RootTale CMS MCP server and CLI for models, entries, exposures, media, integration docs, and public API access.",
6
6
  "bin": {