Загружай этот скилл, когда нужно оформить или проверить соответствие описательной части GitHub-страницы репозитория: README, лицензия, community-файлы, issue/PR-шаблоны, social preview, теги поиска, релизы, ссылка на GitHub Pages, community health.
Чтобы страница репозитория на GitHub всегда отражала актуальное состояние проекта: не отставала после мажорных изменений (новые сервисы, фичи, саги, смена стека) и была полноценной (Чек-лист GitHub «Community Standards» закрыт на 100%).
| Файл | Назначение | Когда обновлять |
|---|---|---|
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/для лицензии НЕ сканируются).
https://<user>.github.io/<repo>/ + homepage в About.**🌐 Versions:** [English](README.md) · [Русский](README.ru.md) · [Website](…).Применять по умолчанию к каждому репозиторию, который проходит через скилл:
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 = сегмент после github.com/ в URL репозитория.github.com/bestdeejay-design/repo → USERNAME = "bestdeejay-design".Приоритет (от высокого к низкому):
name в package.jsonname в pyproject.toml / setup.py / Cargo.tomlname в composer.json / pubspec.yaml# в существующем READMEПриоритет:
description в package.json / pyproject.tomldescription репозитория на GitHubOpen Source Project| Технология/Тип | 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 |
Приоритет:
og-image)#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 выбирает направление так, чтобы градиент был контрастным; оба варианта допустимы, главное — единообразие в рамках проекта).
COLD → справа WARM.WARM → справа COLD (инверсия header).#FFFFFF) в середине градиента — сольётся с текстом.FONTCOLOR: #FFFFFF (или #1A1A2E, если градиент светлый).Баннер — это не просто градиент с волнами поверх, а градиент с вырезом:
нижняя волна задаётся в <mask> чёрным цветом и полностью убирает цвет
баннера в своей области (дыра), сквозь которую виден фон страницы (белый фон
README). Визуально фон страницы «наплывает» на баннер волнистой линией снизу
(header) или сверху (footer). Полупрозрачные белые волны (0.25, 0.5) лежат
ПОВЕРХ градиента внутри группы с маской и не вырезают — они только подсвечивают
слои.
opacity 0.25,
края растушёваны), первый проход сразу после загрузки, затем редкий цикл.animate attributeName="d" с 4 кадрами
(keyTimes="0;0.333;0.667;1"), гребни Q+T (smooth quadratic) реально
«текут» — это настоящее море, а не покачивание полосы. Слои в рассинхроне
30%: при dur="6s" задержки 0s / -1.8s / -3.6s.<animate>/<animateTransform> — работает
в <img> на GitHub без скриптов и без внешних сервисов.Подставить: 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>
Подставить: 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:
<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>
assets/header.svg) — работают в клонах и форках;
GitHub сам масштабирует SVG (1200×290 / 1200×60) под ширину контейнера.<a> —
внутри самого <img> SVG ссылки не срабатывают.USERNAME из URL репозитория (подтвердить, если неочевиден).PROJECT_NAME по приоритетам выше.PROJECT_DESC по приоритетам / таблице.COLD и WARM по приоритетам / таблице цветов.FONTCOLOR (#FFFFFF по умолчанию).assets/ (если нет) и сгенерируй assets/header.svg по шаблону.assets/footer.svg по шаблону.README.<lang>.md, если есть).assets/header.svg / assets/footer.svg уже существуют — спросить:
перезаписать?USERNAME, если он неочевиден..svg без явного запроса.<script> в SVG — GitHub блокирует скрипты; только SMIL <animate>.assets/.<mask>; полупрозрачные волны
(#FFFFFF с opacity) не вырезают — они подсвечивают слои поверх градиента.<rect> на весь холст (видимость) + чёрные патчи-вырезы;
без белого rect маска «погасит» весь баннер.& для &).PROJECT_NAME длиннее 20 символов — уменьшить font-size до 36.PROJECT_DESC.dur="8s" (header) / dur="6s" (footer) — скорость перетекания градиента (можно 4–10s).dur="6s" — период морфинга волн (можно 4–8s).dur="16s" (редкий, «раз в ~16 секунд»; можно 8–30s):
values="-600,0;-600,0;600,0;600,0" с keyTimes="0;0.05;0.28;1" —
стоит у левого края (центр x=0), проезжает весь холст до правого края
(центр x=1200) за ~23% периода, затем держится за холстом (невидим).values="0;0;1;1;1;0;0" с keyTimes="0;0.03;0.05;0.28;0.35;1" —
блик видим ровно в окно прохода, гаснет до телепорта обратно
(телепорт происходит при opacity=0 — незаметен).stop-opacity="0.25" (можно 0.15–0.4 — «еле уловимый»),
стопы-хвосты 0.10/0.20 — мягкий размытый ореол, а не резкая полоса.gradientTransform (ненадёжно в Safari),
а transform самого rect; градиент блика статичен.begin = -dur * 0.3 * n
для n = 0, 1, 2. При dur="6s": 0s (верхняя), -1.8s (средняя),
-3.6s (вырез). Слои никогда не совпадают по фазе.d-path: animate attributeName="d" с 4 кадрами —
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", 4-й кадр = 1-й
(замкнутый цикл).values — одинаковая
последовательность команд (M L Q T T L Z), меняются только координаты.
Иначе анимация d ломается. Разные слои могут иметь разное число гребней
(вырез 2–3, верхняя волна 4–5) — внутри одного элемента оно одинаково.Q+T (smooth quadratic): T автоматически зеркалит
контрольную точку предыдущей Q → идеально гладкая периодическая волна
без ручных расчётов.d-path не должны совпадать по фазе между слоями
(разные Q-точки, разное число гребней) — иначе слои сливаются в одну волну.y=-12 / y=-16
при размахе 4/6), иначе при анимации с края открывается полоска градиента.dur="1.5s" — скорость появления текста (можно 1–2s), begin="0.5s" —
задержка появления desc.dur="2s" — скорость мерцания footer (можно 1.5–3s).
README.md — всегда на английском (международный стандарт GitHub).README.<lang>.md — русская версия, зеркало: при изменении англ. версии
переносить правки в русскую (структуру заголовков 1:1, цифры, статусы).Устанавливать через 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'
Рекомендации по тегам:
Евл. Pages включён (gh api repos/<owner>/<repo>/pages):
https://<owner>.github.io/<repo>/ — проверять, что рабочаяgh repo edit --homepage https://…)docs//default-ветки, формат PNG/JPG/GIF, < 1 MB, ≥ 640×320,
рекомендовано 1280×640.v1.0.0, v1.1.0)..github/release.yml — автонотсы из merged PR по лейблам (features/docs/bugfix).Запускать при: новый сервис/фича/сага, смена стека, смена портов/схем, изменение контрактов, изменение процессов (CI/коммиты), любой релиз/гейт, delivery gate.
README.md отражает новое состояние (структура, сервисы, цифры тестов, статус).README.<lang>.md синхронизирован с англ. версией (заголовки 1:1).LICENSE на месте, owner/year корректны, GitHub распознаёт лицензию (spdx_id).CODE_OF_CONDUCT.md — полный текст Contributor Covenant 2.1 с контактом;
GitHub распознаёт как Covenant (key: contributor_covenant, не other).CONTRIBUTING.md, SECURITY.md, SUPPORT.md (имя строго в upper-case)..github/ISSUE_TEMPLATE/ (bug_report + feature_request, forms yml) и
.github/pull_request_template.md на месте с валидным frontmatter
(name+about для .md, name+description для .yml).gh repo edit --description актуально, перечисляет ВСЕ компоненты (≤350 символов на UI).gh api .../topics) актуальны, ≤ 20, lowercase, ≤ 50 символов каждый.gh repo edit --homepage https://<user>.github.io/<repo>/) — при Pages; рабочая ссылка.gh api repos/<owner>/<repo>/community/profile → health_percentage >= 100,
files.issue_template и files.pull_request_template не null.has_discussions желательно true (Discussions включены) для вопросов..github/release.yml настроен.CHANGELOG.md (Keep a Changelog) обновлён под новый релиз.# Файлы на месте
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 минут после пуша — проверять не сразу после коммита, а с небольшой паузой.
README.md без явной просьбы, если он уже актуален — скилл для
проверки/обновления, а не для «улучшательств».git add README.md README.ru.md && git commit && git push
(только по запросу пользователя).Полный разбор — в references/canonical-patterns.md. Ключевые каноны:
GET /repos/{owner}/{repo}/community/profile) — эталонный аудит с метрикой health_percentage (эталон github/docs = 100%), готовый чеклист файлов..github репозиторий, приоритет поиска файлов, правило «LICENSE не наследуется», полный список health-файлов (включая FUNDING.yml, GOVERNANCE.md).gh repo edit, gh release create) — полный набор флагов: add/remove-topic, template, default-branch, enable-* (advanced-security, secret-scanning), draft-then-publish flow для релизов, immutable releases.contributor_covenant в community profile).