# 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) · 🇲🇾 [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 कौशल्यांचा वापर करणारा सुव्यवस्थित रिलीज प्रवाह. > > **रिलीजदरम्यान queue/branch हिरवा ठेवा:** [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 प्रकाशन (विनंतीनुसार — `publish_mode=staged`) npm-publish workflow आता थेट प्रकाशित करत नाही: ती पॅक केलेला tarball (`check:pack-boot`) बूट करते आणि नंतर `npm stage publish` चालवते — नेमके तेच bytes registry वर ठेवले जातात, परंतु मालकाने मंजुरी देईपर्यंत ते **इन्स्टॉल करता येत नाहीत**. मानवी 2FA तपासणी पुराव्याआधी नव्हे, तर त्यानंतर हलवली आहे. **workflow हिरवी झाल्यानंतरचा मालकाचा प्रवाह:** 1. `npm stage list omniroute` — stage id शोधा (तो workflow summary मध्येही छापला जातो). 2. staged bytes सत्यापित करा (शिफारस केलेले): `npm stage download `, त्यानंतर डाउनलोड केलेला tarball तात्पुरत्या prefix मध्ये इन्स्टॉल करून तो बूट करा (`npm run check:pack-boot` CI मध्ये हाच pack→install→boot निकाल स्वयंचलित करते). 3. `npm stage approve ` — 2FA prompt म्हणजेच प्रकाशन. `npm stage reject ` ते रद्द करते. 4. प्रकाशनानंतरची सुरक्षा-जाळी: post-publish verifier (v3.8.49 योजनेतील WS1.4) सार्वजनिक registry मधून प्रकाशित आवृत्ती स्वच्छ container मध्ये इन्स्टॉल करून ती बूट करते. **आणीबाणीतील पर्याय:** `publish_mode=direct` सह `workflow_dispatch` केल्यास जुने तात्काळ `npm publish` पुनर्स्थापित होते (staging मध्येच बिघाड झाल्यास फक्त तेव्हाच वापरा; कारण नोंदवा). **एकदाच करायचे hardening (मालक, npmjs.com):** `omniroute` साठी Trusted Publisher stage-only mode मध्ये configure करा, जेणेकरून लीक झालेला दीर्घकालीन token कुठूनही थेट `npm publish` करू शकणार नाही — CI केवळ stage करू शकते; फक्त मालकाचे 2FA रिलीज करू शकते. **दोषपूर्ण artifact साठी playbook (अपरिवर्तित):** डीफॉल्ट प्रतिसाद म्हणून `npm deprecate omniroute@ " — use "` वापरा (काही मिनिटांत, परत पूर्ववत करता येण्याजोगे); `npm unpublish` फक्त 72h/no-dependents मर्यादेत आणि पहिली कृती म्हणून कधीही नाही. Docker: आवृत्तीचा tag कधीही पुन्हा लिहू नका — rollback म्हणजे `latest` ला शेवटच्या योग्य digest कडे पुन्हा निर्देशित करणे. **Docker Hub `latest` (प्रत्येक स्थिर SemVer प्रकाशनासाठी आवश्यक):** `docker-publish` workflow ने **दोन्ही** `X.Y.Z` आणि, `should-promote-latest.sh` ही सर्वात उच्च स्थिर SemVer आवृत्ती असल्याचे मान्य करत असेल तेव्हा, `:latest` यांना **समान digest** सह tag करणे आवश्यक आहे. job नंतर: Hub वरील `latest` digest नवीन SemVer digest च्या समान असतो आणि `last_updated` पुढे सरकलेले असते. रिलीज नोंदींमध्ये फक्त git वर अस्तित्वात असलेल्या सुधारणांचा उल्लेख असताना `:latest` एखाद्या जुन्या build वर ठेवू नका. Compose quickstart मध्ये `:latest` वापरले जाते; GitOps ने `X.Y.Z` pin करणे सुरू ठेवावे. [Docker रिलीज channels](../guides/DOCKER_GUIDE.md#release-channels) आणि #10317 पहा. ## हॉटफिक्स फास्ट-लेन (`hotfix` लेबल) `hotfix` लेबल असलेला PR जड CI मॅट्रिक्स (9-शार्ड 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 होताना क्रॅश होते / सुरक्षा दुरुस्ती / रिलीजचा प्रत्येक वापरकर्ता प्रभावित झाला आहे. "महत्त्वाचे" म्हणजे "बंद पडलेले" नव्हे. 2. **अधिकार**: फक्त repository मालक `hotfix` लेबल लावतो. लेबल हेच अनुमोदन आहे — campaign PR वर ते स्वतःहून कधीही वापरू नका. 3. **पुरावा**: PR body मध्ये मागील पूर्णपणे यशस्वी heavy run ची लिंक (वगळलेले jobs जी suite पुन्हा validate करतील) आणि त्या दुरुस्तीची स्वतःची आधी अपयशी व नंतर यशस्वी झालेली test दिलेली असते. 4. **व्याप्ती**: फक्त cherry-pick — किमान आवश्यक दुरुस्ती, refactors नाहीत, असंबंधित बदल नाहीत. वगळलेली coverage/ratchet व्याप्ती release branch वरील पुढील पूर्ण run द्वारे पुन्हा validate केली जाते (सतत release-green) — ही lane फक्त प्रतीक्षा वगळते, validation कधीही नाही. फक्त tests मधील बदल (`tests/` अंतर्गत सर्व files, `tests/e2e/` अंतर्गत एकही नाही) कोणत्याही लेबलशिवाय E2E मॅट्रिक्स आपोआप वगळतात. ## तपशीलवार तपासणीसूची ### रिलीजपूर्व - [ ] या रिलीजसाठी लक्ष्यित केलेले सर्व 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` — **पर्यायी/व्यक्तिचलित** (Phase-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` पर्यावरण करार अबाधित आहे - [ ] `npm run check:doc-links` 0 सह बाहेर पडते — पुनर्रचनेनंतर कोणतेही अंतर्गत markdown संदर्भ तुटलेले नाहीत - [ ] स्टोरेज/रनटाइम विसंगतीसाठी `docs/architecture/ARCHITECTURE.md` चे पुनरावलोकन केले आहे - [ ] पर्यावरण चल आणि कार्यप्रणालीतील विसंगतीसाठी `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 मर्ज झाले आहेत आणि रिलीज-टिप 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 बूट (मायग्रेशन टक्कर शोधते — 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@` पोस्टइंस्टॉल कोणत्याही गंभीर एक्झिटशिवाय चालवते - [ ] अपडेट पाथ पर्यायी डिपेंडन्सीज राखून ठेवतो: `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` येथे आपोआप डाउनलोड होते. त्यानंतर पोस्टइंस्टॉल (`scripts/build/colocateOptionals.mjs`) SLM चा पर्यायी क्लोजर `dist/node_modules` मध्ये एकत्र ठेवते, जेणेकरून वर्कर `@huggingface/transformers` ^4.2.0 चे एकमेव इन्स्टन्स रिझॉल्व्ह करेल — स्वतंत्र ट्रेस बंडलमध्ये फक्त transformers समाविष्ट होते, डायनॅमिकरीत्या इम्पोर्ट केलेले पर्याय नाहीत, त्यामुळे याशिवाय वर्कर रूटच्या transformers विरुद्ध llmlingua-2 लोड करेल आणि SLM टियर त्रुटी न दाखवता फेल-ओपन होईल. - [ ] `omniroute status` कोणत्याही `.env` शिवाय कार्य करते (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` फाइल्स रॉ 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`. त्यानंतर, `develop` वरील पहिल्या PR पूर्वी `[4.0.0]` CHANGELOG विभाग आणि त्याच्या i18n प्रतिरूपांना उघडले जाते. स्क्रिप्ट 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. [LTS_GO_NO_GO.md](./LTS_GO_NO_GO.md) मध्ये GO नोंदवलेले आहे. 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` संरक्षित करा (rulesets + merge queue). 5. निष्क्रिय workflows शाखा अस्तित्वात आल्यानंतर सक्रिय होतात: `forward-port.yml` (`stable/v3` वर push), `validate-stable-pr.yml` (`stable/v3` साठी PRs) आणि `nightly-v4-build.yml` (`develop` build करते). प्रत्यक्ष कार्यान्वयनापूर्वी, `secrets.FORWARD_PORT_TOKEN` repository secret सेट करा (जेणेकरून forward-port PRs वर CI चालेल); मालक repository variable `vars.NIGHTLY_PUBLISH` हे `true` वर सेट करेपर्यंत आणि npm Trusted Publishing `nightly-v4-build.yml` स्वीकारेपर्यंत nightly publishing बंदच राहते. Channel resolution `scripts/release/dist-tag.mjs` मध्ये आहे; हाच resolver `npm-publish.yml` वापरते. 6. channels सत्यापित करा: `npm view omniroute dist-tags --json` मध्ये `latest` = 3.9.0 दिसते आणि v4 प्रकाशित होईपर्यंत `next` / `nightly` दिसत नाहीत. 7. आवश्यक असल्यास rollback करा: `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 उघडण्यापूर्वी docs sync guard स्थानिकरित्या चालवा: ```bash npm run check:docs-sync ``` CI देखील `.github/workflows/ci.yml` मध्ये ही तपासणी चालवते (lint जॉब).