# Release Checklist (Igbo) 🌐 **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) · 🇮🇹 [it](../../../it/docs/ops/RELEASE_CHECKLIST.md) · 🇯🇵 [ja](../../../ja/docs/ops/RELEASE_CHECKLIST.md) · 🇬🇪 [ka](../../../ka/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇭 [km](../../../km/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [kn](../../../kn/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇷 [ko](../../../ko/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇹 [lt](../../../lt/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇻 [lv](../../../lv/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ml](../../../ml/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [mr](../../../mr/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇾 [ms](../../../ms/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇹 [mt](../../../mt/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇲 [my](../../../my/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇵 [ne](../../../ne/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇱 [nl](../../../nl/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇴 [no](../../../no/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [or](../../../or/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [pa](../../../pa/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇭 [phi](../../../phi/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇱 [pl](../../../pl/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇹 [pt](../../../pt/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇴 [ro](../../../ro/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇺 [ru](../../../ru/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇰 [si](../../../si/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇰 [sk](../../../sk/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇮 [sl](../../../sl/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇸 [sr](../../../sr/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇪 [sv](../../../sv/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇪 [sw](../../../sw/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ta](../../../ta/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [te](../../../te/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇭 [th](../../../th/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇷 [tr](../../../tr/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇰 [ur](../../../ur/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇿 [uz](../../../uz/docs/ops/RELEASE_CHECKLIST.md) · 🇻🇳 [vi](../../../vi/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [yo](../../../yo/docs/ops/RELEASE_CHECKLIST.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/RELEASE_CHECKLIST.md) --- > **Emelitere ikpeazụ:** 2026-08-28 — v3.8.51 > Usoro mwepụta e mere ka ọ dị mfe nke na-eji nka Claude Code eme akpaaka. > > **Debe queue/branch ka ọ bụrụ green n’etiti mwepụta:** lee [RELEASE_GREEN.md](./RELEASE_GREEN.md) > (ezinụlọ `/green-prs` + `npm run check:release-green` + `/babysit` + nke abalị kwa ụbọchị). Ịme > nke a site n’oge ruo n’oge — ọkachasịkwa **tupu** ndepụta nyocha a — na-eme ka release PR malite dị green. ## TL;DR ```bash # 1. Bulie ụdị + mepụta CHANGELOG (nkà) /version-bump-cc patch # ma ọ bụ minor/major # 2. Gbaa ọnụ ụzọ nyocha ogo na mpaghara npm run check # lint + ule npm run test:coverage # ọnụ ụzọ mkpuchi zuru ezu (60/60/60/60) # 3. Wuo ma mee ule smoke npm run build npm run test:e2e # nhọrọ, mana a na-atụ aro ya # 4. Mepụta mwepụta (nkà) /generate-release-cc # 5. Bugharịa gaa mmepụta (nkà) /deploy-vps-both-cc # ma ọ bụ akamai-cc / local-cc # 6. Dekọọ ihe akaebe mwepụta (nkà) /capture-release-evidences-cc ``` ## Mbipụta npm A Tụkwasịrị Obi (ndabara kemgbe v3.8.51) — nke a na-edobe n'ọkwa mgbe a rịọrọ ya, nke ozugbo dịka ụzọ ndabere `npm-publish.yml` na-ebipụta site na **npm Trusted Publishing (OIDC)** na ndabara: ọrụ `stage-npm` (nke GitHub na-akwado) na-agbanwe id-token GitHub ka ọ bụrụ nzere npm nke na-adịru obere oge maka ọsọ ahụ — enweghị token npm na-adịte aka n'ime ihe nzuzo repository, enweghị arịrịọ 2FA, ma agbakwunyere provenance. Nke ahụ bụ ụzọ ịgafe ihe npm kwadoro ugbu a ka a na-akwụsị token ndị na-amafere 2FA; ọ na-eweghachi usoro akpaaka zuru ezu nke project ahụ nwere ruo v3.8.48 ma ka na-edobe nkwa WS1.3 (token agbapụtara enweghị ike ibipụta naanị ya — token adịghị). **Nhazi otu ugboro (onye nwe ya):** npmjs.com → package `omniroute` → Settings → _Trusted Publisher_ → GitHub: owner `diegosouzapw`, repo `OmniRoute`, workflow `npm-publish.yml` (environment: none). Ruo mgbe nke ahụ dị, nzọụkwụ akpaaka ahụ ga-ada na `ENEEDAUTH`: ziga ya ọzọ site na `publish_mode=staged` (n'okpuru) ma ọ bụ `direct`. ### Mbipụta e debere n'ọkwa (mgbe a rịọrọ ya — `publish_mode=staged`) Workflow npm-publish anaghịzi ebipụta ozugbo: ọ na-ebido tarball e kwakọrọ (`check:pack-boot`) ma mesịa gbaa `npm stage publish` — a na-edobe kpọmkwem bytes ahụ na registry, **enweghị ike ịwụnye ha** ruo mgbe onye nwe ya kwadoro. E bugharịla ọnụ ụzọ 2FA mmadụ gaa MGBE ihe akaebe gasịrị, ọ bụghị tupu ya. **Usoro onye nwe ya mgbe workflow ghọrọ green:** 1. `npm stage list omniroute` — chọta stage id (a na-ebipụtakwa ya na nchịkọta workflow). 2. Nyochaa bytes e debere n'ọkwa (a na-atụ aro ya): `npm stage download `, wee wụnye tarball ebudatara n'ime temp prefix ma malite ya (`npm run check:pack-boot` na-eme otu mkpebi pack→install→boot ahụ na-akpaghị aka na CI). 3. `npm stage approve ` — arịrịọ 2FA BỤ mbipụta ahụ. `npm stage reject ` na-atụfu ya. 4. Nchedo mgbe mbipụta gasịrị: onye nyocha mgbe mbipụta gasịrị (WS1.4 nke atụmatụ v3.8.49) na-etinye ụdị e bipụtara site na public registry n'ime container dị ọcha ma malite ya. **Ụzọ ndabere mberede:** `workflow_dispatch` nwere `publish_mode=direct` na-eweghachi `npm publish` ozugbo nke usoro ochie (jiri naanị ma ọ bụrụ na staging n'onwe ya anaghị arụ ọrụ nke ọma; detuo ihe kpatara ya). **Ime ka o sie ike otu ugboro (onye nwe ya, npmjs.com):** hazie Trusted Publisher maka `omniroute` na ọnọdụ stage-only ka token na-adịte aka agbapụtara ghara inwe ike ime `npm publish` ozugbo site n'ebe ọ bụla — CI nwere ike naanị idobe ya n'ọkwa; naanị 2FA onye nwe ya na-ewepụta ya. **Usoro maka artifact mebiri emebi (agbanwebeghị):** `npm deprecate omniroute@ " — use "` dịka mmeghachi omume ndabara (n'ime nkeji, enwere ike iweghachi ya); jiri `npm unpublish` naanị n'ime windo awa 72/enweghị-dependents, ọ bụghịkwa dịka nzọụkwụ mbụ. Docker: edegharịla version tag mgbe ọ bụla — rollback bụ ịtụgharị `latest` ka ọ rụtụ aka na digest ikpeazụ dị mma. **Docker Hub `latest` (achọrọ na mbipụta SemVer stable ọ bụla):** workflow `docker-publish` ga-etinyerịrị tag na **ma** `X.Y.Z` **ma**, mgbe `should-promote-latest.sh` kwetara na nke a bụ SemVer stable kachasị elu, `:latest` nwere **otu digest ahụ**. Mgbe ọrụ ahụ gasịrị: digest Hub `latest` ga-abụ otu ihe na digest SemVer ọhụrụ ahụ, `last_updated` agbanwekwala. Ahapụla `:latest` n'elu build ochie mgbe ndetu mwepụta na-ekwu maka ndozi ndị dị naanị na git. Compose quickstarts na-eji `:latest`; GitOps kwesịrị ịnọgide na-atụgide `X.Y.Z`. Lee [Ọwa mwepụta Docker](../guides/DOCKER_GUIDE.md#release-channels) na #10317. ## Ụzọ Ọsọ Hotfix (akara `hotfix`) PR e nyere akara `hotfix` na-awụfe nnukwu matriks CI (E2E nwere shard 9, coverage ratchet, quality-gate, quality-extended) ma debe ụzọ nyocha ndị dị ọsọ ma na-enye akara doro anya: build, unit shards, integration, vitest, lint/typecheck, docs-sync, `check:pack-artifact` na nnwale boot-smoke nke tarball (`check:pack-boot`). Ebumnuche: ka ihe niile bụrụ green n'ime ≤15min kama ~33min. **Iwu mbata — a chọrọ ha anọ niile (e mere ya dịka ụzọ mberede Chromium/VS Code/Node):** 1. **Ogo nsogbu**: production emebiela — artifact e bipụtara na-adaba mgbe ọ na-amalite / mmezi nchekwa / nsogbu ahụ metụtara onye ọrụ ọ bụla nke release ahụ. "Dị mkpa" abụghị "emebiela". 2. **Ikike**: naanị onye nwe repository na-etinye akara `hotfix`. Akara ahụ BỤ nkwado ahụ — emela ya n'onwe gị na PR campaign. 3. **Ihe akaebe**: ahụ PR na-ejikọta run heavy gara aga nke zuru oke ma bụrụ green (suite nke ọrụ ndị a wụfere gaara enyocha ọzọ) tinyere nnwale nke mmezi ahụ nke dara na mbụ ma gafee emesịa. 4. **Oke**: naanị cherry-pick — mmezi kacha nta, enweghị refactor, enweghị mgbanwe ndị ọzọ esonyere ya. A na-enyocha ọzọ akụkụ coverage/ratchet a wụfere na full run na-esote na branch release (release-green na-aga n'ihu) — ụzọ a na-awụfe naanị ICHERE, ọ naghị awụfe validation. Diff ndị bụ naanị nnwale (faịlụ niile dị n'okpuru `tests/`, ọ dịghị nke dị n'okpuru `tests/e2e/`) na-awụfe matriks E2E na-akpaghị aka, na-enweghị akara ọ bụla. ## Ndepụta Nlele Zuru Ezu ### Tupu Release - [ ] Ejikọtala PR niile ezubere maka release a na `release/vX.Y.0` - [ ] Emechiela item Linear/issue niile ka meghere maka version a ma ọ bụ bugharịa ha na milestone na-esote - [ ] CI bụ green na branch `release/vX.Y.0` - [ ] Enweghị akara `TODO(release)` na code: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker base image bụ nke kachasị ọhụrụ (ugbu a `node:24.15.0-trixie-slim`) ### Version & Changelog - [ ] Gbaa `/version-bump-cc ` (nkà Claude Code) - Na-ebuli version na `package.json`, `electron/package.json` - Na-emepụta `CHANGELOG.md` ọzọ site na commit git kemgbe tag ikpeazụ - Na-emelite badge README.md - [ ] Jiri aka nyochaa CHANGELOG.md ma hichaa ozi commit ma ọ bụrụ na ọ dị mkpa - [ ] Gbaa mbọ hụ na ngalaba semver kachasị ọhụrụ na `CHANGELOG.md` hà nhata version dị na `package.json` - [ ] Debe `## [Unreleased]` dịka ngalaba changelog mbụ maka ọrụ ndị na-abịa - [ ] Melite `docs/openapi.yaml` → `info.version` ga-aharịrị version dị na `package.json` ### Ogo Code - [ ] `npm run lint` — njehie 0 (ịdọ aka ná ntị ndị ahụ dịbu adị) - [ ] `npm run typecheck:core` — dị ọcha - [ ] `npm run typecheck:noimplicit:core` — dị ọcha (strict) - [ ] `npm run check:cycles` — enweghị dependency okirikiri - [ ] `npm run check:any-budget:t11` — nọ n'ime budget - [ ] `npm run check:route-validation:t06` — dị ọcha - [ ] `npm run check:node-runtime` — e mezuru runtime floor a na-akwado (`>=22.22.2 <23`, `>=24.0.0 <27`, dịka `SUPPORTED_NODE_RANGE` dị na `src/shared/utils/nodeRuntimeSupport.ts`; dakọtara na `engines` nke `package.json`) ### Nnwale - [ ] `npm run test:unit` — gafere - [ ] `npm run test:vitest` — gafere (server MCP, autoCombo, cache) - [ ] `npm run test:coverage` — e mezuru gate 60/60/60/60 (statements/lines/functions/branches) - [ ] `npm run test:integration` — gafere (ọ bụrụ na mgbanwe metụtara DB / handlers) - [ ] `npm run test:combo:matrix` — gafere (matriks atụmatụ combo: na-egosi n'ụzọ deterministic mkpebi nhọrọ nke atụmatụ routing ọha 19 niile; gbaa ya mgbe ị na-emetụ combo routing, strategy resolution, ma ọ bụ fallback logic) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **nhọrọ/jiri aka** (nnwale smoke real-upstream nke gate na-achịkwa; na-enweta snapshot DB read-only site na VPS `root@192.168.0.15`; na-akpọ provider n'ezie, na-eri credit; ọ dịghị mgbe ọ na-agba na CI; ọ na-awụfe nke ọma mgbe gate adịghị) - [ ] `npm run test:combo:live:vps` — **nhọrọ/jiri aka** (nnwale smoke VPS live nke Phase-3: ọnọdụ HTTP 7 megide server `.15` dị live site na Node ESM nkịtị; chọrọ `ssh root@192.168.0.15`; na-emepụta/na-ehichapụ naanị combo `__live_test__*`; na-akpọ provider n'ezie; ọ dịghị mgbe ọ na-agba na CI) - [ ] `npm run test:e2e` — gafere (mgbanwe UI) - [ ] `npm run test:protocols:e2e` — gafere (mgbanwe MCP/A2A) - [ ] `npm run test:ecosystem` — gafere ### Hook (Husky kwadoro) Hook Husky dị na `.husky/` ma na-agba na-akpaghị aka mgbe a na-eme ọrụ git. - **pre-commit:** `npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11` - **pre-push:** gate deterministic ndị dị ọsọ — `npm run check:any-budget:t11 && npm run check:tracked-artifacts` (arụnyere ọrụ na 2026-06-13). A kpachapụrụ anya wepụ `test:unit` (ọ dị nwayọ; ọrụ CI `test-unit` na-ekpuchi ya). - Jiri aka gbaa `npm run test:unit` tupu ị push branch release. Ọ bụrụ na hook ada: dozie nsogbu kpatara ya, ejila `--no-verify` gafere ya. ### Conventional Commits Commit niile ga-abanye na release ga-agbasorịrị usoro `type(scope): subject`. **Ụdị ndị ziri ezi:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `style`, `ci` **Scope ndị ziri ezi:** `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`, `cloud-agent`, `guardrails`, `compression`, `auto-combo`, `resilience`, `providers`, `executors`, `translator`, `domain`, `authz` Mgbanwe na-emebi ndakọrịta: tinye footer `BREAKING CHANGE:` ma ọ bụ `!` mgbe scope gasịrị (dịka `feat(api)!: drop /v0`). ### Akwụkwọ Nkọwa - [ ] `npm run check:docs-sync` gafere (pre-commit na-agba ya na-akpaghị aka) - [ ] `npm run check:docs-all` gafere (nchịkọta: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links) - [ ] `npm run check:env-doc-sync` jiri 0 kwụsị — nkwekọrịta env dị n’etiti koodu ↔ `.env.example` ↔ `docs/reference/ENVIRONMENT.md` ka zuru oke - [ ] `npm run check:doc-links` jiri 0 kwụsị — enweghị ntụaka markdown dị n’ime nke mebiri mgbe a hazigharịrị ihe - [ ] A nyochala `docs/architecture/ARCHITECTURE.md` maka mgbanwe na-adabaghị n’etiti storage/runtime - [ ] A nyochala `docs/guides/TROUBLESHOOTING.md` maka mgbanwe env var na mgbanwe arụmọrụ - [ ] Ọ bụrụ na `.env.example` gbanwere: emelitela `docs/reference/ENVIRONMENT.md` - [ ] Ọ bụrụ na atụmatụ ọhụrụ nwere UI: `docs/guides/USER_GUIDE.md` kwuru maka ya - [ ] Ọ bụrụ na atụmatụ ọhụrụ nwere API: emelitela `docs/reference/API_REFERENCE.md` + `docs/openapi.yaml` - [ ] Ọ bụrụ na atụmatụ ọhụrụ bụ modul: faịlụ pụrụ iche `docs/.md` dị - [ ] Ọ bụrụ na ọ bụ mgbanwe na-emebi ndakọrịta: `docs/guides/TROUBLESHOOTING.md` nwere ndetu mb移ga ### i18n - [ ] `npm run i18n:check` jiri 0 kwụsị — ọnọdụ ntụgharị (`.i18n-state.json`) kwekọrọ na dọkụmentị isi mmalite (enweghị isi mmalite gbanwere n’ọnọdụ strict; ịdọ aka ná ntị n’ọnọdụ warn dị mma maka obere mmezi dọkụmentị nke nkeji ikpeazụ, mana ọ kwesịrị ịbụ 0 tupu itinye tag) - [ ] `npm run i18n:check-ui-coverage` jiri 0 kwụsị — locale UI ọ bụla nọ na ma ọ bụ karịa oke mkpuchi 80% - [ ] `npm run i18n:sync-ui:dry` kọọ igodo efu 0 n’ime locale 42 niile - [ ] Ọ bụrụ na dọkụmentị Bekee nke isi mmalite gbanwere, gbaa `npm run i18n:run` (ọ chọrọ `OMNIROUTE_TRANSLATION_API_KEY` n’ime `.env`) tupu itinye tag - [ ] Enwere ike iyigharị onyinye ntụgharị ruo na release na-esote ma ọ bụrụ na ha pere mpe (dekọọ ya na CHANGELOG) ### Mbugharị Database - [ ] Ọ bụrụ na `src/lib/db/migrations/` nwere faịlụ ọhụrụ: - [ ] Mbugharị ọ bụla bụ idempotent (`CREATE TABLE IF NOT EXISTS`, wdg.) - [ ] E tinyere mbugharị n’ime transaction - [ ] E nyere ha nọmba nke ọma (enweghị oghere n’usoro) - [ ] Nwalee na nrụnye ọhụrụ: hichapụ `~/.omniroute/omniroute.db` ma gbaa `npm run dev` - [ ] Nwalee na nrụnye dị adị: mee backup DB, gbaa migration, ma nyochaa schema - [ ] A na-ejikwa faịlụ WAL (`-wal`, `-shm`) nke ọma ma ọ bụrụ na migration degharịrị table ### Katalọgụ Provider (Zod-validated) - [ ] schema Zod nke `src/shared/constants/providers.ts` ziri ezi n’oge nbudata - [ ] Provider niile nwere field achọrọ (`id`, `label`, `kind`, wdg.) - [ ] E nyere `freeNote` maka provider efu ọhụrụ - [ ] Provider OAuth nwere `oauthConfig` e debanyere aha na `src/lib/oauth/constants/oauth.ts` - [ ] Ọ bụrụ na agbakwunyere provider ọhụrụ: executor kwekọrọ na ya dị na `open-sse/executors/` - [ ] Ọ bụrụ na format ahụ abụghị OpenAI: translator dị na `open-sse/translator/` - [ ] E debanyere model na `open-sse/config/providerRegistry.ts` - [ ] Unit test dị na `tests/unit/` na-ekpuchi nhazi provider na routing ### Desktop (Electron) Ọ bụrụ na `electron/` gbanwere: - [ ] `npm run electron:smoke:packaged` gafere - [ ] A nwalela build maka opekata mpe otu n’ime `:win`, `:mac`, `:linux` - [ ] Asambodo code signing agwụbeghị oge (ọ bụrụ na a na-eme signing) - [ ] Version dị na `electron/package.json` kwekọrọ na root `package.json` - [ ] Emelitela pointer nke channel auto-update ma ọ bụrụ na a na-ewepụta ya na `stable` ### Nhazi Build Repository a na-eji directory mmepụta atọ dị iche iche — agwakọtala ha: | Directory | Ebumnuche | A na-esochi ya? | | --------- | ---------------------------------------------------------- | ---------------- | | `src/` | Isi mmalite application (TypeScript / TSX) | Ee | | `.build/` | Ihe etiti build — mmepụta `next build` (`distDir`) | Mba (gitignored) | | `dist/` | Nchịkọta npm a pụrụ ibupu — `assembleStandalone` haziri ya | Mba (gitignored) | > **Ndetu onye ọrụ:** directory image VPS dị anya ka bụ `/usr/lib/node_modules/omniroute/app/`. > Naanị mmepụta build dị **n’ime repository** ka e bugharịrị (`app/` → `dist/`). Skill deploy na-eji rsync ebuga > ọdịnaya `dist/` n’ime directory `app/` dị anya — enweghị mgbanwe path VPS achọrọ. **Usoro otu build:** ``` npm run build:release └─ rm -rf .build dist (nhicha) └─ next build → .build/next/ (ihe etiti) └─ assembleStandalone (na-edetuo standalone + static + public + natives → dist/) └─ writes dist/BUILD_SHA (sentinel HEAD) ``` AGBALỊLA ịgba `npm run build` wee soro ya gbaa `npm run build:cli` iche maka deploy — jiri `npm run build:release`, nke na-eme rebuild dị ọcha + sentinel n’otu command. ### Nnyocha Artifact - [ ] `npm run build:release` gara nke ọma ma `dist/BUILD_SHA` == `git rev-parse --short HEAD` - [ ] `npm run check:pack-artifact` dị ọcha — enweghị `app.__qa_backup`, `scripts/scratch`, `package-lock.json`, ma ọ bụ ihe fọdụrụ n’ime igwe mpaghara - [ ] `dist/server.js` dị mgbe build gasịrị ### Itinye Tag & Release - [ ] Gbaa `/generate-release-cc` (skill Claude Code): - Na-emepụta tag `vX.Y.Z` - Na-ebuga tag na branch - Na-emepe GitHub Release nwere ọdịnaya changelog - Na-etinye installer Electron (ọ bụrụ na e wuru ha) - [ ] Ma ọ bụ jiri aka mee ya: ```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 ``` ### Deploy Skill deploy na-eji usoro rsync dị mfe — enweghị `npm pack`, enweghị `npm i -g`: - [ ] Jiri skill deploy kwekọrọ na target: - `/deploy-vps-local-cc` — VPS mpaghara (192.168.0.15) - `/deploy-vps-akamai-cc` — VPS Akamai (69.164.221.35) - `/deploy-vps-both-cc` — ha abụọ - [ ] Tupu deploy, gosi na `dist/BUILD_SHA` == `git rev-parse --short HEAD` - [ ] Build ga-agba ebe `node_modules` bụ nke ezigbo ya (main checkout ma ọ bụ worktree e ji `npm ci` kwadebe — Ọ BỤGHỊ worktree ejiri symlink) - [ ] Mee smoke test n’instance e deploypụtara: - Mepee `/dashboard/health` → lelee na version string kwekọrọ na release - Gbaa arịrịọ `/v1/chat/completions` megide provider a maara - Nyochaa na `/api/monitoring/health` weghachiri circuit breaker `CLOSED` - Gosi na transport MCP na-aza (`/mcp` HTTP, `/mcp-sse` SSE) ### Mgbe release gasịrị - [ ] Gbaa `/capture-release-evidences-cc` (nkà Claude Code) - Na-esepụta nseta ihuenyo/ndekọ WebP nke atụmatụ ọhụrụ - Na-etinye ha na ndetu mwepụta / edemede blọọgụ - [ ] Jiri ọkwa mwepụta melite GitHub Discussions / Discord - [ ] Mepee milestone maka ụdị na-esote - [ ] Ọ bụrụ na ọ dị oke mkpa: kpọgide mkparịta ụka ahụ ma ọ bụ bipụta ya na `news.json` maka ọkọlọtọ dị n'ime ngwa ### Ọnụ ụzọ mmalite ọha nke Radar E ji ụma commit ọkwa Radar ahụ na `active: false`. Ime ka ọ rụọ ọrụ bụ mgbanwe dị iche nke a ga-eme naanị mgbe e gosipụtara ihe akaebe maka ihe niile dị n'okpuru: - [ ] Ejikọla Radar PR niile e dokọtara n'usoro, release-tip CI dịkwa ndụ ndụ - [ ] Deploy ma mee smoke test n'ụzọ gasị OSS Radar ebe `RADAR_ENABLED` ka bụ gbanyụọ na ndabara - [ ] Mee smoke test na `GET /planos`, `/termos`, `/privacidade`, na `/reembolso` n'elu host Radar a kpọrọ aha - [ ] Dekọọ njirimara/ozi kọntaktị/adreesị onye na-arụ ọrụ yana nyocha iwu nke onye nwe ya kwadoro n'ime ọrụ nzuzo - [ ] Nwalee Stripe Checkout na webhook e binyere aka na ya naanị n'ụdị nnwale - [ ] Nwalee otu nnyefe ozi-e azụmahịa ezoro ezo site na onye na-ezipụ/ngalaba a kwadoro - [ ] Gosipụta na iweghachi backup na-arụ ọrụ ma mee otu research run a na-elekọta nke nwere oke mmefu ego - [ ] Kwado iwu nyocha BRL/PIX tupu ịnakwere ihe akaebe onyinye - [ ] Mee ka Checkout ọha rụọ ọrụ naanị mgbe ọnụ ụzọ ndị bu ya ụzọ gafere, wee mee ka ID ọhụrụ dị na `news.json` rụọ ọrụ - [ ] Nyochaa na ọkọlọtọ Home na-eji ederede ahaziri maka asụsụ mpaghara nakwa na ID ọhụrụ na-apụta ọzọ mgbe e wepụrụ ID ochie ## Ule smoke nke Ọrụ Agbakwunyere (v3.8.4+) Tupu izipu mbipụta ọ bụla nwere mgbanwe n’ọrụ agbakwunyere, nyochaa ihe ndị a: ### Mbido Fresh-DB (na-achọpụta esemokwu migration — agbakwunyere mgbe hotfix v3.8.4 gasịrị) - [ ] `DATA_DIR=$(mktemp -d) npm start &` — chere 10 s ka ọ malite - [ ] `curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'` na-eweghachi `"9router"` (Ọ BỤGHỊ 404, Ọ BỤGHỊ 500). Nke a na-egosi na etinyere migration `071_services.sql` ma kụọkwa row. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"` na-eweghachi row 3. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"` na-eweghachi row 2 (na-akwado na etinyere `070_webhooks_kind_metadata.sql`). - [ ] `node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts` na-agafe — na-echebe megide esemokwu ga-eme n’ọdịnihu. ### 9Router - [ ] `POST /api/services/9router/install` na-eweghachi 200 ya na `installedVersion` n’ime ihe na-erughị nkeji 2 - [ ] `POST /api/services/9router/start` na-eweghachi 200 na `state: "running"` n’ime ihe na-erughị 30 s - [ ] `GET /api/services/9router/status` na-akọ `health: "healthy"` - [ ] `POST /v1/chat/completions` ya na `"model": "9router/auto/..."` na-eweghachi 200 (routing site na 9Router site na mmalite ruo na njedebe) - [ ] `GET /dashboard/providers/services/9router/embed/dashboard` na-egosipụta UI izizi nke 9Router n’ime proxy (enweghị iframe `127.0.0.1:port` kpọmkwem) - [ ] `POST /api/services/9router/rotate-key` na-eweghachi `{ keyRotated: true }`, ọrụ ahụ amalitekwa ọzọ n’enweghị nsogbu - [ ] `POST /api/services/9router/stop` na-eweghachi 200 na `state: "stopped"` - [ ] `GET /api/services/9router/logs?tail=50` na-eweghachi iyi SSE nwere event `snapshot` nke nwere ahịrị ndị na-adịbeghị anya - [ ] Nwụnye n’ebe `npm` na-adịghị na PATH na-eweghachi 500 ya na ozi njehie dị mfe nghọta (na-abụghị stack trace) ### CLIProxyAPI - [ ] `POST /api/services/cliproxy/install` na-eweghachi 200 n’ime ihe na-erughị nkeji 2 - [ ] `POST /api/services/cliproxy/start` na-eweghachi 200 na `state: "running"` n’ime ihe na-erughị 30 s - [ ] `GET /api/services/cliproxy/status` na-akọ `health: "healthy"` - [ ] `POST /api/services/cliproxy/stop` na-eweghachi 200 na `state: "stopped"` - [ ] `GET /api/services/cliproxy/logs?tail=50` na-eweghachi iyi SSE ### Nnwale nlọghachi azụ nke nchekwa - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start` na-eweghachi `403 LOCAL_ONLY` - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start` na-eweghachi `403 LOCAL_ONLY` - [ ] Nzaghachi njehie sitere na `/api/services/*` enweghị `err.stack` ma ọ bụ ụzọ faịlụ zuru ezu ## Nnyocha v3.8.0+ Tupu izipu mbipụta v3.8.x ọ bụla, nyochaa ihe ndị ọzọ ndị a: - [ ] `omniroute --tray` na-amalite na macOS (etinyere systray2 n’ime `~/.omniroute/runtime/`) - [ ] `omniroute --tray` na-amalite na Linux (chọrọ DISPLAY; njehie dị mfe nghọta ma ọ bụrụ na edoghị ya) - [ ] `omniroute --tray` na-amalite na Windows (PowerShell NotifyIcon, enweghị binary ndị ọzọ) - [ ] `omniroute config tray enable` na-emepụta ndenye autostart; disable na-ewepụ ya - [ ] `npm install -g omniroute@` na-eme postinstall na-enweghị ịkwụsị n’ihi njehie dị njọ - [ ] Ụzọ mmelite na-edowe optional deps: `omniroute update --apply` na auto-updater na-eme `npm install -g … --include=optional` ka `optionalDependencies` (better-sqlite3, keytar, tls-client, na stack SLM llmlingua: `@atjsh/llmlingua-2@2.0.5`, `js-tiktoken`) ghara ịla n’iyi mgbe emelitere. Ọkwa SLM ultra `modelPath` chọkwara model tinybert, nke a na-ebudata na-akpaghị aka gaa `${DATA_DIR}/models/llmlingua` mgbe mbụ e ji ya. Postinstall (`scripts/build/colocateOptionals.mjs`) na-etinyezi closure nhọrọ nke SLM n’otu ebe n’ime `dist/node_modules` ka worker nwee ike ịchọta naanị otu instance `@huggingface/transformers` ^4.2.0 — trace nke nọọrọ onwe ya na-etinye naanị transformers n’ime bundle, ọ naghị etinye optionals ndị e ji dynamic import webata, yabụ ma nke a adịghị, worker ga-ebunye llmlingua-2 megide transformers nke root, ọkwa SLM ahụ ga-adakwa na nzuzo ma hapụ usoro ahụ ka ọ gaa n’ihu. - [ ] `omniroute status` na-arụ ọrụ n’enweghị `.env` (ụzọ token CLI, naanị loopback) - [ ] `curl http://localhost:20128/api/shutdown` na-eweghachi 401 (route a na-echebe mgbe niile) - [ ] `curl -H "host: evil.com" http://localhost:20128/api/mcp/sse` na-eweghachi 401 (nche loopback) - [ ] SQLite runtime na-ahọrọ `bundled` na mbido mbụ (binary e tinyere n’ime bundle dabara na platform) - [ ] SQLite runtime na-alaghachi na `runtime` mgbe ehichapụ `node_modules/better-sqlite3` - [ ] Smart MCP filter na-akpakọ output n’ezie nke `playwright-mcp browser_snapshot` (mbelata ≥50%) - [ ] Faịlụ `skills/omniroute*/SKILL.md` iri niile dị ka ọha nwee ike ibudata ha site na raw GitHub URL - [ ] Wizard onboarding na-egosi nzọụkwụ njem nlegharị anya nke ọkwa “Otu O Si Arụ Ọrụ” na nhazi ọhụrụ - [ ] Widget mkpuchi ọkwa dị na dashboard Home na-egosi ọnụọgụ ndị ahaziri/ndị na-arụ ọrụ --- ## Nlaghachi Ọ bụrụ na mbipụta nwere nsogbu dị oke njọ: 1. `gh release edit vX.Y.Z --prerelease` (na-akara ya dị ka nke na-abụghị nke kachasị ọhụrụ) 2. `git tag -d vX.Y.Z && git push --delete origin vX.Y.Z` (naanị ma ọ bụrụ na ndị ọrụ amalitebeghị iji ya) 3. Ma ọ bụ: mee ndozi ngwa ngwa na `release/vX.Y.0` → mbipụta ndozi `vX.Y.(Z+1)` 4. Kpọsa ya ozugbo na GitHub Discussions na Discord ## Iwu Ndị A Na-agaghị Agbanwe Agbanwe - Etinyekwala commit ozugbo na `main` - Ejikwala `git push --force` na `main` ma ọ bụ alaka `release/*` - Ahapụla Husky hooks (`--no-verify`) - Etinyekwala ihe nzuzo, ozi njirimara, ma ọ bụ faịlụ `.env` na commit - Mkpuchi ule ga-anọgide na ≥60/60/60/60 (nkwupụta/ahịrị/ọrụ/alaka) - Tinye ma ọ bụ melite ule mgbe niile mgbe ị na-agbanwe koodu mmepụta dị na `src/`, `open-sse/`, `electron/`, ma ọ bụ `bin/` ## Nnyocha Mmekọrịta Akpaghị Aka Gbaa ihe nche nke mmekọrịta dọkụmentị na kọmputa gị tupu imepe PR: ```bash npm run check:docs-sync ``` CI na-agbakwa nnyocha a na `.github/workflows/ci.yml` (ọrụ lint).