Files
OmniRoute/docs/i18n/ka/CONTRIBUTING.md
Diego Rodrigues de Sa e Souza 58f88a83e4 feat(i18n): 7 new locales — Hausa, Yoruba, Igbo, Amharic, Uzbek, Georgian, Armenian (66 locales) (#13727)
Batch 3 (last) of the locale-expansion plan: ha, yo, ig, am, uz, ka, hy on every surface — dashboard catalog, docs mirror (22-file core + llm.txt + CHANGELOG), CLI catalog, README flag block, locale tables and 🌐 language bars. Also closes the key gap the batch-1 (43 keys) and batch-2 (10 keys) catalogs carried since their base merges, fixes the Igbo "Model" copy and allowlists the Uzbek cognate. Translation-ratio baseline covers 65 locales.

⚠ base-red inherited: #12732
2026-09-15 09:50:01 -03:00

46 KiB

Contributing to OmniRoute (áƒ„áƒáƒ áƒ—áƒŁáƒšáƒ˜)

🌐 Languages: đŸ‡ș🇾 English · đŸ‡ȘđŸ‡č am · 🇾🇩 ar · 🇩🇿 az · 🇧🇬 bg · đŸ‡§đŸ‡© bn · 🇹🇿 cs · đŸ‡©đŸ‡° da · đŸ‡©đŸ‡Ș de · đŸ‡ŹđŸ‡· el · đŸ‡Ș🇾 es · đŸ‡ȘđŸ‡Ș et · đŸ‡źđŸ‡· fa · đŸ‡«đŸ‡ź fi · đŸ‡«đŸ‡· fr · 🇼đŸ‡Ș ga · 🇼🇳 gu · 🇳🇬 ha · đŸ‡źđŸ‡± he · 🇼🇳 hi · đŸ‡­đŸ‡· hr · 🇭đŸ‡ș hu · 🇩đŸ‡Č hy · đŸ‡źđŸ‡© id · 🇳🇬 ig · 🇼đŸ‡č it · đŸ‡ŻđŸ‡” ja · 🇰🇭 km · 🇼🇳 kn · đŸ‡°đŸ‡· ko · đŸ‡±đŸ‡č lt · đŸ‡±đŸ‡» lv · 🇼🇳 ml · 🇼🇳 mr · đŸ‡ČđŸ‡Ÿ ms · đŸ‡ČđŸ‡č mt · đŸ‡ČđŸ‡Č my · đŸ‡łđŸ‡” ne · đŸ‡łđŸ‡± nl · 🇳🇮 no · 🇼🇳 or · 🇼🇳 pa · đŸ‡”đŸ‡­ phi · đŸ‡”đŸ‡± pl · đŸ‡”đŸ‡č pt · đŸ‡§đŸ‡· pt-BR · đŸ‡·đŸ‡Ž ro · đŸ‡·đŸ‡ș ru · đŸ‡±đŸ‡° si · 🇾🇰 sk · 🇾🇼 sl · đŸ‡·đŸ‡ž sr · 🇾đŸ‡Ș sv · 🇰đŸ‡Ș sw · 🇼🇳 ta · 🇼🇳 te · đŸ‡č🇭 th · đŸ‡čđŸ‡· tr · đŸ‡ș🇩 uk-UA · đŸ‡”đŸ‡° ur · đŸ‡ș🇿 uz · đŸ‡»đŸ‡ł vi · 🇳🇬 yo · 🇹🇳 zh-CN · đŸ‡čđŸ‡Œ zh-TW


გმადლობთ კონჱრიბუáƒȘიით დაინჱერესებისთვის! ეს áƒĄáƒáƒźáƒ”áƒšáƒ›áƒ«áƒŠáƒ•áƒáƒœáƒ”áƒšáƒ მოიáƒȘავს áƒ§áƒ•áƒ”áƒšáƒáƒ€áƒ”áƒ áƒĄ, რაáƒȘ დასაწყებად გჭირდებათ.

თითოეული áƒȘვლილებისთვის განსაზჩვრული ოჀიáƒȘიალური სამუჹაო პროáƒȘესის გასაáƒȘნობად დაიწყეთ კონჱრიბუáƒȘიიქ ძირითადი გზით. იქ პროვაიდერის, მარჹრუჱიზაáƒȘიიქ, UI/UX-იქ, i18n-იქ, CLI-იქ, მონაáƒȘემთა ბაზისა და აგების/განთავსების áƒȘვლილებებს აკავჹირებს მათ áƒ™áƒáƒœáƒąáƒ áƒáƒ„áƒąáƒ”áƒ‘áƒ—áƒáƒœ, მიზნობრივ ჱესჱებთან, CI-იქ áƒ“áƒáƒ€áƒáƒ áƒ•áƒáƒĄáƒ და ჹეჯერების ეჱაპებთან.


დეველოპმენჱის გარემოს გამართვა

წინაპირობები

  • Node.js >=22.22.3 <23, ან >=24.0.0 <27 (რეკომენდებულია: 24 LTS)
  • npm 10+

npm v11+-იქ მომჼმარებლები (Node 24+): npm install-იქ ჹემდეგ გადაამოწმეთ, რომ ნაჱიური მოდულები დაინსჱალირდა: node -e "require('better-sqlite3')". თუ იქ MODULE_NOT_FOUND ჹეáƒȘდომით დასრულდება, გაუჹვით npm approve-scripts better-sqlite3 && npm install. იჼილეთ პრობლემების მოგვარება.

  • Git

კლონირება და ინსჱალაáƒȘია

git clone https://github.com/diegosouzapw/OmniRoute.git
cd OmniRoute
npm install

გარემოს áƒȘვლადები

# ლეჄმენით თჄვენი .env ჹაბლონიდან
cp .env.example .env

# დააგენერირეთ საჭირო საიდუმლო მნიჹვნელობები
echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env
echo "API_KEY_SECRET=$(openssl rand -hex 32)" >> .env

დეველოპმენჱისთვის მნიჹვნელოვანი áƒȘვლადები:

áƒȘვლადი დეველოპმენჱის ნაგულისჼმევი მნიჹვნელობა აჩწერა
PORT 20128 სერვერის პორჱი
NEXT_PUBLIC_BASE_URL http://localhost:20128 áƒ€áƒ áƒáƒœáƒąáƒ”áƒœáƒ“áƒ˜áƒĄ საბაზისო URL
JWT_SECRET (დააგენერირეთ ზემოთ) JWT-ის ჼელმოწერის საიდუმლო
INITIAL_PASSWORD CHANGEME პირველი ჹესვლის პაროლი
APP_LOG_LEVEL info ჟურნალის დეჱალიზაáƒȘიიქ დონე

მართვის პანელის პარამეჱრები

მართვის პანელი გთავაზობთ UI გადამრთველებს იმ áƒ€áƒŁáƒœáƒ„áƒȘიებისთვის, რომელთა áƒ™áƒáƒœáƒ€áƒ˜áƒ’áƒŁáƒ áƒáƒȘიაáƒȘ გარემოს áƒȘვლადებით არიქ áƒšáƒ”áƒĄáƒáƒ«áƒšáƒ”áƒ‘áƒ”áƒšáƒ˜:

პარამეჱრის მდებარეობა გადამრთველი აჩწერა
პარამეჱრები → áƒ’áƒáƒ€áƒáƒ áƒ—áƒáƒ”áƒ‘áƒŁáƒšáƒ˜ გამართვის რეჟიმი გამართვის მოთჼოვნების ჟურნალების ჩართვა (UI)
პარამეჱრები → ზოგადი გვერდითი ზოლის ჼილვადობა გვერდითი ზოლის áƒĄáƒ”áƒ„áƒȘიების ჩვენება/დამალვა

ეს პარამეჱრები მონაáƒȘემთა ბაზაჹი ინაჼება და ჼელაჼლა გაჹვების ჹემდეგაáƒȘ áƒœáƒáƒ áƒ©áƒŁáƒœáƒ“áƒ”áƒ‘áƒ; დაყენებისას ისინი გარემოს áƒȘვლადების ნაგულისჼმევ მნიჹვნელობებს ანაáƒȘვლებს.

ლოკალურად გაჹვება

# დეველოპმენჱის რეჟიმი (áƒȘჼელი გადაჱვირთვა)
npm run dev

# საწარმოო აგება
npm run build    # next build → .build/next/, ჹემდეგ assembleStandalone → dist/
npm run start

# ქ჏რაჀი, მჼოლოდ ბეკენდის/API-იქ კომპილაáƒȘია კონჱრიბუჱორის áƒȘვლილებებისთვის
npm run build:contributor

# რელიზის აგება (áƒĄáƒŁáƒ€áƒ—áƒ ჼელაჼალი აგება + HEAD sentinel — აუáƒȘილებელია განთავსებისთვის)
npm run build:release   # rm -rf .build dist && აგება + წერს dist/BUILD_SHA-ს

# პორჱის გავრáƒȘელებული áƒ™áƒáƒœáƒ€áƒ˜áƒ’áƒŁáƒ áƒáƒȘია
PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev

კონჱრიბუჱორის აგება მჼოლოდ კომპილაáƒȘიიქ ვალიდაáƒȘიაქ ასრულებს: იქ არ აწყობს დამოუკიდებელ დისჱრიბუáƒȘიაქ და არ აგებს არჩევით ნაჱიურ áƒ“áƒáƒ€áƒáƒĄáƒáƒ”áƒ‘áƒ˜áƒ— რესურსებს. გამოიყენეთ áƒ©áƒ•áƒ”áƒŁáƒšáƒ”áƒ‘áƒ áƒ˜áƒ•áƒ˜ საწარმოო აგება, როდესაáƒȘ გასავრáƒȘელებლად მზა პაკეჱის ვალიდაáƒȘია გჭირდებათ.

აგების ჹედეგების განლაგება

áƒ“áƒ˜áƒ áƒ”áƒ„áƒąáƒáƒ áƒ˜áƒ ჹიგთავსი კონჱროლდება
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 + ნაჱიურ რესურსებს)
       └─ ჹედეგი: dist/                   (server.js, .next/static/, public/, node_modules/)

npm run build:release დამაჱებით ჯერ ორივე áƒ“áƒ˜áƒ áƒ”áƒ„áƒąáƒáƒ áƒ˜áƒáƒĄ áƒáƒĄáƒŁáƒ€áƒ—áƒáƒ•áƒ”áƒ‘áƒĄ და განთავსების მთლიანობის sentinel-იქ საჼით წერს dist/BUILD_SHA-ქ (= git rev-parse --short HEAD).

npm run build:contributor მჼოლოდ ბეკენდის აგების áƒžáƒ áƒáƒ€áƒ˜áƒšáƒĄ იყენებს. აგებისას იქ დროებით ანაáƒȘვლებს მართვის პანელის UI áƒ€áƒáƒ˜áƒšáƒ”áƒ‘áƒĄ დროებითი ჩანაáƒȘვლებებით, áƒ˜áƒœáƒáƒ áƒ©áƒŁáƒœáƒ”áƒ‘áƒĄ API მარჹრუჱების დამმუჹავებლებს და აგების ჹემდეგ აჩადგენს თავდაპირველ áƒ€áƒáƒ˜áƒšáƒ”áƒ‘áƒĄ. გამოიყენეთ npm run build იმ áƒȘვლილებებისთვის, რომლებიáƒȘ გავლენას აჼდენს მართვის პანელის UI-ზე, ან რელიზის სრული ვალიდაáƒȘიისთვის; კონჱრიბუჱორის პროჀილი რელიზის აგებას არ ანაáƒȘვლებს.

