К основному содержанию
скилл CX Codex GP ChatGPT официальный · OpenAI

cms — скилл для Codex: что делает и как установить

Скилл помогает подключить Sanity, Contentful, DatoCMS, Storyblok и Builder.io к проектам на Vercel с живым предпросмотром.

Установить в Codex · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add openai/plugins --skill cms -a codex
Открыть на GitHub

Что делает cms

Скилл помогает интегрировать безголовые CMS в проекты на Next.js и Vercel. Основной акцент сделан на Sanity через Vercel Marketplace. Внутри описаны запуск встроенной студии через NextStudio, создание схем документов и автоматическая настройка переменных окружения.

Для подтягивания контента используется defineLive() из пакета next-sanity/live. Это избавляет от ручной ревалидации. Для работы Visual Editing требуются Sanity Studio v5+ на React 19.2 и токен с правами Viewer.

Какие задачи решает

  • развернуть Sanity Studio внутри Next.js App Router
  • настроить живые обновления контента через defineLive без ручной ревалидации
  • подключить кликабельное редактирование Visual Editing на страницах черновиков
  • составить схемы типов и полей для Sanity

Примеры запросов агенту

  • Помоги настроить схему поста для Sanity и встроить студию в маршрут app/studio.
  • Настрой live preview через defineLive в next-sanity для страницы блога.
  • Подключи компонент VisualEditing в layout.tsx с проверкой draftMode.

Как установить cms

1Через Skills CLI (Vercel)

npx skills add openai/plugins --skill cms -a codex

2Вручную: положить файлы

.agents/skills/cms/SKILL.md

Для всех проектов — ~/.agents/skills/

По шагам, с командами для каждой платформы: Скиллы Codex: как установить, где лежат и как вызвать

Вопросы о cms

Как установить cms в Codex?

Выполните в терминале команду npx skills add openai/plugins --skill cms или укажите агент явно: npx skills add openai/plugins --skill cms -a codex.

Что делает скилл cms?

Он направляет агента при настройке Sanity, Contentful, DatoCMS, Storyblok и Builder.io в приложениях на Next.js, включая схемы контента и вебхуки ревалидации.

Что требуется для работы Visual Editing в Sanity?

Для режима визуального редактирования необходимы Sanity Studio v5+ на React 19.2, библиотека @sanity/visual-editing v5+ и токен SANITY_API_TOKEN с ролью Viewer.

Исходный текст

SKILL.md · Apache-2.0
---
name: cms
description: Headless CMS integration guidance — Sanity (native Vercel Marketplace), Contentful, DatoCMS, Storyblok, and Builder.io. Covers studio setup, content modeling, preview mode, revalidation webhooks, and Visual Editing. Use when building content-driven sites with a headless CMS on Vercel.
metadata:
  priority: 4
  docs:
    - "https://vercel.com/docs/solutions/cms"
    - "https://nextjs.org/docs/app/building-your-application/data-fetching"
  sitemap: "https://vercel.com/sitemap/docs.xml"
  pathPatterns:
    - 'sanity.config.*'
    - 'sanity.cli.*'
    - 'sanity/**'
    - 'studio/**'
    - 'schemas/*.ts'
    - 'schemas/*.tsx'
    - 'src/sanity/**'
    - 'lib/sanity.*'
    - 'src/lib/sanity.*'
    - 'lib/contentful.*'
    - 'src/lib/contentful.*'
    - 'app/api/draft/**'
    - 'src/app/api/draft/**'
    - 'app/api/revalidate/**'
    - 'src/app/api/revalidate/**'
    - 'app/studio/**'
    - 'src/app/studio/**'
  bashPatterns:
    - '\bnpm\s+(install|i|add)\s+[^\n]*@sanity/client\b'
    - '\bpnpm\s+(install|i|add)\s+[^\n]*@sanity/client\b'
    - '\bbun\s+(install|i|add)\s+[^\n]*@sanity/client\b'
    - '\byarn\s+add\s+[^\n]*@sanity/client\b'
    - '\bnpm\s+(install|i|add)\s+[^\n]*\bnext-sanity\b'
    - '\bpnpm\s+(install|i|add)\s+[^\n]*\bnext-sanity\b'
    - '\bbun\s+(install|i|add)\s+[^\n]*\bnext-sanity\b'
    - '\byarn\s+add\s+[^\n]*\bnext-sanity\b'
    - '\bnpm\s+(install|i|add)\s+[^\n]*\bcontentful\b'
    - '\bpnpm\s+(install|i|add)\s+[^\n]*\bcontentful\b'
    - '\bbun\s+(install|i|add)\s+[^\n]*\bcontentful\b'
    - '\byarn\s+add\s+[^\n]*\bcontentful\b'
    - '\bnpm\s+(install|i|add)\s+[^\n]*@builder\.io/sdk\b'
    - '\bpnpm\s+(install|i|add)\s+[^\n]*@builder\.io/sdk\b'
    - '\bbun\s+(install|i|add)\s+[^\n]*@builder\.io/sdk\b'
    - '\byarn\s+add\s+[^\n]*@builder\.io/sdk\b'
    - '\bnpm\s+(install|i|add)\s+[^\n]*@storyblok/\b'
    - '\bpnpm\s+(install|i|add)\s+[^\n]*@storyblok/\b'
    - '\bbun\s+(install|i|add)\s+[^\n]*@storyblok/\b'
    - '\byarn\s+add\s+[^\n]*@storyblok/\b'
    - '\bnpm\s+(install|i|add)\s+[^\n]*datocms-client\b'
    - '\bpnpm\s+(install|i|add)\s+[^\n]*datocms-client\b'
    - '\bbun\s+(install|i|add)\s+[^\n]*datocms-client\b'
    - '\byarn\s+add\s+[^\n]*datocms-client\b'
    - '\bnpx\s+create-sanity\b'
    - '\bnpx\s+sanity\s+init\b'
