# 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 nkà Claude Code eme akpaaka. > > **Debe kwụ/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` + nightly). Ime > nke a kwa oge — karịsịa **tupu** ndepụta nlele a — na-eme ka PR mwepụta malite na green. ## TL;DR ```bash # 1. Bulie version + mepụta CHANGELOG (nkà) /version-bump-cc patch # ma ọ bụ minor/major # 2. Gbaa quality gate na mpaghara gị npm run check # lint + ule npm run test:coverage # ọnụ ụzọ coverage 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. Deploy (nkà) /deploy-vps-both-cc # ma ọ bụ akamai-cc / local-cc # 6. Dekọọ ihe akaebe mwepụta (nkà) /capture-release-evidences-cc ``` ## Mbipụta Ntụkwasị Obi nke npm (ndabara kemgbe v3.8.51) — staged mgbe a rịọrọ ya, direct dịka nhọrọ 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 nke GitHub maka nzere npm nke na-adị obere oge maka ọsọ ahụ — enweghị token npm na-adị ogologo oge n'ime ihe nzuzo repository, enweghị arịrịọ 2FA, a na-etinyekwa provenance. Nke ahụ bụ ụzọ ngafe npm kwadoro ugbu a ebe a na-akwụsị token ndị na-awụfe 2FA; ọ na-eweghachi usoro akpaaka zuru oke nke project ahụ nwere ruo v3.8.48 ma na-edobe nkwa WS1.3 (token gbapụtara enweghị ike ibipụta naanị ya — n'ihi na ọ dịghị token). **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`: jiri `publish_mode=staged` (n'okpuru) ma ọ bụ `direct` ziga ya ọzọ. ### Mbipụta staged (mgbe a rịọrọ ya — `publish_mode=staged`) Workflow npm-publish anaghịzi ebipụta ozugbo: ọ na-ebido tarball a kwakọtara (`check:pack-boot`) wee gbaa `npm stage publish` — a na-edobe bytes ndị ahụ kpọmkwem na registry, **agaghị enwe ike ịwụnye ha** ruo mgbe onye nwe ya kwadoro. A kwagara ọnụ ụzọ 2FA nke mmadụ gaa MGBE ihe akaebe ahụ 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 ndị e tinyere na stage (a na-atụ aro ya): `npm stage download `, wee wụnye tarball ebudatara n'ime temp prefix ma bidokwa ya (`npm run check:pack-boot` na-eme otu mkpebi pack→install→boot ahụ na CI na-akpaghị aka). 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 post-publish (WS1.4 nke atụmatụ v3.8.49) na-etinye version e bipụtara site na public registry n'ime container dị ọcha ma bidokwa ya. **Nhọrọ ndabere mberede:** `workflow_dispatch` nwere `publish_mode=direct` na-eweghachi `npm publish` ozugbo nke ochie (jiri naanị ma ọ bụrụ na staging n'onwe ya anaghị arụ ọrụ nke ọma; dekọọ ihe kpatara ya). **Nchekwube otu ugboro (onye nwe ya, npmjs.com):** hazie Trusted Publisher maka `omniroute` na ọnọdụ stage-only ka token na-adị ogologo oge nke gbapụtara ghara inwe ike ime `npm publish` ozugbo site n'ebe ọ bụla — CI nwere ike naanị itinye na stage; naanị 2FA onye nwe ya na-ahapụ mwepụta. **Usoro maka artifact mebiri emebi (agbanweghị):** `npm deprecate omniroute@ " — use "` dịka mmeghachi omume ndabara (nkeji ole na ole, enwere ike ịtụgharị ya); jiri `npm unpublish` naanị n'ime ohere 72h/no-dependents, emekwala ya dịka nzọụkwụ mbụ. Docker: edegharịla version tag — rollback bụ ịtụgharị `latest` gaa na digest ikpeazụ dị mma. **Docker Hub `latest` (achọrọ na mbipụta stable SemVer ọ bụla):** workflow `docker-publish` ga-etinye tag na **ma** `X.Y.Z` **ma**, mgbe `should-promote-latest.sh` kwetara na nke a bụ stable SemVer kachasị elu, `:latest` nwere **otu digest ahụ**. Mgbe ọrụ ahụ gasịrị: digest `latest` nke Hub hà nhata digest SemVer ọhụrụ, `last_updated` agbanwekwala. Ahapụla `:latest` na build ochie ebe release notes na-ekwu maka ndozi ndị dị naanị na git. Compose quickstarts na-eji `:latest`; GitOps kwesịrị ịnọgide na-atụnye `X.Y.Z`. Lee [Ọwa mwepụta Docker](../guides/DOCKER_GUIDE.md#release-channels) na #10317. ## Ụzọ Ọsọ maka Hotfix (label `hotfix`) PR e tinyere label `hotfix` na-amafere matriks CI dị arọ (E2E nwere shard 9, coverage ratchet, quality-gate, quality-extended) ma debe ọnụ ụzọ dị ngwa 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 nnabata — 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-akụda mgbe ọ na-amalite / ndozi nchekwa / ọ metụtara onye ọrụ ọ bụla nke release ahụ. "Dị mkpa" abụghị "emebiela". 2. **Ikike**: naanị onye nwe repository na-etinye label `hotfix`. Label ahụ BỤ nkwado ahụ — ejila aka gị tinye ya na PR campaign. 3. **Ihe akaebe**: body PR ahụ na-ejikọ run dị arọ gara aga nke mechara green kpamkpam (suite nke jobs ndị a mafere gaara enyocha ọzọ) yana test nke ndozi ahụ nke dara na mbụ ma mesịa gafee. 4. **Oke**: naanị cherry-pick — ndozi kacha nta, enweghị refactor, enweghị mgbanwe ndị ọzọ e tinyere n'ụzọ. Run zuru ezu na-esote na release branch (release-green na-aga n'ihu) ga-enyocha ọzọ akụkụ coverage/ratchet ndị a mafere — ụzọ ahụ na-amafere naanị ICHERE, ọ dịghị mgbe ọ na-amafere validation. Diffs nke metụtara naanị tests (faịlụ niile dị n'okpuru `tests/`, ọ dịghị nke dị n'okpuru `tests/e2e/`) na-amafere matriks E2E na-akpaghị aka, na-enweghị label ọ bụla. ## Ndepụta Nlele Zuru Ezu ### Tupu mwepụta - [ ] Ejikọtala PR niile ezubere maka mwepụta a na `release/vX.Y.0` - [ ] Emechiela ihe Linear/issue niile mepere emepe maka ụdị a ma ọ bụ bugharịa ha na milestone na-esote - [ ] CI na-aga nke ọma na alaka `release/vX.Y.0` - [ ] Enweghị akara `TODO(release)` na koodu: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker base image bụ nke kachasị ọhụrụ (ugbu a `node:24.15.0-trixie-slim`) ### Ụdị na Ndekọ Mgbanwe - [ ] Gbaa `/version-bump-cc ` (nkà Claude Code) - Na-ebuli ụdị dị na `package.json`, `electron/package.json` - Na-emepụtaghachi `CHANGELOG.md` site na git commits kemgbe tag ikpeazụ - Na-emelite baajị README.md - [ ] Jiri aka nyochaa CHANGELOG.md ma dozie ozi commit ma ọ bụrụ na ọ dị mkpa - [ ] Gbaa mbọ hụ na ngalaba semver kachasị ọhụrụ na `CHANGELOG.md` hà nhata ụdị dị na `package.json` - [ ] Debe `## [Unreleased]` dịka ngalaba mbụ nke ndekọ mgbanwe maka ọrụ na-abịa - [ ] Melite `docs/openapi.yaml` → `info.version` ga-aharịrị nhata ụdị dị na `package.json` ### Ogo Koodu - [ ] `npm run lint` — njehie 0 (ịdọ aka ná ntị ndị ahụ adịlarị) - [ ] `npm run typecheck:core` — enweghị nsogbu - [ ] `npm run typecheck:noimplicit:core` — enweghị nsogbu (siri ike) - [ ] `npm run check:cycles:ratchet` — nọ n'ime oke `metrics.cycles` a kpachiri akpachi (ịgba naanị `check:cycles` na-apụta na 1 ma ọ bụrụ na cycle ọ bụla dị, #15281) - [ ] `npm run check:any-budget:t11` — nọ n'ime budget - [ ] `npm run check:route-validation:t06` — enweghị nsogbu - [ ] `npm run check:node-runtime` — emezuola runtime floor akwadoro (`>=22.22.2 <23`, `>=24.0.0 <27`, dịka `SUPPORTED_NODE_RANGE` dị na `src/shared/utils/nodeRuntimeSupport.ts`; kwekọrọ na `engines` dị na `package.json`) ### Nnwale - [ ] `npm run test:unit` — gafere - [ ] `npm run test:vitest` — gafere (MCP server, autoCombo, cache) - [ ] `npm run test:coverage` — gate 60/60/60/60 emezuola (statements/lines/functions/branches) - [ ] `npm run test:integration` — gafere (ọ bụrụ na mgbanwe metụtara DB / handlers) - [ ] `npm run test:combo:matrix` — gafere (matrix atụmatụ combo: na-egosi n'ụzọ a pụrụ ịtụkwasị obi mkpebi nhọrọ nke atụmatụ routing ọha niile 19; gbaa ya mgbe a metụrụ combo routing, strategy resolution, ma ọ bụ fallback logic) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **nhọrọ/jiri aka mee** (nnwale anwụrụ ọkụ real-upstream nke gate na-achịkwa; na-enweta snapshot DB read-only site na VPS `root@192.168.0.15`; na-akpọtụrụ ezigbo providers, na-eri credits; anaghị agba ọsọ na CI ma ọlị; na-awụli ya nke ọma mgbe gate adịghị) - [ ] `npm run test:combo:live:vps` — **nhọrọ/jiri aka mee** (nnwale anwụrụ ọkụ VPS dị ndụ nke Phase-3: ọnọdụ HTTP 7 megide server `.15` dị ndụ 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ọtụrụ ezigbo providers; anaghị agba ọsọ na CI ma ọlị) - [ ] `npm run test:e2e` — gafere (mgbanwe UI) - [ ] `npm run test:protocols:e2e` — gafere (mgbanwe MCP/A2A) - [ ] `npm run test:ecosystem` — gafere ### Hooks (Husky kwadoro) Husky hooks dị na `.husky/` ma na-agba ọsọ n'onwe ha mgbe a na-arụ ọrụ git. - **pre-commit:** `npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11` - **pre-push:** gates ngwa ngwa ndị na-enye otu nsonaazụ mgbe niile — `npm run check:any-budget:t11 && npm run check:tracked-artifacts` (e mere ka ọ rụọ ọrụ 2026-06-13). E wepụrụ `test:unit` na ụma (ọ na-egbu oge; ọrụ CI `test-unit` na-ekpuchi ya). - Jiri aka gbaa `npm run test:unit` tupu ị push alaka mwepụta. Ọ bụrụ na hook daa: dozie nsogbu kpatara ya, ejikwala `--no-verify` gafee ya. ### Conventional Commits Commit niile ga-abanye na mwepụta ga-agbasorịrị usoro `type(scope): subject`. **Types ziri ezi:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `style`, `ci` **Scopes 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 ndị 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 n'onwe ya) - [ ] `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` na-apụta na 0 — nkwekọrịta env dị n'etiti koodu ↔ `.env.example` ↔ `docs/reference/ENVIRONMENT.md` ka zuru oke - [ ] `npm run check:doc-links` na-apụta na 0 — enweghị ntụaka markdown dị n'ime mebiri emebi mgbe emezigharịrị nhazi - [ ] A nyochala `docs/architecture/ARCHITECTURE.md` maka mgbanwe storage/runtime - [ ] A nyochala `docs/guides/TROUBLESHOOTING.md` maka mgbanwe env var na arụmọrụ - [ ] Ọ bụrụ na `.env.example` gbanwere: emelitela `docs/reference/ENVIRONMENT.md` - [ ] Ọ bụrụ na feature ọhụrụ nwere UI: `docs/guides/USER_GUIDE.md` na-akpọtụrụ ya - [ ] Ọ bụrụ na feature ọhụrụ nwere API: emelitela `docs/reference/API_REFERENCE.md` + `docs/openapi.yaml` - [ ] Ọ bụrụ na feature ọhụrụ bụ module: `docs/.md` nke ya dị - [ ] Ọ bụrụ na ọ bụ mgbanwe na-emebi ndakọrịta: `docs/guides/TROUBLESHOOTING.md` nwere ndetu migration ### i18n - [ ] `npm run i18n:check` na-apụta na 0 — ọnọdụ ntụgharị asụsụ (`.i18n-state.json`) kwekọrọ na akwụkwọ mmalite (enweghị source gbanwere n'ụzọ na-ekwekọghị na strict mode; ndụmọdụ warn-mode dị mma maka obere ndozi akwụkwọ n'oge ikpeazụ, mana ọ kwesịrị ịbụ 0 tupu tagging) - [ ] `npm run i18n:check-ui-coverage` na-apụta na 0 — locale UI ọ bụla ruru ma ọ bụ gafere coverage floor 80% - [ ] `npm run i18n:sync-ui:dry` na-akọ key 0 na-efu n'ime target locales 66 niile (locale ọ bụla ma e wezụga source `en`) - [ ] Ọ bụrụ na akwụkwọ Bekee mmalite gbanwere, gbaa `npm run i18n:run` (chọrọ `OMNIROUTE_TRANSLATION_API_KEY` na `.env`) tupu tagging - [ ] Enwere ike ibugharị onyinye ntụgharị asụsụ na mwepụta na-esote ma ọ bụrụ na ha pere mpe (dekọọ ya na CHANGELOG) ### Database Migrations - [ ] Ọ bụrụ na `src/lib/db/migrations/` nwere faịlụ ọhụrụ: - [ ] Migration ọ bụla bụ idempotent (`CREATE TABLE IF NOT EXISTS`, wdg.) - [ ] E tinyere migrations n'ime transactions - [ ] 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 edegharị tables ### Katalọgụ Ndị Na-eweta (Zod kwadoro) - [ ] Schema Zod dị na `src/shared/constants/providers.ts` ziri ezi n'oge mbido - [ ] Ndị na-eweta niile nwere mpaghara ndị achọrọ (`id`, `label`, `kind`, wdg.) - [ ] E nyere `freeNote` maka ndị na-eweta ọhụrụ n'efu - [ ] Ndị na-eweta OAuth nwere `oauthConfig` edebanyere na `src/lib/oauth/constants/oauth.ts` - [ ] Ọ bụrụ na agbakwunyere onye na-eweta ọhụrụ: nwee ngwa mmezu kwekọrọ na `open-sse/executors/` - [ ] Ọ bụrụ na usoro ahụ abụghị nke OpenAI: nwee ngwa ntụgharị na `open-sse/translator/` - [ ] Edebanyere model na `open-sse/config/providerRegistry.ts` - [ ] Ule unit dị na `tests/unit/` na-ekpuchi nhazi ndị na-eweta na ntụgharị ụzọ ### Desktọpụ (Electron) Ọ bụrụ na `electron/` gbanwere: - [ ] `npm run electron:smoke:packaged` gafere - [ ] A nwalere mwube maka opekata mpe otu n'ime `:win`, `:mac`, `:linux` - [ ] Asambodo mbinye aka koodu agwụbeghị (ọ bụrụ na a na-etinye mbinye aka) - [ ] Vershọn dị na `electron/package.json` kwekọrọ na nke dị na `package.json` nke mgbọrọgwụ - [ ] Emelitere ntụaka ọwa mmelite akpaaka ma ọ bụrụ na a na-ewepụta gaa na `stable` ### Nhazi Mwube Ebe nchekwa ahụ na-eji ndekọ mmepụta atọ dị iche iche — agwakọtala ha: | Ndekọ | Ebumnuche | A na-esochi ya? | | --------- | ------------------------------------------------------------------ | --------------------- | | `src/` | Koodu mmalite ngwa (TypeScript / TSX) | Ee | | `.build/` | Ngwa etiti mwube — mmepụta `next build` (`distDir`) | Mba (git na-eleghara) | | `dist/` | Ngwugwu npm enwere ike ibupu — `assembleStandalone` na-achịkọta ya | Mba (git na-eleghara) | > **Ndetu maka onye ọrụ:** ndekọ image VPS dị anya ka bụ `/usr/lib/node_modules/omniroute/app/`. > Naanị mmepụta mwube **dị n'ime repo** ka e bugharịrị (`app/` → `dist/`). Ngwa deploy na-eji rsync ebufe > ọdịnaya `dist/` n'ime ndekọ `app/` dị anya — ọ dịghị mgbanwe ụzọ VPS achọrọ. **Usoro otu mwube:** ``` npm run build:release └─ rm -rf .build dist (nhicha) └─ next build → .build/next/ (ngwa etiti) └─ assembleStandalone (na-edepụtaghachi standalone + static + public + natives → dist/) └─ na-ede dist/BUILD_SHA (akara nche HEAD) ``` AGBAKWALA `npm run build` nke `npm run build:cli` ọzọ dị iche na-esochi maka deploy — jiri `npm run build:release`, nke na-eme mwube ọhụrụ dị ọcha yana akara nche n'otu iwu. ### Nkwado Ngwa Mwube - [ ] `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'ógbè - [ ] `dist/server.js` dị mgbe mwube gachara - [ ] Ule ngwa ngwa packaged-runtime nke mpaghara, ma ọ bụrụ na achọrọ: `npm run dev:candidate -- validate` mgbe `npm run dev:candidate -- build` gachara na-ebido tarball e kwakọbara na `DATA_DIR` dịpụrụ iche ma na-enyocha `/api/health` + `/v1/models` (lee [Ụzọ Kwesịrị Ekwesị Maka Ntinye Aka](CONTRIBUTION_GOLDEN_PATH.md#local-candidate-loop)) ### Itinye Tag na Mwepụta - [ ] Gbaa `/generate-release-cc` (ngwa Claude Code): - Na-emepụta tag `vX.Y.Z` - Na-ebuga tag na branch - Na-emepe GitHub Release nwere ọdịnaya changelog - Na-etinye installers 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 Ngwa deploy na-eji usoro rsync dị mfe — enweghị `npm pack`, enweghị `npm i -g`: - [ ] Jiri ngwa deploy kwekọrọ na ebe ebumnuche: - `/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` - [ ] Mwube ga-agba ebe `node_modules` bụ nke ezigbo ya (ebe nlele isi ma ọ bụ worktree e jiri `npm ci` kwadebe — Ọ BỤGHỊ worktree ejikọtara site na symlink) - [ ] Mee ule ngwa ngwa n'ebe e mere deploy: - Mepee `/dashboard/health` → lelee na eriri vershọn kwekọrọ na mwepụta - Gbaa arịrịọ `/v1/chat/completions` megide onye na-eweta a maara - Nyochaa na `/api/monitoring/health` na-eweghachi circuit breakers `CLOSED` - Gosi na usoro mbufe MCP na-aza (`/mcp` HTTP, `/mcp-sse` SSE) ### Mgbe Mwepụta Gasịrị - [ ] Gbaa `/capture-release-evidences-cc` (ngwa Claude Code) - Na-ejide screenshots/recordings WebP nke atụmatụ ọhụrụ - Na-etinye ha na ndetu mwepụta / post blọọgụ - [ ] Jiri ọkwa mwepụta melite GitHub Discussions / Discord - [ ] Mepee milestone maka vershọn na-esote - [ ] Ọ bụrụ na ọ dị oke mkpa: kpachie mkparịta ụka n'elu ma ọ bụ bipụta na `news.json` maka banner dị n'ime ngwa ### Ọnụ ụzọ mwepụta Radar n'ihu ọha E tinyere ọkwa Radar na ụma yana `active: false`. Ịgbalite ya bụ mgbanwe dị iche mgbe e gosipụtara ihe akaebe maka ihe niile dị n'okpuru: - [ ] Ejikọtala Radar PR niile a chịkọtara, CI nke release-tip dịkwa green - [ ] Mee deploy ma nwalee ụzọ OSS Radar ngwa ngwa ebe `RADAR_ENABLED` ka gbanyụrụ na ndabara - [ ] Nwalee `GET /planos`, `/termos`, `/privacidade`, na `/reembolso` ngwa ngwa na host Radar a kpọrọ aha - [ ] Dekọọ njirimara/ozi kọntaktị/adreesị onye ọrụ yana nyocha iwu onye nwe kwadoro n'ime ọrụ nzuzo - [ ] Nwalee Stripe Checkout na webhook e tinyere mbinye aka naanị na ọnọdụ ule - [ ] Nwalee otu nnyefe ozi-e azụmahịa ezoro ezo site na onye zitere/domain a kwadoro - [ ] Gosipụta mweghachi backup na otu nyocha e lekọtara anya nke nwere oke mmefu ego - [ ] Kwado iwu nyocha BRL/PIX tupu ịnabata ihe akaebe onyinye - [ ] Gbanyụọ Checkout ọhaneze naanị mgbe ọnụ ụzọ ndị bu ụzọ gafere, wee mee ka ID ọhụrụ dị na `news.json` rụọ ọrụ - [ ] Nyochaa na banner Home na-eji ederede ahaziri maka asụsụ mpaghara nakwa na ID ọhụrụ na-apụta ọzọ mgbe a kagburu ID ochie ## Nnwale anwụrụ ọkụ nke Ọrụ Agbakwunyere (v3.8.4+) Tupu izipu mbipụta ọ bụla nwere mgbanwe n'ọrụ agbakwunyere, nyochaa: ### Mmalite Fresh-DB (na-achọpụta nkukota 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 tinye ahịrị mbụ. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"` na-eweghachi ahịrị 3. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"` na-eweghachi ahịrị 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 nkukota n'ọdịnihu. ### 9Router - [ ] `POST /api/services/9router/install` na-eweghachi 200 tinyere `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` nwere `"model": "9router/auto/..."` na-eweghachi 200 (ntụgharị ụzọ site na mmalite ruo na njedebe site na 9Router) - [ ] `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 ihe omume `snapshot` nke nwere ahịrị ndị na-adịbeghị anya - [ ] Ntinye n'ebe `npm` na-anọghị na PATH na-eweghachi 500 tinyere ozi njehie dị mfe nghọta (na-enweghị 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 ### 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ị mma 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 ntinye mmalite akpaka; disable na-ewepụ ya - [ ] `npm install -g omniroute@` na-eme postinstall na-enweghị nkwụsị dị njọ - [ ] Ụzọ mmelite na-edobe deps nhọrọ: `omniroute update --apply` na auto-updater na-eme `npm install -g … --include=optional` ka `optionalDependencies` (better-sqlite3, keytar, tls-client, na nchịkọta SLM llmlingua: `@atjsh/llmlingua-2@2.0.5`, `js-tiktoken`) wee lanarị mmelite. Ọkwa SLM ultra `modelPath` chọkwara ụdị tinybert, nke a na-ebudata na-akpaghị aka gaa `${DATA_DIR}/models/llmlingua` n'oge ojiji mbụ. Postinstall (`scripts/build/colocateOptionals.mjs`) na-edokọzi closure nhọrọ nke SLM n'ime `dist/node_modules` ka worker ahụ wee chọta otu instance `@huggingface/transformers` ^4.2.0 NAANỊ — trace kwụụrụ onwe ya na-achịkọta naanị transformers, ọ bụghị optionals ndị e ji dynamic import webata, ya mere, ma e wezụga nke a, worker ahụ ga-ebunye llmlingua-2 megide transformers nke root ma ọkwa SLM ahụ ga-ada nwayọọ nwayọọ gaa na fail-open. - [ ] `omniroute status` na-arụ ọrụ n'enweghị `.env` (ụzọ token CLI, naanị loopback) - [ ] `curl http://localhost:20128/api/shutdown` na-eweghachi 401 (ụzọ a na-echebe mgbe niile) - [ ] `curl -H "host: evil.com" http://localhost:20128/api/mcp/sse` na-eweghachi 401 (nche loopback) - [ ] Runtime SQLite na-ahọrọ `bundled` n'oge ojiji mbụ (binary etinyere n'ime ngwugwu dabara na platform) - [ ] Runtime SQLite na-alaghachi na `runtime` mgbe ehichapụrụ `node_modules/better-sqlite3` - [ ] Nzacha Smart MCP na-akpakọ mmepụta `playwright-mcp browser_snapshot` n'ezie (mbelata ≥50%) - [ ] Faịlụ `skills/omniroute*/SKILL.md` iri niile dị ka ọha nwee ike ịnweta ha site na URL raw GitHub - [ ] Ọkachamara ntọlite mbụ na-egosi nzọụkwụ nlegharị ọkwa "Otu O Si Arụ Ọrụ" n'oge ntọlite ọhụrụ - [ ] Wijet mkpuchi ọkwa dị na dashboard Home na-egosi ọnụọgụ ahaziri/na-arụ ọrụ --- ## Nkewa 3.9.0 LTS (a nwara ya na 3.8.58) Mgbe v3.8.59 gasịrị, ụdị na-esote bụ 3.9.0, ọnụ ya ga-aghọ alaka abụọ ga-adị ogologo oge: `stable/v3` (ahịrị v3 LTS, npm `latest`) na `develop` (v4, ebuliri ya gaa 4.0.0, npm `nightly`). Ụdị nhazi alaka/ọwa, forward-port na label dị na [RELEASE_STRATEGY.md](./RELEASE_STRATEGY.md); atụmatụ ahụ dị na [ROADMAP](../../ROADMAP.md) (Phase 3). Nkewa a ga-eme naanị otu ugboro; 3.8.58 na-anwale ya site na mbido ruo na njedebe na fork, ebe 3.8.59 ji [ndepụta nyocha GO/NO-GO](./LTS_GO_NO_GO.md) mechie. ### Nnwale akọrọ (naanị ọgụgụ, dị nchebe oge ọ bụla) ```bash npm run release:dry-run-lts-cut # ezigbo nkewa: 3.9.0 site na HEAD, tag gara aga v3.8.59 npm run release:dry-run-lts-cut -- --from <3.9.0-tip> # kpọgide commit isi mmalite ``` `scripts/release/dry-run-lts-cut.mjs` anaghị eme ihe ọ bụla: ọ na-agụ git na `gh` ma bipụta usoro niile — ihe ndị a ga-emerịrị tupu ya amalite (isi mmalite ga-ekpebi nke ọma, repository isi mmalite ahụ nwere akụkọ zuru ezu — shallow clone enweghị ike ịkwanye `stable/v3`, akụkụ nnata na-ajụ pack ahụ n’ebe parent mbụ e jikọtara malitere, ya mere mee nkewa site na full clone ma ọ bụ buru ụzọ mee `git fetch --unshallow origin` — tag gara aga dị, `package.json` bụ ụdị ebumnuche, issue `release-freeze` mepere emepe, ọ nweghị issue `Release branch not green` mepere emepe n’alaka mwepụta dị adị — alaka na-adịghị adị na-akọ `?` amaghị, ọ dịghị mgbe ọ ga-abụ green — ahaziri kwụ `release` nke Mergify (G11: `queue_rules`, `checks_timeout`, label `queue`), ruleset `release/*` ka na-egbochi nhichapụ na force-push, na `stable/v3` na `develop` adịghịkwa), nzọụkwụ alaka abụọ ahụ, trigger workflow ndị na-adịghị arụ ọrụ na ọnọdụ `if:` ndị ga-aghọ eziokwu (yana ndị variable repository ka na-egbochi ma ọ bụ ndị a kpọgidere na repository canonical), dist-tag ndị a tụrụ anya ha (`latest` → 3.9.0, `next` na `nightly` tọgbọ chakoo) na rollback. Ọpụpụ `0` = `RESULT: READY`, `1` = otu ihe dị mkpa a ga-emerịrị emezughị (`✗`), `2` = njehie ojiji. `--advisory ` na-eweda nyocha gaa n’ọkwa ịdọ aka ná ntị (`!`) n’ezoghị ya. Gbaa nnwale akọrọ nke ezigbo nkewa ahụ mgbe release freeze 3.9.0 ka mepere emepe — a na-emepụta alaka ndị ahụ mgbe tag gasịrị nakwa tupu Phase 12c ewepụ freeze ahụ. ### Nnwale 3.8.58 (naanị fork) ```bash # 1. Mee nnwale akọrọ n’ọnụ dị ugbu a site na iji paramita nnwale npm run release:dry-run-lts-cut -- --target-version 3.8.58 --previous-tag v3.8.57 \ --advisory freeze,base-green # 2. Mee ya megide remote FORK (a na-ajụ origin, ma ọ bụ remote ọ bụla URL ya bụ repository # canonical; nzọụkwụ ọ bụla na-arịọ nkwenye na terminal) 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. Nwalee workflow ndị na-adịghị arụ ọrụ n’ime fork (workflow_dispatch ebe nnwale akọrọ # na-akọ njikọta na repository canonical), emesịa mee rollback 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 ``` A na-eji git plumbing wuo commit mbuli `develop` (a naghị emetụ working tree aka), ọ na-ebulikwa faịlụ ise ndị ahụ commit mmeghe cycle na-ebuli: `package.json`, `open-sse/package.json`, `electron/package.json`, `package-lock.json` na `docs/openapi.yaml`. A ga-emepe ngalaba `[4.0.0]` nke CHANGELOG na iṅomi i18n ya na `develop` ma emesịa, tupu PR mbụ ya. Script ahụ anaghị agbanwe npm dist-tag ma ọlị — jiri package nnwale nwalee ha. ### Artifact nlele PR (wuo otu ugboro, kwalite otu bytes ahụ) `.github/workflows/preview-artifact.yml` na-ewu otu tarball production site n’isi PR ma nyochaa build ahụ kpọmkwem (#8084 slice (a)). Naanị PR ndị sitere n’otu repository; ọ dịghị ihe a na-ebipụta. ```bash gh workflow run preview-artifact.yml -f pr_number= # ma ọ bụ tinye label `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 # nrụnye nlele ``` Nrụpụta ahụ na-eme `npm ci`, `npm run build:release`, `npm run check:pack-artifact`, na-achịkọta tarball ahụ, na-agba `npm run check:pack-boot` (secret adịgboroja, data dir nwa oge), na-achịkọta ya ọzọ ma daa ma ọ bụrụ na digest ahụ abụghị otu, emesịa ọ dekọọ `artifact-identity.json` (head SHA, base SHA, hash lockfile, platform, arch, node ABI, bundler, iwu build — `scripts/release/artifact-identity.mjs`) ma kwado tarball ahụ n’ọrụ dị iche. Ịkwalite otu nlele pụtara ịwụnye tarball ahụ: ewughachila ya site na source ma ọlị. ### Nkewa ahụ (3.9.0, mgbe GO gasịrị) 1. Edekọrọ GO na [LTS_GO_NO_GO.md](./LTS_GO_NO_GO.md). 2. `npm run release:dry-run-lts-cut -- --from v3.9.0` na-ebipụta `RESULT: READY`. 3. Jiri aka mepụta alaka ndị ahụ na `origin` site na iwu ndị nnwale akọrọ bipụtara — script ahụ na-ajụ ịkwanye na `origin`. Iji commit `develop` enyochalarị ọzọ, gbaa nnwale `--execute` n’ọnụ 3.9.0 megide fork gị na mbụ; ọ ga-ebipụta SHA abụọ ahụ, a pụkwara ịkwanye otu commit ndị ahụ: ```bash git push origin :refs/heads/stable/v3 :refs/heads/develop ``` 4. Chekwaa `stable/v3` na `develop` (rulesets + merge queue) tupu ejikọta PR mbụ. 5. Workflows ndị na-adịghị arụ ọrụ ga-amalite ịrụ ọrụ ozugbo branch dị: `forward-port.yml` (push gaa `stable/v3`), `validate-stable-pr.yml` (PR ndị na-aga `stable/v3`) na `nightly-v4-build.yml` (na-ewu `develop`). Tupu e bido iji ya, tọọ repository secret `secrets.FORWARD_PORT_TOKEN` (ka CI wee na-arụ ọrụ na PR ndị forward-port); mbipụta abalị ga-anọgide na-adịghị arụ ọrụ ruo mgbe onye nwe ya tọsịrị repository variable `vars.NIGHTLY_PUBLISH` ka ọ bụrụ `true` ma npm Trusted Publishing nabata `nightly-v4-build.yml`. Mkpebi ọwa dị na `scripts/release/dist-tag.mjs`, nke bụ otu resolver ahụ `npm-publish.yml` na-eji. 6. Nyochaa ọwa ndị ahụ: `npm view omniroute dist-tags --json` na-egosi `latest` = 3.9.0, na enweghị `next` / `nightly` ruo mgbe v4 bipụtara. 7. Ọ bụrụ na ọ dị mkpa ịlaghachi azụ: `git push origin --delete refs/heads/stable/v3 refs/heads/develop` na `npm dist-tag add omniroute@3.8.59 latest`. --- ## Nlaghachi Ọ bụrụ na mwepụta ahụ nwere nnukwu nsogbu: 1. `gh release edit vX.Y.Z --prerelease` (na-egosi na ọ bụ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` → mwepụta patch `vX.Y.(Z+1)` 4. Kọọ ya ozugbo na GitHub Discussions na Discord ## Iwu Ndị Siri Ike - E tinyekwala commit ozugbo na `main` - Ejila `git push --force` na `main` ma ọ bụ alaka `release/*` - E mafela Husky hooks (`--no-verify`) - E tinyekwala ihe nzuzo, credentials, ma ọ bụ faịlụ `.env` na commit - Coverage ga-anọgide na ≥60/60/60/60 (statements/lines/functions/branches) - Tinye ma ọ bụ melite tests mgbe niile mgbe ị na-agbanwe production code dị na `src/`, `open-sse/`, `electron/`, ma ọ bụ `bin/` ## Nlele Mmekọrịta Akpaghị Aka Gbaa docs sync guard n'ime kọmputa gị tupu imepe PR: ```bash npm run check:docs-sync ``` CI na-agbakwa nlele a na `.github/workflows/ci.yml` (ọrụ lint).