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
38 KiB
Release Checklist (فارسی)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇫🇮 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 · 🇳🇬 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 # لینت + آزمونها
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 (پیشفرض از v3.8.51) — مرحلهای در صورت درخواست، مستقیم بهعنوان راهکار جایگزین
npm-publish.yml بهطور پیشفرض از طریق انتشار مورد اعتماد npm (OIDC) منتشر میکند:
وظیفهٔ stage-npm (میزبانیشده در GitHub)، id-token گیتهاب را با یک اعتبارنامهٔ کوتاهعمر npm
برای همان اجرا مبادله میکند — بدون توکن بلندمدت npm در اسرار مخزن، بدون درخواست 2FA و با منشأ پیوستشده.
اکنون که توکنهای عبورکننده از 2FA در حال منسوخشدن هستند، این همان روش عبور مورد تأیید npm است؛
این روش ضمن حفظ تضمین WS1.3، جریان کاملاً خودکاری را که پروژه تا v3.8.48 داشت بازیابی میکند
(یک توکن افشاشده بهتنهایی نمیتواند منتشر کند — زیرا اصلاً توکنی وجود ندارد).
راهاندازی یکباره (مالک): npmjs.com → بستهٔ omniroute → Settings → Trusted
Publisher → GitHub: مالک diegosouzapw، مخزن OmniRoute، گردشکار npm-publish.yml
(محیط: هیچکدام). تا زمانی که این مورد ایجاد نشده باشد، مرحلهٔ خودکار با ENEEDAUTH شکست میخورد:
دوباره با publish_mode=staged (در ادامه) یا direct اجرا کنید.
انتشار مرحلهای (در صورت درخواست — publish_mode=staged)
گردشکار npm-publish دیگر مستقیماً منتشر نمیکند: tarball بستهبندیشده را
راهاندازی میکند (check:pack-boot) و سپس npm stage publish را اجرا میکند — دقیقاً همان بایتها
در رجیستری نگه داشته میشوند و تا زمان تأیید مالک، قابل نصب نیستند. دروازهٔ انسانی 2FA
به بعد از اثبات منتقل شده است، نه پیش از آن.
جریان کار مالک پس از سبزشدن گردشکار:
npm stage list omniroute— شناسهٔ مرحله را پیدا کنید (در خلاصهٔ گردشکار نیز چاپ میشود).- بایتهای مرحلهبندیشده را تأیید کنید (توصیه میشود):
npm stage download <id>، سپس tarball دانلودشده را در یک پیشوند موقت نصب و راهاندازی کنید (npm run check:pack-bootهمین نتیجهگیری pack→install→boot را در CI خودکار میکند). npm stage approve <id>— درخواست 2FA همان انتشار است.npm stage reject <id>آن را کنار میگذارد.- شبکهٔ ایمنی پس از انتشار: تأییدکنندهٔ پس از انتشار (WS1.4 از برنامهٔ v3.8.49)، نسخهٔ منتشرشده را از رجیستری عمومی در یک کانتینر پاک نصب و راهاندازی میکند.
راهکار اضطراری جایگزین: workflow_dispatch با publish_mode=direct، رفتار قدیمی
npm publish فوری را بازیابی میکند (فقط در صورتی استفاده کنید که خود مرحلهبندی درست عمل نکند؛ دلیل را ثبت کنید).
سختسازی یکباره (مالک، npmjs.com): Trusted Publisher را برای
omniroute در حالت فقط مرحلهبندی پیکربندی کنید تا یک توکن بلندمدت افشاشده نتواند
از هیچجا مستقیماً npm publish را اجرا کند — CI فقط میتواند مرحلهبندی کند؛ تنها 2FA مالک انتشار را انجام میدهد.
راهنمای عملیاتی آرتیفکت خراب (بدون تغییر): npm deprecate omniroute@<bad> "<reason> — use <fixed>"
بهعنوان واکنش پیشفرض (چند دقیقه، برگشتپذیر)؛ npm unpublish فقط در بازهٔ 72h/بدون وابستگان
و هرگز بهعنوان نخستین اقدام. Docker: هرگز یک برچسب نسخه را بازنویسی نکنید — بازگردانی یعنی
اشارهٔ مجدد latest به آخرین digest سالم.
Docker Hub latest (برای هر انتشار پایدار SemVer الزامی است):
گردشکار docker-publish باید هر دو برچسب X.Y.Z و، هنگامی که
should-promote-latest.sh تأیید میکند این بالاترین SemVer پایدار است، :latest
را با digest یکسان اعمال کند. پس از اجرای وظیفه: digest مربوط به latest در Hub با digest جدید
SemVer برابر است و last_updated بهروزرسانی شده است. اجازه ندهید :latest روی یک
ساخت قدیمی باقی بماند، درحالیکه یادداشتهای انتشار از اصلاحاتی صحبت میکنند که فقط در git وجود دارند.
شروعهای سریع Compose از :latest استفاده میکنند؛ GitOps باید همچنان X.Y.Z را پین کند. به
کانالهای انتشار Docker و #10317 مراجعه کنید.
مسیر سریع اصلاح فوری (برچسب hotfix)
یک PR با برچسب hotfix از ماتریس سنگین CI (E2E با 9 شارد، ضامن پوشش،
quality-gate، quality-extended) عبور میکند و گیتهای سریع و پُرسیگنال را حفظ میکند: ساخت،
شاردهای واحد، یکپارچهسازی، vitest، lint/typecheck، docs-sync، check:pack-artifact
و آزمون اولیهٔ بوتِ tarball (check:pack-boot). هدف: سبزشدن در ≤15min بهجای ~33min.
سیاست ورود — هر چهار مورد الزامیاند (الگوبرداریشده از مسیرهای اضطراری Chromium/VS Code/Node):
- شدت: محیط production از کار افتاده است — یک آرتیفکت منتشرشده هنگام بوت کرش میکند / یک اصلاح امنیتی / تمام کاربران نسخه تحت تأثیر قرار گرفتهاند. «مهم» بهمعنای «ازکارافتاده» نیست.
- اختیار: فقط مالک مخزن برچسب
hotfixرا اعمال میکند. خودِ برچسب بهمنزلهٔ تأیید است — هرگز آن را شخصاً روی یک PR کارزاری اعمال نکنید. - شواهد: بدنهٔ PR به اجرای سنگین قبلی که کاملاً سبز بوده پیوند میدهد (مجموعهای که jobهای ردشده دوباره اعتبارسنجی میکردند)، بهعلاوهٔ تست خودِ اصلاح که ابتدا شکست خورده و سپس قبول شده است.
- دامنه: فقط cherry-pick — حداقل اصلاح ممکن، بدون بازآرایی و بدون تغییرات جانبی.
سطح پوشش/ضامنِ ردشده در اجرای کامل بعدی روی شاخهٔ
انتشار دوباره اعتبارسنجی میشود (سبز ماندن پیوستهٔ انتشار) — این مسیر فقط «انتظار» را حذف میکند، نه اعتبارسنجی را.
تغییرات صرفاً مربوط به تست (همهٔ فایلها زیر tests/ و هیچکدام زیر tests/e2e/) بدون نیاز به هیچ برچسبی،
ماتریس E2E را بهصورت خودکار رد میکنند.
چکلیست تفصیلی
پیش از انتشار
- همهٔ PRهای هدفگذاریشده برای این انتشار در
release/vX.Y.0ادغام شدهاند - همهٔ آیتمهای باز Linear/issue برای این نسخه بسته شده یا به milestone بعدی منتقل شدهاند
- CI روی شاخهٔ
release/vX.Y.0سبز است - هیچ نشانگر
TODO(release)در کد وجود ندارد:grep -r "TODO(release)" src/ open-sse/ - ایمیج پایهٔ Docker بهروز است (در حال حاضر
node:24.15.0-trixie-slim)
نسخه و گزارش تغییرات
/version-bump-cc <patch|minor|major>را اجرا کنید (مهارت Claude Code)- نسخهٔ
package.jsonوelectron/package.jsonرا افزایش میدهد CHANGELOG.mdرا از روی commitهای git پس از آخرین تگ دوباره تولید میکند- نشانهای README.md را بهروزرسانی میکند
- نسخهٔ
CHANGELOG.mdرا بهصورت دستی بازبینی کرده و در صورت نیاز پیامهای commit را پاکسازی کنید- اطمینان حاصل کنید که آخرین بخش semver در
CHANGELOG.mdبا نسخهٔ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، طبقSUPPORTED_NODE_RANGEدرsrc/shared/utils/nodeRuntimeSupport.ts؛ همراستا باenginesدرpackage.json)
تست
npm run test:unit— قبولnpm run test:vitest— قبول (سرور MCP، autoCombo، cache)npm run test:coverage— گیت 60/60/60/60 برقرار است (دستورها/خطوط/توابع/شاخهها)npm run test:integration— قبول (اگر تغییرات DB / handlerها را تحت تأثیر قرار میدهند)npm run test:combo:matrix— قبول (ماتریس راهبرد combo: تصمیمهای انتخاب هر 19 راهبرد مسیریابی عمومی را بهصورت قطعی اثبات میکند؛ هنگام تغییر مسیریابی combo، تفکیک راهبرد یا منطق fallback اجرا شود)RUN_COMBO_LIVE=1 npm run test:combo:live— اختیاری/دستی (آزمون اولیهٔ کنترلشده با upstream واقعی؛ یک snapshot فقطخواندنی از DB را از VPS با آدرسroot@192.168.0.15دریافت میکند؛ ارائهدهندگان واقعی را فراخوانی میکند و اعتبار مصرف میکند؛ هرگز در CI اجرا نمیشود؛ بدون گیت بهشکلی تمیز رد میشود)npm run test:combo:live:vps— اختیاری/دستی (آزمون اولیهٔ زندهٔ VPS در Phase-3: شامل 7 سناریوی HTTP روی سرور زندهٔ.15از طریق Node ESM ساده؛ نیازمندssh root@192.168.0.15است؛ فقط comboهای__live_test__*را ایجاد/حذف میکند؛ ارائهدهندگان واقعی را فراخوانی میکند؛ هرگز در CI اجرا نمیشود)npm run test:e2e— قبول (تغییرات UI)npm run test:protocols:e2e— قبول (تغییرات MCP/A2A)npm run test:ecosystem— قبول
هوکها (اعتبارسنجیشده با Husky)
هوکهای Husky در .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را شامل نمیشود (کند است؛ job مربوط بهtest-unitدر CI آن را پوشش میدهد).- پیش از push کردن شاخههای انتشار،
npm run test:unitرا بهصورت دستی اجرا کنید.
- پیش از push کردن شاخههای انتشار،
اگر یک هوک شکست خورد: مشکل زیربنایی را اصلاح کنید؛ با --no-verify آن را دور نزنید.
Conventional Commits
همهٔ commitهایی که قرار است وارد انتشار شوند باید از قالب type(scope): subject پیروی کنند.
نوعهای معتبر: feat، fix، refactor، docs، test، chore، perf، style، ci
دامنههای معتبر: 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: یا ! را پس از دامنه اضافه کنید (برای مثال 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بهروزرسانی شده است - اگر قابلیت جدید دارای رابط کاربری است: در
docs/guides/USER_GUIDE.mdبه آن اشاره شده است - اگر قابلیت جدید دارای API است:
docs/reference/API_REFERENCE.md+docs/openapi.yamlبهروزرسانی شدهاند - اگر قابلیت جدید یک ماژول است: فایل اختصاصی
docs/<MODULE>.mdوجود دارد - اگر تغییر ناسازگار وجود دارد:
docs/guides/TROUBLESHOOTING.mdشامل یادداشت مهاجرت است
بینالمللیسازی
npm run i18n:checkبا کد 0 خاتمه مییابد — وضعیت ترجمه (.i18n-state.json) با مستندات منبع همگام است (در حالت سختگیرانه هیچ منبع ناهماهنگی وجود ندارد؛ هشدارهای حالت هشدار برای اصلاحات لحظه آخری مستندات قابل قبولاند، اما پیش از برچسبگذاری باید مقدار 0 باشد)npm run i18n:check-ui-coverageبا کد 0 خاتمه مییابد — پوشش هر زبان رابط کاربری برابر یا بیشتر از حداقل 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را اجرا کنید - آزمایش روی نصب موجود: از پایگاه داده نسخه پشتیبان تهیه کنید، مهاجرت را اجرا کنید و شِما را تأیید کنید
- اگر مهاجرت جدولها را بازنویسی میکند، فایلهای WAL (
-wal،-shm) بهدرستی مدیریت میشوند
کاتالوگ ارائهدهندگان (اعتبارسنجیشده با Zod)
- شِمای Zod در
src/shared/constants/providers.tsهنگام بارگذاری معتبر است- همه ارائهدهندگان فیلدهای الزامی (
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) |
خیر (در gitignore) |
dist/ |
بسته قابلانتشار npm — مونتاژشده توسط assembleStandalone |
خیر (در gitignore) |
یادداشت اپراتور: پوشه ایمیج VPS راهدور همچنان
/usr/lib/node_modules/omniroute/app/است. فقط خروجی ساخت درون مخزن جابهجا شده است (app/→dist/). مهارتهای استقرار، محتوایdist/را با rsync به پوشه راهدورapp/منتقل میکنند — هیچ تغییری در مسیر VPS لازم نیست.
جریان تکساخت:
npm run build:release
└─ rm -rf .build dist (پاکسازی)
└─ next build → .build/next/ (فایلهای میانی)
└─ assembleStandalone (standalone + static + public + natives را در dist/ کپی میکند)
└─ writes 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را ایجاد میکند - برچسب و شاخه را push میکند
- یک انتشار GitHub با بدنه تغییرات باز میکند
- نصبکنندههای 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— VPS آکامای (69.164.221.35)/deploy-vps-both-cc— هر دو
- پیش از استقرار، تأیید کنید که
dist/BUILD_SHA==git rev-parse --short HEAD - ساخت باید در جایی اجرا شود که
node_modulesواقعی باشد (checkout اصلی یا worktreeای که در آنnpm ciاجرا شده است — نه یک 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 عمداً با active: false ثبت شده است. فعالسازی، تغییری جداگانه است که پس از ارائهٔ شواهد برای تمام موارد زیر انجام میشود:
- تمام PRهای پشتهای Radar ادغام شدهاند و CI مربوط به نوک انتشار سبز است
- مسیرهای OSS مربوط به Radar را در حالی مستقر و smoke test کنید که
RADAR_ENABLEDهمچنان بهصورت پیشفرض خاموش است - روی میزبان تعیینشدهٔ Radar، مسیرهای
GET /planos،/termos،/privacidadeو/reembolsoرا smoke test کنید - هویت/اطلاعات تماس/نشانی اپراتور و بازبینی حقوقی تأییدشده توسط مالک را در سرویس خصوصی ثبت کنید
- Stripe Checkout و webhook امضاشده را فقط در حالت آزمایشی تست کنید
- یک ارسال ایمیل تراکنشی رمزگذاریشده را با فرستنده/دامنهٔ تأییدشده آزمایش کنید
- بازیابی نسخهٔ پشتیبان و اجرای یک پژوهش تحت نظارت با سقف بودجه را اثبات کنید
- پیش از پذیرش شواهد کمک مالی، سیاست بازبینی BRL/PIX را تأیید کنید
- Checkout عمومی را فقط پس از عبور از دروازههای پیشین فعال کنید و سپس ID جدید
news.jsonرا فعال کنید - تأیید کنید که بنر صفحهٔ اصلی از متن بومیسازیشده استفاده میکند و پس از نادیدهگرفتن یک ID قدیمی، ID جدید دوباره ظاهر میشود
آزمون دودِ سرویسهای تعبیهشده (v3.8.4+)
پیش از انتشار هر نسخهای که شامل تغییرات سرویسهای تعبیهشده است، موارد زیر را بررسی کنید:
راهاندازی با DB تازه (تداخلهای migration را شناسایی میکند — پس از hotfix نسخهٔ v3.8.4 اضافه شده است)
DATA_DIR=$(mktemp -d) npm start &— برای راهاندازی ۱۰ ثانیه صبر کنیدcurl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'مقدار"9router"را برمیگرداند (نه 404 و نه 500). تأیید میکند که migration مربوط به071_services.sqlاعمال شده و ردیف اولیه درج شده است.sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"تعداد ۳ ردیف برمیگرداند.sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"تعداد ۲ ردیف برمیگرداند (اعمال شدن070_webhooks_kind_metadata.sqlرا اعتبارسنجی میکند).node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.tsبا موفقیت اجرا میشود — از بروز تداخلهای آینده جلوگیری میکند.
9Router
POST /api/services/9router/installدر کمتر از ۲ دقیقه، پاسخ 200 را بههمراهinstalledVersionبرمیگرداندPOST /api/services/9router/startدر کمتر از ۳۰ ثانیه، پاسخ 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 را داخل proxy رندر میکند (بدون iframe مستقیم با127.0.0.1:port)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شامل خطوط اخیر برمیگرداند- نصب در محیطی که
npmدر PATH آن وجود ندارد، پاسخ 500 را با یک پیام خطای کاربرپسند (بدون stack trace) برمیگرداند
CLIProxyAPI
POST /api/services/cliproxy/installدر کمتر از ۲ دقیقه پاسخ 200 را برمیگرداندPOST /api/services/cliproxy/startدر کمتر از ۳۰ ثانیه، پاسخ 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_ONLYرا برمیگرداندcurl -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ورودی autostart را ایجاد میکند؛ غیرفعالسازی آن را حذف میکندnpm install -g omniroute@<this-version>مرحلهٔ postinstall را بدون خروج بحرانی اجرا میکند- مسیر بهروزرسانی وابستگیهای اختیاری را حفظ میکند:
omniroute update --applyو بهروزرسان خودکار دستورnpm install -g … --include=optionalرا اجرا میکنند تاoptionalDependencies(better-sqlite3، keytar، tls-client و پشتهٔ SLM مربوط به llmlingua:@atjsh/llmlingua-2@2.0.5،js-tiktoken) پس از بهروزرسانی باقی بمانند. سطح ultra مربوط بهmodelPathدر SLM نیز به مدل tinybert نیاز دارد که هنگام نخستین استفاده بهصورت خودکار در${DATA_DIR}/models/llmlinguaدانلود میشود. سپس postinstall (scripts/build/colocateOptionals.mjs) بستار اختیاری SLM را درdist/node_modulesهممکان میکند تا worker دقیقاً یک نمونهٔ@huggingface/transformers^4.2.0 را resolve کند — trace مستقل فقط transformers را bundle میکند، نه گزینههایی را که بهصورت پویا import شدهاند؛ بنابراین بدون این کار، worker، llmlingua-2 را در برابر transformers موجود در root بارگذاری میکند و سطح SLM بهصورت بیصدا در حالت fail-open قرار میگیرد. omniroute statusبدون.envکار میکند (مسیر token در CLI، فقط loopback)curl http://localhost:20128/api/shutdownپاسخ 401 را برمیگرداند (مسیری که همیشه محافظت میشود)curl -H "host: evil.com" http://localhost:20128/api/mcp/sseپاسخ 401 را برمیگرداند (محافظ loopback)- runtime مربوط به SQLite در نخستین اجرا به
bundledresolve میشود (فایل باینری bundleشده برای پلتفرم معتبر است) - وقتی
node_modules/better-sqlite3حذف میشود، runtime مربوط به SQLite بهruntimefallback میکند - فیلتر هوشمند MCP، خروجی واقعی
playwright-mcp browser_snapshotرا فشرده میکند (کاهش ≥۵۰٪) - هر ۱۰ فایل
skills/omniroute*/SKILL.mdاز طریق URL خام GitHub بهصورت عمومی قابل دریافت هستند - جادوگر onboarding در راهاندازی تازه، مرحلهٔ معرفی سطحها با عنوان "نحوهٔ کارکرد" را نمایش میدهد
- ویجت پوشش سطحها در داشبورد Home، تعداد موارد پیکربندیشده/فعال را نمایش میدهد
بازگردانی
اگر انتشار با مشکل بحرانی مواجه است:
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) اجرا میکند.