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

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

44 KiB
Raw Blame History

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-এর প্রবাহ:

  1. npm stage list omniroute — stage id খুঁজুন (workflow summary-তেও দেখানো হয়)।
  2. Staged bytes যাচাই করুন (সুপারিশকৃত): npm stage download <id>, তারপর ডাউনলোড করা tarball-টি একটি অস্থায়ী prefix-এ install করে বুট করুন (npm run check:pack-boot CI-তে একই pack→install→boot সিদ্ধান্ত স্বয়ংক্রিয় করে)।
  3. npm stage approve <id> — 2FA prompt-টিই হলো publish। npm stage reject <id> বাতিল করে।
  4. 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-এর জরুরি লেন অনুসারে তৈরি):

  1. তীব্রতা: production নষ্ট — প্রকাশিত কোনো artifact boot-এর সময় crash করে / একটি security fix / release-এর প্রতিটি ব্যবহারকারী প্রভাবিত। "গুরুত্বপূর্ণ" মানেই "নষ্ট" নয়।
  2. কর্তৃত্ব: কেবল repository owner-ই hotfix লেবেল প্রয়োগ করেন। লেবেলটিই অনুমোদন — campaign PR-এ এটি কখনো নিজে থেকে ব্যবহার করা যাবে না।
  3. প্রমাণ: PR body-তে পূর্ববর্তী সম্পূর্ণ-সবুজ heavy run-এর লিঙ্ক থাকে (যে suite-টি বাদ দেওয়া job-গুলো পুনরায় যাচাই করত), সঙ্গে fix-টির নিজস্ব আগে-ব্যর্থ-তারপর-সফল test।
  4. পরিধি: শুধু 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.0 branch-এ 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 section package.json version-এর সমান
  • আসন্ন কাজের জন্য ## [Unreleased]-কে changelog-এর প্রথম section হিসেবে রাখুন
  • docs/openapi.yaml হালনাগাদ করুন → info.version অবশ্যই package.json version-এর সমান হতে হবে

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; VPS root@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 .15 server-এর বিপরীতে 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-unit job দ্বারা অন্তর্ভুক্ত)।
    • release branch push করার আগে ম্যানুয়ালি npm run test:unit চালান।

কোনো 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-sync 0 দিয়ে প্রস্থান করে — কোড ↔ .env.exampledocs/reference/ENVIRONMENT.md env চুক্তি অক্ষুণ্ণ আছে
  • npm run check:doc-links 0 দিয়ে প্রস্থান করে — পুনর্গঠনের পর কোনো অভ্যন্তরীণ 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:check 0 দিয়ে প্রস্থান করে — অনুবাদের অবস্থা (.i18n-state.json) উৎস ডকুমেন্টেশনের সঙ্গে সিঙ্কে আছে (strict mode-এ কোনো বিচ্যুত উৎস নেই; শেষ মুহূর্তের ডকুমেন্টেশন সংশোধনের জন্য warn-mode পরামর্শ গ্রহণযোগ্য, তবে tagging-এর আগে এটি 0 হওয়া উচিত)
  • npm run i18n:check-ui-coverage 0 দিয়ে প্রস্থান করে — প্রতিটি 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-এর মধ্যে রাখা হয়েছে
    • সঠিকভাবে নম্বর দেওয়া হয়েছে (ক্রমে কোনো ফাঁক নেই)
  • নতুন ইনস্টলে পরীক্ষা করুন: ~/.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 যোগ করা হলে: 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, root package.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/-এর বিষয়বস্তু remote app/ 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 HEAD
  • npm 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.Z tag তৈরি করে
    • 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/completions request চালান
    • যাচাই করুন যে /api/monitoring/health, CLOSED circuit breaker ফেরত দেয়
    • MCP transport-গুলো সাড়া দেয় কি না নিশ্চিত করুন (/mcp HTTP, /mcp-sse SSE)

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, এবং /reembolso smoke 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.json ID সক্রিয় করুন
  • যাচাই করুন যে 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/install 2 min-এর মধ্যে installedVersion-সহ 200 ফেরত দেয়
  • POST /api/services/9router/start 30 s-এর মধ্যে 200 এবং state: "running" ফেরত দেয়
  • GET /api/services/9router/status থেকে health: "healthy" রিপোর্ট করা হয়
  • "model": "9router/auto/..."-সহ POST /v1/chat/completions 200 ফেরত দেয় (9Router-এর মাধ্যমে এন্ড-টু-এন্ড রাউটিং)
  • GET /dashboard/providers/services/9router/embed/dashboard প্রক্সির ভেতরে 9Router-এর নেটিভ UI রেন্ডার করে (সরাসরি 127.0.0.1:port iframe নয়)
  • POST /api/services/9router/rotate-key থেকে { keyRotated: true } ফেরত আসে এবং সার্ভিসটি ত্রুটিমুক্তভাবে পুনরায় চালু হয়
  • POST /api/services/9router/stop 200 এবং state: "stopped" ফেরত দেয়
  • GET /api/services/9router/logs?tail=50 সাম্প্রতিক লাইনসমৃদ্ধ snapshot ইভেন্টসহ SSE স্ট্রিম ফেরত দেয়
  • PATH-এ npm নেই এমন পরিবেশে ইনস্টল করলে ব্যবহারবান্ধব (স্ট্যাক ট্রেসবিহীন) ত্রুটি বার্তাসহ 500 ফেরত আসে

CLIProxyAPI

  • POST /api/services/cliproxy/install 2 min-এর মধ্যে 200 ফেরত দেয়
  • POST /api/services/cliproxy/start 30 s-এর মধ্যে 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-এ বুট হয় (~/.omniroute/runtime/-এ systray2 ইনস্টল করা থাকে)
  • 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) আপডেটের পরেও অক্ষুণ্ণ থাকে। ultra modelPath SLM টিয়ারের জন্য 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" টিয়ার ট্যুর ধাপ দেখায়
  • হোম ড্যাশবোর্ডের টিয়ার কভারেজ উইজেট কনফিগার করা/সক্রিয় সংখ্যাগুলো দেখায়

রোলব্যাক

রিলিজে গুরুতর সমস্যা থাকলে:

  1. gh release edit vX.Y.Z --prerelease (সর্বশেষ নয় হিসেবে চিহ্নিত করে)
  2. git tag -d vX.Y.Z && git push --delete origin vX.Y.Z (শুধু যদি ব্যবহারকারীরা এখনও এটি গ্রহণ না করে থাকেন)
  3. অথবা: release/vX.Y.0-এ হটফিক্স → প্যাচ রিলিজ vX.Y.(Z+1)
  4. অবিলম্বে 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 জব) এই যাচাই চালায়।