Files
OmniRoute/docs/i18n/he/CLAUDE.md
Diego Rodrigues de Sa e Souza ecc89eef14 feat(providers): integrate audited free-tier gateways (#9210)
* feat(providers): add Zylo UnoRouter and Poolside registries

* feat(providers): integrate audited free-tier gateways

* feat: add wave2 free-tier provider registries

* feat(providers): add Mixlayer Speka and TokenReply registries

* feat: add wave 2 free-tier provider registries

* fix: align meganova provider slug

* feat(providers): integrate wave2 free-tier gateways

* feat(providers): add Wave 3-A free-tier registries

* feat(providers): add HelyxAI Auriko and Poixe registries

* feat(providers): add Naga AI and Chat Oripe registries

* feat(providers): integrate wave3 free-tier gateways

* feat(providers): add FreeInference registry

* feat(providers): add Free.ai registry

* feat(providers): integrate wave4 free-tier gateways

* docs: synchronize provider and free-tier inventories

* refactor(providers): split audited gateway catalog

* feat(providers): add audited Void AI and HelixMind gateways

* feat(providers): finalize audited free-tier integration

* test(providers): update APIKEY split count to 229 after rebase onto release/v3.8.50

The rebase merged the release catalog (201 APIKEY providers) with the PR's
28 free-tier additions, yielding 229 total. Correct the characterization
count so the partition assertion reflects the true merged state.

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Co-authored-by: backryun <bakryun0718@proton.me>
2026-08-12 16:19:25 -03:00

30 KiB
Raw Blame History

CLAUDE.md (עברית)

🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇪🇸 es · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇳 gu · 🇮🇳 hi · 🇭🇺 hu · 🇮🇩 id · 🇮🇩 in · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇮🇳 mr · 🇲🇾 ms · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN


הקובץ הזה מספק הנחיות ל-Claude Code (claude.ai/code) כאשר עובדים עם קוד במאגר זה.

התחלה מהירה

npm install                    # התקנת תלותים (יוצר אוטומטית .env מ-.env.example)
npm run dev                    # שרת פיתוח ב-http://localhost:20128
npm run build                  # בניית הפקה (Next.js 16 עצמאי)
npm run lint                   # ESLint (0 שגיאות צפויות; אזהרות קיימות מראש)
npm run typecheck:core         # בדיקת TypeScript (אמור להיות נקי)
npm run typecheck:noimplicit:core  # בדיקה מחמירה (בלי implicit any)
npm run test:coverage          # בדיקות יחידה + שער כיסוי (75/75/75/70 — משפטים/שורות/פונקציות/סניפים)
npm run check                  # lint + בדיקות משולבות
npm run check:cycles           # זיהוי תלותיות מעגליות

הרצת בדיקות

# קובץ בדיקה בודד (רץ בדיקות מקורי של Node.js — רוב הבדיקות)
node --import tsx/esm --test tests/unit/your-file.test.ts

# Vitest (שרת MCP, autoCombo, cache)
npm run test:vitest

# כל הסוויטות
npm run test:all

למטריצת הבדיקות המלאה, ראה CONTRIBUTING.md → "הרצת בדיקות". לארכיטקטורה מעמיקה, ראה AGENTS.md.


פרויקט במבט חטוף

OmniRoute — פרוקסי/נתב AI מאוחד. נקודת קצה אחת, 329 ספקי LLM, חזרה אוטומטית.

שכבה מיקום מטרה
API Routes src/app/api/v1/ נתב אפליקציית Next.js — נקודות כניסה
Handlers open-sse/handlers/ עיבוד בקשות (צ'אט, הטמעות, וכו')
Executors open-sse/executors/ הפצת HTTP ספציפית לספק
Translators open-sse/translator/ המרת פורמטים (OpenAI↔Claude↔Gemini)
Transformer open-sse/transformer/ API תגובות ↔ השלמות צ'אט
Services open-sse/services/ ניתוב קומבו, מגבלות קצב, קאשינג, וכו'
Database src/lib/db/ 110 top-level SQLite domain modules, 130 migrations
Domain/Policy src/domain/ מנוע מדיניות, כללי עלות, לוגיקת חזרה
MCP Server open-sse/mcp-server/ 107 unique tools, 3 transports (stdio / SSE / Streamable HTTP), 32 scopes
A2A Server src/lib/a2a/ פרוטוקול JSON-RPC 2.0 של סוכן
Skills src/lib/skills/ מסגרת מיומנויות ניתנת להרחבה
Memory src/lib/memory/ זיכרון שיחה מתמשך

מונורפו: src/ (אפליקציית Next.js 16), open-sse/ (מרחב עבודה של מנוע סטרימינג), electron/ (אפליקציית שולחן עבודה), tests/, bin/ (נקודת כניסה ל-CLI).


צינור בקשות

Client → /v1/chat/completions (Next.js route)
  → CORS → Zod validation → auth? → policy check → prompt injection guard
  → handleChatCore() [open-sse/handlers/chatCore.ts]
    → cache check → rate limit → combo routing?
      → resolveComboTargets() → handleSingleModel() per target
    → translateRequest() → getExecutor() → executor.execute()
      → fetch() upstream → retry w/ backoff
    → response translation → SSE stream or JSON
    → If Responses API: responsesTransformer.ts TransformStream

נתיבי API עוקבים אחרי תבנית עקבית: Route → CORS preflight → Zod body validation → Optional auth (extractApiKey/isValidApiKey) → API key policy enforcement → Handler delegation (open-sse). אין middleware גלובלי של Next.js — חיתוך הוא ספציפי לנתיב.

Combo routing (open-sse/services/combo.ts): 19 public strategies (priority, weighted, fill-first, round-robin, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, context-relay, fusion, pipeline). Each target calls handleSingleModel(), which wraps handleChatCore() with per-target error handling and circuit-breaker checks. See docs/routing/AUTO-COMBO.md for the 13-factor Auto-Combo scoring and docs/architecture/RESILIENCE_GUIDE.md for the 3 resilience layers.


מצב ריצה של חוסן

OmniRoute יש שלושה מנגנוני כישלון זמניים הקשורים אך שונים. שמור על התחום שלהם נפרד כאשר אתה מדבג התנהגות נתיב. ראה את דיאגרמת חוסן ב-3 שכבות (מקור: docs/diagrams/resilience-3layers.mmd) למפת מבט-על.

מפסק מעגל ספק

תחום: ספק שלם, לדוגמה glm, openai, anthropic.

מטרה: להפסיק לשלוח תנועה לספק שנכשל שוב ושוב ברמת ה-upstream/service, כך שספק לא בריא אחד לא יאט את כל הבקשות.

יישום:

  • מחלקה מרכזית: src/shared/utils/circuitBreaker.ts
  • חיבור שער/ביצוע צ'אט: src/sse/handlers/chatHelpers.ts, src/sse/handlers/chat.ts
  • API מצב ריצה: src/app/api/monitoring/health/route.ts
  • עטיפות משותפות: open-sse/services/accountFallback.ts
  • טבלת מצב מתמשך: domain_circuit_breakers

מצבים:

  • CLOSED: תנועה רגילה מותרת.
  • OPEN: ספק חסום זמנית; callers מקבלים תגובה של provider-circuit-open או נתיב קומבו מדלג ליעד אחר.
  • HALF_OPEN: זמן האיפוס חלף; מאפשר בקשת בדיקה. הצלחה סוגרת את המפסק, כישלון פותח אותו שוב.

ברירות מחדל (open-sse/config/constants.ts):

  • ספקי OAuth: סף 3, זמן איפוס 60s.
  • ספקי API-key: סף 5, זמן איפוס 30s.
  • ספקים מקומיים: סף 2, זמן איפוס 15s.

רק מצבי כישלון ברמת ספק צריכים להפעיל את מפסק הספק:

(408, 500, 502, 503, 504);

אל תפעיל את מפסק הספק הכולל עבור שגיאות רגילות של חשבון/מפתח/מודל כמו רוב המקרים של 401, 403, או 429. אלה בדרך כלל שייכים לקירור חיבור או נעילת מודל. ספק API-key כללי 403 צריך להיות ניתן לשחזור אלא אם כן הוא מסווג כשגיאת ספק/חשבון סופית.

המפסק משתמש בשחזור עצלן, לא בטיימר רקע. כאשר OPEN פג, קריאות כמו getStatus(), canExecute(), וgetRetryAfterMs() מעדכנות את המצב ל HALF_OPEN, כך שדשבורדים ובוני מועמדים לקומבו לא ממשיכים להוציא ספק שפג תוקף לנצח.

קירור חיבור

תחום: חיבור/חשבון/מפתח ספק אחד.

מטרה: לדלג זמנית על מפתח/חשבון רע אחד תוך מתן אפשרות לחיבורים אחרים עבור אותו ספק להמשיך לשרת בקשות.

יישום:

  • נתיב כתיבה/עדכון: src/sse/services/auth.ts::markAccountUnavailable()
  • בחירת/סינון חשבון: src/sse/services/auth.ts::getProviderCredentials...
  • חישוב קירור: open-sse/services/accountFallback.ts::checkFallbackError()
  • הגדרות: src/lib/resilience/settings.ts

שדות חשובים על חיבורי ספק:

rateLimitedUntil;
testStatus: "unavailable";
lastError;
lastErrorType;
errorCode;
backoffLevel;

במהלך בחירת חשבון, חיבור מדולג כאשר:

new Date(rateLimitedUntil).getTime() > Date.now();

קירורים הם גם עצלנים: כאשר rateLimitedUntil נמצא בעבר, החיבור הופך לזמין שוב. בשימוש מוצלח, clearAccountError() מנקה את testStatus, rateLimitedUntil, שדות שגיאה, וbackoffLevel.

התנהגות ברירת מחדל של קירור חיבור:

  • קירור בסיסי של OAuth: 5s.
  • קירור בסיסי של API-key: 3s.
  • API-key 429 צריך להעדיף רמזי ניסיון מחדש מה-upstream (Retry-After, כותרות איפוס, או טקסט איפוס שניתן לנתח) כאשר הם זמינים.
  • כישלונות חוזרים שניתן לשחזר משתמשים באיפוס אקספוננציאלי:
baseCooldownMs * 2 ** failureIndex;

שומר ה"אנטי-המון" מונע כישלונות מקבילים על אותו חיבור מהארכת הקירור שוב ושוב או מהגדלת backoffLevel פעמיים.

מצבים סופיים אינם קירורים. banned, expired, וcredits_exhausted מיועדים להישאר לא זמינים עד ששינויים באישורים/הגדרות יתרחשו או שמפעיל יאפס אותם. אל תחליף מצבים סופיים עם מצב קירור זמני.

נעילת מודל

תחום: ספק + חיבור + מודל.

מטרה: להימנע מכיבוי חיבור שלם כאשר רק מודל אחד אינו זמין או מוגבל מכסה עבור אותו חיבור.

דוגמאות:

  • ספקי מכסה לפי מודל המחזירים 429.
  • ספקים מקומיים המחזירים 404 עבור מודל חסר אחד.
  • כישלונות הרשאה של מצב/מודל ספציפיים לספק כמו מצבי Grok שנבחרו.

נעילת מודל חיה בopen-sse/services/accountFallback.ts ומאפשרת לאותו חיבור להמשיך לשרת מודלים אחרים.

הנחיות לדיבוג

  • אם כל המפתחות עבור ספק מדולגים, בדוק גם את מצב מפסק הספק וגם את rateLimitedUntil/testStatus של כל חיבור.
  • אם ספק נראה מוד excluded באופן קבוע לאחר חלון האיפוס, בדוק אם הקוד קורא את state הגולמי במקום להשתמש בgetStatus()/canExecute().
  • אם מפתח ספק אחד נכשל אבל אחרים צריכים לעבוד, העדיף קירור חיבור על פני מפסק ספק.
  • אם רק מודל אחד נכשל, העדיף נעילת מודל על פני קירור חיבור.
  • אם מצב צריך לשחזר את עצמו, עליו להיות עם חותמת זמן עתידית/זמן איפוס ונתיב קריאה שמעודכן מצב שפג תוקף. מצבים קבועים דורשים שינויים ידניים באישורים או בהגדרות.

קונבנציות מפתח

סגנון קוד

  • 2 רווחים, נקודותיים, ציטוטים כפולים, רוחב 100 תווים, פסיקים בסוף שורות ב-ES5 (מאוכפים על ידי lint-staged דרך Prettier)
  • ייבוא: חיצוני → פנימי (@/, @omniroute/open-sse) → יחסי
  • שמות: קבצים=camelCase/kebab, רכיבים=PascalCase, קבועים=UPPER_SNAKE
  • ESLint: no-eval, no-implied-eval, no-new-func = שגיאה בכל מקום; no-explicit-any = אזהרה ב-open-sse/ וב-tests/
  • TypeScript: strict: false, יעד ES2022, מודול esnext, פתרון bundler. העדיף סוגים מפורשים.

מסד נתונים

  • תמיד עבור דרך מודולי דומיין ב-src/lib/db/לעולם לא כתוב SQL גולמי בנתיבים או במטפלים
  • לעולם לא הוסף לוגיקה ל-src/lib/localDb.ts (שכבת ייצוא בלבד)
  • לעולם לא ייבוא ברוול מ-localDb.ts — ייבא מודולים ספציפיים מ-db/ במקום
  • DB singleton: getDbInstance() מ-src/lib/db/core.ts (יומני WAL)
  • הגירות: src/lib/db/migrations/ — קבצי SQL עם גרסאות, אידמפוטנטיים, ריצה בעסקאות

טיפול בשגיאות

  • try/catch עם סוגי שגיאה ספציפיים, רישום עם הקשר pino
  • לעולם לא לבלוע שגיאות בזרמי SSE — השתמש באותות הפסקה לניקוי
  • החזר קודי סטטוס HTTP נכונים (4xx/5xx)

אבטחה

  • לעולם לא השתמש ב-eval(), new Function(), או eval מרומז
  • אמת את כל הקלטים עם סכמות Zod
  • הצפן אישורים במצב מנוחה (AES-256-GCM)
  • רשימת דחייה של כותרות עליונות: src/shared/constants/upstreamHeaders.ts — שמור על סניטיזציה, סכמות Zod, ובדיקות יחידה מסונכרנות בעת עריכה
  • אישורים ציבוריים עליונים (Gemini/Antigravity/Windsurf-style OAuth client_id/secret + מפתחות Firebase Web שהופקו מ-CLIs ציבוריים): חייבים להיות מוטמעים דרך resolvePublicCred() מ-open-sse/utils/publicCreds.tsלעולם לא כמילולי מחרוזת. ראה docs/security/PUBLIC_CREDS.md עבור התבנית החובה.
  • תגובות שגיאה (HTTP / SSE / מפעיל / MCP handler): חייבות לעבור דרך buildErrorBody() או sanitizeErrorMessage() מ-open-sse/utils/error.tsלעולם לא לשים err.stack או err.message גולמיים בגוף התגובה. ראה docs/security/ERROR_SANITIZATION.md.
  • פקודות Shell שנבנות ממתודולוגיות: כאשר קוראים ל-exec()/spawn() עם סקריפט שצריך ערכי ריצה, העבר אותם דרך האופציה env (נמלט אוטומטית) — לעולם לא לשלב מחרוזות לא מהימנות/חיצוניות בגוף הסקריפט. הפניה: src/mitm/cert/install.ts::updateNssDatabases.
  • ספריות מאובטחות כברירת מחדל (tldrsec/awesome-secure-defaults): העדיף Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink על פני יישומים מותאמים אישית בכל פעם שמוסיפים משטחים רגישים לאבטחה.

תרחישי שינוי נפוצים

הוספת ספק חדש

  1. רשם ב-src/shared/constants/providers.ts (מאומת על ידי Zod בעת טעינה)
  2. הוסף מפעיל ב-open-sse/executors/ אם נדרשת לוגיקה מותאמת (הרחב את BaseExecutor)
  3. הוסף מתרגם ב-open-sse/translator/ אם פורמט שאינו OpenAI
  4. הוסף קונפיגורציית OAuth ב-src/lib/oauth/constants/oauth.ts אם מבוסס OAuth — אם ה-CLI העליון מספק client_id/secret ציבורי, מוטמע דרך resolvePublicCred() (ראה docs/security/PUBLIC_CREDS.md), לעולם לא כמילולי
  5. רשם מודלים ב-open-sse/config/providerRegistry.ts
  6. כתוב בדיקות ב-tests/unit/ (כלול את האישור של צורת publicCreds אם הוספת ברירת מחדל מוטמעת חדשה)

הוספת נתיב API חדש

  1. צור תיקיה תחת src/app/api/v1/your-route/
  2. צור route.ts עם מטפלים GET/POST
  3. עקוב אחרי התבנית: CORS → אימות גוף Zod → אימות אופציונלי → הפניית מטפלים
  4. המטפל הולך ל-open-sse/handlers/ (ייבא משם, לא בשורה)
  5. תגובות שגיאה משתמשות ב-buildErrorBody() / errorResponse() מ-open-sse/utils/error.ts (מסונן אוטומטית — לעולם לא לשים err.stack או err.message גולמיים בגוף). ראה docs/security/ERROR_SANITIZATION.md.
  6. הוסף בדיקות — כולל לפחות אישור אחד שתגובות שגיאה לא דולפות עקבות מחסומים (!body.error.message.includes("at /"))

הוספת מודול DB חדש

  1. צור src/lib/db/yourModule.ts — ייבא getDbInstance מ-./core.ts
  2. ייצא פונקציות CRUD עבור טבלת הדומיין שלך
  3. הוסף הגירה ב-src/lib/db/migrations/ אם נדרשות טבלאות חדשות
  4. ייצא מחדש מ-src/lib/localDb.ts (הוסף לרשימת הייצוא מחדש בלבד)
  5. כתוב בדיקות

הוספת כלי MCP חדש

  1. הוסף הגדרת כלי ב-open-sse/mcp-server/tools/ עם סכמת קלט Zod + מטפל אסינכרוני
  2. רשם בערכת הכלים (מחובר על ידי createMcpServer())
  3. הקצה להיקפים המתאימים
  4. כתוב בדיקות (קריאות הכלי נרשמות בטבלת mcp_audit)

הוספת מיומנות A2A חדשה

  1. צור מיומנות ב-src/lib/a2a/skills/ (5 כבר קיימות: smart-routing, quota-management, provider-discovery, cost-analysis, health-report)
  2. המיומנות מקבלת הקשר משימה (הודעות, מטא-נתונים) → מחזירה תוצאה מובנית
  3. רשם ב-A2A_SKILL_HANDLERS ב-src/lib/a2a/taskExecution.ts
  4. חשוף ב-src/app/.well-known/agent.json/route.ts (כרטיס סוכן)
  5. כתוב בדיקות ב-tests/unit/
  6. תעד ב-docs/frameworks/A2A-SERVER.md טבלת מיומנויות

הוספת סוכן ענן חדש

  1. צור מחלקת סוכן ב-src/lib/cloudAgent/agents/ המרחיבה את CloudAgentBase (3 כבר קיימות: codex-cloud, devin, jules)
  2. יישם createTask, getStatus, approvePlan, sendMessage, listSources
  3. רשם ב-src/lib/cloudAgent/registry.ts
  4. הוסף טיפול ב-OAuth/אישורים אם נדרש (src/lib/oauth/providers/)
  5. בדיקות + תעד ב-docs/frameworks/CLOUD_AGENT.md

הוספת גדר / Eval / מיומנות / אירוע Webhook חדש

  • גדר: src/lib/guardrails/ → תיעוד: docs/security/GUARDRAILS.md
  • ערכת Eval: src/lib/evals/ → תיעוד: docs/frameworks/EVALS.md
  • מיומנות (סנדבוקס): src/lib/skills/ → תיעוד: docs/frameworks/SKILLS.md
  • אירוע Webhook: src/lib/webhookDispatcher.ts → תיעוד: docs/frameworks/WEBHOOKS.md

תיעוד הפניה

לכל שינוי שאינו טריוויאלי, קרא קודם את המאמר המתאים:

תחום מסמך
ניווט במאגר docs/architecture/REPOSITORY_MAP.md
ארכיטקטורה docs/architecture/ARCHITECTURE.md
הפניה הנדסית docs/architecture/CODEBASE_DOCUMENTATION.md
אוטו-קומבו (ציון 9 גורמים, 14 אסטרטגיות) docs/routing/AUTO-COMBO.md
חוסן (3 מנגנונים) docs/architecture/RESILIENCE_GUIDE.md
חזרה על הסקת מסקנות docs/routing/REASONING_REPLAY.md
מסגרת מיומנויות docs/frameworks/SKILLS.md
מערכת זיכרון (FTS5 + Qdrant) docs/frameworks/MEMORY.md
סוכני ענן docs/frameworks/CLOUD_AGENT.md
מגני בטיחות (PII / הזרקה / חזון) docs/security/GUARDRAILS.md
אישורים ציבוריים (Gemini/וכו') docs/security/PUBLIC_CREDS.md
סינון הודעות שגיאה docs/security/ERROR_SANITIZATION.md
הערכות docs/frameworks/EVALS.md
ציות / ביקורת docs/security/COMPLIANCE.md
ווב-הוקים docs/frameworks/WEBHOOKS.md
צינור הרשאה docs/architecture/AUTHZ_GUIDE.md
הסתרה (TLS / טביעת אצבע) docs/security/STEALTH_GUIDE.md
פרוטוקולי סוכנים (A2A / ACP / Cloud) docs/frameworks/AGENT_PROTOCOLS_GUIDE.md
שרת MCP docs/frameworks/MCP-SERVER.md
שרת A2A docs/frameworks/A2A-SERVER.md
הפניה ל-API + OpenAPI docs/reference/API_REFERENCE.md + docs/reference/openapi.yaml
קטלוג ספקים (נוצר אוטומטית) docs/reference/PROVIDER_REFERENCE.md
זרימת שחרור docs/ops/RELEASE_CHECKLIST.md

בדיקות

מה פקודה
בדיקות יחידה npm run test:unit
קובץ בודד node --import tsx/esm --test tests/unit/file.test.ts
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
שער כיסוי npm run test:coverage (75/75/75/70 — הצהרות/שורות/פונקציות/סניפים)
דוח כיסוי npm run coverage:report

כלל PR: אם אתה משנה קוד ייצור ב-src/, open-sse/, electron/, או bin/, עליך לכלול או לעדכן בדיקות באותו PR.

העדפת שכבת בדיקה: יחידה קודם → אינטגרציה (רב-מודול או מצב DB) → e2e (UI/זרימת עבודה בלבד). קודד שחזורי באגים כבדיקות אוטומטיות לפני או לצד התיקון.

מדיניות כיסוי Copilot: כאשר PR משנה קוד ייצור והכיסוי נמוך מ-75% (הצהרות/שורות/פונקציות) או 70% (סניפים), אל תדווח רק — הוסף או עדכן בדיקות, הרץ מחדש את שער הכיסוי, ואז בקש אישור. כלול פקודות שהופעלו, קבצי בדיקה שהשתנו, ותוצאת כיסוי סופית בדוח ה-PR.


זרימת עבודה של Git

# אל תבצע קומיט ישירות ל-main
git checkout -b feat/your-feature
git commit -m "feat: תאר את השינוי שלך"
git push -u origin feat/your-feature

קידומות סניפים: feat/, fix/, refactor/, docs/, test/, chore/

פורמט קומיט (Commits קונבנציונליים): feat(db): הוסף מפסק מעגל — תחומים: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills

הוקי Husky:

  • pre-commit: lint-staged + check-docs-sync + check:any-budget:t11
  • pre-push: npm run test:unit

סביבה

  • Runtime: Node.js ≥20.20.2 <21 | | ≥22.22.2 <23 | | ≥24 <25, מודולי ES
  • TypeScript: 5.9+, יעד ES2022, מודול esnext, פתרון bundler
  • Alias נתיב: @/*src/, @omniroute/open-sseopen-sse/, @omniroute/open-sse/*open-sse/*
  • פורט ברירת מחדל: 20128 (API + לוח מחוונים באותו פורט)
  • ספריית נתונים: משתנה סביבה DATA_DIR, ברירת מחדל ל-~/.omniroute/
  • משתני סביבה מרכזיים: PORT, JWT_SECRET, API_KEY_SECRET, INITIAL_PASSWORD, REQUIRE_API_KEY, APP_LOG_LEVEL
  • הגדרה: cp .env.example .env ואז צור JWT_SECRET (openssl rand -base64 48) ו-API_KEY_SECRET (openssl rand -hex 32)

כללים נוקשים

  1. אל תבצע קומיט של סודות או אישורים
  2. אל תוסיף לוגיקה ל-localDb.ts
  3. אל תשתמש ב-eval() / new Function() / eval מרומז
  4. אל תבצע קומיט ישירות ל-main
  5. אל תכתוב SQL גולמי בנתיבים — השתמש במודולים מ-src/lib/db/
  6. אל תשתיק שגיאות בזרמי SSE בשקט
  7. תמיד אמת קלטים עם סכמות Zod
  8. תמיד כלול בדיקות כאשר אתה משנה קוד ייצור
  9. הכיסוי חייב להישאר ≥75% (הצהרות, שורות, פונקציות) / ≥70% (סניפים). מדוד נוכחי: ~82%.
  10. אל תעקוף הוקי Husky (--no-verify, --no-gpg-sign) ללא אישור מפעיל מפורש.
  11. אל תטמיע אישורי OAuth ציבוריים upstream client_id/secret או מפתחות Firebase Web כמלל מיתר — תמיד עבור דרך resolvePublicCred() (open-sse/utils/publicCreds.ts). ראה docs/security/PUBLIC_CREDS.md.
  12. אל תחזיר err.stack / err.message גולמיים בתגובות HTTP / SSE / executor — תמיד נווט דרך buildErrorBody() או sanitizeErrorMessage() (open-sse/utils/error.ts). ראה docs/security/ERROR_SANITIZATION.md.
  13. אל תבצע אינטרפולציה של מיתרים של נתיבים חיצוניים או ערכי ריצה לתוך סקריפטים של shell המועברים ל-exec()/spawn() — העבר דרך אפשרות env במקום זאת. הפניה: src/mitm/cert/install.ts::updateNssDatabases.
  14. אל תדחה אזהרת CodeQL / סריקת סודות ללא (א) בדיקה ראשונה של מסמכי התבנית למעלה כדי לראות אם העוזר חל, ו-(ב) תיעוד ההצדקה הטכנית בהערת הדחייה. תקדים: js/stack-trace-exposure הועלה על אתרי קריאה שכבר נווטים דרך sanitizeErrorMessage() היא מגבלה ידועה של CodeQL (מסננים מותאמים אישית לא מוכרים) — דחה כ-false positive בהתייחסות ל-docs/security/ERROR_SANITIZATION.md.
  15. אל תחשוף נתיבים שמפעילים תהליכים ילדיים (/api/mcp/, /api/cli-tools/runtime/) ללא סיווג isLocalOnlyPath() ב-src/server/authz/routeGuard.ts. אכיפת לולאת חזרה מתבצעת ללא תנאים לפני כל בדיקת auth — JWT דלף דרך מנהרה לא יכול להפעיל תהליך. ראה docs/security/ROUTE_GUARD_TIERS.md.
  16. לעולם אל תכלול Co-Authored-By trailers שמיוחסים לעוזר AI, ל-LLM או לחשבון אוטומציה (למשל שמות המכילים "Claude", "GPT", "Copilot", "Bot"; אימיילים ב-anthropic.com / openai.com / כתובות noreply.github.com השייכות לבוטים). trailers כאלה מנתבים את הייחוס של ה-commit לחשבון הבוט ב-GitHub, ומסתירים את המחבר האמיתי (diegosouzapw) בהיסטוריית ה-PR. משתפי פעולה אנושיים — כולל מחברי PR upstream ומדווחי issues שמועתקים ל-OmniRoute — יכולים וחייבים לקבל קרדיט עם trailers סטנדרטיים Co-authored-by: Name <email>; תהליכי העבודה של upstream-port (/port-upstream-features, /port-upstream-issues) תלויים בזה.