---

# Headless CMS Integration

You are an expert in integrating headless CMS platforms with Vercel-deployed applications — covering Sanity (native Vercel Marketplace), Contentful, DatoCMS, Storyblok, and Builder.io.

## Sanity (Native Vercel Marketplace Integration)

Sanity is the primary CMS integration on the Vercel Marketplace with first-class Visual Editing support.

### Install via Marketplace

```bash
# Install Sanity from Vercel Marketplace (auto-provisions env vars)
vercel integration add sanity
```

Auto-provisioned environment variables:
- `SANITY_PROJECT_ID` — Sanity project identifier
- `SANITY_DATASET` — dataset name (usually `production`)
- `SANITY_API_TOKEN` — read/write API token
- `NEXT_PUBLIC_SANITY_PROJECT_ID` — client-side project ID
- `NEXT_PUBLIC_SANITY_DATASET` — client-side dataset name

### SDK Setup

```bash
# Install Sanity packages for Next.js
npm install next-sanity @sanity/client @sanity/image-url

# For embedded studio (optional)
npm install sanity @sanity/vision
```

### Client Configuration

```ts
// lib/sanity.ts
import { createClient } from "next-sanity";

export const client = createClient({
  projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!,
  dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!,
  apiVersion: "2026-03-01",
  useCdn: true,
});
```

### Content Schema

```ts
// schemas/post.ts
import { defineType, defineField } from "sanity";

export const post = defineType({
  name: "post",
  title: "Post",
  type: "document",
  fields: [
    defineField({ name: "title", type: "string" }),
    defineField({ name: "slug", type: "slug", options: { source: "title" } }),
    defineField({ name: "body", type: "array", of: [{ type: "block" }] }),
    defineField({ name: "mainImage", type: "image", options: { hotspot: true } }),
    defineField({ name: "publishedAt", type: "datetime" }),
  ],
});
```

### Embedded Studio (App Router)

```ts
// app/studio/[[...tool]]/page.tsx
"use client";
import { NextStudio } from "next-sanity/studio";
import config from "@/sanity.config";

export default function StudioPage() {
  return <NextStudio config={config} />;
}
```

```ts
// sanity.config.ts
import { defineConfig } from "sanity";
import { structureTool } from "sanity/structure";
import { visionTool } from "@sanity/vision";
import { post } from "./schemas/post";

export default defineConfig({
  name: "default",
  title: "My Studio",
  projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!,
  dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!,
  plugins: [structureTool(), visionTool()],
  schema: { types: [post] },
});
```

### Live Content with `defineLive()` (next-sanity v12)

Use `defineLive()` for automatic real-time content updates without manual revalidation. In next-sanity v11+, `defineLive` must be imported from the `next-sanity/live` subpath:

```ts
// lib/sanity.ts
import { createClient } from "next-sanity";
import { defineLive } from "next-sanity/live";

const client = createClient({
  projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!,
  dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!,
  apiVersion: "2026-03-01",
  useCdn: true,
});

export const { sanityFetch, SanityLive } = defineLive({
  client,
  // Required for draft content in Visual Editing — use a Viewer role token
  serverToken: process.env.SANITY_API_TOKEN,
  // Optional but recommended for faster live preview
  browserToken: process.env.SANITY_BROWSER_TOKEN,
});
```

```tsx
// app/page.tsx
import { sanityFetch, SanityLive } from "@/lib/sanity";

export default async function Page() {
  const { data: posts } = await sanityFetch({ query: `*[_type == "post"]` });
  return (
    <>
      {posts.map((post) => <div key={post._id}>{post.title}</div>)}
      <SanityLive />
    </>
  );
}
```

> **Breaking change in v12**: `defineLive({fetchOptions: {revalidate}})` has been removed. `defineLive({stega})` is deprecated.

### Visual Editing (Presentation Mode)

Sanity Visual Editing lets content editors click-to-edit content directly on the live site preview. Requires Sanity Studio v5+ (React 19.2) and `@sanity/visual-editing` v5+.

```bash
npm install @sanity/visual-editing
```

In next-sanity v11+, `VisualEditing` must be imported from the `next-sanity/visual-editing` subpath:

```ts
// app/layout.tsx
import { VisualEditing } from "next-sanity/visual-editing";
import { draftMode } from "next/headers";

export default async function RootLayout({ children }: { children: React.ReactNode }) {
  const { isEnabled } = await draftMode();
  return (
    <html>
      <body>
        {children}
        {isEnabled && <VisualEditing />}
      </body>
    </html>
  );
}
```

### On-Demand Revalidation Webhook

```ts
// app/api/revalidate/route.ts
import { revalidateTag } from "next/cache";
import { parseBody } from "next-sanity/webhook";

export async function POST(req: Request) {
  const { isValidSignature, body } = await parseBody<{
    _type: string;
    slug?: { current?: string };
  }>(req, process.env.SANITY_REVALIDATE_SECRET);

  if (!isValidSignature) {
    return Response.json({ message: "Invalid signature" }, { status: 401 });
  }

  if (body?._type) {
    revalidateTag(body._type);
  }

  return Response.json({ revalidated: true, now: Date.now() });
}
```

Configure the webhook in Sanity at **Settings → API → Webhooks** pointing to `https://your-site.vercel.app/api/revalidate`.

## Contentful

```bash
npm install contentful
```

```ts
// lib/contentful.ts
import { createClient } from "contentful";

export const contentful = createClient({
  space: process.env.CONTENTFUL_SPACE_ID!,
  accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,
});
```

### Fetching Entries

```ts
// app/page.tsx
import { contentful } from "@/lib/contentful";

export default async function Page() {
  const entries = await contentful.getEntries({ content_type: "blogPost" });
  return (
    <ul>
      {entries.items.map((entry) => (
        <li key={entry.sys.id}>{entry.fields.title as string}</li>
      ))}
    </ul>
  );
}
```

## Draft Mode (Preview)

All CMS integrations should use Next.js Draft Mode for preview:

```ts
// app/api/draft/route.ts
import { draftMode } from "next/headers";

export async function GET(req: Request) {
  const { searchParams } = new URL(req.url);
  const secret = searchParams.get("secret");

  if (secret !== process.env.DRAFT_SECRET) {
    return Response.json({ message: "Invalid token" }, { status: 401 });
  }

  const draft = await draftMode();
  draft.enable();

  const slug = searchParams.get("slug") ?? "/";
  return Response.redirect(new URL(slug, req.url));
}
```

## Environment Variables