VPS-ზე განთავსების ჹენიჹვნა: დისჱანáƒȘიური იმიჯის áƒ“áƒ˜áƒ áƒ”áƒ„áƒąáƒáƒ áƒ˜áƒ /usr/lib/node_modules/omniroute/app/ უáƒȘვლელია. განთავსების უნარები dist/-იქ ჹიგთავსს მასჹი rsync-ით áƒáƒĄáƒ˜áƒœáƒ„áƒ áƒáƒœáƒ”áƒ‘áƒĄ. ჹეიáƒȘვალა მჼოლოდ რეპოზიჱორიაჹი არსებული აგების ჹედეგის გზა (app/ → dist/).

ნაგულისჼმევი URL-ები:

  • მართვის პანელი: http://localhost:20128/dashboard
  • API: http://localhost:20128/v1

Git-იქ სამუჹაო პროáƒȘესი

⚠ არასოდეს ჹეიჱანოთ commit პირდაპირ main-ლი. ყოველთვის გამოიყენეთ áƒ€áƒŁáƒœáƒ„áƒȘიური განჹჱოებები.

PR-იქ საბაზისო განჹჱოება: სამიზნედ მიუთითეთ აჄჹიური release/vX.Y.Z განჹჱოება (და არა main). თითო გამოჹვებაზე áƒȘალკე განჹჱოებისა და გამოჹვებისას ჱეგის áƒšáƒ”áƒ„áƒ›áƒœáƒ˜áƒĄ მოდელის ჹესაჼებ იჼილეთ docs/ops/BRANCHING_MODEL.md.

# ლეჄმენით განჹჱოება აჄჹიური გამოჹვების ბოლო წერჱილიდან (მაგალითად: release/v3.8.49)
git fetch origin
git checkout -b feat/your-feature-name origin/release/v3.8.49
# ... ჹეიჱანეთ áƒȘვლილებები ...
git commit -m "feat: აჩწერეთ თჄვენი áƒȘვლილება"
git push -u origin feat/your-feature-name
# გაჼსენით Pull Request, სადაáƒȘ base = release/v3.8.49

განჹჱოებების დასაჼელება

áƒžáƒ áƒ”áƒ€áƒ˜áƒ„áƒĄáƒ˜ დანიჹნულება
feat/ აჼალი áƒ€áƒŁáƒœáƒ„áƒȘიები
fix/ ჹეáƒȘდომების გამოსწორება
refactor/ კოდის áƒ áƒ”áƒĄáƒąáƒ áƒŁáƒ„áƒąáƒŁáƒ áƒ˜áƒ–áƒáƒȘია
docs/ დოკუმენჱაáƒȘიიქ áƒȘვლილებები
test/ ჱესჱების დამაჱება/ჹესწორება
chore/ ინსჱრუმენჱები, CI, დამოკიდებულებები

Commit-ჹეჱყობინებები

დაიáƒȘავით Conventional Commits-იქ წესები:

feat: პროვაიდერის áƒ’áƒáƒ›áƒáƒ«áƒáƒźáƒ”áƒ‘áƒ”áƒ‘áƒ˜áƒĄáƒ—áƒ•áƒ˜áƒĄ circuit breaker-იქ დამაჱება
fix: JWT საიდუმლოს ვალიდაáƒȘიიქ განსაკუთრებული ჹემთჼვევის მოგვარება
docs: SECURITY.md-იქ განაჼლება PII-იქ დაáƒȘვით
test: დაკვირვებადობის მოდულური ჱესჱების დამაჱება
refactor(db): ქიჟლირიქ ჹეზჩუდვის áƒȘჼრილების გაერთიანება

არეები (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.


ჱესჱების გაჹვება

# ყველა ჱესჱი (unit + vitest + ecosystem + e2e)
npm run test:all

# ერთი საჱესჱო Ⴠაილი (Node.js-იქ áƒ©áƒáƒšáƒ”áƒœáƒ”áƒ‘áƒŁáƒšáƒ˜ ჱესჱების გამჹვები — ჱესჱების უმეჱესობა ამას იყენებს)
node --import tsx/esm --test tests/unit/your-file.test.ts

# მჼოლოდ თჄვენი áƒȘვლილებით დაზარალებული მოდულური ჱესჱები (იგივე TIA áƒĄáƒ”áƒšáƒ”áƒ„áƒąáƒáƒ áƒ˜, რაáƒȘ CI ბარიერჹი, #8084)
npm run test:scoped            # ბოლო commit-ლი (ან სამუჹაო ჼეჹი) ჹეჱანილი áƒȘვლილებები
npm run test:scoped:staged     # მჼოლოდ staged áƒȘვლილებები — კარგად ერწყმის pre-commit გაჹვებას
npm run test:scoped:full       # ჯერ ჼელაჼლა ააგეთ import-graph რუკა (áƒ€áƒáƒ˜áƒšáƒ”áƒ‘áƒ˜áƒĄ დამაჱების/გადაადგილების ჹემდეგ)
# Exit 1 + "run the full suite" ნიჹნავს, რომ ჹეიáƒȘვალა áƒȘენჱრალური Ⴠაილი (tsconfig, package.json, 
) ან
# რუკაზე არარსებული ქა჏ყიქი კოდი — áƒĄáƒ”áƒšáƒ”áƒ„áƒąáƒáƒ áƒ˜ áƒŁáƒĄáƒáƒ€áƒ áƒ—áƒźáƒáƒ“ ასრულებს მუჹაობას ჹეáƒȘდომით და არასოდეს გამოჱოვებს ჱესჱებს áƒšáƒ”áƒŁáƒ›áƒ©áƒœáƒ”áƒ•áƒšáƒáƒ“.

# Vitest (MCP სერვერი, autoCombo, cache)
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

# Lint + áƒ€áƒáƒ áƒ›áƒáƒąáƒ˜áƒ áƒ”áƒ‘áƒ˜áƒĄ ჹემოწმება
npm run lint
npm run check

# ბარიერით დაáƒȘული რეალურ upstream-ზე combo-ქ smoke-ჱესჱი (საჭიროებს VPS-ზე წვდომას + რეალური პროვაიდერის კრედიჱებს)
# მიმართავს რეალურ პროვაიდერებს — მáƒȘირე ჼარჯთანაა დაკავჹირებული. არასოდეს ეჹვება CI-ლი. ბარიერის გარეჹე უპრობლემოდ გამოიჱოვება.
# საჭიროა: ssh root@192.168.0.15 წვდომა (VPS-იდან იყენებს DB-ის მჼოლოდ წაკითჼვად snapshot-ს).
RUN_COMBO_LIVE=1 npm run test:combo:live

# მე-3 áƒ€áƒáƒ–áƒ˜áƒĄ VPS-იქ áƒȘოáƒȘჼალი smoke-ჱესჱი — áƒ©áƒ•áƒ”áƒŁáƒšáƒ”áƒ‘áƒ áƒ˜áƒ•áƒ˜ Node ESM სკრიპჱები, რომლებიáƒȘ პირდაპირ áƒȘოáƒȘჼალ .15 სერვერს მიმართავენ.
# საჭიროა: ssh root@192.168.0.15 წვდომა (combo-ები იჄმნება/იჹლება SSH sqlite-იქ მეჹვეობით).
# მიმართავს რეალურ პროვაიდერებს (მáƒȘირე ჟარჯი). áƒ„áƒ›áƒœáƒ˜áƒĄ/ჹლის მჼოლოდ __live_test__* combo-ებს. არასოდეს ეჹვება CI-ლი.
# .15-ზე REQUIRE_API_KEY=false, ამიჱომ API გასაჩები საჭირო არ არიქ, თუმáƒȘა დაყენების ჹემთჼვევაჹი ითვალისწინებს COMBO_LIVE_BASE_URL / COMBO_LIVE_API_KEY-ქ.
npm run test:combo:live:vps              # 7 HTTP ქáƒȘენარი (priority/round-robin/weighted/cost/fusion/auto + health)
npm run test:combo:live:vps:failover     # ამაჱებს პროვაიდერებს ჹორის რეალურ failover ქáƒȘენარს (სულ 8)

áƒ“áƒáƒ€áƒáƒ áƒ•áƒ˜áƒĄ ჹენიჹვნები:

  • npm run test:coverage ზომავს ქა჏ყიქი კოდის áƒ“áƒáƒ€áƒáƒ áƒ•áƒáƒĄ ძირითადი მოდულური ჱესჱების ნაკრებისთვის, გამორიáƒȘჼავს tests/**-ქ და მოიáƒȘავს open-sse/**-ქ
  • Pull Request-ებმა დებულებების/áƒĄáƒąáƒ áƒ˜áƒ„áƒáƒœáƒ”áƒ‘áƒ˜áƒĄ/áƒ€áƒŁáƒœáƒ„áƒȘიების/განჹჱოებების áƒ“áƒáƒ€áƒáƒ áƒ•áƒ˜áƒĄ ბარიერი 60%+-ზე უნდა áƒšáƒ”áƒ˜áƒœáƒáƒ áƒ©áƒŁáƒœáƒáƒœ
  • თუ PR áƒȘვლის საწარმოო კოდს src/, open-sse/, electron/ ან bin/-ლი, იმავე PR-ლი უნდა დაემაჱოს ან განაჼლდეს ავჱომაჱიზებული ჱესჱები
  • npm run coverage:report ბეჭდავს ბოლო áƒ“áƒáƒ€áƒáƒ áƒ•áƒ˜áƒĄ გაჹვების დეჱალურ, áƒ€áƒáƒ˜áƒšáƒ”áƒ‘áƒ˜áƒĄ მიჼედვით დაყოჀილ ანგარიჹს
  • npm run test:coverage:legacy ისჱორიული ჹედარებისთვის áƒ˜áƒœáƒáƒ áƒ©áƒŁáƒœáƒ”áƒ‘áƒĄ ძველ მეჱრიკას
  • áƒ“áƒáƒ€áƒáƒ áƒ•áƒ˜áƒĄ ეჱაპობრივი გაუმჯობესების áƒĄáƒáƒ›áƒáƒ„áƒ›áƒ”áƒ“áƒ გეგმისთვის იჼილეთ docs/ops/COVERAGE_PLAN.md

Pull Request-ის მოთჼოვნები

PR-იქ გაჼსნამდე გამოიყენეთ Contribution Golden Path, რათა თჄვენი áƒȘვლილებისთვის მიზნობრივი áƒȘიკლი გაუჹვათ. მოდულური ჱესჱების სრული ნაკრები (CI-იქ 4 shard), Vitest, 60%+ áƒ“áƒáƒ€áƒáƒ áƒ•áƒ˜áƒĄ ბარიერი და საწარმოო build CI-იქ პასუჼისმგებლობაა — მათი ლოკალურად გაჹვება არ იძლევა დამაჱებით ინჀორმაáƒȘიაქ, რომელსაáƒȘ PR-იქ ჹემოწმებები უკვე არ მოგაწვდით, ჼოლო ჹედარებით ქუქჹ კომპიუჱერებზე ლეიძლება სისჱემა სრულად დაჱვირთოს (#8084):

  • გაუჹვით საჱესჱო Ⴠაილები, რომლებიáƒȘ áƒ—áƒ„áƒ•áƒ”áƒœáƒĄ áƒȘვლილებას áƒ€áƒáƒ áƒáƒ•áƒĄ: node --import tsx/esm --test tests/unit/<file>.test.ts
  • გაუჹვით npm run lint
  • საწარმოო კოდის áƒȘვლილებისას იმავე PR-ლი დაამაჱეთ ან განააჼლეთ ავჱომაჱიზებული ჱესჱები
  • საწარმოო კოდის áƒȘვლილებისას PR-იქ აჩწერაჹი მიუთითეთ ჹეáƒȘვლილი ან დამაჱებული საჱესჱო Ⴠაილები
  • თუ áƒžáƒ áƒáƒ”áƒ„áƒąáƒ˜áƒĄ საიდუმლოები CI-ლი áƒ™áƒáƒœáƒ€áƒ˜áƒ’áƒŁáƒ áƒ˜áƒ áƒ”áƒ‘áƒŁáƒšáƒ˜áƒ, ჹეამოწმეთ PR-იქ SonarQube ჹედეგი

ჱესჱების მიმდინარე ქჹაჹუქი: 122 მოდულური საჱესჱო Ⴠაილი, რომლებიáƒȘ áƒ€áƒáƒ áƒáƒ•áƒĄ:

  • პროვაიდერის ჱრანსლაჱორებსა და áƒ€áƒáƒ áƒ›áƒáƒąáƒ˜áƒĄ áƒ’áƒáƒ áƒ“áƒáƒ„áƒ›áƒœáƒáƒĄ
  • ქიჟლირიქ ჹეზჩუდვას, circuit breaker-ქა და მდგრადობას
  • სემანჱიკურ cache-ქ, idempotency-ქა და პროგრესის თვალყურის დევნებას
  • მონაáƒȘემთა ბაზის ოპერაáƒȘიებსა და áƒĄáƒ„áƒ”áƒ›áƒáƒĄ (21 DB მოდული)
  • OAuth ნაკადებსა და áƒáƒ•áƒ—áƒ”áƒœáƒąáƒ˜áƒ€áƒ˜áƒ™áƒáƒȘიაქ
  • API endpoint-ების ვალიდაáƒȘიაქ (Zod v4)
  • MCP სერვერის ინსჱრუმენჱებსა და არეების აჩსრულებას
  • Memory და Skills სისჱემებს

კოდის სჱილი

  • ESLint — კომიჱამდე გაუჹვით npm run lint
  • Prettier — კომიჱისას ავჱომაჱურად áƒ€áƒáƒ áƒ›áƒáƒąáƒ˜áƒ áƒ“áƒ”áƒ‘áƒ lint-staged-იქ მეჹვეობით (2 სივრáƒȘე, წერჱილ-მძიმეები, ორმაგი ბრჭყალები, 100-სიმბოლოიანი სიგანე, es5-იქ სჱილის ბოლო მძიმეები)
  • 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-იქ áƒĄáƒ„áƒ”áƒ›áƒ”áƒ‘áƒ˜
  • დასაჼელება: Ⴠაილები = camelCase/kebab-case, კომპონენჱები = PascalCase, კონსჱანჱები = UPPER_SNAKE

ჹეáƒȘდომების დამუჹავება / áƒȘარიელი catch ბლოკები

არასოდეს დაჱოვოთ catch განმარჱების გარეჹე. მიაკუთვნეთ იქ ორი კაჱეგორიიდან ერთ-ერთს (ეს áƒžáƒ áƒáƒ„áƒąáƒ˜áƒ™áƒáƒšáƒ˜ აჼორáƒȘიელებს მკაáƒȘრ წესს — „არასოდეს ჩაყლაპოთ ჹეáƒȘდომები უჼმოდ SSE ნაკადებჹი“):

  • განზრაჼული (ჩვენივე áƒ›áƒáƒ„áƒĄáƒ˜áƒ›áƒáƒšáƒŁáƒ áƒ˜ áƒ«áƒáƒšáƒ˜áƒĄáƒźáƒ›áƒ”áƒ•áƒ˜áƒ— ჹესრულებული áƒ’áƒáƒĄáƒŁáƒ€áƒ—áƒáƒ•áƒ”áƒ‘áƒ/ჱელემეჱრია) — აჄ ჹეáƒȘდომა მოსალოდნელი და უვნებელია; დაამაჱეთ მიზეზის განმარჱების áƒ”áƒ áƒ—áƒĄáƒąáƒ áƒ˜áƒ„áƒáƒœáƒ˜áƒáƒœáƒ˜ კომენჱარი, ლოგირების გარეჹე (ეს ჹეთანჼმება თავიდან გვაáƒȘილებს ყოველ მოთჼოვნაზე ლოგირებით áƒŹáƒáƒ áƒ›áƒáƒ„áƒ›áƒœáƒ˜áƒš ჼმაურს).

    } catch {} // კლიენჱის გათიჹვის ჹემდეგ უკვე დაჼურული კონჱროლერის დაჼურვა მოსალოდნელია
    
  • უნდა დალოგირდეს (გარე/áƒ’áƒáƒ›áƒáƒ›áƒ«áƒáƒźáƒ”áƒ‘áƒšáƒ˜áƒĄ მიერ მოწოდებული კოდი, ან ჩაყლაპვა áƒȘვლის მართვის ნაკადს) — áƒšáƒ”áƒ˜áƒœáƒáƒ áƒ©áƒŁáƒœáƒ”áƒ— catch (არასოდეს მისáƒȘეთ მას ნაკადის დარჩვევის áƒŁáƒ€áƒšáƒ”áƒ‘áƒ), მაგრამ გამოიჱანეთ áƒ™áƒáƒœáƒąáƒ”áƒ„áƒĄáƒąáƒŁáƒ áƒ˜ console.debug/warn, რათა ჹეáƒȘდომის ა჊მოჩენა áƒšáƒ”áƒĄáƒáƒ«áƒšáƒ”áƒ‘áƒ”áƒšáƒ˜ იყოს.

    } catch (e) {
      console.debug("[STREAM] onFailure áƒŁáƒ™áƒŁáƒ’áƒáƒ›áƒáƒ«áƒáƒźáƒ”áƒ‘áƒ˜áƒĄ ჹეáƒȘდომა:", 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-იქ Ⴠარგლები, მარჹრუჱიზაáƒȘიიქ 19 სჱრაჱეგია
│   ├── utils/              # ავჱომაჱური ამომრთველი, სანიჱაიზერი, áƒáƒ•áƒ—áƒ”áƒœáƒąáƒ˜áƒ€áƒ˜áƒ™áƒáƒȘიიქ დამჼმარე საჹუალებები
│   └── validation/         # Zod v4 áƒĄáƒ„áƒ”áƒ›áƒ”áƒ‘áƒ˜
└── sse/                    # SSE áƒžáƒ áƒáƒ„áƒĄáƒ˜áƒ áƒ”áƒ‘áƒ˜áƒĄ კონვეიერი

open-sse/                   # @omniroute/open-sse სამუჹაო სივრáƒȘე
├── executors/              # ჹემსრულებლის იმპლემენჱაáƒȘიიქ 89 მოდული
├── 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, მეჼსიერება, უნარები
├── guides/                  # მომჼმარებლის áƒĄáƒáƒźáƒ”áƒšáƒ›áƒ«áƒŠáƒ•áƒáƒœáƒ”áƒšáƒ, Docker, გამართვა, პრობლემების მოგვარება
├── i18n/                    # README-იქ ინჱერნაáƒȘიონალიზებული თარგმანები
├── marketing/               # მარკეჱინგული მასალები
├── ops/                     # განთავსება, áƒžáƒ áƒáƒ„áƒĄáƒ˜, დაჀარვა, გამოჹვებები
├── providers/               # მომწოდებლებისთვის სპეáƒȘáƒ˜áƒ€áƒ˜áƒ™áƒŁáƒ áƒ˜ დოკუმენჱაáƒȘია
├── reference/               # API áƒȘნობარი, გარემოს áƒȘვლადები, CLI ჼელსაწყოები, áƒŁáƒ€áƒáƒĄáƒ დონეები
├── releases/                # გამოჹვების ჹენიჹვნები
├── routing/                 # ავჱომაჱური კომბინაáƒȘიების ძრავა, მსჯელობის განმეორებითი ჹესრულება
├── screenshots/             # მართვის პანელის ეკრანის ანაბეჭდები
├── security/                # დამáƒȘავი მეჄანიზმები, ჹესაბამისობა, áƒ€áƒáƒ áƒŁáƒšáƒáƒ‘áƒ, ჱოკენები
└── specs/                   # დიზაინის სპეáƒȘიჀიკაáƒȘიები

აჼალი პროვაიდერის დამაჱება

ნაბიჯი 1: პროვაიდერის კონსჱანჱების რეგისჱრაáƒȘია

დაამაჱეთ src/shared/constants/providers.ts-ლი — მოდულის áƒ©áƒáƒąáƒ•áƒ˜áƒ áƒ—áƒ•áƒ˜áƒĄáƒáƒĄ მოწმდება Zod-იქ მეჹვეობით.

ნაბიჯი 2: ჹემსრულებლის დამაჱება (თუ საჭიროა მორგებული ლოგიკა)

ლეჄმენით ჹემსრულებელი open-sse/executors/your-provider.ts-ლი, რომელიáƒȘ საბაზო ჹემსრულებელს áƒ’áƒáƒáƒ€áƒáƒ áƒ—áƒáƒ”áƒ‘áƒĄ.

ნაბიჯი 3: ჱრანსლაჱორის დამაჱება (თუ áƒ€áƒáƒ áƒ›áƒáƒąáƒ˜ OpenAI-იქ არ არიქ)

ლეჄმენით მოთჼოვნის/პასუჼის ჱრანსლაჱორები open-sse/translator/-ლი.

ნაბიჯი 4: OAuth-იქ áƒ™áƒáƒœáƒ€áƒ˜áƒ’áƒŁáƒ áƒáƒȘიიქ დამაჱება (თუ OAuth-ზეა áƒ“áƒáƒ€áƒŁáƒ«áƒœáƒ”áƒ‘áƒŁáƒšáƒ˜)

დაამაჱეთ OAuth-იქ ავჱორიზაáƒȘიიქ მონაáƒȘემები src/lib/oauth/constants/oauth.ts-ლი, ჼოლო სერვისი — src/lib/oauth/services/-ლი.

თუ ზედა დონის პროვაიდერი საჯარო OAuth client_id/საიდუმლოს ან Firebase Web API გასაჩებს თავის საჯარო CLI-ლი / ბრაუზერის პაკეჱჹი ავრáƒȘელებს, არ áƒ©áƒáƒĄáƒ•áƒáƒ— იქ áƒĄáƒąáƒ áƒ˜áƒ„áƒáƒœáƒŁáƒš ლიჱერალად. გამოიყენეთ resolvePublicCred() Ⴠაილიდან open-sse/utils/publicCreds.ts და დაამაჱეთ ჹენიჩბული ბაიჱური áƒ©áƒáƒœáƒáƒŹáƒ”áƒ áƒ˜ EMBEDDED_DEFAULTS-ლი. სრული სავალდებულო სამუჹაო პროáƒȘესი აჩწერილია docs/security/PUBLIC_CREDS.md-ლი.

დამმუჹავებლებსა/ჹემსრულებლებჹი კლიენჱამდე მისული ჹეáƒȘდომის ჹეჱყობინებები უნდა დამუჹავდეს buildErrorBody() / sanitizeErrorMessage() áƒ€áƒŁáƒœáƒ„áƒȘიებით Ⴠაილიდან open-sse/utils/error.ts — არასოდეს áƒ©áƒáƒĄáƒ•áƒáƒ— დაუმუჹავებელი err.stack ან err.message Response-იქ სჼეულჹი. იჼილეთ docs/security/ERROR_SANITIZATION.md.

ნაბიჯი 5: მოდელების რეგისჱრაáƒȘია

დაამაჱეთ მოდელების განსაზჩვრებები open-sse/config/providerRegistry.ts-ჹი.

ნაბიჯი 6: ჱესჱების დამაჱება

დაწერეთ ერთეულოვანი ჱესჱები tests/unit/-ლი, რომლებიáƒȘ მინიმუმ ჹემდეგს მოიáƒȘავს:

  • პროვაიდერის რეგისჱრაáƒȘია
  • მოთჼოვნის/პასუჼის ჱრანსლაáƒȘია
  • ჹეáƒȘდომების დამუჹავება

Pull Request-ის საკონჱროლო სია

  • ჱესჱები წარმაჱებით სრულდება (npm test)
  • ლინჱინგი წარმაჱებით სრულდება (npm run lint)
  • აგება წარმაჱებით სრულდება (npm run build)
  • აჼალი საჯარო áƒ€áƒŁáƒœáƒ„áƒȘიებისა და áƒ˜áƒœáƒąáƒ”áƒ áƒ€áƒ”áƒ˜áƒĄáƒ”áƒ‘áƒ˜áƒĄáƒ—áƒ•áƒ˜áƒĄ დამაჱებულია TypeScript-იქ ჱიპები
  • არ არიქ მყარად გაწერილი საიდუმლოები ან სარეზერვო მნიჹვნელობები
  • ზედა დონის საჯარო ავჱორიზაáƒȘიიქ მონაáƒȘემები áƒ©áƒáƒšáƒ”áƒœáƒ”áƒ‘áƒŁáƒšáƒ˜áƒ resolvePublicCred()-იქ მეჹვეობით (იჼილეთ docs/security/PUBLIC_CREDS.md) და არასოდეს — ლიჱერალების საჼით
  • ჹეáƒȘდომის პასუჼები მუჹავდება buildErrorBody() / sanitizeErrorMessage()-იქ მეჹვეობით — პასუჼის სჼეულებჹი არ არიქ დაუმუჹავებელი სჱეკის კვალები (იჼილეთ docs/security/ERROR_SANITIZATION.md)
  • გარსის ბრძანებები (exec / spawn) ჹესრულების დროის მნიჹვნელობებს გადასáƒȘემს env-იქ მეჹვეობით და არა áƒĄáƒąáƒ áƒ˜áƒ„áƒáƒœáƒŁáƒšáƒ˜ ინჱერპოლაáƒȘიით
  • ყველა ჹეყვანილი მონაáƒȘემი ჹემოწმებულია Zod-იქ áƒĄáƒ„áƒ”áƒ›áƒ”áƒ‘áƒ˜áƒ—
  • მომჼმარებლისთვის ჼილული áƒȘვლილებებისთვის áƒȘვლილებების ჟურნალის áƒ€áƒ áƒáƒ’áƒ›áƒ”áƒœáƒąáƒ˜ დამაჱებულია changelog.d/{features|fixes|maintenance}/<PR>-<slug>.md-ლი (იჼილეთ changelog.d/README.md) — არ áƒ“áƒáƒáƒ áƒ”áƒ“áƒáƒ„áƒąáƒ˜áƒ áƒáƒ— CHANGELOG.md პირდაპირ; áƒ€áƒ áƒáƒ’áƒ›áƒ”áƒœáƒąáƒ”áƒ‘áƒ˜ გაერთიანდება გამოჹვებისას და Pull Request-ებს ჹორის áƒ™áƒáƒœáƒ€áƒšáƒ˜áƒ„áƒąáƒĄ არასოდეს áƒŹáƒáƒ áƒ›áƒáƒ„áƒ›áƒœáƒ˜áƒĄ
  • დოკუმენჱაáƒȘია განაჼლებულია (თუ საჭიროა)
  • არ არიქ გაჼსნილი CodeQL-იქ / Secret-Scanning-იქ აჼალი áƒ’áƒáƒ€áƒ áƒ—áƒźáƒ˜áƒšáƒ”áƒ‘áƒ”áƒ‘áƒ˜, ან თითოეული მათგანი áƒŁáƒáƒ áƒ§áƒáƒ€áƒ˜áƒšáƒ˜áƒ áƒąáƒ”áƒ„áƒœáƒ˜áƒ™áƒŁáƒ áƒ˜ დასაბუთებით, რომელიáƒȘ ჹესაბამის docs/security/ დოკუმენჱს მიუთითებს
  • მარჹრუჱები, რომლებიáƒȘ ჹვილობილ პროáƒȘესებს უჹვებს (/api/mcp/, /api/cli-tools/runtime/), áƒ™áƒšáƒáƒĄáƒ˜áƒ€áƒ˜áƒȘირებულია როგორáƒȘ isLocalOnlyPath() Ⴠაილლი src/server/authz/routeGuard.ts — იჼილეთ მკაáƒȘრი წესი #15
  • commit-იქ ჹეჱყობინებებჹი არ არიქ Co-Authored-By ჱრეილერები — commit-ები მჼოლოდ რეპოზიჱორიის áƒ›áƒ€áƒšáƒáƒ‘áƒ”áƒšáƒ˜áƒĄ Git-იქ იდენჱობის Ⴤველ უნდა áƒ’áƒáƒ›áƒáƒ©áƒœáƒ“áƒ”áƒĄ (მკაáƒȘრი წესი #16)

რელიზების გამოჹვება

რელიზები იმართება /generate-release სამუჹაო პროáƒȘესის მეჹვეობით. აჼალი GitHub Release-იქ áƒšáƒ”áƒ„áƒ›áƒœáƒ˜áƒĄáƒáƒĄ პაკეჱი GitHub Actions-იქ მეჹვეობით ავჱომაჱურად Ⴤვეყნდება npm-ზე.

VPS-ზე განთავსებისთვის გამოიყენეთ npm run build:release (npm run build-იქ ნაáƒȘვლად) — იქ ასრულებს áƒĄáƒŁáƒ€áƒ—áƒ ჼელაჼალ აგებას, კრებს პაკეჱს dist/-ლი და áƒ„áƒ›áƒœáƒ˜áƒĄ dist/BUILD_SHA საკონჱროლო áƒ€áƒáƒ˜áƒšáƒĄ. ჹემდეგ გამოიყენეთ /deploy-vps-*-cc უნარები, რომლებიáƒȘ rsync-იქ მეჹვეობით dist/-ქ დისჱანáƒȘიურ app/ áƒ“áƒ˜áƒ áƒ”áƒ„áƒąáƒáƒ áƒ˜áƒáƒšáƒ˜ áƒáƒĄáƒ˜áƒœáƒ„áƒ áƒáƒœáƒ”áƒ‘áƒ”áƒœ.


დაჼმარების მიჩება