@roottale/cms-mcp 0.62.0 → 0.63.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,24 @@
|
|
|
1
1
|
# @roottale/cms-mcp
|
|
2
2
|
|
|
3
|
+
## 0.63.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a858d8e: 목차 배치를 사이트 코드의 `RootTaleBlogPost.tocPosition`으로 관리할 수 있습니다.
|
|
8
|
+
명시한 값은 CMS 설정보다 우선하며, 생략한 기존 연동은 CMS 배치를 유지합니다.
|
|
9
|
+
현재 배치를 prop으로 명시하면 실제 화면을 바꾸지 않고 관리 주체를 코드로 옮깁니다.
|
|
10
|
+
|
|
11
|
+
공통 블록 디자인은 `RootTaleBlogPost.footerPatternPresentation`과
|
|
12
|
+
`RootTalePostPattern.presentation`으로 전체 대체할 수 있습니다. `null`은 원격
|
|
13
|
+
디자인 주입을 생략하고 사이트 CSS에 맡기며, 생략한 기존 연동은 원격값을 유지합니다.
|
|
14
|
+
고객 콘텐츠와 제작 디자인을 분리하는 문서·발행/미리보기 예제를 함께 갱신합니다.
|
|
15
|
+
|
|
16
|
+
공개 `RootTaleCssVars` 타입의 비공개 UI 패키지 참조도 제거해 독립 소비자의
|
|
17
|
+
strict 타입 검사를 지원합니다.
|
|
18
|
+
|
|
19
|
+
섹션 구성·디자인 변경 검사 함수를 공개 CMS core에서 공유해 편집기와 저장 단계가
|
|
20
|
+
같은 고객 편집 경계를 적용합니다.
|
|
21
|
+
|
|
3
22
|
## 0.62.0
|
|
4
23
|
|
|
5
24
|
### Minor Changes
|
package/dist/index.js
CHANGED
|
@@ -1735,7 +1735,7 @@ function registerTools(server) {
|
|
|
1735
1735
|
}
|
|
1736
1736
|
|
|
1737
1737
|
// src/server.ts
|
|
1738
|
-
var VERSION = true ? "0.
|
|
1738
|
+
var VERSION = true ? "0.63.0" : "dev";
|
|
1739
1739
|
var SERVER_INSTRUCTIONS = `
|
|
1740
1740
|
roottale-cms-mcp\uB294 RootTale CMS\uB97C \uC678\uBD80 \uC0AC\uC774\uD2B8(\uC8FC\uB85C Next.js)\uC5D0 \uC5F0\uB3D9\uD558\uACE0
|
|
1741
1741
|
\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.
|
package/docs/blog.md
CHANGED
|
@@ -136,6 +136,9 @@ export default async function PostPage({
|
|
|
136
136
|
slugOrId={post.id}
|
|
137
137
|
showTableOfContents
|
|
138
138
|
tableOfContentsTitle="목차"
|
|
139
|
+
tocPosition="inline"
|
|
140
|
+
theme={null}
|
|
141
|
+
footerPatternPresentation={null}
|
|
139
142
|
relatedPostsCount={3}
|
|
140
143
|
breadcrumb={{ siteUrl: process.env.NEXT_PUBLIC_SITE_URL }}
|
|
141
144
|
/>
|
|
@@ -166,7 +169,14 @@ export default async function PostPage({
|
|
|
166
169
|
또는 `collections` 로 라우팅됩니다. 현재 글에 카테고리가 없거나 후보가 없으면
|
|
167
170
|
렌더되지 않습니다.
|
|
168
171
|
|
|
169
|
-
목차
|
|
172
|
+
목차 위치는 사이트 코드의 `tocPosition="inline" | "sidebar"`로 정합니다. 명시한
|
|
173
|
+
값은 CMS 설정보다 우선하며, 생략한 기존 연동은 CMS의 `tocPosition`을 유지합니다.
|
|
174
|
+
관리 주체를 코드로 옮길 때는 현재 화면의 배치 값을 명시하세요. 발행 페이지와
|
|
175
|
+
미리보기에는 같은 값을 적용합니다. `theme={null}`은 원격 테마 조회·스타일 주입을
|
|
176
|
+
끄고, `footerPatternPresentation={null}`은 공통 블록 디자인을 사이트 CSS에 맡깁니다.
|
|
177
|
+
두 prop을 생략한 기존 연동은 원격 테마·공통 블록 디자인을 계속 사용합니다.
|
|
178
|
+
|
|
179
|
+
목차(ToC) 노출·작성자 카드·발행일 표시는 어드민의 블로그 표시 설정으로도 제어됩니다
|
|
170
180
|
(`theme-and-settings.md` 참고). 여러 글에 같은 CTA가 필요하면 공통 블록의
|
|
171
181
|
`post_footer` 자리를 쓰세요. 공통 블록으로 아직 옮기지 않은 기존 사이트는
|
|
172
182
|
`RootTaleBlogPost`가 레거시 `postCta`를 계속 렌더하며, 공통 블록이 배치되면
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 테마·블로그 표시·ROOT-ANALYTICS 설정
|
|
3
|
-
description:
|
|
3
|
+
description: 고객 운영 정보와 사이트 코드의 디자인 설정을 분리하고 기존 설정 API를 연동
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 테마·블로그 표시·ROOT-ANALYTICS 설정
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
고객이 직접 수정할 콘텐츠·운영 정보는 CMS에서 조회하고, 디자인·레이아웃은
|
|
9
|
+
사이트 코드에서 관리합니다. 기존 사이트의 호환용 디자인 API는 유지됩니다. 모두
|
|
9
10
|
`@roottale/cms-client/server`에서 제공하며 같은 API 키를 사용합니다.
|
|
10
11
|
|
|
11
12
|
## 저장 즉시 반영 — 캐시 이름표(`tags`)
|
|
@@ -28,7 +29,13 @@ description: 어드민에서 관리하는 디자인 토큰, 블로그 표시 옵
|
|
|
28
29
|
쪽(웹훅 수신 라우트) 배선은 `revalidation-webhooks.md` §1 "설정 저장"을
|
|
29
30
|
따르세요 — **양쪽을 다 해야** 즉시 반영이 됩니다.
|
|
30
31
|
|
|
31
|
-
## 디자인 토큰 — fetchTheme
|
|
32
|
+
## 기존 디자인 토큰 연동 — fetchTheme
|
|
33
|
+
|
|
34
|
+
신규 사이트의 토큰은 프로젝트 CSS·코드에 둡니다. `RootTaleBlogPost`·
|
|
35
|
+
`RootTaleBlogList`·`RootTalePage`·`RootTaleBlogCategories`에 `theme={null}`을 주면
|
|
36
|
+
원격 테마 조회와 CSS 변수 주입을 생략합니다. 명시한 테마 객체는 코드 값을 쓰고,
|
|
37
|
+
prop을 생략하면 기존 호환 동작으로 원격 테마를 조회합니다.
|
|
38
|
+
아래 API는 아직 코드로 이전하지 않은 기존 연동에 사용합니다.
|
|
32
39
|
|
|
33
40
|
```ts
|
|
34
41
|
import { THEME_CACHE_TAG, fetchTheme } from "@roottale/cms-client/server";
|
|
@@ -45,7 +52,9 @@ const theme = await fetchTheme({
|
|
|
45
52
|
|
|
46
53
|
## 상단 메뉴 — theme.siteNav
|
|
47
54
|
|
|
48
|
-
|
|
55
|
+
상단 메뉴 구조는 제작자가 관리하는 설정입니다. 고객 콘텐츠 편집 범위에 넣지
|
|
56
|
+
않으며 신규 사이트는 라우트와 함께 코드에 둡니다. 기존 연동은 같은 `fetchTheme`
|
|
57
|
+
응답에 개발자용 어드민 메뉴에서 저장한 GNB
|
|
49
58
|
구조가 함께 담깁니다. 별도 호출이 없고 테마와 같은 캐시 태그로 무효화됩니다.
|
|
50
59
|
|
|
51
60
|
```ts
|
|
@@ -131,11 +140,16 @@ const settings = await fetchBlogSettings({
|
|
|
131
140
|
// 검색 제목·설명, null 이면 사이트 이름·사이트 설명으로 폴백) · logoUrl ·
|
|
132
141
|
// faviconUrl · defaultOgImageUrl — 사이트 <head>/OG 폴백 (seo.md 참고)
|
|
133
142
|
|
|
134
|
-
// 글 단위 오버라이드(metaJson)와 합성해
|
|
135
|
-
const display = resolvePostDisplay(
|
|
143
|
+
// 글 단위 오버라이드(metaJson)와 합성해 노출 여부 계산
|
|
144
|
+
const display = resolvePostDisplay(post, settings);
|
|
145
|
+
// 자체 화면의 배치는 코드가 정합니다. display.tocPosition은 호환용 값입니다.
|
|
146
|
+
const tocPosition = "inline";
|
|
136
147
|
```
|
|
137
148
|
|
|
138
|
-
`RootTaleBlogPost
|
|
149
|
+
`RootTaleBlogPost`는 노출 여부 설정을 자동 반영하되, 목차 배치는 코드 prop
|
|
150
|
+
`tocPosition="inline" | "sidebar"`를 명시하면 CMS 배치보다 우선합니다. 생략하면
|
|
151
|
+
기존 CMS 배치를 유지하므로 기존 사이트의 화면이 바뀌지 않습니다. 관리 주체를
|
|
152
|
+
코드로 옮길 때 현재 배치 값을 명시하고 발행 화면과 미리보기의 prop을 일치시킵니다. 작성자
|
|
139
153
|
사진의 초점은 글에 연결된 작성자 콘텐츠 값을 적용하고, 사진 모양은 사이트의
|
|
140
154
|
시멘틱 토큰/CSS를 따릅니다. 레거시 `postCta`는 아래 공통 블록이 없는 기존 글에서만
|
|
141
155
|
자동 반영되며, 공통 블록이 배치되면 함께 표시되지 않습니다.
|
|
@@ -177,15 +191,39 @@ const footer = selectSitePatternForSlot(post?.patternSlots, patterns);
|
|
|
177
191
|
```tsx
|
|
178
192
|
// 자체 글 화면 + 공용 렌더러 조합
|
|
179
193
|
import { RootTalePostPattern } from "@roottale/cms-renderer-next/server";
|
|
180
|
-
<RootTalePostPattern apiKey={apiKey} post={post} />
|
|
194
|
+
<RootTalePostPattern apiKey={apiKey} post={post} presentation={null} />
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
블록의 문구·연락처·링크는 CMS에 두고 카드·버튼·색은 사이트 코드에 둡니다.
|
|
198
|
+
`RootTalePostPattern.presentation` 또는 `RootTaleBlogPost.footerPatternPresentation`에
|
|
199
|
+
아래 값을 지정하세요.
|
|
200
|
+
|
|
201
|
+
| 값 | 동작 |
|
|
202
|
+
|---|---|
|
|
203
|
+
| `null` | 원격 디자인의 data 속성·CSS 변수 주입을 생략하고 사이트 CSS 사용 |
|
|
204
|
+
| `CmsSitePatternPresentation` 객체 | 원격 디자인 전체를 코드 객체로 대체(부분 병합 아님) |
|
|
205
|
+
| 생략 | 기존 연동 호환을 위해 원격 `pattern.presentation` 사용 |
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
<RootTaleBlogPost
|
|
209
|
+
apiKey={apiKey}
|
|
210
|
+
slugOrId={slug}
|
|
211
|
+
tocPosition="inline"
|
|
212
|
+
theme={null}
|
|
213
|
+
footerPatternPresentation={{
|
|
214
|
+
layout: "card",
|
|
215
|
+
background: "#f8f9fa",
|
|
216
|
+
linkStyle: "buttons",
|
|
217
|
+
buttonColors: ["#03c75a", "#1a1a1a"],
|
|
218
|
+
}}
|
|
219
|
+
/>
|
|
181
220
|
```
|
|
182
221
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
`RootTaleBlogPost`·`RootTalePostPattern` 은 이미 그렇게 그립니다.
|
|
222
|
+
객체를 지정하면 `data-pattern-layout`, `data-pattern-link-style`,
|
|
223
|
+
`--rt-pattern-bg`, `--rt-pattern-btn-1..n`으로 전달됩니다. `null`이어도 블록 본문과
|
|
224
|
+
`data-pattern-key`·`data-pattern-slot`은 유지되므로 사이트 CSS에서 선택할 수 있습니다.
|
|
225
|
+
자체 렌더러도 `sitePatternPresentationAttributes`에 CMS 값 대신 프로젝트가 소유한
|
|
226
|
+
디자인 객체를 넘기세요. 기존 `presentation` API 데이터는 삭제하지 않습니다.
|
|
189
227
|
|
|
190
228
|
블록 목록은 `rt-site-patterns` 캐시 이름표를 가지며, 어드민에서 블록·배치 규칙을
|
|
191
229
|
저장하면 `theme.updated` 웹훅이 다른 설정과 함께 지웁니다(`createRevalidateRoute`
|
|
@@ -85,6 +85,9 @@ export default async function PostPage({ params }: Props) {
|
|
|
85
85
|
slugOrId={post.id}
|
|
86
86
|
showTitle={false}
|
|
87
87
|
showTableOfContents
|
|
88
|
+
tocPosition="inline"
|
|
89
|
+
theme={null}
|
|
90
|
+
footerPatternPresentation={null}
|
|
88
91
|
relatedPostsCount={3}
|
|
89
92
|
// opt-in — 시각 브레드크럼 + BreadcrumbList JSON-LD. siteUrl 없으면
|
|
90
93
|
// 시각 브레드크럼만(JSON-LD 미emit).
|
|
@@ -62,6 +62,9 @@ export default async function PostPreviewPage({ params, searchParams }: Props) {
|
|
|
62
62
|
apiKey={process.env.ROOTTALE_API_KEY!}
|
|
63
63
|
baseUrl={process.env.ROOTTALE_API_BASE}
|
|
64
64
|
previewToken={token}
|
|
65
|
+
tocPosition="inline"
|
|
66
|
+
theme={null}
|
|
67
|
+
footerPatternPresentation={null}
|
|
65
68
|
relatedPostsCount={3}
|
|
66
69
|
breadcrumb={{ siteUrl: process.env.NEXT_PUBLIC_SITE_URL }}
|
|
67
70
|
/>
|
package/package.json
CHANGED