Agent Skills

GitHub Repo Hygiene — оформление и поддержание описательной части репозитория

Загружай этот скилл, когда нужно оформить или проверить соответствие описательной части GitHub-страницы репозитория: README, лицензия, community-файлы, issue/PR-шаблоны, social preview, теги поиска, релизы, ссылка на GitHub Pages, community health.

Цель

Чтобы страница репозитория на GitHub всегда отражала актуальное состояние проекта: не отставала после мажорных изменений (новые сервисы, фичи, саги, смена стека) и была полноценной (Чек-лист GitHub «Community Standards» закрыт на 100%).

Do not use

Обязательные / желательные файлы репозитория

Файл Назначение Когда обновлять
README.md Англ. версия, главная страница (лимит отображения ~500 KiB) при любых мажорных изменениях
README.<lang>.md (напр. README.ru.md) Локализованные версии, зеркала англ. синхронизировать с англ.
LICENSE MIT-лицензия (owner/year) при создании, смене владельца
CODE_OF_CONDUCT.md Contributor Covenant 2.1 (полный текст с контактом) редко
CONTRIBUTING.md Инструкция контрибьюторам при смене процессов/конвенций
SECURITY.md Политика безопасности при смене контактов/политики
SUPPORT.md Строго верхний регистр имени файла; ссылка «Support» в хелпере при создании issue редко
.github/ISSUE_TEMPLATE/*.yml Issue-формы (bug_report, feature_request) — дают галочку в Community Health при смене процессов
.github/pull_request_template.md PR-шаблон (корень/docs//.github/, формат .md/.txt) при смене процессов
.github/workflows/ci.yml CI при изменении проверок
.github/release.yml Конфиг автогенерируемых release-notes при создании первой релизии
FUNDING.yml Опц: кнопка «Sponsor» редко
CHANGELOG.md Опц: формат Keep a Changelog при каждой релизии

LICENSE нельзя выносить в .github/ — GitHub распознаёт её только в корне/docs/ репозитория (default-файлы в .github/ для лицензии НЕ сканируются).

README — обязательные элементы

  1. Шапка: название, однострочное описание проекта, живые значок-линки (badges: 3–6, единый стиль).
  2. Статус-блок: актуальные цифры проверок (typecheck/contract/integration).
  3. Быстрый старт: установка, инфраструктура, запуск.
  4. Структура репозитория: полное дерево (включая новые каталоги/сервисы).
  5. Разделы про стек/события/проверки — синхронизировать с реальным кодом.
  6. Ссылка на GitHub Pages (если включён): https://<user>.github.io/<repo>/ + homepage в About.
  7. Языковая шапка-переключатель: **🌐 Versions:** [English](README.md) · [Русский](README.ru.md) · [Website](…).
  8. Хэштеги/ключевые слова — для поиска (описание + topics).
  9. Рекомендуется использовать относительные ссылки на файлы репо (абсолютные ломаются в клонах).
  10. GitHub автогенерирует TOC — ручной оглавление не требуется.

Визуальное оформление README (header/footer) — локальные анимированные SVG

Применять по умолчанию к каждому репозиторию, который проходит через скилл: README получает header (начало файла) и footer (конец файла) в виде локальных анимированных SVG-файлов в репозитории. Оба элемента обязательны в обеих языковых версиях (README.md + README.<lang>.md), когда локальная версия существует.

Принцип: ноль внешних сервисов. Никаких capsule-render, shields-генераторов и прочих URL-баннеров. AI создаёт файлы assets/header.svg и assets/footer.svg прямо в репозитории, README ссылается на них относительными путями. Анимация реализуется SMIL-атрибутами <animate> — она работает в GitHub (и любом браузере) в теге <img> без скриптов и без внешних запросов. Пользователи скилла не зависят ни от одного внешнего сервиса при оформлении.

Структура файлов

В корне репозитория:

assets/
  ├── header.svg
  └── footer.svg
README.md

Определение владельца (USERNAME)

Определение названия проекта (PROJECT_NAME)

Приоритет (от высокого к низкому):

  1. Поле name в package.json
  2. Поле name в pyproject.toml / setup.py / Cargo.toml
  3. Поле name в composer.json / pubspec.yaml
  4. Название репозитория (без префикса владельца)
  5. Заголовок первого # в существующем README

Определение описания (PROJECT_DESC)

Приоритет:

  1. Поле description в package.json / pyproject.toml
  2. Поле description репозитория на GitHub
  3. Анализ технологий → автогенерация (см. таблицу ниже)
  4. По типу репозитория (см. таблицу)
  5. Fallback: Open Source Project

Таблица автогенерации desc

Технология/Тип desc
React/Vue/Svelte/Next.js Frontend Developer
Node.js/Express/Fastify Backend Engineer
Python/Django/Flask Backend Developer
TypeScript Type-Safe Code
Rust Systems Programming
Go Backend Tool
Telegram/Discord/Slack bot Automation Tool
CLI/terminal Developer Utility
Mobile (React Native/Flutter/Swift) Mobile App
UI library/design system UI Components
Portfolio Creative Developer
Documentation Knowledge Base
API API Service
Database/ORM Data Layer
AI/ML/PyTorch/TensorFlow AI / Machine Learning
DevOps/Docker/K8s DevOps Tool
Game/Unity/Godot Game Development
Chrome/Firefox extension Browser Extension
VS Code extension IDE Plugin
Web App (без конкретного стека) Web Application
Library (общее) Developer Library

Определение цветовой схемы (COLD + WARM)

Приоритет:

  1. Явно указанные цвета проекта (брендинг, design tokens, бейджи README, og-image)
  2. Цвета из настроек VSCode / темы (если присутствуют в репо)
  3. AI подбирает по тематике (см. таблицу)
  4. Fallback: #0ABAB5 + #F64A8A

Таблица подбора цветов

Тематика Цвет 1 Цвет 2
Дизайн / UI / Frontend #0ABAB5 #F64A8A
Backend / API / Инфра #1E3A8A #F59E0B
AI / ML / Data #7C3AED #06B6D4
DevOps / Cloud #0EA5E9 #10B981
Mobile #8B5CF6 #EC4899
Боты / Automation #9B4DCA #00D4FF
Игры #DC2626 #7C3AED
Финансы / Крипто #1E293B #FBBF24
Безопасность #18181B #EF4444
Образование #2563EB #F97316
Open source общее #6366F1 #EC4899
Fallback #0ABAB5 #F64A8A

Из таблицы: Цвет 1 → COLD, Цвет 2 → WARM (или наоборот — AI выбирает направление так, чтобы градиент был контрастным; оба варианта допустимы, главное — единообразие в рамках проекта).

Правила для градиента

Эффект «фон наплывает» (главный паттерн)

Баннер — это не просто градиент с волнами поверх, а градиент с вырезом: нижняя волна задаётся в <mask> чёрным цветом и полностью убирает цвет баннера в своей области (дыра), сквозь которую виден фон страницы (белый фон README). Визуально фон страницы «наплывает» на баннер волнистой линией снизу (header) или сверху (footer). Полупрозрачные белые волны (0.25, 0.5) лежат ПОВЕРХ градиента внутри группы с маской и не вырезают — они только подсвечивают слои.

Что умеет анимация (лучше, чем у внешних сервисов)

Шаблон header.svg

Подставить: COLD, WARM#), PROJECT_NAME, PROJECT_DESC, FONTCOLOR. Ключевые правила: чёрная волна в маске wave вырезает низ баннера (фон наплывает); волны анимируются морфингом d-path (4 кадра, гребни Q+T — во всех кадрах одинаковая последовательность команд, иначе морфинг ломается); задержки begin смещены на 30% (0s / -1.8s / -3.6s при dur="6s"); патчи уходят за нижний край (L…,290) — при движении вниз не открывается полоска; у текста тёмный дубль-тень под основным (читаемость на любом градиенте).

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="290" viewBox="0 0 1200 290" role="img" aria-label="PROJECT_NAME — PROJECT_DESC">
  <defs>
    <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" stop-color="COLD">
        <animate attributeName="stop-color" values="COLD;WARM;COLD" dur="8s" repeatCount="indefinite"/>
      </stop>
      <stop offset="100%" stop-color="WARM">
        <animate attributeName="stop-color" values="WARM;COLD;WARM" dur="8s" repeatCount="indefinite"/>
      </stop>
    </linearGradient>
    <!-- Маска: чёрная волна морфится и вырезает цвет баннера снизу (фон «наплывает») -->
    <mask id="wave">
      <rect width="1200" height="290" fill="#FFFFFF"/>
      <path fill="#000000" d="M0,290 L0,245 Q150,222 400,245 T800,245 T1200,245 L1200,290 Z">
        <animate attributeName="d" dur="6s" repeatCount="indefinite" begin="-3.6s"
          keyTimes="0;0.333;0.667;1" calcMode="spline" keySplines="0.5 0 0.5 1;0.5 0 0.5 1;0.5 0 0.5 1"
          values="M0,290 L0,245 Q150,222 400,245 T800,245 T1200,245 L1200,290 Z;M0,290 L0,250 Q150,230 400,250 T800,250 T1200,250 L1200,290 Z;M0,290 L0,240 Q150,214 400,240 T800,240 T1200,240 L1200,290 Z;M0,290 L0,245 Q150,222 400,245 T800,245 T1200,245 L1200,290 Z"/>
      </path>
    </mask>
    <!-- Блик среднего цвета: статичный градиент (узкий мягкий ореол), движется сам rect -->
    <linearGradient id="flash" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="1200" y2="0">
      <stop offset="0%" stop-color="#FFFFFF" stop-opacity="0"/>
      <stop offset="35%" stop-color="#FFFFFF" stop-opacity="0"/>
      <stop offset="44%" stop-color="#FFFFFF" stop-opacity="0.10"/>
      <stop offset="48%" stop-color="#FFFFFF" stop-opacity="0.20"/>
      <stop offset="50%" stop-color="#FFFFFF" stop-opacity="0.25"/>
      <stop offset="52%" stop-color="#FFFFFF" stop-opacity="0.20"/>
      <stop offset="56%" stop-color="#FFFFFF" stop-opacity="0.10"/>
      <stop offset="65%" stop-color="#FFFFFF" stop-opacity="0"/>
      <stop offset="100%" stop-color="#FFFFFF" stop-opacity="0"/>
    </linearGradient>
  </defs>

  <g mask="url(#wave)">
    <rect width="1200" height="290" fill="url(#bg)"/>

    <!-- Блик: первый проход сразу, затем раз в 16s; от края до края; гаснет и телепортируется невидимым -->
    <rect width="1200" height="290" fill="url(#flash)">
      <animateTransform attributeName="transform" type="translate" values="-600,0;-600,0;600,0;600,0" keyTimes="0;0.05;0.28;1" dur="16s" calcMode="linear" repeatCount="indefinite"/>
      <animate attributeName="opacity" values="0;0;1;1;1;0;0" keyTimes="0;0.03;0.05;0.28;0.35;1" dur="16s" repeatCount="indefinite"/>
    </rect>

    <!-- Средняя волна (0.25), морфинг d, сдвиг 30% (-1.8s) -->
    <path fill="#FFFFFF" opacity="0.25" d="M0,290 L0,232 Q200,210 500,232 T1000,232 T1200,232 L1200,290 Z">
      <animate attributeName="d" dur="6s" repeatCount="indefinite" begin="-1.8s"
        keyTimes="0;0.333;0.667;1" calcMode="spline" keySplines="0.5 0 0.5 1;0.5 0 0.5 1;0.5 0 0.5 1"
        values="M0,290 L0,232 Q200,210 500,232 T1000,232 T1200,232 L1200,290 Z;M0,290 L0,238 Q200,220 500,238 T1000,238 T1200,238 L1200,290 Z;M0,290 L0,226 Q200,200 500,226 T1000,226 T1200,226 L1200,290 Z;M0,290 L0,232 Q200,210 500,232 T1000,232 T1200,232 L1200,290 Z"/>
    </path>
    <!-- Верхняя волна (0.5), морфинг d, сдвиг 0s -->
    <path fill="#FFFFFF" opacity="0.5" d="M0,290 L0,220 Q150,198 300,220 T600,220 T900,220 T1200,220 L1200,290 Z">
      <animate attributeName="d" dur="6s" repeatCount="indefinite" begin="0s"
        keyTimes="0;0.333;0.667;1" calcMode="spline" keySplines="0.5 0 0.5 1;0.5 0 0.5 1;0.5 0 0.5 1"
        values="M0,290 L0,220 Q150,198 300,220 T600,220 T900,220 T1200,220 L1200,290 Z;M0,290 L0,228 Q150,210 300,228 T600,228 T900,228 T1200,228 L1200,290 Z;M0,290 L0,212 Q150,186 300,212 T600,212 T900,212 T1200,212 L1200,290 Z;M0,290 L0,220 Q150,198 300,220 T600,220 T900,220 T1200,220 L1200,290 Z"/>
    </path>

    <g>
      <animate attributeName="opacity" values="0;1" dur="1.5s" fill="freeze"/>
      <text x="602" y="105" font-family="'Arial Black','Helvetica Neue',Arial,sans-serif" font-size="48" font-weight="bold" fill="#000000" opacity="0.28" text-anchor="middle">PROJECT_NAME</text>
      <text x="600" y="103" font-family="'Arial Black','Helvetica Neue',Arial,sans-serif" font-size="48" font-weight="bold" fill="FONTCOLOR" text-anchor="middle">PROJECT_NAME</text>
    </g>

    <g>
      <animate attributeName="opacity" values="0;1" dur="1.5s" begin="0.5s" fill="freeze"/>
      <text x="602" y="162" font-family="'Helvetica Neue',Arial,sans-serif" font-size="26" fill="#000000" opacity="0.30" text-anchor="middle">PROJECT_DESC</text>
      <text x="600" y="160" font-family="'Helvetica Neue',Arial,sans-serif" font-size="26" fill="FONTCOLOR" opacity="0.95" text-anchor="middle">PROJECT_DESC</text>
    </g>
  </g>
</svg>

Шаблон footer.svg

Подставить: COLD, WARM#), USERNAME. Footer — зеркало header по вертикали: дыра (чёрная волна в маске) вырезает цвет баннера сверху — фон страницы наплывает на футер сверху, текст снизу. Высота 60px (компактный — высокий футер выглядит как «дыра после контента»). Волны — морфинг d-path с 4 кадрами (гребни Q+T). Все патчи начинаются выше холста (y=-12 / y=-16) — запас больше размаха морфинга, иначе сверху открывается градиентная полоска.

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="60" viewBox="0 0 1200 60" role="img" aria-label="@USERNAME">
  <defs>
    <linearGradient id="fg" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" stop-color="WARM">
        <animate attributeName="stop-color" values="WARM;COLD;WARM" dur="6s" repeatCount="indefinite"/>
      </stop>
      <stop offset="100%" stop-color="COLD">
        <animate attributeName="stop-color" values="COLD;WARM;COLD" dur="6s" repeatCount="indefinite"/>
      </stop>
    </linearGradient>
    <!-- Маска: чёрная волна морфится и вырезает цвет баннера сверху (фон наплывает на футер) -->
    <mask id="wave">
      <rect width="1200" height="60" fill="#FFFFFF"/>
      <path fill="#000000" d="M0,-12 L0,21 Q200,29 400,21 T800,21 T1200,21 L1200,-12 Z">
        <animate attributeName="d" dur="6s" repeatCount="indefinite" begin="-3.6s"
          keyTimes="0;0.333;0.667;1" calcMode="spline" keySplines="0.5 0 0.5 1;0.5 0 0.5 1;0.5 0 0.5 1"
          values="M0,-12 L0,21 Q200,29 400,21 T800,21 T1200,21 L1200,-12 Z;M0,-12 L0,23 Q200,32 400,23 T800,23 T1200,23 L1200,-12 Z;M0,-12 L0,19 Q200,26 400,19 T800,19 T1200,19 L1200,-12 Z;M0,-12 L0,21 Q200,29 400,21 T800,21 T1200,21 L1200,-12 Z"/>
      </path>
    </mask>
    <!-- Блик среднего цвета: статичный градиент (узкий мягкий ореол), движется сам rect -->
    <linearGradient id="flash" gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="1200" y2="0">
      <stop offset="0%" stop-color="#FFFFFF" stop-opacity="0"/>
      <stop offset="35%" stop-color="#FFFFFF" stop-opacity="0"/>
      <stop offset="44%" stop-color="#FFFFFF" stop-opacity="0.10"/>
      <stop offset="48%" stop-color="#FFFFFF" stop-opacity="0.20"/>
      <stop offset="50%" stop-color="#FFFFFF" stop-opacity="0.25"/>
      <stop offset="52%" stop-color="#FFFFFF" stop-opacity="0.20"/>
      <stop offset="56%" stop-color="#FFFFFF" stop-opacity="0.10"/>
      <stop offset="65%" stop-color="#FFFFFF" stop-opacity="0"/>
      <stop offset="100%" stop-color="#FFFFFF" stop-opacity="0"/>
    </linearGradient>
  </defs>

  <g mask="url(#wave)">
    <rect width="1200" height="60" fill="url(#fg)"/>

    <!-- Блик: первый проход сразу, затем раз в 16s; от края до края; гаснет и телепортируется невидимым -->
    <rect width="1200" height="60" fill="url(#flash)">
      <animateTransform attributeName="transform" type="translate" values="-600,0;-600,0;600,0;600,0" keyTimes="0;0.05;0.28;1" dur="16s" calcMode="linear" repeatCount="indefinite"/>
      <animate attributeName="opacity" values="0;0;1;1;1;0;0" keyTimes="0;0.03;0.05;0.28;0.35;1" dur="16s" repeatCount="indefinite"/>
    </rect>

    <!-- Средняя волна (0.25), морфинг d, сдвиг 30% (-1.8s), запас -12 -->
    <path fill="#FFFFFF" opacity="0.25" d="M0,-12 L0,27 Q150,35 300,27 T600,27 T900,27 T1200,27 L1200,-12 Z">
      <animate attributeName="d" dur="6s" repeatCount="indefinite" begin="-1.8s"
        keyTimes="0;0.333;0.667;1" calcMode="spline" keySplines="0.5 0 0.5 1;0.5 0 0.5 1;0.5 0 0.5 1"
        values="M0,-12 L0,27 Q150,35 300,27 T600,27 T900,27 T1200,27 L1200,-12 Z;M0,-12 L0,29 Q150,38 300,29 T600,29 T900,29 T1200,29 L1200,-12 Z;M0,-12 L0,25 Q150,32 300,25 T600,25 T900,25 T1200,25 L1200,-12 Z;M0,-12 L0,27 Q150,35 300,27 T600,27 T900,27 T1200,27 L1200,-12 Z"/>
    </path>
    <!-- Верхняя волна (0.5), морфинг d, сдвиг 0s, запас -16 -->
    <path fill="#FFFFFF" opacity="0.5" d="M0,-16 L0,35 Q120,44 240,35 T480,35 T720,35 T960,35 T1200,35 L1200,-16 Z">
      <animate attributeName="d" dur="6s" repeatCount="indefinite" begin="0s"
        keyTimes="0;0.333;0.667;1" calcMode="spline" keySplines="0.5 0 0.5 1;0.5 0 0.5 1;0.5 0 0.5 1"
        values="M0,-16 L0,35 Q120,44 240,35 T480,35 T720,35 T960,35 T1200,35 L1200,-16 Z;M0,-16 L0,38 Q120,48 240,38 T480,38 T720,38 T960,38 T1200,38 L1200,-16 Z;M0,-16 L0,32 Q120,40 240,32 T480,32 T720,32 T960,32 T1200,32 L1200,-16 Z;M0,-16 L0,35 Q120,44 240,35 T480,35 T720,35 T960,35 T1200,35 L1200,-16 Z"/>
    </path>

    <text x="602" y="51" font-family="'Arial Black','Helvetica Neue',Arial,sans-serif" font-size="22" font-weight="bold" fill="#000000" opacity="0.30" text-anchor="middle">@USERNAME</text>
    <text x="600" y="49" font-family="'Arial Black','Helvetica Neue',Arial,sans-serif" font-size="22" font-weight="bold" fill="#FFFFFF" text-anchor="middle">
      @USERNAME
      <animate attributeName="opacity" values="0.7;1;0.7" dur="2s" repeatCount="indefinite"/>
    </text>
  </g>
</svg>

Вставка в README.md

В начало README.md:

<p align="center">
  <a href="https://github.com/USERNAME" target="_blank">
    <img src="assets/header.svg" alt="header" />
  </a>
</p>

В конец README.md:

<p align="center">
  <a href="https://github.com/USERNAME" target="_blank">
    <img src="assets/footer.svg" alt="footer" />
  </a>
</p>

Алгоритм работы AI

  1. Определи USERNAME из URL репозитория (подтвердить, если неочевиден).
  2. Определи PROJECT_NAME по приоритетам выше.
  3. Определи PROJECT_DESC по приоритетам / таблице.
  4. Определи COLD и WARM по приоритетам / таблице цветов.
  5. Определи FONTCOLOR (#FFFFFF по умолчанию).
  6. Создай assets/ (если нет) и сгенерируй assets/header.svg по шаблону.
  7. Сгенерируй assets/footer.svg по шаблону.
  8. Добавь ссылки в начало и конец README.md (и в README.<lang>.md, если есть).
  9. Если assets/header.svg / assets/footer.svg уже существуют — спросить: перезаписать?

Правила безопасности

Кодировка текста в SVG

Параметры анимации (настраиваемые)

Теги поиска (topics) и описание

Устанавливать через gh api:

# Описание репозитория (лимит UI ~350 символов) — перечислять ВСЕ ключевые компоненты
gh repo edit --description "<полное описание с ключевыми словами>"

# Теги (массив через -f 'names[]=...')
gh api -X PUT repos/<owner>/<repo>/topics \
  -f 'names[]=python' -f 'names[]=markdown' -f 'names[]=documentation' \
  -f 'names[]=agents' -f 'names[]=skills' -f 'names[]=opencode'

Рекомендации по тегам:

GitHub Pages

Евл. Pages включён (gh api repos/<owner>/<repo>/pages):

Social preview (og:image)

Релизы

Чек-лист проверки при мажорном изменении

Запускать при: новый сервис/фича/сага, смена стека, смена портов/схем, изменение контрактов, изменение процессов (CI/коммиты), любой релиз/гейт, delivery gate.

A. Файлы — на месте и распознаны GitHub

  1. README.md отражает новое состояние (структура, сервисы, цифры тестов, статус).
  2. README.<lang>.md синхронизирован с англ. версией (заголовки 1:1).
  3. LICENSE на месте, owner/year корректны, GitHub распознаёт лицензию (spdx_id).
  4. CODE_OF_CONDUCT.md — полный текст Contributor Covenant 2.1 с контактом; GitHub распознаёт как Covenant (key: contributor_covenant, не other).
  5. CONTRIBUTING.md, SECURITY.md, SUPPORT.md (имя строго в upper-case).
  6. .github/ISSUE_TEMPLATE/ (bug_report + feature_request, forms yml) и .github/pull_request_template.md на месте с валидным frontmatter (name+about для .md, name+description для .yml).

B. Метаданные GitHub

  1. gh repo edit --description актуально, перечисляет ВСЕ компоненты (≤350 символов на UI).
  2. topics (gh api .../topics) актуальны, ≤ 20, lowercase, ≤ 50 символов каждый.
  3. Homepage (gh repo edit --homepage https://<user>.github.io/<repo>/) — при Pages; рабочая ссылка.
  4. Social preview задан (1280×640, < 1 MB) — если есть Settings.
  5. CI-бейдж/статус в README соответствует реальному состоянию (не stale).

C. Community Health

  1. gh api repos/<owner>/<repo>/community/profilehealth_percentage >= 100, files.issue_template и files.pull_request_template не null.
  2. has_discussions желательно true (Discussions включены) для вопросов.

D. Релизы

  1. Существует релиз с semver-тегом (последний «latest»), .github/release.yml настроен.
  2. CHANGELOG.md (Keep a Changelog) обновлён под новый релиз.

E. Финальная

  1. Коммит/пуш сделан, изменения видны на GitHub; CI зелёный.

Команды проверки

# Файлы на месте
ls LICENSE CODE_OF_CONDUCT.md CONTRIBUTING.md SECURITY.md SUPPORT.md README.md README.ru.md

# Описание + homepage + темы
gh repo view --json description,homepageUrl,repositoryTopics

# Теги
gh api repos/<owner>/<repo>/topics

# Pages
gh api repos/<owner>/<repo>/pages

# Community health (!!) — самый информативный чек
gh api repos/<owner>/<repo>/community/profile

# Распознавание лицензии и CoC (ключи)
gh api repos/<owner>/<repo>/community-enabled   # или /community/get

Замена отображения в WEB-интерфейсе (бейджи, community health %) занимает 1–5 минут после пуша — проверять не сразу после коммита, а с небольшой паузой.

Примечания

Canonical analogues

Полный разбор — в references/canonical-patterns.md. Ключевые каноны: