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
43 KiB
Release Checklist (Հայերեն)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Վերջին թարմացումը՝ 2026-08-28 — v3.8.51 Պարզեցված թողարկման գործընթաց, որն ավտոմատացման համար օգտագործում է Claude Code-ի հմտությունները։
Թողարկումների միջև հերթը/ճյուղը պահեք անխափան վիճակում՝ տե՛ս RELEASE_GREEN.md (
/green-prsհրամանների ընտանիք +npm run check:release-green+/babysit+ գիշերային գործարկում)։ Սա պարբերաբար, և հատկապես այս ստուգաթերթից առաջ, գործարկելը նպաստում է, որ թողարկման PR-ը սկզբից իսկ լինի անխափան վիճակում։
Կարճ ամփոփում
# 1. Բարձրացրեք տարբերակը + ստեղծեք CHANGELOG (հմտություն)
/version-bump-cc patch # կամ minor/major
# 2. Տեղային միջավայրում գործարկեք որակի ստուգումը
npm run check # lint + թեստեր
npm run test:coverage # ծածկույթի ամբողջական շեմ (60/60/60/60)
# 3. Կառուցեք և կատարեք նախնական ստուգում
npm run build
npm run test:e2e # ոչ պարտադիր, բայց խորհուրդ է տրվում
# 4. Ստեղծեք թողարկումը (հմտություն)
/generate-release-cc
# 5. Տեղակայեք (հմտություն)
/deploy-vps-both-cc # կամ akamai-cc / local-cc
# 6. Հավաքեք թողարկման ապացույցները (հմտություն)
/capture-release-evidences-cc
npm Trusted Publishing (լռելյայն՝ սկսած v3.8.51-ից) — ըստ պահանջի՝ փուլային, որպես պահուստային տարբերակ՝ ուղղակի
npm-publish.yml-ը լռելյայն հրապարակում է npm Trusted Publishing (OIDC)-ի միջոցով․
stage-npm առաջադրանքը (github-hosted) տվյալ գործարկման համար GitHub-ի id-token-ը փոխանակում է կարճաժամկետ npm
հավատարմագրի հետ՝ առանց պահոցային գաղտնիքներում երկարաժամկետ npm նշան պահելու, առանց 2FA հարցման և կցված ծագման ապացույցով։
Սա npm-ի կողմից այժմ թույլատրված շրջանցումն է, քանի որ 2FA-ն բաց թողնող նշանները հանվում են շրջանառությունից․
այն վերականգնում է մինչև v3.8.48-ը նախագծում գործող ամբողջովին ավտոմատ հոսքը՝ միաժամանակ պահպանելով
WS1.3 երաշխիքը (արտահոսած նշանը չի կարող ինքնուրույն հրապարակել, քանի որ նշան գոյություն չունի)։
Մեկանգամյա կարգավորում (սեփականատեր)․ npmjs.com → omniroute փաթեթ → Settings → Trusted
Publisher → GitHub: owner diegosouzapw, repo OmniRoute, workflow npm-publish.yml
(environment: none)։ Մինչև դրա առկայությունը ավտոմատ քայլը ձախողվում է ENEEDAUTH-ով․
կրկին գործարկեք publish_mode=staged-ով (ստորև) կամ direct-ով։
Փուլային հրապարակում (ըստ պահանջի՝ publish_mode=staged)
npm-publish աշխատանքային հոսքն այլևս ուղղակիորեն չի հրապարակում․ այն գործարկում է փաթեթավորված tarball-ը
(check:pack-boot), ապա կատարում npm stage publish․ ռեեստրում պահվում են հենց այդ բայթերը, որոնք
հնարավոր չէ տեղադրել, մինչև սեփականատերը չհաստատի։ Մարդու մասնակցությամբ 2FA սահմանակետը տեղափոխվել է
ապացուցումից ՀԵՏՈ, ոչ թե դրանից առաջ։
Սեփականատիրոջ գործողությունները աշխատանքային հոսքի հաջող ավարտից հետո․
npm stage list omniroute— գտեք փուլի id-ն (այն նաև ցուցադրվում է աշխատանքային հոսքի ամփոփագրում)։- Ստուգեք փուլային բայթերը (խորհուրդ է տրվում)․
npm stage download <id>, ապա ներբեռնված tarball-ը տեղադրեք ժամանակավոր prefix-ում և գործարկեք այն (npm run check:pack-boot-ը CI-ում ավտոմատացնում է նույն pack→install→boot ստուգման արդյունքը)։ npm stage approve <id>— 2FA հարցումն ԻՆՔՆԻՆ հրապարակումն է։npm stage reject <id>-ը չեղարկում է այն։- Հրապարակումից հետո անվտանգության ցանց․ հրապարակումից հետո ստուգիչը (v3.8.49 ծրագրի WS1.4) մաքուր կոնտեյներում հանրային ռեեստրից տեղադրում և գործարկում է հրապարակված տարբերակը։
Արտակարգ պահուստային տարբերակ․ workflow_dispatch-ը publish_mode=direct-ով վերականգնում է
ժառանգված անմիջական npm publish-ը (օգտագործեք միայն այն դեպքում, երբ փուլային հրապարակումն ինքն է սխալ աշխատում, և գրանցեք պատճառը)։
Մեկանգամյա խստացում (սեփականատեր, npmjs.com)․ omniroute-ի համար կազմաձևեք Trusted Publisher-ը
միայն փուլային ռեժիմով, որպեսզի արտահոսած երկարաժամկետ նշանը չկարողանա որևէ տեղից ուղղակիորեն կատարել npm publish․
CI-ն կարող է միայն փուլային հրապարակում կատարել, իսկ թողարկումը կարող է իրականացնել միայն սեփականատիրոջ 2FA-ն։
Խափանված արտեֆակտի ընթացակարգ (անփոփոխ)․ որպես լռելյայն առաջին քայլ օգտագործեք npm deprecate omniroute@<bad> "<reason> — use <fixed>"
(տևում է րոպեներ, հետադարձելի է)․ npm unpublish օգտագործեք միայն 72-ժամյա/կախյալներ չունենալու
պատուհանում և երբեք՝ որպես առաջին քայլ։ Docker․ երբեք մի վերագրեք տարբերակի թեգը․ հետադարձ անցումը
latest-ը վերջին ճիշտ digest-ին վերաուղղելն է։
Docker Hub-ի latest (պարտադիր յուրաքանչյուր կայուն SemVer հրապարակման դեպքում)․
docker-publish աշխատանքային հոսքը պետք է թեգավորի և՛ X.Y.Z-ը, և՛, երբ
should-promote-latest.sh-ը հաստատում է, որ սա ամենաբարձր կայուն SemVer-ն է, :latest-ը՝
նույն digest-ով։ Առաջադրանքից հետո Hub-ի latest digest-ը պետք է հավասար լինի նոր
SemVer digest-ին, իսկ last_updated-ը՝ թարմացված լինի։ Մի թողեք :latest-ը հին
կառուցման վրա, երբ թողարկման նշումներում խոսվում է ուղղումների մասին, որոնք առկա են միայն git-ում։
Compose-ի արագ մեկնարկներն օգտագործում են :latest, իսկ GitOps-ը պետք է շարունակի ամրագրել X.Y.Z-ը։ Տե՛ս
Docker-ի թողարկման ալիքներ և #10317։
Թեժ ուղղումների արագ ուղի (hotfix պիտակ)
hotfix պիտակով PR-ը բաց է թողնում CI-ի ծանր մատրիցը (9 հատվածով E2E, ծածկույթի շեմի աստիճանական բարձրացում,
quality-gate, quality-extended) և պահպանում արագ, բարձր ազդանշանային ստուգումները՝ build,
unit հատվածներ, integration, vitest, lint/typecheck, docs-sync, check:pack-artifact
և tarball-ի մեկնարկային smoke ստուգումը (check:pack-boot)։ Նպատակ՝ կանաչ կարգավիճակ ≤15 րոպեում՝ ~33 րոպեի փոխարեն։
Մուտքի քաղաքականություն — բոլոր չորս պայմանները պարտադիր են (Chromium/VS Code/Node արտակարգ ուղիների օրինակով).
- Կրիտիկականություն. արտադրական միջավայրը խափանված է՝ հրապարակված artifact-ը խափանվում է մեկնարկի ժամանակ / անվտանգության ուղղում է / թողարկման յուրաքանչյուր օգտատեր տուժում է։ «Կարևոր»-ը դեռ «խափանված» չէ։
- Լիազորություն. միայն repository-ի սեփականատերն է կիրառում
hotfixպիտակը։ Պիտակն ԻՆՔՆԻՆ հաստատումն է՝ երբեք ինքնուրույն մի կիրառեք campaign PR-ի վրա։ - Ապացույց. PR-ի նկարագրությունը հղում է նախորդ՝ ամբողջությամբ կանաչ ծանր գործարկմանը (այն փաթեթին, որը բաց թողնված job-երը կվերավավերացնեին), ինչպես նաև տվյալ ուղղման՝ սկզբում ձախողվող, ապա հաջող անցնող թեստին։
- Ծավալ. միայն cherry-pick՝ նվազագույն ուղղում, առանց վերակառուցումների և կողմնակի փոփոխությունների։
Բաց թողնված coverage/ratchet մակերեսը վերավավերացվում է release ճյուղի հաջորդ ամբողջական գործարկմամբ (շարունակական release-green). ուղին բաց է թողնում միայն ՍՊԱՍՈՒՄԸ, ոչ երբեք վավերացումը։
Միայն թեստեր պարունակող փոփոխությունները (բոլոր ֆայլերը՝ tests/-ի ներքո, ոչ մեկը՝ tests/e2e/-ի ներքո) ավտոմատ բաց են թողնում E2E
մատրիցը՝ առանց որևէ պիտակի։
Մանրամասն ստուգաթերթ
Թողարկումից առաջ
- Այս թողարկմանը նպատակաուղղված բոլոր PR-երը միավորված են
release/vX.Y.0ճյուղին - Այս տարբերակի համար բոլոր բաց Linear/issue տարրերը փակված են կամ տեղափոխված հաջորդ հանգրվան
- CI-ն կանաչ է
release/vX.Y.0ճյուղում - Կոդում
TODO(release)նշիչներ չկան՝grep -r "TODO(release)" src/ open-sse/ - Docker-ի բազային image-ը արդիական է (ներկայում՝
node:24.15.0-trixie-slim)
Տարբերակ և փոփոխությունների մատյան
- Գործարկել
/version-bump-cc <patch|minor|major>-ը (Claude Code skill)- Թարմացնում է տարբերակը
package.json,electron/package.jsonֆայլերում - Վերագեներացնում է
CHANGELOG.md-ը՝ վերջին tag-ից ի վեր git commit-ների հիման վրա - Թարմացնում է README.md-ի badge-երը
- Թարմացնում է տարբերակը
- Ձեռքով վերանայել CHANGELOG.md-ը և անհրաժեշտության դեպքում մաքրել commit-ների հաղորդագրությունները
- Համոզվել, որ
CHANGELOG.md-ի վերջին semver բաժինը համապատասխանում էpackage.json-ի տարբերակին - Առաջիկա աշխատանքի համար
## [Unreleased]-ը պահել որպես փոփոխությունների մատյանի առաջին բաժին - Թարմացնել
docs/openapi.yaml→info.version-ը պետք է համապատասխանիpackage.json-ի տարբերակին
Կոդի որակ
npm run lint— 0 սխալ (նախազգուշացումները նախկինում առկա են եղել)npm run typecheck:core— անթերիnpm run typecheck:noimplicit:core— անթերի (խիստ)npm run check:cycles— շրջանաձև կախվածություններ չկանnpm run check:any-budget:t11— բյուջեի սահմաններումnpm run check:route-validation:t06— անթերիnpm run check:node-runtime— աջակցվող runtime-ի նվազագույն սահմանը պահպանված է (>=22.22.2 <23,>=24.0.0 <27, ըստsrc/shared/utils/nodeRuntimeSupport.ts-իSUPPORTED_NODE_RANGE-ի՝ համապատասխանեցվածpackage.json-իengines-ին)
Թեստավորում
npm run test:unit— հաջողnpm run test:vitest— հաջող (MCP server, autoCombo, cache)npm run test:coverage— 60/60/60/60 շեմը բավարարված է (հրահանգներ/տողեր/ֆունկցիաներ/ճյուղեր)npm run test:integration— հաջող (եթե փոփոխություններն առնչվում են DB-ին / handler-ներին)npm run test:combo:matrix— հաջող (combo ռազմավարությունների մատրից. որոշակիորեն ապացուցում է բոլոր 19 հրապարակային routing ռազմավարությունների ընտրության որոշումները. գործարկել combo routing-ին, ռազմավարության որոշմանը կամ fallback տրամաբանությանը վերաբերող փոփոխությունների դեպքում)RUN_COMBO_LIVE=1 npm run test:combo:live— ընտրովի/ձեռքով (պայմանով կառավարվող իրական upstream smoke ստուգում. VPS-իroot@192.168.0.15հասցեից վերցնում է միայն ընթերցման համար նախատեսված DB snapshot, դիմում է իրական մատակարարներին, ծախսում է կրեդիտներ, երբեք չի գործարկվում CI-ում, առանց պայմանը միացնելու՝ մաքուր կերպով բաց է թողնվում)npm run test:combo:live:vps— ընտրովի/ձեռքով (Phase-3 VPS կենդանի smoke ստուգում. 7 HTTP սցենար կենդանի.15server-ի նկատմամբ՝ պարզ Node ESM-ի միջոցով. պահանջում էssh root@192.168.0.15, ստեղծում/ջնջում է միայն__live_test__*combo-ներ, դիմում է իրական մատակարարներին, երբեք չի գործարկվում CI-ում)npm run test:e2e— հաջող (UI փոփոխություններ)npm run test:protocols:e2e— հաջող (MCP/A2A փոփոխություններ)npm run test:ecosystem— հաջող
Hook-եր (վավերացված Husky-ով)
Husky hook-երը գտնվում են .husky/-ում և ավտոմատ գործարկվում են git գործողությունների ժամանակ։
- pre-commit:
npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11 - pre-push: արագ և որոշակի ստուգումներ՝
npm run check:any-budget:t11 && npm run check:tracked-artifacts(ակտիվացված՝ 2026-06-13)։ Դիտավորյալ չի ներառումtest:unit-ը (դանդաղ է, ծածկվում է CI-իtest-unitjob-ով)։- Release ճյուղերը push անելուց առաջ ձեռքով գործարկել
npm run test:unit։
- Release ճյուղերը push անելուց առաջ ձեռքով գործարկել
Եթե hook-ը ձախողվում է՝ ուղղեք հիմքում ընկած խնդիրը, մի շրջանցեք այն --no-verify-ով։
Conventional Commits
Թողարկմանը ներառվող բոլոր commit-ները պետք է հետևեն type(scope): subject ձևաչափին։
Վավեր type-եր. feat, fix, refactor, docs, test, chore, perf, style, ci
Վավեր scope-եր. db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz
Հետադարձ համատեղելիությունը խախտող փոփոխություններ. ավելացնել BREAKING CHANGE: վերջնամասը կամ scope-ից հետո ! (օրինակ՝ feat(api)!: drop /v0)։
Փաստաթղթավորում
npm run check:docs-sync-ը հաջողությամբ է անցնում (ավտոմատ գործարկվում է pre-commit-ի միջոցով)npm run check:docs-all-ը հաջողությամբ է անցնում (ընդհանուր ստուգում՝ docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links)npm run check:env-doc-sync-ն ավարտվում է 0 կոդով — կոդ ↔.env.example↔docs/reference/ENVIRONMENT.mdմիջավայրի պայմանագիրը պահպանված էnpm run check:doc-links-ն ավարտվում է 0 կոդով — վերակառուցումից հետո ներքին markdown հղումները կոտրված չենdocs/architecture/ARCHITECTURE.md-ը վերանայված է պահեստավորման/կատարման միջավայրի շեղումների առումովdocs/guides/TROUBLESHOOTING.md-ը վերանայված է միջավայրի փոփոխականների և գործառնական շեղումների առումով- Եթե
.env.example-ը փոխվել է՝docs/reference/ENVIRONMENT.md-ը թարմացված է - Եթե նոր հնարավորությունն ունի UI՝ այն նշված է
docs/guides/USER_GUIDE.md-ում - Եթե նոր հնարավորությունն ունի API՝
docs/reference/API_REFERENCE.md-ը ևdocs/openapi.yaml-ը թարմացված են - Եթե նոր հնարավորությունը մոդուլ է՝ առկա է առանձին
docs/<MODULE>.md - Եթե փոփոխությունը համատեղելիությունը խախտող է՝
docs/guides/TROUBLESHOOTING.md-ում կա միգրացիայի մասին նշում
i18n
npm run i18n:check-ն ավարտվում է 0 կոդով — թարգմանության վիճակը (.i18n-state.json) համաժամեցված է սկզբնաղբյուր փաստաթղթերի հետ (խիստ ռեժիմում շեղված սկզբնաղբյուրներ չկան․ զգուշացման ռեժիմի խորհրդատվական հաղորդագրություններն ընդունելի են փաստաթղթերի վերջին րոպեի շտկումների համար, սակայն մինչև պիտակավորումը արդյունքը պետք է լինի 0)npm run i18n:check-ui-coverage-ն ավարտվում է 0 կոդով — UI-ի յուրաքանչյուր տեղայնացում ունի առնվազն 80% ծածկույթnpm run i18n:sync-ui:dry-ը բոլոր 42 տեղայնացումների համար հաղորդում է 0 բացակայող բանալի- Եթե սկզբնաղբյուր անգլերեն փաստաթղթերը փոխվել են, նախքան պիտակավորումը գործարկեք
npm run i18n:run(պահանջում էOMNIROUTE_TRANSLATION_API_KEY՝.env-ում) - Թարգմանության ներդրումները, եթե աննշան են, կարելի է հետաձգել մինչև հաջորդ թողարկումը (հետևել CHANGELOG-ում)
Տվյալների բազայի միգրացիաներ
- Եթե
src/lib/db/migrations/-ում նոր ֆայլեր կան՝- Յուրաքանչյուր միգրացիա իդեմպոտենտ է (
CREATE TABLE IF NOT EXISTSև այլն) - Միգրացիաները ներառված են տրանզակցիաների մեջ
- Համարակալումը ճիշտ է (հաջորդականության մեջ բացեր չկան)
- Յուրաքանչյուր միգրացիա իդեմպոտենտ է (
- Փորձարկեք նոր տեղադրման դեպքում՝ ջնջեք
~/.omniroute/omniroute.db-ը և գործարկեքnpm run dev - Փորձարկեք գոյություն ունեցող տեղադրման դեպքում՝ պահուստավորեք DB-ն, գործարկեք միգրացիան և ստուգեք սխեման
- Եթե միգրացիան վերագրում է աղյուսակները, համոզվեք, որ WAL ֆայլերը (
-wal,-shm) ճիշտ են մշակվում
Մատակարարների կատալոգ (վավերացված Zod-ով)
src/shared/constants/providers.ts-ի Zod սխեման բեռնման պահին վավեր է- Բոլոր մատակարարներն ունեն պարտադիր դաշտերը (
id,label,kindև այլն) - Նոր անվճար մատակարարների համար տրամադրված է
freeNote - OAuth մատակարարների
oauthConfig-ը գրանցված էsrc/lib/oauth/constants/oauth.ts-ում
- Բոլոր մատակարարներն ունեն պարտադիր դաշտերը (
- Եթե նոր մատակարար է ավելացվել՝ համապատասխան կատարիչը գտնվում է
open-sse/executors/-ում - Եթե ձևաչափը OpenAI-ինը չէ՝ թարգմանիչը գտնվում է
open-sse/translator/-ում - Մոդելները գրանցված են
open-sse/config/providerRegistry.ts-ում tests/unit/-ի միավորային թեստերը ծածկում են մատակարարների դասակարգումն ու երթուղավորումը
Աշխատասեղանային հավելված (Electron)
Եթե electron/-ը փոխվել է՝
npm run electron:smoke:packaged-ը հաջողությամբ է անցնում- Կառուցումները փորձարկված են
:win,:mac,:linuxտարբերակներից առնվազն մեկի համար - Կոդի ստորագրման վկայագրերի ժամկետը լրացած չէ (եթե ստորագրում է կատարվում)
electron/package.json-ի տարբերակը համընկնում է արմատայինpackage.json-ի տարբերակին- Եթե թողարկումը կատարվում է
stableալիքում, ավտոմատ թարմացման ալիքի ցուցիչը թարմացված է
Կառուցման դասավորություն
Շտեմարանն օգտագործում է ելքային երեք առանձին գրացուցակ — երբեք մի խառնեք դրանք․
| Գրացուցակ | Նպատակ | Հետագծվո՞ւմ է |
|---|---|---|
src/ |
Հավելվածի սկզբնաղբյուր (TypeScript / TSX) | Այո |
.build/ |
Կառուցման միջանկյալ նյութեր — next build-ի ելք (distDir) |
Ոչ (gitignored) |
dist/ |
Առաքման ենթակա npm փաթեթ — հավաքվում է assembleStandalone-ի միջոցով |
Ոչ (gitignored) |
Օպերատորի նշում․ հեռակա VPS պատկերի գրացուցակը մնում է
/usr/lib/node_modules/omniroute/app/։ Փոխվել է միայն շտեմարանի ներսում գտնվող կառուցման ելքը (app/→dist/)։ Տեղակայման հմտությունները rsync-ի միջոցովdist/-ի բովանդակությունը փոխանցում են հեռակաapp/գրացուցակ — VPS-ի ուղիները փոխելու կարիք չկա։
Մեկ կառուցմամբ ընթացք․
npm run build:release
└─ rm -rf .build dist (մաքրում)
└─ next build → .build/next/ (միջանկյալ նյութեր)
└─ assembleStandalone (ինքնուրույն տարբերակը + static + public + բնիկ բաղադրիչները պատճենում է dist/)
└─ գրում է dist/BUILD_SHA (HEAD հսկիչ արժեք)
Տեղակայման համար ՄԻ՛ գործարկեք npm run build, ապա առանձին npm run build:cli — օգտագործեք
npm run build:release, որը մեկ հրամանով կատարում է մաքուր վերակառուցում և ստեղծում հսկիչ արժեքը։
Արտեֆակտի վավերացում
npm run build:release-ը հաջողվում է, ևdist/BUILD_SHA==git rev-parse --short HEADnpm run check:pack-artifact-ը մաքուր է — չկանapp.__qa_backup,scripts/scratch,package-lock.jsonկամ այլ տեղային մնացորդներ- Կառուցումից հետո
dist/server.js-ը գոյություն ունի
Պիտակավորում և թողարկում
- Գործարկեք
/generate-release-cc-ը (Claude Code-ի հմտություն)՝- Ստեղծում է
vX.Y.Zպիտակը - Ուղարկում է պիտակը և ճյուղը
- Բացում է GitHub Release՝ փոփոխությունների մատյանի բովանդակությամբ
- Կցում է Electron-ի տեղադրիչները (եթե կառուցվել են)
- Ստեղծում է
- Կամ ձեռքով՝
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
Տեղակայում
Տեղակայման հմտություններն օգտագործում են թեթև rsync ընթացքը — առանց npm pack-ի և npm i -g-ի․
- Օգտագործեք նպատակային միջավայրին համապատասխանող տեղակայման հմտությունը՝
/deploy-vps-local-cc— տեղային VPS (192.168.0.15)/deploy-vps-akamai-cc— Akamai VPS (69.164.221.35)/deploy-vps-both-cc— երկուսն էլ
- Տեղակայումից առաջ հաստատեք, որ
dist/BUILD_SHA==git rev-parse --short HEAD - Կառուցումը պետք է կատարվի այնտեղ, որտեղ
node_modules-ն իրական է (հիմնական աշխատանքային պատճենում կամnpm ciգործարկված worktree-ում — ՈՉ թե սիմվոլիկ հղումով worktree-ում) - Կատարեք տեղակայված օրինակի ծխային փորձարկում՝
- Բացեք
/dashboard/health→ ստուգեք, որ տարբերակի տողը համապատասխանում է թողարկմանը - Հայտնի մատակարարի նկատմամբ կատարեք
/v1/chat/completionsհարցում - Ստուգեք, որ
/api/monitoring/health-ը վերադարձնում էCLOSEDվիճակով շղթայի անջատիչներ - Հաստատեք, որ MCP փոխադրամիջոցները պատասխանում են (
/mcpHTTP,/mcp-sseSSE)
- Բացեք
Թողարկումից հետո
- Գործարկել
/capture-release-evidences-cc-ը (Claude Code-ի հմտություն)- Նոր գործառույթների WebP էկրանակադրերի/տեսագրությունների ստացում
- Կցում է թողարկման նշումներին / բլոգային գրառմանը
- Թարմացնել GitHub Discussions-ը / Discord-ը՝ թողարկման հայտարարությամբ
- Բացել հաջորդ տարբերակի milestone-ը
- Եթե կրիտիկական է՝ ամրացնել քննարկումը կամ հրապարակել
news.json-ում՝ հավելվածի ներսում ցուցադրվող բանների համար
Radar-ի հրապարակային գործարկման անցակետ
Radar-ի հայտարարությունը միտումնավոր commit է արված active: false արժեքով։ Ակտիվացումն առանձին
փոփոխություն է, որը կատարվում է ստորև նշված յուրաքանչյուր կետի ապացուցումից հետո․
- Radar-ի բոլոր շարված PR-ները միավորված են, իսկ release-tip CI-ն հաջող է ավարտվել
- Տեղակայել և smoke թեստավորել OSS Radar-ի route-երը՝
RADAR_ENABLED-ը լռելյայն անջատված պահելով - Smoke թեստավորել
GET /planos,/termos,/privacidadeև/reembolsoհասցեները նշված Radar host-ում - Մասնավոր ծառայությունում գրանցել օպերատորի ինքնությունը/կոնտակտային տվյալները/հասցեն և սեփականատիրոջ կողմից հաստատված իրավական ստուգումը
- Stripe Checkout-ը և ստորագրված webhook-ը փորձարկել միայն թեստային ռեժիմում
- Փորձարկել մեկ գաղտնագրված տրանզակցիոն էլփոստի առաքում՝ հաստատված ուղարկողով/դոմենով
- Ապացուցել պահուստային պատճենից վերականգնումը և վերահսկվող, բյուջետային սահմանաչափով մեկ հետազոտական գործարկումը
- Հաստատել BRL/PIX-ի վերանայման քաղաքականությունը՝ նախքան նվիրատվության ապացույց ընդունելը
- Հրապարակային Checkout-ը միացնել միայն նախորդ անցակետերը հաղթահարելուց հետո, ապա ակտիվացնել
news.json-ի նոր ID-ն - Ստուգել, որ գլխավոր էջի բաններն օգտագործում է տեղայնացված տեքստ, և նոր ID-ն կրկին հայտնվում է ավելի հին ID-ն փակելուց հետո
Ներկառուցված ծառայությունների smoke ստուգում (v3.8.4+)
Ներկառուցված ծառայությունների փոփոխություններ ներառող որևէ թողարկում հրապարակելուց առաջ ստուգեք՝
Մաքուր DB-ով մեկնարկ (հայտնաբերում է միգրացիաների բախումները՝ ավելացվել է v3.8.4-ի հրատապ ուղղումից հետո)
DATA_DIR=$(mktemp -d) npm start &— սպասեք 10 վրկ․ մեկնարկինcurl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'վերադարձնում է"9router"(ՈՉ 404, ՈՉ 500)։ Հաստատում է, որ071_services.sqlմիգրացիան կիրառվել է, և տողը սկզբնարժեքավորվել է։sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"վերադարձնում է 3 տող։sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"վերադարձնում է 2 տող (հաստատում է, որ070_webhooks_kind_metadata.sqlմիգրացիան կիրառվել է)։node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.tsհաջողությամբ է անցնում՝ պաշտպանելով ապագա բախումներից։
9Router
POST /api/services/9router/install-ը 2 րոպեից պակաս ժամանակում վերադարձնում է 200՝installedVersion-ովPOST /api/services/9router/start-ը 30 վրկ․-ից պակաս ժամանակում վերադարձնում է 200 ևstate: "running"GET /api/services/9router/status-ը հաղորդում էhealth: "healthy"POST /v1/chat/completions-ը՝"model": "9router/auto/..."-ով, վերադարձնում է 200 (ծայրից ծայր երթուղավորում 9Router-ի միջոցով)GET /dashboard/providers/services/9router/embed/dashboard-ը ցուցադրում է 9Router-ի բնիկ UI-ը proxy-ի ներսում (առանց ուղիղ127.0.0.1:portiframe-ի)POST /api/services/9router/rotate-key-ը վերադարձնում է{ keyRotated: true }, և ծառայությունը մաքուր կերպով վերագործարկվում էPOST /api/services/9router/stop-ը վերադարձնում է 200 ևstate: "stopped"GET /api/services/9router/logs?tail=50-ը վերադարձնում է SSE հոսք՝ վերջին տողերը պարունակողsnapshotիրադարձությամբ- Առանց PATH-ում
npm-ի միջավայրում տեղադրումը վերադարձնում է 500՝ հասկանալի (առանց stack trace-ի) սխալի հաղորդագրությամբ
CLIProxyAPI
POST /api/services/cliproxy/install-ը 2 րոպեից պակաս ժամանակում վերադարձնում է 200POST /api/services/cliproxy/start-ը 30 վրկ․-ից պակաս ժամանակում վերադարձնում է 200 ևstate: "running"GET /api/services/cliproxy/status-ը հաղորդում էhealth: "healthy"POST /api/services/cliproxy/stop-ը վերադարձնում է 200 ևstate: "stopped"GET /api/services/cliproxy/logs?tail=50-ը վերադարձնում է SSE հոսք
Անվտանգության ռեգրեսիա
curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start-ը վերադարձնում է403 LOCAL_ONLYcurl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start-ը վերադարձնում է403 LOCAL_ONLY/api/services/*-ից ստացվող սխալի պատասխանները չեն պարունակումerr.stackկամ բացարձակ ֆայլային ուղիներ
v3.8.0+-ի ստուգումներ
Որևէ v3.8.x թողարկում հրապարակելուց առաջ ստուգեք նաև հետևյալ կետերը՝
omniroute --tray-ը մեկնարկում է macOS-ում (systray2-ը տեղադրված է~/.omniroute/runtime/-ում)omniroute --tray-ը մեկնարկում է Linux-ում (պահանջում է DISPLAY, իսկ չսահմանված լինելու դեպքում տալիս է պատշաճ սխալ)omniroute --tray-ը մեկնարկում է Windows-ում (PowerShell NotifyIcon, առանց լրացուցիչ երկուական ֆայլերի)omniroute config tray enable-ը ստեղծում է ավտոմեկնարկի գրառում, իսկ անջատումը հեռացնում է այնnpm install -g omniroute@<this-version>-ը postinstall-ը գործարկում է առանց ճակատագրական ելքի- Թարմացման ուղին պահպանում է ընտրովի կախվածությունները.
omniroute update --apply-ը և ավտոմատ թարմացնողը գործարկում ենnpm install -g … --include=optional, որպեսզիoptionalDependencies-ը (better-sqlite3, keytar, tls-client և llmlingua SLM փաթեթակազմը՝@atjsh/llmlingua-2@2.0.5,js-tiktoken) պահպանվեն թարմացումից հետո։ UltramodelPathSLM մակարդակին անհրաժեշտ է նաև tinybert մոդելը, որն առաջին օգտագործման ժամանակ ավտոմատ ներբեռնվում է${DATA_DIR}/models/llmlingua։ Postinstall-ը (scripts/build/colocateOptionals.mjs) այնուհետև SLM-ի ընտրովի կախվածությունների ամբողջ շղթան համատեղ տեղակայում էdist/node_modules-ում, որպեսզի worker-ը լուծի@huggingface/transformers^4.2.0-ի ՄԵԿ օրինակ. standalone trace-ը փաթեթավորում է միայն transformers-ը, ոչ թե դինամիկ ներմուծվող ընտրովի կախվածությունները, ուստի առանց սրա worker-ը llmlingua-2-ը կբեռներ root-ի transformers-ի հետ, և SLM մակարդակն աննկատ կանցներ fail-open ռեժիմի։ omniroute status-ն աշխատում է առանց.env-ի (CLI նշանի ուղի, միայն loopback)curl http://localhost:20128/api/shutdown-ը վերադարձնում է 401 (միշտ պաշտպանված երթուղի)curl -H "host: evil.com" http://localhost:20128/api/mcp/sse-ը վերադարձնում է 401 (loopback պաշտպանիչ ստուգում)- SQLite runtime-ն առաջին գործարկման ժամանակ լուծվում է որպես
bundled(փաթեթավորված երկուական ֆայլը վավեր է տվյալ հարթակի համար) - SQLite runtime-ը հետադարձ անցում է կատարում
runtime-ի, երբnode_modules/better-sqlite3-ը ջնջված է - Խելացի MCP զտիչը սեղմում է իրական
playwright-mcp browser_snapshotելքը (≥50% կրճատում) - Բոլոր 10
skills/omniroute*/SKILL.mdֆայլերը հասանելի են հանրային ներբեռնման համար GitHub-ի raw URL-ի միջոցով - Առաջնային կարգավորման օգնականը մաքուր տեղակայման դեպքում ցուցադրում է «Ինչպես է այն աշխատում» մակարդակների շրջայցի քայլը
- Գլխավոր վահանակի մակարդակների ծածկույթի widget-ը ցուցադրում է կազմաձևված/ակտիվ քանակները
Հետադարձում
Եթե թողարկումն ունի կրիտիկական խնդիր՝
gh release edit vX.Y.Z --prerelease(նշում է որպես ոչ վերջին)git tag -d vX.Y.Z && git push --delete origin vX.Y.Z(միայն եթե օգտատերերը դեռ չեն սկսել օգտագործել այն)- Կամ՝ թեժ ուղղում
release/vX.Y.0-ում → ուղղիչ թողարկումvX.Y.(Z+1) - Անմիջապես հաղորդել GitHub Discussions-ում և Discord-ում
Խիստ կանոններ
- Երբեք փոփոխություններ մի ամրագրեք անմիջապես
main-ում - Երբեք մի օգտագործեք
git push --force՝mainկամrelease/*ճյուղերի համար - Երբեք մի շրջանցեք Husky-ի կեռիկները (
--no-verify) - Երբեք մի ամրագրեք գաղտնիքներ, հավատարմագրեր կամ
.envֆայլեր - Ծածկույթը պետք է մնա ≥60/60/60/60 (հրահանգներ/տողեր/ֆունկցիաներ/ճյուղավորումներ)
src/,open-sse/,electron/կամbin/պանակներում արտադրական կոդը փոխելիս միշտ ներառեք կամ թարմացրեք թեստերը
Համաժամացման ավտոմատացված ստուգում
Նախքան PR բացելը տեղային միջավայրում գործարկեք փաստաթղթերի համաժամացման պաշտպանիչ ստուգումը՝
npm run check:docs-sync
CI-ն նույնպես գործարկում է այս ստուգումը .github/workflows/ci.yml-ում (lint առաջադրանք)։