# Contributing to OmniRoute (മലയാളം) 🌐 **Languages:** 🇺🇸 [English](../../../CONTRIBUTING.md) · 🇪🇹 [am](../am/CONTRIBUTING.md) · 🇸🇦 [ar](../ar/CONTRIBUTING.md) · 🇦🇿 [az](../az/CONTRIBUTING.md) · 🇧🇬 [bg](../bg/CONTRIBUTING.md) · 🇧🇩 [bn](../bn/CONTRIBUTING.md) · 🇧🇦 [bs](../bs/CONTRIBUTING.md) · 🇨🇿 [cs](../cs/CONTRIBUTING.md) · 🇩🇰 [da](../da/CONTRIBUTING.md) · 🇩🇪 [de](../de/CONTRIBUTING.md) · 🇬🇷 [el](../el/CONTRIBUTING.md) · 🇪🇸 [es](../es/CONTRIBUTING.md) · 🇪🇪 [et](../et/CONTRIBUTING.md) · 🇮🇷 [fa](../fa/CONTRIBUTING.md) · 🇫🇮 [fi](../fi/CONTRIBUTING.md) · 🇫🇷 [fr](../fr/CONTRIBUTING.md) · 🇮🇪 [ga](../ga/CONTRIBUTING.md) · 🇮🇳 [gu](../gu/CONTRIBUTING.md) · 🇳🇬 [ha](../ha/CONTRIBUTING.md) · 🇮🇱 [he](../he/CONTRIBUTING.md) · 🇮🇳 [hi](../hi/CONTRIBUTING.md) · 🇭🇷 [hr](../hr/CONTRIBUTING.md) · 🇭🇺 [hu](../hu/CONTRIBUTING.md) · 🇦🇲 [hy](../hy/CONTRIBUTING.md) · 🇮🇩 [id](../id/CONTRIBUTING.md) · 🇳🇬 [ig](../ig/CONTRIBUTING.md) · 🇮🇹 [it](../it/CONTRIBUTING.md) · 🇯🇵 [ja](../ja/CONTRIBUTING.md) · 🇬🇪 [ka](../ka/CONTRIBUTING.md) · 🇰🇭 [km](../km/CONTRIBUTING.md) · 🇮🇳 [kn](../kn/CONTRIBUTING.md) · 🇰🇷 [ko](../ko/CONTRIBUTING.md) · 🇱🇹 [lt](../lt/CONTRIBUTING.md) · 🇱🇻 [lv](../lv/CONTRIBUTING.md) · 🇮🇳 [mr](../mr/CONTRIBUTING.md) · 🇲🇾 [ms](../ms/CONTRIBUTING.md) · 🇲🇹 [mt](../mt/CONTRIBUTING.md) · 🇲🇲 [my](../my/CONTRIBUTING.md) · 🇳🇵 [ne](../ne/CONTRIBUTING.md) · 🇳🇱 [nl](../nl/CONTRIBUTING.md) · 🇳🇴 [no](../no/CONTRIBUTING.md) · 🇮🇳 [or](../or/CONTRIBUTING.md) · 🇮🇳 [pa](../pa/CONTRIBUTING.md) · 🇵🇭 [phi](../phi/CONTRIBUTING.md) · 🇵🇱 [pl](../pl/CONTRIBUTING.md) · 🇵🇹 [pt](../pt/CONTRIBUTING.md) · 🇧🇷 [pt-BR](../pt-BR/CONTRIBUTING.md) · 🇷🇴 [ro](../ro/CONTRIBUTING.md) · 🇷🇺 [ru](../ru/CONTRIBUTING.md) · 🇱🇰 [si](../si/CONTRIBUTING.md) · 🇸🇰 [sk](../sk/CONTRIBUTING.md) · 🇸🇮 [sl](../sl/CONTRIBUTING.md) · 🇷🇸 [sr](../sr/CONTRIBUTING.md) · 🇸🇪 [sv](../sv/CONTRIBUTING.md) · 🇰🇪 [sw](../sw/CONTRIBUTING.md) · 🇮🇳 [ta](../ta/CONTRIBUTING.md) · 🇮🇳 [te](../te/CONTRIBUTING.md) · 🇹🇭 [th](../th/CONTRIBUTING.md) · 🇹🇷 [tr](../tr/CONTRIBUTING.md) · 🇺🇦 [uk-UA](../uk-UA/CONTRIBUTING.md) · 🇵🇰 [ur](../ur/CONTRIBUTING.md) · 🇺🇿 [uz](../uz/CONTRIBUTING.md) · 🇻🇳 [vi](../vi/CONTRIBUTING.md) · 🇳🇬 [yo](../yo/CONTRIBUTING.md) · 🇨🇳 [zh-CN](../zh-CN/CONTRIBUTING.md) · 🇹🇼 [zh-TW](../zh-TW/CONTRIBUTING.md) --- സംഭാവന ചെയ്യാനുള്ള നിങ്ങളുടെ താൽപ്പര്യത്തിന് നന്ദി! ആരംഭിക്കാൻ ആവശ്യമായ എല്ലാ കാര്യങ്ങളും ഈ ഗൈഡിൽ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. ഓരോ മാറ്റത്തിനുമുള്ള ഔദ്യോഗിക പ്രവർത്തനക്രമത്തിനായി, [സംഭാവനയ്ക്കുള്ള ഗോൾഡൻ പാത](docs/ops/CONTRIBUTION_GOLDEN_PATH.md) ഉപയോഗിച്ച് ആരംഭിക്കുക. പ്രൊവൈഡർ, റൂട്ടിംഗ്, UI/UX, i18n, CLI, ഡാറ്റാബേസ്, ബിൽഡ്/ഡിപ്ലോയ് മാറ്റങ്ങൾ എന്നിവയെ അവയുടെ കരാറുകൾ, കേന്ദ്രീകൃത ടെസ്റ്റുകൾ, CI കവറേജ്, അനുരഞ്ജന ഘട്ടങ്ങൾ എന്നിവയുമായി ഇത് ബന്ധിപ്പിക്കുന്നു. --- ## വികസന സജ്ജീകരണം ### മുൻവ്യവസ്ഥകൾ - **Node.js** `>=22.22.2 <23`, അല്ലെങ്കിൽ `>=24.0.0 <27` (ശുപാർശ ചെയ്യുന്നത്: 24 LTS) - **npm** 10+ > **Node 24 ഉള്ള Windows:** നിലവിലെ 24 LTS പാച്ച് റിലീസ് ഉപയോഗിക്കുക (കുറഞ്ഞത് 24.20.0). > നേരത്തെയുള്ള റിലീസുകളിൽ `--test-force-exit` പ്രോസസ് അടയ്ക്കുമ്പോൾ വിജയകരമായ ടെസ്റ്റുകൾക്ക് ശേഷം > പ്രോസസ് അബോർട്ട് ചെയ്യാൻ സാധ്യതയുണ്ട്. Node-ന്റെ [Windows libuv പരിഹാരം](https://github.com/nodejs/node/pull/61999) > ഈ റൺടൈം ക്രാഷ് പരിഹരിക്കുന്നു; ടെസ്റ്റ് അസർഷനുകളും റണ്ണർ എക്സിറ്റ് പരിശോധനകളും പ്രവർത്തനക്ഷമമായി നിലനിർത്തുക. > **npm v11+ ഉപയോക്താക്കൾ (Node 24+):** `npm install` കഴിഞ്ഞ് നേറ്റീവ് മോഡ്യൂളുകൾ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടെന്ന് പരിശോധിക്കുക: > `node -e "require('better-sqlite3')"`. ഇത് `MODULE_NOT_FOUND` ഉപയോഗിച്ച് പരാജയപ്പെടുകയാണെങ്കിൽ, > `npm approve-scripts better-sqlite3 && npm install` പ്രവർത്തിപ്പിക്കുക. [പ്രശ്നപരിഹാരം](docs/guides/TROUBLESHOOTING.md#npm-v11-better-sqlite3-not-installed-cannot-find-module) കാണുക. - **Git** ### ക്ലോൺ ചെയ്ത് ഇൻസ്റ്റാൾ ചെയ്യുക ```bash git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute npm install ``` ### പരിസ്ഥിതി വേരിയബിളുകൾ ```bash # ടെംപ്ലേറ്റിൽ നിന്ന് നിങ്ങളുടെ .env സൃഷ്ടിക്കുക cp .env.example .env # ആവശ്യമായ രഹസ്യങ്ങൾ സൃഷ്ടിക്കുക echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env echo "API_KEY_SECRET=$(openssl rand -hex 32)" >> .env ``` വികസനത്തിനുള്ള പ്രധാന വേരിയബിളുകൾ: | Variable | Development Default | Description | | ---------------------- | ------------------------ | ------------------------- | | `PORT` | `20128` | സെർവർ പോർട്ട് | | `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | ഫ്രണ്ട്എൻഡിനുള്ള ബേസ് URL | | `JWT_SECRET` | (മുകളിൽ സൃഷ്ടിക്കുക) | JWT സൈനിംഗ് രഹസ്യം | | `INITIAL_PASSWORD` | `CHANGEME` | ആദ്യ ലോഗിൻ പാസ്വേഡ് | | `APP_LOG_LEVEL` | `info` | ലോഗ് വിശദതാ നില | ### ഡാഷ്ബോർഡ് ക്രമീകരണങ്ങൾ പരിസ്ഥിതി വേരിയബിളുകൾ വഴി ക്രമീകരിക്കാനും കഴിയുന്ന സവിശേഷതകൾക്കായി ഡാഷ്ബോർഡ് UI ടോഗിളുകൾ നൽകുന്നു: | Setting Location | Toggle | Description | | ------------------- | ------------------ | ------------------------------------------------- | | Settings → Advanced | Debug Mode | ഡീബഗ് അഭ്യർത്ഥനാ ലോഗുകൾ പ്രവർത്തനക്ഷമമാക്കുക (UI) | | Settings → General | Sidebar Visibility | സൈഡ്ബാർ വിഭാഗങ്ങൾ കാണിക്കുക/മറയ്ക്കുക | ഈ ക്രമീകരണങ്ങൾ ഡാറ്റാബേസിൽ സംഭരിക്കപ്പെടുകയും പുനരാരംഭിച്ചതിന് ശേഷവും നിലനിൽക്കുകയും ചെയ്യുന്നു; സജ്ജീകരിച്ചിരിക്കുമ്പോൾ അവ env var ഡിഫോൾട്ടുകളെ മറികടക്കുന്നു. ### ലോക്കലായി പ്രവർത്തിപ്പിക്കൽ ```bash # വികസന മോഡ് (ഹോട്ട് റീലോഡ്) npm run dev # പ്രൊഡക്ഷൻ ബിൽഡ് npm run build # next build → .build/next/ തുടർന്ന് assembleStandalone → dist/ npm run start # സംഭാവകരുടെ മാറ്റങ്ങൾക്കായുള്ള വേഗത്തിലുള്ള ബാക്ക്എൻഡ്/API-മാത്രം കംപൈൽ npm run build:contributor # റിലീസ് ബിൽഡ് (ക്ലീൻ റീബിൽഡ് + HEAD സെന്റിനൽ — ഡിപ്ലോയ്ക്ക് ആവശ്യമാണ്) npm run build:release # rm -rf .build dist തുടർന്ന് build + dist/BUILD_SHA എഴുതുന്നു # സാധാരണ പോർട്ട് കോൺഫിഗറേഷൻ PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev ``` സംഭാവക ബിൽഡ് കംപൈൽ-മാത്രം പരിശോധന നടത്തുന്നു: ഇത് സ്റ്റാൻഡലോൺ ഡിസ്ട്രിബ്യൂഷൻ അസംബിൾ ചെയ്യുകയോ ഓപ്ഷണൽ നേറ്റീവ് പാക്കേജിംഗ് ആസറ്റുകൾ ബിൽഡ് ചെയ്യുകയോ ചെയ്യുന്നില്ല. ഷിപ്പ് ചെയ്യാവുന്ന ബണ്ടിൽ സാധൂകരിക്കേണ്ടപ്പോൾ സാധാരണ പ്രൊഡക്ഷൻ ബിൽഡ് ഉപയോഗിക്കുക. ### ബിൽഡ് ഔട്ട്പുട്ട് ഘടന | Directory | Contents | Tracked | | --------- | -------------------------------------------------------------------------------- | ------- | | `src/` | ആപ്ലിക്കേഷൻ സോഴ്സ് (TypeScript / TSX) | അതെ | | `.build/` | ഇടക്കാല ഫയലുകൾ — `next build` ഔട്ട്പുട്ട് (gitignored, `distDir = .build/next`) | ഇല്ല | | `dist/` | ഷിപ്പ് ചെയ്യാവുന്ന ബണ്ടിൽ — `assembleStandalone` വഴി അസംബിൾ ചെയ്തത് (gitignored) | ഇല്ല | ബിൽഡ് പൈപ്പ്ലൈൻ ഒറ്റ പാസാണ്: ``` npm run build └─ next build → .build/next/standalone (Next.js ഔട്ട്പുട്ട്) └─ assembleStandalone() (standalone + static + public + native assets പകർത്തുന്നു) └─ output: dist/ (server.js, .next/static/, public/, node_modules/) ``` `npm run build:release` അധികമായി ആദ്യം രണ്ട് ഡയറക്ടറികളും ക്ലീൻ ചെയ്യുകയും `dist/BUILD_SHA` (= `git rev-parse --short HEAD`) ഒരു ഡിപ്ലോയ് ഇന്റഗ്രിറ്റി സെന്റിനലായി എഴുതുകയും ചെയ്യുന്നു. `npm run build:contributor` ബാക്ക്എൻഡ്-മാത്രമുള്ള ബിൽഡ് പ്രൊഫൈൽ ഉപയോഗിക്കുന്നു. ബിൽഡ് ചെയ്യുമ്പോൾ ഇത് ഡാഷ്ബോർഡ് UI ഫയലുകൾ താൽക്കാലികമായി സ്റ്റബ് ചെയ്യുകയും API റൂട്ട് ഹാൻഡ്ലറുകൾ നിലനിർത്തുകയും ബിൽഡിന് ശേഷം യഥാർത്ഥ ഫയലുകൾ പുനഃസ്ഥാപിക്കുകയും ചെയ്യുന്നു. ഡാഷ്ബോർഡ് UI-യെ ബാധിക്കുന്ന മാറ്റങ്ങൾക്കോ പൂർണ്ണ റിലീസ് സാധൂകരണത്തിനോ `npm run build` ഉപയോഗിക്കുക; സംഭാവക പ്രൊഫൈൽ റിലീസ് ബിൽഡിന് പകരമല്ല. > **VPS ഡിപ്ലോയ് കുറിപ്പ്:** റിമോട്ട് ഇമേജ് ഡയറക്ടറി `/usr/lib/node_modules/omniroute/app/` > മാറ്റമില്ലാതെ തുടരും. ഡിപ്ലോയ് സ്കില്ലുകൾ `dist/`-ന്റെ ഉള്ളടക്കം അതിലേക്ക് rsync ചെയ്യുന്നു. > ഇൻ-റിപ്പോസിറ്ററി ബിൽഡ് ഔട്ട്പുട്ട് പാത മാത്രമാണ് മാറിയത് (`app/` → `dist/`). ഡിഫോൾട്ട് URL-കൾ: - **ഡാഷ്ബോർഡ്**: `http://localhost:20128/dashboard` - **API**: `http://localhost:20128/v1` --- ## Git പ്രവർത്തനക്രമം > ⚠️ **`main`-ലേക്ക് ഒരിക്കലും നേരിട്ട് commit ചെയ്യരുത്.** എല്ലായ്പ്പോഴും feature branch-കൾ ഉപയോഗിക്കുക. > > **PR base:** സജീവമായ `release/vX.Y.Z` branch ലക്ഷ്യമാക്കുക (`main` അല്ല). ഓരോ release-നും ഓരോ branch + ship ചെയ്യുമ്പോൾ tag എന്ന മാതൃകയെക്കുറിച്ച് അറിയാൻ > [`docs/ops/BRANCHING_MODEL.md`](docs/ops/BRANCHING_MODEL.md) കാണുക. ```bash # സജീവ release tip-ൽനിന്ന് branch സൃഷ്ടിക്കുക (ഉദാഹരണം: release/v3.8.49) git fetch origin git checkout -b feat/your-feature-name origin/release/v3.8.49 # ... മാറ്റങ്ങൾ വരുത്തുക ... git commit -m "feat: describe your change" git push -u origin feat/your-feature-name # base = release/v3.8.49 ആയി ഒരു Pull Request തുറക്കുക ``` ### Branch നാമകരണം | Prefix | ഉദ്ദേശ്യം | | ----------- | ------------------------------------------- | | `feat/` | പുതിയ സവിശേഷതകൾ | | `fix/` | ബഗ് പരിഹാരങ്ങൾ | | `refactor/` | കോഡ് പുനഃസംഘടന | | `docs/` | ഡോക്യുമെന്റേഷൻ മാറ്റങ്ങൾ | | `test/` | ടെസ്റ്റുകളുടെ കൂട്ടിച്ചേർക്കലുകൾ/പരിഹാരങ്ങൾ | | `chore/` | ടൂളിംഗ്, CI, dependencies | ### Commit സന്ദേശങ്ങൾ [Conventional Commits](https://www.conventionalcommits.org/) പിന്തുടരുക: ``` feat: add circuit breaker for provider calls fix: resolve JWT secret validation edge case docs: update SECURITY.md with PII protection test: add observability unit tests refactor(db): consolidate rate limit tables ``` Scopes (v3.8): `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`, `cloud-agent`, `guardrails`, `compression`, `auto-combo`, `resilience`, `providers`, `executors`, `translator`, `domain`, `authz`. --- ## ടെസ്റ്റുകൾ പ്രവർത്തിപ്പിക്കൽ ```bash # എല്ലാ ടെസ്റ്റുകളും (യൂണിറ്റ് + vitest + ഇക്കോസിസ്റ്റം + e2e) npm run test:all # ഒരൊറ്റ ടെസ്റ്റ് ഫയൽ (Node.js നേറ്റീവ് ടെസ്റ്റ് റണ്ണർ — മിക്ക ടെസ്റ്റുകളും ഇത് ഉപയോഗിക്കുന്നു) node --import tsx/esm --test tests/unit/your-file.test.ts # നിങ്ങളുടെ മാറ്റം ബാധിക്കുന്ന യൂണിറ്റ് ടെസ്റ്റുകൾ മാത്രം (CI ഗേറ്റിന്റെ അതേ TIA സെലക്ടർ, #8084) npm run test:scoped # അവസാന കമ്മിറ്റിലെ മാറ്റങ്ങൾ (അല്ലെങ്കിൽ വർക്കിങ് ട്രീയിലെ മാറ്റങ്ങൾ) npm run test:scoped:staged # സ്റ്റേജ് ചെയ്ത മാറ്റങ്ങൾ മാത്രം — പ്രീ-കമ്മിറ്റ് റണ്ണിനൊപ്പം നന്നായി പ്രവർത്തിക്കുന്നു npm run test:scoped:full # ആദ്യം ഇംപോർട്ട്-ഗ്രാഫ് മാപ്പ് പുനർനിർമ്മിക്കുന്നു (ഫയലുകൾ ചേർത്തതിനോ നീക്കിയതിനോ ശേഷം) # Exit 1 + "പൂർണ്ണ സ്യൂട്ട് പ്രവർത്തിപ്പിക്കുക" എന്നതിന്റെ അർത്ഥം ഒരു ഹബ് ഫയൽ (tsconfig, package.json, …) അല്ലെങ്കിൽ # മാപ്പ് ചെയ്യാത്ത സോഴ്സ് മാറിയെന്നാണ് — സെലക്ടർ സുരക്ഷിതമായി പരാജയപ്പെടുന്നു; അത് ഒരിക്കലും നിശ്ശബ്ദമായി ഒഴിവാക്കില്ല. # Vitest (MCP സെർവർ, autoCombo, കാഷ്) npm run test:vitest # E2E ടെസ്റ്റുകൾ (Playwright ആവശ്യമാണ്) npm run test:e2e # പ്രോട്ടോക്കോൾ ക്ലയന്റുകളുടെ E2E (MCP ട്രാൻസ്പോർട്ടുകൾ, A2A) npm run test:protocols:e2e # ഇക്കോസിസ്റ്റം അനുയോജ്യതാ ടെസ്റ്റുകൾ npm run test:ecosystem # കവറേജ് ഗേറ്റ്: സ്റ്റേറ്റ്മെന്റുകൾ/ലൈനുകൾ/ഫങ്ഷനുകൾ/ബ്രാഞ്ചുകൾ എന്നിവയ്ക്ക് 60% npm run test:coverage npm run coverage:report # ലിന്റ് + ഫോർമാറ്റ് പരിശോധന npm run lint npm run check # ഗേറ്റ് ചെയ്ത യഥാർത്ഥ-അപ്സ്ട്രീം കോംബോ സ്മോക്ക് ടെസ്റ്റ് (VPS ആക്സസ് + യഥാർത്ഥ പ്രൊവൈഡർ ക്രെഡിറ്റുകൾ ആവശ്യമാണ്) # യഥാർത്ഥ പ്രൊവൈഡറുകളെയാണ് സമീപിക്കുന്നത് — ചെറിയ ചെലവുണ്ടാകും. CI-യിൽ ഒരിക്കലും പ്രവർത്തിക്കില്ല. ഗേറ്റ് ഇല്ലെങ്കിൽ പ്രശ്നമില്ലാതെ ഒഴിവാക്കപ്പെടും. # ആവശ്യമാണ്: ssh root@192.168.0.15 ആക്സസ് (VPS-ൽ നിന്ന് റീഡ്-ഒൺലി DB സ്നാപ്പ്ഷോട്ട് സോഴ്സ് ചെയ്യുന്നു). RUN_COMBO_LIVE=1 npm run test:combo:live # ഘട്ടം-3 VPS ലൈവ് സ്മോക്ക് ടെസ്റ്റ് — സാധാരണ Node ESM സ്ക്രിപ്റ്റുകൾ, ലൈവ് .15 സെർവറിനെ നേരിട്ട് സമീപിക്കുന്നു. # ആവശ്യമാണ്: ssh root@192.168.0.15 ആക്സസ് (SSH sqlite വഴി കോംബോകൾ സൃഷ്ടിക്കുകയും നീക്കം ചെയ്യുകയും ചെയ്യുന്നു). # യഥാർത്ഥ പ്രൊവൈഡറുകളെയാണ് സമീപിക്കുന്നത് (ചെറിയ ചെലവ്). __live_test__* കോംബോകൾ മാത്രമേ സൃഷ്ടിക്കുകയോ ഇല്ലാതാക്കുകയോ ചെയ്യൂ. CI-യിൽ ഒരിക്കലും പ്രവർത്തിക്കില്ല. # .15-ൽ REQUIRE_API_KEY=false ആയതിനാൽ API കീ ആവശ്യമില്ല, എന്നാൽ സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ COMBO_LIVE_BASE_URL / COMBO_LIVE_API_KEY മാനിക്കുന്നു. npm run test:combo:live:vps # 7 HTTP സാഹചര്യങ്ങൾ (പ്രയോറിറ്റി/റൗണ്ട്-റോബിൻ/വെയ്റ്റഡ്/കോസ്റ്റ്/ഫ്യൂഷൻ/ഓട്ടോ + ഹെൽത്ത്) npm run test:combo:live:vps:failover # യഥാർത്ഥ ക്രോസ്-പ്രൊവൈഡർ ഫെയിൽഓവർ സാഹചര്യം ചേർക്കുന്നു (ആകെ 8) ``` കവറേജ് കുറിപ്പുകൾ: - `npm run test:coverage` പ്രധാന യൂണിറ്റ് ടെസ്റ്റ് സ്യൂട്ടിന്റെ സോഴ്സ് കവറേജ് അളക്കുന്നു, `tests/**` ഒഴിവാക്കുന്നു, കൂടാതെ `open-sse/**` ഉൾപ്പെടുത്തുന്നു - പുൾ റിക്വസ്റ്റുകൾ സ്റ്റേറ്റ്മെന്റുകൾ/ലൈനുകൾ/ഫങ്ഷനുകൾ/ബ്രാഞ്ചുകൾ എന്നിവയുടെ കവറേജ് ഗേറ്റ് **60%+** ആയി നിലനിർത്തണം - ഒരു PR, `src/`, `open-sse/`, `electron/`, അല്ലെങ്കിൽ `bin/` എന്നിവയിലെ പ്രൊഡക്ഷൻ കോഡ് മാറ്റുന്നുവെങ്കിൽ, അതേ PR-ൽ ഓട്ടോമേറ്റഡ് ടെസ്റ്റുകൾ ചേർക്കുകയോ അപ്ഡേറ്റ് ചെയ്യുകയോ വേണം - `npm run coverage:report` ഏറ്റവും പുതിയ കവറേജ് റണ്ണിൽ നിന്നുള്ള വിശദമായ ഓരോ ഫയലിന്റെയും റിപ്പോർട്ട് പ്രിന്റ് ചെയ്യുന്നു - `npm run test:coverage:legacy` ചരിത്രപരമായ താരതമ്യത്തിനായി പഴയ മെട്രിക് നിലനിർത്തുന്നു - ഘട്ടംഘട്ടമായ കവറേജ് മെച്ചപ്പെടുത്തൽ റോഡ്മാപ്പിനായി `docs/ops/COVERAGE_PLAN.md` കാണുക ### പുൾ റിക്വസ്റ്റ് ആവശ്യകതകൾ ഒരു PR തുറക്കുന്നതിന് മുമ്പ്, നിങ്ങൾ മാറ്റിയതിനായുള്ള കേന്ദ്രീകൃത ലൂപ്പ് പ്രവർത്തിപ്പിക്കാൻ [സംഭാവനയ്ക്കുള്ള ഗോൾഡൻ പാത്ത്](docs/ops/CONTRIBUTION_GOLDEN_PATH.md) ഉപയോഗിക്കുക. പൂർണ്ണ യൂണിറ്റ് സ്യൂട്ട് (4 CI ഷാർഡുകൾ), Vitest, **60%+** കവറേജ് ഗേറ്റ്, പ്രൊഡക്ഷൻ ബിൽഡ് എന്നിവ CI-യുടെ ഉത്തരവാദിത്വമാണ് — അവ ലോക്കലായി പ്രവർത്തിപ്പിക്കുന്നത് PR പരിശോധനകൾ നൽകാത്ത അധിക സൂചനയൊന്നും നൽകുന്നില്ല; ചെറിയ മെഷീനുകളിൽ അത് ഹോസ്റ്റിന്റെ ശേഷി പൂർണ്ണമായി ഉപയോഗിച്ചേക്കാം (#8084): - നിങ്ങളുടെ മാറ്റം ഉൾക്കൊള്ളുന്ന ടെസ്റ്റ് ഫയലുകൾ പ്രവർത്തിപ്പിക്കുക: `node --import tsx/esm --test tests/unit/.test.ts` - `npm run lint` പ്രവർത്തിപ്പിക്കുക - പ്രൊഡക്ഷൻ കോഡ് മാറുമ്പോഴെല്ലാം അതേ PR-ൽ ഓട്ടോമേറ്റഡ് ടെസ്റ്റുകൾ ഉൾപ്പെടുത്തുകയോ അപ്ഡേറ്റ് ചെയ്യുകയോ ചെയ്യുക - `node:test` ഫയലുകളിൽ, എല്ലാ ടോപ്പ്-ലെവൽ `await`-കളും (`await import(...)` പോലുള്ളവ) ആദ്യത്തെ `test()` / `describe()`-ന് മുമ്പായി നൽകുക: `--test-force-exit` ഉപയോഗിക്കുമ്പോൾ, അതിനുശേഷം രജിസ്റ്റർ ചെയ്ത ടെസ്റ്റുകൾ ഒരിക്കലും പ്രവർത്തിക്കാതെ നിശ്ശബ്ദമായി ഒഴിവാകാം (#18045; `npm run check:test-tla-order` ഇത് നിർബന്ധമാക്കുന്നു) - പ്രൊഡക്ഷൻ കോഡ് മാറിയിട്ടുണ്ടെങ്കിൽ, മാറ്റിയതോ ചേർത്തതോ ആയ ടെസ്റ്റ് ഫയലുകൾ PR വിവരണത്തിൽ ഉൾപ്പെടുത്തുക - CI-യിൽ പ്രോജക്റ്റ് സീക്രറ്റുകൾ കോൺഫിഗർ ചെയ്തിരിക്കുമ്പോൾ PR-ലെ SonarQube ഫലം പരിശോധിക്കുക നിലവിലെ ടെസ്റ്റ് നില: ഇവ ഉൾക്കൊള്ളുന്ന **122 യൂണിറ്റ് ടെസ്റ്റ് ഫയലുകൾ**: - പ്രൊവൈഡർ ട്രാൻസ്ലേറ്ററുകളും ഫോർമാറ്റ് പരിവർത്തനവും - റേറ്റ് ലിമിറ്റിങ്, സർക്യൂട്ട് ബ്രേക്കർ, പ്രതിരോധശേഷി - സെമാന്റിക് കാഷ്, ഐഡംപൊട്ടൻസി, പുരോഗതി ട്രാക്കിങ് - ഡാറ്റാബേസ് പ്രവർത്തനങ്ങളും സ്കീമയും (21 DB മൊഡ്യൂളുകൾ) - OAuth ഫ്ലോകളും ഓതന്റിക്കേഷനും - API എൻഡ്പോയിന്റ് വാലിഡേഷൻ (Zod v4) - MCP സെർവർ ടൂളുകളും സ്കോപ്പ് നിർബന്ധമാക്കലും - മെമ്മറി, സ്കിൽസ് സിസ്റ്റങ്ങൾ --- ## കോഡ് ശൈലി - **ESLint** — commit ചെയ്യുന്നതിന് മുമ്പ് `npm run lint` പ്രവർത്തിപ്പിക്കുക - **Prettier** — commit ചെയ്യുമ്പോൾ `lint-staged` വഴി സ്വയമേവ ഫോർമാറ്റ് ചെയ്യപ്പെടുന്നു (2 spaces, semicolons, double quotes, 100 char width, es5 trailing commas) - **TypeScript** — എല്ലാ `src/` കോഡും `.ts`/`.tsx` ഉപയോഗിക്കുന്നു; `open-sse/` `.ts`/`.js` ഉപയോഗിക്കുന്നു; TSDoc (`@param`, `@returns`, `@throws`) ഉപയോഗിച്ച് രേഖപ്പെടുത്തുക - **`eval()` പാടില്ല** — ESLint, `no-eval`, `no-implied-eval`, `no-new-func` എന്നിവ നിർബന്ധമാക്കുന്നു - **Zod സാധൂകരണം** — എല്ലാ API ഇൻപുട്ട് സാധൂകരണത്തിനും Zod v4 schemas ഉപയോഗിക്കുക - **നാമകരണം**: Files = camelCase/kebab-case, components = PascalCase, constants = UPPER_SNAKE ### പിശക് കൈകാര്യം ചെയ്യൽ / ശൂന്യമായ catch ബ്ലോക്കുകൾ ഒരു `catch`-ഉം വിശദീകരണമില്ലാതെ വിടരുത്. അതിനെ താഴെപ്പറയുന്ന രണ്ട് വിഭാഗങ്ങളിൽ ഒന്നായി തരംതിരിക്കുക ("SSE streams-ൽ പിശകുകൾ ഒരിക്കലും നിശ്ശബ്ദമായി അവഗണിക്കരുത്" എന്ന കർശന നിയമം പ്രാവർത്തികമാക്കുന്നു): - **മനഃപൂർവം (നമ്മുടെ സ്വന്തം best-effort cleanup/telemetry)** — ഇവിടെ ഒരു പരാജയം പ്രതീക്ഷിക്കാവുന്നതും ദോഷരഹിതവുമാണ്; ഒരു വരിയിലുള്ള കാരണവിവരണ comment ചേർക്കുക, logging വേണ്ട (ഓരോ request-ലും logging നടത്തുന്നതിലൂടെ ഉണ്ടാകുന്ന അനാവശ്യ ബഹളമാണ് ഈ convention ഒഴിവാക്കുന്നത്). ```ts } catch {} // client വിച്ഛേദിച്ചതിന് ശേഷം ഇതിനകം അടച്ച controller വീണ്ടും അടയ്ക്കാൻ ശ്രമിക്കുന്നത് പ്രതീക്ഷിക്കാവുന്നതാണ് ``` - **Log ചെയ്യേണ്ടത് (external/caller-supplied code, അല്ലെങ്കിൽ അവഗണിക്കൽ control flow മാറ്റുന്നുവെങ്കിൽ)** — catch നിലനിർത്തുക (അത് stream തകർക്കാൻ ഒരിക്കലും അനുവദിക്കരുത്), എന്നാൽ പരാജയം കണ്ടെത്താനാകുന്നതിനായി സന്ദർഭോചിതമായ `console.debug`/`warn` പുറപ്പെടുവിക്കുക. ```ts } catch (e) { console.debug("[STREAM] onFailure callback പിശക്:", e); } ``` പ്രയോഗിച്ച ഉദാഹരണങ്ങൾക്കായി `open-sse/utils/stream.ts`, `open-sse/utils/streamHandler.ts` എന്നിവ കാണുക. --- ## പ്രോജക്റ്റ് ഘടന ``` src/ # TypeScript (.ts / .tsx) ├── app/ # Next.js 16 App Router │ ├── (dashboard)/ # ഡാഷ്ബോർഡ് പേജുകൾ (23 വിഭാഗങ്ങൾ) │ ├── api/ # API റൂട്ടുകൾ (51 ഡയറക്ടറികൾ) │ └── login/ # ഓതന്റിക്കേഷൻ പേജുകൾ (.tsx) ├── domain/ # പോളിസി എൻജിൻ (policyEngine, comboResolver, costRules തുടങ്ങിയവ) ├── lib/ # പ്രധാന ബിസിനസ് ലോജിക് (.ts) │ ├── a2a/ # Agent-to-Agent v0.3 പ്രോട്ടോക്കോൾ സെർവർ │ ├── acp/ # Agent Communication Protocol രജിസ്ട്രി │ ├── compliance/ # കംപ്ലയൻസ് പോളിസി എൻജിൻ │ ├── db/ # SQLite ഡൊമെയ്ൻ മൊഡ്യൂളുകൾ + 130 മൈഗ്രേഷനുകൾ │ ├── memory/ # സ്ഥിരമായ സംഭാഷണ മെമ്മറി │ ├── oauth/ # OAuth പ്രൊവൈഡറുകൾ, സേവനങ്ങൾ, യൂട്ടിലിറ്റികൾ │ ├── skills/ # വിപുലീകരിക്കാവുന്ന സ്കിൽ ഫ്രെയിംവർക്ക് │ ├── usage/ # ഉപയോഗ ട്രാക്കിങ്ങും ചെലവ് കണക്കാക്കലും │ └── localDb.ts # റീ-എക്സ്പോർട്ട് ലെയർ മാത്രം — ഇവിടെ ഒരിക്കലും ലോജിക് ചേർക്കരുത് ├── middleware/ # റിക്വസ്റ്റ് മിഡിൽവെയർ (promptInjectionGuard) ├── mitm/ # MITM പ്രോക്സി (സർട്ടിഫിക്കറ്റ്, DNS, ടാർഗെറ്റ് റൂട്ടിങ്) ├── shared/ │ ├── components/ # React കംപോണന്റുകൾ (.tsx) │ ├── constants/ # പ്രൊവൈഡർ നിർവചനങ്ങൾ (329), MCP സ്കോപ്പുകൾ, 20 റൂട്ടിങ് തന്ത്രങ്ങൾ │ ├── utils/ # സർക്യൂട്ട് ബ്രേക്കർ, സാനിറ്റൈസർ, ഓതന്റിക്കേഷൻ ഹെൽപ്പറുകൾ │ └── validation/ # Zod v4 സ്കീമകൾ └── sse/ # SSE പ്രോക്സി പൈപ്പ്ലൈൻ open-sse/ # @omniroute/open-sse വർക്ക്സ്പേസ് ├── executors/ # 150 എക്സിക്യൂട്ടർ മൊഡ്യൂളുകൾ (എക്സിക്യൂട്ടർ ക്ലാസുകൾ + ഓരോ പ്രൊവൈഡറിനുമുള്ള ഹെൽപ്പറുകൾ) ├── handlers/ # 11 റിക്വസ്റ്റ് ഹാൻഡ്ലറുകൾ (ചാറ്റ്, റെസ്പോൺസുകൾ, എംബെഡ്ഡിങ്ങുകൾ, ചിത്രങ്ങൾ തുടങ്ങിയവ) ├── mcp-server/ # MCP സെർവർ (110 വ്യത്യസ്ത ടൂളുകൾ, 3 ട്രാൻസ്പോർട്ടുകൾ, 33 സ്കോപ്പുകൾ) ├── services/ # 178 ടോപ്പ്-ലെവൽ സേവനങ്ങൾ (combo, autoCombo, rateLimitManager തുടങ്ങിയവ) ├── translator/ # ഫോർമാറ്റ് ട്രാൻസ്ലേറ്ററുകൾ (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama) ├── transformer/ # Responses API ട്രാൻസ്ഫോർമർ └── utils/ # 22 യൂട്ടിലിറ്റി മൊഡ്യൂളുകൾ (സ്ട്രീം, TLS, പ്രോക്സി, ലോഗിങ്) electron/ # Electron ഡെസ്ക്ടോപ്പ് ആപ്പ് (ക്രോസ്-പ്ലാറ്റ്ഫോം) tests/ ├── unit/ # Node.js ടെസ്റ്റ് റണ്ണർ (1,574 ടെസ്റ്റ് ഫയലുകൾ) ├── integration/ # ഇന്റഗ്രേഷൻ ടെസ്റ്റുകൾ ├── e2e/ # Playwright ടെസ്റ്റുകൾ ├── security/ # സുരക്ഷാ ടെസ്റ്റുകൾ ├── translator/ # ട്രാൻസ്ലേറ്ററിനായുള്ള പ്രത്യേക ടെസ്റ്റുകൾ └── load/ # ലോഡ് ടെസ്റ്റുകൾ docs/ ├── adr/ # ആർക്കിടെക്ചർ തീരുമാന രേഖകൾ ├── architecture/ # സിസ്റ്റം ആർക്കിടെക്ചറും പ്രതിരോധശേഷിയും ├── comparison/ # OmniRoute-ഉം ബദലുകളും തമ്മിലുള്ള താരതമ്യം ├── compression/ # കംപ്രഷൻ ഗൈഡുകളും നിയമങ്ങളും ├── dev/ # ഡെവലപ്മെന്റ് ഗൈഡുകൾ ├── diagrams/ # ആർക്കിടെക്ചർ ഡയഗ്രാമുകൾ ├── frameworks/ # MCP, A2A, OpenCode, Memory, Skills ├── guides/ # ഉപയോക്തൃ ഗൈഡ്, Docker, സജ്ജീകരണം, ട്രബിൾഷൂട്ടിങ് ├── i18n/ # അന്തർദേശീയവൽക്കരിച്ച README പരിഭാഷകൾ ├── marketing/ # മാർക്കറ്റിങ് സാമഗ്രികൾ ├── ops/ # വിന്യാസം, പ്രോക്സി, കവറേജ്, റിലീസുകൾ ├── providers/ # പ്രൊവൈഡർ-നിർദ്ദിഷ്ട ഡോക്യുമെന്റേഷൻ ├── reference/ # API റഫറൻസ്, എൻവയോൺമെന്റ് വേരിയബിളുകൾ, CLI ടൂളുകൾ, സൗജന്യ ടയറുകൾ ├── releases/ # റിലീസ് കുറിപ്പുകൾ ├── routing/ # ഓട്ടോ-കോംബോ എൻജിൻ, റീസണിങ് റീപ്ലേ ├── screenshots/ # ഡാഷ്ബോർഡ് സ്ക്രീൻഷോട്ടുകൾ ├── security/ # ഗാർഡ്റെയിലുകൾ, കംപ്ലയൻസ്, സ്റ്റെൽത്ത്, ടോക്കണുകൾ └── specs/ # ഡിസൈൻ സ്പെസിഫിക്കേഷനുകൾ ``` --- ## പുതിയ Provider ചേർക്കൽ ### ഘട്ടം 1: Provider കോൺസ്റ്റന്റുകൾ രജിസ്റ്റർ ചെയ്യുക മൊഡ്യൂൾ ലോഡ് ചെയ്യുമ്പോൾ Zod ഉപയോഗിച്ച് സാധൂകരിക്കപ്പെടുന്ന `src/shared/constants/providers.ts`-ലേക്ക് ചേർക്കുക. ### ഘട്ടം 2: Executor ചേർക്കുക (ഇഷ്ടാനുസൃത ലോജിക് ആവശ്യമെങ്കിൽ) അടിസ്ഥാന executor വിപുലീകരിച്ചുകൊണ്ട് `open-sse/executors/your-provider.ts`-ൽ executor സൃഷ്ടിക്കുക. ### ഘട്ടം 3: Translator ചേർക്കുക (OpenAI ഇതര ഫോർമാറ്റാണെങ്കിൽ) `open-sse/translator/`-ൽ request/response translator-കൾ സൃഷ്ടിക്കുക. ### ഘട്ടം 4: OAuth കോൺഫിഗറേഷൻ ചേർക്കുക (OAuth അടിസ്ഥാനമാക്കിയുള്ളതാണെങ്കിൽ) OAuth ക്രെഡൻഷ്യലുകൾ `src/lib/oauth/constants/oauth.ts`-ലും സേവനം `src/lib/oauth/services/`-ലും ചേർക്കുക. അപ്സ്ട്രീം provider അതിന്റെ പൊതു CLI / ബ്രൗസർ ബണ്ടിലിനുള്ളിൽ ഒരു പൊതു OAuth client_id/secret അല്ലെങ്കിൽ Firebase Web API കീ വിതരണം ചെയ്യുന്നുവെങ്കിൽ, അത് ഒരു string literal ആയി ഉൾച്ചേർക്കരുത്. `open-sse/utils/publicCreds.ts`-ൽ നിന്നുള്ള `resolvePublicCred()` ഉപയോഗിക്കുകയും `EMBEDDED_DEFAULTS`-ലേക്ക് masked byte എൻട്രി ചേർക്കുകയും ചെയ്യുക. നിർബന്ധമായ പൂർണ്ണ workflow [`docs/security/PUBLIC_CREDS.md`](./docs/security/PUBLIC_CREDS.md)-ൽ രേഖപ്പെടുത്തിയിട്ടുണ്ട്. Handler/executor-കൾക്കുള്ളിൽ, ക്ലയന്റിലെത്തുന്ന പിശക് സന്ദേശങ്ങൾ `open-sse/utils/error.ts`-ൽ നിന്നുള്ള `buildErrorBody()` / `sanitizeErrorMessage()` വഴി കടന്നുപോകണം — അസംസ്കൃത `err.stack` അല്ലെങ്കിൽ `err.message` ഒരിക്കലും Response body-യിൽ ഉൾപ്പെടുത്തരുത്. [`docs/security/ERROR_SANITIZATION.md`](./docs/security/ERROR_SANITIZATION.md) കാണുക. ### ഘട്ടം 5: മോഡലുകൾ രജിസ്റ്റർ ചെയ്യുക `open-sse/config/providerRegistry.ts`-ൽ മോഡൽ നിർവചനങ്ങൾ ചേർക്കുക. ### ഘട്ടം 6: ടെസ്റ്റുകൾ ചേർക്കുക കുറഞ്ഞത് ഇനിപ്പറയുന്നവ ഉൾക്കൊള്ളുന്ന unit test-കൾ `tests/unit/`-ൽ എഴുതുക: - Provider രജിസ്ട്രേഷൻ - Request/response പരിവർത്തനം - പിശക് കൈകാര്യം ചെയ്യൽ --- ## പുൾ റിക്വസ്റ്റ് ചെക്ക്ലിസ്റ്റ് - [ ] ടെസ്റ്റുകൾ വിജയിക്കുന്നു (`npm test`) - [ ] ലിന്റിംഗ് വിജയിക്കുന്നു (`npm run lint`) - [ ] ബിൽഡ് വിജയിക്കുന്നു (`npm run build`) - [ ] പുതിയ പൊതു ഫങ്ഷനുകൾക്കും ഇന്റർഫേസുകൾക്കും TypeScript ടൈപ്പുകൾ ചേർത്തിട്ടുണ്ട് - [ ] ഹാർഡ്കോഡ് ചെയ്ത രഹസ്യങ്ങളോ ഫാൾബാക്ക് മൂല്യങ്ങളോ ഇല്ല - [ ] പൊതു അപ്സ്ട്രീം ക്രെഡൻഷ്യലുകൾ ലിറ്ററലുകളായി ഒരിക്കലും ഉൾപ്പെടുത്താതെ `resolvePublicCred()` വഴി ഉൾപ്പെടുത്തിയിട്ടുണ്ട് ([`docs/security/PUBLIC_CREDS.md`](./docs/security/PUBLIC_CREDS.md) കാണുക) - [ ] പിശക് പ്രതികരണങ്ങൾ `buildErrorBody()` / `sanitizeErrorMessage()` വഴി റൂട്ട് ചെയ്യുന്നു — പ്രതികരണ ബോഡികളിൽ അസംസ്കൃത സ്റ്റാക്ക് ട്രെയ്സുകൾ ഇല്ല ([`docs/security/ERROR_SANITIZATION.md`](./docs/security/ERROR_SANITIZATION.md) കാണുക) - [ ] ഷെൽ കമാൻഡുകൾ (`exec` / `spawn`) റൺടൈം മൂല്യങ്ങൾ സ്ട്രിങ് ഇന്റർപൊളേഷൻ വഴിയല്ല, `env` വഴി കൈമാറുന്നു - [ ] എല്ലാ ഇൻപുട്ടുകളും Zod സ്കീമകൾ ഉപയോഗിച്ച് സാധൂകരിച്ചിട്ടുണ്ട് - [ ] ഉപയോക്താവിന് ദൃശ്യമാകുന്ന മാറ്റങ്ങൾക്കായി `changelog.d/{features|fixes|maintenance}/-.md` എന്നതിനു കീഴിൽ ചേഞ്ച്ലോഗ് **ഫ്രാഗ്മെന്റ്** ചേർത്തിട്ടുണ്ട് ([`changelog.d/README.md`](./changelog.d/README.md) കാണുക) — `CHANGELOG.md` നേരിട്ട് എഡിറ്റ് ചെയ്യരുത്; റിലീസ് സമയത്ത് ഫ്രാഗ്മെന്റുകൾ സമാഹരിക്കപ്പെടുന്നതിനാൽ PR-കൾ തമ്മിൽ ഒരിക്കലും വൈരുദ്ധ്യമുണ്ടാകില്ല - [ ] ഡോക്യുമെന്റേഷൻ അപ്ഡേറ്റ് ചെയ്തിട്ടുണ്ട് (ബാധകമെങ്കിൽ) - [ ] പുതിയ CodeQL / Secret-Scanning അലേർട്ടുകളൊന്നും സൃഷ്ടിച്ചിട്ടില്ല, അല്ലെങ്കിൽ പ്രസക്തമായ `docs/security/` ഡോക്യുമെന്റ് പരാമർശിക്കുന്ന സാങ്കേതിക ന്യായീകരണത്തോടെ ഓരോന്നും നിരസിച്ചിട്ടുണ്ട് - [ ] ചൈൽഡ് പ്രോസസ്സുകൾ സൃഷ്ടിക്കുന്ന റൂട്ടുകൾ (`/api/mcp/`, `/api/cli-tools/runtime/`) `src/server/authz/routeGuard.ts`-ൽ `isLocalOnlyPath()` ആയി വർഗ്ഗീകരിച്ചിട്ടുണ്ട് — [കർശന നിയമം #15](docs/security/ROUTE_GUARD_TIERS.md) കാണുക - [ ] കമ്മിറ്റ് സന്ദേശങ്ങളിൽ AI/ബോട്ട് `Co-authored-by` ട്രെയിലറുകളില്ല (കർശന നിയമം #16) — വീണ്ടും ഉപയോഗിച്ചിട്ടുള്ള പ്രവൃത്തിയുടെ ഉടമകളായ മനുഷ്യ സഹപ്രവർത്തകർക്ക് സാധാരണ `Co-authored-by: Name ` ട്രെയിലറുകൾ ഉപയോഗിച്ച് അംഗീകാരം നൽകിയിട്ടുണ്ട് --- ## റിലീസ് ചെയ്യൽ റിലീസുകൾ `/generate-release` വർക്ക്ഫ്ലോയിലൂടെ നിയന്ത്രിക്കുന്നു. ഒരു പുതിയ GitHub Release സൃഷ്ടിക്കുമ്പോൾ, GitHub Actions വഴി പാക്കേജ് **യാന്ത്രികമായി npm-ലേക്ക് പ്രസിദ്ധീകരിക്കപ്പെടുന്നു**. VPS വിന്യാസങ്ങൾക്കായി, `npm run build` എന്നതിനുപകരം `npm run build:release` ഉപയോഗിക്കുക — ഇത് പൂർണ്ണമായി വൃത്തിയാക്കിയുള്ള ഒരു പുനർനിർമ്മാണം നടത്തുകയും, ബണ്ടിൽ `dist/`-ൽ ക്രമീകരിക്കുകയും, `dist/BUILD_SHA` സെന്റിനൽ എഴുതുകയും ചെയ്യുന്നു. തുടർന്ന് `dist/` വിദൂര `app/` ഡയറക്ടറിയിലേക്ക് rsync ചെയ്യുന്ന `/deploy-vps-*-cc` സ്കില്ലുകൾ ഉപയോഗിക്കുക. --- ## സഹായം നേടൽ - **ആർക്കിടെക്ചർ**: [`docs/architecture/ARCHITECTURE.md`](docs/architecture/ARCHITECTURE.md) കാണുക - **API റഫറൻസ്**: [`docs/reference/API_REFERENCE.md`](docs/reference/API_REFERENCE.md) കാണുക - **സുരക്ഷാ ഡോക്യുമെന്റേഷൻ**: [`docs/security/CLI_TOKEN.md`](docs/security/CLI_TOKEN.md), [`docs/security/ROUTE_GUARD_TIERS.md`](docs/security/ROUTE_GUARD_TIERS.md), [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md), [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) - **ഓപ്പറേഷൻസ് ഡോക്യുമെന്റേഷൻ**: [`docs/ops/SQLITE_RUNTIME.md`](docs/ops/SQLITE_RUNTIME.md) - **പ്രശ്നങ്ങൾ**: [github.com/diegosouzapw/OmniRoute/issues](https://github.com/diegosouzapw/OmniRoute/issues)