# Release Checklist (Oʻzbekcha) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/RELEASE_CHECKLIST.md) · 🇪🇹 [am](../../../am/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇦 [ar](../../../ar/docs/ops/RELEASE_CHECKLIST.md) · 🇦🇿 [az](../../../az/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) · 🇻🇳 [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) --- > **Soʻnggi yangilanish:** 2026-08-28 — v3.8.51 > Avtomatlashtirish uchun Claude Code ko‘nikmalaridan foydalanadigan soddalashtirilgan reliz jarayoni. > > **Relizlar orasida navbat/tarmoqni yashil holatda saqlang:** [RELEASE_GREEN.md](./RELEASE_GREEN.md) fayliga qarang > (`/green-prs` oilasi + `npm run check:release-green` + `/babysit` + tungi ishga tushirish). Buni > muntazam ravishda — va ayniqsa ushbu nazorat roʻyxatidan **oldin** — ishga tushirish reliz PR’ining yashil holatda boshlanishini taʼminlaydi. ## Qisqacha ```bash # 1. Versiyani oshiring + CHANGELOG yarating (ko‘nikma) /version-bump-cc patch # yoki minor/major # 2. Sifat tekshiruvini lokal ravishda ishga tushiring npm run check # lint + testlar npm run test:coverage # to‘liq qamrov tekshiruvi (60/60/60/60) # 3. Yig‘ish va smoke-test npm run build npm run test:e2e # ixtiyoriy, ammo tavsiya etiladi # 4. Reliz yarating (ko‘nikma) /generate-release-cc # 5. Joylashtiring (ko‘nikma) /deploy-vps-both-cc # yoki akamai-cc / local-cc # 6. Reliz dalillarini yozib oling (ko‘nikma) /capture-release-evidences-cc ``` ## npm Trusted Publishing (v3.8.51 dan beri standart) — soʻrov boʻyicha bosqichli, zaxira sifatida bevosita `npm-publish.yml` standart holatda **npm Trusted Publishing (OIDC)** orqali nashr qiladi: `stage-npm` vazifasi (GitHub infratuzilmasida ishlaydi) GitHub id-token’ini shu ishga tushirish uchun qisqa muddatli npm hisob maʼlumotiga almashtiradi — repozitoriy sirlarida uzoq muddatli npm tokeni yoʻq, 2FA soʻrovi yoʻq, kelib chiqish maʼlumoti biriktiriladi. 2FA’ni chetlab oʻtuvchi tokenlar isteʼmoldan chiqarilayotgani sababli, endi npm ruxsat etadigan aylanib oʻtish yoʻli shu; bu WS1.3 kafolatini saqlagan holda loyiha v3.8.48 gacha ega boʻlgan toʻliq avtomatik jarayonni tiklaydi (sizib chiqqan tokenning oʻzi nashr qila olmaydi — tokenning oʻzi yoʻq). **Bir martalik sozlash (egasi):** npmjs.com → `omniroute` paketi → Settings → _Trusted Publisher_ → GitHub: egasi `diegosouzapw`, repo `OmniRoute`, workflow `npm-publish.yml` (environment: none). Bu sozlama yaratilmaguncha avtomatik qadam `ENEEDAUTH` xatosi bilan muvaffaqiyatsiz tugaydi: `publish_mode=staged` (quyida) yoki `direct` bilan qayta ishga tushiring. ### Bosqichli nashr qilish (soʻrov boʻyicha — `publish_mode=staged`) npm-publish ish jarayoni endi bevosita nashr qilmaydi: u paketlangan tarball’ni ishga tushiradi (`check:pack-boot`), soʻng `npm stage publish` buyrugʻini bajaradi — aynan shu baytlar registrda saqlanadi va egasi tasdiqlamaguncha ularni **oʻrnatib boʻlmaydi**. Inson bajaradigan 2FA tekshiruvi isbotdan oldinga emas, undan KEYINGI bosqichga koʻchirildi. **Ish jarayoni yashil holatga oʻtgach, ega bajaradigan amallar:** 1. `npm stage list omniroute` — bosqich identifikatorini toping (u ish jarayoni xulosasida ham koʻrsatiladi). 2. Bosqichga joylangan baytlarni tekshiring (tavsiya etiladi): `npm stage download `, soʻng yuklab olingan tarball’ni vaqtinchalik prefiksga oʻrnating va ishga tushiring (`npm run check:pack-boot` CI’da xuddi shu paketlash→oʻrnatish→ishga tushirish hukmini avtomatlashtiradi). 3. `npm stage approve ` — 2FA soʻrovining OʻZI nashr qilishdir. `npm stage reject ` bekor qiladi. 4. Nashrdan keyingi himoya: nashrdan keyingi tekshiruvchi (v3.8.49 rejasining WS1.4 qismi) nashr qilingan versiyani ochiq registrdan toza konteynerga oʻrnatadi va ishga tushiradi. **Favqulodda zaxira usuli:** `publish_mode=direct` bilan `workflow_dispatch` eski, darhol bajariladigan `npm publish` jarayonini tiklaydi (faqat bosqichli nashr qilishning oʻzi notoʻgʻri ishlasa foydalaning; sababini qayd eting). **Bir martalik mustahkamlash (egasi, npmjs.com):** `omniroute` uchun Trusted Publisher’ni faqat bosqichli rejimda sozlang, shunda sizib chiqqan uzoq muddatli token hech qayerdan bevosita `npm publish` qila olmaydi — CI faqat bosqichga joylashi mumkin; faqat egasining 2FA’i relizni chiqaradi. **Buzilgan artefakt boʻyicha yoʻriqnoma (oʻzgarmagan):** standart tezkor chora sifatida `npm deprecate omniroute@ " — use "` buyrugʻidan foydalaning (bir necha daqiqa, qaytarish mumkin); `npm unpublish` faqat 72 soatlik/bogʻliq paketlar mavjud boʻlmagan davr ichida va hech qachon birinchi chora sifatida emas. Docker: versiya tegini hech qachon qayta yozmang — orqaga qaytarish `latest` tegini oxirgi yaroqli digest’ga qayta yoʻnaltirishdir. **Docker Hub `latest` (har bir barqaror SemVer nashrida majburiy):** `docker-publish` ish jarayoni **ham** `X.Y.Z` tegini, **ham** `should-promote-latest.sh` bu eng yuqori barqaror SemVer ekanini tasdiqlaganda `:latest` tegini **bir xil digest** bilan belgilashi kerak. Vazifa tugagach: Hub’dagi `latest` digest’i yangi SemVer digest’iga teng boʻlishi va `last_updated` yangilanishi kerak. Reliz qaydlarida faqat git’da mavjud boʻlgan tuzatishlar haqida aytilayotgan paytda `:latest` tegini eski yigʻilmada qoldirmang. Compose yordamida tezkor ishga tushirishlar `:latest` tegidan foydalanadi; GitOps esa `X.Y.Z` versiyasini mahkamlashda davom etishi kerak. [Docker reliz kanallari](../guides/DOCKER_GUIDE.md#release-channels) va #10317 ga qarang. ## Hotfix tezkor yoʻlagi (`hotfix` yorligʻi) `hotfix` yorligʻi qoʻyilgan PR ogʻir CI matritsasini (9-shard E2E, qamrov ratcheti, quality-gate, quality-extended) oʻtkazib yuboradi va tezkor, yuqori signal beruvchi tekshiruvlarni saqlab qoladi: build, unit shardlari, integration, vitest, lint/typecheck, docs-sync, `check:pack-artifact` va tarball ishga tushish smoke-testi (`check:pack-boot`). Maqsad: ~33 daqiqa oʻrniga ≤15 daqiqada yashil holatga erishish. **Kirish siyosati — toʻrttalasi ham majburiy (Chromium/VS Code/Node favqulodda yoʻlaklari asosida modellashtirilgan):** 1. **Jiddiylik**: production buzilgan — eʼlon qilingan artefakt ishga tushishda qulaydi / xavfsizlik tuzatishi / relizning har bir foydalanuvchisiga taʼsir qiladi. «Muhim» degani «buzilgan» degani emas. 2. **Vakolat**: `hotfix` yorligʻini faqat repository egasi qoʻllaydi. Yorliqning OʻZI tasdiq hisoblanadi — campaign PR uchun uni hech qachon oʻzingiz qoʻymang. 3. **Dalil**: PR tavsifi avvalgi toʻliq yashil ogʻir ishga tushirishga (oʻtkazib yuborilgan joblar qayta tekshirishi kerak boʻlgan suite) hamda tuzatishning avval muvaffaqiyatsiz, soʻng muvaffaqiyatli oʻtgan testiga havola beradi. 4. **Koʻlam**: faqat cherry-pick — minimal tuzatish, refactorlarsiz, qoʻshimcha oʻzgarishlarsiz. Oʻtkazib yuborilgan qamrov/ratchet yuzasi release branchdagi keyingi toʻliq ishga tushirish (uzluksiz release-green) orqali qayta tekshiriladi — yoʻlak tekshiruvni emas, faqat KUTISHNI oʻtkazib yuboradi. Faqat testlarga oid difflar (barcha fayllar `tests/` ichida, hech biri `tests/e2e/` ichida emas) E2E matritsasini hech qanday yorliqsiz avtomatik ravishda oʻtkazib yuboradi. ## Batafsil nazorat roʻyxati ### Relizdan oldin - [ ] Ushbu relizga moʻljallangan barcha PRlar `release/vX.Y.0` ga birlashtirilgan - [ ] Ushbu versiya uchun barcha ochiq Linear/issue elementlari yopilgan yoki keyingi bosqichga oʻtkazilgan - [ ] `release/vX.Y.0` branchida CI yashil holatda - [ ] Kodda `TODO(release)` markerlari yoʻq: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker asosiy tasviri yangilangan (hozirda `node:24.15.0-trixie-slim`) ### Versiya va oʻzgarishlar jurnali - [ ] `/version-bump-cc ` ni ishga tushiring (Claude Code koʻnikmasi) - `package.json`, `electron/package.json` versiyalarini oshiradi - Oxirgi tegdan keyingi git commitlari asosida `CHANGELOG.md` ni qayta yaratadi - README.md belgilarini yangilaydi - [ ] CHANGELOG.md ni qoʻlda koʻrib chiqing va zarur boʻlsa commit xabarlarini tozalang - [ ] `CHANGELOG.md` dagi eng soʻnggi semver boʻlimi `package.json` versiyasiga tengligini tekshiring - [ ] Kelgusi ishlar uchun `## [Unreleased]` ni oʻzgarishlar jurnalining birinchi boʻlimi sifatida saqlang - [ ] `docs/openapi.yaml` ni yangilang → `info.version` `package.json` versiyasiga teng boʻlishi kerak ### Kod sifati - [ ] `npm run lint` — 0 ta xato (ogohlantirishlar avvaldan mavjud) - [ ] `npm run typecheck:core` — toza - [ ] `npm run typecheck:noimplicit:core` — toza (qatʼiy) - [ ] `npm run check:cycles:ratchet` — `cycles ≤ metrics.cycles.value` (`quality-baseline.json`; `check:cycles`: `cycles > 0 → exit 1`, #15281) - [ ] `npm run check:any-budget:t11` — budjet doirasida - [ ] `npm run check:route-validation:t06` — toza - [ ] `npm run check:node-runtime` — qoʻllab-quvvatlanadigan minimal runtime talabi bajarilgan (`>=22.22.2 <23`, `>=24.0.0 <27`, `src/shared/utils/nodeRuntimeSupport.ts` dagi `SUPPORTED_NODE_RANGE` boʻyicha; `package.json` dagi `engines` bilan moslashtirilgan) ### Testlash - [ ] `npm run test:unit` — muvaffaqiyatli - [ ] `npm run test:vitest` — muvaffaqiyatli (MCP server, autoCombo, cache) - [ ] `npm run test:coverage` — 60/60/60/60 chegarasi bajarilgan (statementlar/qatorlar/funksiyalar/branchlar) - [ ] `npm run test:integration` — muvaffaqiyatli (agar oʻzgarishlar DB / handlerlarga tegishli boʻlsa) - [ ] `npm run test:combo:matrix` — muvaffaqiyatli (combo strategiyasi matritsasi: barcha 19 ta ommaviy routing strategiyasining tanlov qarorlarini deterministik tarzda isbotlaydi; combo routing, strategiyani aniqlash yoki fallback mantigʻiga tegilganda ishga tushiring) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **ixtiyoriy/qoʻlda** (gate bilan himoyalangan haqiqiy upstream smoke-testi; VPS `root@192.168.0.15` dan faqat oʻqishga moʻljallangan DB snapshotini oladi; haqiqiy providerlarga murojaat qiladi, kredit sarflaydi; CIʼda hech qachon ishga tushmaydi; gatesiz holatda toza tarzda oʻtkazib yuboriladi) - [ ] `npm run test:combo:live:vps` — **ixtiyoriy/qoʻlda** (Phase-3 VPS jonli smoke-testi: oddiy Node ESM orqali jonli `.15` serveriga qarshi 7 ta HTTP ssenariy; `ssh root@192.168.0.15` talab qiladi; faqat `__live_test__*` combolarini yaratadi/oʻchiradi; haqiqiy providerlarga murojaat qiladi; CIʼda hech qachon ishga tushmaydi) - [ ] `npm run test:e2e` — muvaffaqiyatli (UI oʻzgarishlari) - [ ] `npm run test:protocols:e2e` — muvaffaqiyatli (MCP/A2A oʻzgarishlari) - [ ] `npm run test:ecosystem` — muvaffaqiyatli ### Hooklar (Husky orqali tekshirilgan) Husky hooklari `.husky/` ichida joylashgan va git operatsiyalarida avtomatik ishga tushadi. - **pre-commit:** `npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11` - **pre-push:** tezkor deterministik tekshiruvlar — `npm run check:any-budget:t11 && npm run check:tracked-artifacts` (2026-06-13 da faollashtirilgan). `test:unit` ataylab kiritilmagan (sekin; CIʼdagi `test-unit` jobi bilan qamrab olinadi). - Release branchlarni push qilishdan oldin `npm run test:unit` ni qoʻlda ishga tushiring. Agar hook muvaffaqiyatsiz tugasa: asosiy muammoni tuzating, `--no-verify` bilan chetlab oʻtmang. ### Conventional Commits Relizga kiradigan barcha commitlar `type(scope): subject` formatiga rioya qilishi shart. **Yaroqli turlar:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `style`, `ci` **Yaroqli scopelar:** `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`, `cloud-agent`, `guardrails`, `compression`, `auto-combo`, `resilience`, `providers`, `executors`, `translator`, `domain`, `authz` Buzuvchi oʻzgarishlar: `BREAKING CHANGE:` footerini yoki scopedan keyin `!` qoʻshing (masalan, `feat(api)!: drop /v0`). ### Hujjatlar - [ ] `npm run check:docs-sync` muvaffaqiyatli yakunlanadi (pre-commit tomonidan avtomatik ishga tushiriladi) - [ ] `npm run check:docs-all` muvaffaqiyatli yakunlanadi (umumiy tekshiruv: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links) - [ ] `npm run check:env-doc-sync` 0 kodi bilan yakunlanadi — kod ↔ `.env.example` ↔ `docs/reference/ENVIRONMENT.md` muhit shartnomasi buzilmagan - [ ] `npm run check:doc-links` 0 kodi bilan yakunlanadi — qayta tuzilmalashdan keyin buzilgan ichki markdown havolalari yoʻq - [ ] `docs/architecture/ARCHITECTURE.md` saqlash muhiti/ishlash muhiti tafovutlari uchun tekshirildi - [ ] `docs/guides/TROUBLESHOOTING.md` muhit oʻzgaruvchilari va operatsion tafovutlar uchun tekshirildi - [ ] Agar `.env.example` oʻzgargan boʻlsa: `docs/reference/ENVIRONMENT.md` yangilandi - [ ] Agar yangi funksiya UI interfeysiga ega boʻlsa: u `docs/guides/USER_GUIDE.md` faylida tilga olingan - [ ] Agar yangi funksiya API interfeysiga ega boʻlsa: `docs/reference/API_REFERENCE.md` + `docs/openapi.yaml` yangilandi - [ ] Agar yangi funksiya modul boʻlsa: unga bagʻishlangan `docs/.md` mavjud - [ ] Agar moslikni buzuvchi oʻzgarish boʻlsa: `docs/guides/TROUBLESHOOTING.md` migratsiya qaydiga ega ### i18n - [ ] `npm run i18n:check` 0 kodi bilan yakunlanadi — tarjima holati (`.i18n-state.json`) manba hujjatlari bilan sinxronlangan (qatʼiy rejimda tafovutli manbalar yoʻq; soʻnggi daqiqadagi hujjat tuzatishlari uchun ogohlantirish rejimi tavsiyasi maqbul, ammo teg qoʻyishdan oldin natija 0 boʻlishi kerak) - [ ] `npm run i18n:check-ui-coverage` 0 kodi bilan yakunlanadi — har bir UI lokali kamida 80% qamrov chegarasiga yetgan - [ ] `npm run i18n:sync-ui:dry` barcha 42 ta lokal boʻyicha 0 ta yetishmayotgan kalit haqida xabar beradi - [ ] Agar ingliz tilidagi manba hujjatlari oʻzgargan boʻlsa, teg qoʻyishdan oldin `npm run i18n:run` buyrugʻini ishga tushiring (`.env` ichida `OMNIROUTE_TRANSLATION_API_KEY` talab qilinadi) - [ ] Kichik tarjima hissalarini keyingi relizgacha kechiktirish mumkin (CHANGELOG ichida kuzatib boring) ### Maʼlumotlar bazasi migratsiyalari - [ ] Agar `src/lib/db/migrations/` ichida yangi fayllar boʻlsa: - [ ] Har bir migratsiya idempotent (`CREATE TABLE IF NOT EXISTS` va hokazo) - [ ] Migratsiyalar tranzaksiyalarga oʻralgan - [ ] Toʻgʻri raqamlangan (ketma-ketlikda boʻshliqlar yoʻq) - [ ] Yangi oʻrnatishda sinovdan oʻtkazing: `~/.omniroute/omniroute.db` faylini oʻchirib, `npm run dev` buyrugʻini ishga tushiring - [ ] Mavjud oʻrnatishda sinovdan oʻtkazing: maʼlumotlar bazasining zaxira nusxasini oling, migratsiyani ishga tushiring va sxemani tekshiring - [ ] Agar migratsiya jadvallarni qayta yozsa, WAL fayllari (`-wal`, `-shm`) toʻgʻri boshqariladi ### Provayderlar katalogi (Zod orqali tekshiriladi) - [ ] `src/shared/constants/providers.ts` Zod sxemasi yuklanish vaqtida yaroqli - [ ] Barcha provayderlarda talab qilinadigan maydonlar (`id`, `label`, `kind` va hokazo) mavjud - [ ] Yangi bepul provayderlar uchun `freeNote` berilgan - [ ] OAuth provayderlari `src/lib/oauth/constants/oauth.ts` ichida roʻyxatdan oʻtkazilgan `oauthConfig` ga ega - [ ] Agar yangi provayder qoʻshilgan boʻlsa: `open-sse/executors/` ichida unga mos ijrochi mavjud - [ ] Agar format OpenAI formatida boʻlmasa: `open-sse/translator/` ichida tarjimon mavjud - [ ] Modellar `open-sse/config/providerRegistry.ts` ichida roʻyxatdan oʻtkazilgan - [ ] `tests/unit/` ichidagi modul testlari provayderlarni tasniflash va yoʻnaltirishni qamrab oladi ### Ish stoli ilovasi (Electron) Agar `electron/` oʻzgargan boʻlsa: - [ ] `npm run electron:smoke:packaged` muvaffaqiyatli yakunlanadi - [ ] Yigʻilmalar `:win`, `:mac`, `:linux` variantlaridan kamida bittasi uchun sinovdan oʻtkazilgan - [ ] Kodni imzolash sertifikatlarining muddati tugamagan (agar imzolash ishlatilsa) - [ ] `electron/package.json` versiyasi asosiy `package.json` versiyasiga mos - [ ] Agar `stable` kanaliga reliz qilinayotgan boʻlsa, avtomatik yangilash kanali koʻrsatkichi yangilangan ### Yigʻilma tuzilmasi Repozitoriy uchta alohida chiqish katalogidan foydalanadi — ularni hech qachon aralashtirmang: | Katalog | Maqsad | Kuzatiladimi? | | --------- | ---------------------------------------------------------------------- | ------------------------- | | `src/` | Ilovaning manba kodi (TypeScript / TSX) | Ha | | `.build/` | Yigʻish oraliq fayllari — `next build` chiqishi (`distDir`) | Yoʻq (gitignore qilingan) | | `dist/` | Tarqatiladigan npm toʻplami — `assembleStandalone` tomonidan yigʻiladi | Yoʻq (gitignore qilingan) | > **Operator qaydi:** masofaviy VPS tasvir katalogi `/usr/lib/node_modules/omniroute/app/` boʻlib qoladi. > Faqat **repozitoriy ichidagi** yigʻilma chiqishi koʻchirildi (`app/` → `dist/`). Joylashtirish koʻnikmalari > `dist/` tarkibini masofaviy `app/` katalogiga rsync orqali nusxalaydi — VPS yoʻllarini oʻzgartirish talab qilinmaydi. **Bir martalik yigʻish jarayoni:** ``` npm run build:release └─ rm -rf .build dist (tozalash) └─ next build → .build/next/ (oraliq fayllar) └─ assembleStandalone (mustaqil yigʻilma + statik fayllar + ommaviy fayllar + mahalliy modullarni → dist/ ga nusxalaydi) └─ dist/BUILD_SHA ni yozadi (HEAD nazorat belgisi) ``` Joylashtirish uchun `npm run build` buyrugʻidan soʻng alohida `npm run build:cli` buyrugʻini ishga tushirmang — bitta buyruqda toza qayta yigʻish va nazorat belgisini yaratadigan `npm run build:release` buyrugʻidan foydalaning. ### Artefaktni tekshirish - [ ] `npm run build:release` muvaffaqiyatli yakunlanadi va `dist/BUILD_SHA` == `git rev-parse --short HEAD` - [ ] `npm run check:pack-artifact` tekshiruvi toza — `app.__qa_backup`, `scripts/scratch`, `package-lock.json` yoki boshqa mahalliy qoldiqlar yoʻq - [ ] Yigʻishdan keyin `dist/server.js` mavjud - [ ] Ixtiyoriy mahalliy paketlangan ishlash muhiti tezkor sinovi: `npm run dev:candidate -- build` buyrugʻidan soʻng `npm run dev:candidate -- validate` paketlangan tarball faylini ajratilgan `DATA_DIR` ichida ishga tushiradi va `/api/health` + `/v1/models` ni tekshiradi ([Hissa qoʻshishning tavsiya etilgan jarayoni](CONTRIBUTION_GOLDEN_PATH.md#local-candidate-loop) ga qarang) ### Teg qoʻyish va reliz - [ ] `/generate-release-cc` buyrugʻini ishga tushiring (Claude Code koʻnikmasi): - `vX.Y.Z` tegini yaratadi - Teg va branchni yuboradi - Oʻzgarishlar jurnali matni bilan GitHub Release ochadi - Electron oʻrnatuvchilarini biriktiradi (agar yigʻilgan boʻlsa) - [ ] Yoki qoʻlda: ```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 ``` ### Joylashtirish Joylashtirish koʻnikmalari yengil rsync jarayonidan foydalanadi — `npm pack` ham, `npm i -g` ham ishlatilmaydi: - [ ] Maqsadga mos deploy ko‘nikmasidan foydalaning: - `/deploy-vps-local-cc` — lokal VPS (192.168.0.15) - `/deploy-vps-akamai-cc` — Akamai VPS (69.164.221.35) - `/deploy-vps-both-cc` — har ikkisi - [ ] Deploy qilishdan oldin `dist/BUILD_SHA` == `git rev-parse --short HEAD` ekanini tasdiqlang - [ ] Build `node_modules` haqiqiy bo‘lgan joyda bajarilishi kerak (asosiy checkout yoki `npm ci` bajarilgan worktree — symlink qilingan worktree EMAS) - [ ] Deploy qilingan instansiyada smoke-test o‘tkazing: - `/dashboard/health` sahifasini oching → versiya satri relizga mosligini tekshiring - Ma’lum provayderga `/v1/chat/completions` so‘rovini yuboring - `/api/monitoring/health` `CLOSED` holatidagi circuit breaker’larni qaytarishini tekshiring - MCP transportlari javob berishini tasdiqlang (`/mcp` HTTP, `/mcp-sse` SSE) ### Relizdan keyin - [ ] `/capture-release-evidences-cc` buyrug‘ini ishga tushiring (Claude Code ko‘nikmasi) - Yangi funksiyalarning WebP skrinshotlari/yozuvlarini oladi - Ularni reliz qaydlari / blog postiga biriktiradi - [ ] GitHub Discussions / Discord’ni reliz e’loni bilan yangilang - [ ] Keyingi versiya uchun milestone oching - [ ] Agar muhim bo‘lsa: muhokamani qadab qo‘ying yoki ilova ichidagi banner uchun `news.json` fayliga joylang ### Radar’ni ommaviy ishga tushirish shartlari Radar e’loni ataylab `active: false` holatida commit qilingan. Uni faollashtirish quyidagi har bir band bo‘yicha dalil taqdim etilgandan keyin alohida o‘zgartirish sifatida amalga oshiriladi: - [ ] Barcha ketma-ket Radar PR’lari birlashtirilgan va reliz uchidagi CI muvaffaqiyatli o‘tgan - [ ] `RADAR_ENABLED` standart holatda o‘chiq qolgan holda OSS Radar marshrutlarini deploy qiling va smoke-testdan o‘tkazing - [ ] Belgilangan Radar hostida `GET /planos`, `/termos`, `/privacidade` va `/reembolso` marshrutlarini smoke-testdan o‘tkazing - [ ] Operatorning shaxsi/aloqa ma’lumotlari/manzilini hamda egasi tasdiqlagan huquqiy tekshiruvni xususiy servisda qayd eting - [ ] Stripe Checkout va imzolangan webhook’ni faqat test rejimida sinab ko‘ring - [ ] Tasdiqlangan jo‘natuvchi/domen orqali bitta shifrlangan tranzaksion e-pochta yetkazib berilishini sinab ko‘ring - [ ] Zaxira nusxasidan tiklashni va nazorat ostida, byudjeti cheklangan bitta tadqiqot ishga tushirilishini isbotlang - [ ] Xayriya dalillarini qabul qilishdan oldin BRL/PIX tekshiruv siyosatini tasdiqlang - [ ] Ommaviy Checkout’ni faqat oldingi shartlar bajarilgandan keyin yoqing, so‘ng yangi `news.json` ID’sini faollashtiring - [ ] Home banneri mahalliylashtirilgan matndan foydalanishini va eski ID yopib qo‘yilgandan keyin yangi ID qayta paydo bo‘lishini tekshiring ## Ichki xizmatlar smoke sinovlari (v3.8.4+) Ichki xizmatlarga oid o‘zgarishlarni o‘z ichiga olgan har qanday relizni chiqarishdan oldin quyidagilarni tekshiring: ### Yangi DB bilan ishga tushirish (migratsiya to‘qnashuvlarini aniqlaydi — v3.8.4 tezkor tuzatishidan keyin qo‘shilgan) - [ ] `DATA_DIR=$(mktemp -d) npm start &` — ishga tushishini 10 s kuting - [ ] `curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'` natijasi `"9router"` bo‘ladi (404 EMAS, 500 EMAS). Bu `071_services.sql` migratsiyasi qo‘llanganini va qator qo‘shilganini tasdiqlaydi. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"` natijasi 3 ta qatorni qaytaradi. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"` natijasi 2 ta qatorni qaytaradi (`070_webhooks_kind_metadata.sql` qo‘llanganini tasdiqlaydi). - [ ] `node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts` muvaffaqiyatli o‘tadi — kelajakdagi to‘qnashuvlardan himoya qiladi. ### 9Router - [ ] `POST /api/services/9router/install` 2 min ichida `installedVersion` bilan 200 qaytaradi - [ ] `POST /api/services/9router/start` 30 s ichida 200 va `state: "running"` qaytaradi - [ ] `GET /api/services/9router/status` `health: "healthy"` holatini bildiradi - [ ] `"model": "9router/auto/..."` bilan `POST /v1/chat/completions` 200 qaytaradi (9Router orqali boshidan oxirigacha marshrutlash) - [ ] `GET /dashboard/providers/services/9router/embed/dashboard` proksi ichida 9Router’ning ichki interfeysini ko‘rsatadi (`127.0.0.1:port` manziliga to‘g‘ridan-to‘g‘ri iframe ishlatilmaydi) - [ ] `POST /api/services/9router/rotate-key` `{ keyRotated: true }` qaytaradi va xizmat muammosiz qayta ishga tushadi - [ ] `POST /api/services/9router/stop` 200 va `state: "stopped"` qaytaradi - [ ] `GET /api/services/9router/logs?tail=50` so‘nggi qatorlarni o‘z ichiga olgan `snapshot` hodisasi bilan SSE oqimini qaytaradi - [ ] PATH ichida `npm` bo‘lmagan muhitda o‘rnatish tushunarli (stek treysisiz) xato xabari bilan 500 qaytaradi ### CLIProxyAPI - [ ] `POST /api/services/cliproxy/install` 2 min ichida 200 qaytaradi - [ ] `POST /api/services/cliproxy/start` 30 s ichida 200 va `state: "running"` qaytaradi - [ ] `GET /api/services/cliproxy/status` `health: "healthy"` holatini bildiradi - [ ] `POST /api/services/cliproxy/stop` 200 va `state: "stopped"` qaytaradi - [ ] `GET /api/services/cliproxy/logs?tail=50` SSE oqimini qaytaradi ### Xavfsizlik regressiyasi - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start` `403 LOCAL_ONLY` qaytaradi - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start` `403 LOCAL_ONLY` qaytaradi - [ ] `/api/services/*` xato javoblarida `err.stack` yoki mutlaq fayl yo‘llari mavjud emas ## v3.8.0+ tekshiruvlari Har qanday v3.8.x relizini chiqarishdan oldin quyidagi qo‘shimcha bandlarni tekshiring: - [ ] `omniroute --tray` macOS’da ishga tushadi (systray2 `~/.omniroute/runtime/` ichiga o‘rnatilgan) - [ ] `omniroute --tray` Linux’da ishga tushadi (DISPLAY talab qilinadi; o‘rnatilmagan bo‘lsa, xato to‘g‘ri qayta ishlanadi) - [ ] `omniroute --tray` Windows’da ishga tushadi (PowerShell NotifyIcon, qo‘shimcha binar fayllarsiz) - [ ] `omniroute config tray enable` avtomatik ishga tushirish yozuvini yaratadi; o‘chirish uni olib tashlaydi - [ ] `npm install -g omniroute@` postinstall jarayonini kritik xato bilan yakunlanmasdan bajaradi - [ ] Yangilash yo‘li ixtiyoriy bog‘liqliklarni saqlab qoladi: `omniroute update --apply` va avtomatik yangilovchi `npm install -g … --include=optional` buyrug‘ini bajaradi, shunda `optionalDependencies` (better-sqlite3, keytar, tls-client va llmlingua SLM steki: `@atjsh/llmlingua-2@2.0.5`, `js-tiktoken`) yangilashdan keyin ham saqlanib qoladi. Ultra `modelPath` SLM darajasi uchun ham tinybert modeli kerak bo‘lib, u birinchi foydalanishda avtomatik ravishda `${DATA_DIR}/models/llmlingua` manziliga yuklab olinadi. Shundan so‘ng postinstall (`scripts/build/colocateOptionals.mjs`) SLM’ning ixtiyoriy bog‘liqliklar to‘plamini `dist/node_modules` ichiga yonma-yon joylashtiradi, natijada worker YAGONA `@huggingface/transformers` ^4.2.0 nusxasini aniqlaydi — mustaqil trace faqat transformers’ni to‘plamga kiritadi, dinamik import qilinadigan ixtiyoriy bog‘liqliklarni emas, shuning uchun busiz worker llmlingua-2’ni ildizdagi transformers bilan yuklaydi va SLM darajasi sezdirmasdan ochiq rejimga o‘tadi. - [ ] `omniroute status` `.env` mavjud bo‘lmaganda ham ishlaydi (CLI token yo‘li, faqat loopback) - [ ] `curl http://localhost:20128/api/shutdown` 401 qaytaradi (har doim himoyalangan marshrut) - [ ] `curl -H "host: evil.com" http://localhost:20128/api/mcp/sse` 401 qaytaradi (loopback himoyasi) - [ ] SQLite runtime birinchi ishga tushirishda `bundled` sifatida aniqlanadi (to‘plamdagi binar fayl platforma uchun yaroqli) - [ ] `node_modules/better-sqlite3` o‘chirilganda SQLite runtime `runtime` variantiga qaytadi - [ ] Aqlli MCP filtri haqiqiy `playwright-mcp browser_snapshot` natijasini siqadi (≥50% qisqarish) - [ ] Barcha 10 ta `skills/omniroute*/SKILL.md` fayli raw GitHub URL orqali hammaga ochiq tarzda yuklab olinadi - [ ] Dastlabki sozlashda onboarding ustasi "U qanday ishlaydi" darajalar bo‘yicha tanishtiruv bosqichini ko‘rsatadi - [ ] Bosh sahifa boshqaruv panelidagi darajalar qamrovi vidjeti sozlangan/faol miqdorlarni ko‘rsatadi --- ## 3.9.0 LTS ajratilishi (3.8.58 da mashq qilingan) v3.8.59 dan keyingi versiya 3.9.0 boʻladi va uning soʻnggi commit’i uzoq muddat ishlatiladigan ikkita tarmoqqa aylanadi: `stable/v3` (v3 LTS liniyasi, npm `latest`) va `develop` (v4, 4.0.0 ga oshirilgan, npm `nightly`). Tarmoq/kanal modeli, oldinga portlash va yorliqlar [RELEASE_STRATEGY.md](./RELEASE_STRATEGY.md) faylida; reja esa [ROADMAP](../../ROADMAP.md) faylida (3-bosqich). Ajratish bir marta bajariladi; 3.8.58 uni fork’da boshidan oxirigacha mashq qiladi, 3.8.59 esa [GO/NO-GO nazorat roʻyxati](./LTS_GO_NO_GO.md) bilan yakunlanadi. ### Sinov ishga tushirishi (faqat oʻqish, istalgan vaqtda xavfsiz) ```bash npm run release:dry-run-lts-cut # haqiqiy ajratish: HEAD dan 3.9.0, oldingi teg v3.8.59 npm run release:dry-run-lts-cut -- --from <3.9.0-tip> # manba commit’ini belgilash ``` `scripts/release/dry-run-lts-cut.mjs` hech narsani bajarmaydi: u git va `gh` maʼlumotlarini oʻqib, butun ketma-ketlikni chiqaradi — dastlabki shartlar (manba aniqlanadi, manba repozitoriyda toʻliq tarix mavjud — sayoz klon `stable/v3` tarmogʻini push qila olmaydi, qabul qiluvchi tomon birinchi payvandlangan ota commit’da paketni rad etadi, shuning uchun avval toʻliq klondan ajrating yoki `git fetch --unshallow origin` buyrugʻini bajaring — oldingi teg mavjud, `package.json` maqsadli versiyada, `release-freeze` muammosi ochiq, mavjud reliz tarmogʻida ochiq `Release branch not green` muammosi yoʻq — mavjud boʻlmagan tarmoq yashil emas, balki `?` nomaʼlum deb koʻrsatiladi — Mergify `release` navbati sozlangan (G11: `queue_rules`, `checks_timeout`, `queue` yorligʻi), `release/*` qoidalar toʻplami hali ham oʻchirish va majburiy push’ni bloklaydi hamda `stable/v3` va `develop` hali mavjud emas), ikkita tarmoq qadami, qaysi harakatsiz workflow triggerlari va `if:` shartlari rost boʻlishi (hamda qaysilari repozitoriy oʻzgaruvchisi bilan cheklangan yoki kanonik repozitoriyga biriktirilgan holda qolishi), kutiladigan dist-tag’lar (`latest` → 3.9.0, `next` va `nightly` boʻsh) va ortga qaytarish. Chiqish kodi `0` = `RESULT: READY`, `1` = bloklovchi dastlabki shart bajarilmadi (`✗`), `2` = foydalanish xatosi. `--advisory ` tekshiruvni yashirmasdan ogohlantirish (`!`) darajasiga tushiradi. Haqiqiy ajratishning sinov ishga tushirishini 3.9.0 reliz muzlatilishi hali ochiq paytda bajaring — tarmoqlar tegdan keyin va 12c-bosqich muzlatishni olib tashlashidan oldin yaratiladi. ### 3.8.58 mashqi (faqat fork’da) ```bash # 1. Joriy soʻnggi commit’da mashq parametrlari bilan sinov ishga tushirishini bajaring npm run release:dry-run-lts-cut -- --target-version 3.8.58 --previous-tag v3.8.57 \ --advisory freeze,base-green # 2. FORK remote’iga nisbatan bajaring (origin yoki URL manzili kanonik # repozitoriy boʻlgan har qanday remote rad etiladi; har bir qadam terminalda tasdiqlashni soʻraydi) 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’dagi harakatsiz workflow’larni sinab koʻring (sinov ishga tushirishi # kanonik repozitoriyga biriktirish haqida xabar bergan joyda workflow_dispatch), soʻng ortga qaytaring 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 versiyasini oshiruvchi commit git plumbing yordamida yaratiladi (ishchi daraxtga tegilmaydi) va siklni ochuvchi commit bilan bir xil beshta fayldagi versiyani oshiradi: `package.json`, `open-sse/package.json`, `electron/package.json`, `package-lock.json` va `docs/openapi.yaml`. `[4.0.0]` CHANGELOG boʻlimi va uning i18n nusxalari keyinroq, birinchi PR’dan oldin `develop` tarmogʻida ochiladi. Skript npm dist-tag’larini hech qachon oʻzgartirmaydi — ularni vaqtinchalik paketda mashq qiling. ### PR oldindan koʻrish artefakti (bir marta build qiling, ayni baytlarni targʻib qiling) `.github/workflows/preview-artifact.yml` PR head’dan bitta production tarball yaratadi va aynan shu build’ni tekshiradi (#8084 boʻlagi (a)). Faqat ayni repozitoriydagi PR’lar; hech narsa chop etilmaydi. ```bash gh workflow run preview-artifact.yml -f pr_number= # yoki `preview-artifact` yorligʻini qoʻshing 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 # oldindan koʻrish versiyasini oʻrnatish ``` Ishga tushirish `npm ci`, `npm run build:release`, `npm run check:pack-artifact` buyruqlarini bajaradi, tarball’ni paketlaydi, `npm run check:pack-boot` buyrugʻini ishga tushiradi (soxta maxfiy maʼlumotlar, vaqtinchalik maʼlumotlar katalogi), qayta paketlaydi va digest bir xil boʻlmasa muvaffaqiyatsiz tugaydi, soʻng `artifact-identity.json` fayliga (head SHA, base SHA, lockfile xeshi, platforma, arxitektura, node ABI, bundler, build siyosati — `scripts/release/artifact-identity.mjs`) maʼlumotlarini yozadi va alohida job’da tarball’ni attestatsiyadan oʻtkazadi. Oldindan koʻrish versiyasini targʻib qilish shu tarball’ni oʻrnatishni anglatadi: hech qachon manbadan qayta build qilmang. ### Ajratish (3.9.0, GO qaroridan keyin) 1. GO qarori [LTS_GO_NO_GO.md](./LTS_GO_NO_GO.md) faylida qayd etilgan. 2. `npm run release:dry-run-lts-cut -- --from v3.9.0` buyrugʻi `RESULT: READY` natijasini chiqaradi. 3. Tarmoqlarni sinov ishga tushirishi koʻrsatgan buyruqlar yordamida `origin` da qoʻlda yarating — skript `origin` ga push qilishni rad etadi. Koʻrib chiqilgan develop commit’ini qayta ishlatish uchun avval 3.9.0 ning soʻnggi commit’ida fork’ingizga nisbatan `--execute` mashqini bajaring; u ikkala SHA’ni ham chiqaradi va ayni commit’larni push qilish mumkin: ```bash git push origin :refs/heads/stable/v3 :refs/heads/develop ``` 4. Birinchi PR qabul qilinishidan oldin `stable/v3` va `develop` tarmoqlarini himoyalang (qoidalar toʻplami + birlashtirish navbati). 5. Faol boʻlmagan ish jarayonlari tarmoq mavjudligiga qarab ishga tushadi: `forward-port.yml` (`stable/v3` tarmogʻiga push), `validate-stable-pr.yml` (`stable/v3` tarmogʻiga PR’lar) va `nightly-v4-build.yml` (`develop` tarmogʻini yigʻadi). Ishga tushirishdan oldin `secrets.FORWARD_PORT_TOKEN` repozitoriy sirini sozlang (shunda CI forward-port PR’larida ishlaydi); tungi nashr qilish repozitoriy egasi `vars.NIGHTLY_PUBLISH` oʻzgaruvchisini `true` qilib sozlamaguncha va npm Trusted Publishing `nightly-v4-build.yml` faylini qabul qilmaguncha oʻchiq qoladi. Kanalni aniqlash `scripts/release/dist-tag.mjs` orqali amalga oshiriladi — bu `npm-publish.yml` ishlatadigan rezolverning oʻzi. 6. Kanallarni tekshiring: `npm view omniroute dist-tags --json` buyrugʻi `latest` = 3.9.0 ekanini va v4 nashr etilmaguncha `next` / `nightly` mavjud emasligini koʻrsatadi. 7. Zarur boʻlsa, orqaga qaytarish: `git push origin --delete refs/heads/stable/v3 refs/heads/develop` va `npm dist-tag add omniroute@3.8.59 latest`. --- ## Orqaga qaytarish Agar relizda jiddiy muammo bo‘lsa: 1. `gh release edit vX.Y.Z --prerelease` (eng so‘nggi reliz emas deb belgilaydi) 2. `git tag -d vX.Y.Z && git push --delete origin vX.Y.Z` (faqat foydalanuvchilar hali undan foydalanishni boshlamagan bo‘lsa) 3. Yoki: `release/vX.Y.0` da tezkor tuzatish → `vX.Y.(Z+1)` tuzatish relizi 4. GitHub Discussions va Discord orqali darhol xabar bering ## Qat’iy qoidalar - Hech qachon to‘g‘ridan-to‘g‘ri `main` ga kommit qilmang - Hech qachon `main` yoki `release/*` shoxlariga `git push --force` ishlatmang - Hech qachon Husky ilgaklarini (`--no-verify`) chetlab o‘tmang - Hech qachon sirlar, hisob ma’lumotlari yoki `.env` fayllarini kommit qilmang - Qamrov ≥60/60/60/60 (ifodalar/satrlar/funksiyalar/tarmoqlar) darajasida qolishi shart - `src/`, `open-sse/`, `electron/` yoki `bin/` ichidagi ishlab chiqarish kodini o‘zgartirganda har doim testlarni qo‘shing yoki yangilang ## Avtomatlashtirilgan sinxronlash tekshiruvi PR ochishdan oldin hujjatlar sinxronlash himoyasini mahalliy muhitda ishga tushiring: ```bash npm run check:docs-sync ``` CI ham bu tekshiruvni `.github/workflows/ci.yml` ichida (lint vazifasida) ishga tushiradi.