---
pr: 112
title: feat(skills): add repo-readme skill and create-readme tool
---

## Что сделано

Создана тулза `create-readme` (`.opencode/tools/create-readme.ts`, TS-плагин) с
двумя режимами:
- `create` — генерирует стандартизированный двуязычный README.md по шаблону с
  разделителями `<!-- summary-en:start/end -->` и `<!-- summary-ru:start/end -->`,
  Support & Contact блоком, Quick Start, language switcher. Поддерживает
  `custom_sections_en/ru`, `tier` (flagship/utility), `demo_gif`, `telegram`.
  Локальный режим (`fs.writeFileSync` в `file_path`) и удалённый (`gh api
  repos/{owner}/{repo}/contents/README.md` PUT с base64 + SHA).
- `validate` — проверяет существующий README на 6 критериев: наличие обоих
  EN/RU разделителей, непустой контент между ними, ссылку slaid098.dev/support,
  секции Quick Start (EN) + Быстрый старт (RU), language switcher.

Создан скилл `repo-readme` (`.opencode/skills/repo-readme/SKILL.md`): когда
использовать create vs validate, tier system, GitHub metadata как отдельный
шаг, workflow (create → ручные правки → validate), зачем разделители (парсинг
витриной slaid098.dev), шаблон README как reference, независимость от
repo-init, краткий список параметров тулзы.

Проверки: `tsc --noEmit` чисто; `check-permissions.py` OK (тулза вызывает
`gh api` через `spawnSync` внутри плагина — не bash-команда агента, не требует
allow-rule).

## Почему

Структура README критична для витрины slaid098.dev — она скачивает raw
README и извлекает фрагмент между разделителями. Тулза обеспечивает
детерминированную генерацию структуры, скилл даёт контекст агенту (когда
вызывать, tier, metadata). Ручная генерация README агентом через Write
рискует нарушить разделители.

## Pending

—

## Watch out

Handoff/ADR файлы названы `pr-0-*` (placeholder) — номер PR подставится после
create-pr и отдельного коммита `docs(handoff): set PR number`. Тулза
регистрации в `opencode.json` не требует (плагины авто-дискаверятся из
`.opencode/tools/*.ts`, как `tunnel.ts`). `tier`/`file_path` реализованы через
`.optional()` + fallback в handler (не `.default()`), консистентно с
существующими тулзами (commit.ts, create-issue.ts не используют zod `.default()`).
