# Release Checklist (සිංහල) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/RELEASE_CHECKLIST.md) · 🇪🇹 [am](../../../am/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇦 [ar](../../../ar/docs/ops/RELEASE_CHECKLIST.md) · 🇦🇿 [az](../../../az/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇬 [bg](../../../bg/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇩 [bn](../../../bn/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇦 [bs](../../../bs/docs/ops/RELEASE_CHECKLIST.md) · 🇨🇿 [cs](../../../cs/docs/ops/RELEASE_CHECKLIST.md) · 🇩🇰 [da](../../../da/docs/ops/RELEASE_CHECKLIST.md) · 🇩🇪 [de](../../../de/docs/ops/RELEASE_CHECKLIST.md) · 🇬🇷 [el](../../../el/docs/ops/RELEASE_CHECKLIST.md) · 🇪🇸 [es](../../../es/docs/ops/RELEASE_CHECKLIST.md) · 🇪🇪 [et](../../../et/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇷 [fa](../../../fa/docs/ops/RELEASE_CHECKLIST.md) · 🇫🇮 [fi](../../../fi/docs/ops/RELEASE_CHECKLIST.md) · 🇫🇷 [fr](../../../fr/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇪 [ga](../../../ga/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [gu](../../../gu/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [ha](../../../ha/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇱 [he](../../../he/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [hi](../../../hi/docs/ops/RELEASE_CHECKLIST.md) · 🇭🇷 [hr](../../../hr/docs/ops/RELEASE_CHECKLIST.md) · 🇭🇺 [hu](../../../hu/docs/ops/RELEASE_CHECKLIST.md) · 🇦🇲 [hy](../../../hy/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇩 [id](../../../id/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [ig](../../../ig/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇹 [it](../../../it/docs/ops/RELEASE_CHECKLIST.md) · 🇯🇵 [ja](../../../ja/docs/ops/RELEASE_CHECKLIST.md) · 🇬🇪 [ka](../../../ka/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇭 [km](../../../km/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [kn](../../../kn/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇷 [ko](../../../ko/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇹 [lt](../../../lt/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇻 [lv](../../../lv/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ml](../../../ml/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [mr](../../../mr/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇾 [ms](../../../ms/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇹 [mt](../../../mt/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇲 [my](../../../my/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇵 [ne](../../../ne/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇱 [nl](../../../nl/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇴 [no](../../../no/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [or](../../../or/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [pa](../../../pa/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇭 [phi](../../../phi/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇱 [pl](../../../pl/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇹 [pt](../../../pt/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇴 [ro](../../../ro/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇺 [ru](../../../ru/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇰 [sk](../../../sk/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇮 [sl](../../../sl/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇸 [sr](../../../sr/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇪 [sv](../../../sv/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇪 [sw](../../../sw/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ta](../../../ta/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [te](../../../te/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇭 [th](../../../th/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇷 [tr](../../../tr/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇰 [ur](../../../ur/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇿 [uz](../../../uz/docs/ops/RELEASE_CHECKLIST.md) · 🇻🇳 [vi](../../../vi/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [yo](../../../yo/docs/ops/RELEASE_CHECKLIST.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/RELEASE_CHECKLIST.md) --- > **අවසන් වරට යාවත්කාලීන කළේ:** 2026-08-28 — v3.8.51 > ස්වයංක්රීයකරණය සඳහා Claude Code කුසලතා භාවිත කරන සරල කළ නිකුතු ප්රවාහයකි. > > **නිකුතු අතරතුර පෝලිම/ශාඛාව හරිත තත්ත්වයේ තබා ගන්න:** [RELEASE_GREEN.md](./RELEASE_GREEN.md) බලන්න > (`/green-prs` පවුල + `npm run check:release-green` + `/babysit` + රාත්රී ක්රියාවලිය). මෙය වරින් වර — විශේෂයෙන්ම > මෙම පිරික්සුම් ලැයිස්තුවට **පෙර** — ධාවනය කිරීමෙන් නිකුතු PR එක හරිත තත්ත්වයෙන් ආරම්භ වේ. ## කෙටියෙන් ```bash # 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 විශ්වාසනීය ප්රකාශනය (v3.8.51 සිට පෙරනිමි) — ඉල්ලීම මත අදියරගතව, විකල්ප ක්රමය ලෙස සෘජුව `npm-publish.yml` පෙරනිමියෙන් **npm Trusted Publishing (OIDC)** හරහා ප්රකාශනය කරයි: `stage-npm` කාර්යය (github-hosted) එම ධාවනය සඳහා කෙටි කාලීන npm අක්තපත්රයක් ලබාගැනීමට GitHub හි id-token හුවමාරු කරයි — ගබඩාවේ රහස් තුළ දිගුකාලීන 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` සමඟ නැවත dispatch කරන්න. ### අදියරගත ප්රකාශනය (ඉල්ලීම මත — `publish_mode=staged`) npm-publish කාර්ය ප්රවාහය තවදුරටත් සෘජුව ප්රකාශනය නොකරයි: එය ඇසුරුම් කළ tarball එක (`check:pack-boot`) ආරම්භ කර පසුව `npm stage publish` ධාවනය කරයි — නියමිත bytes registry එකෙහි රඳවා තබන අතර, හිමිකරු අනුමත කරන තෙක් ඒවා **ස්ථාපනය කළ නොහැක**. මානව 2FA ද්වාරය සාක්ෂියට පෙර නොව, ඉන් පසුවට ගෙන ගොස් ඇත. **කාර්ය ප්රවාහය හරිත වූ පසු හිමිකරුගේ ප්රවාහය:** 1. `npm stage list omniroute` — අදියර id එක සොයා ගන්න (එය කාර්ය ප්රවාහ සාරාංශයේද මුද්රණය වේ). 2. අදියරගත bytes තහවුරු කරන්න (නිර්දේශිතයි): `npm stage download `, ඉන්පසු බාගත කළ tarball එක තාවකාලික prefix එකකට ස්ථාපනය කර එය ආරම්භ කරන්න (`npm run check:pack-boot` මඟින් CI තුළ එම pack→install→boot තීන්දුවම ස්වයංක්රීය කරයි). 3. `npm stage approve ` — 2FA විමසුමම ප්රකාශනය වේ. `npm stage reject ` මඟින් එය ඉවත දමයි. 4. ප්රකාශනයෙන් පසු ආරක්ෂණය: ප්රකාශනයෙන් පසු සත්යාපකය (v3.8.49 සැලැස්මේ WS1.4) පිරිසිදු container එකක් තුළ පොදු registry එකෙන් ප්රකාශිත අනුවාදය ස්ථාපනය කර එය ආරම්භ කරයි. **හදිසි විකල්ප ක්රමය:** `publish_mode=direct` සමඟ `workflow_dispatch` භාවිත කිරීමෙන් පැරණි ක්ෂණික `npm publish` ක්රමය නැවත ලබා ගත හැක (අදියරගත කිරීමම නිසි ලෙස ක්රියා නොකරන්නේ නම් පමණක් භාවිත කර හේතුව සටහන් කරන්න). **එක් වරක් පමණක් සිදු කරන ශක්තිමත් කිරීම (හිමිකරු, npmjs.com):** `omniroute` සඳහා Trusted Publisher එක stage-only ප්රකාරයෙන් වින්යාස කරන්න, එවිට කාන්දු වූ දිගුකාලීන ටෝකනයකට කිසිදු ස්ථානයකින් සෘජුව `npm publish` කළ නොහැක — CI හට අදියරගත කිරීම පමණක් කළ හැකි අතර, නිකුතුව කළ හැක්කේ හිමිකරුගේ 2FA මඟින් පමණි. **බිඳුණු කෞතුකය සඳහා ක්රියාමාර්ග මාර්ගෝපදේශය (වෙනස් කර නැත):** පෙරනිමි ප්රතිචාරය ලෙස `npm deprecate omniroute@ " — use "` භාවිත කරන්න (මිනිත්තු කිහිපයක් ගනී, ආපසු හැරවිය හැක); `npm unpublish` භාවිත කළ යුත්තේ පැය 72/යැපෙන්නන්-නොමැති කාල කවුළුව තුළ පමණක් වන අතර කිසිවිටෙකත් පළමු පියවර ලෙස නොවේ. Docker: අනුවාද ටැගයක් කිසිවිටෙක නැවත ලියන්න එපා — ආපසු හැරවීම යනු `latest` අවසන් හොඳ digest එක වෙත නැවත යොමු කිරීමයි. **Docker Hub `latest` (සෑම ස්ථායී SemVer ප්රකාශනයකදීම අනිවාර්යයි):** `docker-publish` කාර්ය ප්රවාහය විසින් `X.Y.Z` සහ, මෙය ඉහළම ස්ථායී SemVer බවට `should-promote-latest.sh` එකඟ වන විට, `:latest` යන **දෙකම** එකම **digest** එකෙන් ටැග් කළ යුතුය. කාර්යය අවසන් වූ පසු: Hub හි `latest` digest එක නව SemVer digest එකට සමාන වන අතර `last_updated` ඉදිරියට ගොස් තිබිය යුතුය. git තුළ පමණක් පවතින නිවැරදි කිරීම් ගැන නිකුතු සටහන් සඳහන් කරන අතරතුර `:latest` පැරණි build එකක් මත තබා නොයන්න. Compose ඉක්මන් ආරම්භක මාර්ගෝපදේශ `:latest` භාවිත කරයි; GitOps විසින් `X.Y.Z` වෙත pin කිරීම දිගටම කළ යුතුය. [Docker නිකුතු නාලිකා](../guides/DOCKER_GUIDE.md#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`). ඉලක්කය: මිනිත්තු ~33ක් වෙනුවට ≤15min තුළ හරිත තත්ත්වයට ළඟා වීම. **ඇතුළත් වීමේ ප්රතිපත්තිය — හතරම අවශ්යයි (Chromium/VS Code/Node හදිසි මාර්ග ආදර්ශයට ගෙන ඇත):** 1. **බරපතළකම**: නිෂ්පාදන පද්ධතිය ක්රියා විරහිතයි — ප්රකාශිත artifact එකක් ආරම්භයේදී බිඳ වැටීම / ආරක්ෂක නිවැරදි කිරීමක් / නිකුතුව භාවිත කරන සෑම පරිශීලකයෙකුම බලපෑමට ලක්වීම. "වැදගත්" යනු "ක්රියා විරහිත" නොවේ. 2. **අධිකාරිය**: `hotfix` ලේබලය යොදන්නේ repository හිමිකරු පමණි. ලේබලයම අනුමැතියයි — campaign PR එකකදී කිසිවිටෙක ස්වයං සේවාවක් ලෙස මෙය භාවිත නොකරන්න. 3. **සාක්ෂි**: PR body එකේ පෙර සම්පූර්ණයෙන්ම හරිත වූ බර ධාවනයට (මඟහැරුණු jobs මඟින් නැවත වලංගු කිරීමට නියමිත suite එක) සහ නිවැරදි කිරීමේම අසමත්-වී-පසුව-සමත් වූ පරීක්ෂණයට සබැඳි ඇතුළත් වේ. 4. **විෂය පථය**: cherry-pick පමණි — අවම නිවැරදි කිරීම පමණක්; refactor කිරීම් හෝ අමතර වෙනස්කම් නැත. මඟහැරුණු coverage/ratchet පෘෂ්ඨය release branch එකේ මීළඟ සම්පූර්ණ ධාවනයෙන් නැවත වලංගු කරයි (අඛණ්ඩ release-green) — මෙම මාර්ගය මඟහරින්නේ රැඳී සිටීම පමණි, වලංගු කිරීම කිසිවිටෙක නොවේ. පරීක්ෂණ-පමණක් ඇති වෙනස්කම් (`tests/` යටතේ ඇති සියලු ගොනු, `tests/e2e/` යටතේ කිසිවක් නැති විට) කිසිදු ලේබලයක් නොමැතිව E2E න්යාසය ස්වයංක්රීයව මඟහරී. ## සවිස්තරාත්මක පිරික්සුම් ලැයිස්තුව ### නිකුතුවට පෙර - [ ] මෙම නිකුතුව ඉලක්ක කරගත් සියලු PR `release/vX.Y.0` වෙත merge කර ඇත - [ ] මෙම අනුවාදය සඳහා විවෘතව ඇති සියලු Linear/issue අයිතම වසා හෝ මීළඟ milestone එකට ගෙන ගොස් ඇත - [ ] `release/vX.Y.0` branch එකේ CI හරිතයි - [ ] කේතයේ `TODO(release)` සලකුණු නැත: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker base image එක යාවත්කාලීනයි (දැනට `node:24.15.0-trixie-slim`) ### අනුවාදය සහ වෙනස්කම් ලේඛනය - [ ] `/version-bump-cc ` ධාවනය කරන්න (Claude Code skill) - `package.json`, `electron/package.json` අනුවාද ඉහළ නංවයි - අවසන් tag එකෙන් පසු git commits මත පදනම්ව `CHANGELOG.md` නැවත ජනනය කරයි - README.md badges යාවත්කාලීන කරයි - [ ] CHANGELOG.md අතින් සමාලෝචනය කර අවශ්ය නම් commit messages පිරිසිදු කරන්න - [ ] `CHANGELOG.md` හි නවතම semver කොටස `package.json` අනුවාදයට සමාන බව තහවුරු කරන්න - [ ] ඉදිරි වැඩ සඳහා `## [Unreleased]` පළමු changelog කොටස ලෙස තබා ගන්න - [ ] `docs/openapi.yaml` යාවත්කාලීන කරන්න → `info.version` අගය `package.json` අනුවාදයට සමාන විය යුතුය ### කේත ගුණාත්මකභාවය - [ ] `npm run lint` — දෝෂ 0යි (අනතුරු ඇඟවීම් පෙර සිට පැවති ඒවාය) - [ ] `npm run typecheck:core` — දෝෂ රහිතයි - [ ] `npm run typecheck:noimplicit:core` — දෝෂ රහිතයි (දැඩි) - [ ] `npm run check:cycles` — චක්රීය dependencies නැත - [ ] `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 දොරටුව සපුරා ඇත (statements/lines/functions/branches) - [ ] `npm run test:integration` — සමත් (වෙනස්කම් DB / handlers ස්පර්ශ කරන්නේ නම්) - [ ] `npm run test:combo:matrix` — සමත් (combo strategy matrix: පොදු routing strategies 19ම තේරීමේ තීරණ නියත ලෙස සනාථ කරයි; combo routing, strategy resolution හෝ fallback logic වෙනස් කරන විට ධාවනය කරන්න) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **විකල්ප/අතින්** (දොරටුවකින් පාලනය වන සැබෑ-upstream smoke පරීක්ෂණය; VPS `root@192.168.0.15` වෙතින් කියවීමට-පමණක් හැකි DB snapshot එකක් ලබා ගනී; සැබෑ providers වෙත ප්රවේශ වන අතර credits වැය වේ; CI තුළ කිසිවිටෙක ධාවනය නොවේ; දොරටුව නොමැති විට ගැටලුවකින් තොරව මඟහරී) - [ ] `npm run test:combo:live:vps` — **විකල්ප/අතින්** (Phase-3 VPS සජීවී smoke පරීක්ෂණය: සාමාන්ය Node ESM හරහා සජීවී `.15` server එකට එරෙහි HTTP අවස්ථා 7ක්; `ssh root@192.168.0.15` අවශ්යයි; නිර්මාණය/මකා දමන්නේ `__live_test__*` combos පමණි; සැබෑ providers වෙත ප්රවේශ වේ; CI තුළ කිසිවිටෙක ධාවනය නොවේ) - [ ] `npm run test:e2e` — සමත් (UI වෙනස්කම්) - [ ] `npm run test:protocols:e2e` — සමත් (MCP/A2A වෙනස්කම්) - [ ] `npm run test:ecosystem` — සමත් ### Hooks (Husky මඟින් වලංගු කර ඇත) Husky hooks `.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-unit` job එකෙන් ආවරණය වේ). - release branches push කිරීමට පෙර `npm run test:unit` අතින් ධාවනය කරන්න. hook එකක් අසමත් වුවහොත්: මූලික ගැටලුව නිවැරදි කරන්න, `--no-verify` භාවිතයෙන් මඟ නොහරින්න. ### සම්මත Commits නිකුතුවට අදාළ සියලු commits `type(scope): subject` ආකෘතිය අනුගමනය කළ යුතුය. **වලංගු types:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `style`, `ci` **වලංගු scopes:** `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:` footer එකක් හෝ 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` අතර env ගිවිසුම නොවෙනස්ව පවතී - [ ] `npm run check:doc-links` 0 සමඟ අවසන් වේ — ප්රතිව්යුහගත කිරීමෙන් පසු බිඳුණු අභ්යන්තර markdown යොමු නොමැත - [ ] ගබඩාකරණ/runtime වෙනස්වීම් සඳහා `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` යාවත්කාලීන කර ඇත - [ ] නව විශේෂාංගය module එකක් නම්: වෙන් කළ `docs/.md` ගොනුවක් පවතී - [ ] පසුගාමී අනුකූලතාව බිඳින වෙනසක් නම්: `docs/guides/TROUBLESHOOTING.md` තුළ සංක්රමණ සටහනක් ඇත ### i18n - [ ] `npm run i18n:check` 0 සමඟ අවසන් වේ — පරිවර්තන තත්ත්වය (`.i18n-state.json`) මූලාශ්ර ලේඛන සමඟ සමමුහුර්තව ඇත (strict mode තුළ වෙනස්වී ඇති මූලාශ්ර නොමැත; අවසන් මොහොතේ ලේඛන සංශෝධන සඳහා warn-mode උපදේශනය පිළිගත හැකි නමුත් tag කිරීමට පෙර එය 0 විය යුතුය) - [ ] `npm run i18n:check-ui-coverage` 0 සමඟ අවසන් වේ — සෑම UI locale එකක්ම 80% ආවරණ අවම සීමාවට හෝ ඊට ඉහළින් ඇත - [ ] `npm run i18n:sync-ui:dry` locale 42 සියල්ල පුරා අස්ථානගත keys 0ක් වාර්තා කරයි - [ ] මූලාශ්ර ඉංග්රීසි ලේඛන වෙනස් වූයේ නම්, tag කිරීමට පෙර `npm run i18n:run` ධාවනය කරන්න (`.env` තුළ `OMNIROUTE_TRANSLATION_API_KEY` අවශ්ය වේ) - [ ] සුළු වෙනස්කම් නම් පරිවර්තන දායකත්ව ඊළඟ නිකුතුව දක්වා කල් දැමිය හැකිය (CHANGELOG තුළ සටහන් කරන්න) ### දත්ත සමුදා සංක්රමණ - [ ] `src/lib/db/migrations/` තුළ නව ගොනු තිබේ නම්: - [ ] සෑම migration එකක්ම idempotent වේ (`CREATE TABLE IF NOT EXISTS`, ආදිය) - [ ] Migrations transactions තුළ ආවරණය කර ඇත - [ ] නිවැරදිව අංකනය කර ඇත (අනුපිළිවෙළේ හිඩැස් නොමැත) - [ ] නැවුම් ස්ථාපනයක පරීක්ෂා කරන්න: `~/.omniroute/omniroute.db` මකා `npm run dev` ධාවනය කරන්න - [ ] පවතින ස්ථාපනයක පරීක්ෂා කරන්න: DB උපස්ථ කර, migration එක ධාවනය කර, schema එක සත්යාපනය කරන්න - [ ] migration එක tables නැවත ලියන්නේ නම් WAL ගොනු (`-wal`, `-shm`) නිවැරදිව හසුරුවා ඇත ### Provider නාමාවලිය (Zod මඟින් වලංගු කළ) - [ ] `src/shared/constants/providers.ts` Zod schema එක පූරණ අවස්ථාවේ වලංගුය - [ ] සියලු providers සතුව අවශ්ය fields (`id`, `label`, `kind`, ආදිය) ඇත - [ ] නව නොමිලේ providers සඳහා `freeNote` සපයා ඇත - [ ] OAuth providers සඳහා `src/lib/oauth/constants/oauth.ts` තුළ `oauthConfig` ලියාපදිංචි කර ඇත - [ ] නව provider එකක් එක් කළේ නම්: `open-sse/executors/` තුළ අදාළ executor එක ඇත - [ ] OpenAI නොවන ආකෘතියක් නම්: `open-sse/translator/` තුළ translator එක ඇත - [ ] Models `open-sse/config/providerRegistry.ts` තුළ ලියාපදිංචි කර ඇත - [ ] `tests/unit/` තුළ unit tests provider වර්ගීකරණය සහ routing ආවරණය කරයි ### Desktop (Electron) `electron/` වෙනස් වූයේ නම්: - [ ] `npm run electron:smoke:packaged` සමත් වේ - [ ] `:win`, `:mac`, `:linux` අතරින් අවම වශයෙන් එකක් සඳහා builds පරීක්ෂා කර ඇත - [ ] Code signing certificates කල් ඉකුත් වී නොමැත (signing භාවිත කරන්නේ නම්) - [ ] `electron/package.json` version එක root `package.json` සමඟ ගැළපේ - [ ] `stable` වෙත නිකුත් කරන්නේ නම් auto-update channel pointer එක යාවත්කාලීන කර ඇත ### Build සැකැස්ම Repository එක එකිනෙකට වෙනස් output directories තුනක් භාවිත කරයි — ඒවා කිසිවිටෙක පටලවා නොගන්න: | Directory | අරමුණ | Track කර තිබේද? | | --------- | ------------------------------------------------------------------ | ---------------- | | `src/` | යෙදුම් මූලාශ්රය (TypeScript / TSX) | ඔව් | | `.build/` | Build අතරමැදි ගොනු — `next build` output (`distDir`) | නැත (gitignored) | | `dist/` | බෙදාහැරිය හැකි npm bundle එක — `assembleStandalone` මඟින් සකසන ලදී | නැත (gitignored) | > **මෙහෙයුම්කරුගේ සටහන:** දුරස්ථ VPS image directory එක `/usr/lib/node_modules/omniroute/app/` ලෙසම පවතී. > වෙනස් වූයේ repository එක **තුළ ඇති** build output එක පමණි (`app/` → `dist/`). Deploy skills මඟින් > `dist/` හි අන්තර්ගතය දුරස්ථ `app/` dir එක වෙත 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` ධාවනය නොකරන්න — එක් command එකකින් පිරිසිදු rebuild එකක් + sentinel එකක් සිදු කරන `npm run build:release` භාවිත කරන්න. ### 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`, හෝ වෙනත් local residue නොමැත - [ ] Build කිරීමෙන් පසු `dist/server.js` පවතී ### Tag කිරීම සහ නිකුතුව - [ ] `/generate-release-cc` ධාවනය කරන්න (Claude Code skill): - `vX.Y.Z` tag එක සාදයි - Tag එක සහ branch එක push කරයි - Changelog අන්තර්ගතය සමඟ GitHub Release එකක් විවෘත කරයි - Electron installers අමුණයි (build කර ඇත්නම්) - [ ] නැතහොත් අතින්: ```bash 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 skills සැහැල්ලු rsync ප්රවාහය භාවිත කරයි — `npm pack` නැත, `npm i -g` නැත: - [ ] ඉලක්කයට ගැළපෙන 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 එක නිකුතුව සමඟ ගැළපෙන බව පරීක්ෂා කරන්න - දන්නා provider එකකට එරෙහිව `/v1/chat/completions` request එකක් ධාවනය කරන්න - `/api/monitoring/health` මඟින් `CLOSED` circuit breakers ආපසු ලබා දෙන බව සත්යාපනය කරන්න - MCP transports ප්රතිචාර දක්වන බව තහවුරු කරන්න (`/mcp` HTTP, `/mcp-sse` SSE) ### නිකුතුවෙන් පසු - [ ] `/capture-release-evidences-cc` ධාවනය කරන්න (Claude Code skill) - නව විශේෂාංගවල WebP තිර රූ/පටිගත කිරීම් ග්රහණය කරයි - ඒවා නිකුතු සටහන් / බ්ලොග් සටහනට අමුණයි - [ ] නිකුතු නිවේදනය සමඟ GitHub Discussions / Discord යාවත්කාලීන කරන්න - [ ] ඊළඟ අනුවාදය සඳහා milestone එකක් විවෘත කරන්න - [ ] තීරණාත්මක නම්: යෙදුම තුළ බැනරය සඳහා සාකච්ඡාව අමුණා තබන්න හෝ `news.json` තුළ පළ කරන්න ### Radar පොදු දියත් කිරීමේ දොරටුව Radar නිවේදනය චේතාන්විතව `active: false` සමඟ commit කර ඇත. පහත සෑම අයිතමයක් සඳහාම සාක්ෂි ලබා දීමෙන් පසු සක්රිය කිරීම වෙනම වෙනස් කිරීමකි: - [ ] අට්ටිගත කළ සියලුම Radar PR ඒකාබද්ධ කර ඇති අතර release-tip CI සාර්ථකය - [ ] පෙරනිමියෙන් `RADAR_ENABLED` තවමත් අක්රියව තබා OSS Radar මාර්ග deploy කර smoke-test කරන්න - [ ] නම් කළ Radar සත්කාරකයේ `GET /planos`, `/termos`, `/privacidade`, සහ `/reembolso` smoke-test කරන්න - [ ] ක්රියාකරුගේ අනන්යතාව/සම්බන්ධතා තොරතුරු/ලිපිනය සහ හිමිකරු විසින් අනුමත කළ නීතිමය සමාලෝචනය පුද්ගලික සේවාව තුළ සටහන් කරන්න - [ ] Stripe Checkout සහ අත්සන් කළ webhook එක පරීක්ෂණ ප්රකාරයේදී පමණක් අත්හදා බලන්න - [ ] අනුමත යවන්නා/වසම භාවිතයෙන් සංකේතනය කළ ගනුදෙනුමය ඊමේල් බෙදාහැරීමක් අත්හදා බලන්න - [ ] උපස්ථ ප්රතිසාධනය සහ අධීක්ෂණය කළ, අයවැය-සීමා කළ පර්යේෂණ ධාවනයක් සාර්ථක බව තහවුරු කරන්න - [ ] පරිත්යාග සාක්ෂි පිළිගැනීමට පෙර BRL/PIX සමාලෝචන ප්රතිපත්තිය අනුමත කරන්න - [ ] ඉහත දොරටු සම්පූර්ණ කිරීමෙන් පසුව පමණක් පොදු Checkout සක්රිය කර, අනතුරුව නව `news.json` ID එක සක්රිය කරන්න - [ ] Home බැනරය දේශීයකරණය කළ පෙළ භාවිත කරන බවත්, පැරණි ID එකක් ඉවත දැමූ පසු නව ID එකක් නැවත දිස්වන බවත් තහවුරු කරන්න ## Embedded Services ස්මෝක් පරීක්ෂාව (v3.8.4+) Embedded services වෙනස්කම් ඇතුළත් ඕනෑම නිකුතුවක් නිකුත් කිරීමට පෙර, පහත දෑ තහවුරු කරන්න: ### නව-DB ආරම්භය (migration ගැටුම් හඳුනාගනී — v3.8.4 hotfix පසු එක් කරන ලදී) - [ ] `DATA_DIR=$(mktemp -d) npm start &` — ආරම්භය සඳහා තත්පර 10ක් රැඳී සිටින්න - [ ] `curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'` මඟින් `"9router"` ආපසු ලබා දෙයි (404 හෝ 500 නොවේ). migration `071_services.sql` යෙදී ඇති බව සහ පේළිය seed කර ඇති බව තහවුරු කරයි. - [ ] `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කට අඩු කාලයකදී `installedVersion` සමඟ 200 ආපසු ලබා දෙයි - [ ] `POST /api/services/9router/start` තත්පර 30කට අඩු කාලයකදී 200 සහ `state: "running"` ආපසු ලබා දෙයි - [ ] `GET /api/services/9router/status` මඟින් `health: "healthy"` වාර්තා කරයි - [ ] `"model": "9router/auto/..."` සහිත `POST /v1/chat/completions` මඟින් 200 ආපසු ලබා දෙයි (9Router හරහා අන්තයේ සිට අන්තයට routing) - [ ] `GET /dashboard/providers/services/9router/embed/dashboard` මඟින් proxy එක තුළ 9Router ස්වදේශීය UI එක render කරයි (සෘජු `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` නොමැති පරිසරයක ස්ථාපනය කිරීමේදී, හිතකාමී (stack trace නොවන) දෝෂ පණිවිඩයක් සමඟ 500 ආපසු ලබා දෙයි ### CLIProxyAPI - [ ] `POST /api/services/cliproxy/install` මිනිත්තු 2කට අඩු කාලයකදී 200 ආපසු ලබා දෙයි - [ ] `POST /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_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, අමතර binaries නොමැත) - [ ] `omniroute config tray enable` මඟින් ස්වයංක්රීය ආරම්භක ඇතුළත් කිරීමක් සාදයි; disable කිරීමෙන් එය ඉවත් කරයි - [ ] `npm install -g omniroute@` මාරාන්තික පිටවීමකින් තොරව postinstall ධාවනය කරයි - [ ] යාවත්කාලීන කිරීමේ මාර්ගය විකල්ප dependencies රඳවා ගනී: `omniroute update --apply` සහ ස්වයංක්රීය යාවත්කාලීනකරණය `npm install -g … --include=optional` ධාවනය කරන බැවින් `optionalDependencies` (better-sqlite3, keytar, tls-client, සහ llmlingua SLM stack එක: `@atjsh/llmlingua-2@2.0.5`, `js-tiktoken`) යාවත්කාලීනයකින් පසුවත් පවතී. ultra `modelPath` SLM tier එකටද tinybert model එක අවශ්ය වන අතර, පළමු භාවිතයේදී එය `${DATA_DIR}/models/llmlingua` වෙත ස්වයංක්රීයව බාගත වේ. ඉන්පසු Postinstall (`scripts/build/colocateOptionals.mjs`) මඟින් SLM විකල්ප closure එක `dist/node_modules` තුළ එකම ස්ථානයකට ගෙන එන බැවින් worker එක තනි `@huggingface/transformers` ^4.2.0 instance එකක් resolve කරයි — ස්වාධීන trace bundles තුළ අඩංගු වන්නේ transformers පමණක් වන අතර, ගතිකව import කරන ලද optionals අඩංගු නොවේ. එබැවින් මෙය නොමැතිව worker එක root එකේ transformers සමඟ llmlingua-2 පූරණය කරන අතර SLM tier එක නිහඬව fail-open වේ. - [ ] `.env` නොමැතිව `omniroute status` ක්රියා කරයි (CLI token මාර්ගය, loopback පමණි) - [ ] `curl http://localhost:20128/api/shutdown` මඟින් 401 ආපසු ලබා දෙයි (සැමවිටම ආරක්ෂිත route එක) - [ ] `curl -H "host: evil.com" http://localhost:20128/api/mcp/sse` මඟින් 401 ආපසු ලබා දෙයි (loopback ආරක්ෂකය) - [ ] පළමු ධාවනයේදී SQLite runtime එක `bundled` වෙත resolve වේ (bundled binary එක platform එක සඳහා වලංගුය) - [ ] `node_modules/better-sqlite3` මකා දැමූ විට SQLite runtime එක `runtime` වෙත fallback වේ - [ ] Smart MCP filter එක සත්ය `playwright-mcp browser_snapshot` ප්රතිදානය සම්පීඩනය කරයි (≥50% අඩු කිරීමක්) - [ ] `skills/omniroute*/SKILL.md` ගොනු 10ම raw GitHub URL හරහා පොදු ලෙස ලබාගත හැක - [ ] නව සැකසුමකදී onboarding wizard එක "එය ක්රියා කරන ආකාරය" tier සංචාර පියවර පෙන්වයි - [ ] මුල් dashboard එකේ tier coverage widget එක වින්යාස කළ/සක්රිය ගණන පෙන්වයි --- ## ආපසු පෙරළීම නිකුතුවේ බරපතළ ගැටලුවක් තිබේ නම්: 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` වෙත සෘජුව commit නොකරන්න - කිසිවිටෙකත් `main` හෝ `release/*` ශාඛා වෙත `git push --force` භාවිත නොකරන්න - කිසිවිටෙකත් Husky hooks (`--no-verify`) මඟ නොහරින්න - කිසිවිටෙකත් රහස්, ප්රවේශ අක්තපත්ර, හෝ `.env` ගොනු commit නොකරන්න - ආවරණය ≥60/60/60/60 (ප්රකාශ/පේළි/ශ්රිත/ශාඛා) ලෙස පවත්වා ගත යුතුය - `src/`, `open-sse/`, `electron/`, හෝ `bin/` තුළ නිෂ්පාදන කේතය වෙනස් කරන විට සෑමවිටම පරීක්ෂණ ඇතුළත් කරන්න හෝ යාවත්කාලීන කරන්න ## ස්වයංක්රීය සමමුහුර්ත පරීක්ෂාව PR එකක් විවෘත කිරීමට පෙර ලේඛන සමමුහුර්ත ආරක්ෂකය දේශීයව ධාවනය කරන්න: ```bash npm run check:docs-sync ``` CI ද මෙම පරීක්ෂාව `.github/workflows/ci.yml` තුළ (lint කාර්යය) ධාවනය කරයි.