diff --git a/.cursor/commands/commit-message.md b/.cursor/commands/commit-message.md
index 35a84ff..af4744d 100644
--- a/.cursor/commands/commit-message.md
+++ b/.cursor/commands/commit-message.md
@@ -32,6 +32,6 @@ powershell -NoProfile -File scripts/commit/staged-context.ps1
- Новая пользовательская возможность → `feat` (minor)
- Починка ожидаемого поведения / баг → `fix` (patch)
- Follow-up баги после недавнего `feat` в том же scope → **`fix`**, не `feat`
-- Только перестройка без нового поведения → `refactor` (none)
+- Только перестройка без нового поведения → `refactor` (patch, без новых функций)
Заголовок — EN, императив, ≤72 символов. Тело — RU.
diff --git a/.cursor/rules/conventional-commits.mdc b/.cursor/rules/conventional-commits.mdc
index b008b5f..1b88fc9 100644
--- a/.cursor/rules/conventional-commits.mdc
+++ b/.cursor/rules/conventional-commits.mdc
@@ -50,7 +50,7 @@ powershell -NoProfile -File scripts/commit/staged-context.ps1
| `feat` | **новая** пользовательская возможность (раньше нельзя было) | minor |
| `fix` | восстановление **ожидаемого** поведения; баг, регрессия, падение UI | patch |
| `perf` | ускорение без смены API | patch |
-| `refactor` | реструктуризация **без** новой возможности и **без** исправления бага | — |
+| `refactor` | реструктуризация **без** новой возможности и **без** исправления бага | patch |
| `docs` | только документация | — |
| `test` | тесты | — |
| `ci` | CI/CD (`.gitea/`, workflows); правки, из‑за которых нужны новые образы | patch |
@@ -62,7 +62,7 @@ powershell -NoProfile -File scripts/commit/staged-context.ps1
1. Появилось **новое** действие / экран / API / настройка, которых не было → `feat`
2. То, что **должно было работать**, не работало (кнопки, диалоги, сохранение, 500) → `fix`
-3. Только перестройка кода или UI на другой паттерн, поведение для пользователя то же → `refactor`
+3. Только перестройка кода или UI на другой паттерн, поведение для пользователя то же → `refactor` (patch, без новых функций)
4. Ускорение без изменения контракта → `perf`
**Не путать с формулировкой diff:**
@@ -105,7 +105,7 @@ feat(web): migrate modules list to AppDataTable
# Хорошо — если не было нового user-facing
refactor(web): migrate modules list to AppDataTable
-Единый паттерн таблиц; поведение списка модулей без изменений.
+Единый паттерн таблиц; поведение списка модулей без изменений. Semver: patch.
```
```
diff --git a/.cursor/skills/commit-message/SKILL.md b/.cursor/skills/commit-message/SKILL.md
index 0168b88..5a38ebb 100644
--- a/.cursor/skills/commit-message/SKILL.md
+++ b/.cursor/skills/commit-message/SKILL.md
@@ -101,7 +101,7 @@ git commit -m "$( @'
| Пользователь получает **новую** возможность? | `feat` (minor) |
| Восстанавливается **ожидаемое** поведение / устранён баг? | `fix` (patch) |
| Только скорость, контракт тот же? | `perf` (patch) |
-| Только структура кода/UI, поведение то же? | `refactor` (none) |
+| Только структура кода/UI, поведение то же? | `refactor` (patch) |
**Follow-up:** правки сразу после `feat` в том же scope без новой возможности → **`fix`**, не `feat` (слова *enhance/improve/refactor* в задаче не делают commit `feat`).
diff --git a/.releaserc.json b/.releaserc.json
index 18bce23..350fcf9 100644
--- a/.releaserc.json
+++ b/.releaserc.json
@@ -11,6 +11,7 @@
{ "type": "fix", "release": "patch" },
{ "type": "perf", "release": "patch" },
{ "type": "ci", "release": "patch" },
+ { "type": "refactor", "release": "patch" },
{ "breaking": true, "release": "major" }
]
}
diff --git a/docs/releasing.md b/docs/releasing.md
index e0a8eab..6e8c367 100644
--- a/docs/releasing.md
+++ b/docs/releasing.md
@@ -7,9 +7,11 @@ EvoBGP использует [Conventional Commits](https://www.conventionalcommi
| Тип коммита | Bump |
|-------------|------|
| `feat` | minor (1.0.0 → 1.1.0) |
-| `fix`, `perf`, `ci` | patch (1.5.1 → 1.5.2) |
+| `fix`, `perf`, `ci`, `refactor` | patch (1.5.1 → 1.5.2) |
| `feat!`, `fix!` или `BREAKING CHANGE:` в теле | major (1.0.0 → 2.0.0) |
-| `docs`, `chore`, `test`, `refactor` | без релиза |
+| `docs`, `chore`, `test` | без релиза |
+
+`refactor` — patch без новых функций: перестройка кода/UI при том же поведении для пользователя. По semver на одном уровне с `fix`, но семантически «мельче» `feat` (не minor).
Отдельного суффикса `1.x.y.fix` в semver нет: «fix» в Conventional Commits означает **patch** (третья цифра). Для починки пайплайна без смены продукта — `fix(ci):` или `ci:` (оба дают patch после настройки `.releaserc.json`).
diff --git a/web/src/lib/components/network/BirdSettingsForm.svelte b/web/src/lib/components/network/BirdSettingsForm.svelte
new file mode 100644
index 0000000..a3e09c4
--- /dev/null
+++ b/web/src/lib/components/network/BirdSettingsForm.svelte
@@ -0,0 +1,212 @@
+
+
+
+
+ Control plane
+
+ Глобальные параметры BIRD для pipeline refresh/apply. Сохранение через
+ PATCH /v1/settings (роль operator).
+
+
+
+
+
+ Подстановка в конфиг
+
+ Значения используются при генерации BIRD-конфигурации в pipeline (router id, local AS,
+ адреса). Пиры и спикеры настраиваются на соседних вкладках.
+
+
+
+ {#if loading && !loaded}
+
Загрузка…
+ {:else if !loaded}
+
+ {:else}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if hasValidationErrors}
+
+ Есть ошибки в полях. Исправьте их, чтобы сохранить изменения.
+
+
+
+ Operator-only
+
+ Изменение параметров через PATCH /v1/settings требует роли operator.
+ При отсутствии прав API вернёт 403.
+
+
+
+
+
+ Хранение ревизий
+
+ Автоматическая очистка старых ревизий. Последняя раскатанная ревизия не удаляется.
+
+
+
+ {#if loading && !loaded}
+
diff --git a/web/src/routes/operations/+page.svelte b/web/src/routes/operations/+page.svelte
index 12bf745..a170ffa 100644
--- a/web/src/routes/operations/+page.svelte
+++ b/web/src/routes/operations/+page.svelte
@@ -53,6 +53,7 @@
import OperationsDiffTab from '$lib/components/operations/OperationsDiffTab.svelte';
import OperationsJobsTab from '$lib/components/operations/OperationsJobsTab.svelte';
import OperationsJobsFilters from '$lib/components/operations/OperationsJobsFilters.svelte';
+ import OperationsSystemSettingsTab from '$lib/components/operations/OperationsSystemSettingsTab.svelte';
import type {
JobDetailedReport,
JobLogEntry,
@@ -80,10 +81,10 @@
import Info from '@lucide/svelte/icons/info';
import ArrowRight from '@lucide/svelte/icons/arrow-right';
- type OpsTab = 'revisions' | 'diff' | 'jobs';
+ type OpsTab = 'revisions' | 'diff' | 'jobs' | 'system';
function parseOpsTab(value: string | null): OpsTab {
- if (value === 'diff' || value === 'jobs') return value;
+ if (value === 'diff' || value === 'jobs' || value === 'system') return value;
return 'revisions';
}
@@ -882,12 +883,12 @@
- Три раздела на одной странице
+ Четыре раздела на одной страницеРевизии — история конфигов и откат; Сравнение — diff
префиксов;
- Задачи — ingest, apply, rollback. Apply и Reload требуют operator. Сводный
- мониторинг BGP — на
+ Задачи — ingest, apply, rollback; Система — TTL ревизий и
+ дополнительные KV. Apply и Reload требуют operator. Сводный мониторинг BGP — на
.
@@ -918,6 +919,7 @@
Ревизии ({revisions.length})СравнениеЗадачи ({jobs.length})
+ Система
@@ -982,6 +984,10 @@
jobStatusVariant={jobStatusBadgeVariant}
/>
+
+
+
+
diff --git a/web/src/routes/settings/+page.svelte b/web/src/routes/settings/+page.svelte
index 9f46148..0662a70 100644
--- a/web/src/routes/settings/+page.svelte
+++ b/web/src/routes/settings/+page.svelte
@@ -1,110 +1,33 @@
-
+
-
-
-
- {#each sectionItems as section (section.id)}
-
- {/each}
-
-
-
- {#if activeSection === 'token'}
-
-
-
API-ключ
-
- Bearer-токен хранится только в localStorage браузера. Для локального демо с
- EVOBGP_DEV_INSECURE=1
- используйте токен dev.
-
-
-
-
-
-
-
-
-
-
- {:else if loadingSettings}
-
Загрузка…
- {:else if apiSettings === null}
-
- {:else}
-
- {#if activeSection === 'bird'}
-
-
Параметры BIRD
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {:else if activeSection === 'revisions'}
-
-
Управление ревизиями
-
-
-
-
-
- {:else if activeSection === 'additional'}
-
-
-
Дополнительные настройки (KV)
-
-
-
- {#if additionalSettings.length === 0}
-
Нет дополнительных параметров.
- {/if}
-
-
- {#each additionalSettings as entry (entry.id)}
-
-
-
-
-
- {/each}
-
-
- {/if}
-
- {#if hasValidationErrors}
-
- Есть ошибки в полях. Исправьте их, чтобы сохранить изменения.
-
- {/if}
-
-
-
-
-
- {/if}
-
-
-
-
+
+ API-ключ
- GET/PATCH /v1/settings — глобальные параметры control plane (хранятся
- в БД). Требуется роль operator.
+ Bearer-токен хранится только в localStorage браузера. Для локального демо с
+ EVOBGP_DEV_INSECURE=1 используйте токен
+ dev.
+
+