# Release Checklist (Lietuvių) 🌐 **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) · 🇱🇻 [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) --- > **Paskutinį kartą atnaujinta:** 2026-08-28 — v3.8.51 > Supaprastintas leidimo procesas, automatizavimui naudojantis Claude Code įgūdžius. > > **Tarp leidimų išlaikykite eilę / šaką be klaidų:** žr. [RELEASE_GREEN.md](./RELEASE_GREEN.md) > (`/green-prs` šeima + `npm run check:release-green` + `/babysit` + naktinis vykdymas). Periodiškai tai vykdant — > ypač **prieš** naudojant šį kontrolinį sąrašą — leidimo PR nuo pat pradžių bus be klaidų. ## Trumpai ```bash # 1. Padidinkite versiją ir sugeneruokite CHANGELOG (įgūdis) /version-bump-cc patch # arba minor/major # 2. Lokaliai paleiskite kokybės patikrą npm run check # statinė analizė ir testai npm run test:coverage # visa aprėpties patikra (60/60/60/60) # 3. Sukompiliuokite ir atlikite bazinį patikrinimą npm run build npm run test:e2e # neprivaloma, bet rekomenduojama # 4. Sugeneruokite leidimą (įgūdis) /generate-release-cc # 5. Įdiekite (įgūdis) /deploy-vps-both-cc # arba akamai-cc / local-cc # 6. Užfiksuokite leidimo įrodymus (įgūdis) /capture-release-evidences-cc ``` ## npm patikimas publikavimas (numatytasis nuo v3.8.51) — pagal užklausą etapinis, tiesioginis kaip atsarginis variantas `npm-publish.yml` pagal numatytąją nuostatą publikuoja per **npm patikimą publikavimą (OIDC)**: užduotis `stage-npm` (vykdoma GitHub infrastruktūroje) iškeičia GitHub id-token į trumpalaikį npm prisijungimo duomenį, skirtą tam vykdymui — saugyklos paslaptyse nėra ilgalaikio npm prieigos rakto, nereikia 2FA raginimo, o kilmės patvirtinimas pridedamas. Tai yra npm dabar leidžiamas apėjimo būdas, kai prieigos raktai, praleidžiantys 2FA, šalinami; jis atkuria visiškai automatinį procesą, kurį projektas turėjo iki v3.8.48, kartu išlaikydamas WS1.3 garantiją (nutekintas prieigos raktas negali publikuoti savarankiškai — jokio rakto nėra). **Vienkartinė sąranka (savininkui):** npmjs.com → paketas `omniroute` → Settings → _Trusted Publisher_ → GitHub: savininkas `diegosouzapw`, saugykla `OmniRoute`, darbo eiga `npm-publish.yml` (aplinka: nėra). Kol tai nesukonfigūruota, automatinis veiksmas baigiasi klaida `ENEEDAUTH`: paleiskite iš naujo su `publish_mode=staged` (žr. toliau) arba `direct`. ### Etapinis publikavimas (pagal užklausą — `publish_mode=staged`) npm publikavimo darbo eiga daugiau nepublikuoja tiesiogiai: ji paleidžia supakuotą tarball (`check:pack-boot`), tada vykdo `npm stage publish` — tiksliai tie patys baitai patalpinami registre, tačiau jų **negalima įdiegti**, kol savininkas nepatvirtina. Žmogaus atliekama 2FA patikra perkelta PO patvirtinimo, o ne prieš jį. **Savininko veiksmai darbo eigai sėkmingai pasibaigus:** 1. `npm stage list omniroute` — raskite etapo ID (jis taip pat pateikiamas darbo eigos suvestinėje). 2. Patikrinkite etapui paruoštus baitus (rekomenduojama): `npm stage download `, tada įdiekite atsisiųstą tarball į laikiną prefiksą ir jį paleiskite (`npm run check:pack-boot` CI aplinkoje automatizuoja tą patį pakavimo → diegimo → paleidimo patikrinimą). 3. `npm stage approve ` — 2FA raginimas IR YRA publikavimas. `npm stage reject ` atmeta. 4. Apsauga po publikavimo: tikrintuvas po publikavimo (v3.8.49 plano WS1.4) švariajame konteineryje iš viešojo registro įdiegia paskelbtą versiją ir ją paleidžia. **Avarinis atsarginis variantas:** `workflow_dispatch` su `publish_mode=direct` atkuria senąjį tiesioginį `npm publish` (naudokite tik jei pats etapinis publikavimas veikia netinkamai; užfiksuokite priežastį). **Vienkartinis sustiprinimas (savininkui, npmjs.com):** sukonfigūruokite Trusted Publisher, skirtą `omniroute`, tik etapinėje veiksenoje, kad nutekintas ilgalaikis prieigos raktas negalėtų tiesiogiai vykdyti `npm publish` iš jokios vietos — CI gali tik paruošti etapą; paskelbti gali tik savininkas, naudodamas 2FA. **Sugadinto artefakto veiksmų planas (nepakitęs):** numatytoji reakcija — `npm deprecate omniroute@ " — use "` (trunka kelias minutes, galima atšaukti); `npm unpublish` naudokite tik per 72 val. laikotarpį, kai nėra priklausomų paketų, ir niekada ne kaip pirmą veiksmą. Docker: niekada neperrašykite versijos žymos — atšaukimas atliekamas nukreipiant `latest` į paskutinį tinkamą maišos identifikatorių. **Docker Hub `latest` (privaloma kiekvienam stabilios SemVer versijos publikavimui):** `docker-publish` darbo eiga turi pažymėti **ir** `X.Y.Z`, **ir**, kai `should-promote-latest.sh` patvirtina, kad tai aukščiausia stabili SemVer versija, `:latest` tuo **pačiu maišos identifikatoriumi**. Užduočiai pasibaigus: Hub `latest` maišos identifikatorius turi sutapti su naujosios SemVer versijos maišos identifikatoriumi, o `last_updated` turi būti atnaujintas. Nepalikite `:latest`, nurodančio senesnę versiją, kai leidimo pastabose aprašomi pataisymai, esantys tik git. Compose greitosios pradžios pavyzdžiai naudoja `:latest`; GitOps turėtų ir toliau fiksuoti `X.Y.Z`. Žr. [Docker leidimo kanalai](../guides/DOCKER_GUIDE.md#release-channels) ir #10317. ## Spartusis karštųjų pataisų kelias (žyma `hotfix`) PR su žyma `hotfix` praleidžia sudėtingą CI matricą (9 segmentų E2E, aprėpties kartelę, quality-gate, quality-extended) ir palieka sparčias, patikimas patikras: komponavimą, modulių segmentus, integracinius testus, vitest, lint/typecheck, docs-sync, `check:pack-artifact` ir tar archyvo paleidimo dūminį testą (`check:pack-boot`). Tikslas: žalia būsena per ≤15 min., o ne per ~33 min. **Naudojimo politika — privalomos visos keturios sąlygos (parengta pagal Chromium/VS Code/Node avarinius kelius):** 1. **Kritiškumas**: produkcinė aplinka neveikia — paskelbtas artefaktas užstringa paleidžiant / saugos pataisa / problema paveikia kiekvieną leidimo naudotoją. „Svarbu“ nereiškia „neveikia“. 2. **Įgaliojimai**: tik saugyklos savininkas priskiria žymą `hotfix`. Žyma YRA patvirtinimas — niekada nepriskirkite jos patys kampanijos PR. 3. **Įrodymai**: PR apraše pateikiama nuoroda į ankstesnį visiškai žalią sudėtingą vykdymą (rinkinį, kurį praleistos užduotys patikrintų pakartotinai) ir į pačios pataisos testą, kuris iš pradžių nepavyko, o po to pavyko. 4. **Apimtis**: tik cherry-pick — minimali pataisa, jokių pertvarkymų ar papildomų pakeitimų. Praleista aprėpties / kartelės sritis iš naujo patikrinama per kitą visą vykdymą leidimo šakoje (nuolat žalia leidimo būsena) — šis kelias praleidžia LAUKIMĄ, bet niekada ne patikrą. Pakeitimai, apimantys tik testus (visi failai yra `tests/`, nė vieno nėra `tests/e2e/`), automatiškai praleidžia E2E matricą be jokios žymos. ## Išsamus kontrolinis sąrašas ### Prieš leidimą - [ ] Visi šiam leidimui skirti PR sujungti į `release/vX.Y.0` - [ ] Visi atviri šios versijos Linear / problemų elementai uždaryti arba perkelti į kitą etapą - [ ] `release/vX.Y.0` šakos CI patikros sėkmingos - [ ] Kode nėra `TODO(release)` žymų: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker bazinis atvaizdas atnaujintas (šiuo metu `node:24.15.0-trixie-slim`) ### Versija ir pakeitimų žurnalas - [ ] Paleisti `/version-bump-cc ` (Claude Code įgūdis) - Atnaujina versijas `package.json`, `electron/package.json` - Iš naujo sugeneruoja `CHANGELOG.md` pagal git įrašus nuo paskutinės žymos - Atnaujina README.md ženklelius - [ ] Rankiniu būdu peržiūrėti CHANGELOG.md ir, jei reikia, sutvarkyti įrašų pranešimus - [ ] Užtikrinti, kad naujausio semver skyriaus versija faile `CHANGELOG.md` sutaptų su `package.json` versija - [ ] Palikti `## [Unreleased]` kaip pirmą pakeitimų žurnalo skyrių būsimiems darbams - [ ] Atnaujinti `docs/openapi.yaml` → `info.version` turi sutapti su `package.json` versija ### Kodo kokybė - [ ] `npm run lint` — 0 klaidų (įspėjimai jau buvo anksčiau) - [ ] `npm run typecheck:core` — be klaidų - [ ] `npm run typecheck:noimplicit:core` — be klaidų (griežtas režimas) - [ ] `npm run check:cycles:ratchet` — neviršija fiksuotos `metrics.cycles` ribos (atskira `check:cycles` komanda baigiama kodu 1 aptikus bet kokį ciklą, #15281) - [ ] `npm run check:any-budget:t11` — neviršija limito - [ ] `npm run check:route-validation:t06` — be klaidų - [ ] `npm run check:node-runtime` — tenkinama minimali palaikomos vykdymo aplinkos versija (`>=22.22.2 <23`, `>=24.0.0 <27`, pagal `SUPPORTED_NODE_RANGE`, esantį `src/shared/utils/nodeRuntimeSupport.ts`; suderinta su `package.json` `engines`) ### Testavimas - [ ] `npm run test:unit` — sėkmingas - [ ] `npm run test:vitest` — sėkmingas (MCP serveris, autoCombo, podėlis) - [ ] `npm run test:coverage` — tenkinama 60/60/60/60 riba (sakiniai / eilutės / funkcijos / šakos) - [ ] `npm run test:integration` — sėkmingas (jei pakeitimai susiję su DB / apdorojimo funkcijomis) - [ ] `npm run test:combo:matrix` — sėkmingas (kombinuotųjų strategijų matrica: deterministiškai patvirtina visų 19 viešų maršruto parinkimo strategijų pasirinkimo sprendimus; paleisti keičiant kombinuotąjį maršruto parinkimą, strategijos nustatymą arba atsarginę logiką) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **neprivalomas / rankinis** (valdomas tikros išorinės sistemos bazinis testas; iš VPS `root@192.168.0.15` gauna tik skaitomą DB momentinę kopiją; kreipiasi į tikrus teikėjus ir naudoja kreditus; niekada nevykdomas CI; be aktyvinimo sąlygos korektiškai praleidžiamas) - [ ] `npm run test:combo:live:vps` — **neprivalomas / rankinis** (3-iojo etapo VPS bazinis testas tikroje aplinkoje: 7 HTTP scenarijai su veikiančiu `.15` serveriu naudojant paprastą Node ESM; reikalinga `ssh root@192.168.0.15`; sukuria ir pašalina tik `__live_test__*` kombinacijas; kreipiasi į tikrus teikėjus; niekada nevykdomas CI) - [ ] `npm run test:e2e` — sėkmingas (UI pakeitimams) - [ ] `npm run test:protocols:e2e` — sėkmingas (MCP / A2A pakeitimams) - [ ] `npm run test:ecosystem` — sėkmingas ### Kabliai (patvirtinti Husky) Husky kabliai yra `.husky/` ir vykdomi automatiškai atliekant git operacijas. - **pre-commit:** `npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11` - **pre-push:** greitos deterministinės patikros — `npm run check:any-budget:t11 && npm run check:tracked-artifacts` (aktyvinta 2026-06-13). Sąmoningai neįtraukia `test:unit` (lėtas; jį vykdo CI `test-unit` užduotis). - Prieš siunčiant leidimo šakas, rankiniu būdu paleisti `npm run test:unit`. Jei kablio patikra nepavyksta: ištaisyti pagrindinę problemą, neapeiti jos naudojant `--no-verify`. ### Standartizuoti įrašai Visi į leidimą įtraukiami įrašai turi atitikti formatą `type(scope): subject`. **Leistini tipai:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `style`, `ci` **Leistinos sritys:** `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`, `cloud-agent`, `guardrails`, `compression`, `auto-combo`, `resilience`, `providers`, `executors`, `translator`, `domain`, `authz` Nesuderinami pakeitimai: pridėti `BREAKING CHANGE:` poraštę arba `!` po srities (pvz., `feat(api)!: drop /v0`). ### Dokumentacija - [ ] `npm run check:docs-sync` sėkmingas (automatiškai paleidžiamas prieš įrašą) - [ ] `npm run check:docs-all` sėkmingas (bendra patikra: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links) - [ ] `npm run check:env-doc-sync` baigiamas kodu 0 — kodo ↔ `.env.example` ↔ `docs/reference/ENVIRONMENT.md` aplinkos sutartis nepažeista - [ ] `npm run check:doc-links` baigiamas kodu 0 — po struktūros pertvarkymo nėra neveikiančių vidinių Markdown nuorodų - [ ] `docs/architecture/ARCHITECTURE.md` peržiūrėtas dėl saugyklos / vykdymo aplinkos neatitikimų - [ ] `docs/guides/TROUBLESHOOTING.md` peržiūrėtas dėl aplinkos kintamųjų ir veikimo neatitikimų - [ ] Jei pakeistas `.env.example`: atnaujintas `docs/reference/ENVIRONMENT.md` - [ ] Jei nauja funkcija turi UI: ji paminėta `docs/guides/USER_GUIDE.md` - [ ] Jei nauja funkcija turi API: atnaujinti `docs/reference/API_REFERENCE.md` ir `docs/openapi.yaml` - [ ] Jei nauja funkcija yra modulis: yra atskiras `docs/.md` - [ ] Jei tai nesuderinamas pakeitimas: `docs/guides/TROUBLESHOOTING.md` yra perkėlimo pastaba ### i18n - [ ] `npm run i18n:check` baigiamas kodu 0 — vertimų būsena (`.i18n-state.json`) sinchronizuota su šaltinio dokumentais (griežtu režimu nėra pakitusių šaltinių; įspėjimo režimo pranešimai priimtini paskutinės minutės dokumentacijos pataisoms, tačiau prieš kuriant žymą rezultatas turi būti 0) - [ ] `npm run i18n:check-ui-coverage` baigiamas kodu 0 — kiekviena UI lokalė pasiekia arba viršija 80 % aprėpties ribą - [ ] `npm run i18n:sync-ui:dry` praneša apie 0 trūkstamų raktų visose 66 tikslinėse lokalėse (kiekvienoje lokalėje, išskyrus šaltinio `en`) - [ ] Jei pakeisti angliški šaltinio dokumentai, prieš kuriant žymą paleisti `npm run i18n:run` (faile `.env` reikalingas `OMNIROUTE_TRANSLATION_API_KEY`) - [ ] Vertimų papildymus galima atidėti kitam leidimui, jei jie nedideli (pažymėti CHANGELOG) ### Duomenų bazės migracijos - [ ] Jei `src/lib/db/migrations/` yra naujų failų: - [ ] Kiekviena migracija yra idempotentinė (`CREATE TABLE IF NOT EXISTS` ir pan.) - [ ] Migracijos vykdomos transakcijose - [ ] Numeracija teisinga (sekoje nėra tarpų) - [ ] Išbandyti švariame diegime: pašalinti `~/.omniroute/omniroute.db` ir paleisti `npm run dev` - [ ] Išbandyti esamame diegime: sukurti atsarginę DB kopiją, paleisti migraciją ir patikrinti schemą - [ ] WAL failai (`-wal`, `-shm`) tinkamai apdorojami, jei migracija perrašo lenteles ### Paslaugų teikėjų katalogas (tikrinamas su „Zod“) - [ ] `src/shared/constants/providers.ts` „Zod“ schema yra tinkama įkėlimo metu - [ ] Visi paslaugų teikėjai turi privalomus laukus (`id`, `label`, `kind` ir kt.) - [ ] Naujiems nemokamiems paslaugų teikėjams nurodytas `freeNote` - [ ] OAuth paslaugų teikėjų `oauthConfig` užregistruota faile `src/lib/oauth/constants/oauth.ts` - [ ] Jei pridėtas naujas paslaugų teikėjas: atitinkama vykdyklė kataloge `open-sse/executors/` - [ ] Jei naudojamas ne „OpenAI“ formatas: keitiklis kataloge `open-sse/translator/` - [ ] Modeliai užregistruoti faile `open-sse/config/providerRegistry.ts` - [ ] Vienetų testai kataloge `tests/unit/` apima paslaugų teikėjų klasifikavimą ir maršruto parinkimą ### Darbalaukio programa („Electron“) Jei pakeistas `electron/`: - [ ] `npm run electron:smoke:packaged` įvykdomas sėkmingai - [ ] Sukompiliuotos versijos išbandytos bent vienai iš `:win`, `:mac`, `:linux` platformų - [ ] Kodo pasirašymo sertifikatų galiojimas nėra pasibaigęs (jei pasirašoma) - [ ] `electron/package.json` versija sutampa su šakniniu `package.json` - [ ] Automatinio atnaujinimo kanalo rodyklė atnaujinta, jei leidžiama į `stable` ### Kompiliavimo išdėstymas Saugykloje naudojami trys atskiri išvesties katalogai — niekada jų nesumaišykite: | Katalogas | Paskirtis | Sekamas? | | --------- | ------------------------------------------------------------------ | --------------- | | `src/` | Programos šaltinis („TypeScript“ / TSX) | Taip | | `.build/` | Tarpiniai kompiliavimo failai — `next build` išvestis (`distDir`) | Ne (gitignored) | | `dist/` | Platinamas npm paketas — surenkamas naudojant `assembleStandalone` | Ne (gitignored) | > **Pastaba operatoriui:** nuotolinio VPS atvaizdo katalogas lieka `/usr/lib/node_modules/omniroute/app/`. > Pasikeitė tik **saugykloje esanti** kompiliavimo išvestis (`app/` → `dist/`). Diegimo įgūdžiai su `rsync` > nukopijuoja `dist/` turinį į nuotolinį `app/` katalogą — VPS kelių keisti nereikia. **Vieno kompiliavimo eiga:** ``` npm run build:release └─ rm -rf .build dist (išvalymas) └─ next build → .build/next/ (tarpiniai failai) └─ assembleStandalone (nukopijuoja standalone + static + public + natives → dist/) └─ writes dist/BUILD_SHA (HEAD kontrolinis žymuo) ``` Diegdami NEPALEISKITE `npm run build`, o po jo atskiros komandos `npm run build:cli` — naudokite `npm run build:release`, kuri viena komanda atlieka švarų perkompiliavimą ir sukuria kontrolinį žymenį. ### Artefakto tikrinimas - [ ] `npm run build:release` įvykdomas sėkmingai ir `dist/BUILD_SHA` == `git rev-parse --short HEAD` - [ ] `npm run check:pack-artifact` rezultatas švarus — nėra `app.__qa_backup`, `scripts/scratch`, `package-lock.json` ar kitų vietinių liekanų - [ ] Po kompiliavimo egzistuoja `dist/server.js` - [ ] Pasirinktinis vietinis supakuotos vykdymo aplinkos greitasis testas: `npm run dev:candidate -- validate` po `npm run dev:candidate -- build` paleidžia supakuotą tarball izoliuotame `DATA_DIR` ir patikrina `/api/health` bei `/v1/models` (žr. [Rekomenduojamą indėlio eigą](CONTRIBUTION_GOLDEN_PATH.md#local-candidate-loop)) ### Žymų kūrimas ir leidimas - [ ] Paleiskite `/generate-release-cc` („Claude Code“ įgūdį): - Sukuria žymą `vX.Y.Z` - Išsiunčia žymą ir šaką - Sukuria „GitHub Release“ su pakeitimų žurnalo turiniu - Prideda „Electron“ diegimo programas (jei jos sukompiliuotos) - [ ] Arba atlikite rankiniu būdu: ```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 ``` ### Diegimas Diegimo įgūdžiai naudoja supaprastintą `rsync` eigą — be `npm pack` ir be `npm i -g`: - [ ] Naudokite paskirties vietą atitinkantį diegimo įgūdį: - `/deploy-vps-local-cc` — vietinis VPS (192.168.0.15) - `/deploy-vps-akamai-cc` — „Akamai“ VPS (69.164.221.35) - `/deploy-vps-both-cc` — abu - [ ] Prieš diegdami patvirtinkite, kad `dist/BUILD_SHA` == `git rev-parse --short HEAD` - [ ] Kompiliavimas turi būti vykdomas ten, kur `node_modules` yra tikras katalogas (pagrindinėje darbinėje kopijoje arba darbo medyje, kuriame paleistas `npm ci` — NE darbo medyje su simboline nuoroda) - [ ] Atlikite įdiegtos versijos greitąjį testą: - Atidarykite `/dashboard/health` → patikrinkite, ar versijos eilutė atitinka leidimą - Išsiųskite `/v1/chat/completions` užklausą žinomam paslaugų teikėjui - Patikrinkite, ar `/api/monitoring/health` grąžina `CLOSED` grandinės pertraukiklius - Patvirtinkite, kad MCP transportai atsako (`/mcp` HTTP, `/mcp-sse` SSE) ### Po leidimo - [ ] Paleiskite `/capture-release-evidences-cc` („Claude Code“ įgūdį) - Užfiksuoja naujų funkcijų WebP ekrano kopijas ir įrašus - Prideda juos prie leidimo pastabų / tinklaraščio įrašo - [ ] Atnaujinkite „GitHub Discussions“ / „Discord“ paskelbdami pranešimą apie leidimą - [ ] Sukurkite kitos versijos etapą - [ ] Jei tai kritiškai svarbu: prisekite diskusiją arba paskelbkite įraše `news.json`, kad būtų rodoma programos reklamjuostė ### „Radar“ viešo paleidimo kontroliniai kriterijai „Radar“ pranešimas sąmoningai įtrauktas su `active: false`. Aktyvinimas yra atskiras pakeitimas, atliekamas tik pateikus kiekvieno toliau nurodyto punkto įrodymus: - [ ] Visi susieti „Radar“ PR yra sujungti, o leidimo viršūnės CI yra sėkmingas - [ ] Įdiekite ir greitai išbandykite OSS „Radar“ maršrutus, kai `RADAR_ENABLED` pagal numatytąją nuostatą vis dar išjungtas - [ ] Greitai išbandykite `GET /planos`, `/termos`, `/privacidade` ir `/reembolso` nurodytame „Radar“ prieglobos serveryje - [ ] Privačioje paslaugoje užregistruokite operatoriaus tapatybę / kontaktinius duomenis / adresą ir savininko patvirtintą teisinę peržiūrą - [ ] Tik testavimo režimu išbandykite „Stripe Checkout“ ir pasirašytą webhook - [ ] Išbandykite vieno šifruoto operacinio el. laiško pristatymą naudojant patvirtintą siuntėją / domeną - [ ] Įrodykite atsarginės kopijos atkūrimą ir atlikite vieną prižiūrimą tyrimo vykdymą su ribotu biudžetu - [ ] Prieš priimdami aukojimo įrodymus patvirtinkite BRL/PIX peržiūros politiką - [ ] Viešą „Checkout“ įjunkite tik įvykdę ankstesnius kontrolinius kriterijus, tada aktyvinkite naują `news.json` ID - [ ] Patikrinkite, ar pradžios puslapio reklamjuostėje naudojamas lokalizuotas tekstas ir ar naujas ID vėl parodomas atmetus senesnį ID ## Įterptųjų paslaugų bazinis patikrinimas (v3.8.4+) Prieš išleidžiant bet kurią versiją, kurioje yra įterptųjų paslaugų pakeitimų, patikrinkite: ### Paleidimas su nauja DB (aptinka migracijų konfliktus — pridėta po v3.8.4 skubaus pataisymo) - [ ] `DATA_DIR=$(mktemp -d) npm start &` — palaukite 10 s, kol sistema bus paleista - [ ] `curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'` grąžina `"9router"` (NE 404 ir NE 500). Tai patvirtina, kad migracija `071_services.sql` pritaikyta ir įrašas sukurtas. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"` grąžina 3 eilutes. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"` grąžina 2 eilutes (patvirtina, kad `070_webhooks_kind_metadata.sql` pritaikyta). - [ ] `node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts` sėkmingai įvykdomas — apsaugo nuo būsimų konfliktų. ### 9Router - [ ] `POST /api/services/9router/install` per mažiau nei 2 min grąžina 200 su `installedVersion` - [ ] `POST /api/services/9router/start` per mažiau nei 30 s grąžina 200 ir `state: "running"` - [ ] `GET /api/services/9router/status` pateikia `health: "healthy"` - [ ] `POST /v1/chat/completions` su `"model": "9router/auto/..."` grąžina 200 (visas maršruto parinkimas per 9Router) - [ ] `GET /dashboard/providers/services/9router/embed/dashboard` atvaizduoja savąją 9Router sąsają tarpinio serverio viduje (be tiesioginio `127.0.0.1:port` iframe) - [ ] `POST /api/services/9router/rotate-key` grąžina `{ keyRotated: true }`, o paslauga švariai paleidžiama iš naujo - [ ] `POST /api/services/9router/stop` grąžina 200 ir `state: "stopped"` - [ ] `GET /api/services/9router/logs?tail=50` grąžina SSE srautą su `snapshot` įvykiu, kuriame pateikiamos naujausios eilutės - [ ] Diegiant aplinkoje, kurios PATH nėra `npm`, grąžinama 500 su aiškiu klaidos pranešimu (be dėklo sekimo informacijos) ### CLIProxyAPI - [ ] `POST /api/services/cliproxy/install` per mažiau nei 2 min grąžina 200 - [ ] `POST /api/services/cliproxy/start` per mažiau nei 30 s grąžina 200 ir `state: "running"` - [ ] `GET /api/services/cliproxy/status` pateikia `health: "healthy"` - [ ] `POST /api/services/cliproxy/stop` grąžina 200 ir `state: "stopped"` - [ ] `GET /api/services/cliproxy/logs?tail=50` grąžina SSE srautą ### Saugumo regresija - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start` grąžina `403 LOCAL_ONLY` - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start` grąžina `403 LOCAL_ONLY` - [ ] Klaidų atsakymuose iš `/api/services/*` nėra `err.stack` ar absoliučių failų kelių ## v3.8.0+ patikros Prieš išleidžiant bet kurią v3.8.x versiją, patikrinkite šiuos papildomus punktus: - [ ] `omniroute --tray` paleidžiamas macOS sistemoje (systray2 įdiegtas į `~/.omniroute/runtime/`) - [ ] `omniroute --tray` paleidžiamas Linux sistemoje (reikalingas DISPLAY; jei jis nenustatytas, pateikiama tinkama klaida) - [ ] `omniroute --tray` paleidžiamas Windows sistemoje (PowerShell NotifyIcon, be papildomų dvejetainių failų) - [ ] `omniroute config tray enable` sukuria automatinio paleidimo įrašą; išjungimas jį pašalina - [ ] `npm install -g omniroute@` įvykdo veiksmus po diegimo be kritinio užbaigimo - [ ] Atnaujinimo būdas išsaugo pasirinktines priklausomybes: `omniroute update --apply` ir automatinio atnaujinimo priemonė vykdo `npm install -g … --include=optional`, kad `optionalDependencies` (better-sqlite3, keytar, tls-client ir llmlingua SLM rinkinys: `@atjsh/llmlingua-2@2.0.5`, `js-tiktoken`) išliktų po atnaujinimo. Ultra `modelPath` SLM lygiui taip pat reikalingas tinybert modelis, pirmą kartą naudojant automatiškai atsisiunčiamas į `${DATA_DIR}/models/llmlingua`. Veiksmai po diegimo (`scripts/build/colocateOptionals.mjs`) tuomet kartu patalpina pasirinktinių SLM priklausomybių visumą į `dist/node_modules`, kad darbinis procesas naudotų VIENĄ `@huggingface/transformers` ^4.2.0 egzempliorių — autonominis trasavimo paketas apima tik transformers, bet ne dinamiškai importuojamas pasirinktines priklausomybes, todėl be šio veiksmo darbinis procesas įkeltų llmlingua-2 su šakninės aplinkos transformers ir SLM lygis nepastebimai persijungtų į atsarginį režimą. - [ ] `omniroute status` veikia be `.env` (CLI prieigos rakto kelias, tik vietinė sąsaja) - [ ] `curl http://localhost:20128/api/shutdown` grąžina 401 (visada apsaugotas maršrutas) - [ ] `curl -H "host: evil.com" http://localhost:20128/api/mcp/sse` grąžina 401 (vietinės sąsajos apsauga) - [ ] Pirmą kartą paleidus SQLite vykdymo aplinka nustatoma kaip `bundled` (komplekte esantis dvejetainis failas tinka platformai) - [ ] Pašalinus `node_modules/better-sqlite3`, SQLite vykdymo aplinka persijungia į atsarginį `runtime` variantą - [ ] Išmanusis MCP filtras suglaudina tikrą `playwright-mcp browser_snapshot` išvestį (sumažina ≥50 %) - [ ] Visi 10 `skills/omniroute*/SKILL.md` failų yra viešai pasiekiami naudojant neapdoroto GitHub turinio URL - [ ] Pradinės sąrankos vediklis naujoje sąrankoje rodo „Kaip tai veikia“ lygių apžvalgos veiksmą - [ ] Pagrindinio skydelio lygių aprėpties valdiklis rodo sukonfigūruotų ir aktyvių elementų skaičių --- ## 3.9.0 LTS atskyrimas (surepetuotas 3.8.58 versijoje) Po v3.8.59 kita versija yra 3.9.0, o jos viršūnė tampa dviem ilgalaikėmis šakomis: `stable/v3` (v3 LTS linija, npm `latest`) ir `develop` (v4, versija pakeista į 4.0.0, npm `nightly`). Šakų / kanalų modelis, perkėlimas pirmyn ir žymos aprašyti [RELEASE_STRATEGY.md](./RELEASE_STRATEGY.md); planas pateiktas [ROADMAP](../../ROADMAP.md) (3 etapas). Atskyrimas vykdomas vieną kartą; 3.8.58 versijoje jis nuo pradžios iki galo surepetuojamas šakotame repozitorijoje, o 3.8.59 užbaigiama naudojant [GO/NO-GO kontrolinį sąrašą](./LTS_GO_NO_GO.md). ### Bandomasis vykdymas (tik skaitymas, saugu bet kada) ```bash npm run release:dry-run-lts-cut # tikrasis atskyrimas: 3.9.0 iš HEAD, ankstesnė žyma v3.8.59 npm run release:dry-run-lts-cut -- --from <3.9.0-tip> # užfiksuoti šaltinio įsipareigojimą ``` `scripts/release/dry-run-lts-cut.mjs` nieko nevykdo: jis nuskaito git ir `gh` bei išspausdina visą seką — išankstines sąlygas (šaltinis išsprendžiamas, šaltinio repozitorijoje yra visa istorija — paviršinis klonas negali išsiųsti `stable/v3`, priimančioji pusė atmeta paketą ties pirmuoju prijungtu pirminiu įsipareigojimu, todėl pirmiausia atskirkite iš viso klono arba įvykdykite `git fetch --unshallow origin` — ankstesnė žyma egzistuoja, `package.json` nurodyta tikslinė versija, `release-freeze` problema atidaryta, nėra atidarytos `Release branch not green` problemos esamoje leidimo šakoje — neegzistuojanti šaka pateikia `?` nežinomą būseną, niekada žalią — sukonfigūruota Mergify `release` eilė (G11: `queue_rules`, `checks_timeout`, žyma `queue`), `release/*` taisyklių rinkinys vis dar blokuoja ištrynimą ir priverstinį išsiuntimą, o `stable/v3` ir `develop` dar neegzistuoja), abu šakų veiksmus, kurie neaktyvių darbo eigų paleidikliai ir `if:` sąlygos tampa teisingi (ir kurie lieka apriboti repozitorijos kintamuoju arba pririšti prie kanoninės repozitorijos), numatomas platinimo žymas (`latest` → 3.9.0, `next` ir `nightly` tuščios) ir atšaukimą. Baigties kodas `0` = `RESULT: READY`, `1` = neįvykdyta blokuojanti išankstinė sąlyga (`✗`), `2` = naudojimo klaida. `--advisory ` patikrą pakeičia į įspėjimą (`!`) jos neslėpdamas. Tikrojo atskyrimo bandomąjį vykdymą atlikite, kol 3.9.0 leidimo įšaldymas vis dar galioja — šakos sukuriamos po žymos ir prieš 12c etapui panaikinant įšaldymą. ### 3.8.58 repeticija (tik šakotoje repozitorijoje) ```bash # 1. Bandomasis vykdymas dabartinėje viršūnėje su repeticijos parametrais npm run release:dry-run-lts-cut -- --target-version 3.8.58 --previous-tag v3.8.57 \ --advisory freeze,base-green # 2. Vykdyti naudojant ŠAKOTOS REPOZITORIJOS nuotolinę saugyklą (`origin` arba bet kokia nuotolinė saugykla, kurios URL yra kanoninė # repozitorija, atmetama; prieš kiekvieną veiksmą terminale prašoma patvirtinimo) 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. Išbandyti neaktyvias darbo eigas šakotoje repozitorijoje (`workflow_dispatch` ten, kur bandomasis vykdymas # praneša apie pririšimą prie kanoninės repozitorijos), tada atšaukti pakeitimus 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` versijos pakeitimo įsipareigojimas kuriamas naudojant git vidinius mechanizmus (darbinis medis neliečiamas) ir pakeičia tuos pačius penkis failus kaip ciklo atidarymo įsipareigojimas: `package.json`, `open-sse/package.json`, `electron/package.json`, `package-lock.json` ir `docs/openapi.yaml`. `[4.0.0]` CHANGELOG skiltis ir jos i18n atitikmenys vėliau atidaromi šakoje `develop`, prieš jos pirmąją PR. Scenarijus niekada nekeičia npm platinimo žymų — jas repetuokite naudodami bandomąjį paketą. ### PR peržiūros artefaktas (sukurkite vieną kartą, platinkite tuos pačius baitus) `.github/workflows/preview-artifact.yml` sukuria vieną produkcinį tar archyvą iš PR viršūnės ir patikrina būtent tą rinkinį (#8084 dalis (a)). Tik tos pačios repozitorijos PR; niekas nepublikuojama. ```bash gh workflow run preview-artifact.yml -f pr_number= # arba pridėkite žymą `preview-artifact` 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 # peržiūros diegimas ``` Vykdymo metu atliekama `npm ci`, `npm run build:release`, `npm run check:pack-artifact`, supakuojamas tar archyvas, vykdoma `npm run check:pack-boot` (netikros slaptosios reikšmės, laikinas duomenų katalogas), archyvas iš naujo supakuojamas ir vykdymas nutraukiamas, jei kontrolinė suma nėra identiška; tada įrašomas `artifact-identity.json` (viršūnės SHA, bazės SHA, užrakto failo maiša, platforma, architektūra, node ABI, pakavimo įrankis, kūrimo politika — `scripts/release/artifact-identity.mjs`), o tar archyvas patvirtinamas atskiroje užduotyje. Peržiūros platinimas reiškia to tar archyvo diegimą: niekada nekurkite jo iš naujo iš šaltinio. ### Atskyrimas (3.9.0, po GO) 1. GO užregistruotas [LTS_GO_NO_GO.md](./LTS_GO_NO_GO.md). 2. `npm run release:dry-run-lts-cut -- --from v3.9.0` išspausdina `RESULT: READY`. 3. Rankiniu būdu sukurkite šakas `origin`, naudodami bandomojo vykdymo išspausdintas komandas — scenarijus atsisako siųsti į `origin`. Norėdami pakartotinai panaudoti peržiūrėtą develop įsipareigojimą, pirmiausia paleiskite `--execute` repeticiją 3.9.0 viršūnėje savo šakotoje repozitorijoje; ji išspausdins abi SHA, o tuos pačius įsipareigojimus bus galima išsiųsti: ```bash git push origin :refs/heads/stable/v3 :refs/heads/develop ``` 4. Apsaugokite `stable/v3` ir `develop` (taisyklių rinkiniai + sujungimo eilė) prieš priimant pirmąjį PR. 5. Neaktyvios darbo eigos įjungiamos atsiradus šakoms: `forward-port.yml` (siuntimas į `stable/v3`), `validate-stable-pr.yml` (PR į `stable/v3`) ir `nightly-v4-build.yml` (kuriama `develop`). Prieš paleidimą nustatykite saugyklos slaptąjį raktą `secrets.FORWARD_PORT_TOKEN` (kad CI būtų vykdomas perkėlimo pirmyn PR); naktinis publikavimas liks išjungtas, kol savininkas nustatys saugyklos kintamąjį `vars.NIGHTLY_PUBLISH` į `true`, o npm patikimas publikavimas priims `nightly-v4-build.yml`. Kanalas nustatomas naudojant `scripts/release/dist-tag.mjs` – tą patį nustatymo mechanizmą naudoja `npm-publish.yml`. 6. Patikrinkite kanalus: `npm view omniroute dist-tags --json` turi rodyti `latest` = 3.9.0, o `next` / `nightly` neturi būti, kol nepublikuota v4. 7. Jei reikia atšaukti pakeitimus: `git push origin --delete refs/heads/stable/v3 refs/heads/develop` ir `npm dist-tag add omniroute@3.8.59 latest`. --- ## Grąžinimas į ankstesnę versiją Jei leidime yra kritinė problema: 1. `gh release edit vX.Y.Z --prerelease` (pažymi kaip ne naujausią) 2. `git tag -d vX.Y.Z && git push --delete origin vX.Y.Z` (tik jei naudotojai dar nepradėjo jo naudoti) 3. Arba: skubus pataisymas šakoje `release/vX.Y.0` → pataisos leidimas `vX.Y.(Z+1)` 4. Nedelsdami praneškite „GitHub Discussions“ ir „Discord“ ## Griežtos taisyklės - Niekada neįkelkite pakeitimų tiesiogiai į `main` - Niekada nenaudokite `git push --force` šakai `main` ar `release/*` šakoms - Niekada nepraleiskite „Husky“ kablių (`--no-verify`) - Niekada neįtraukite paslapčių, prisijungimo duomenų ar `.env` failų - Testų aprėptis turi išlikti ≥60/60/60/60 (teiginiai / eilutės / funkcijos / šakos) - Keisdami produkcinį kodą kataloguose `src/`, `open-sse/`, `electron/` arba `bin/`, visada įtraukite arba atnaujinkite testus ## Automatinė sinchronizavimo patikra Prieš atidarydami PR, vietoje paleiskite dokumentacijos sinchronizavimo apsaugą: ```bash npm run check:docs-sync ``` CI taip pat vykdo šią patikrą faile `.github/workflows/ci.yml` (lint užduotyje).