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
44 KiB
Release Checklist (বাংলা)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇨🇿 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 · 🇳🇬 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 শুরু থেকেই সবুজ থাকে।
সংক্ষেপে
# ১. ভার্সন বাড়ান + CHANGELOG তৈরি করুন (স্কিল)
/version-bump-cc patch # অথবা minor/major
# ২. স্থানীয়ভাবে কোয়ালিটি গেট চালান
npm run check # lint + টেস্ট
npm run test:coverage # সম্পূর্ণ কভারেজ গেট (60/60/60/60)
# ৩. বিল্ড ও স্মোক টেস্ট
npm run build
npm run test:e2e # ঐচ্ছিক, তবে সুপারিশকৃত
# ৪. রিলিজ তৈরি করুন (স্কিল)
/generate-release-cc
# ৫. ডিপ্লয় করুন (স্কিল)
/deploy-vps-both-cc # অথবা akamai-cc / local-cc
# ৬. রিলিজের প্রমাণ সংগ্রহ করুন (স্কিল)
/capture-release-evidences-cc
npm Trusted Publishing (v3.8.51 থেকে ডিফল্ট) — অনুরোধে staged, fallback হিসেবে direct
npm-publish.yml ডিফল্টভাবে npm Trusted Publishing (OIDC)-এর মাধ্যমে প্রকাশ করে:
stage-npm জবটি (github-hosted) ওই রানের জন্য GitHub-এর id-token বিনিময় করে একটি স্বল্পমেয়াদি npm
credential নেয় — repository secrets-এ কোনো দীর্ঘমেয়াদি npm token থাকে না, কোনো 2FA prompt আসে না, এবং provenance সংযুক্ত থাকে।
2FA এড়িয়ে যাওয়া token-গুলো অবসরে পাঠানো হচ্ছে বলে npm এখন এই bypass অনুমোদন করে;
এটি WS1.3 নিশ্চয়তা বজায় রেখেই v3.8.48 পর্যন্ত প্রকল্পটিতে থাকা সম্পূর্ণ স্বয়ংক্রিয় প্রবাহ পুনরুদ্ধার করে
(ফাঁস হওয়া token একা publish করতে পারে না — কারণ কোনো token-ই নেই)।
একবারের সেটআপ (owner): npmjs.com → package omniroute → Settings → Trusted
Publisher → GitHub: owner diegosouzapw, repo OmniRoute, workflow npm-publish.yml
(environment: none)। এটি তৈরি না হওয়া পর্যন্ত স্বয়ংক্রিয় ধাপটি ENEEDAUTH দিয়ে ব্যর্থ হবে:
publish_mode=staged (নিচে) অথবা direct দিয়ে পুনরায় dispatch করুন।
Staged publishing (অনুরোধে — publish_mode=staged)
npm-publish workflow আর সরাসরি publish করে না: এটি প্যাক করা tarball
বুট করে (check:pack-boot) এবং তারপর npm stage publish চালায় — হুবহু সেই bytes-গুলো registry-তে রাখা হয়,
কিন্তু owner অনুমোদন না করা পর্যন্ত সেগুলো install করা যায় না। মানব-নির্ভর 2FA gate-টি এখন প্রমাণ যাচাইয়ের
আগে নয়, পরে সম্পন্ন হয়।
Workflow সবুজ হওয়ার পর owner-এর প্রবাহ:
npm stage list omniroute— stage id খুঁজুন (workflow summary-তেও দেখানো হয়)।- Staged bytes যাচাই করুন (সুপারিশকৃত):
npm stage download <id>, তারপর ডাউনলোড করা tarball-টি একটি অস্থায়ী prefix-এ install করে বুট করুন (npm run check:pack-bootCI-তে একই pack→install→boot সিদ্ধান্ত স্বয়ংক্রিয় করে)। npm stage approve <id>— 2FA prompt-টিই হলো publish।npm stage reject <id>বাতিল করে।- Publish-পরবর্তী সুরক্ষা: publish-পরবর্তী verifier (v3.8.49 পরিকল্পনার WS1.4) একটি পরিষ্কার container-এ public registry থেকে প্রকাশিত version install করে সেটি বুট করে।
জরুরি fallback: publish_mode=direct-সহ workflow_dispatch পুরোনো
তাৎক্ষণিক npm publish পুনরুদ্ধার করে (শুধু staging নিজেই ঠিকমতো কাজ না করলে ব্যবহার করুন; কারণটি নথিভুক্ত করুন)।
একবারের hardening (owner, npmjs.com): omniroute-এর Trusted Publisher-কে
stage-only mode-এ কনফিগার করুন, যাতে ফাঁস হওয়া কোনো দীর্ঘমেয়াদি token কোথাও থেকে সরাসরি npm publish
করতে না পারে — CI কেবল stage করতে পারে; শুধু owner-এর 2FA রিলিজ করতে পারে।
ত্রুটিপূর্ণ artifact-এর playbook (অপরিবর্তিত): ডিফল্ট তাৎক্ষণিক পদক্ষেপ হিসেবে
npm deprecate omniroute@<bad> "<reason> — use <fixed>" ব্যবহার করুন (কয়েক মিনিট লাগে, প্রত্যাবর্তনযোগ্য);
শুধু 72h/no-dependents সীমার মধ্যে npm unpublish ব্যবহার করুন এবং কখনোই প্রথম পদক্ষেপ হিসেবে নয়।
Docker: কোনো version tag কখনো পুনর্লিখবেন না — rollback হলো latest-কে সর্বশেষ ভালো digest-এর দিকে পুনর্নির্দেশ করা।
Docker Hub latest (প্রতিটি stable SemVer publish-এ আবশ্যক):
docker-publish workflow-কে অবশ্যই X.Y.Z এবং, যখন
should-promote-latest.sh সম্মত হয় যে এটিই সর্বোচ্চ stable SemVer, একই digest দিয়ে :latest—
দুটোকেই tag করতে হবে। Job-এর পরে: Hub-এর latest digest নতুন
SemVer digest-এর সমান হবে এবং last_updated এগিয়ে যাবে। Release notes-এ এমন fix-এর কথা থাকা অবস্থায়
:latest-কে পুরোনো build-এ রেখে দেবেন না, যদি ওই fix শুধু git-এ থাকে। Compose
quickstart-গুলো :latest ব্যবহার করে; GitOps-এর X.Y.Z pin করাই চালিয়ে যাওয়া উচিত। দেখুন
Docker release channels এবং #10317।
হটফিক্স ফাস্ট-লেন (hotfix লেবেল)
hotfix লেবেলযুক্ত একটি PR ভারী CI ম্যাট্রিক্স (9-shard E2E, coverage ratchet,
quality-gate, quality-extended) এড়িয়ে যায় এবং দ্রুত, উচ্চ-সংকেতসম্পন্ন গেটগুলো বজায় রাখে: build,
unit shards, integration, vitest, lint/typecheck, docs-sync, check:pack-artifact
এবং tarball boot-smoke (check:pack-boot)। লক্ষ্য: ~33min-এর পরিবর্তে ≤15min-এ সবুজ অবস্থা।
প্রবেশনীতি — চারটিই আবশ্যক (Chromium/VS Code/Node-এর জরুরি লেন অনুসারে তৈরি):
- তীব্রতা: production নষ্ট — প্রকাশিত কোনো artifact boot-এর সময় crash করে / একটি security fix / release-এর প্রতিটি ব্যবহারকারী প্রভাবিত। "গুরুত্বপূর্ণ" মানেই "নষ্ট" নয়।
- কর্তৃত্ব: কেবল repository owner-ই
hotfixলেবেল প্রয়োগ করেন। লেবেলটিই অনুমোদন — campaign PR-এ এটি কখনো নিজে থেকে ব্যবহার করা যাবে না। - প্রমাণ: PR body-তে পূর্ববর্তী সম্পূর্ণ-সবুজ heavy run-এর লিঙ্ক থাকে (যে suite-টি বাদ দেওয়া job-গুলো পুনরায় যাচাই করত), সঙ্গে fix-টির নিজস্ব আগে-ব্যর্থ-তারপর-সফল test।
- পরিধি: শুধু cherry-pick — ন্যূনতম fix, কোনো refactor নয়, কোনো অতিরিক্ত পরিবর্তন নয়।
বাদ দেওয়া coverage/ratchet ক্ষেত্রটি release branch-এর পরবর্তী পূর্ণ run-এ
পুনরায় যাচাই করা হয় (ধারাবাহিক release-green) — এই lane কেবল অপেক্ষা এড়ায়, যাচাইকরণ কখনো নয়।
শুধু test-সংক্রান্ত diff (সব file tests/-এর অধীনে, একটিও tests/e2e/-এর অধীনে নয়) কোনো
লেবেল ছাড়াই স্বয়ংক্রিয়ভাবে E2E matrix এড়িয়ে যায়।
বিস্তারিত চেকলিস্ট
রিলিজের আগে
- এই release-এর জন্য লক্ষ্যকৃত সব PR
release/vX.Y.0-তে merge করা হয়েছে - এই version-এর সব খোলা Linear/issue item বন্ধ করা হয়েছে অথবা পরবর্তী milestone-এ সরানো হয়েছে
release/vX.Y.0branch-এ CI সবুজ- code-এ কোনো
TODO(release)marker নেই:grep -r "TODO(release)" src/ open-sse/ - Docker base image হালনাগাদ (বর্তমানে
node:24.15.0-trixie-slim)
Version ও Changelog
/version-bump-cc <patch|minor|major>চালান (Claude Code skill)package.json,electron/package.json-এর version bump করে- সর্বশেষ tag-এর পরের git commit থেকে
CHANGELOG.mdপুনরায় তৈরি করে - README.md badge হালনাগাদ করে
- CHANGELOG.md ম্যানুয়ালি পর্যালোচনা করুন এবং প্রয়োজন হলে commit message পরিষ্কার করুন
- নিশ্চিত করুন,
CHANGELOG.md-এর সর্বশেষ semver sectionpackage.jsonversion-এর সমান - আসন্ন কাজের জন্য
## [Unreleased]-কে changelog-এর প্রথম section হিসেবে রাখুন docs/openapi.yamlহালনাগাদ করুন →info.versionঅবশ্যইpackage.jsonversion-এর সমান হতে হবে
Code-এর গুণমান
npm run lint— 0টি error (warning-গুলো আগে থেকেই বিদ্যমান)npm run typecheck:core— ত্রুটিমুক্তnpm run typecheck:noimplicit:core— ত্রুটিমুক্ত (strict)npm run check:cycles— কোনো circular dependency নেইnpm run check:any-budget:t11— budget-এর মধ্যে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-এর সঙ্গে সামঞ্জস্যপূর্ণ)
Testing
npm run test:unit— সফলnpm run test:vitest— সফল (MCP server, autoCombo, cache)npm run test:coverage— 60/60/60/60 gate পূরণ হয়েছে (statements/lines/functions/branches)npm run test:integration— সফল (পরিবর্তনগুলো DB / handler স্পর্শ করলে)npm run test:combo:matrix— সফল (combo strategy matrix: সর্বজনীন 19টি routing strategy-এর selection decision নির্ধারিতভাবে প্রমাণ করে; combo routing, strategy resolution বা fallback logic স্পর্শ করলে চালান)RUN_COMBO_LIVE=1 npm run test:combo:live— ঐচ্ছিক/ম্যানুয়াল (gate-নিয়ন্ত্রিত বাস্তব-upstream smoke; VPSroot@192.168.0.15থেকে একটি read-only DB snapshot নেয়; বাস্তব provider-কে অনুরোধ পাঠায়, credit খরচ করে; CI-তে কখনো চলে না; gate না থাকলে পরিচ্ছন্নভাবে skip করে)npm run test:combo:live:vps— ঐচ্ছিক/ম্যানুয়াল (পর্যায়-৩ VPS live smoke: plain Node ESM-এর মাধ্যমে live.15server-এর বিপরীতে 7টি HTTP scenario;ssh root@192.168.0.15প্রয়োজন; শুধু__live_test__*combo তৈরি/মুছে ফেলে; বাস্তব provider-কে অনুরোধ পাঠায়; CI-তে কখনো চলে না)npm run test:e2e— সফল (UI পরিবর্তন)npm run test:protocols:e2e— সফল (MCP/A2A পরিবর্তন)npm run test:ecosystem— সফল
Hook (Husky দ্বারা যাচাইকৃত)
Husky hook-গুলো .husky/-তে থাকে এবং git operation-এর সময় স্বয়ংক্রিয়ভাবে চলে।
- pre-commit:
npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11 - pre-push: দ্রুত নির্ধারিত gate —
npm run check:any-budget:t11 && npm run check:tracked-artifacts(2026-06-13-এ সক্রিয় করা হয়েছে)। ইচ্ছাকৃতভাবেtest:unitবাদ দেয় (ধীর; CI-এরtest-unitjob দ্বারা অন্তর্ভুক্ত)।- release branch push করার আগে ম্যানুয়ালি
npm run test:unitচালান।
- release branch push করার আগে ম্যানুয়ালি
কোনো hook ব্যর্থ হলে: অন্তর্নিহিত সমস্যাটি ঠিক করুন, --no-verify দিয়ে এড়িয়ে যাবেন না।
Conventional Commit
release-এ অন্তর্ভুক্ত সব commit-কে অবশ্যই type(scope): subject format অনুসরণ করতে হবে।
বৈধ 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: BREAKING CHANGE: footer অথবা scope-এর পরে ! যোগ করুন (যেমন feat(api)!: drop /v0)।
Documentation
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-sync0 দিয়ে প্রস্থান করে — কোড ↔.env.example↔docs/reference/ENVIRONMENT.mdenv চুক্তি অক্ষুণ্ণ আছেnpm run check:doc-links0 দিয়ে প্রস্থান করে — পুনর্গঠনের পর কোনো অভ্যন্তরীণ markdown রেফারেন্স ভাঙা নেই- স্টোরেজ/রানটাইমের বিচ্যুতির জন্য
docs/architecture/ARCHITECTURE.mdপর্যালোচনা করা হয়েছে - env var এবং অপারেশনাল বিচ্যুতির জন্য
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বিদ্যমান - এটি একটি breaking change হলে:
docs/guides/TROUBLESHOOTING.md-এ migration নোট রয়েছে
i18n
npm run i18n:check0 দিয়ে প্রস্থান করে — অনুবাদের অবস্থা (.i18n-state.json) উৎস ডকুমেন্টেশনের সঙ্গে সিঙ্কে আছে (strict mode-এ কোনো বিচ্যুত উৎস নেই; শেষ মুহূর্তের ডকুমেন্টেশন সংশোধনের জন্য warn-mode পরামর্শ গ্রহণযোগ্য, তবে tagging-এর আগে এটি 0 হওয়া উচিত)npm run i18n:check-ui-coverage0 দিয়ে প্রস্থান করে — প্রতিটি UI locale 80% কভারেজের ন্যূনতম সীমায় বা তার ওপরে রয়েছেnpm run i18n:sync-ui:dryসব 42টি locale জুড়ে 0টি অনুপস্থিত key রিপোর্ট করে- উৎসের ইংরেজি ডকুমেন্টেশন পরিবর্তিত হলে, tagging-এর আগে
npm run i18n:runচালান (.env-এOMNIROUTE_TRANSLATION_API_KEYপ্রয়োজন) - অনুবাদ-সংক্রান্ত অবদান ছোট হলে পরবর্তী release পর্যন্ত স্থগিত রাখা যেতে পারে (CHANGELOG-এ ট্র্যাক করুন)
ডেটাবেস Migration
src/lib/db/migrations/-এ নতুন ফাইল থাকলে:- প্রতিটি migration idempotent (
CREATE TABLE IF NOT EXISTS, ইত্যাদি) - Migration-গুলো transaction-এর মধ্যে রাখা হয়েছে
- সঠিকভাবে নম্বর দেওয়া হয়েছে (ক্রমে কোনো ফাঁক নেই)
- প্রতিটি migration idempotent (
- নতুন ইনস্টলে পরীক্ষা করুন:
~/.omniroute/omniroute.dbমুছে দিয়েnpm run devচালান - বিদ্যমান ইনস্টলে পরীক্ষা করুন: DB ব্যাকআপ নিন, migration চালান এবং schema যাচাই করুন
- Migration-এ table পুনর্লিখন করা হলে WAL ফাইল (
-wal,-shm) সঠিকভাবে পরিচালিত হয়েছে
Provider Catalog (Zod দ্বারা যাচাইকৃত)
- লোডের সময়
src/shared/constants/providers.ts-এর Zod schema বৈধ- সব provider-এর প্রয়োজনীয় field (
id,label,kind, ইত্যাদি) রয়েছে - নতুন বিনামূল্যের provider-এর জন্য
freeNoteদেওয়া হয়েছে - OAuth provider-গুলোর
oauthConfig,src/lib/oauth/constants/oauth.ts-এ নিবন্ধিত
- সব provider-এর প্রয়োজনীয় field (
- নতুন provider যোগ করা হলে:
open-sse/executors/-এ সংশ্লিষ্ট executor রয়েছে - ফরম্যাটটি OpenAI-এর না হলে:
open-sse/translator/-এ translator রয়েছে - Model-গুলো
open-sse/config/providerRegistry.ts-এ নিবন্ধিত tests/unit/-এর unit test-গুলো provider classification এবং routing কভার করে
ডেস্কটপ (Electron)
যদি electron/ পরিবর্তিত হয়ে থাকে:
npm run electron:smoke:packagedসফল হয়:win,:mac,:linux-এর মধ্যে অন্তত একটির build পরীক্ষা করা হয়েছে- Code signing certificate-এর মেয়াদ শেষ হয়নি (signing করা হলে)
electron/package.json-এর version, rootpackage.json-এর সঙ্গে মেলেstable-এ release করা হলে auto-update channel pointer হালনাগাদ করা হয়েছে
Build বিন্যাস
Repository-টি তিনটি স্বতন্ত্র output directory ব্যবহার করে — এগুলো কখনো গুলিয়ে ফেলবেন না:
| Directory | উদ্দেশ্য | ট্র্যাক করা হয়? |
|---|---|---|
src/ |
Application source (TypeScript / TSX) | হ্যাঁ |
.build/ |
Build-এর মধ্যবর্তী ফাইল — next build output (distDir) |
না (gitignored) |
dist/ |
বিতরণযোগ্য npm bundle — assembleStandalone দ্বারা প্রস্তুত |
না (gitignored) |
অপারেটরের নোট: remote VPS image directory এখনও
/usr/lib/node_modules/omniroute/app/। কেবল repository-এর ভেতরের build output সরানো হয়েছে (app/→dist/)। Deploy skill-গুলোdist/-এর বিষয়বস্তু remoteapp/directory-তে rsync করে — VPS path-এ কোনো পরিবর্তন প্রয়োজন নেই।
একক-build প্রবাহ:
npm run build:release
└─ rm -rf .build dist (পরিষ্কার)
└─ next build → .build/next/ (মধ্যবর্তী ফাইল)
└─ assembleStandalone (standalone + static + public + natives → dist/-এ কপি করে)
└─ writes dist/BUILD_SHA (HEAD sentinel লেখে)
Deploy-এর জন্য npm run build চালিয়ে পরে আলাদাভাবে npm run build:cli চালাবেন না — এর পরিবর্তে
npm run build:release ব্যবহার করুন, যা একটি command-এই clean rebuild + sentinel সম্পন্ন করে।
Artifact যাচাইকরণ
npm run build:releaseসফল হয় এবংdist/BUILD_SHA==git rev-parse --short HEADnpm run check:pack-artifactপরিষ্কার — কোনোapp.__qa_backup,scripts/scratch,package-lock.jsonবা অন্য কোনো স্থানীয় অবশিষ্টাংশ নেই- Build-এর পর
dist/server.jsবিদ্যমান
Tagging ও Release
/generate-release-cc(Claude Code skill) চালান:vX.Y.Ztag তৈরি করে- Tag এবং branch push করে
- Changelog body-সহ GitHub Release খোলে
- Electron installer সংযুক্ত করে (build করা থাকলে)
- অথবা ম্যানুয়ালি:
git tag -a vX.Y.Z -m "Release vX.Y.Z" git push origin vX.Y.Z gh release create vX.Y.Z --notes-from-tag
Deploy
Deploy skill-গুলো হালকা rsync প্রবাহ ব্যবহার করে — কোনো npm pack বা npm i -g নয়:
- Target-এর সঙ্গে মেলে এমন deploy skill ব্যবহার করুন:
/deploy-vps-local-cc— local VPS (192.168.0.15)/deploy-vps-akamai-cc— Akamai VPS (69.164.221.35)/deploy-vps-both-cc— উভয়টি
- Deploy করার আগে নিশ্চিত করুন
dist/BUILD_SHA==git rev-parse --short HEAD - যেখানে
node_modulesবাস্তব, সেখানেই build চালাতে হবে (মূল checkout অথবাnpm ciচালানো worktree — symlink করা worktree নয়) - Deploy করা instance-এর smoke test করুন:
/dashboard/healthখুলুন → version string release-এর সঙ্গে মেলে কি না পরীক্ষা করুন- পরিচিত একটি provider-এর বিপরীতে
/v1/chat/completionsrequest চালান - যাচাই করুন যে
/api/monitoring/health,CLOSEDcircuit breaker ফেরত দেয় - MCP transport-গুলো সাড়া দেয় কি না নিশ্চিত করুন (
/mcpHTTP,/mcp-sseSSE)
Release-পরবর্তী
/capture-release-evidences-ccচালান (Claude Code skill)- নতুন ফিচারগুলোর WebP স্ক্রিনশট/রেকর্ডিং ধারণ করে
- রিলিজ নোট / ব্লগ পোস্টে সংযুক্ত করে
- রিলিজ ঘোষণাসহ GitHub Discussions / Discord আপডেট করুন
- পরবর্তী সংস্করণের জন্য milestone খুলুন
- গুরুত্বপূর্ণ হলে: আলোচনাটি pin করুন অথবা অ্যাপের অভ্যন্তরীণ ব্যানারের জন্য
news.json-এ পোস্ট করুন
Radar-এর সর্বজনীন লঞ্চ গেট
Radar ঘোষণাটি ইচ্ছাকৃতভাবে active: false সহ commit করা হয়েছে। নিচের প্রতিটি আইটেমের প্রমাণ পাওয়ার পর আলাদা একটি পরিবর্তনের মাধ্যমে এটি সক্রিয় করতে হবে:
- সব stacked Radar PR merge করা হয়েছে এবং release-tip CI সবুজ রয়েছে
RADAR_ENABLEDডিফল্টভাবে বন্ধ রেখেই OSS Radar routes deploy ও smoke test করুন- নির্দিষ্ট Radar host-এ
GET /planos,/termos,/privacidade, এবং/reembolsosmoke test করুন - private service-এ operator-এর পরিচয়/যোগাযোগ/ঠিকানা এবং owner-অনুমোদিত আইনি পর্যালোচনা রেকর্ড করুন
- শুধু test mode-এ Stripe Checkout এবং signed webhook পরীক্ষা করুন
- অনুমোদিত sender/domain দিয়ে একটি encrypted transactional-email delivery পরীক্ষা করুন
- backup restore এবং তত্ত্বাবধানে পরিচালিত, budget-capped একটি research run সফলভাবে প্রমাণ করুন
- donation evidence গ্রহণের আগে BRL/PIX review policy অনুমোদন করুন
- আগের gate-গুলো সম্পন্ন হওয়ার পরেই public Checkout সক্রিয় করুন, তারপর নতুন
news.jsonID সক্রিয় করুন - যাচাই করুন যে Home banner স্থানীয়কৃত copy ব্যবহার করে এবং পুরোনো কোনো ID dismiss করার পর নতুন একটি ID আবার প্রদর্শিত হয়
এমবেডেড সার্ভিসেস স্মোক পরীক্ষা (v3.8.4+)
এম্বেডেড সার্ভিসে পরিবর্তন অন্তর্ভুক্ত রয়েছে—এমন কোনো রিলিজ প্রকাশের আগে যাচাই করুন:
নতুন-DB বুট (মাইগ্রেশন সংঘর্ষ শনাক্ত করে — v3.8.4 হটফিক্সের পরে যোগ করা হয়েছে)
DATA_DIR=$(mktemp -d) npm start &— বুটের জন্য 10 s অপেক্ষা করুন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/install2 min-এর মধ্যেinstalledVersion-সহ 200 ফেরত দেয়POST /api/services/9router/start30 s-এর মধ্যে 200 এবংstate: "running"ফেরত দেয়GET /api/services/9router/statusথেকেhealth: "healthy"রিপোর্ট করা হয়"model": "9router/auto/..."-সহPOST /v1/chat/completions200 ফেরত দেয় (9Router-এর মাধ্যমে এন্ড-টু-এন্ড রাউটিং)GET /dashboard/providers/services/9router/embed/dashboardপ্রক্সির ভেতরে 9Router-এর নেটিভ UI রেন্ডার করে (সরাসরি127.0.0.1:portiframe নয়)POST /api/services/9router/rotate-keyথেকে{ keyRotated: true }ফেরত আসে এবং সার্ভিসটি ত্রুটিমুক্তভাবে পুনরায় চালু হয়POST /api/services/9router/stop200 এবংstate: "stopped"ফেরত দেয়GET /api/services/9router/logs?tail=50সাম্প্রতিক লাইনসমৃদ্ধsnapshotইভেন্টসহ SSE স্ট্রিম ফেরত দেয়- PATH-এ
npmনেই এমন পরিবেশে ইনস্টল করলে ব্যবহারবান্ধব (স্ট্যাক ট্রেসবিহীন) ত্রুটি বার্তাসহ 500 ফেরত আসে
CLIProxyAPI
POST /api/services/cliproxy/install2 min-এর মধ্যে 200 ফেরত দেয়POST /api/services/cliproxy/start30 s-এর মধ্যে 200 এবংstate: "running"ফেরত দেয়GET /api/services/cliproxy/statusথেকেhealth: "healthy"রিপোর্ট করা হয়POST /api/services/cliproxy/stop200 এবংstate: "stopped"ফেরত দেয়GET /api/services/cliproxy/logs?tail=50SSE স্ট্রিম ফেরত দেয়
নিরাপত্তা রিগ্রেশন
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 --traymacOS-এ বুট হয় (~/.omniroute/runtime/-এ systray2 ইনস্টল করা থাকে)omniroute --trayLinux-এ বুট হয় (DISPLAY আবশ্যক; সেট করা না থাকলে মার্জিতভাবে ত্রুটি দেখায়)omniroute --trayWindows-এ বুট হয় (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-এ একই স্থানে রাখে, যাতে ওয়ার্কারটি একটি মাত্র@huggingface/transformers^4.2.0 ইনস্ট্যান্স রিজলভ করে — স্বতন্ত্র ট্রেস শুধু transformers বান্ডল করে, ডায়নামিকভাবে ইমপোর্ট করা ঐচ্ছিকগুলো নয়; তাই এটি না থাকলে ওয়ার্কার root-এর transformers-এর বিপরীতে llmlingua-2 লোড করবে এবং SLM টিয়ারটি কোনো বার্তা ছাড়াই fail-open করবে। - কোনো
.envছাড়াইomniroute statusকাজ করে (CLI টোকেন পাথ, কেবল লুপব্যাক) curl http://localhost:20128/api/shutdownথেকে 401 ফেরত আসে (সর্বদা-সুরক্ষিত রুট)curl -H "host: evil.com" http://localhost:20128/api/mcp/sseথেকে 401 ফেরত আসে (লুপব্যাক গার্ড)- প্রথমবার চালানোর সময় SQLite রানটাইম
bundled-এ রিজলভ হয় (বান্ডল করা বাইনারিটি প্ল্যাটফর্মের জন্য বৈধ) node_modules/better-sqlite3মুছে ফেলা হলে SQLite রানটাইমruntime-এ ফলব্যাক করে- Smart MCP ফিল্টার প্রকৃত
playwright-mcp browser_snapshotআউটপুট সংকুচিত করে (≥50% হ্রাস) skills/omniroute*/SKILL.md-এর সব 10টি ফাইল raw GitHub URL-এর মাধ্যমে সর্বজনীনভাবে আনা যায়- নতুন সেটআপে অনবোর্ডিং উইজার্ড "How It Works" টিয়ার ট্যুর ধাপ দেখায়
- হোম ড্যাশবোর্ডের টিয়ার কভারেজ উইজেট কনফিগার করা/সক্রিয় সংখ্যাগুলো দেখায়
রোলব্যাক
রিলিজে গুরুতর সমস্যা থাকলে:
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-এ কমিট করবেন না - কখনোই
mainবাrelease/*ব্রাঞ্চেgit push --forceব্যবহার করবেন না - কখনোই 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 জব) এই যাচাই চালায়।