diff --git a/.opencode/skills/repo-readme/SKILL.md b/.opencode/skills/repo-readme/SKILL.md index 92973aa..3a3e0e4 100644 --- a/.opencode/skills/repo-readme/SKILL.md +++ b/.opencode/skills/repo-readme/SKILL.md @@ -159,7 +159,9 @@ repos/{owner}/{repo}/contents/README.md` с base64-контентом и SHA. features), непустой контент между ними, H1 title prefix `# 🚀 `, ссылку `slaid098.dev/support`, секции Quick Start (EN) и Быстрый старт (RU), language switcher `[English]` / `[Русский]`, заголовок `## 🇷🇺 Русский` (не "Русская -версия"), anchor `[Русский](#-русский)` (не `#-русская-версия`). Шаги +версия"), anchor `[Русский](#-русский)` (не `#-русская-версия`). Флагирует +ручной заголовок `## License` / `## LICENSE` / `## Лицензия` как ERROR — +дубликат GitHub sidebar (GitHub рендерит license из LICENSE-файла). Шаги `quick_start_steps_*` не влияют на валидацию — они рендерятся вне delimiter-пар (summary/features). diff --git a/.opencode/tools/create-readme.ts b/.opencode/tools/create-readme.ts index 5530ac5..a0b0d70 100644 --- a/.opencode/tools/create-readme.ts +++ b/.opencode/tools/create-readme.ts @@ -171,6 +171,8 @@ function validateReadme(content: string): { ok: boolean; issues: string[] } { if (!content.includes("# 🚀 ")) issues.push("Missing H1 title prefix '# 🚀 '") + if (/^##\s+(License|LICENSE|Лицензия)\s*$/m.test(content)) + issues.push("Manual License section found — remove it (GitHub renders license from LICENSE file)") if (!content.includes("slaid098.dev/support")) issues.push("Missing Support link (slaid098.dev/support)") if (!content.includes("Quick Start")) diff --git a/README.md b/README.md index 70edc34..c50129a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # 🚀 opencode-config + > Portable AI coding assistant config with memory & subagent pipeline + + +> Переносимый конфиг AI-ассистента для кодинга с памятью и пайплайном subagent'ов + [English](#-english) | [Русский](#-русский) @@ -85,8 +90,4 @@ docker compose up -d ## 💬 Support and contacts / Поддержка и контакты -👉 **[slaid098.dev/support](https://slaid098.dev/support)** - -## License - -MIT — see [LICENSE](LICENSE). \ No newline at end of file +👉 **[slaid098.dev/support](https://slaid098.dev/support)** \ No newline at end of file diff --git a/docs/decisions/065-pr-153-block-license-align-readme.md b/docs/decisions/065-pr-153-block-license-align-readme.md new file mode 100644 index 0000000..d05efba --- /dev/null +++ b/docs/decisions/065-pr-153-block-license-align-readme.md @@ -0,0 +1,37 @@ +# ADR-065: Block manual License section in validateReadme + +## Статус + +Accepted (2026-07-30) + +## Контекст + +`validateReadme` (тулза `create-readme`) проверяла структуру README для парсинга витриной slaid098.dev, но не контролировала дублирование License-секции. GitHub автоматически рендерит license в sidebar репозитория (из LICENSE-файла и/или настроек repo). Ручной `## License` в README — дубликат, который расходится с источником правды и засоряет валидацию стандарта. + +Часть README этого репо содержала ручной `## License` + `MIT — see [LICENSE](LICENSE).`, который нужно убрать одновременно с приведением tagline к новому стандарту (PR #151). + +## Решение + +Добавить в `validateReadme` ERROR-чек после H1 prefix check: + +```ts +if (/^##\s+(License|LICENSE|Лицензия)\s*$/m.test(content)) + issues.push("Manual License section found — remove it (GitHub renders license from LICENSE file)") +``` + +Ключевые свойства regex `^##\s+(License|LICENSE|Лицензия)\s*$` с `m`-флагом: +- Матчит только заголовки секций в начале строки (`## License`, `## LICENSE`, `## Лицензия`). +- НЕ матчит упоминания "license" внутри текста, features-таблиц или custom-sections — `^`/`$` с `m`-флагом ограничивают совпадение целой строкой. +- Регистро-варианты `License`/`LICENSE` покрыты явно; кириллический `Лицензия` — отдельно. + +Source of truth для license — файл `LICENSE` + GitHub repo settings, не README. + +## Альтернативы + +- **Не валидировать license** (status quo) — оставляет дубликаты, расходится с принципом "README = только showcase-контент, метаданные — в GitHub". +- **Удалять `## License` автоматически в create-режиме** — слишком магически; валидатор + явная правка надёжнее и прозрачнее для аудита. +- **Через `includes("## License")`** вместо regex — словило бы `## License` в любом контексте и `### Subsection under License`, плюс false-positive на упоминания. Regex с `^...$` + `m`-флагом точнее. + +## Известные последствия (backward compatibility) + +Новый license-check помечает `invalid` существующие README других репо slaid098, где есть ручной `## License`/`## Лицензия`. Это intentional — такие README регенерируются/чищутся отдельным шагом после merge (зафиксировано в handoff, секция Pending). diff --git a/docs/handoff/pr-153-block-license-align-readme.md b/docs/handoff/pr-153-block-license-align-readme.md new file mode 100644 index 0000000..1f5fc10 --- /dev/null +++ b/docs/handoff/pr-153-block-license-align-readme.md @@ -0,0 +1,27 @@ +--- +pr: 153 +title: "feat(create-readme): block manual License section and align repo README tagline" +--- + +## Что сделано + +- `validateReadme` (`.opencode/tools/create-readme.ts`): новый ERROR-чек после H1 prefix check — regex `^##\s+(License|LICENSE|Лицензия)\s*$` с `m`-флагом флагирует ручной заголовок License-секции как дубликат GitHub sidebar. +- `README.md` (3 правки): + - EN tagline (line 2) обёрнут в `` / ``. + - Добавлен RU tagline `> Переносимый конфиг AI-ассистента для кодинга с памятью и пайплайном subagent'ов` в `` / ``. + - Удалена ручная License-секция (`## License` + `MIT — see [LICENSE](LICENSE).`); файл LICENSE в репо остаётся, GitHub рендерит license в sidebar. +- `.opencode/skills/repo-readme/SKILL.md`: в список checks `validate` добавлен пункт про флаг `## License` / `## LICENSE` / `## Лицензия` как ERROR (дубликат GitHub sidebar). +- Smoke-тест (temp, удалён): 10 assertions / 4 сценария — updated README → ok; +`## License` → flagged; old format без tagline delimiters → 4 tagline issues (regression); "license" в features-table без `## License` заголовка → false-positive не триггерит. ALL PASS. + +## Почему + +Issue #152. После PR #151 (`tagline` → `tagline_en` + `tagline_ru` с delimiter-тегами) README этого репо не соответствовал новому стандарту: EN tagline был без delimiterов, RU tagline отсутствовал. Параллельно валидатор не ловил ручную License-секцию — дубликат GitHub sidebar (GitHub рендерит license из LICENSE-файла). Объединено по решению пользователя: обе части про соответствие стандарту README. + +## Pending + +— После merge: другие репо slaid098 с ручным `## License` в README станут invalid при `validate`. Регенерация/чистка делается отдельным шагом (не в этом PR). + +## Watch out + +- Новый license-check — intentional breaking change для существующих README с ручным `## License`. См. ADR-065. +- Regex матчит только заголовки в начале строки (`^##\s+...` с `m`-флагом), НЕ упоминания "license" в тексте/таблицах — проверено smoke-тестом scenario 4.