# 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) · 🇰🇷 [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) · 🇱🇰 [si](../../../si/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 # ಸಂಪೂರ್ಣ coverage ಗೇಟ್ (60/60/60/60) # 3. ಬಿಲ್ಡ್ ಮಾಡಿ ಮತ್ತು smoke ಪರೀಕ್ಷೆ ನಡೆಸಿ npm run build npm run test:e2e # ಐಚ್ಛಿಕ, ಆದರೆ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ # 4. ಬಿಡುಗಡೆಯನ್ನು ರಚಿಸಿ (ಕೌಶಲ್ಯ) /generate-release-cc # 5. ನಿಯೋಜಿಸಿ (ಕೌಶಲ್ಯ) /deploy-vps-both-cc # ಅಥವಾ akamai-cc / local-cc # 6. ಬಿಡುಗಡೆಯ ಪುರಾವೆಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ (ಕೌಶಲ್ಯ) /capture-release-evidences-cc ``` ## npm Trusted Publishing (v3.8.51 ರಿಂದ ಡೀಫಾಲ್ಟ್) — ವಿನಂತಿಯ ಮೇರೆಗೆ staged, ಪರ್ಯಾಯವಾಗಿ direct `npm-publish.yml` ಡೀಫಾಲ್ಟ್ ಆಗಿ **npm Trusted Publishing (OIDC)** ಮೂಲಕ ಪ್ರಕಟಿಸುತ್ತದೆ: `stage-npm` job (github-hosted) ಆ ಕಾರ್ಯಾಚರಣೆಗಾಗಿ GitHub ನ id-token ಅನ್ನು ಅಲ್ಪಾವಧಿಯ npm credential ಗೆ ವಿನಿಮಯ ಮಾಡುತ್ತದೆ — repository secrets ನಲ್ಲಿ ದೀರ್ಘಾವಧಿಯ npm token ಇರುವುದಿಲ್ಲ, 2FA prompt ಇರುವುದಿಲ್ಲ ಮತ್ತು provenance ಲಗತ್ತಿಸಲಾಗುತ್ತದೆ. 2FA ಅನ್ನು ಬಿಟ್ಟುಬಿಡುವ token ಗಳನ್ನು ಹಂತಹಂತವಾಗಿ ನಿವೃತ್ತಿಗೊಳಿಸುತ್ತಿರುವುದರಿಂದ ಈಗ npm ಅನುಮೋದಿಸುವ bypass ಇದೇ; ಇದು WS1.3 ಖಾತರಿಯನ್ನು ಉಳಿಸಿಕೊಂಡೇ v3.8.48 ವರೆಗೆ ಯೋಜನೆಯಲ್ಲಿದ್ದ ಸಂಪೂರ್ಣ ಸ್ವಯಂಚಾಲಿತ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಮರುಸ್ಥಾಪಿಸುತ್ತದೆ (ಸೋರಿಕೆಯಾದ token ಒಂದರಿಂದ ಮಾತ್ರ ಪ್ರಕಟಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ — ಏಕೆಂದರೆ token ಇರುವುದೇ ಇಲ್ಲ). **ಒಂದು-ಬಾರಿಯ ಸೆಟಪ್ (ಮಾಲೀಕರು):** 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 ಇನ್ನು ಮುಂದೆ ನೇರವಾಗಿ ಪ್ರಕಟಿಸುವುದಿಲ್ಲ: ಇದು ಪ್ಯಾಕ್ ಮಾಡಿದ tarball ಅನ್ನು ಬೂಟ್ ಮಾಡುತ್ತದೆ (`check:pack-boot`) ಮತ್ತು ನಂತರ `npm stage publish` ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ — ನಿಖರವಾದ bytes ಅನ್ನು registry ಯಲ್ಲಿ ಇರಿಸಲಾಗುತ್ತದೆ, ಆದರೆ ಮಾಲೀಕರು ಅನುಮೋದಿಸುವವರೆಗೆ ಅವುಗಳನ್ನು **install ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ**. ಮಾನವ 2FA ಗೇಟ್ ಅನ್ನು ಪುರಾವೆಯ ಮೊದಲು ಅಲ್ಲ, ಅದರ ನಂತರಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ. **workflow ಗ್ರೀನ್ ಆದ ನಂತರ ಮಾಲೀಕರ ಪ್ರಕ್ರಿಯೆ:** 1. `npm stage list omniroute` — stage id ಅನ್ನು ಹುಡುಕಿ (workflow ಸಾರಾಂಶದಲ್ಲಿಯೂ ಮುದ್ರಿಸಲಾಗುತ್ತದೆ). 2. staged bytes ಅನ್ನು ಪರಿಶೀಲಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ): `npm stage download `, ನಂತರ download ಮಾಡಿದ tarball ಅನ್ನು ತಾತ್ಕಾಲಿಕ prefix ನಲ್ಲಿ install ಮಾಡಿ ಮತ್ತು ಅದನ್ನು ಬೂಟ್ ಮಾಡಿ (`npm run check:pack-boot` ಅದೇ pack→install→boot ತೀರ್ಪನ್ನು CI ನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುತ್ತದೆ). 3. `npm stage approve ` — 2FA prompt ಎನ್ನುವುದೇ publish ಆಗಿದೆ. `npm stage reject ` ಅದನ್ನು ತಿರಸ್ಕರಿಸುತ್ತದೆ. 4. ಪ್ರಕಟಣೆಯ ನಂತರದ ಸುರಕ್ಷತಾ ಜಾಲ: post-publish verifier (v3.8.49 ಯೋಜನೆಯ WS1.4) ಸಾರ್ವಜನಿಕ registry ಯಿಂದ ಪ್ರಕಟಿತ ಆವೃತ್ತಿಯನ್ನು ಸ್ವಚ್ಛ container ನಲ್ಲಿ install ಮಾಡಿ ಅದನ್ನು ಬೂಟ್ ಮಾಡುತ್ತದೆ. **ತುರ್ತು ಪರ್ಯಾಯ:** `publish_mode=direct` ಜೊತೆಗೆ `workflow_dispatch` ಹಳೆಯ ತಕ್ಷಣದ `npm publish` ಅನ್ನು ಮರುಸ್ಥಾಪಿಸುತ್ತದೆ (staging ನಲ್ಲೇ ಸಮಸ್ಯೆಯಿದ್ದರೆ ಮಾತ್ರ ಬಳಸಿ; ಕಾರಣವನ್ನು ದಾಖಲಿಸಿ). **ಒಂದು-ಬಾರಿಯ ಭದ್ರತಾ ಬಲಪಡಿಸುವಿಕೆ (ಮಾಲೀಕರು, npmjs.com):** `omniroute` ಗಾಗಿ Trusted Publisher ಅನ್ನು stage-only mode ನಲ್ಲಿ ಸಂರಚಿಸಿ, ಇದರಿಂದ ಸೋರಿಕೆಯಾದ ದೀರ್ಘಾವಧಿಯ token ಯಾವುದೇ ಸ್ಥಳದಿಂದ ನೇರವಾಗಿ `npm publish` ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ — CI ಕೇವಲ stage ಮಾಡಬಹುದು; ಮಾಲೀಕರ 2FA ಮಾತ್ರ ಬಿಡುಗಡೆ ಮಾಡಬಹುದು. **ದೋಷಪೂರಿತ artifact ಕಾರ್ಯವಿಧಾನ (ಬದಲಾಗಿಲ್ಲ):** ಡೀಫಾಲ್ಟ್ ತಕ್ಷಣದ ಕ್ರಮವಾಗಿ `npm deprecate omniroute@ " — use "` ಬಳಸಿ (ನಿಮಿಷಗಳಲ್ಲಿ ಆಗುತ್ತದೆ, ಹಿಂತಿರುಗಿಸಬಹುದು); `npm unpublish` ಅನ್ನು 72h/no-dependents ಮಿತಿಯೊಳಗೆ ಮಾತ್ರ ಬಳಸಿ ಮತ್ತು ಅದನ್ನು ಎಂದಿಗೂ ಮೊದಲ ಕ್ರಮವಾಗಿ ಬಳಸಬೇಡಿ. Docker: ಆವೃತ್ತಿಯ tag ಅನ್ನು ಎಂದಿಗೂ ಮರುಬರೆಯಬೇಡಿ — rollback ಎಂದರೆ `latest` ಅನ್ನು ಕೊನೆಯ ಉತ್ತಮ digest ಕಡೆಗೆ ಮರುನಿರ್ದೇಶಿಸುವುದು. **Docker Hub `latest` (ಪ್ರತಿ ಸ್ಥಿರ SemVer ಪ್ರಕಟಣೆಯಲ್ಲೂ ಅಗತ್ಯ):** `docker-publish` workflow **ಎರಡಕ್ಕೂ** tag ಮಾಡಬೇಕು: `X.Y.Z` ಮತ್ತು `should-promote-latest.sh` ಇದು ಅತ್ಯುನ್ನತ ಸ್ಥಿರ SemVer ಎಂದು ಒಪ್ಪಿದಾಗ `:latest`; ಇವೆರಡೂ **ಒಂದೇ digest** ಹೊಂದಿರಬೇಕು. job ನಂತರ: Hub ನ `latest` digest ಹೊಸ SemVer digest ಗೆ ಸಮನಾಗಿರಬೇಕು ಮತ್ತು `last_updated` ಮುಂದಕ್ಕೆ ಸರಿದಿರಬೇಕು. release notes ನಲ್ಲಿ git ನಲ್ಲಿ ಮಾತ್ರ ಇರುವ ಪರಿಹಾರಗಳ ಬಗ್ಗೆ ಹೇಳಿರುವಾಗ `:latest` ಅನ್ನು ಹಳೆಯ build ನಲ್ಲೇ ಬಿಡಬೇಡಿ. Compose quickstart ಗಳು `: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`). ಗುರಿ: ~33min ಬದಲು ≤15min ಒಳಗೆ ಹಸಿರು ಸ್ಥಿತಿ. **ಪ್ರವೇಶ ನೀತಿ — ಎಲ್ಲಾ ನಾಲ್ಕೂ ಕಡ್ಡಾಯ (Chromium/VS Code/Node ತುರ್ತು ಲೇನ್ಗಳ ಮಾದರಿಯಲ್ಲಿ):** 1. **ತೀವ್ರತೆ**: production ಹಾಳಾಗಿದೆ — ಪ್ರಕಟಿಸಿದ artifact boot ಆಗುವಾಗ crash ಆಗುತ್ತದೆ / ಒಂದು security fix / releaseನ ಪ್ರತಿಯೊಬ್ಬ ಬಳಕೆದಾರರೂ ಪರಿಣಾಮಕ್ಕೊಳಗಾಗಿದ್ದಾರೆ. "ಮುಖ್ಯ" ಎಂದರೆ "ಹಾಳಾಗಿದೆ" ಎಂದಲ್ಲ. 2. **ಅಧಿಕಾರ**: repository owner ಮಾತ್ರ `hotfix` ಲೇಬಲ್ ಅನ್ನು ಅನ್ವಯಿಸುತ್ತಾರೆ. ಲೇಬಲ್ವೇ ಅನುಮೋದನೆ — campaign PR ನಲ್ಲಿ ಎಂದಿಗೂ ಸ್ವಯಂ-ಸೇವೆಯಾಗಿ ಬಳಸಬೇಡಿ. 3. **ಸಾಕ್ಷ್ಯ**: ಬಿಟ್ಟುಬಿಟ್ಟ jobs ಮರು-ಮೌಲ್ಯೀಕರಿಸಬೇಕಾಗಿದ್ದ suiteನ ಹಿಂದಿನ ಸಂಪೂರ್ಣ-ಹಸಿರು heavy run ಮತ್ತು fixನ ಸ್ವಂತ ಮೊದಲು-fail-ಆಗಿ-ನಂತರ-pass-ಆದ testಗೆ PR body ಲಿಂಕ್ ಮಾಡುತ್ತದೆ. 4. **ವ್ಯಾಪ್ತಿ**: cherry-pick-only — ಕನಿಷ್ಠ fix ಮಾತ್ರ; refactors ಅಥವಾ ಸಂಬಂಧವಿಲ್ಲದ ಬದಲಾವಣೆಗಳು ಬೇಡ. ಬಿಟ್ಟುಬಿಟ್ಟ coverage/ratchet ಮೇಲ್ಮೈಯನ್ನು release branchನ ಮುಂದಿನ full run ಮೂಲಕ ಮರು-ಮೌಲ್ಯೀಕರಿಸಲಾಗುತ್ತದೆ (ನಿರಂತರ release-green) — ಈ lane WAITING ಅನ್ನು ಮಾತ್ರ ಬಿಟ್ಟುಬಿಡುತ್ತದೆ, validation ಅನ್ನು ಎಂದಿಗೂ ಅಲ್ಲ. Tests-only diffs (`tests/` ಅಡಿಯಲ್ಲಿ ಎಲ್ಲಾ files, `tests/e2e/` ಅಡಿಯಲ್ಲಿ ಯಾವುದೂ ಇಲ್ಲ) ಯಾವುದೇ label ಇಲ್ಲದೆಯೇ E2E matrix ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬಿಟ್ಟುಬಿಡುತ್ತವೆ. ## ವಿವರವಾದ ಪರಿಶೀಲನಾಪಟ್ಟಿ ### ಬಿಡುಗಡೆಗೆ ಮುನ್ನ - [ ] ಈ ಬಿಡುಗಡೆಗೆ ಗುರಿಪಡಿಸಿದ ಎಲ್ಲಾ PRಗಳು `release/vX.Y.0` ಗೆ ವಿಲೀನಗೊಂಡಿವೆ - [ ] ಈ ಆವೃತ್ತಿಗಾಗಿ ತೆರೆದಿರುವ ಎಲ್ಲಾ Linear/ಸಮಸ್ಯೆ ಅಂಶಗಳನ್ನು ಮುಚ್ಚಲಾಗಿದೆ ಅಥವಾ ಮುಂದಿನ ಮೈಲಿಗಲ್ಲಿಗೆ ಮುಂದೂಡಲಾಗಿದೆ - [ ] `release/vX.Y.0` ಶಾಖೆಯಲ್ಲಿ CI ಹಸಿರು ಸ್ಥಿತಿಯಲ್ಲಿದೆ - [ ] ಕೋಡ್ನಲ್ಲಿ `TODO(release)` ಗುರುತುಗಳಿಲ್ಲ: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker ಮೂಲ ಇಮೇಜ್ ನವೀಕೃತವಾಗಿದೆ (ಪ್ರಸ್ತುತ `node:24.15.0-trixie-slim`) ### ಆವೃತ್ತಿ ಮತ್ತು ಬದಲಾವಣೆಗಳ ಪಟ್ಟಿ - [ ] `/version-bump-cc ` ಅನ್ನು ಚಲಾಯಿಸಿ (Claude Code ಕೌಶಲ್ಯ) - `package.json`, `electron/package.json` ಆವೃತ್ತಿಗಳನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ - ಕೊನೆಯ ಟ್ಯಾಗ್ನ ನಂತರದ git ಕಮಿಟ್ಗಳಿಂದ `CHANGELOG.md` ಅನ್ನು ಮರುರಚಿಸುತ್ತದೆ - README.md ಬ್ಯಾಡ್ಜ್ಗಳನ್ನು ನವೀಕರಿಸುತ್ತದೆ - [ ] CHANGELOG.md ಅನ್ನು ಕೈಯಾರೆ ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಅಗತ್ಯವಿದ್ದರೆ ಕಮಿಟ್ ಸಂದೇಶಗಳನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ - [ ] `CHANGELOG.md` ನಲ್ಲಿನ ಇತ್ತೀಚಿನ semver ವಿಭಾಗವು `package.json` ಆವೃತ್ತಿಗೆ ಸಮನಾಗಿದೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ - [ ] ಮುಂಬರುವ ಕೆಲಸಕ್ಕಾಗಿ `## [Unreleased]` ಅನ್ನು ಬದಲಾವಣೆಗಳ ಪಟ್ಟಿಯ ಮೊದಲ ವಿಭಾಗವಾಗಿಯೇ ಇರಿಸಿ - [ ] `docs/openapi.yaml` ಅನ್ನು ನವೀಕರಿಸಿ → `info.version` ಎಂಬುದು `package.json` ಆವೃತ್ತಿಗೆ ಸಮನಾಗಿರಬೇಕು ### ಕೋಡ್ ಗುಣಮಟ್ಟ - [ ] `npm run lint` — 0 ದೋಷಗಳು (ಎಚ್ಚರಿಕೆಗಳು ಮೊದಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿವೆ) - [ ] `npm run typecheck:core` — ದೋಷರಹಿತ - [ ] `npm run typecheck:noimplicit:core` — ದೋಷರಹಿತ (ಕಟ್ಟುನಿಟ್ಟಾದ) - [ ] `npm run check:cycles:ratchet` — ಸ್ಥಿರಗೊಳಿಸಿದ `metrics.cycles` ಗರಿಷ್ಠ ಮಿತಿಯೊಳಗೆ (`check:cycles` ಮಾತ್ರ ಚಲಾಯಿಸಿದರೆ ಯಾವುದೇ ಚಕ್ರಕ್ಕೆ 1 ಸ್ಥಿತಿಯೊಂದಿಗೆ ನಿರ್ಗಮಿಸುತ್ತದೆ, #15281) - [ ] `npm run check:any-budget:t11` — ಬಜೆಟ್ನೊಳಗೆ - [ ] `npm run check:route-validation:t06` — ದೋಷರಹಿತ - [ ] `npm run check:node-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 ಸರ್ವರ್, autoCombo, ಕ್ಯಾಶ್) - [ ] `npm run test:coverage` — 60/60/60/60 ಗೇಟ್ ಪೂರೈಸಲಾಗಿದೆ (ಸ್ಟೇಟ್ಮೆಂಟ್ಗಳು/ಸಾಲುಗಳು/ಫಂಕ್ಷನ್ಗಳು/ಶಾಖೆಗಳು) - [ ] `npm run test:integration` — ಉತ್ತೀರ್ಣ (ಬದಲಾವಣೆಗಳು DB / ಹ್ಯಾಂಡ್ಲರ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿದರೆ) - [ ] `npm run test:combo:matrix` — ಉತ್ತೀರ್ಣ (ಕಾಂಬೊ ತಂತ್ರ ಮ್ಯಾಟ್ರಿಕ್ಸ್: ಎಲ್ಲಾ 19 ಸಾರ್ವಜನಿಕ ರೌಟಿಂಗ್ ತಂತ್ರಗಳ ಆಯ್ಕೆ ನಿರ್ಧಾರಗಳನ್ನು ನಿರ್ಣಾಯಕವಾಗಿ ಸಾಬೀತುಪಡಿಸುತ್ತದೆ; ಕಾಂಬೊ ರೌಟಿಂಗ್, ತಂತ್ರ ಪರಿಹಾರ ಅಥವಾ ಫಾಲ್ಬ್ಯಾಕ್ ತರ್ಕವನ್ನು ಬದಲಾಯಿಸುವಾಗ ಚಲಾಯಿಸಿ) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **ಐಚ್ಛಿಕ/ಕೈಯಾರೆ** (ಗೇಟ್ ಮಾಡಲಾದ ನೈಜ ಅಪ್ಸ್ಟ್ರೀಮ್ ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ; VPS `root@192.168.0.15` ನಿಂದ ಓದಲು-ಮಾತ್ರವಾದ DB ಸ್ನ್ಯಾಪ್ಶಾಟ್ ಅನ್ನು ಪಡೆಯುತ್ತದೆ; ನೈಜ ಪೂರೈಕೆದಾರರನ್ನು ಸಂಪರ್ಕಿಸುತ್ತದೆ, ಕ್ರೆಡಿಟ್ಗಳನ್ನು ಬಳಸುತ್ತದೆ; CI ನಲ್ಲಿ ಎಂದಿಗೂ ಚಲಿಸುವುದಿಲ್ಲ; ಗೇಟ್ ಇಲ್ಲದೆ ಸಮಸ್ಯೆಯಿಲ್ಲದೆ ಬಿಟ್ಟುಬಿಡುತ್ತದೆ) - [ ] `npm run test:combo:live:vps` — **ಐಚ್ಛಿಕ/ಕೈಯಾರೆ** (ಹಂತ-3 VPS ಲೈವ್ ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ: ಸರಳ Node ESM ಮೂಲಕ ಲೈವ್ `.15` ಸರ್ವರ್ ವಿರುದ್ಧ 7 HTTP ಸನ್ನಿವೇಶಗಳು; `ssh root@192.168.0.15` ಅಗತ್ಯವಿದೆ; `__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` ಅನ್ನು ಹೊರಗಿಡುತ್ತದೆ (ನಿಧಾನ; CI `test-unit` ಕೆಲಸವು ಇದನ್ನು ಒಳಗೊಳ್ಳುತ್ತದೆ). - ಬಿಡುಗಡೆ ಶಾಖೆಗಳನ್ನು ಪುಷ್ ಮಾಡುವ ಮೊದಲು `npm run test:unit` ಅನ್ನು ಕೈಯಾರೆ ಚಲಾಯಿಸಿ. ಹುಕ್ ವಿಫಲವಾದರೆ: ಮೂಲ ಸಮಸ್ಯೆಯನ್ನು ಸರಿಪಡಿಸಿ, `--no-verify` ಬಳಸಿ ಅದನ್ನು ತಪ್ಪಿಸಬೇಡಿ. ### ಸಾಂಪ್ರದಾಯಿಕ ಕಮಿಟ್ಗಳು ಬಿಡುಗಡೆಗೆ ಸೇರಬೇಕಾದ ಎಲ್ಲಾ ಕಮಿಟ್ಗಳು `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` 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/.md` ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - [ ] ಬ್ರೇಕಿಂಗ್ ಬದಲಾವಣೆಯಾಗಿದ್ದರೆ: `docs/guides/TROUBLESHOOTING.md` ವಲಸೆ ಟಿಪ್ಪಣಿಯನ್ನು ಹೊಂದಿದೆ ### i18n - [ ] `npm run i18n:check` 0 ಸ್ಥಿತಿಯೊಂದಿಗೆ ನಿರ್ಗಮಿಸುತ್ತದೆ — ಅನುವಾದ ಸ್ಥಿತಿ (`.i18n-state.json`) ಮೂಲ ದಸ್ತಾವೇಜುಗಳೊಂದಿಗೆ ಸಿಂಕ್ ಆಗಿದೆ (ಕಟ್ಟುನಿಟ್ಟಾದ ಮೋಡ್ನಲ್ಲಿ ವ್ಯತ್ಯಾಸಗೊಂಡ ಮೂಲಗಳಿಲ್ಲ; ಕೊನೆಯ ಕ್ಷಣದ ದಸ್ತಾವೇಜು ತಿದ್ದುಪಡಿಗಳಿಗೆ ಎಚ್ಚರಿಕೆ-ಮೋಡ್ ಸಲಹೆ ಸ್ವೀಕಾರಾರ್ಹ, ಆದರೆ ಟ್ಯಾಗ್ ಮಾಡುವ ಮೊದಲು ಇದು 0 ಆಗಿರಬೇಕು) - [ ] `npm run i18n:check-ui-coverage` 0 ಸ್ಥಿತಿಯೊಂದಿಗೆ ನಿರ್ಗಮಿಸುತ್ತದೆ — ಪ್ರತಿಯೊಂದು UI ಲೊಕೇಲ್ 80% ವ್ಯಾಪ್ತಿ ಕನಿಷ್ಠ ಮಿತಿಯಲ್ಲಿ ಅಥವಾ ಅದಕ್ಕಿಂತ ಮೇಲಿದೆ - [ ] `npm run i18n:sync-ui:dry` ಎಲ್ಲಾ 66 ಗುರಿ ಲೊಕೇಲ್ಗಳಲ್ಲಿ 0 ಕಾಣೆಯಾದ ಕೀಲಿಗಳನ್ನು ವರದಿ ಮಾಡುತ್ತದೆ (`en` ಮೂಲವನ್ನು ಹೊರತುಪಡಿಸಿ ಪ್ರತಿಯೊಂದು ಲೊಕೇಲ್) - [ ] ಮೂಲ ಇಂಗ್ಲಿಷ್ ದಸ್ತಾವೇಜುಗಳು ಬದಲಾಗಿದ್ದರೆ, ಟ್ಯಾಗ್ ಮಾಡುವ ಮೊದಲು `npm run i18n:run` ಅನ್ನು ಚಲಾಯಿಸಿ (`.env` ನಲ್ಲಿ `OMNIROUTE_TRANSLATION_API_KEY` ಅಗತ್ಯವಿದೆ) - [ ] ಅನುವಾದ ಕೊಡುಗೆಗಳು ಚಿಕ್ಕದಾಗಿದ್ದರೆ ಮುಂದಿನ ಬಿಡುಗಡೆಗೆ ಮುಂದೂಡಬಹುದು (CHANGELOG ನಲ್ಲಿ ಟ್ರ್ಯಾಕ್ ಮಾಡಿ) ### ಡೇಟಾಬೇಸ್ ವಲಸೆಗಳು - [ ] `src/lib/db/migrations/` ನಲ್ಲಿ ಹೊಸ ಫೈಲ್ಗಳಿದ್ದರೆ: - [ ] ಪ್ರತಿಯೊಂದು ವಲಸೆಯೂ ಪುನರಾವರ್ತಿತವಾಗಿ ಚಲಾಯಿಸಬಹುದಾಗಿದೆ (`CREATE TABLE IF NOT EXISTS`, ಇತ್ಯಾದಿ) - [ ] ವಲಸೆಗಳನ್ನು ಟ್ರಾನ್ಸಾಕ್ಷನ್ಗಳಲ್ಲಿ ಸುತ್ತುವರಿಯಲಾಗಿದೆ - [ ] ಸರಿಯಾಗಿ ಸಂಖ್ಯೆ ನೀಡಲಾಗಿದೆ (ಅನುಕ್ರಮದಲ್ಲಿ ಅಂತರಗಳಿಲ್ಲ) - [ ] ಹೊಸ ಸ್ಥಾಪನೆಯಲ್ಲಿ ಪರೀಕ್ಷಿಸಿ: `~/.omniroute/omniroute.db` ಅನ್ನು ಅಳಿಸಿ ಮತ್ತು `npm run dev` ಚಲಾಯಿಸಿ - [ ] ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಸ್ಥಾಪನೆಯಲ್ಲಿ ಪರೀಕ್ಷಿಸಿ: DB ಬ್ಯಾಕಪ್ ಮಾಡಿ, ವಲಸೆಯನ್ನು ಚಲಾಯಿಸಿ, ಸ್ಕೀಮಾವನ್ನು ಪರಿಶೀಲಿಸಿ - [ ] ವಲಸೆಯು ಟೇಬಲ್ಗಳನ್ನು ಮರುಬರೆಯುತ್ತಿದ್ದರೆ WAL ಫೈಲ್ಗಳನ್ನು (`-wal`, `-shm`) ಸರಿಯಾಗಿ ನಿರ್ವಹಿಸಲಾಗಿದೆ ### ಪೂರೈಕೆದಾರ ಕ್ಯಾಟಲಾಗ್ (Zod-ಮೌಲ್ಯೀಕರಿಸಿದ) - [ ] `src/shared/constants/providers.ts` Zod ಸ್ಕೀಮಾ ಲೋಡ್ ಸಮಯದಲ್ಲಿ ಮಾನ್ಯವಾಗಿದೆ - [ ] ಎಲ್ಲ ಪೂರೈಕೆದಾರರು ಅಗತ್ಯವಿರುವ ಕ್ಷೇತ್ರಗಳನ್ನು (`id`, `label`, `kind`, ಇತ್ಯಾದಿ) ಹೊಂದಿದ್ದಾರೆ - [ ] ಹೊಸ ಉಚಿತ ಪೂರೈಕೆದಾರರಿಗೆ `freeNote` ಒದಗಿಸಲಾಗಿದೆ - [ ] OAuth ಪೂರೈಕೆದಾರರ `oauthConfig` ಅನ್ನು `src/lib/oauth/constants/oauth.ts` ನಲ್ಲಿ ನೋಂದಾಯಿಸಲಾಗಿದೆ - [ ] ಹೊಸ ಪೂರೈಕೆದಾರರನ್ನು ಸೇರಿಸಿದ್ದರೆ: `open-sse/executors/` ನಲ್ಲಿ ಅದಕ್ಕೆ ಅನುಗುಣವಾದ ಎಕ್ಸಿಕ್ಯೂಟರ್ ಇದೆ - [ ] OpenAI ಅಲ್ಲದ ಸ್ವರೂಪವಾಗಿದ್ದರೆ: `open-sse/translator/` ನಲ್ಲಿ ಪರಿವರ್ತಕ ಇದೆ - [ ] ಮಾದರಿಗಳನ್ನು `open-sse/config/providerRegistry.ts` ನಲ್ಲಿ ನೋಂದಾಯಿಸಲಾಗಿದೆ - [ ] `tests/unit/` ನಲ್ಲಿನ ಯೂನಿಟ್ ಪರೀಕ್ಷೆಗಳು ಪೂರೈಕೆದಾರರ ವರ್ಗೀಕರಣ ಮತ್ತು ರೂಟಿಂಗ್ ಅನ್ನು ಒಳಗೊಂಡಿವೆ ### ಡೆಸ್ಕ್ಟಾಪ್ (Electron) `electron/` ಬದಲಾಗಿದ್ದರೆ: - [ ] `npm run electron:smoke:packaged` ಯಶಸ್ವಿಯಾಗುತ್ತದೆ - [ ] `:win`, `:mac`, `:linux` ಇವುಗಳಲ್ಲಿ ಕನಿಷ್ಠ ಒಂದಕ್ಕೆ ಬಿಲ್ಡ್ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗಿದೆ - [ ] ಕೋಡ್ ಸಹಿ ಪ್ರಮಾಣಪತ್ರಗಳ ಅವಧಿ ಮುಗಿದಿಲ್ಲ (ಸಹಿ ಮಾಡುತ್ತಿದ್ದರೆ) - [ ] `electron/package.json` ಆವೃತ್ತಿಯು ಮೂಲ `package.json` ಆವೃತ್ತಿಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ - [ ] `stable` ಗೆ ಬಿಡುಗಡೆ ಮಾಡುತ್ತಿದ್ದರೆ ಸ್ವಯಂ-ನವೀಕರಣ ಚಾನಲ್ ಪಾಯಿಂಟರ್ ಅನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ ### ಬಿಲ್ಡ್ ವಿನ್ಯಾಸ ರೆಪೊಸಿಟರಿಯು ಮೂರು ಪ್ರತ್ಯೇಕ ಔಟ್ಪುಟ್ ಡೈರೆಕ್ಟರಿಗಳನ್ನು ಬಳಸುತ್ತದೆ — ಅವುಗಳನ್ನು ಎಂದಿಗೂ ಮಿಶ್ರಗೊಳಿಸಬೇಡಿ: | ಡೈರೆಕ್ಟರಿ | ಉದ್ದೇಶ | ಟ್ರ್ಯಾಕ್ ಮಾಡಲಾಗಿದೆಯೇ? | | --------- | -------------------------------------------------------------- | --------------------- | | `src/` | ಅಪ್ಲಿಕೇಶನ್ ಮೂಲ (TypeScript / TSX) | ಹೌದು | | `.build/` | ಬಿಲ್ಡ್ ಮಧ್ಯಂತರಗಳು — `next build` ಔಟ್ಪುಟ್ (`distDir`) | ಇಲ್ಲ (gitignored) | | `dist/` | ವಿತರಿಸಬಹುದಾದ npm ಬಂಡಲ್ — `assembleStandalone` ಮೂಲಕ ಜೋಡಿಸಲಾಗಿದೆ | ಇಲ್ಲ (gitignored) | > **ಆಪರೇಟರ್ ಟಿಪ್ಪಣಿ:** ರಿಮೋಟ್ VPS ಇಮೇಜ್ ಡೈರೆಕ್ಟರಿಯು `/usr/lib/node_modules/omniroute/app/` ಆಗಿಯೇ ಉಳಿಯುತ್ತದೆ. > **ರೆಪೊ ಒಳಗಿನ** ಬಿಲ್ಡ್ ಔಟ್ಪುಟ್ ಮಾತ್ರ ಸ್ಥಳಾಂತರಗೊಂಡಿದೆ (`app/` → `dist/`). ಡಿಪ್ಲಾಯ್ ಸ್ಕಿಲ್ಗಳು > `dist/` ವಿಷಯಗಳನ್ನು ರಿಮೋಟ್ `app/` ಡೈರೆಕ್ಟರಿಗೆ rsync ಮಾಡುತ್ತವೆ — 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 HEAD` - [ ] `npm run check:pack-artifact` ಸ್ವಚ್ಛವಾಗಿದೆ — `app.__qa_backup`, `scripts/scratch`, `package-lock.json`, ಅಥವಾ ಇತರ ಯಾವುದೇ ಸ್ಥಳೀಯ ಅವಶೇಷಗಳಿಲ್ಲ - [ ] ಬಿಲ್ಡ್ ನಂತರ `dist/server.js` ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - [ ] ಐಚ್ಛಿಕ ಸ್ಥಳೀಯ ಪ್ಯಾಕೇಜ್ಡ್-ರನ್ಟೈಮ್ ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ: `npm run dev:candidate -- build` ನಂತರ `npm run dev:candidate -- validate` ಪ್ರತ್ಯೇಕಿಸಲಾದ `DATA_DIR` ನಲ್ಲಿ ಪ್ಯಾಕ್ ಮಾಡಿದ tarball ಅನ್ನು ಬೂಟ್ ಮಾಡಿ `/api/health` + `/v1/models` ಅನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ ([ಕೊಡುಗೆಯ ಗೋಲ್ಡನ್ ಪಾಥ್](CONTRIBUTION_GOLDEN_PATH.md#local-candidate-loop) ನೋಡಿ) ### ಟ್ಯಾಗಿಂಗ್ ಮತ್ತು ಬಿಡುಗಡೆ - [ ] `/generate-release-cc` ಅನ್ನು ಚಲಾಯಿಸಿ (Claude Code ಸ್ಕಿಲ್): - `vX.Y.Z` ಟ್ಯಾಗ್ ಅನ್ನು ರಚಿಸುತ್ತದೆ - ಟ್ಯಾಗ್ ಮತ್ತು ಬ್ರಾಂಚ್ ಅನ್ನು ಪುಶ್ ಮಾಡುತ್ತದೆ - ಚೇಂಜ್ಲಾಗ್ ವಿಷಯದೊಂದಿಗೆ GitHub Release ಅನ್ನು ತೆರೆಯುತ್ತದೆ - Electron ಇನ್ಸ್ಟಾಲರ್ಗಳನ್ನು ಲಗತ್ತಿಸುತ್ತದೆ (ಬಿಲ್ಡ್ ಮಾಡಿದ್ದರೆ) - [ ] ಅಥವಾ ಕೈಯಾರೆ: ```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 ``` ### ಡಿಪ್ಲಾಯ್ ಡಿಪ್ಲಾಯ್ ಸ್ಕಿಲ್ಗಳು ಹಗುರವಾದ rsync ಹರಿವನ್ನು ಬಳಸುತ್ತವೆ — `npm pack` ಇಲ್ಲ, `npm i -g` ಇಲ್ಲ: - [ ] ಗುರಿಗೆ ಹೊಂದುವ ಡಿಪ್ಲಾಯ್ ಸ್ಕಿಲ್ ಅನ್ನು ಬಳಸಿ: - `/deploy-vps-local-cc` — ಸ್ಥಳೀಯ VPS (192.168.0.15) - `/deploy-vps-akamai-cc` — Akamai VPS (69.164.221.35) - `/deploy-vps-both-cc` — ಎರಡೂ - [ ] ಡಿಪ್ಲಾಯ್ ಮಾಡುವ ಮೊದಲು, `dist/BUILD_SHA` == `git rev-parse --short HEAD` ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿ - [ ] `node_modules` ನೈಜವಾಗಿರುವ ಸ್ಥಳದಲ್ಲೇ ಬಿಲ್ಡ್ ಚಲಾಯಿಸಬೇಕು (ಮುಖ್ಯ ಚೆಕ್ಔಟ್ ಅಥವಾ `npm ci` ಚಲಾಯಿಸಿದ worktree — ಸಿಂಬಾಲಿಕ್ ಲಿಂಕ್ ಮಾಡಿದ worktree ಅಲ್ಲ) - [ ] ಡಿಪ್ಲಾಯ್ ಮಾಡಿದ ಇನ್ಸ್ಟನ್ಸ್ನ ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ ಮಾಡಿ: - `/dashboard/health` ತೆರೆಯಿರಿ → ಆವೃತ್ತಿ ಸ್ಟ್ರಿಂಗ್ ಬಿಡುಗಡೆಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ - ಪರಿಚಿತ ಪೂರೈಕೆದಾರರ ವಿರುದ್ಧ `/v1/chat/completions` ವಿನಂತಿಯನ್ನು ಚಲಾಯಿಸಿ - `/api/monitoring/health` `CLOSED` ಸರ್ಕ್ಯೂಟ್ ಬ್ರೇಕರ್ಗಳನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಪರಿಶೀಲಿಸಿ - MCP ಟ್ರಾನ್ಸ್ಪೋರ್ಟ್ಗಳು ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತವೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿ (`/mcp` HTTP, `/mcp-sse` SSE) ### ಬಿಡುಗಡೆಯ ನಂತರ - [ ] `/capture-release-evidences-cc` ಅನ್ನು ಚಲಾಯಿಸಿ (Claude Code ಸ್ಕಿಲ್) - ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳ WebP ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳು/ರೆಕಾರ್ಡಿಂಗ್ಗಳನ್ನು ಸೆರೆಹಿಡಿಯುತ್ತದೆ - ಬಿಡುಗಡೆ ಟಿಪ್ಪಣಿಗಳು / ಬ್ಲಾಗ್ ಪೋಸ್ಟ್ಗೆ ಲಗತ್ತಿಸುತ್ತದೆ - [ ] ಬಿಡುಗಡೆ ಪ್ರಕಟಣೆಯೊಂದಿಗೆ GitHub Discussions / Discord ಅನ್ನು ನವೀಕರಿಸಿ - [ ] ಮುಂದಿನ ಆವೃತ್ತಿಗಾಗಿ ಮೈಲಿಗಲ್ಲನ್ನು ತೆರೆಯಿರಿ - [ ] ಗಂಭೀರವಾಗಿದ್ದರೆ: ಚರ್ಚೆಯನ್ನು ಪಿನ್ ಮಾಡಿ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ನೊಳಗಿನ ಬ್ಯಾನರ್ಗಾಗಿ `news.json` ನಲ್ಲಿ ಪೋಸ್ಟ್ ಮಾಡಿ ### Radar ಸಾರ್ವಜನಿಕ-ಬಿಡುಗಡೆ ಗೇಟ್ Radar ಪ್ರಕಟಣೆಯನ್ನು ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿ `active: false` ಜೊತೆಗೆ ಕಮಿಟ್ ಮಾಡಲಾಗಿದೆ. ಕೆಳಗಿನ ಪ್ರತಿಯೊಂದು ಅಂಶಕ್ಕೂ ಸಾಕ್ಷ್ಯ ದೊರೆತ ನಂತರವೇ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆಯನ್ನು ಪ್ರತ್ಯೇಕ ಬದಲಾವಣೆಯಾಗಿ ಮಾಡಬೇಕು: - [ ] ಸ್ಟ್ಯಾಕ್ ಮಾಡಲಾದ ಎಲ್ಲಾ Radar PRಗಳನ್ನು ವಿಲೀನಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು release-tip CI ಹಸಿರಾಗಿದೆ - [ ] `RADAR_ENABLED` ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಇನ್ನೂ ಆಫ್ ಆಗಿರುವಾಗಲೇ OSS Radar ರೂಟ್ಗಳನ್ನು ಡಿಪ್ಲಾಯ್ ಮಾಡಿ ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ ನಡೆಸಿ - [ ] ಹೆಸರಿಸಲಾದ Radar ಹೋಸ್ಟ್ನಲ್ಲಿ `GET /planos`, `/termos`, `/privacidade`, ಮತ್ತು `/reembolso` ಅನ್ನು ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ ಮಾಡಿ - [ ] ಖಾಸಗಿ ಸೇವೆಯಲ್ಲಿ ಆಪರೇಟರ್ನ ಗುರುತು/ಸಂಪರ್ಕ/ವಿಳಾಸ ಮತ್ತು ಮಾಲೀಕರು ಅನುಮೋದಿಸಿದ ಕಾನೂನು ಪರಿಶೀಲನೆಯನ್ನು ದಾಖಲಿಸಿ - [ ] ಪರೀಕ್ಷಾ ಮೋಡ್ನಲ್ಲಿ ಮಾತ್ರ Stripe Checkout ಮತ್ತು ಸಹಿ ಮಾಡಿದ webhook ಅನ್ನು ಪರೀಕ್ಷಿಸಿ - [ ] ಅನುಮೋದಿತ ಕಳುಹಿಸುವವರು/ಡೊಮೇನ್ನೊಂದಿಗೆ ಒಂದು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ವಹಿವಾಟು-ಇಮೇಲ್ ವಿತರಣೆಯನ್ನು ಪರೀಕ್ಷಿಸಿ - [ ] ಬ್ಯಾಕಪ್ ಮರುಸ್ಥಾಪನೆ ಮತ್ತು ಮೇಲ್ವಿಚಾರಣೆಯಲ್ಲಿರುವ, ಬಜೆಟ್-ಮಿತಿಯ ಒಂದು ಸಂಶೋಧನಾ ರನ್ ಅನ್ನು ಸಾಬೀತುಪಡಿಸಿ - [ ] ದೇಣಿಗೆ ಪುರಾವೆಯನ್ನು ಸ್ವೀಕರಿಸುವ ಮೊದಲು BRL/PIX ಪರಿಶೀಲನಾ ನೀತಿಯನ್ನು ಅನುಮೋದಿಸಿ - [ ] ಹಿಂದಿನ ಗೇಟ್ಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ನಂತರವೇ ಸಾರ್ವಜನಿಕ Checkout ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ, ನಂತರ ಹೊಸ `news.json` ID ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ - [ ] Home ಬ್ಯಾನರ್ ಸ್ಥಳೀಕರಿಸಿದ ಪಠ್ಯವನ್ನು ಬಳಸುತ್ತದೆ ಮತ್ತು ಹಳೆಯ ID ಅನ್ನು ವಜಾಗೊಳಿಸಿದ ನಂತರ ಹೊಸ ID ಮತ್ತೆ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ ಎಂಬುದನ್ನು ಪರಿಶೀಲಿಸಿ ## ಎಂಬೆಡೆಡ್ ಸರ್ವೀಸ್ಗಳ ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ (v3.8.4+) ಎಂಬೆಡೆಡ್ ಸರ್ವೀಸ್ಗಳ ಬದಲಾವಣೆಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಯಾವುದೇ ಬಿಡುಗಡೆಗೂ ಮೊದಲು, ಇವುಗಳನ್ನು ಪರಿಶೀಲಿಸಿ: ### ಹೊಸ-DB ಬೂಟ್ (`migration` ಘರ್ಷಣೆಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುತ್ತದೆ — v3.8.4 ಹಾಟ್ಫಿಕ್ಸ್ ನಂತರ ಸೇರಿಸಲಾಗಿದೆ) - [ ] `DATA_DIR=$(mktemp -d) npm start &` — ಬೂಟ್ಗಾಗಿ 10 ಸೆಕೆಂಡು ಕಾಯಿರಿ - [ ] `curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'` `"9router"` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ (404 ಅಲ್ಲ, 500 ಅಲ್ಲ). `071_services.sql` ಮೈಗ್ರೇಶನ್ ಅನ್ವಯಿಸಲಾಗಿದೆ + ಸಾಲು ಸೀಡ್ ಮಾಡಲಾಗಿದೆ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸುತ್ತದೆ. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"` 3 ಸಾಲುಗಳನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"` 2 ಸಾಲುಗಳನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ (`070_webhooks_kind_metadata.sql` ಅನ್ವಯಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಮೌಲ್ಯೀಕರಿಸುತ್ತದೆ). - [ ] `node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts` ಯಶಸ್ವಿಯಾಗುತ್ತದೆ — ಭವಿಷ್ಯದ ಘರ್ಷಣೆಗಳಿಂದ ರಕ್ಷಿಸುತ್ತದೆ. ### 9Router - [ ] `POST /api/services/9router/install` 2 ನಿಮಿಷಗಳೊಳಗೆ `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 ಮೂಲಕ ಎಂಡ್-ಟು-ಎಂಡ್ ರೂಟಿಂಗ್) - [ ] `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 ನಿಮಿಷಗಳೊಳಗೆ 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 ನಲ್ಲಿ ಬೂಟ್ ಆಗುತ್ತದೆ (`~/.omniroute/runtime/` ಗೆ systray2 ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ) - [ ] `omniroute --tray` Linux ನಲ್ಲಿ ಬೂಟ್ ಆಗುತ್ತದೆ (DISPLAY ಅಗತ್ಯವಿದೆ; ಹೊಂದಿಸದಿದ್ದರೆ ಸಮರ್ಪಕ ದೋಷ) - [ ] `omniroute --tray` Windows ನಲ್ಲಿ ಬೂಟ್ ಆಗುತ್ತದೆ (PowerShell NotifyIcon, ಹೆಚ್ಚುವರಿ ಬೈನರಿಗಳಿಲ್ಲ) - [ ] `omniroute config tray enable` ಸ್ವಯಂಪ್ರಾರಂಭದ ನಮೂದನ್ನು ರಚಿಸುತ್ತದೆ; ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಅದನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ - [ ] `npm install -g omniroute@` ಗಂಭೀರ ನಿರ್ಗಮನವಿಲ್ಲದೆ 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`) ನವೀಕರಣದ ನಂತರವೂ ಉಳಿಯುತ್ತವೆ. ಅಲ್ಟ್ರಾ `modelPath` SLM ಹಂತಕ್ಕೆ tinybert ಮಾಡೆಲ್ ಕೂಡ ಅಗತ್ಯವಿದೆ; ಮೊದಲ ಬಳಕೆಯಲ್ಲಿ ಅದನ್ನು `${DATA_DIR}/models/llmlingua` ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ. ನಂತರ Postinstall (`scripts/build/colocateOptionals.mjs`) SLM ಐಚ್ಛಿಕ ಕ್ಲೋಶರ್ ಅನ್ನು `dist/node_modules` ನಲ್ಲಿ ಸಹ-ಸ್ಥಾಪಿಸುತ್ತದೆ, ಇದರಿಂದ ವರ್ಕರ್ ಒಂದೇ `@huggingface/transformers` ^4.2.0 ಇನ್ಸ್ಟೆನ್ಸ್ ಅನ್ನು ಪರಿಹರಿಸುತ್ತದೆ — ಸ್ವತಂತ್ರ ಟ್ರೇಸ್ ಕೇವಲ transformers ಅನ್ನು ಬಂಡಲ್ ಮಾಡುತ್ತದೆ, ಡೈನಾಮಿಕ್ ಆಗಿ ಇಂಪೋರ್ಟ್ ಮಾಡಿದ ಐಚ್ಛಿಕಗಳನ್ನು ಅಲ್ಲ; ಆದ್ದರಿಂದ ಇದಿಲ್ಲದೆ ವರ್ಕರ್ ರೂಟ್ನ 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` ಗೆ ಫಾಲ್ಬ್ಯಾಕ್ ಆಗುತ್ತದೆ - [ ] ಸ್ಮಾರ್ಟ್ MCP ಫಿಲ್ಟರ್ ನೈಜ `playwright-mcp browser_snapshot` ಔಟ್ಪುಟ್ ಅನ್ನು ಸಂಕುಚಿಸುತ್ತದೆ (≥50% ಇಳಿಕೆ) - [ ] ಎಲ್ಲಾ 10 `skills/omniroute*/SKILL.md` ಫೈಲ್ಗಳನ್ನು raw GitHub URL ಮೂಲಕ ಸಾರ್ವಜನಿಕವಾಗಿ ಪಡೆಯಬಹುದು - [ ] ಹೊಸ ಸೆಟಪ್ನಲ್ಲಿ ಆನ್ಬೋರ್ಡಿಂಗ್ ವಿಜಾರ್ಡ್ "ಇದು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ" ಹಂತದ ಪರಿಚಯವನ್ನು ತೋರಿಸುತ್ತದೆ - [ ] ಹೋಮ್ ಡ್ಯಾಶ್ಬೋರ್ಡ್ನ ಹಂತದ ವ್ಯಾಪ್ತಿ ವಿಜೆಟ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ/ಸಕ್ರಿಯ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸುತ್ತದೆ --- ## 3.9.0 LTS ಕಟ್ (3.8.58ರಲ್ಲಿ ಪೂರ್ವಾಭ್ಯಾಸ ಮಾಡಲಾಗಿದೆ) v3.8.59 ನಂತರದ ಮುಂದಿನ ಆವೃತ್ತಿ 3.9.0 ಆಗಿದ್ದು, ಅದರ ತುದಿಯು ದೀರ್ಘಕಾಲ ಉಳಿಯುವ ಎರಡು ಶಾಖೆಗಳಾಗುತ್ತದೆ: `stable/v3` (v3 LTS ಲೈನ್, npm `latest`) ಮತ್ತು `develop` (v4, 4.0.0ಗೆ ಹೆಚ್ಚಿಸಲಾಗಿದೆ, npm `nightly`). ಶಾಖೆ/ಚಾನೆಲ್ ಮಾದರಿ, ಫಾರ್ವರ್ಡ್-ಪೋರ್ಟ್ ಮತ್ತು ಲೇಬಲ್ಗಳು [RELEASE_STRATEGY.md](./RELEASE_STRATEGY.md)ನಲ್ಲಿವೆ; ಯೋಜನೆಯು [ROADMAP](../../ROADMAP.md)ನಲ್ಲಿ (ಹಂತ 3) ಇದೆ. ಕಟ್ ಒಮ್ಮೆ ಮಾತ್ರ ನಡೆಯುತ್ತದೆ; 3.8.58 ಅದನ್ನು ಫೋರ್ಕ್ನಲ್ಲಿ ಆರಂಭದಿಂದ ಅಂತ್ಯದವರೆಗೆ ಪೂರ್ವಾಭ್ಯಾಸ ಮಾಡುತ್ತದೆ ಮತ್ತು 3.8.59 [GO/NO-GO ಪರಿಶೀಲನಾಪಟ್ಟಿ](./LTS_GO_NO_GO.md)ಯೊಂದಿಗೆ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ. ### ಡ್ರೈ-ರನ್ (ಓದಲು ಮಾತ್ರ, ಯಾವುದೇ ಸಮಯದಲ್ಲೂ ಸುರಕ್ಷಿತ) ```bash npm run release:dry-run-lts-cut # ನಿಜವಾದ ಕಟ್: HEADನಿಂದ 3.9.0, ಹಿಂದಿನ ಟ್ಯಾಗ್ v3.8.59 npm run release:dry-run-lts-cut -- --from <3.9.0-tip> # ಮೂಲ ಕಮಿಟ್ ಅನ್ನು ಪಿನ್ ಮಾಡಿ ``` `scripts/release/dry-run-lts-cut.mjs` ಯಾವುದನ್ನೂ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ: ಅದು git ಮತ್ತು `gh` ಅನ್ನು ಓದಿ ಸಂಪೂರ್ಣ ಅನುಕ್ರಮವನ್ನು ಮುದ್ರಿಸುತ್ತದೆ — ಪೂರ್ವಷರತ್ತುಗಳು (ಮೂಲವು ರೆಸಾಲ್ವ್ ಆಗುತ್ತದೆ, ಮೂಲ ರೆಪೊಸಿಟರಿಯು ಸಂಪೂರ್ಣ ಇತಿಹಾಸವನ್ನು ಹೊಂದಿದೆ — ಶ್ಯಾಲೋ ಕ್ಲೋನ್ `stable/v3` ಅನ್ನು ಪುಶ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ, ಮೊದಲ ಗ್ರಾಫ್ಟ್ ಮಾಡಿದ ಪೇರೆಂಟ್ನಲ್ಲಿ ಸ್ವೀಕರಿಸುವ ಪಾರ್ಶ್ವವು ಪ್ಯಾಕ್ ಅನ್ನು ತಿರಸ್ಕರಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ಸಂಪೂರ್ಣ ಕ್ಲೋನ್ನಿಂದ ಕಟ್ ಮಾಡಿ ಅಥವಾ ಮೊದಲು `git fetch --unshallow origin` ಚಲಾಯಿಸಿ — ಹಿಂದಿನ ಟ್ಯಾಗ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ, `package.json` ಗುರಿ ಆವೃತ್ತಿಯಾಗಿದೆ, `release-freeze` ಇಶ್ಯೂ ತೆರೆದಿದೆ, ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬಿಡುಗಡೆ ಶಾಖೆಯಲ್ಲಿ ತೆರೆದಿರುವ `Release branch not green` ಇಶ್ಯೂ ಇಲ್ಲ — ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲದ ಶಾಖೆಯು `?` ಅಜ್ಞಾತ ಎಂದು ವರದಿ ಮಾಡುತ್ತದೆ, ಎಂದಿಗೂ ಹಸಿರು ಎಂದು ಅಲ್ಲ — Mergify `release` ಕ್ಯೂ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ (G11: `queue_rules`, `checks_timeout`, ಲೇಬಲ್ `queue`), `release/*` ರೂಲ್ಸೆಟ್ ಇನ್ನೂ ಅಳಿಸುವಿಕೆ ಮತ್ತು ಫೋರ್ಸ್-ಪುಶ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ ಮತ್ತು `stable/v3` ಹಾಗೂ `develop` ಇನ್ನೂ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ), ಎರಡು ಶಾಖೆಯ ಹಂತಗಳು, ಯಾವ ನಿಷ್ಕ್ರಿಯ-ವರ್ಕ್ಫ್ಲೋ ಟ್ರಿಗರ್ಗಳು ಮತ್ತು `if:` ಷರತ್ತುಗಳು ಸತ್ಯವಾಗುತ್ತವೆ (ಮತ್ತು ಯಾವುವು ರೆಪೊಸಿಟರಿ ವೇರಿಯಬಲ್ನಿಂದ ಇನ್ನೂ ಗೇಟ್ ಆಗಿರುತ್ತವೆ ಅಥವಾ ಕ್ಯಾನಾನಿಕಲ್ ರೆಪೊಸಿಟರಿಗೆ ಪಿನ್ ಆಗಿರುತ್ತವೆ), ನಿರೀಕ್ಷಿತ dist-tags (`latest` → 3.9.0, `next` ಮತ್ತು `nightly` ಖಾಲಿ) ಮತ್ತು ರೋಲ್ಬ್ಯಾಕ್. ನಿರ್ಗಮನ `0` = `RESULT: READY`, `1` = ನಿರ್ಬಂಧಿಸುವ ಪೂರ್ವಷರತ್ತು ವಿಫಲವಾಗಿದೆ (`✗`), `2` = ಬಳಕೆ ದೋಷ. `--advisory ` ಪರಿಶೀಲನೆಯನ್ನು ಮರೆಮಾಡದೆಯೇ ಎಚ್ಚರಿಕೆಗೆ (`!`) ಇಳಿಸುತ್ತದೆ. 3.9.0 ಬಿಡುಗಡೆ ಫ್ರೀಜ್ ಇನ್ನೂ ತೆರೆದಿರುವಾಗಲೇ ನಿಜವಾದ ಕಟ್ನ ಡ್ರೈ-ರನ್ ಅನ್ನು ಚಲಾಯಿಸಿ — ಟ್ಯಾಗ್ ನಂತರ ಮತ್ತು ಹಂತ 12c ಫ್ರೀಜ್ ಅನ್ನು ತೆರವುಗೊಳಿಸುವ ಮೊದಲು ಶಾಖೆಗಳನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ. ### 3.8.58 ಪೂರ್ವಾಭ್ಯಾಸ (ಫೋರ್ಕ್ನಲ್ಲಿ ಮಾತ್ರ) ```bash # 1. ಪೂರ್ವಾಭ್ಯಾಸದ ಪ್ಯಾರಾಮೀಟರ್ಗಳೊಂದಿಗೆ ಪ್ರಸ್ತುತ ತುದಿಯಲ್ಲಿ ಡ್ರೈ-ರನ್ ಮಾಡಿ npm run release:dry-run-lts-cut -- --target-version 3.8.58 --previous-tag v3.8.57 \ --advisory freeze,base-green # 2. FORK ರಿಮೋಟ್ ವಿರುದ್ಧ ಕಾರ್ಯಗತಗೊಳಿಸಿ (origin ಅಥವಾ ಕ್ಯಾನಾನಿಕಲ್ # ರೆಪೊಸಿಟರಿಯ URL ಹೊಂದಿರುವ ಯಾವುದೇ ರಿಮೋಟ್ ಅನ್ನು ನಿರಾಕರಿಸಲಾಗುತ್ತದೆ; ಪ್ರತಿಯೊಂದು ಹಂತವೂ ಟರ್ಮಿನಲ್ನಲ್ಲಿ ದೃಢೀಕರಣವನ್ನು ಕೇಳುತ್ತದೆ) git remote add rehearsal https://github.com//OmniRoute.git node scripts/release/dry-run-lts-cut.mjs --execute --remote rehearsal \ --target-version 3.8.58 --previous-tag v3.8.57 --advisory freeze,base-green # 3. ಫೋರ್ಕ್ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯ ವರ್ಕ್ಫ್ಲೋಗಳನ್ನು ಪ್ರಯೋಗಿಸಿ (ಡ್ರೈ-ರನ್ # ಕ್ಯಾನಾನಿಕಲ್-ರೆಪೊಸಿಟರಿ ಪಿನ್ ಅನ್ನು ವರದಿ ಮಾಡುವಲ್ಲಿ workflow_dispatch), ನಂತರ ರೋಲ್ಬ್ಯಾಕ್ ಮಾಡಿ node scripts/release/dry-run-lts-cut.mjs --execute --rollback --remote rehearsal \ --target-version 3.8.58 --previous-tag v3.8.57 --advisory freeze,base-green ``` develop ಬಂಪ್ ಕಮಿಟ್ ಅನ್ನು git ಪ್ಲಂಬಿಂಗ್ನೊಂದಿಗೆ ನಿರ್ಮಿಸಲಾಗುತ್ತದೆ (ಯಾವುದೇ ವರ್ಕಿಂಗ್ ಟ್ರೀಯನ್ನು ಸ್ಪರ್ಶಿಸುವುದಿಲ್ಲ) ಮತ್ತು ಸೈಕಲ್-ಓಪನ್ ಕಮಿಟ್ನಂತೆಯೇ ಅದೇ ಐದು ಫೈಲ್ಗಳನ್ನು ಬಂಪ್ ಮಾಡುತ್ತದೆ: `package.json`, `open-sse/package.json`, `electron/package.json`, `package-lock.json` ಮತ್ತು `docs/openapi.yaml`. `[4.0.0]` CHANGELOG ವಿಭಾಗ ಮತ್ತು ಅದರ i18n ಮಿರರ್ಗಳನ್ನು ನಂತರ `develop`ನಲ್ಲಿ, ಅದರ ಮೊದಲ PRಗೂ ಮೊದಲು ತೆರೆಯಲಾಗುತ್ತದೆ. ಸ್ಕ್ರಿಪ್ಟ್ ಎಂದಿಗೂ npm dist-tags ಅನ್ನು ಬದಲಿಸುವುದಿಲ್ಲ — ಅವುಗಳನ್ನು ಸ್ಕ್ರ್ಯಾಚ್ ಪ್ಯಾಕೇಜ್ನಲ್ಲಿ ಪೂರ್ವಾಭ್ಯಾಸ ಮಾಡಿ. ### PR ಪೂರ್ವವೀಕ್ಷಣೆ ಆರ್ಟಿಫ್ಯಾಕ್ಟ್ (ಒಮ್ಮೆ ನಿರ್ಮಿಸಿ, ಅದೇ ಬೈಟ್ಗಳನ್ನು ಪ್ರಮೋಟ್ ಮಾಡಿ) `.github/workflows/preview-artifact.yml` PR ಹೆಡ್ನಿಂದ ಒಂದು ಪ್ರೊಡಕ್ಷನ್ ಟಾರ್ಬಾಲ್ ಅನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ ಮತ್ತು ಅದೇ ನಿಖರವಾದ ಬಿಲ್ಡ್ ಅನ್ನು ಮೌಲ್ಯೀಕರಿಸುತ್ತದೆ (#8084 ಭಾಗ (a)). ಒಂದೇ ರೆಪೊಸಿಟರಿಯ PRಗಳು ಮಾತ್ರ; ಯಾವುದನ್ನೂ ಪ್ರಕಟಿಸಲಾಗುವುದಿಲ್ಲ. ```bash gh workflow run preview-artifact.yml -f pr_number= # ಅಥವಾ `preview-artifact` ಲೇಬಲ್ ಸೇರಿಸಿ gh run download --name preview-artifact-pr- --dir preview cd preview && sha256sum -c SHA256SUMS gh attestation verify omniroute-*.tgz --repo diegosouzapw/OmniRoute npm install -g ./omniroute-*.tgz # ಪೂರ್ವವೀಕ್ಷಣೆ ಇನ್ಸ್ಟಾಲ್ ``` ಈ ರನ್ `npm ci`, `npm run build:release`, `npm run check:pack-artifact` ಅನ್ನು ನಿರ್ವಹಿಸಿ, ಟಾರ್ಬಾಲ್ ಅನ್ನು ಪ್ಯಾಕ್ ಮಾಡುತ್ತದೆ, `npm run check:pack-boot` ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ (ನಕಲಿ ಸೀಕ್ರೆಟ್ಗಳು, ತಾತ್ಕಾಲಿಕ ಡೇಟಾ ಡೈರೆಕ್ಟರಿ), ಮರು-ಪ್ಯಾಕ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಡೈಜೆಸ್ಟ್ ಒಂದೇ ಆಗಿರದಿದ್ದರೆ ವಿಫಲಗೊಳ್ಳುತ್ತದೆ; ನಂತರ `artifact-identity.json` (ಹೆಡ್ SHA, ಬೇಸ್ SHA, ಲಾಕ್ಫೈಲ್ ಹ್ಯಾಶ್, ಪ್ಲಾಟ್ಫಾರ್ಮ್, ಆರ್ಕಿಟೆಕ್ಚರ್, node ABI, ಬಂಡ್ಲರ್, ಬಿಲ್ಡ್ ನೀತಿ — `scripts/release/artifact-identity.mjs`) ಅನ್ನು ದಾಖಲಿಸಿ, ಪ್ರತ್ಯೇಕ ಜಾಬ್ನಲ್ಲಿ ಟಾರ್ಬಾಲ್ಗೆ ದೃಢೀಕರಣ ನೀಡುತ್ತದೆ. ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ಪ್ರಮೋಟ್ ಮಾಡುವುದು ಎಂದರೆ ಆ ಟಾರ್ಬಾಲ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವುದು: ಮೂಲದಿಂದ ಎಂದಿಗೂ ಮರುನಿರ್ಮಿಸಬೇಡಿ. ### ಕಟ್ (3.9.0, GO ನಂತರ) 1. GO ಅನ್ನು [LTS_GO_NO_GO.md](./LTS_GO_NO_GO.md)ನಲ್ಲಿ ದಾಖಲಿಸಲಾಗಿದೆ. 2. `npm run release:dry-run-lts-cut -- --from v3.9.0` `RESULT: READY` ಅನ್ನು ಮುದ್ರಿಸುತ್ತದೆ. 3. ಡ್ರೈ-ರನ್ ಮುದ್ರಿಸುವ ಕಮಾಂಡ್ಗಳೊಂದಿಗೆ `origin`ನಲ್ಲಿ ಶಾಖೆಗಳನ್ನು ಕೈಯಾರೆ ರಚಿಸಿ — ಸ್ಕ್ರಿಪ್ಟ್ `origin`ಗೆ ಪುಶ್ ಮಾಡಲು ನಿರಾಕರಿಸುತ್ತದೆ. ಪರಿಶೀಲಿಸಲಾದ develop ಕಮಿಟ್ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಲು, ಮೊದಲು ನಿಮ್ಮ ಫೋರ್ಕ್ ವಿರುದ್ಧ 3.9.0 ತುದಿಯಲ್ಲಿ `--execute` ಪೂರ್ವಾಭ್ಯಾಸವನ್ನು ಚಲಾಯಿಸಿ; ಅದು ಎರಡೂ SHAಗಳನ್ನು ಮುದ್ರಿಸುತ್ತದೆ ಮತ್ತು ಅದೇ ಕಮಿಟ್ಗಳನ್ನು ಪುಶ್ ಮಾಡಬಹುದು: ```bash git push origin :refs/heads/stable/v3 :refs/heads/develop ``` 4. ಮೊದಲ PR ವಿಲೀನಗೊಳ್ಳುವ ಮೊದಲು `stable/v3` ಮತ್ತು `develop` ಅನ್ನು ಸಂರಕ್ಷಿಸಿ (ನಿಯಮಸಮೂಹಗಳು + ವಿಲೀನ ಸರತಿ). 5. ನಿಷ್ಕ್ರಿಯ ವರ್ಕ್ಫ್ಲೋಗಳು ಶಾಖೆಯ ಅಸ್ತಿತ್ವದ ಆಧಾರದ ಮೇಲೆ ಸಕ್ರಿಯಗೊಳ್ಳುತ್ತವೆ: `forward-port.yml` (`stable/v3` ಗೆ ಪುಶ್), `validate-stable-pr.yml` (`stable/v3` ಗೆ PRಗಳು) ಮತ್ತು `nightly-v4-build.yml` (`develop` ಅನ್ನು ಬಿಲ್ಡ್ ಮಾಡುತ್ತದೆ). ಲೈವ್ ಮಾಡುವ ಮೊದಲು, `secrets.FORWARD_PORT_TOKEN` ರೆಪೊಸಿಟರಿ ಸೀಕ್ರೆಟ್ ಅನ್ನು ಹೊಂದಿಸಿ (ಇದರಿಂದ ಫಾರ್ವರ್ಡ್-ಪೋರ್ಟ್ PRಗಳಲ್ಲಿ CI ರನ್ ಆಗುತ್ತದೆ); ಮಾಲೀಕರು `vars.NIGHTLY_PUBLISH` ರೆಪೊಸಿಟರಿ ವೇರಿಯೇಬಲ್ ಅನ್ನು `true` ಗೆ ಹೊಂದಿಸುವವರೆಗೆ ಮತ್ತು npm Trusted Publishing `nightly-v4-build.yml` ಅನ್ನು ಅಂಗೀಕರಿಸುವವರೆಗೆ ರಾತ್ರಿಯ ಪ್ರಕಟಣೆ ನಿಷ್ಕ್ರಿಯವಾಗಿಯೇ ಇರುತ್ತದೆ. ಚಾನೆಲ್ ನಿರ್ಧಾರಕವು `scripts/release/dist-tag.mjs` ಆಗಿದ್ದು, `npm-publish.yml` ಬಳಸುವ ಅದೇ ನಿರ್ಧಾರಕವಾಗಿದೆ. 6. ಚಾನೆಲ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ: `npm view omniroute dist-tags --json` ನಲ್ಲಿ `latest` = 3.9.0 ಎಂದು ತೋರಿಸಬೇಕು ಮತ್ತು v4 ಪ್ರಕಟವಾಗುವವರೆಗೆ `next` / `nightly` ಇರಬಾರದು. 7. ಅಗತ್ಯವಿದ್ದರೆ ಹಿಂದಕ್ಕೆ ಹಿಂತಿರುಗಿಸಲು: `git push origin --delete refs/heads/stable/v3 refs/heads/develop` ಮತ್ತು `npm dist-tag add omniroute@3.8.59 latest`. --- ## ರೋಲ್ಬ್ಯಾಕ್ ಬಿಡುಗಡೆಯಲ್ಲಿ ಗಂಭೀರ ಸಮಸ್ಯೆಯಿದ್ದರೆ: 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 ತೆರೆಯುವ ಮೊದಲು ಡಾಕ್ಸ್ ಸಿಂಕ್ ಗಾರ್ಡ್ ಅನ್ನು ಸ್ಥಳೀಯವಾಗಿ ರನ್ ಮಾಡಿ: ```bash npm run check:docs-sync ``` CI ಕೂಡ ಈ ಪರಿಶೀಲನೆಯನ್ನು `.github/workflows/ci.yml` ನಲ್ಲಿ (ಲಿಂಟ್ ಜಾಬ್) ರನ್ ಮಾಡುತ್ತದೆ.