| Variable | Scope | CMS | Description |
|----------|-------|-----|-------------|
| `SANITY_PROJECT_ID` / `NEXT_PUBLIC_SANITY_PROJECT_ID` | Server / Client | Sanity | Project identifier |
| `SANITY_DATASET` / `NEXT_PUBLIC_SANITY_DATASET` | Server / Client | Sanity | Dataset name |
| `SANITY_API_TOKEN` | Server | Sanity | Read/write token |
| `SANITY_REVALIDATE_SECRET` | Server | Sanity | Webhook secret for revalidation |
| `CONTENTFUL_SPACE_ID` | Server | Contentful | Space identifier |
| `CONTENTFUL_ACCESS_TOKEN` | Server | Contentful | Delivery API token |
| `CONTENTFUL_PREVIEW_TOKEN` | Server | Contentful | Preview API token |
| `DATOCMS_API_TOKEN` | Server | DatoCMS | Read-only API token |

## Cross-References

- **Marketplace install and env var provisioning** → `⤳ skill: marketplace`
- **On-demand revalidation and caching** → `⤳ skill: runtime-cache`
- **Draft mode and middleware patterns** → `⤳ skill: routing-middleware`
- **Environment variable management** → `⤳ skill: env-vars`
- **Image optimization** → `⤳ skill: nextjs`

## Official Documentation

- [Sanity + Vercel Marketplace](https://vercel.com/marketplace/sanity)
- [next-sanity Documentation](https://github.com/sanity-io/next-sanity) (v12)
- [next-sanity v11→v12 Migration](https://github.com/sanity-io/next-sanity/releases)
- [Sanity Visual Editing](https://www.sanity.io/docs/visual-editing)
- [Contentful JavaScript SDK](https://www.contentful.com/developers/docs/javascript/)
- [Next.js Draft Mode](https://nextjs.org/docs/app/building-your-application/configuring/draft-mode)

© Vercel Labs · Apache-2.0 · openai/plugins

Похожие скиллы

Все скиллы по теме «Фронтенд и UI» →
frontend-design официальный anthropics Скилл задаёт осмысленное визуальное направление для новых интерфейсов и редизайна. Подойдёт, когда стандартный шаблонный UI не устраивает. 1 025 790установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. CX Codex +1 678 700установок prototype Matt Pocock Создаёт временный прототип, чтобы проверить логику, модель состояния или вид интерфейса до работы над основным кодом. 986 201установок hyperframes heygen-com Скилл задаёт агенту правила рендера HTML-кода в видео через HyperFrames. Помогает собирать проморолики, эксплейнеры и титры прямо в коде проекта. CX Codex +1 1 200 000установок hyperframes-cli heygen-com Управляет проектами HyperFrames через терминал: собирает таймлайн, проверяет контраст кадров, запускает предпросмотр и рендерит видео локально или в облаке. CX Codex +1 1 300 000установок webapp-testing официальный anthropics Скилл запускает проверки локальных веб-приложений через Playwright: помогает отлаживать UI, делать скриншоты и смотреть логи браузера. 186 758установок

Из того же набора528

Весь набор →
next-cache-components Скилл помогает внедрять Cache Components и частичный пререндеринг в Next.js 16. Он подсказывает синтаксис директивы use cache, настройку профилей и сброс тегов. CX Codex GP ChatGPT 4установок ncc Скилл помогает собирать Node.js-модули через @vercel/ncc в один файл со всеми зависимостями. Пригодится для serverless-функций, CLI и Docker. CX Codex GP ChatGPT 4установок micro Помогает писать легковесные асинхронные микросервисы на Node.js с библиотекой micro от Vercel. Подсказывает структуру эндпоинтов, парсинг тела и обработку ошибок. CX Codex GP ChatGPT 4установок json-render Помогает отображать части UIMessage, результаты вызова инструментов и статус стриминга в React-интерфейсах на AI SDK v6. CX Codex GP ChatGPT 4установок bootstrap Настраивает проекты с ресурсами Vercel: связывает репозиторий, подключает базу Neon, генерирует секреты и проверяет переменные окружения перед запуском dev-сервера. CX Codex GP ChatGPT 4установок sentry Скилл обращается к Sentry API в режиме чтения: находит ошибки, события и базовые данные о состоянии. Подходит для проверки production-инцидентов. CX Codex GP ChatGPT 4установок user-context Хранит локальный контекст и настройки плагина Public Equity Investing. Запускается только по прямому запросу пользователя. CX Codex GP ChatGPT 4установок user-context Сохраняет продуктовые и дизайн-источники для будущей работы Product Design. Нужен, когда агенту важно опираться на ваши ссылки, файлы и правила. CX Codex GP ChatGPT 4установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой