Skip to content

Latest commit

 

History

History
522 lines (405 loc) · 36.6 KB

RELEASE_CHECKLIST.md

File metadata and controls

522 lines (405 loc) · 36.6 KB

Release Checklist (Hrvatski)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Posljednje ažuriranje: 2026-08-28 — v3.8.51 Pojednostavljen tijek izdanja koji koristi vještine alata Claude Code za automatizaciju.

Održavajte red čekanja/granu zelenima između izdanja: pogledajte RELEASE_GREEN.md (obitelj /green-prs + npm run check:release-green + /babysit + noćno pokretanje). Povremeno pokretanje ovoga — a osobito prije ovog kontrolnog popisa — omogućuje da PR izdanja započne zelen.

Ukratko

# 1. Povećajte verziju i generirajte CHANGELOG (vještina)
/version-bump-cc patch    # ili minor/major

# 2. Lokalno pokrenite provjeru kvalitete
npm run check              # lint + testovi
npm run test:coverage      # potpuna provjera pokrivenosti (60/60/60/60)

# 3. Izgradnja i osnovna provjera
npm run build
npm run test:e2e           # neobavezno, ali preporučeno

# 4. Generirajte izdanje (vještina)
/generate-release-cc

# 5. Implementirajte (vještina)
/deploy-vps-both-cc        # ili akamai-cc / local-cc

# 6. Prikupite dokaze o izdanju (vještina)
/capture-release-evidences-cc

npm Trusted Publishing (zadano od v3.8.51) — pripremljeno na zahtjev, izravno kao pričuvna opcija

npm-publish.yml prema zadanim postavkama objavljuje putem npm Trusted Publishing (OIDC): posao stage-npm (koji se izvodi na GitHubovu hostiranom izvršitelju) razmjenjuje GitHubov id-token za kratkotrajnu npm vjerodajnicu za to pokretanje — bez dugotrajnog npm tokena u tajnama repozitorija, bez upita za 2FA, uz priložen dokaz o podrijetlu. To je zaobilazni mehanizam koji npm sada odobrava jer se tokeni koji preskaču 2FA povlače iz upotrebe; njime se vraća potpuno automatski tijek koji je projekt imao do v3.8.48, uz zadržavanje jamstva WS1.3 (procurjeli token ne može samostalno objavljivati — token ne postoji).

Jednokratno postavljanje (vlasnik): npmjs.com → paket omniroute → Settings → Trusted Publisher → GitHub: vlasnik diegosouzapw, repozitorij OmniRoute, tijek rada npm-publish.yml (okruženje: nijedno). Dok to ne postoji, automatski korak ne uspijeva uz ENEEDAUTH: ponovno ga pokrenite s publish_mode=staged (u nastavku) ili direct.

Pripremljeno objavljivanje (na zahtjev — publish_mode=staged)

Tijek rada npm-publish više ne objavljuje izravno: pokreće zapakiranu tarball arhivu (check:pack-boot), a zatim izvršava npm stage publish — točno ti bajtovi smještaju se u registar, ali ih nije moguće instalirati dok ih vlasnik ne odobri. Ljudska 2FA provjera premještena je NAKON dokaza, a ne prije njega.

Tijek za vlasnika nakon što tijek rada postane zelen:

  1. npm stage list omniroute — pronađite ID pripremljenog izdanja (ispisuje se i u sažetku tijeka rada).
  2. Provjerite pripremljene bajtove (preporučeno): npm stage download <id>, zatim instalirajte preuzetu tarball arhivu u privremeni prefiks i pokrenite je (npm run check:pack-boot automatizira istu provjeru paketiranja→instaliranja→pokretanja u CI-ju).
  3. npm stage approve <id> — 2FA upit JEST objavljivanje. npm stage reject <id> odbacuje pripremljeno izdanje.
  4. Zaštitna provjera nakon objavljivanja: provjeravatelj nakon objavljivanja (WS1.4 iz plana za v3.8.49) instalira objavljenu verziju iz javnog registra u čistom spremniku i pokreće je.

Pričuvna opcija za hitne slučajeve: workflow_dispatch s publish_mode=direct vraća naslijeđeni neposredni npm publish (upotrijebite samo ako priprema ne funkcionira ispravno; zabilježite razlog).

Jednokratno sigurnosno ojačavanje (vlasnik, npmjs.com): konfigurirajte Trusted Publisher za omniroute u načinu rada samo s pripremom kako procurjeli dugotrajni token ne bi mogao izvršiti npm publish izravno niotkuda — CI može samo pripremiti izdanje; objaviti ga može samo vlasnik putem 2FA.

Postupak za neispravne artefakte (nepromijenjen): npm deprecate omniroute@<bad> "<reason> — use <fixed>" kao zadana reakcija (traje nekoliko minuta, povratno je); npm unpublish samo unutar razdoblja od 72 sata i ako nema ovisnih paketa te nikada kao prvi potez. Docker: nikada nemojte ponovno zapisivati oznaku verzije — vraćanje je preusmjeravanje oznake latest na posljednji ispravan sažetak.

Docker Hub latest (obavezno pri svakom stabilnom SemVer objavljivanju): tijek rada docker-publish mora označiti i X.Y.Z i, kada should-promote-latest.sh potvrdi da je to najviši stabilni SemVer, :latest s istim sažetkom. Nakon posla: sažetak oznake latest na Hubu mora biti jednak sažetku novog SemVer izdanja, a last_updated mora biti ažuriran. Nemojte ostaviti :latest na starijoj izgradnji dok bilješke o izdanju govore o ispravcima koji postoje samo u gitu. Compose primjeri za brzi početak koriste :latest; GitOps bi trebao nastaviti prikvačivati X.Y.Z. Pogledajte Kanali Docker izdanja i #10317.

Ubrzana staza za hitne ispravke (oznaka hotfix)

PR s oznakom hotfix preskače opsežnu CI matricu (E2E s 9 segmenata, prag pokrivenosti, quality-gate, quality-extended) i zadržava brze provjere s jakim signalom: izgradnju, segmente jediničnih testova, integracijske testove, vitest, lint/provjeru tipova, docs-sync, check:pack-artifact i provjeru pokretanja iz tarballa (check:pack-boot). Cilj: zelen status za ≤15 min umjesto ~33 min.

Pravila ulaska — sva četiri uvjeta su obvezna (po uzoru na hitne staze projekata Chromium/VS Code/Node):

  1. Ozbiljnost: produkcija ne radi — objavljeni artefakt ruši se pri pokretanju / sigurnosna ispravka / pogođen je svaki korisnik izdanja. „Važno” ne znači „ne radi”.
  2. Ovlaštenje: samo vlasnik repozitorija primjenjuje oznaku hotfix. Oznaka JEST odobrenje — nikad je nemojte samostalno primijeniti na PR kampanje.
  3. Dokazi: tijelo PR-a sadrži poveznicu na prethodno potpuno zeleno opsežno izvođenje (skup testova koji bi preskočeni poslovi ponovno provjerili) te test same ispravke koji prvo ne prolazi, a zatim prolazi.
  4. Opseg: isključivo cherry-pick — minimalna ispravka, bez refaktoriranja i usputnih promjena.

Preskočena površina pokrivenosti/pragova ponovno se provjerava pri sljedećem potpunom izvođenju na grani izdanja (kontinuirano zeleno izdanje) — staza preskače ČEKANJE, nikad provjeru valjanosti. Promjene samo u testovima (sve datoteke pod tests/, nijedna pod tests/e2e/) automatski preskaču E2E matricu, bez ikakve oznake.

Detaljan kontrolni popis

Prije izdanja

  • Svi PR-ovi namijenjeni ovom izdanju spojeni su u release/vX.Y.0
  • Sve otvorene stavke u Linearu/problemi za ovu verziju zatvoreni su ili pomaknuti u sljedeću ključnu etapu
  • CI je uspješan na grani release/vX.Y.0
  • U kodu nema oznaka TODO(release): grep -r "TODO(release)" src/ open-sse/
  • Osnovna Docker slika ažurirana je (trenutačno node:24.15.0-trixie-slim)

Verzija i zapis promjena

  • Pokrenite /version-bump-cc <patch|minor|major> (vještina Claude Codea)
    • Povećava verziju u package.json, electron/package.json
    • Ponovno generira CHANGELOG.md iz git commitova od posljednje oznake
    • Ažurira značke u README.md
  • Ručno pregledajte CHANGELOG.md i po potrebi uredite poruke commitova
  • Provjerite je li najnoviji semver odjeljak u CHANGELOG.md jednak verziji u package.json
  • Zadržite ## [Unreleased] kao prvi odjeljak zapisa promjena za predstojeći rad
  • Ažurirajte docs/openapi.yaml → info.version mora biti jednak verziji u package.json

Kvaliteta koda

  • npm run lint — 0 pogrešaka (upozorenja su postojala i prije)
  • npm run typecheck:core — bez pogrešaka
  • npm run typecheck:noimplicit:core — bez pogrešaka (strogo)
  • npm run check:cycles:ratchet — unutar zamrznute gornje granice metrics.cycles (samostalni check:cycles završava kodom 1 pri bilo kojem ciklusu, #15281)
  • npm run check:any-budget:t11 — unutar dopuštenog proračuna
  • npm run check:route-validation:t06 — bez pogrešaka
  • npm run check:node-runtime — zadovoljena je najniža podržana verzija izvođenja (>=22.22.2 <23, >=24.0.0 <27, prema SUPPORTED_NODE_RANGE u src/shared/utils/nodeRuntimeSupport.ts; usklađeno s engines u package.json)

Testiranje

  • npm run test:unit — prolazi
  • npm run test:vitest — prolazi (MCP poslužitelj, autoCombo, predmemorija)
  • npm run test:coverage — zadovoljen prag 60/60/60/60 (naredbe/retci/funkcije/grane)
  • npm run test:integration — prolazi (ako promjene utječu na bazu podataka / rukovatelje)
  • npm run test:combo:matrix — prolazi (matrica kombiniranih strategija: deterministički dokazuje odluke odabira za svih 19 javnih strategija usmjeravanja; pokrenite kada mijenjate kombinirano usmjeravanje, razrješavanje strategija ili pričuvnu logiku)
  • RUN_COMBO_LIVE=1 npm run test:combo:live — neobavezno/ručno (uvjetovani probni test prema stvarnim vanjskim sustavima; dohvaća snimku baze podataka samo za čitanje s VPS-a root@192.168.0.15; poziva stvarne pružatelje usluga, troši kredite; nikada se ne izvodi u CI-ju; uredno se preskače bez uvjeta)
  • npm run test:combo:live:vps — neobavezno/ručno (VPS probni test uživo 3. faze: 7 HTTP scenarija prema aktivnom poslužitelju .15 putem čistog Node ESM-a; zahtijeva ssh root@192.168.0.15; stvara/briše samo kombinacije __live_test__*; poziva stvarne pružatelje usluga; nikada se ne izvodi u CI-ju)
  • npm run test:e2e — prolazi (promjene korisničkog sučelja)
  • npm run test:protocols:e2e — prolazi (MCP/A2A promjene)
  • npm run test:ecosystem — prolazi

Kuke (provjerava Husky)

Husky kuke nalaze se u .husky/ i automatski se pokreću tijekom git operacija.

  • pre-commit: npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11
  • pre-push: brze determinističke provjere — npm run check:any-budget:t11 && npm run check:tracked-artifacts (aktivirano 2026-06-13). Namjerno isključuje test:unit (sporo; pokriveno CI zadatkom test-unit).
    • Ručno pokrenite npm run test:unit prije slanja grana izdanja.

Ako kuka ne uspije: ispravite temeljni problem, nemojte je zaobići opcijom --no-verify.

Konvencionalni commitovi

Svi commitovi namijenjeni izdanju moraju slijediti format type(scope): subject.

Valjane vrste: feat, fix, refactor, docs, test, chore, perf, style, ci

Valjani opsezi: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz

Prijelomne promjene: dodajte podnožje BREAKING CHANGE: ili ! nakon opsega (npr. feat(api)!: drop /v0).

Dokumentacija

  • npm run check:docs-sync prolazi (automatski ga pokreće pre-commit)
  • npm run check:docs-all prolazi (objedinjena provjera: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links)
  • npm run check:env-doc-sync završava kodom 0 — ugovor okruženja između koda ↔ .env.example ↔ docs/reference/ENVIRONMENT.md ostaje očuvan
  • npm run check:doc-links završava kodom 0 — nakon restrukturiranja nema neispravnih internih markdown referenci
  • docs/architecture/ARCHITECTURE.md pregledan je radi odstupanja u pohrani/izvođenju
  • docs/guides/TROUBLESHOOTING.md pregledan je radi odstupanja varijabli okruženja i operativnih postupaka
  • Ako je .env.example promijenjen: ažuriran je docs/reference/ENVIRONMENT.md
  • Ako nova značajka ima korisničko sučelje: spomenuta je u docs/guides/USER_GUIDE.md
  • Ako nova značajka ima API: ažurirani su docs/reference/API_REFERENCE.md + docs/openapi.yaml
  • Ako je nova značajka modul: postoji namjenski docs/<MODULE>.md
  • Ako je riječ o prijelomnoj promjeni: docs/guides/TROUBLESHOOTING.md sadrži napomenu o migraciji

i18n

  • npm run i18n:check završava kodom 0 — stanje prijevoda (.i18n-state.json) sinkronizirano je s izvornim dokumentima (nema odstupanja izvora u strogom načinu rada; upozorenje u načinu upozoravanja prihvatljivo je za posljednje dorade dokumentacije, ali prije označavanja izdanja rezultat bi trebao biti 0)
  • npm run i18n:check-ui-coverage završava kodom 0 — svaki lokalitet korisničkog sučelja doseže ili premašuje prag pokrivenosti od 80%
  • npm run i18n:sync-ui:dry prijavljuje 0 ključeva koji nedostaju u svih 66 ciljnih lokaliteta (svaki lokalitet osim izvornog en)
  • Ako su se promijenili izvorni dokumenti na engleskom, prije označavanja izdanja pokrenite npm run i18n:run (zahtijeva OMNIROUTE_TRANSLATION_API_KEY u .env)
  • Doprinosi prijevodima mogu se odgoditi do sljedećeg izdanja ako su manji (zabilježite u CHANGELOG-u)

Migracije baze podataka

  • Ako src/lib/db/migrations/ sadrži nove datoteke:
    • Svaka je migracija idempotentna (CREATE TABLE IF NOT EXISTS, itd.)
    • Migracije su obuhvaćene transakcijama
    • Ispravno su numerirane (bez praznina u slijedu)
  • Testirajte na svježoj instalaciji: izbrišite ~/.omniroute/omniroute.db i pokrenite npm run dev
  • Testirajte na postojećoj instalaciji: izradite sigurnosnu kopiju baze podataka, pokrenite migraciju i provjerite shemu
  • WAL datoteke (-wal, -shm) ispravno se obrađuju ako migracija ponovno zapisuje tablice

Katalog pružatelja (provjeren Zodom)

  • Zod shema u src/shared/constants/providers.ts valjana je pri učitavanju
    • Svi pružatelji imaju obavezna polja (id, label, kind itd.)
    • freeNote je naveden za nove besplatne pružatelje
    • OAuth pružatelji imaju oauthConfig registriran u src/lib/oauth/constants/oauth.ts
  • Ako je dodan novi pružatelj: odgovarajući izvršitelj nalazi se u open-sse/executors/
  • Ako format nije OpenAI: prevoditelj se nalazi u open-sse/translator/
  • Modeli su registrirani u open-sse/config/providerRegistry.ts
  • Jedinični testovi u tests/unit/ pokrivaju klasifikaciju i usmjeravanje pružatelja

Radna površina (Electron)

Ako je electron/ promijenjen:

  • npm run electron:smoke:packaged prolazi
  • Međuverzije su testirane za barem jedan od :win, :mac, :linux
  • Certifikati za potpisivanje koda nisu istekli (ako se potpisuje)
  • Verzija u electron/package.json odgovara verziji u korijenskom package.json
  • Pokazivač kanala za automatsko ažuriranje ažuriran je ako se izdaje na stable

Raspored međuverzije

Repozitorij koristi tri različita izlazna direktorija — nikada ih nemojte pomiješati:

Direktorij Svrha Prati se?
src/ Izvorni kod aplikacije (TypeScript / TSX) Da
.build/ Međurezultati izgradnje — izlaz naredbe next build (distDir) Ne (ignorira ga git)
dist/ npm paket spreman za distribuciju — sastavlja ga assembleStandalone Ne (ignorira ga git)

Napomena za operatera: direktorij slike na udaljenom VPS-u ostaje /usr/lib/node_modules/omniroute/app/. Premješten je samo izlaz izgradnje unutar repozitorija (app/ → dist/). Vještine za implementaciju rsyncom prenose sadržaj direktorija dist/ u udaljeni direktorij app/ — promjene putanja na VPS-u nisu potrebne.

Tijek jedne izgradnje:

npm run build:release
  └─ rm -rf .build dist          (čišćenje)
  └─ next build → .build/next/   (međurezultati)
  └─ assembleStandalone          (kopira standalone + static + public + natives → dist/)
  └─ zapisuje dist/BUILD_SHA     (HEAD kontrolna oznaka)

NEMOJTE pokretati npm run build, a zatim zasebno npm run build:cli za implementaciju — upotrijebite npm run build:release, koji jednom naredbom izvodi čistu ponovnu izgradnju i stvara kontrolnu oznaku.

Provjera artefakta

  • npm run build:release uspijeva i dist/BUILD_SHA == git rev-parse --short HEAD
  • npm run check:pack-artifact prolazi bez problema — nema app.__qa_backup, scripts/scratch, package-lock.json ni drugih lokalnih ostataka
  • dist/server.js postoji nakon izgradnje
  • Neobavezna lokalna brza provjera zapakiranog izvršnog okruženja: npm run dev:candidate -- validate nakon npm run dev:candidate -- build pokreće zapakirani tarball u izoliranom DATA_DIR i provjerava /api/health + /v1/models (pogledajte Preporučeni postupak za doprinos)

Označavanje i izdavanje

  • Pokrenite /generate-release-cc (vještina za Claude Code):
    • Stvara oznaku vX.Y.Z
    • Šalje oznaku i granu
    • Otvara GitHub izdanje s tekstom dnevnika promjena
    • Prilaže instalacijske programe za Electron (ako su izrađeni)
  • Ili ručno:
    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

Implementacija

Vještine za implementaciju koriste lagani tijek rsynca — bez npm pack i bez npm i -g:

  • Upotrijebite vještinu za implementaciju koja odgovara odredištu:
    • /deploy-vps-local-cc — lokalni VPS (192.168.0.15)
    • /deploy-vps-akamai-cc — Akamai VPS (69.164.221.35)
    • /deploy-vps-both-cc — oba
  • Prije implementacije potvrdite da je dist/BUILD_SHA == git rev-parse --short HEAD
  • Izgradnja se mora pokrenuti ondje gdje je node_modules stvaran (glavna radna kopija ili radno stablo u kojem je pokrenut npm ci — NE radno stablo sa simboličkom poveznicom)
  • Provedite brzu provjeru implementirane instance:
    • Otvorite /dashboard/health → provjerite odgovara li niz verzije izdanju
    • Pokrenite zahtjev /v1/chat/completions prema poznatom pružatelju
    • Provjerite vraća li /api/monitoring/health prekidače strujnog kruga sa stanjem CLOSED
    • Potvrdite da MCP transporti odgovaraju (/mcp HTTP, /mcp-sse SSE)

Nakon izdanja

  • Pokrenite /capture-release-evidences-cc (vještina za Claude Code)
    • Snima WebP snimke zaslona/videozapise novih značajki
    • Prilaže ih bilješkama o izdanju / objavi na blogu
  • Ažurirajte GitHub Discussions / Discord objavom o izdanju
  • Otvorite ključnu etapu za sljedeću verziju
  • Ako je kritično: prikvačite raspravu ili objavite u news.json radi prikaza natpisa unutar aplikacije

Kontrolna točka za javno pokretanje Radara

Objava Radara namjerno je predana s active: false. Aktivacija je zasebna promjena nakon što se pruže dokazi za svaku stavku u nastavku:

  • Svi naslagani PR-ovi za Radar spojeni su i CI vrha izdanja prolazi
  • Implementirajte i brzo provjerite OSS rute Radara dok je RADAR_ENABLED i dalje zadano isključen
  • Brzo provjerite GET /planos, /termos, /privacidade i /reembolso na imenovanom hostu Radara
  • Zabilježite identitet/kontakt/adresu operatera i pravni pregled koji je odobrio vlasnik u privatnoj usluzi
  • Testirajte Stripe Checkout i potpisani webhook samo u testnom načinu rada
  • Testirajte jednu šifriranu isporuku transakcijske e-pošte s odobrenim pošiljateljem/domenom
  • Dokažite vraćanje sigurnosne kopije i jedno nadzirano pokretanje istraživanja s ograničenim proračunom
  • Odobrite pravila pregleda BRL/PIX prije prihvaćanja dokaza o donaciji
  • Omogućite javni Checkout tek nakon prethodnih kontrolnih točaka, a zatim aktivirajte novi ID u news.json
  • Provjerite koristi li natpis na početnoj stranici lokalizirani tekst i pojavljuje li se novi ID nakon odbacivanja starijeg ID-a

Brza provjera ugrađenih usluga (v3.8.4+)

Prije objave bilo kojeg izdanja koje uključuje promjene ugrađenih usluga provjerite:

Pokretanje sa svježom bazom podataka (otkriva kolizije migracija — dodano nakon hitnog popravka za v3.8.4)

  • DATA_DIR=$(mktemp -d) npm start & — pričekajte 10 s da se sustav pokrene
  • curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool' vraća "9router" (NE 404, NE 500). Potvrđuje da je migracija 071_services.sql primijenjena i redak inicijalno dodan.
  • sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at" vraća 3 retka.
  • sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted" vraća 2 retka (potvrđuje da je 070_webhooks_kind_metadata.sql primijenjen).
  • node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts prolazi — štiti od budućih kolizija.

9Router

  • POST /api/services/9router/install vraća 200 s installedVersion za manje od 2 min
  • POST /api/services/9router/start vraća 200 i state: "running" za manje od 30 s
  • GET /api/services/9router/status prijavljuje health: "healthy"
  • POST /v1/chat/completions s "model": "9router/auto/..." vraća 200 (usmjeravanje od početka do kraja kroz 9Router)
  • GET /dashboard/providers/services/9router/embed/dashboard prikazuje izvorno korisničko sučelje 9Routera unutar proxyja (bez izravnog iframea 127.0.0.1:port)
  • POST /api/services/9router/rotate-key vraća { keyRotated: true }, a usluga se ponovno pokreće bez pogrešaka
  • POST /api/services/9router/stop vraća 200 i state: "stopped"
  • GET /api/services/9router/logs?tail=50 vraća SSE tok s događajem snapshot koji sadržava nedavne retke
  • Instalacija u okruženju bez naredbe npm u varijabli PATH vraća 500 s razumljivom porukom o pogrešci (bez praćenja stoga)

CLIProxyAPI

  • POST /api/services/cliproxy/install vraća 200 za manje od 2 min
  • POST /api/services/cliproxy/start vraća 200 i state: "running" za manje od 30 s
  • GET /api/services/cliproxy/status prijavljuje health: "healthy"
  • POST /api/services/cliproxy/stop vraća 200 i state: "stopped"
  • GET /api/services/cliproxy/logs?tail=50 vraća SSE tok

Sigurnosna regresija

  • curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start vraća 403 LOCAL_ONLY
  • curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start vraća 403 LOCAL_ONLY
  • Odgovori s pogreškama iz /api/services/* ne sadržavaju err.stack ni apsolutne putanje datoteka

Provjere za v3.8.0+

Prije objave bilo kojeg izdanja v3.8.x provjerite i sljedeće stavke:

  • omniroute --tray pokreće se na sustavu macOS (systray2 je instaliran u ~/.omniroute/runtime/)
  • omniroute --tray pokreće se na sustavu Linux (zahtijeva DISPLAY; razumljiva pogreška ako nije postavljen)
  • omniroute --tray pokreće se na sustavu Windows (PowerShell NotifyIcon, bez dodatnih binarnih datoteka)
  • omniroute config tray enable stvara unos za automatsko pokretanje; onemogućavanje ga uklanja
  • npm install -g omniroute@<this-version> izvršava postinstall bez fatalnog izlaza
  • Putanja ažuriranja zadržava neobavezne ovisnosti: omniroute update --apply i automatski program za ažuriranje pokreću npm install -g … --include=optional kako bi optionalDependencies (better-sqlite3, keytar, tls-client i llmlingua SLM skup: @atjsh/llmlingua-2@2.0.5, js-tiktoken) ostali prisutni nakon ažuriranja. Ultra SLM razina modelPath također zahtijeva tinybert model, koji se pri prvoj upotrebi automatski preuzima u ${DATA_DIR}/models/llmlingua. Postinstall (scripts/build/colocateOptionals.mjs) zatim smješta neobavezno zatvaranje SLM-a u dist/node_modules kako bi radni proces razriješio JEDNU instancu @huggingface/transformers ^4.2.0 — samostalno praćenje uključuje samo transformers, a ne dinamički uvezene neobavezne ovisnosti, pa bi bez toga radni proces učitao llmlingua-2 uz transformers iz korijena i SLM razina bi neprimjetno prešla u način otvorenog neuspjeha.
  • omniroute status radi bez .env (putanja CLI tokena, samo povratna petlja)
  • curl http://localhost:20128/api/shutdown vraća 401 (ruta koja je uvijek zaštićena)
  • curl -H "host: evil.com" http://localhost:20128/api/mcp/sse vraća 401 (zaštita povratne petlje)
  • SQLite izvršno okruženje pri prvom pokretanju razrješava se na bundled (ugrađena binarna datoteka valjana je za platformu)
  • SQLite izvršno okruženje vraća se na runtime kada se izbriše node_modules/better-sqlite3
  • Pametni MCP filtar sažima stvarni izlaz playwright-mcp browser_snapshot (smanjenje ≥50%)
  • Svih 10 datoteka skills/omniroute*/SKILL.md javno su dostupne putem neobrađenog GitHub URL-a
  • Čarobnjak za uvođenje prikazuje korak obilaska razina „Kako radi” pri novom postavljanju
  • Widget pokrivenosti razina na početnoj nadzornoj ploči prikazuje broj konfiguriranih/aktivnih stavki

Izdvajanje izdanja 3.9.0 LTS (uvježbano u 3.8.58)

Nakon v3.8.59 sljedeća je verzija 3.9.0, a njezin vrh postaje osnova za dvije dugovječne grane: stable/v3 (linija v3 LTS, npm latest) i develop (v4, podignuta na 4.0.0, npm nightly). Model grana/kanala, prijenos promjena unaprijed i oznake nalaze se u RELEASE_STRATEGY.md; plan se nalazi u dokumentu ROADMAP (3. faza). Izdvajanje se izvodi jednom; u verziji 3.8.58 uvježbava se od početka do kraja na račvanju, a 3.8.59 završava uz kontrolni popis GO/NO-GO.

Probno izvođenje (samo za čitanje, sigurno u svakom trenutku)

npm run release:dry-run-lts-cut                       # stvarno izdvajanje: 3.9.0 iz HEAD, prethodna oznaka v3.8.59
npm run release:dry-run-lts-cut -- --from <3.9.0-tip> # prikvači izvorni commit

scripts/release/dry-run-lts-cut.mjs ne izvršava ništa: čita git i gh te ispisuje cijeli slijed — preduvjete (izvor se može razriješiti, izvorni repozitorij ima potpunu povijest — plitki klon ne može poslati stable/v3, odredišna strana odbija paket kod prvog umetnutog nadređenog commita, stoga izdvajanje prvo izvedite iz potpunog klona ili pokrenite git fetch --unshallow origin — prethodna oznaka postoji, package.json ima ciljnu verziju, otvoren je problem s oznakom release-freeze, nema otvorenog problema Release branch not green na postojećoj grani izdanja — grana koja ne postoji prijavljuje ? kao nepoznato stanje, nikad zeleno — konfiguriran je Mergifyjev red čekanja release (G11: queue_rules, checks_timeout, oznaka queue), skup pravila release/* i dalje blokira brisanje i prisilno slanje, a stable/v3 i develop još ne postoje), dva koraka s granama, koji se okidači neaktivnih tijekova rada i uvjeti if: aktiviraju (a koji ostaju blokirani varijablom repozitorija ili prikvačeni za kanonski repozitorij), očekivane dist-oznake (latest → 3.9.0, next i nightly prazne) te vraćanje. Izlazni kod 0 = RESULT: READY, 1 = neuspješan blokirajući preduvjet (✗), 2 = pogreška pri uporabi. --advisory <id,...> spušta provjeru na upozorenje (!) bez njezina skrivanja.

Pokrenite probno izvođenje stvarnog izdvajanja dok je zamrzavanje izdanja 3.9.0 još aktivno — grane se stvaraju nakon oznake i prije nego što faza 12c ukine zamrzavanje.

Proba verzije 3.8.58 (samo na račvanju)

# 1. Probno izvođenje na trenutačnom vrhu s parametrima za probu
npm run release:dry-run-lts-cut -- --target-version 3.8.58 --previous-tag v3.8.57 \
  --advisory freeze,base-green

# 2. Izvedite nad udaljenim RAČVANJEM (origin ili bilo koji udaljeni repozitorij čiji URL
#    pripada kanonskom repozitoriju bit će odbijen; za svaki se korak traži potvrda u terminalu)
git remote add rehearsal https://github.com/<you>/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. Pokrenite neaktivne tijekove rada u račvanju (workflow_dispatch tamo gdje probno izvođenje
#    prijavljuje prikvačenost za kanonski repozitorij), a zatim vratite promjene
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

Commit za podizanje verzije grane develop izrađuje se pomoću niskorazinskih git operacija (radno se stablo ne dira) i ažurira istih pet datoteka kao commit za otvaranje ciklusa: package.json, open-sse/package.json, electron/package.json, package-lock.json i docs/openapi.yaml. Odjeljak [4.0.0] u dokumentu CHANGELOG i njegove i18n preslike potom se otvaraju na grani develop, prije njezina prvog PR-a. Skripta nikad ne mijenja npm dist-oznake — uvježbajte ih na pomoćnom paketu.

Artefakt za pretpregled PR-a (izgradite jednom, promovirajte iste bajtove)

.github/workflows/preview-artifact.yml izrađuje jednu produkcijsku tar-arhivu iz vrha PR-a i provjerava upravo tu međuverziju (dio (a) stavke #8084). Samo PR-ovi iz istog repozitorija; ništa se ne objavljuje.

gh workflow run preview-artifact.yml -f pr_number=<N>   # ili dodajte oznaku `preview-artifact`
gh run download <run-id> --name preview-artifact-pr<N>-<sha7> --dir preview
cd preview && sha256sum -c SHA256SUMS
gh attestation verify omniroute-*.tgz --repo diegosouzapw/OmniRoute
npm install -g ./omniroute-*.tgz                          # instalacija pretpregleda

Izvođenje pokreće npm ci, npm run build:release, npm run check:pack-artifact, pakira tar-arhivu, pokreće npm run check:pack-boot (lažne tajne, privremeni direktorij podataka), ponovno pakira i ne uspijeva ako sažetak nije identičan, a zatim zapisuje artifact-identity.json (SHA vrha, SHA baze, sažetak datoteke zaključavanja, platforma, arhitektura, node ABI, alat za pakiranje, pravilo izgradnje — scripts/release/artifact-identity.mjs) te potvrđuje tar-arhivu u zasebnom zadatku. Promoviranje pretpregleda znači instaliranje te tar-arhive: nikad je nemojte ponovno izgrađivati iz izvornog koda.

Izdvajanje (3.9.0, nakon odluke GO)

  1. Odluka GO zabilježena je u LTS_GO_NO_GO.md.

  2. npm run release:dry-run-lts-cut -- --from v3.9.0 ispisuje RESULT: READY.

  3. Ručno stvorite grane na origin pomoću naredbi koje ispiše probno izvođenje — skripta odbija slati na origin. Kako biste ponovno upotrijebili pregledani commit grane develop, najprije pokrenite probu s opcijom --execute na vrhu verzije 3.9.0 nad svojim račvanjem; ispisat će oba SHA-a, a isti se commitovi mogu poslati:

    git push origin <stable-sha>:refs/heads/stable/v3 <develop-sha>:refs/heads/develop
  4. Zaštitite stable/v3 i develop (skupovi pravila + red čekanja za spajanje) prije nego što stigne prvi PR.

  5. Neaktivni tijekovi rada uključuju se postojanjem grane: forward-port.yml (push na stable/v3), validate-stable-pr.yml (PR-ovi prema stable/v3) i nightly-v4-build.yml (izgrađuje develop). Prije puštanja u rad postavite tajnu repozitorija secrets.FORWARD_PORT_TOKEN (kako bi se CI pokretao na PR-ovima za prijenos promjena unaprijed); noćno objavljivanje ostaje isključeno dok vlasnik ne postavi varijablu repozitorija vars.NIGHTLY_PUBLISH na true i dok npm Trusted Publishing ne prihvati nightly-v4-build.yml. Određivanje kanala provodi scripts/release/dist-tag.mjs, isti razrješivač koji upotrebljava npm-publish.yml.

  6. Provjerite kanale: npm view omniroute dist-tags --json prikazuje latest = 3.9.0 i nema next / nightly sve dok se v4 ne objavi.

  7. Povratak na prethodno stanje, ako je potreban: git push origin --delete refs/heads/stable/v3 refs/heads/develop i npm dist-tag add omniroute@3.8.59 latest.


Vraćanje na prethodnu verziju

Ako izdanje ima kritičan problem:

  1. gh release edit vX.Y.Z --prerelease (označava ga kao izdanje koje nije najnovije)
  2. git tag -d vX.Y.Z && git push --delete origin vX.Y.Z (samo ako ga korisnici još nisu počeli upotrebljavati)
  3. Ili: hitni ispravak na release/vX.Y.0 → zakrpno izdanje vX.Y.(Z+1)
  4. Odmah obavijestite korisnike putem GitHub Discussionsa i Discorda

Stroga pravila

  • Nikada nemojte izravno izvršavati commit na main
  • Nikada nemojte upotrebljavati git push --force na granama main ili release/*
  • Nikada nemojte preskakati Husky kuke (--no-verify)
  • Nikada nemojte pohranjivati tajne, vjerodajnice ili .env datoteke u commit
  • Pokrivenost mora ostati ≥60/60/60/60 (naredbe/retci/funkcije/grane)
  • Pri izmjeni produkcijskog koda u src/, open-sse/, electron/ ili bin/ uvijek uključite ili ažurirajte testove

Automatizirana provjera sinkronizacije

Prije otvaranja PR-a lokalno pokrenite zaštitnu provjeru sinkronizacije dokumentacije:

npm run check:docs-sync

CI također pokreće ovu provjeru u .github/workflows/ci.yml (zadatak za lint).