portable-text-conversion — скилл для Claude Code: HTML и Markdown
Переводит HTML и Markdown в блоки Portable Text для Sanity. Нужен при переносе контента из старой CMS и сборке пайплайнов импорта.
npx skills add sanity-io/agent-toolkit --skill portable-text-conversion -a claude-codeЧто делает portable-text-conversion
Скилл описывает три пути конвертации. Для Markdown — функция markdownToPortableText из пакета @portabletext/markdown, её автор советует как основной вариант. Для HTML — htmlToBlocks из @portabletext/block-tools. Третий путь — собирать блоки вручную, когда источник не разметка, а API или база данных.
Внутри лежит спецификация Portable Text: массив блоков, у каждого _type, _key, children со спанами и markDefs для аннотаций. Списки задаются через listItem и level на обычных блоках. Правила разложены по файлам rules/markdown-to-pt.md, rules/html-to-pt.md и rules/manual-construction.md — агент читает тот, что совпадает с форматом источника.
Есть подвох с именами пакетов. @sanity/block-tools — устаревшее имя, для новых проектов берут @portabletext/block-tools, API там тот же. Если в проекте уже стоит старый пакет, это повод проверить, не тянется ли он дальше по зависимостям.
Какие задачи решает
- перенести статьи из старой CMS в Sanity
- залить Markdown-файлы в виде документов Portable Text
- написать пайплайн, который принимает HTML из внешнего источника
- собрать блоки вручную из данных API или базы
- разобраться, как устроены
_key,markDefsи списки в Portable Text
Примеры запросов агенту
- Сконвертируй этот Markdown в блоки Portable Text через
markdownToPortableText - Разбери HTML-страницу в PT-блоки с
htmlToBlocksи покажи результат - Собери массив блоков Portable Text вручную из этих данных
Как установить portable-text-conversion
1Через Skills CLI (Vercel)
npx skills add sanity-io/agent-toolkit --skill portable-text-conversion -a claude-code2Вручную: положить файлы
~/.claude/skills/portable-text-conversion/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/portable-text-conversion/
1Через Skills CLI (Vercel)
npx skills add sanity-io/agent-toolkit --skill portable-text-conversion -a codex2Вручную: положить файлы
.agents/skills/portable-text-conversion/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add sanity-io/agent-toolkit --skill portable-text-conversion -a cursor2Вручную: положить файлы
.cursor/skills/portable-text-conversion/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install sanity-io/agent-toolkit portable-text-conversion2Вручную: положить файлы
.github/skills/portable-text-conversion/SKILL.md1Через Skills CLI (Vercel)
npx skills add sanity-io/agent-toolkit --skill portable-text-conversion -a gemini-cli2Командой платформы
gemini skills install https://github.com/sanity-io/agent-toolkit --path skills/portable-text-conversionВручную: положить файлы
.devin/skills/portable-text-conversion/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add sanity-io/agent-toolkit --skill portable-text-conversion -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о portable-text-conversion
Как установить portable-text-conversion в Claude?
Выполните npx skills add sanity-io/agent-toolkit --skill portable-text-conversion -a claude-code. Скилл окажется в ~/.claude/skills/portable-text-conversion/SKILL.md.
Что делает portable-text-conversion?
Помогает агенту переводить HTML и Markdown в блоки Portable Text для Sanity: подсказывает нужные функции, структуру блоков и правила разметки.
Чем @portabletext/block-tools отличается от @sanity/block-tools?
Это один и тот же API, но @sanity/block-tools — старое имя пакета. Для новых проектов берут @portabletext/block-tools.
Исходный текст
SKILL.md · MIT
---
name: portable-text-conversion
description: Convert HTML and Markdown content into Portable Text blocks for Sanity. Use when migrating content from legacy CMSs, importing HTML or Markdown into Sanity, building content pipelines that ingest external content, converting rich text between formats, or programmatically creating Portable Text documents. Covers @portabletext/markdown (markdownToPortableText), @portabletext/block-tools (htmlToBlocks), custom deserializers, and the Portable Text specification for manual block construction.
license: MIT
metadata:
author: sanity
version: "1.0.0"
---
# Portable Text Conversion
Convert external content (HTML, Markdown) into Portable Text for Sanity. Three main approaches:
1. **`markdownToPortableText`** — Convert Markdown directly using `@portabletext/markdown` (recommended for Markdown)
2. **`htmlToBlocks`** — Parse HTML into PT blocks using `@portabletext/block-tools` (for HTML migration)
3. **Manual construction** — Build PT blocks directly from any source (APIs, databases, etc.)
## Portable Text Specification
Understand the target format before converting. PT is an array of blocks:
```json
[
{
"_type": "block",
"_key": "abc123",
"style": "normal",
"children": [
{"_type": "span", "_key": "def456", "text": "Hello ", "marks": []},
{"_type": "span", "_key": "ghi789", "text": "world", "marks": ["strong"]}
],
"markDefs": []
},
{
"_type": "block",
"_key": "jkl012",
"style": "h2",
"children": [
{"_type": "span", "_key": "mno345", "text": "A heading", "marks": []}
],
"markDefs": []
},
{
"_type": "image",
"_key": "pqr678",
"asset": {"_type": "reference", "_ref": "image-abc-200x200-png"}
}
]
```
**Key rules:**
- Every block and span needs `_key` (unique within the array)
- `_type: "block"` is for text blocks; custom types use their own `_type`
- `markDefs` holds annotation data; `marks` on spans reference `markDefs[*]._key` or are decorator strings
- Lists use `listItem` ("bullet" | "number") and `level` (1, 2, 3...) on regular blocks
## Conversion Rules
Read the rule file matching your source format:
- **Markdown → Portable Text**: `rules/markdown-to-pt.md` — `@portabletext/markdown` with `markdownToPortableText` (recommended)
- **HTML → Portable Text**: `rules/html-to-pt.md` — `@portabletext/block-tools` with `htmlToBlocks`
- **Manual PT Construction**: `rules/manual-construction.md` — build blocks programmatically from any source
> **Note:** `@sanity/block-tools` is the legacy package name. Always use `@portabletext/block-tools` for new projects. The API is the same.
© sanity · MIT · sanity-io/agent-toolkit