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
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-prsfamily +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é:
npm stage list omniroute— wá stage id náà (a tún tẹ̀ ẹ́ jáde nínú àkótán workflow).- Ṣà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ṣẹ́). npm stage approve <id>— ìbéèrè 2FA náà GAN-AN ni ìtẹ̀jáde.npm stage reject <id>ń sọ ọ́ nù.- À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):
- Ì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ẹ́”.
- Àṣẹ: olówó repository nìkan ló lè fi àmì
hotfixsí. Àmì náà GAN-AN ni ìfọwọ́sí — kò gbọdọ̀ jẹ́ ohun tí ẹni fúnra rẹ̀ ṣe lórí PR campaign kan. - Ẹ̀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á.
- Àà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.jsonsó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
- Ó ń gbé version
- Ṣà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.mdbá versionpackage.jsonmu - 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.yaml→info.versiongbọ́dọ̀ bá versionpackage.jsonmu
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íponpm run check:any-budget:t11— ó wà láàárín budgetnpm 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_RANGEnínúsrc/shared/utils/nodeRuntimeSupport.ts; ó bápackage.jsonenginesmu)
Ì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 VPSroot@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.15tó 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:unitkúrò (ó lọ́ra; job CItest-unitló ń bójú tó o).- Ṣiṣe
npm run test:unitpẹ̀lú ọwọ́ ṣáájú pípa ẹ̀ka release ránṣẹ́.
- Ṣiṣe
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-synckọjá (pre-commit máa ń ṣiṣẹ́ rẹ̀ láìfọwọ́ṣe)npm run check:docs-allkọjá (àkójọpọ̀: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links)npm run check:env-doc-syncjáde pẹ̀lú 0 — àdéhùn env láàárín kóòdù ↔.env.example↔docs/reference/ENVIRONMENT.mdṣì péyenpm run check:doc-linksjá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.mdfún ìyapa ibi ìpamọ́/àsìkò-ṣiṣẹ́ - A ti ṣàyẹ̀wò
docs/guides/TROUBLESHOOTING.mdfún ìyapa env var àti ìṣiṣẹ́ - Bí
.env.examplebá yí padà: ṣe ìmúdójúìwọ̀ndocs/reference/ENVIRONMENT.md - Bí ẹ̀ya tuntun bá ní UI:
docs/guides/USER_GUIDE.mdmẹ́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>.mdtí a yà sọ́tọ̀ wà - Bí ó bá jẹ́ àyípadà tí ń fọ́ ìbámu:
docs/guides/TROUBLESHOOTING.mdní àkọsílẹ̀ ìṣíkiri
i18n
npm run i18n:checkjá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-coveragejáde pẹ̀lú 0 — gbogbo locale UI wà ní tàbí lókè ìwọ̀n ìborí 80%npm run i18n:sync-ui:dryjà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_KEYní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
- Bí
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ọ́)
- Ìṣíkiri kọ̀ọ̀kan jẹ́ idempotent (
- Dán an wò lórí ìfìsí tuntun: pa
~/.omniroute/omniroute.dbrẹ́, 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.tspé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è
freeNotefún àwọn provider ọ̀fẹ́ tuntun - Àwọn provider OAuth ní
oauthConfigtí a forúkọsílẹ̀ nínúsrc/lib/oauth/constants/oauth.ts
- Gbogbo provider ní àwọn field tí a nílò (
- 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)
Bí electron/ bá yí padà:
npm run electron:smoke:packagedkọ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.jsonbá ti rootpackage.jsonmu - 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ú dirapp/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 HEADnpm run check:pack-artifactmọ́ — kò síapp.__qa_backup,scripts/scratch,package-lock.json, tàbí ìyókù local mìíràndist/server.jswà 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)
- Ṣẹ̀dá tag
- 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_modulesti jẹ́ ojúlówó (checkout àkọ́kọ́ tàbí worktree tí a ti ṣenpm cisí — 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/completionssí provider tí a mọ̀ - Jẹ́rìí pé
/api/monitoring/healthdá àwọn circuit breakerCLOSEDpadà - Jẹ́rìí pé àwọn transport MCP ń dáhùn (
/mcpHTTP,/mcp-sseSSE)
- Ṣí
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.jsonfú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_ENABLEDtí ó ṣì wà ní pípa gẹ́gẹ́ bí àtìlẹ́yìn - Ṣe ìdánwò smoke fún
GET /planos,/termos,/privacidade, àti/reembolsoló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'dá"9router"padà (KÌ Í ṢE 404, KÌ Í ṢE 500). Èyí fìdí rẹ̀ múlẹ̀ pé migration071_services.sqlti ṣ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.sqlti ṣiṣẹ́).node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.tskọjá — ó ń dáàbò bo lòdì sí àwọn ìkọlù ọjọ́ iwájú.
9Router
POST /api/services/9router/installdá 200 padà pẹ̀lúinstalledVersionláàárín àkókò tí kò ju 2 min lọPOST /api/services/9router/startdá 200 àtistate: "running"padà láàárín àkókò tí kò ju 30 s lọGET /api/services/9router/statusjùmọ̀ọ́ péhealth: "healthy"POST /v1/chat/completionspẹ̀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 iframe127.0.0.1:porttààrà)POST /api/services/9router/rotate-keydá{ keyRotated: true }padà, iṣẹ́ náà sì tún bẹ̀rẹ̀ láìsí ìṣòroPOST /api/services/9router/stopdá 200 àtistate: "stopped"padàGET /api/services/9router/logs?tail=50dá ṣiṣan SSE padà pẹ̀lú eventsnapshottí ó ní àwọn lines àìpẹ́- Fífi sílẹ̀ nínú environment tí kò ní
npmní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/installdá 200 padà láàárín àkókò tí kò ju 2 min lọPOST /api/services/cliproxy/startdá 200 àtistate: "running"padà láàárín àkókò tí kò ju 30 s lọGET /api/services/cliproxy/statusjùmọ̀ọ́ péhealth: "healthy"POST /api/services/cliproxy/stopdá 200 àtistate: "stopped"padàGET /api/services/cliproxy/logs?tail=50dá ṣ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/startdá403 LOCAL_ONLYpadàcurl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/startdá403 LOCAL_ONLYpadà- Àwọn response àṣìṣe láti
/api/services/*kò níerr.stacktà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 --traybẹ̀rẹ̀ lórí macOS (a fi systray2 sí inú~/.omniroute/runtime/)omniroute --traybẹ̀rẹ̀ lórí Linux (ó nílò DISPLAY; àṣìṣe tó bójú mu tí a kò bá ṣètò rẹ̀)omniroute --traybẹ̀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=optionalkíoptionalDependencies(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 ultramodelPathtún nílò model tinybert, tí a máa ń download láìfọwọ́ṣe sí${DATA_DIR}/models/llmlinguaní ì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_moduleskí 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/shutdowndá 401 padà (route tí a máa ń dáàbò bo nígbà gbogbo)curl -H "host: evil.com" http://localhost:20128/api/mcp/ssedá 401 padà (loopback guard)- Runtime SQLite resolve sí
bundlední ìṣiṣẹ́ àkọ́kọ́ (binary bundled wúlò fún platform náà) - Runtime SQLite padà sí
runtimenígbà tí a bá panode_modules/better-sqlite3rẹ́ - Filter Smart MCP compress output gidi
playwright-mcp browser_snapshot(ìdínkù ≥50%) - Gbogbo files
skills/omniroute*/SKILL.mdmẹ́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ì:
gh release edit vX.Y.Z --prerelease(èyí máa samì sí i pé kì í ṣe èyí tuntun jù lọ)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ò ó)- Tàbí: ṣe àtúnṣe-kíákíá lórí
release/vX.Y.0→ ìtújáde àtúnṣevX.Y.(Z+1) - 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 --forcesímaintàbí àwọn ẹ̀karelease/* - 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).