From 07ec5a38308b8e75320e02d69c053730019dbb93 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Sun, 1 Mar 2026 20:42:53 +0300 Subject: [PATCH] =?UTF-8?q?docs(skills):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20Gemini?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - Heredoc может ломать некоторых агентов (например Gemini), нужен фолбэк. - Что: - добавлены 3 способа выполнения git commit (Heredoc / tmp-файл / stdin одной командой). - уточнены правила переносов строк и запрета -m. - Проверка: - git diff --cached -- agents/.agents/skills/conventional-commits/SKILL.md --- .../skills/conventional-commits/SKILL.md | 87 ++++++++++--------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/agents/.agents/skills/conventional-commits/SKILL.md b/agents/.agents/skills/conventional-commits/SKILL.md index 6504f09..322d6fd 100644 --- a/agents/.agents/skills/conventional-commits/SKILL.md +++ b/agents/.agents/skills/conventional-commits/SKILL.md @@ -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`).** # Правила заголовка * Формат: `(): <описание>` @@ -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' -(): <описание> +## Способ A (Heredoc, рекомендован по умолчанию) +Используй ровно такой шаблон (важно `<<'EOF'`, чтобы не было интерполяции): -- Зачем: - - <текст> -- Что: - - <текст> -- Проверка: - - <текст> -EOF +`git commit -F- <<'EOF'` +`(): <описание>` +`` +`- Зачем:` +` - <текст>` +`- Что:` +` - <текст>` +`- Проверка:` +` - <текст>` +`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