# Release Checklist (Azərbaycan dili) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/RELEASE_CHECKLIST.md) · 🇪🇹 [am](../../../am/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇦 [ar](../../../ar/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇬 [bg](../../../bg/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇩 [bn](../../../bn/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇦 [bs](../../../bs/docs/ops/RELEASE_CHECKLIST.md) · 🇨🇿 [cs](../../../cs/docs/ops/RELEASE_CHECKLIST.md) · 🇩🇰 [da](../../../da/docs/ops/RELEASE_CHECKLIST.md) · 🇩🇪 [de](../../../de/docs/ops/RELEASE_CHECKLIST.md) · 🇬🇷 [el](../../../el/docs/ops/RELEASE_CHECKLIST.md) · 🇪🇸 [es](../../../es/docs/ops/RELEASE_CHECKLIST.md) · 🇪🇪 [et](../../../et/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇷 [fa](../../../fa/docs/ops/RELEASE_CHECKLIST.md) · 🇫🇮 [fi](../../../fi/docs/ops/RELEASE_CHECKLIST.md) · 🇫🇷 [fr](../../../fr/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇪 [ga](../../../ga/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [gu](../../../gu/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [ha](../../../ha/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇱 [he](../../../he/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [hi](../../../hi/docs/ops/RELEASE_CHECKLIST.md) · 🇭🇷 [hr](../../../hr/docs/ops/RELEASE_CHECKLIST.md) · 🇭🇺 [hu](../../../hu/docs/ops/RELEASE_CHECKLIST.md) · 🇦🇲 [hy](../../../hy/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇩 [id](../../../id/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [ig](../../../ig/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇹 [it](../../../it/docs/ops/RELEASE_CHECKLIST.md) · 🇯🇵 [ja](../../../ja/docs/ops/RELEASE_CHECKLIST.md) · 🇬🇪 [ka](../../../ka/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇭 [km](../../../km/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [kn](../../../kn/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇷 [ko](../../../ko/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇹 [lt](../../../lt/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇻 [lv](../../../lv/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ml](../../../ml/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [mr](../../../mr/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇾 [ms](../../../ms/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇹 [mt](../../../mt/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇲 [my](../../../my/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇵 [ne](../../../ne/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇱 [nl](../../../nl/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇴 [no](../../../no/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [or](../../../or/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [pa](../../../pa/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇭 [phi](../../../phi/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇱 [pl](../../../pl/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇹 [pt](../../../pt/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇴 [ro](../../../ro/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇺 [ru](../../../ru/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇰 [si](../../../si/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇰 [sk](../../../sk/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇮 [sl](../../../sl/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇸 [sr](../../../sr/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇪 [sv](../../../sv/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇪 [sw](../../../sw/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ta](../../../ta/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [te](../../../te/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇭 [th](../../../th/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇷 [tr](../../../tr/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇰 [ur](../../../ur/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇿 [uz](../../../uz/docs/ops/RELEASE_CHECKLIST.md) · 🇻🇳 [vi](../../../vi/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [yo](../../../yo/docs/ops/RELEASE_CHECKLIST.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/RELEASE_CHECKLIST.md) --- > **Son yenilənmə:** 2026-08-28 — v3.8.51 > Avtomatlaşdırma üçün Claude Code bacarıqlarından istifadə edən sadələşdirilmiş buraxılış prosesi. > > **Buraxılışlar arasında növbəni/budağı işlək saxlayın:** [RELEASE_GREEN.md](./RELEASE_GREEN.md) sənədinə baxın > (`/green-prs` ailəsi + `npm run check:release-green` + `/babysit` + gecəlik icra). Bunu vaxtaşırı — və xüsusilə > bu yoxlama siyahısından **əvvəl** — işə salmaq buraxılış PR-nin əvvəldən işlək vəziyyətdə olmasını təmin edir. ## Qısa xülasə ```bash # 1. Versiyanı artırın + CHANGELOG yaradın (bacarıq) /version-bump-cc patch # yaxud minor/major # 2. Keyfiyyət yoxlamasını lokal olaraq işə salın npm run check # lint + testlər npm run test:coverage # tam əhatə yoxlaması (60/60/60/60) # 3. Yığma və tüstü testi npm run build npm run test:e2e # istəyə bağlıdır, lakin tövsiyə olunur # 4. Buraxılışı yaradın (bacarıq) /generate-release-cc # 5. Yerləşdirin (bacarıq) /deploy-vps-both-cc # yaxud akamai-cc / local-cc # 6. Buraxılış sübutlarını toplayın (bacarıq) /capture-release-evidences-cc ``` ## npm Trusted Publishing (v3.8.51-dən etibarən standart) — sorğu əsasında mərhələli, ehtiyat variant kimi birbaşa `npm-publish.yml` standart olaraq **npm Trusted Publishing (OIDC)** vasitəsilə dərc edir: `stage-npm` işi (GitHub tərəfindən host edilir) həmin icra üçün GitHub id-token-i qısamüddətli npm etimadnaməsi ilə dəyişdirir — repozitoriyanın məxfi məlumatlarında uzunmüddətli npm tokeni yoxdur, 2FA sorğusu yoxdur, mənşə məlumatı əlavə olunur. 2FA-dan yayınan tokenlər dövriyyədən çıxarıldığı üçün bu, npm-in indi icazə verdiyi yan keçmə üsuludur; WS1.3 təminatını qoruyaraq layihənin v3.8.48-ə qədər malik olduğu tam avtomatik prosesi bərpa edir (sızdırılmış token təkbaşına dərc edə bilməz — çünki token yoxdur). **Birdəfəlik quraşdırma (sahib):** npmjs.com → `omniroute` paketi → Settings → _Trusted Publisher_ → GitHub: sahib `diegosouzapw`, repo `OmniRoute`, iş axını `npm-publish.yml` (mühit: yoxdur). Bu mövcud olana qədər avtomatik addım `ENEEDAUTH` xətası ilə uğursuz olacaq: `publish_mode=staged` (aşağıda) və ya `direct` ilə yenidən başladın. ### Mərhələli dərc (sorğu əsasında — `publish_mode=staged`) npm-publish iş axını artıq birbaşa dərc etmir: paketlənmiş tarball-ı işə salır (`check:pack-boot`) və sonra `npm stage publish` icra edir — həmin dəqiq baytlar reyestrdə saxlanılır, lakin sahib təsdiqləyənədək **quraşdırıla bilməz**. İnsan tərəfindən həyata keçirilən 2FA keçidi sübutdan əvvələ deyil, SONRAYA keçirilib. **İş axını uğurla tamamlandıqdan sonra sahibin icra edəcəyi proses:** 1. `npm stage list omniroute` — mərhələ ID-sini tapın (iş axınının xülasəsində də göstərilir). 2. Mərhələlənmiş baytları yoxlayın (tövsiyə olunur): `npm stage download `, sonra endirilmiş tarball-ı müvəqqəti prefiksə quraşdırın və işə salın (`npm run check:pack-boot` CI daxilində eyni paketlə→quraşdır→işə sal hökmünü avtomatlaşdırır). 3. `npm stage approve ` — 2FA sorğusu elə dərc prosesinin ÖZÜDÜR. `npm stage reject ` ləğv edir. 4. Dərcdən sonrakı qoruma: dərcdən sonrakı yoxlayıcı (v3.8.49 planının WS1.4 hissəsi) dərc edilmiş versiyanı təmiz konteynerdə ictimai reyestrdən quraşdırır və işə salır. **Fövqəladə ehtiyat variant:** `publish_mode=direct` ilə `workflow_dispatch` köhnə dərhal `npm publish` davranışını bərpa edir (yalnız mərhələləmənin özündə problem olduqda istifadə edin; səbəbini qeyd edin). **Birdəfəlik sərtləşdirmə (sahib, npmjs.com):** `omniroute` üçün Trusted Publisher-i yalnız mərhələləmə rejimində konfiqurasiya edin ki, sızdırılmış uzunmüddətli token heç bir yerdən birbaşa `npm publish` edə bilməsin — CI yalnız mərhələləyə bilər; yalnız sahibin 2FA-sı buraxılışı həyata keçirir. **Pozulmuş artefakt üzrə təlimat (dəyişməyib):** standart ilkin reaksiya kimi `npm deprecate omniroute@ " — use "` istifadə edin (dəqiqələr çəkir, geri qaytarıla bilər); `npm unpublish` yalnız 72 saatlıq/asılılığı olmayanlar pəncərəsi daxilində və heç vaxt ilk addım kimi deyil. Docker: versiya teqini heç vaxt yenidən yazmayın — geriyə qaytarma `latest` teqinin sonuncu işlək digest-ə yönləndirilməsidir. **Docker Hub `latest` (hər stabil SemVer dərcində tələb olunur):** `docker-publish` iş axını **həm** `X.Y.Z` teqini, həm də `should-promote-latest.sh` bunun ən yüksək stabil SemVer olduğu ilə razılaşdıqda `:latest` teqini **eyni digest** ilə işarələməlidir. İşdən sonra: Hub-dakı `latest` digest-i yeni SemVer digest-inə bərabər olmalı və `last_updated` yenilənməlidir. Buraxılış qeydlərində yalnız git-də mövcud olan düzəlişlərdən danışıldığı halda `:latest` teqini köhnə yığmada saxlamayın. Compose sürətli başlanğıcları `:latest` istifadə edir; GitOps isə `X.Y.Z` versiyasını sabitləməyə davam etməlidir. [Docker buraxılış kanalları](../guides/DOCKER_GUIDE.md#release-channels) və #10317-yə baxın. ## Təcili Düzəliş üçün Sürətli Xətt (`hotfix` etiketi) `hotfix` etiketi verilmiş PR ağır CI matrisini (9 hissəli E2E, əhatə dairəsi ratchet-i, quality-gate, quality-extended) ötürür və sürətli, yüksək siqnallı yoxlamaları saxlayır: build, unit hissələri, integration, vitest, lint/typecheck, docs-sync, `check:pack-artifact` və tarball açılış tüstü testi (`check:pack-boot`). Hədəf: ~33 dəqiqə əvəzinə ≤15 dəqiqə ərzində uğurlu nəticə. **Giriş siyasəti — dördünün də yerinə yetirilməsi tələb olunur (Chromium/VS Code/Node fövqəladə xətləri əsasında modelləşdirilib):** 1. **Ciddilik**: production işləmir — dərc edilmiş artefakt açılış zamanı çökür / təhlükəsizlik düzəlişidir / buraxılışın hər bir istifadəçisi təsirlənir. "Vacib" olmaq "işləməmək" demək deyil. 2. **Səlahiyyət**: `hotfix` etiketini yalnız repozitoriya sahibi tətbiq edir. Etiket təsdiqin ÖZÜDÜR — kampaniya PR-ında heç vaxt özbaşına istifadə edilməməlidir. 3. **Sübut**: PR təsvirində əvvəlki tam uğurlu ağır işə salınmaya (ötürülən işlərin yenidən təsdiqləyəcəyi dəstə), həmçinin düzəlişin əvvəlcə uğursuz, sonra uğurlu olan testinə keçid verilir. 4. **Əhatə dairəsi**: yalnız cherry-pick — minimal düzəliş, refaktorinq və əlavə dəyişikliklər yoxdur. Ötürülmüş əhatə/ratchet səthi release budağındakı növbəti tam işə salınma ilə yenidən təsdiqlənir (davamlı uğurlu release) — xətt yoxlamanı deyil, yalnız GÖZLƏMƏNİ ötürür. Yalnız testlərdən ibarət dəyişikliklər (`tests/` altındakı bütün fayllar, `tests/e2e/` altında heç bir fayl olmamaqla) heç bir etiket olmadan E2E matrisini avtomatik ötürür. ## Ətraflı yoxlama siyahısı ### Relizdən əvvəl - [ ] Bu reliz üçün nəzərdə tutulmuş bütün PR-lər `release/vX.Y.0` budağına birləşdirilib - [ ] Bu versiya üçün bütün açıq Linear/tapşırıq elementləri bağlanıb və ya növbəti mərhələyə keçirilib - [ ] `release/vX.Y.0` budağında CI uğurludur - [ ] Kodda `TODO(release)` işarələri yoxdur: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker baza obrazı yenilənib (hazırda `node:24.15.0-trixie-slim`) ### Versiya və dəyişiklik jurnalı - [ ] `/version-bump-cc ` əmrini işə salın (Claude Code bacarığı) - `package.json`, `electron/package.json` versiyalarını artırır - Son teqdən bəri git commitləri əsasında `CHANGELOG.md` faylını yenidən yaradır - README.md nişanlarını yeniləyir - [ ] CHANGELOG.md faylını əl ilə nəzərdən keçirin və lazım gələrsə commit mesajlarını təmizləyin - [ ] `CHANGELOG.md` faylındakı ən son semver bölməsinin `package.json` versiyasına bərabər olduğuna əmin olun - [ ] Gələcək işlər üçün `## [Unreleased]` bölməsini dəyişiklik jurnalının ilk bölməsi kimi saxlayın - [ ] `docs/openapi.yaml` faylını yeniləyin → `info.version` dəyəri `package.json` versiyasına bərabər olmalıdır ### Kod keyfiyyəti - [ ] `npm run lint` — 0 xəta (xəbərdarlıqlar əvvəldən mövcuddur) - [ ] `npm run typecheck:core` — problemsizdir - [ ] `npm run typecheck:noimplicit:core` — problemsizdir (sərt) - [ ] `npm run check:cycles:ratchet` — sabitlənmiş `metrics.cycles` həddi daxilindədir (sadə `check:cycles` hər hansı dövrə olduqda 1 kodu ilə çıxır, #15281) - [ ] `npm run check:any-budget:t11` — büdcə daxilindədir - [ ] `npm run check:route-validation:t06` — problemsizdir - [ ] `npm run check:node-runtime` — dəstəklənən minimum icra mühiti tələbi ödənilir (`>=22.22.2 <23`, `>=24.0.0 <27`, `src/shared/utils/nodeRuntimeSupport.ts` faylındakı `SUPPORTED_NODE_RANGE` əsasında; `package.json` faylındakı `engines` ilə uyğunlaşdırılıb) ### Testləmə - [ ] `npm run test:unit` — uğurla keçir - [ ] `npm run test:vitest` — uğurla keçir (MCP serveri, autoCombo, keş) - [ ] `npm run test:coverage` — 60/60/60/60 həddi ödənilir (ifadələr/sətirlər/funksiyalar/budaqlar) - [ ] `npm run test:integration` — uğurla keçir (dəyişikliklər DB-yə / işləyicilərə toxunursa) - [ ] `npm run test:combo:matrix` — uğurla keçir (kombinasiya strategiyaları matrisi: 19 açıq marşrutlaşdırma strategiyasının hamısının seçim qərarlarını deterministik şəkildə təsdiqləyir; kombinasiya marşrutlaşdırmasına, strategiya həllinə və ya ehtiyat məntiqinə toxunduqda işə salın) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **ixtiyari/əl ilə** (şərtlə aktivləşdirilən real yuxarı axın smoke testi; VPS-dəki `root@192.168.0.15` ünvanından yalnız oxunan DB snapshot-ı əldə edir; real provayderlərə sorğu göndərir və kredit sərf edir; CI-da heç vaxt işə salınmır; şərt olmadan problemsiz şəkildə ötürülür) - [ ] `npm run test:combo:live:vps` — **ixtiyari/əl ilə** (Mərhələ 3 VPS canlı smoke testi: adi Node ESM vasitəsilə canlı `.15` serverinə qarşı 7 HTTP ssenarisi; `ssh root@192.168.0.15` tələb edir; yalnız `__live_test__*` kombinasiyalarını yaradır/silir; real provayderlərə sorğu göndərir; CI-da heç vaxt işə salınmır) - [ ] `npm run test:e2e` — uğurla keçir (UI dəyişiklikləri) - [ ] `npm run test:protocols:e2e` — uğurla keçir (MCP/A2A dəyişiklikləri) - [ ] `npm run test:ecosystem` — uğurla keçir ### Hook-lar (Husky ilə yoxlanılır) Husky hook-ları `.husky/` qovluğunda yerləşir və git əməliyyatları zamanı avtomatik işə salınır. - **pre-commit:** `npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11` - **pre-push:** sürətli deterministik yoxlamalar — `npm run check:any-budget:t11 && npm run check:tracked-artifacts` (2026-06-13 tarixində aktivləşdirilib). `test:unit` qəsdən daxil edilmir (ləngdir; CI-dakı `test-unit` tapşırığı ilə əhatə olunur). - Reliz budaqlarını göndərməzdən əvvəl `npm run test:unit` əmrini əl ilə işə salın. Hook uğursuz olarsa: əsas problemi aradan qaldırın, `--no-verify` ilə yan keçməyin. ### Konvensional commitlər Relizə daxil ediləcək bütün commitlər `type(scope): subject` formatına uyğun olmalıdır. **Etibarlı növlər:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `style`, `ci` **Etibarlı əhatə dairələri:** `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`, `cloud-agent`, `guardrails`, `compression`, `auto-combo`, `resilience`, `providers`, `executors`, `translator`, `domain`, `authz` Uyğunluğu pozan dəyişikliklər: `BREAKING CHANGE:` sonluğu və ya əhatə dairəsindən sonra `!` əlavə edin (məsələn, `feat(api)!: drop /v0`). ### Sənədləşdirmə - [ ] `npm run check:docs-sync` uğurla keçir (pre-commit tərəfindən avtomatik işə salınır) - [ ] `npm run check:docs-all` uğurla keçir (ümumi yoxlama: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links) - [ ] `npm run check:env-doc-sync` 0 kodu ilə çıxır — kod ↔ `.env.example` ↔ `docs/reference/ENVIRONMENT.md` mühit müqaviləsi bütövdür - [ ] `npm run check:doc-links` 0 kodu ilə çıxır — struktur dəyişikliyindən sonra pozulmuş daxili markdown istinadları yoxdur - [ ] `docs/architecture/ARCHITECTURE.md` yaddaş/iş mühiti uyğunsuzluqları baxımından nəzərdən keçirilib - [ ] `docs/guides/TROUBLESHOOTING.md` mühit dəyişəni və əməliyyat uyğunsuzluqları baxımından nəzərdən keçirilib - [ ] `.env.example` dəyişibsə: `docs/reference/ENVIRONMENT.md` yenilənib - [ ] Yeni funksiyanın UI-ı varsa: `docs/guides/USER_GUIDE.md` faylında qeyd olunub - [ ] Yeni funksiyanın API-si varsa: `docs/reference/API_REFERENCE.md` + `docs/openapi.yaml` yenilənib - [ ] Yeni funksiya moduldursa: ayrıca `docs/.md` mövcuddur - [ ] Uyğunluğu pozan dəyişiklik varsa: `docs/guides/TROUBLESHOOTING.md` faylında miqrasiya qeydi var ### i18n - [ ] `npm run i18n:check` 0 kodu ilə çıxır — tərcümə vəziyyəti (`.i18n-state.json`) mənbə sənədlərlə sinxronlaşdırılıb (sərt rejimdə yayınmış mənbələr yoxdur; son dəqiqə sənəd düzəlişləri üçün xəbərdarlıq rejimi məsləhəti qəbul edilə bilər, lakin teqləmədən əvvəl nəticə 0 olmalıdır) - [ ] `npm run i18n:check-ui-coverage` 0 kodu ilə çıxır — hər UI lokalı 80% əhatə minimumunda və ya ondan yuxarıdır - [ ] `npm run i18n:sync-ui:dry` bütün 66 hədəf lokal üzrə 0 çatışmayan açar bildirir (`en` mənbəyi istisna olmaqla hər bir lokal) - [ ] İngiliscə mənbə sənədlər dəyişibsə, teqləmədən əvvəl `npm run i18n:run` əmrini işə salın (`.env` faylında `OMNIROUTE_TRANSLATION_API_KEY` tələb olunur) - [ ] Tərcümə töhfələri kiçikdirsə, növbəti relizə təxirə salına bilər (CHANGELOG-da izləyin) ### Verilənlər bazası miqrasiyaları - [ ] `src/lib/db/migrations/` qovluğunda yeni fayllar varsa: - [ ] Hər miqrasiya idempotentdir (`CREATE TABLE IF NOT EXISTS` və s.) - [ ] Miqrasiyalar tranzaksiyalara bükülüb - [ ] Düzgün nömrələnib (ardıcıllıqda boşluq yoxdur) - [ ] Təmiz quraşdırmada test edin: `~/.omniroute/omniroute.db` faylını silin və `npm run dev` əmrini işə salın - [ ] Mövcud quraşdırmada test edin: DB-nin ehtiyat nüsxəsini yaradın, miqrasiyanı işə salın, sxemi yoxlayın - [ ] Miqrasiya cədvəlləri yenidən yazırsa, WAL faylları (`-wal`, `-shm`) düzgün idarə olunur ### Provayder kataloqu (Zod ilə doğrulanmış) - [ ] `src/shared/constants/providers.ts` Zod sxemi yüklənmə zamanı etibarlıdır - [ ] Bütün provayderlərdə tələb olunan sahələr (`id`, `label`, `kind` və s.) mövcuddur - [ ] Yeni pulsuz provayderlər üçün `freeNote` təqdim edilib - [ ] OAuth provayderlərinin `oauthConfig` konfiqurasiyası `src/lib/oauth/constants/oauth.ts` daxilində qeydiyyatdan keçirilib - [ ] Yeni provayder əlavə edilibsə: `open-sse/executors/` daxilində müvafiq icraçı mövcuddur - [ ] Format OpenAI formatında deyilsə: `open-sse/translator/` daxilində tərcüməçi mövcuddur - [ ] Modellər `open-sse/config/providerRegistry.ts` daxilində qeydiyyatdan keçirilib - [ ] `tests/unit/` daxilindəki vahid testlər provayder təsnifatını və marşrutlaşdırmanı əhatə edir ### Masaüstü (Electron) `electron/` dəyişdirilibsə: - [ ] `npm run electron:smoke:packaged` uğurla keçir - [ ] Quruluşlar `:win`, `:mac`, `:linux` seçimlərindən ən azı biri üçün sınaqdan keçirilib - [ ] Kod imzalama sertifikatlarının müddəti bitməyib (imzalama istifadə olunursa) - [ ] `electron/package.json` versiyası kök `package.json` versiyası ilə eynidir - [ ] Buraxılış `stable` kanalına edilirsə, avtomatik yeniləmə kanalının göstəricisi yenilənib ### Quruluş strukturu Repozitoriya üç ayrı çıxış kataloqundan istifadə edir — onları heç vaxt qarışdırmayın: | Kataloq | Məqsəd | İzlənilir? | | --------- | ----------------------------------------------------------------- | ----------------- | | `src/` | Tətbiqin mənbə kodu (TypeScript / TSX) | Bəli | | `.build/` | Aralıq quruluş faylları — `next build` çıxışı (`distDir`) | Xeyr (gitignored) | | `dist/` | Yayıma hazır npm paketi — `assembleStandalone` tərəfindən yığılır | Xeyr (gitignored) | > **Operator qeydi:** uzaq VPS obrazının kataloqu `/usr/lib/node_modules/omniroute/app/` olaraq qalır. > Yalnız **repozitoriya daxilindəki** quruluş çıxışı dəyişib (`app/` → `dist/`). Yerləşdirmə bacarıqları > `dist/` məzmununu uzaqdakı `app/` kataloquna rsync edir — VPS yollarında heç bir dəyişiklik tələb olunmur. **Tək quruluş axını:** ``` npm run build:release └─ rm -rf .build dist (təmizləmə) └─ next build → .build/next/ (aralıq fayllar) └─ assembleStandalone (standalone + static + public + natives fayllarını dist/ daxilinə köçürür) └─ dist/BUILD_SHA yazır (HEAD nəzarət nişanı) ``` Yerləşdirmə üçün `npm run build` əmrindən sonra ayrıca `npm run build:cli` icra ETMƏYİN — bir əmrlə təmiz yenidən qurma və nəzarət nişanı yaradan `npm run build:release` əmrindən istifadə edin. ### Artefaktın doğrulanması - [ ] `npm run build:release` uğurla tamamlanır və `dist/BUILD_SHA` == `git rev-parse --short HEAD` - [ ] `npm run check:pack-artifact` təmizdir — `app.__qa_backup`, `scripts/scratch`, `package-lock.json` və ya digər lokal qalıqlar yoxdur - [ ] Quruluşdan sonra `dist/server.js` mövcuddur - [ ] İstəyə bağlı lokal paketlənmiş icra mühiti tüstü testi: `npm run dev:candidate -- build` əmrindən sonra `npm run dev:candidate -- validate` paketlənmiş tarball-u təcrid olunmuş `DATA_DIR` üzərində başladır və `/api/health` + `/v1/models` ünvanlarını yoxlayır ([Töhfə üçün əsas axına](CONTRIBUTION_GOLDEN_PATH.md#local-candidate-loop) baxın) ### Teqləmə və buraxılış - [ ] `/generate-release-cc` əmrini icra edin (Claude Code bacarığı): - `vX.Y.Z` teqini yaradır - Teqi və budağı göndərir - Dəyişiklik jurnalı mətni ilə GitHub Release açır - Electron quraşdırıcılarını əlavə edir (qurulublarsa) - [ ] Və ya əl ilə: ```bash git tag -a vX.Y.Z -m "Release vX.Y.Z" git push origin vX.Y.Z gh release create vX.Y.Z --notes-from-tag ``` ### Yerləşdirmə Yerləşdirmə bacarıqları yüngül rsync axınından istifadə edir — `npm pack` və `npm i -g` istifadə olunmur: - [ ] Hədəfə uyğun yerləşdirmə bacarığından istifadə edin: - `/deploy-vps-local-cc` — lokal VPS (192.168.0.15) - `/deploy-vps-akamai-cc` — Akamai VPS (69.164.221.35) - `/deploy-vps-both-cc` — hər ikisi - [ ] Yerləşdirmədən əvvəl `dist/BUILD_SHA` == `git rev-parse --short HEAD` olduğunu təsdiqləyin - [ ] Quruluş `node_modules` kataloqunun real olduğu yerdə icra edilməlidir (əsas checkout və ya `npm ci` icra edilmiş worktree — simvolik keçidli worktree DEYİL) - [ ] Yerləşdirilmiş instansiyada tüstü testi aparın: - `/dashboard/health` səhifəsini açın → versiya sətrinin buraxılışla uyğun olduğunu yoxlayın - Məlum provayderə qarşı `/v1/chat/completions` sorğusu icra edin - `/api/monitoring/health` cavabında dövrə kəsicilərinin `CLOSED` qaytardığını yoxlayın - MCP nəqliyyatlarının cavab verdiyini təsdiqləyin (`/mcp` HTTP, `/mcp-sse` SSE) ### Buraxılışdan sonra - [ ] `/capture-release-evidences-cc` əmrini icra edin (Claude Code bacarığı) - Yeni funksiyaların WebP ekran görüntülərini/yazılarını çəkir - Onları buraxılış qeydlərinə / bloq yazısına əlavə edir - [ ] GitHub Discussions / Discord platformalarında buraxılış elanını yeniləyin - [ ] Növbəti versiya üçün mərhələ açın - [ ] Kritikdirsə: müzakirəni bərkidin və ya tətbiqdaxili banner üçün `news.json` faylında paylaşın ### Radar-ın ictimai istifadəyə verilməsi üçün keçid şərtləri Radar elanı qəsdən `active: false` ilə commit edilib. Aktivləşdirmə aşağıdakı hər bir bəndin sübutu təqdim edildikdən sonra ayrıca dəyişiklik kimi edilməlidir: - [ ] Bütün yığılmış Radar PR-ları birləşdirilib və buraxılışın son nöqtəsindəki CI uğurla keçir - [ ] `RADAR_ENABLED` standart olaraq hələ də söndürülmüş vəziyyətdə OSS Radar marşrutlarını yerləşdirin və tüstü testindən keçirin - [ ] Göstərilən Radar hostunda `GET /planos`, `/termos`, `/privacidade` və `/reembolso` üçün tüstü testi aparın - [ ] Operatorun kimliyini/əlaqə məlumatlarını/ünvanını və sahib tərəfindən təsdiqlənmiş hüquqi yoxlamanı məxfi xidmətdə qeyd edin - [ ] Stripe Checkout-u və imzalanmış webhook-u yalnız test rejimində yoxlayın - [ ] Təsdiqlənmiş göndərici/domen ilə bir şifrələnmiş tranzaksiya e-poçtu çatdırılmasını yoxlayın - [ ] Ehtiyat nüsxədən bərpanı və nəzarət altında, büdcə limiti qoyulmuş bir araşdırma icrasını sübut edin - [ ] İanə sübutlarını qəbul etməzdən əvvəl BRL/PIX yoxlama siyasətini təsdiqləyin - [ ] Yalnız əvvəlki keçid şərtlərindən sonra ictimai Checkout-u aktivləşdirin, sonra yeni `news.json` ID-sini aktivləşdirin - [ ] Home bannerinin lokallaşdırılmış mətndən istifadə etdiyini və köhnə ID rədd edildikdən sonra yeni ID-nin yenidən göründüyünü yoxlayın ## Daxili xidmətlər üçün ilkin yoxlama (v3.8.4+) Daxili xidmətlərə dəyişikliklər daxil olan hər hansı buraxılışı yayımlamazdan əvvəl bunları yoxlayın: ### Təmiz verilənlər bazası ilə işə düşmə (miqrasiya toqquşmalarını aşkarlayır — v3.8.4 təcili düzəlişindən sonra əlavə edilib) - [ ] `DATA_DIR=$(mktemp -d) npm start &` — işə düşməsi üçün 10 saniyə gözləyin - [ ] `curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'` əmri `"9router"` qaytarır (404 DEYİL, 500 DEYİL). `071_services.sql` miqrasiyasının tətbiq edildiyini və sətrin ilkin olaraq əlavə edildiyini təsdiqləyir. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"` əmri 3 sətir qaytarır. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"` əmri 2 sətir qaytarır (`070_webhooks_kind_metadata.sql` miqrasiyasının tətbiq edildiyini təsdiqləyir). - [ ] `node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts` uğurla tamamlanır — gələcək toqquşmaların qarşısını alır. ### 9Router - [ ] `POST /api/services/9router/install` 2 dəqiqədən az müddətdə `installedVersion` ilə birlikdə 200 qaytarır - [ ] `POST /api/services/9router/start` 30 saniyədən az müddətdə 200 və `state: "running"` qaytarır - [ ] `GET /api/services/9router/status` `health: "healthy"` vəziyyətini bildirir - [ ] `"model": "9router/auto/..."` ilə `POST /v1/chat/completions` 200 qaytarır (9Router vasitəsilə başdan-sona marşrutlaşdırma) - [ ] `GET /dashboard/providers/services/9router/embed/dashboard` birbaşa `127.0.0.1:port` iframe-i olmadan proksi daxilində 9Router-in yerli istifadəçi interfeysini göstərir - [ ] `POST /api/services/9router/rotate-key` `{ keyRotated: true }` qaytarır və xidmət problemsiz yenidən başladılır - [ ] `POST /api/services/9router/stop` 200 və `state: "stopped"` qaytarır - [ ] `GET /api/services/9router/logs?tail=50` son sətirləri ehtiva edən `snapshot` hadisəsi ilə SSE axını qaytarır - [ ] PATH daxilində `npm` olmayan mühitdə quraşdırma istifadəçi üçün anlaşılan (stek izi olmayan) xəta mesajı ilə 500 qaytarır ### CLIProxyAPI - [ ] `POST /api/services/cliproxy/install` 2 dəqiqədən az müddətdə 200 qaytarır - [ ] `POST /api/services/cliproxy/start` 30 saniyədən az müddətdə 200 və `state: "running"` qaytarır - [ ] `GET /api/services/cliproxy/status` `health: "healthy"` vəziyyətini bildirir - [ ] `POST /api/services/cliproxy/stop` 200 və `state: "stopped"` qaytarır - [ ] `GET /api/services/cliproxy/logs?tail=50` SSE axını qaytarır ### Təhlükəsizlik reqressiyası - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start` `403 LOCAL_ONLY` qaytarır - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start` `403 LOCAL_ONLY` qaytarır - [ ] `/api/services/*` ünvanından gələn xəta cavablarında `err.stack` və ya mütləq fayl yolları olmur ## v3.8.0+ yoxlamaları Hər hansı v3.8.x buraxılışını yayımlamazdan əvvəl bu əlavə elementləri yoxlayın: - [ ] `omniroute --tray` macOS-da işə düşür (systray2 `~/.omniroute/runtime/` daxilində quraşdırılıb) - [ ] `omniroute --tray` Linux-da işə düşür (DISPLAY tələb olunur; təyin edilməyibsə, düzgün idarə olunan xəta göstərilir) - [ ] `omniroute --tray` Windows-da işə düşür (PowerShell NotifyIcon, əlavə binar fayllar olmadan) - [ ] `omniroute config tray enable` avtomatik başlatma qeydi yaradır; söndürmə əməliyyatı onu silir - [ ] `npm install -g omniroute@` quraşdırmadan sonrakı əməliyyatı kritik xəta ilə çıxmadan icra edir - [ ] Yeniləmə yolu seçimli asılılıqları qoruyur: `omniroute update --apply` və avtomatik yeniləyici `npm install -g … --include=optional` əmrini icra edir ki, `optionalDependencies` (better-sqlite3, keytar, tls-client və llmlingua SLM steki: `@atjsh/llmlingua-2@2.0.5`, `js-tiktoken`) yeniləmədən sonra qorunsun. Ultra `modelPath` SLM səviyyəsi üçün də ilk istifadə zamanı `${DATA_DIR}/models/llmlingua` qovluğuna avtomatik endirilən tinybert modeli tələb olunur. Quraşdırmadan sonrakı əməliyyat (`scripts/build/colocateOptionals.mjs`) daha sonra SLM-in seçimli asılılıqlar zəncirini `dist/node_modules` daxilində bir yerdə yerləşdirir ki, işçi YALNIZ BİR `@huggingface/transformers` ^4.2.0 instansiyasını həll etsin — müstəqil izləmə paketi yalnız transformers-i ehtiva edir, dinamik şəkildə import edilən seçimli asılılıqları deyil; buna görə də bu olmadan işçi llmlingua-2-ni kök səviyyədəki transformers ilə yükləyər və SLM səviyyəsi heç bir bildiriş vermədən ehtiyat rejiminə keçər. - [ ] `omniroute status` `.env` olmadan işləyir (CLI token yolu, yalnız geri dövrə interfeysi) - [ ] `curl http://localhost:20128/api/shutdown` 401 qaytarır (həmişə qorunan marşrut) - [ ] `curl -H "host: evil.com" http://localhost:20128/api/mcp/sse` 401 qaytarır (geri dövrə qoruması) - [ ] SQLite icra mühiti ilk işə salınmada `bundled` kimi müəyyən edilir (paketə daxil edilmiş binar fayl platforma üçün keçərlidir) - [ ] `node_modules/better-sqlite3` silindikdə SQLite icra mühiti `runtime` variantına keçir - [ ] Ağıllı MCP filtri real `playwright-mcp browser_snapshot` çıxışını sıxır (≥50% azalma) - [ ] Bütün 10 `skills/omniroute*/SKILL.md` faylına raw GitHub URL-i vasitəsilə ictimai şəkildə giriş mümkündür - [ ] İlkin quraşdırma köməkçisi təmiz quraşdırmada "Necə işləyir" səviyyə icmalı addımını göstərir - [ ] Əsas idarəetmə panelindəki səviyyə əhatəsi vidceti konfiqurasiya edilmiş/aktiv sayları göstərir --- ## 3.9.0 LTS ayrılması (3.8.58-də sınaqdan keçirilib) v3.8.59-dan sonra növbəti versiya 3.9.0-dır və onun son kommiti iki uzunömürlü budağın əsasına çevrilir: `stable/v3` (v3 LTS xətti, npm `latest`) və `develop` (v4, 4.0.0-a yüksəldilmiş, npm `nightly`). Budaq/kanal modeli, irəli daşıma və etiketlər [RELEASE_STRATEGY.md](./RELEASE_STRATEGY.md) sənədində, plan isə [ROADMAP](../../ROADMAP.md) sənədindədir (Mərhələ 3). Ayırma bir dəfə icra edilir; 3.8.58 bunu fork üzərində başdan sona sınaqdan keçirir, 3.8.59 isə [GO/NO-GO yoxlama siyahısı](./LTS_GO_NO_GO.md) ilə tamamlanır. ### Sınaq icrası (yalnız oxuma, istənilən vaxt təhlükəsizdir) ```bash npm run release:dry-run-lts-cut # həqiqi ayırma: HEAD-dən 3.9.0, əvvəlki teq v3.8.59 npm run release:dry-run-lts-cut -- --from <3.9.0-tip> # mənbə kommitini sabitlə ``` `scripts/release/dry-run-lts-cut.mjs` heç nə icra etmir: o, git və `gh` məlumatlarını oxuyur və bütün ardıcıllığı çap edir — ilkin şərtlər (mənbə müəyyən edilir, mənbə repozitoriyası tam tarixçəyə malikdir — dayaz klon `stable/v3` budağını göndərə bilməz, qəbul edən tərəf ilk birləşdirilmiş üst kommitdə paketi rədd edir, buna görə əvvəlcə tam klondan ayırın və ya `git fetch --unshallow origin` icra edin — əvvəlki teq mövcuddur, `package.json` hədəf versiyadadır, açıq `release-freeze` məsələsi var, mövcud buraxılış budağında açıq `Release branch not green` məsələsi yoxdur — mövcud olmayan budaq yaşıl deyil, `?` naməlum kimi göstərilir — Mergify `release` növbəsi konfiqurasiya edilib (G11: `queue_rules`, `checks_timeout`, `queue` etiketi), `release/*` qaydalar dəsti silinməni və məcburi göndərişi hələ də bloklayır və `stable/v3` ilə `develop` hələ mövcud deyil), iki budaq addımı, hansı fəaliyyətsiz iş axını tetiklərinin və `if:` şərtlərinin doğru olduğu (və hansılarının repozitoriya dəyişəni ilə məhdudlaşdırıldığı və ya kanonik repozitoriyaya sabitləndiyi), gözlənilən dist-tag-lər (`latest` → 3.9.0, `next` və `nightly` boşdur) və geri qaytarma. Çıxış `0` = `RESULT: READY`, `1` = bloklayıcı ilkin şərt uğursuz oldu (`✗`), `2` = istifadə xətası. `--advisory ` yoxlamanı gizlətmədən xəbərdarlıq (`!`) səviyyəsinə endirir. Həqiqi ayırmanın sınaq icrasını 3.9.0 buraxılış dondurması hələ açıq olarkən başladın — budaqlar teqdən sonra və Mərhələ 12c dondurmanı ləğv etməzdən əvvəl yaradılır. ### 3.8.58 sınağı (yalnız fork) ```bash # 1. Cari son kommitdə sınaq parametrləri ilə sınaq icrası npm run release:dry-run-lts-cut -- --target-version 3.8.58 --previous-tag v3.8.57 \ --advisory freeze,base-green # 2. FORK uzaq repozitoriyasına qarşı icra edin (origin və ya URL-i kanonik # repozitoriyaya aid olan hər hansı uzaq repozitoriya rədd edilir; hər addım terminalda təsdiq tələb edir) git remote add rehearsal https://github.com//OmniRoute.git node scripts/release/dry-run-lts-cut.mjs --execute --remote rehearsal \ --target-version 3.8.58 --previous-tag v3.8.57 --advisory freeze,base-green # 3. Fork-dakı fəaliyyətsiz iş axınlarını sınaqdan keçirin (sınaq icrasının kanonik # repozitoriyaya sabitlənmə bildirdiyi hallarda workflow_dispatch), sonra geri qaytarın node scripts/release/dry-run-lts-cut.mjs --execute --rollback --remote rehearsal \ --target-version 3.8.58 --previous-tag v3.8.57 --advisory freeze,base-green ``` develop versiyasını yüksəldən kommit git plumbing vasitələri ilə yaradılır (işçi ağaca toxunulmur) və dövrü açan kommitlə eyni beş faylda versiyanı yüksəldir: `package.json`, `open-sse/package.json`, `electron/package.json`, `package-lock.json` və `docs/openapi.yaml`. `[4.0.0]` CHANGELOG bölməsi və onun i18n nüsxələri daha sonra, ilk PR-dən əvvəl `develop` üzərində açılır. Skript heç vaxt npm dist-tag-lərini dəyişmir — onları sınaq paketində məşq edin. ### PR önizləmə artefaktı (bir dəfə qurun, eyni baytları təşviq edin) `.github/workflows/preview-artifact.yml` PR-ın son kommitindən bir istehsal tarball-u qurur və məhz həmin quruluşu doğrulayır (#8084 hissə (a)). Yalnız eyni repozitoriyadan olan PR-lar; heç nə dərc edilmir. ```bash gh workflow run preview-artifact.yml -f pr_number= # yaxud `preview-artifact` etiketini əlavə edin gh run download --name preview-artifact-pr- --dir preview cd preview && sha256sum -c SHA256SUMS gh attestation verify omniroute-*.tgz --repo diegosouzapw/OmniRoute npm install -g ./omniroute-*.tgz # önizləmə quraşdırması ``` İcra `npm ci`, `npm run build:release`, `npm run check:pack-artifact` əmrlərini yerinə yetirir, tarball-u paketləyir, `npm run check:pack-boot` əmrini icra edir (saxta məxfi məlumatlar, müvəqqəti məlumat kataloqu), yenidən paketləyir və həzm eyni olmadıqda uğursuz olur, sonra `artifact-identity.json` faylını (son kommit SHA-sı, baza SHA-sı, kilid faylının heşi, platforma, arxitektura, node ABI-si, paketləyici, qurma siyasəti — `scripts/release/artifact-identity.mjs`) qeydə alır və ayrıca işdə tarball-u attestasiya edir. Önizləməni təşviq etmək həmin tarball-u quraşdırmaq deməkdir: heç vaxt mənbədən yenidən qurmayın. ### Ayırma (3.9.0, GO-dan sonra) 1. GO qərarı [LTS_GO_NO_GO.md](./LTS_GO_NO_GO.md) sənədində qeydə alınıb. 2. `npm run release:dry-run-lts-cut -- --from v3.9.0` əmri `RESULT: READY` çap edir. 3. Sınaq icrasının çap etdiyi əmrlərlə `origin` üzərində budaqları əl ilə yaradın — skript `origin`-ə göndərməkdən imtina edir. Nəzərdən keçirilmiş develop kommitini təkrar istifadə etmək üçün əvvəlcə 3.9.0 son kommitində fork-unuz üzərində `--execute` sınağını başladın; o, hər iki SHA-nı çap edir və eyni kommitlər göndərilə bilər: ```bash git push origin :refs/heads/stable/v3 :refs/heads/develop ``` 4. İlk PR birləşdirilməzdən əvvəl `stable/v3` və `develop` budaqlarını qoruyun (qaydalar dəstləri + birləşdirmə növbəsi). 5. Qeyri-aktiv iş axınları budağın mövcudluğuna əsasən işə düşür: `forward-port.yml` (`stable/v3` budağına push), `validate-stable-pr.yml` (`stable/v3` budağına PR-lər) və `nightly-v4-build.yml` (`develop` budağını qurur). İstifadəyə verməzdən əvvəl `secrets.FORWARD_PORT_TOKEN` repozitoriya məxfisini təyin edin (beləliklə, CI forward-port PR-lərində işləyəcək); sahib `vars.NIGHTLY_PUBLISH` repozitoriya dəyişənini `true` olaraq təyin edənə və npm Trusted Publishing `nightly-v4-build.yml` faylını qəbul edənə qədər gecəlik dərc deaktiv qalır. Kanalın müəyyənləşdirilməsi `scripts/release/dist-tag.mjs` tərəfindən həyata keçirilir; bu, `npm-publish.yml` faylının istifadə etdiyi eyni müəyyənləşdiricidir. 6. Kanalları yoxlayın: `npm view omniroute dist-tags --json` əmri `latest` = 3.9.0 göstərir və v4 dərc edilənədək `next` / `nightly` mövcud deyil. 7. Lazım gələrsə, geri qaytarma: `git push origin --delete refs/heads/stable/v3 refs/heads/develop` və `npm dist-tag add omniroute@3.8.59 latest`. --- ## Geri qaytarma Relizdə kritik problem varsa: 1. `gh release edit vX.Y.Z --prerelease` (ən son reliz kimi işarələnməsini ləğv edir) 2. `git tag -d vX.Y.Z && git push --delete origin vX.Y.Z` (yalnız istifadəçilər tərəfindən hələ mənimsənilməyibsə) 3. Və ya: `release/vX.Y.0` üzərində təcili düzəliş → `vX.Y.(Z+1)` yamaq relizi 4. Dərhal GitHub Discussions və Discord vasitəsilə məlumat verin ## Qəti qaydalar - Heç vaxt birbaşa `main` budağına commit etməyin - Heç vaxt `main` və ya `release/*` budaqları üçün `git push --force` istifadə etməyin - Heç vaxt Husky hook-larını (`--no-verify`) ötürməyin - Heç vaxt məxfi məlumatları, giriş məlumatlarını və ya `.env` fayllarını commit etməyin - Örtük ≥60/60/60/60 (ifadələr/sətirlər/funksiyalar/budaqlar) səviyyəsində qalmalıdır - `src/`, `open-sse/`, `electron/` və ya `bin/` daxilindəki istehsal kodunu dəyişdirərkən həmişə testlər əlavə edin və ya yeniləyin ## Avtomatlaşdırılmış sinxronizasiya yoxlaması PR açmazdan əvvəl sənədlərin sinxronizasiya qoruyucusunu lokal olaraq işə salın: ```bash npm run check:docs-sync ``` CI bu yoxlamanı `.github/workflows/ci.yml` faylında da işə salır (lint tapşırığı).