chore: обновить правила коммитов и улучшить форматирование релизных заметок
Docker images / prepare-release (push) Successful in 5s
Docker images / backend-image (push) Successful in 1m33s
Docker images / frontend-image (push) Successful in 1m39s
Docker images / updater-image (push) Successful in 37s
Docker images / notify-webhook (push) Has been skipped
Docker images / publish-release (push) Successful in 6s

- Уточнены правила формирования сообщений коммитов, включая использование русского языка и уточнение типов изменений (fix/chore/feat).
- Добавлена функция для форматирования заголовков коммитов в компоненте модалки релизов, улучшая читаемость.
- Обновлены ссылки на правила коммитов в документации для большей ясности.
This commit is contained in:
Denozordec
2026-05-12 18:06:29 +07:00
parent c2a8a08618
commit 0435608ef9
7 changed files with 66 additions and 20 deletions
+33
View File
@@ -0,0 +1,33 @@
---
description: "Generate Commit Message: русский subject, fix vs feat, Conventional Commits"
alwaysApply: true
---
# Git commit message (Generate Commit Message)
При **Generate Commit Message**, автогенерации subject и предложении `git commit`:
## Язык
- После `:` — **только русский**. Английский в subject/body запрещён.
- Префикс и scope — английский: `fix(ui):`, `chore(rules):`.
## Тип: сначала не `feat`
- **`fix`** — баг, регрессия, правка вёрстки/модалки, некорректное поведение, CI/CD, мелкий дефект.
- **`chore` / `docs` / `ci` / `build`** — правила Cursor, README, workflow, зависимости, рефакторинг без новой UX-фичи.
- **`feat`** — только **новая** пользовательская возможность (страница, API, сценарий), которой не было.
Если сомневаешься между `feat` и `fix` — выбирай **`fix`** или **`chore`**, не `feat`.
## Примеры
- `fix(ui): выровнять модалку сводки релиза`
- `fix(ci): исправить сборку release manifest`
- `chore(rules): усилить правила русских commit message`
- `feat(releases): добавить страницу релизов`
## Запрещено
- `feat: update layout`, `fix: add modal`, `chore: update rules` — английский subject.
- `feat` для правки UI, правил, документации и багфиксов.
+1 -1
View File
@@ -27,4 +27,4 @@ alwaysApply: false
## Связь с проектом
- Полные стандарты проекта (формат ответа, чеклисты) — в правиле **`next-shadcn-production.mdc`** (обычно уже подключено). Эти правила **дополняют** его ролью в пайплайне, не отменяют.
- Сообщения коммитов и ожидаемый semver bump — в **`release-versioning.mdc`**.
- Сообщения коммитов: **`commit-messages-ru.mdc`** (язык и `fix` vs `feat`), semver bump — **`release-versioning.mdc`**.
+1 -1
View File
@@ -18,7 +18,7 @@ alwaysApply: false
- Выравнивать UI/UX с **`/servers`** как с главным эталоном (layout, отступы, сетка, типографика, композиция).
- Предпочитать **Server Components**; `'use client'` — только при необходимости интерактива (состояние, браузерные API, обработчики).
- UI: по возможности **shadcn/ui**; не вводить новый визуальный/UX-паттерн, если на `/servers` уже есть эквивалент.
- При завершении задачи предлагать subject коммита по **`release-versioning.mdc`** (`fix:` для patch, `feat:` для minor), **описание на русском**.
- При завершении задачи предлагать subject по **`commit-messages-ru.mdc`**: правки UI/багов → `fix`, инфраструктура/правила → `chore`, новая фича → `feat`; описание **на русском**.
## Формат вывода (строго)
+1 -1
View File
@@ -9,7 +9,7 @@ alwaysApply: true
**Язык:** все ответы пользователю — **только на русском**.
**Git / Generate Commit Message:** subject и body коммита — **на русском** (префикс `feat`/`fix`/scope — на английском). Подробности — **`release-versioning.mdc`**.
**Git / Generate Commit Message:** subject и body — **на русском**; `feat` только для новой UX-фичи, иначе `fix`/`chore`. См. **`commit-messages-ru.mdc`** и **`release-versioning.mdc`**.
## 1. Документация в первую очередь
+4 -2
View File
@@ -11,8 +11,10 @@ alwaysApply: true
- Формат: `тип(scope): описание на русском` — префикс Conventional Commits и scope **на английском**, текст после `:` **только на русском**.
- Body и footer (если нужны) — **только на русском**.
- Не использовать английские глаголы в subject: `add`, `update`, `fix`, `implement`, `rename` и т.п.
- Примеры: `feat(releases): добавить модалку сводки релиза`; `fix(ci): исправить сборку release manifest`.
- В описании после `:` не использовать английские слова: `add`, `update`, `implement`, `rename` и т.п.
- **`feat` не по умолчанию.** Сначала проверь `fix` / `chore` / `ci` / `docs`; `feat` — только новая пользовательская возможность.
- Примеры: `fix(ui): выровнять модалку релиза`; `chore(rules): усилить правила commit message`; `feat(releases): добавить страницу релизов`.
- Детальный чеклист типов — **`commit-messages-ru.mdc`**.
- Версию **не** править вручную в UI, `package.json` и git-тегах; bump делает CI через [`.ci/scripts/compute-release.mjs`](.ci/scripts/compute-release.mjs).
- Базовая линия: `v1.0.0`. Формат отображения: `v1.2.3`.
+5 -5
View File
@@ -2,10 +2,10 @@
## Сообщения коммитов
При **Generate Commit Message**, предложении subject для `git commit` и любой автогенерации commit message:
При **Generate Commit Message** и любой автогенерации commit message:
- Формат: `feat(scope): описание на русском` (префикс и scope — английский Conventional Commits).
- Текст после двоеточия и body — **только на русском**.
- Плохо: `feat(ui): add release modal`. Хорошо: `feat(ui): добавить модалку сводки релиза`.
1. Subject после `:`**только на русском**.
2. **`feat` не по умолчанию.** Правка UI/бага/CI → `fix`; правила/README/workflow → `chore`/`ci`; новая пользовательская фича → `feat`.
3. Формат: `fix(ui): выровнять модалку релиза`.
Полные правила semver и примеры`.cursor/rules/release-versioning.mdc`.
Полные правила: `.cursor/rules/commit-messages-ru.mdc`, semver`.cursor/rules/release-versioning.mdc`.
+21 -10
View File
@@ -16,6 +16,13 @@ import { formatAppVersionLabel, getAppVersion } from "@/lib/app-version"
import type { ReleaseManifest } from "@/lib/release-manifest"
import { hasSeenReleaseModal, markReleaseModalSeen } from "@/lib/release-modal-storage"
function formatCommitSubject(subject: string): string {
return subject.replace(
/^(feat|fix|chore|docs|refactor|style|test|build|ci)(\([^)]+\))?!?:\s*/i,
"",
)
}
export function ReleaseNotesModal() {
const [open, setOpen] = React.useState(false)
const [manifest, setManifest] = React.useState<ReleaseManifest | null>(null)
@@ -56,37 +63,41 @@ export function ReleaseNotesModal() {
return (
<Dialog open={open} onOpenChange={handleOpenChange}>
<DialogContent className="flex max-h-[min(85vh,720px)] flex-col gap-0 overflow-hidden p-0 sm:max-w-[560px]">
<DialogHeader className="gap-1 border-b px-6 py-4">
<DialogTitle>Что нового в {versionLabel}</DialogTitle>
<DialogDescription>
<DialogContent className="flex max-h-[min(85vh,720px)] w-full max-w-[calc(100%-2rem)] flex-col gap-0 overflow-hidden p-0 sm:max-w-lg">
<DialogHeader className="gap-1.5 border-b px-6 py-5 pr-12 text-left">
<DialogTitle className="text-base leading-snug">
Что нового в {versionLabel}
</DialogTitle>
<DialogDescription className="text-sm leading-relaxed">
Краткая сводка изменений текущего релиза MikrotikManager.
</DialogDescription>
</DialogHeader>
<div className="flex-1 overflow-y-auto px-6 py-4">
<div className="min-h-0 flex-1 overflow-y-auto px-6 py-4">
{manifest?.commits.length ? (
<ul className="flex flex-col gap-3">
<ul className="flex flex-col gap-2">
{manifest.commits.map((commit) => (
<li
key={commit.sha}
className="flex flex-col gap-2 rounded-lg border bg-card px-3 py-2.5"
className="rounded-lg border bg-card/80 p-3"
>
<div className="flex flex-wrap items-center gap-2">
<div className="flex flex-wrap items-center gap-x-2 gap-y-1">
<Badge variant="secondary" className="font-mono uppercase">
{commit.type}
</Badge>
<span className="font-mono text-xs text-muted-foreground">{commit.shortSha}</span>
<span className="text-xs text-muted-foreground">{commit.author}</span>
</div>
<p className="text-sm leading-relaxed">{commit.subject}</p>
<p className="mt-2 text-sm leading-relaxed text-foreground">
{formatCommitSubject(commit.subject)}
</p>
</li>
))}
</ul>
) : null}
</div>
<DialogFooter className="border-t bg-muted/30 px-6 py-4 sm:justify-between">
<DialogFooter className="mx-0 mb-0 shrink-0 gap-3 border-t bg-muted/30 px-6 py-4 sm:flex-row sm:items-center sm:justify-between">
<Button
variant="outline"
render={<Link href="/releases" />}