Files
OmniRoute/docs/i18n/yo/docs/ops/RELEASE_CHECKLIST.md
Diego Rodrigues de Sa e Souza b637350680 fix(docs): re-sync the 65 documentation mirror sets; section-level docs pipeline; drift gate blocking (#13940)
1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors.

⚠️ base-red inherited: #12732
2026-09-17 02:55:31 -03:00

33 KiB

Release Checklist (Yorùbá)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 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 · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Ìmúdójúìwọ̀n tó ṣẹ̀yìn: 2026-08-28 — v3.8.51 Ìṣàn ìtújáde tí a mú rọrùn, tó ń lo àwọn òye Claude Code fún àìfọwọ́ṣe.

Jẹ́ kí queue/branch wà ní green láàárín àwọn ìtújáde: wo RELEASE_GREEN.md (/green-prs family + npm run check:release-green + /babysit + nightly). Ṣíṣe èyí lẹ́ẹ̀kọ̀ọ̀kan — àti ní pàtàkì ṣáájú àtòjọ àyẹ̀wò yìí — máa ń jẹ́ kí PR ìtújáde bẹ̀rẹ̀ ní green.

TL;DR

# 1. Gbé ẹ̀yà sókè + ṣe àgbéjáde CHANGELOG (òye)
/version-bump-cc patch    # tàbí minor/major

# 2. Ṣiṣẹ́ ẹnu-ọ̀nà ìdánilójú dídára ní àdúgbò
npm run check              # lint + àwọn ìdánwò
npm run test:coverage      # ẹnu-ọ̀nà ààbò ìdánwò kíkún (60/60/60/60)

# 3. Kọ́ & ṣe ìdánwò èéfín
npm run build
npm run test:e2e           # àṣàyàn ni, ṣùgbọ́n a dábàá rẹ̀

# 4. Ṣe àgbéjáde ìtújáde (òye)
/generate-release-cc

# 5. Ṣàgbékalẹ̀ (òye)
/deploy-vps-both-cc        # tàbí akamai-cc / local-cc

# 6. Ṣàkọsílẹ̀ àwọn ẹ̀rí ìtújáde (òye)
/capture-release-evidences-cc

Ìtẹ̀jáde npm Tí A Fọkàn Tán (àìyípadà láti v3.8.51) — títẹ̀jáde sí ìpele nígbà tí a bá béèrè, tààrà gẹ́gẹ́ bí ọ̀nà àfirọ́pò

npm-publish.yml ń tẹ̀jáde nípasẹ̀ npm Trusted Publishing (OIDC) gẹ́gẹ́ bí àìyípadà: iṣẹ́ stage-npm (tí GitHub gbàlejò) ń pààrọ̀ id-token GitHub fún ẹ̀rí ìdánimọ̀ npm alákòókò-kúkúrú fún ìṣiṣẹ́ yẹn — kò sí token npm alákòókò-gígùn nínú àwọn àṣírí ibi ìpamọ́, kò sí ìbéèrè 2FA, a sì so ẹ̀rí orísun mọ́ ọn. Èyí ni ọ̀nà àkọjá tí npm fọwọ́ sí nísinsìnyí tí wọ́n ti ń fòpin sí àwọn token tí ń foju kọ 2FA; ó mú ìṣàn aládàáṣiṣẹ́ pátápátá tí iṣẹ́ náà ní títí dé v3.8.48 padà, nígbà tí ó ń pa ìdánilójú WS1.3 mọ́ (token tí ó ti tú jáde kò lè tẹ̀jáde ní òun nìkan — kò sí token).

Ètò ẹ̀ẹ̀kan ṣoṣo (onílé): npmjs.com → package omniroute → Settings → Trusted Publisher → GitHub: owner diegosouzapw, repo OmniRoute, workflow npm-publish.yml (environment: none). Títí tí èyí yóò fi wà, ìgbésẹ̀ aládàáṣiṣẹ́ náà yóò kùnà pẹ̀lú ENEEDAUTH: tún firánṣẹ́ pẹ̀lú publish_mode=staged (ní ìsàlẹ̀) tàbí direct.

Títẹ̀jáde sí ìpele (nígbà tí a bá béèrè — publish_mode=staged)

Workflow npm-publish kò tẹ̀jáde tààrà mọ́: ó ń tan tarball tí a ti dì (check:pack-boot) lẹ́yìn náà ó ń ṣiṣẹ́ npm stage publish — àwọn byte kan náà ni a fi pamọ́ sórí registry, a kò lè fi wọlé títí onílé yóò fi fọwọ́ sí i. Ẹnu-ọ̀nà 2FA ti ènìyàn ti kúrò ní ṢÁÁJÚ ẹ̀rí sí LẸ́YÌN rẹ̀.

Ìṣàn onílé lẹ́yìn tí workflow bá di àwọ̀ ewé:

  1. npm stage list omniroute — wá stage id náà (a tún tẹ̀ ẹ́ jáde nínú àkótán workflow).
  2. Ṣàyẹ̀wò àwọn byte tí a fi sí ìpele (a dábàá rẹ̀): npm stage download <id>, lẹ́yìn náà fi tarball tí a gba sílẹ̀ wọ inú prefix ìgbà díẹ̀ kí o sì tan án (npm run check:pack-boot ń ṣe ìdájọ́ pack→install→boot kan náà ní CI ní aládàáṣiṣẹ́).
  3. npm stage approve <id> — ìbéèrè 2FA náà GAN-AN ni ìtẹ̀jáde. npm stage reject <id> ń sọ ọ́ nù.
  4. Àwọ̀n ààbò lẹ́yìn ìtẹ̀jáde: olùṣàyẹ̀wò lẹ́yìn ìtẹ̀jáde (WS1.4 ti ètò v3.8.49) ń fi ẹ̀yà tí a tẹ̀jáde láti inú registry gbogbo ènìyàn wọ inú container mímọ́, ó sì ń tan án.

Ọ̀nà àfirọ́pò pàjáwìrì: workflow_dispatch pẹ̀lú publish_mode=direct ń mú npm publish lẹ́sẹ̀kẹsẹ̀ ti àtijọ́ padà (lò ó nìkan bí fífi sí ìpele fúnra rẹ̀ kò bá ṣiṣẹ́ dáadáa; ṣàkọsílẹ̀ ìdí).

Ìmúle ẹ̀ẹ̀kan ṣoṣo (onílé, npmjs.com): ṣètò Trusted Publisher fún omniroute ní ipo stage-only kí token alákòókò-gígùn tí ó tú jáde má baà lè ṣe npm publish tààrà láti ibikíbi — CI lè fi sí ìpele nìkan; 2FA onílé nìkan ló lè tú u jáde.

Ìtọ́sọ́nà fún artifact tó bàjẹ́ (kò yípadà): npm deprecate omniroute@<bad> "<reason> — use <fixed>" gẹ́gẹ́ bí ìgbésẹ̀ àkọ́kọ́ àìyípadà (ìṣẹ́jú díẹ̀, a lè yí i padà); npm unpublish nìkan láàárín àkókò 72h/no-dependents kì í sì í ṣe ìgbésẹ̀ àkọ́kọ́ láé. Docker: má ṣe tún tag ẹ̀yà kọ láé — rollback ni títọ́ka latest padà sí digest tó dára kẹ́yìn.

Docker Hub latest (ó pọndandan fún gbogbo ìtẹ̀jáde SemVer tó dúró ṣinṣin): workflow docker-publish gbọ́dọ̀ fi tag sí méjèèjì X.Y.Z àti, nígbà tí should-promote-latest.sh bá fohùn ṣọ̀kan pé èyí ni SemVer tó dúró ṣinṣin tó ga jù lọ, :latest pẹ̀lú digest kan náà. Lẹ́yìn iṣẹ́ náà: digest Hub latest dọ́gba pẹ̀lú digest SemVer tuntun, last_updated sì ti yí. Má fi :latest sí build àgbà nígbà tí àwọn àkọsílẹ̀ ìtújáde ń sọ nípa àwọn àtúnṣe tí ó wà lórí git nìkan. Àwọn ìbẹ̀rẹ̀-kíákíá Compose ń lo :latest; GitOps gbọ́dọ̀ máa tẹ̀síwájú láti ṣàmúlẹ̀ X.Y.Z. Wo Àwọn ikanni ìtújáde Docker àti #10317.

Ọ̀nà-Yíyára fún Àtúnṣe-Pàjáwìrì (àmì hotfix)

PR tí a fi àmì hotfix sí máa fo matrix CI tó wuwo (E2E aláṣọ́-mẹ́sàn-án, ratchet ìborí, quality-gate, quality-extended), yóò sì pa àwọn ibodè tó yára, tó sì ń fúnni ní àmì tó ṣe kedere mọ́: ìkọ́lé, àwọn ṣọ́ọ̀ṣì unit, integration, vitest, lint/typecheck, docs-sync, check:pack-artifact àti ìdánwò ìbẹ̀rẹ̀ tarball (check:pack-boot). Àfojúsùn: kí gbogbo rẹ̀ jẹ́ aláwọ̀-ewé láàárín ≤15min dípò ~33min.

Ìlànà ìwọlé — gbogbo mẹ́rin ni a nílò (tí a ṣe àwòkọ́ṣe rẹ̀ láti ọ̀nà pàjáwìrì Chromium/VS Code/Node):

  1. Ìpele ewu: production ti bàjẹ́ — artifact tí a tẹ̀ jáde ń ṣubú nígbà ìbẹ̀rẹ̀ / àtúnṣe ààbò / gbogbo olùlò release náà ni ìṣòro náà kan. “Ó ṣe pàtàkì” kò túmọ̀ sí “ó bàjẹ́”.
  2. Àṣẹ: olówó repository nìkan ló lè fi àmì hotfix sí. Àmì náà GAN-AN ni ìfọwọ́sí — kò gbọdọ̀ jẹ́ ohun tí ẹni fúnra rẹ̀ ṣe lórí PR campaign kan.
  3. Ẹ̀rí: ara PR náà ní ìjápọ̀ sí heavy run tó kẹ́yìn tí gbogbo rẹ̀ jẹ́ aláwọ̀-ewé (suite tí àwọn job tí a fo yóò tún fìdí rẹ̀ múlẹ̀), pẹ̀lú ìdánwò àtúnṣe náà fúnra rẹ̀ tó kọ́kọ́ kùnà, tó sì wá kọjá.
  4. Ààlà iṣẹ́: cherry-pick nìkan — àtúnṣe tó kéré jù lọ, kò sí refactor, kò sì sí iṣẹ́ mìíràn tí a bá a kó wọlé.

Next full run lórí ẹ̀ka release (release-green tó ń lọ láìdáwọ́dúró) yóò tún fìdí coverage/ratchet surface tí a fo múlẹ̀ — ọ̀nà náà ń fo ÌDÚRÓ nìkan, kì í fo ìfọwọ́sí. Àwọn diff tí ó jẹ́ ti ìdánwò nìkan (gbogbo fáìlì lábẹ́ tests/, kò sí èyíkéyìí lábẹ́ tests/e2e/) máa fo matrix E2E láìfọwọ́yí, láìsí àmì kankan.

Àtòjọ Àyẹ̀wò Alálàyé

Ṣáájú release

  • Gbogbo PR tí a darí sí release yìí ti darapọ̀ mọ́ release/vX.Y.0
  • Gbogbo ohun Linear/issue tó ṣì ṣí fún version yìí ti di títì tàbí a ti sún wọn sí milestone tó tẹ̀ lé
  • CI jẹ́ aláwọ̀-ewé lórí ẹ̀ka release/vX.Y.0
  • Kò sí àmì TODO(release) nínú code: grep -r "TODO(release)" src/ open-sse/
  • Docker base image jẹ́ ti ìgbàlódé (lọ́wọ́lọ́wọ́ node:24.15.0-trixie-slim)

Version àti Changelog

  • Ṣiṣe /version-bump-cc <patch|minor|major> (ọgbọ́n Claude Code)
    • Ó ń gbé version package.json, electron/package.json sókè
    • Ó ń tún CHANGELOG.md ṣe láti inú àwọn git commit láti tag tó kẹ́yìn
    • Ó ń ṣe àfikún ìgbàlódé sí àwọn badge README.md
  • Ṣàyẹ̀wò CHANGELOG.md pẹ̀lú ọwọ́, kí o sì tún àwọn commit message ṣe bí ó bá yẹ
  • Rí i dájú pé abala semver tuntun jù lọ nínú CHANGELOG.md bá version package.json mu
  • Jẹ́ kí ## [Unreleased] wà gẹ́gẹ́ bí abala changelog àkọ́kọ́ fún iṣẹ́ tó ń bọ̀
  • Ṣe àfikún ìgbàlódé sí docs/openapi.yamlinfo.version gbọ́dọ̀ bá version package.json mu

Didára Code

  • npm run lint — àṣìṣe 0 (àwọn ìkìlọ̀ ti wà tẹ́lẹ̀)
  • npm run typecheck:core — mọ́
  • npm run typecheck:noimplicit:core — mọ́ (tó muna)
  • npm run check:cycles — kò sí dependency tó ń yípo
  • npm run check:any-budget:t11 — ó wà láàárín budget
  • npm run check:route-validation:t06 — mọ́
  • npm run check:node-runtime — ó bá ìwọ̀n runtime tó kéré jù lọ tí a ṣe àtìlẹ́yìn fún mu (>=22.22.2 <23, >=24.0.0 <27, gẹ́gẹ́ bí SUPPORTED_NODE_RANGE nínú src/shared/utils/nodeRuntimeSupport.ts; ó bá package.json engines mu)

Ìdánwò

  • npm run test:unit — kọjá
  • npm run test:vitest — kọjá (MCP server, autoCombo, cache)
  • npm run test:coverage — ibodè 60/60/60/60 ti pé (statements/lines/functions/branches)
  • npm run test:integration — kọjá (bí àwọn ìyípadà bá kan DB / handlers)
  • npm run test:combo:matrix — kọjá (matrix ọgbọ́n combo: ó ń fìdí àwọn ìpinnu yíyan ti gbogbo ọgbọ́n routing 19 tó jẹ́ ti gbogbo ènìyàn múlẹ̀ lọ́nà tí àbájáde rẹ̀ dúró ṣinṣin; ṣiṣẹ́ rẹ̀ nígbà tí o bá kan combo routing, strategy resolution, tàbí fallback logic)
  • RUN_COMBO_LIVE=1 npm run test:combo:liveàṣàyàn/pẹ̀lú ọwọ́ (ìdánwò smoke real-upstream tí ibodè ń ṣàkóso; ó ń mú snapshot DB kíkà-nìkan láti VPS root@192.168.0.15; ó ń kan àwọn provider gidi, ó ń ná credit; kò ṣiṣẹ́ nínú CI láé; ó máa fo ní mímọ́ láìsí ibodè náà)
  • npm run test:combo:live:vpsàṣàyàn/pẹ̀lú ọwọ́ (ìdánwò smoke VPS laaye Ìpele-3: scenario HTTP 7 sí server .15 tó wà láàyè nípasẹ̀ Node ESM lásán; ó nílò ssh root@192.168.0.15; ó ṣẹ̀dá/pa combo __live_test__* nìkan; ó ń kan àwọn provider gidi; kò ṣiṣẹ́ nínú CI láé)
  • npm run test:e2e — kọjá (àwọn ìyípadà UI)
  • npm run test:protocols:e2e — kọjá (àwọn ìyípadà MCP/A2A)
  • npm run test:ecosystem — kọjá

Àwọn Hook (Husky ti fìdí wọn múlẹ̀)

Àwọn hook Husky wà nínú .husky/, wọ́n sì máa ń ṣiṣẹ́ láìfọwọ́yí lórí àwọn iṣẹ́ git.

  • pre-commit: npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11
  • pre-push: àwọn ibodè tó yára tí àbájáde wọn dúró ṣinṣin — npm run check:any-budget:t11 && npm run check:tracked-artifacts (a mú un ṣiṣẹ́ ní 2026-06-13). A mọ̀ọ́mọ̀ yọ test:unit kúrò (ó lọ́ra; job CI test-unit ló ń bójú tó o).
    • Ṣiṣe npm run test:unit pẹ̀lú ọwọ́ ṣáájú pípa ẹ̀ka release ránṣẹ́.

Bí hook kan bá kùnà: tún ìṣòro tó fà á ṣe, má ṣe forí rẹ̀ kọjá pẹ̀lú --no-verify.

Àwọn Conventional Commit

Gbogbo commit tí yóò wọ release gbọ́dọ̀ tẹ̀lé fọ́ọ̀mù type(scope): subject.

Àwọn type tó bófin mu: feat, fix, refactor, docs, test, chore, perf, style, ci

Àwọn scope tó bófin mu: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz

Àwọn ìyípadà tó ń fọ́ ìbámu: fi footer BREAKING CHANGE: kún un tàbí ! lẹ́yìn scope (fún àpẹẹrẹ feat(api)!: drop /v0).

Ìwé Àlàyé

  • npm run check:docs-sync kọjá (pre-commit máa ń ṣiṣẹ́ rẹ̀ láìfọwọ́ṣe)
  • npm run check:docs-all kọjá (àkójọpọ̀: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links)
  • npm run check:env-doc-sync jáde pẹ̀lú 0 — àdéhùn env láàárín kóòdù ↔ .env.exampledocs/reference/ENVIRONMENT.md ṣì péye
  • npm run check:doc-links jáde pẹ̀lú 0 — kò sí ìtọ́kasí markdown inú tí ó bàjẹ́ lẹ́yìn àtúnṣètò
  • A ti ṣàyẹ̀wò docs/architecture/ARCHITECTURE.md fún ìyapa ibi ìpamọ́/àsìkò-ṣiṣẹ́
  • A ti ṣàyẹ̀wò docs/guides/TROUBLESHOOTING.md fún ìyapa env var àti ìṣiṣẹ́
  • .env.example bá yí padà: ṣe ìmúdójúìwọ̀n docs/reference/ENVIRONMENT.md
  • Bí ẹ̀ya tuntun bá ní UI: docs/guides/USER_GUIDE.md mẹ́nuba rẹ̀
  • Bí ẹ̀ya tuntun bá ní API: ṣe ìmúdójúìwọ̀n docs/reference/API_REFERENCE.md + docs/openapi.yaml
  • Bí ẹ̀ya tuntun bá jẹ́ module: docs/<MODULE>.md tí a yà sọ́tọ̀ wà
  • Bí ó bá jẹ́ àyípadà tí ń fọ́ ìbámu: docs/guides/TROUBLESHOOTING.md ní àkọsílẹ̀ ìṣíkiri

i18n

  • npm run i18n:check jáde pẹ̀lú 0 — ipò ìtumọ̀ (.i18n-state.json) bá àwọn docs orísun mu (kò sí àwọn orísun tí ó yapa ní strict mode; ìkìlọ̀ warn-mode ṣeé gbà fún àwọn àtúnṣe docs ìṣẹ́jú tó gbẹ̀yìn, ṣùgbọ́n ó yẹ kí ó jẹ́ 0 kí a tó fi tag sí i)
  • npm run i18n:check-ui-coverage jáde pẹ̀lú 0 — gbogbo locale UI wà ní tàbí lókè ìwọ̀n ìborí 80%
  • npm run i18n:sync-ui:dry jàbọ̀ pé kò sí key tí ó sọnù kọjá gbogbo locale 42
  • Bí docs Gẹ̀ẹ́sì orísun bá yí padà, ṣiṣẹ́ npm run i18n:run (ó nílò OMNIROUTE_TRANSLATION_API_KEY nínú .env) kí a tó fi tag sí i
  • A lè sún àwọn àfikún ìtumọ̀ sí ìtújáde tó kàn bí wọ́n bá kéré (tọ́pinpin nínú CHANGELOG)

Àwọn Ìṣíkiri Database

  • src/lib/db/migrations/ bá ní àwọn fáìlì tuntun:
    • Ìṣíkiri kọ̀ọ̀kan jẹ́ idempotent (CREATE TABLE IF NOT EXISTS, àti bẹ́ẹ̀ bẹ́ẹ̀ lọ.)
    • A fi transactions yí àwọn ìṣíkiri ká
    • A to nọ́ńbà wọn lọ́nà tó tọ́ (kò sí àlàfo nínú ọ̀wọ́ọ̀wọ́)
  • Dán an wò lórí ìfìsí tuntun: pa ~/.omniroute/omniroute.db rẹ́, kí o sì ṣiṣẹ́ npm run dev
  • Dán an wò lórí ìfìsí tó ti wà: ṣe àfipamọ́ DB, ṣiṣẹ́ ìṣíkiri, kí o sì jẹ́rìí schema
  • Ṣàbójútó àwọn fáìlì WAL (-wal, -shm) lọ́nà tó tọ́ bí ìṣíkiri bá tún àwọn table kọ

Àkójọ Provider (Tí Zod Fìdí Rẹ̀ Múlẹ̀)

  • Zod schema src/shared/constants/providers.ts péye ní àkókò ìkójọpọ̀
    • Gbogbo provider ní àwọn field tí a nílò (id, label, kind, àti bẹ́ẹ̀ bẹ́ẹ̀ lọ.)
    • A pèsè freeNote fún àwọn provider ọ̀fẹ́ tuntun
    • Àwọn provider OAuth ní oauthConfig tí a forúkọsílẹ̀ nínú src/lib/oauth/constants/oauth.ts
  • Bí a bá fi provider tuntun kún un: executor tó bá a mu wà nínú open-sse/executors/
  • Bí format náà kò bá jẹ́ ti OpenAI: translator wà nínú open-sse/translator/
  • A forúkọsílẹ̀ àwọn model nínú open-sse/config/providerRegistry.ts
  • Àwọn unit test nínú tests/unit/ bo ìpínsọ̀rí àti routing provider

Desktop (Electron)

electron/ bá yí padà:

  • npm run electron:smoke:packaged kọjá
  • A dán àwọn build wò fún ó kéré tán ọ̀kan lára :win, :mac, :linux
  • Àwọn cert fífi ìbuwọ́lu sí kóòdù kò tíì parí (bí a bá ń fi ìbuwọ́lu sí i)
  • Version electron/package.json bá ti root package.json mu
  • A ṣe ìmúdójúìwọ̀n atọ́ka channel ìmúdójúìwọ̀n aládàáṣe bí a bá ń tú sí stable

Ìṣètò Build

Repository náà ń lo directory àbájáde mẹ́ta ọ̀tọ̀ọ̀tọ̀ — má ṣe dà wọ́n pọ̀ láéláé:

Directory Ète A ń tọ́pinpin?
src/ Orísun application (TypeScript / TSX) Bẹ́ẹ̀ ni
.build/ Àwọn ohun àárín build — àbájáde next build (distDir) Rárá (gitignored)
dist/ Bundle npm tí a lè fi ránṣẹ́ — tí assembleStandalone kó jọ Rárá (gitignored)

Àkọsílẹ̀ fún olùdarí: directory image VPS jíjìn ṣì jẹ́ /usr/lib/node_modules/omniroute/app/. Àbájáde build inú repo nìkan ló ṣí (app/dist/). Àwọn skill deploy máa ń fi rsync gbe àwọn àkóónú dist/ sínú dir app/ jíjìn — kò sí ìyípadà path VPS tí a nílò.

Ìṣàn build-ẹyọkan:

npm run build:release
  └─ rm -rf .build dist          (fọ́ ọ mọ́)
  └─ next build → .build/next/   (àwọn ohun àárín)
  └─ assembleStandalone          (ń da standalone + static + public + natives kọ sínú dist/)
  └─ writes dist/BUILD_SHA       (àmì ìṣọ́ HEAD)

MÁ ṢE ṣiṣẹ́ npm run build tí o sì tẹ̀lé e pẹ̀lú npm run build:cli lọ́tọ̀ fún deploy — lo npm run build:release tí ó ṣe àtúnkọ́ mímọ́ + àmì ìṣọ́ nínú command kan.

Ìfìdí Artifact Múlẹ̀

  • npm run build:release ṣàṣeyọrí, dist/BUILD_SHA == git rev-parse --short HEAD
  • npm run check:pack-artifact mọ́ — kò sí app.__qa_backup, scripts/scratch, package-lock.json, tàbí ìyókù local mìíràn
  • dist/server.js wà lẹ́yìn build

Fífi Tag Sí & Ìtújáde

  • Ṣiṣẹ́ /generate-release-cc (skill Claude Code):
    • Ṣẹ̀dá tag vX.Y.Z
    • Push tag àti branch
    • Ṣí GitHub Release pẹ̀lú àkóónú changelog
    • So àwọn installer Electron mọ́ ọn (bí a bá kọ́ wọn)
  • Tàbí ṣe é lọ́wọ́:
    git tag -a vX.Y.Z -m "Ìtújáde vX.Y.Z"
    git push origin vX.Y.Z
    gh release create vX.Y.Z --notes-from-tag
    

Deploy

Àwọn skill deploy ń lo ìṣàn rsync fẹ́ẹrẹ́ — kò sí npm pack, kò sí npm i -g:

  • Lo skill deploy tí ó bá ibi àfojúsùn mu:
    • /deploy-vps-local-cc — VPS local (192.168.0.15)
    • /deploy-vps-akamai-cc — Akamai VPS (69.164.221.35)
    • /deploy-vps-both-cc — méjèèjì
  • Kí o tó deploy, jẹ́rìí pé dist/BUILD_SHA == git rev-parse --short HEAD
  • Build gbọ́dọ̀ ṣiṣẹ́ níbi tí node_modules ti jẹ́ ojúlówó (checkout àkọ́kọ́ tàbí worktree tí a ti ṣe npm ci sí — KÌ Í ṢE worktree tí a fi symlink ṣe)
  • Ṣe smoke test fún instance tí a deploy:
    • Ṣí /dashboard/health → ṣàyẹ̀wò pé string version bá ìtújáde mu
    • Ṣiṣẹ́ request /v1/chat/completions sí provider tí a mọ̀
    • Jẹ́rìí pé /api/monitoring/health dá àwọn circuit breaker CLOSED padà
    • Jẹ́rìí pé àwọn transport MCP ń dáhùn (/mcp HTTP, /mcp-sse SSE)

Lẹ́yìn ìtújáde

  • Ṣiṣe /capture-release-evidences-cc (ọgbọ́n Claude Code)
    • Yíya àwọn àwòrán ojú-iboju/àwọn àkọsílẹ̀ WebP ti àwọn ẹ̀yà tuntun
    • So wọ́n mọ́ àwọn àkọsílẹ̀ ìtújáde / àpilẹ̀kọ búlọọ́gì
  • Ṣe ìmúdójúìwọ̀n GitHub Discussions / Discord pẹ̀lú ìkéde ìtújáde
  • Ṣí àmì-ìpele fún ẹ̀yà tó kàn
  • Tí ó bá ṣe pàtàkì: lẹ ìjíròrò mọ́ òkè tàbí fi ránṣẹ́ sínú news.json fún báńnà inú-ìṣàfilọ́lẹ̀

Ẹnu-ọ̀nà ìfilọ́lẹ̀ Radar fún gbogbo ènìyàn

A mọ̀ọ́mọ̀ ṣe ìfipamọ́ ìkéde Radar pẹ̀lú active: false. Ṣíṣe é jẹ́ alágbára jẹ́ ìyípadà ọ̀tọ̀ lẹ́yìn tí ẹ̀rí bá wà fún gbogbo ohun tó wà nísàlẹ̀:

  • Gbogbo àwọn Radar PR tí a tò léra ni a ti darapọ̀, CI release-tip sì jẹ́ àwọ̀ ewé
  • Ṣàgbékalẹ̀ kí o sì ṣe ìdánwò smoke lórí àwọn ipa-ọ̀nà OSS Radar, pẹ̀lú RADAR_ENABLED tí ó ṣì wà ní pípa gẹ́gẹ́ bí àtìlẹ́yìn
  • Ṣe ìdánwò smoke fún GET /planos, /termos, /privacidade, àti /reembolso lórí olùgbàlejò Radar tí a dárúkọ
  • Ṣàkọsílẹ̀ ìdánimọ̀/alátagbà/àdírẹ́sì olùṣiṣẹ́ àti àyẹ̀wò òfin tí olówó fọwọ́ sí nínú iṣẹ́ aládàáni
  • Dán Stripe Checkout àti webhook tí a fọwọ́ sí wò ní ipò ìdánwò nìkan
  • Dán ìfiránṣẹ́ ímeèlì ìbánisọ̀rọ̀ oníṣírò kan wò pẹ̀lú olùfiránṣẹ́/agbegbe tí a fọwọ́ sí
  • Ṣe ẹ̀rí ìmúpadàbọ̀sípò afẹ́yìntì àti ìṣiṣẹ́ ìwádìí kan tí a ń ṣọ́, tí a sì fi òpin ìnáwó sí
  • Fọwọ́ sí ìlànà àyẹ̀wò BRL/PIX kí a tó gba ẹ̀rí ọrẹ
  • Jẹ́ kí Checkout gbogbogbò ṣiṣẹ́ lẹ́yìn àwọn ẹnu-ọ̀nà tó ṣáájú nìkan, lẹ́yìn náà sì mú ID tuntun news.json ṣiṣẹ́
  • Ṣàyẹ̀wò pé báńnà Home ń lo ẹ̀dà tí a ṣe sí èdè agbègbè àti pé ID tuntun máa ń tún farahàn lẹ́yìn tí a bá ti pa ID àgbà kan tì

Ìdánwò smoke fún Àwọn Iṣẹ́ Àfikún (v3.8.4+)

Ṣáájú fífi ìtújáde èyíkéyìí tí ó ní àwọn àyípadà sí àwọn iṣẹ́ àfikún jáde, ṣàyẹ̀wò pé:

Ìbẹ̀rẹ̀ Fresh-DB (ń ṣàwárí ìkọlù migration — a ṣàfikún rẹ̀ lẹ́yìn hotfix v3.8.4)

  • DATA_DIR=$(mktemp -d) npm start & — dúró fún 10 s kí ó lè bẹ̀rẹ̀
  • curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'"9router" padà (KÌ Í ṢE 404, KÌ Í ṢE 500). Èyí fìdí rẹ̀ múlẹ̀ pé migration 071_services.sql ti ṣiṣẹ́ àti pé a ti fi row ìbẹ̀rẹ̀ kún un.
  • sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at" dá rows 3 padà.
  • sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted" dá rows 2 padà (ó fìdí rẹ̀ múlẹ̀ pé 070_webhooks_kind_metadata.sql ti ṣiṣẹ́).
  • node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts kọjá — ó ń dáàbò bo lòdì sí àwọn ìkọlù ọjọ́ iwájú.

9Router

  • POST /api/services/9router/install dá 200 padà pẹ̀lú installedVersion láàárín àkókò tí kò ju 2 min lọ
  • POST /api/services/9router/start dá 200 àti state: "running" padà láàárín àkókò tí kò ju 30 s lọ
  • GET /api/services/9router/status jùmọ̀ọ́ pé health: "healthy"
  • POST /v1/chat/completions pẹ̀lú "model": "9router/auto/..." dá 200 padà (routing láti ìbẹ̀rẹ̀ dé òpin nípasẹ̀ 9Router)
  • GET /dashboard/providers/services/9router/embed/dashboard ṣe àfihàn UI abinibi 9Router nínú proxy (láìlo iframe 127.0.0.1:port tààrà)
  • POST /api/services/9router/rotate-key{ keyRotated: true } padà, iṣẹ́ náà sì tún bẹ̀rẹ̀ láìsí ìṣòro
  • POST /api/services/9router/stop dá 200 àti state: "stopped" padà
  • GET /api/services/9router/logs?tail=50 dá ṣiṣan SSE padà pẹ̀lú event snapshot tí ó ní àwọn lines àìpẹ́
  • Fífi sílẹ̀ nínú environment tí kò ní npm nínú PATH dá 500 padà pẹ̀lú ìfiránṣẹ́ àṣìṣe tó rọrùn láti lóye (tí kì í ṣe stack trace)

CLIProxyAPI

  • POST /api/services/cliproxy/install dá 200 padà láàárín àkókò tí kò ju 2 min lọ
  • POST /api/services/cliproxy/start dá 200 àti state: "running" padà láàárín àkókò tí kò ju 30 s lọ
  • GET /api/services/cliproxy/status jùmọ̀ọ́ pé health: "healthy"
  • POST /api/services/cliproxy/stop dá 200 àti state: "stopped" padà
  • GET /api/services/cliproxy/logs?tail=50 dá ṣiṣan SSE padà

Ìdánwò ìpadàsẹ́yìn ààbò

  • curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start403 LOCAL_ONLY padà
  • curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start403 LOCAL_ONLY padà
  • Àwọn response àṣìṣe láti /api/services/* kò ní err.stack tàbí àwọn file paths pípé

Àwọn àyẹ̀wò v3.8.0+

Ṣáájú fífi ìtújáde v3.8.x èyíkéyìí jáde, ṣàyẹ̀wò àwọn nǹkan àfikún wọ̀nyí:

  • omniroute --tray bẹ̀rẹ̀ lórí macOS (a fi systray2 sí inú ~/.omniroute/runtime/)
  • omniroute --tray bẹ̀rẹ̀ lórí Linux (ó nílò DISPLAY; àṣìṣe tó bójú mu tí a kò bá ṣètò rẹ̀)
  • omniroute --tray bẹ̀rẹ̀ lórí Windows (PowerShell NotifyIcon, kò sí binaries àfikún)
  • omniroute config tray enable ṣẹ̀dá entry autostart; disable yọ ọ́ kúrò
  • npm install -g omniroute@<this-version> ṣiṣẹ́ postinstall láìjáde nítorí àṣìṣe tó burú
  • Ọ̀nà update pa àwọn deps àṣàyàn mọ́: omniroute update --apply àti auto-updater ń ṣiṣẹ́ npm install -g … --include=optionaloptionalDependencies (better-sqlite3, keytar, tls-client, àti stack SLM llmlingua: @atjsh/llmlingua-2@2.0.5, js-tiktoken) lè yè lẹ́yìn update. Tier SLM ultra modelPath tún nílò model tinybert, tí a máa ń download láìfọwọ́ṣe sí ${DATA_DIR}/models/llmlingua ní ìlò àkọ́kọ́. Postinstall (scripts/build/colocateOptionals.mjs) lẹ́yìn náà máa ń kó closure àṣàyàn SLM sí ibi kan nínú dist/node_modules kí worker lè resolve instance @huggingface/transformers ^4.2.0 KAN ṢOṢO — trace adádúró náà máa ń bundle transformers nìkan, kì í bundle àwọn optionals tí a import ní ìgbà ìṣiṣẹ́, nítorí náà láìsí èyí worker yóò load llmlingua-2 pẹ̀lú transformers ti root, tier SLM yóò sì fail-open ní ìdákẹ́jẹ́.
  • omniroute status ṣiṣẹ́ láìsí .env (ọ̀nà token CLI, loopback nìkan)
  • curl http://localhost:20128/api/shutdown dá 401 padà (route tí a máa ń dáàbò bo nígbà gbogbo)
  • curl -H "host: evil.com" http://localhost:20128/api/mcp/sse dá 401 padà (loopback guard)
  • Runtime SQLite resolve sí bundled ní ìṣiṣẹ́ àkọ́kọ́ (binary bundled wúlò fún platform náà)
  • Runtime SQLite padà sí runtime nígbà tí a bá pa node_modules/better-sqlite3 rẹ́
  • Filter Smart MCP compress output gidi playwright-mcp browser_snapshot (ìdínkù ≥50%)
  • Gbogbo files skills/omniroute*/SKILL.md mẹ́wàá ṣeé fetch fún gbogbo ènìyàn nípasẹ̀ raw GitHub URL
  • Wizard onboarding fi ìgbésẹ̀ ìrìnàjò tier "Bí Ó Ṣe Ń Ṣiṣẹ́" hàn lórí setup tuntun
  • Widget tier coverage lórí dashboard Home fi iye tí a ti configure àti iye active hàn

Ìpadà-sẹ́yìn

Tí ìtújáde bá ní ìṣòro tó ṣe pàtàkì:

  1. gh release edit vX.Y.Z --prerelease (èyí máa samì sí i pé kì í ṣe èyí tuntun jù lọ)
  2. git tag -d vX.Y.Z && git push --delete origin vX.Y.Z (kìkì tí àwọn aṣàmúlò kò bá tíì bẹ̀rẹ̀ sí í lò ó)
  3. Tàbí: ṣe àtúnṣe-kíákíá lórí release/vX.Y.0 → ìtújáde àtúnṣe vX.Y.(Z+1)
  4. Fi ìròyìn náà ránṣẹ́ lẹ́sẹ̀kẹsẹ̀ nínú GitHub Discussions àti Discord

Àwọn Òfin Tí Kò Gbọ́dọ̀ Yí Padà

  • Má ṣe commit tààrà sí main
  • Má ṣe lo git push --forcemain tàbí àwọn ẹ̀ka release/*
  • Má ṣe fo àwọn Husky hooks (--no-verify)
  • Má ṣe commit àwọn àṣírí, ẹ̀rí ìdánimọ̀, tàbí àwọn fáìlì .env
  • Ìbora ìdánwò gbọ́dọ̀ wà ní ≥60/60/60/60 (àwọn gbólóhùn/àwọn ìlà/àwọn iṣẹ́/àwọn ẹ̀ka)
  • Fi àwọn ìdánwò kún un tàbí ṣe àfikún sí wọn nígbà gbogbo tí o bá ń yí kóòdù iṣẹ́ gidi padà nínú src/, open-sse/, electron/, tàbí bin/

Àyẹ̀wò Ìmúdójúìwọ̀n Aládàáṣiṣẹ́

Ṣe olùṣọ́ ìmúdójúìwọ̀n àkọsílẹ̀ ní abẹ́lẹ̀ kọ̀ǹpútà rẹ kí o tó ṣí PR kan:

npm run check:docs-sync

CI tún máa ń ṣe àyẹ̀wò yìí nínú .github/workflows/ci.yml (iṣẹ́ lint).