docs(skills): добавлены варианты коммита для совместимости Gemini

- Зачем:
  - Heredoc может ломать некоторых агентов (например Gemini), нужен фолбэк.
- Что:
  - добавлены 3 способа выполнения git commit (Heredoc / tmp-файл / stdin одной командой).
  - уточнены правила переносов строк и запрета -m.
- Проверка:
  - git diff --cached -- agents/.agents/skills/conventional-commits/SKILL.md
This commit is contained in:
ddadmin committed 2026-03-01 20:42:53 +03:00
1 parent 6cac374180
commit 07ec5a3830
1 file changed
+47 -40
@@ -1,17 +1,20 @@
---
name: conventional-commits
description: "ОБЯЗАТЕЛЬНО вызывай этот навык каждый раз, когда пользователь просит сделать коммит, написать сообщение для git, зафиксировать изменения или проанализировать git diff. Навык содержит критически важные правила формата Conventional Commits и безопасного синтаксиса Bash (Heredoc)."
description: "ОБЯЗАТЕЛЬНО вызывай этот навык каждый раз, когда пользователь просит сделать коммит, написать сообщение для git, зафиксировать изменения или проанализировать git diff. Навык содержит критически важные правила формата Conventional Commits и безопасный способ выполнения коммита через временный файл."
---
# Твоя роль
Ты — педантичный Release Manager и Senior Engineer. Твоя единственная задача — анализировать изменения в коде (diff) и формировать строго структурированные git-коммиты, выполняя их через терминал.
Ты — педантичный Release Manager и Senior Engineer. Твоя единственная задача — анализировать изменения в коде (diff) и формировать строго структурированные git-коммиты.
# Алгоритм действий
1. Изучи измененные файлы через `git status` и `git diff` (или `git diff --cached`, если файлы уже в индексе).
2. **ВАЖНО:** Если пользователь просит сделать `amend` (дополнить/изменить предыдущий коммит), ОБЯЗАТЕЛЬНО сначала прочитай текущее сообщение коммита с помощью команды `git log -1 --pretty=%B`.
3. Определи язык: по умолчанию всегда используй Русский. Английский используй ТОЛЬКО если пользователь явно передал флаг `lang:en`.
4. Сформируй заголовок и тело коммита.
5. Выполни коммит в терминале, строго используя метод Heredoc (EOF).
5. **Выполни коммит (выбери способ):**
- **Способ A (по умолчанию, самый простой): Heredoc в `git commit -F-`.**
- **Способ B (если Heredoc ломает агента, например Gemini): временный файл `.git_commit_msg.tmp` + `git commit -F`.**
- **Способ C (если нельзя Heredoc и неудобно писать файл): сгенерировать сообщение одной командой и передать в stdin `git commit -F-` (например через `python3 -c`).**
# Правила заголовка
* Формат: `<type>(<scope>): <описание>`
@@ -34,47 +37,52 @@ description: "ОБЯЗАТЕЛЬНО вызывай этот навык кажд
* Всегда используй именно список с маркерами `-`, как в шаблоне выше.
* Обязательные секции: `Зачем`, `Что`, `Проверка`.
* Внутри каждой секции минимум 1 подпункт.
* В секции `Что` обычно 1-3 подпункта с фактами по diff.
* В секции `Что` обычно 1–3 подпункта с фактами по diff.
# Строгое правило форматирования (Анти-экранирование)
КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО использовать литералы `\n`, `\r`, `\t` в тексте коммита. Для разделения строк используй ТОЛЬКО реальные переносы (пустые строки) внутри блока Heredoc.
НЕПРАВИЛЬНО:
Зачем: текст.\nЧто: текст.
ПРАВИЛЬНО:
- Зачем:
- текст.
- Что:
- текст.
# Правило переносов строк
В тексте коммита должны быть реальные переносы строк. Не пиши буквальные `\n`, `\r`, `\t` как часть текста сообщения.
# Специфические правила для Amend
Если пользователь просит дополнить коммит (`amend`), твоя задача — обновить сообщение так, чтобы оно выглядело как единое целое, без следов "дополнения".
Если пользователь просит дополнить коммит (`amend`), твоя задача — обновить сообщение так, чтобы оно выглядело как единое целое.
1. **Сбор контекста:** Обязательно прочитай текущее сообщение коммита (`git log -1 --pretty=%B`) и оцени ОБЩИЙ объем изменений (оригинальный коммит + новые файлы в индексе, для этого используй `git diff HEAD~1`).
2. **Секция "Зачем":** НИКОГДА не меняй и не удаляй эту секцию из старого коммита. Бизнес-контекст при amend обычно не меняется.
3. **Секция "Что":** Сгенерируй этот список ЗАНОВО. Он должен лаконично описывать весь итоговый код (и старый, и новый).
- Не используй слова "добавлено при amend", "также забыли".
- Игнорируй в описании микро-изменения (исправление опечаток, линтер), если они не несут архитектурного смысла.
4. **Секция "Проверка":** Оставь старую, либо обнови, если новые изменения требуют другого подхода к тестированию.
1. **Сбор контекста:** Прочитай старое сообщение (`git log -1 --pretty=%B`) и оцени весь объем изменений (`git diff HEAD~1`).
2. **Секция "Зачем":** НИКОГДА не меняй эту секцию из старого коммита.
3. **Секция "Что":** Сгенерируй этот список ЗАНОВО для всего итогового кода.
4. **Секция "Проверка":** Оставь старую, либо обнови, если тесты изменились.
# Правила выполнения команд
ЗАПРЕЩЕНО использовать флаги `-m`. РАЗРЕШЕНО использовать только формат передачи через Heredoc:
ЗАПРЕЩЕНО использовать флаг `-m` напрямую в консоли.
git commit -F- <<'EOF'
<type>(<scope>): <описание>
## Способ A (Heredoc, рекомендован по умолчанию)
Используй ровно такой шаблон (важно `<<'EOF'`, чтобы не было интерполяции):
- Зачем:
- <текст>
- Что:
- <текст>
- Проверка:
- <текст>
EOF
`git commit -F- <<'EOF'`
`<type>(<scope>): <описание>`
``
`- Зачем:`
` - <текст>`
`- Что:`
` - <текст>`
`- Проверка:`
` - <текст>`
`EOF`
Для amend: `git commit --amend -F- <<'EOF' ... EOF`
## Способ B (Gemini-safe: временный файл)
1. Запиши сообщение в `.git_commit_msg.tmp` любым доступным способом (инструментом записи файла / редактором / патчем).
2. Выполни `git commit -F .git_commit_msg.tmp` (или `git commit --amend -F .git_commit_msg.tmp`).
3. Удали файл: `rm -f .git_commit_msg.tmp`.
## Способ C (одна команда, без Heredoc и без файла)
Если среда/агент плохо переносит многострочные команды, можно передать сообщение в stdin одной строкой.
Пример с Python (внутри команды допускаются `\\n`, т.к. в итоговом коммите будут реальные переносы строк):
`python3 -c "print('feat(x): заголовок\\n\\n- Зачем:\\n - ...\\n- Что:\\n - ...\\n- Проверка:\\n - ...')" | git commit -F-`
# Идеальные примеры
Пример 1 (Русский, новая фича):
Пример 1 (Русский, новая фича, способ A):
git commit -F- <<'EOF'
feat(sql): добавлен скрипт валидации данных для DWH слоя
@@ -87,7 +95,7 @@ feat(sql): добавлен скрипт валидации данных для
- psql -f dwh-modeling/sql/04_validation.sql.
EOF
Пример 2 (Русский, багфикс):
Пример 2 (Русский, багфикс, способ A):
git commit -F- <<'EOF'
fix(airflow): увеличен таймаут подключения ClickHouse
@@ -99,7 +107,7 @@ fix(airflow): увеличен таймаут подключения ClickHouse
- тестовый запуск таски в Airflow UI.
EOF
Пример 3 (Английский, lang:en):
Пример 3 (Английский, lang:en, способ A):
git commit -F- <<'EOF'
refactor(docker): optimize postgres-bookings image size
@@ -112,11 +120,11 @@ refactor(docker): optimize postgres-bookings image size
- docker build and check image size.
EOF
Пример 4 (Русский, логика amend):
Исходный коммит содержал только изменение `conn_timeout` до 120 секунд.
Пример 4 (Русский, логика amend, способ B):
Исходный коммит содержал только изменение `conn_timeout` до 120 секунд.
Пользователь делает amend и добавляет пропущенный файл конфига `airflow_local_settings.py`.
Твой результат:
git commit --amend -F- <<'EOF'
Сообщение (в `.git_commit_msg.tmp`):
fix(airflow): увеличен таймаут подключения ClickHouse и обновлен конфиг
- Зачем:
@@ -126,4 +134,3 @@ fix(airflow): увеличен таймаут подключения ClickHouse
- настройки таймаута применены на уровне воркеров в airflow_local_settings.py.
- Проверка:
- тестовый запуск таски в Airflow UI.
EOF