# Repository Conventions ## Purpose This document defines naming conventions, directory structure rules, and import boundaries for `learning_ai_invt_trdg`. It is the authoritative reference for where code lives and what each package is allowed to import. --- ## Package Names | Package | Name in `package.json` | `pnpm --filter` alias | |---|---|---| | Backend | `@bytelyst/trading-backend` | `trading-backend` | | Web | `@bytelyst/trading-web` | `trading-web` | | Mobile | `@bytelyst/trading-mobile` | `trading-mobile` | | Shared | `@bytelyst/trading-shared` (internal — not published) | — | --- ## Directory Structure ``` learning_ai_invt_trdg/ ├── backend/ │ ├── src/ │ │ ├── backtest/ # Backtesting engine and guards │ │ ├── config/ # Environment config loader (config/index.ts is the only place process.env is read) │ │ ├── connectors/ # Exchange connectors (Alpaca, CCXT) + factory │ │ ├── domain/ # Trading domain enums, value types, and pure domain logic │ │ ├── repositories/ # Cosmos DB data-access layer (one file per entity) │ │ ├── scripts/ # Internal one-time scripts and verification contracts (not imported by src/) │ │ ├── services/ # Application services (apiServer, TradeExecutor, aiClient, etc.) │ │ ├── strategies/ # 7-rule ProStrategyEngine and individual rule implementations │ │ └── utils/ # Generic utilities (logger, symbolMapper, etc.) │ ├── *.ts # Root-level verification / reconciliation scripts (not part of the runtime) │ └── package.json ├── web/ │ └── src/ │ ├── backtest/ # Backtest feature: hook, flags, UI components │ ├── components/ # Shared React components (AuthContext, Login, ChatControl, etc.) │ ├── hooks/ # React hooks (useWebSocket, useTabFeatureFlags, etc.) │ ├── lib/ # Utility modules: authSession, runtime, profileApi, etc. │ ├── tabs/ # Top-level tab components (one file per tab) │ ├── test/ # Vitest test setup and fixtures │ ├── App.tsx # Root component: tab routing, auth gate, feature flags │ └── main.tsx # Vite entry point ├── mobile/ │ ├── app/ # Expo Router file-based routes │ │ ├── (tabs)/ # Tab screens: index, positions, history, strategies, settings │ │ ├── _layout.tsx # Root layout (auth gate, kill-switch) │ │ ├── chat.tsx # AI chat surface │ │ └── marketplace.tsx # Marketplace surface │ ├── components/ # React Native shared components │ ├── hooks/ # React Native hooks │ ├── lib/ # runtime, telemetry, authSession equivalents │ ├── providers/ # MobileAuthProvider, TradingDataProvider │ └── utils/ # Utility functions ├── shared/ # Cross-surface constants and TypeScript interfaces │ ├── feature-flags.ts # TradingFeatureFlagsResponse, TabFeatureFlags, BacktestFeatureFlags │ ├── realtime.ts # SOCKET_NAMESPACES, buildTradingSocketOptions, isUnauthorizedSocketError │ ├── request-id.ts # createRequestId() │ ├── runtime.ts # getRuntimeEnvironment() │ ├── product.ts # productConfig — canonical product identity │ ├── control-plane.ts # Control-plane state types │ ├── platform-web.ts # Web-specific platform helpers │ └── platform-mobile.ts # Mobile-specific platform helpers ├── docs/ # All project documentation ├── scripts/ # Root-level build/verify scripts └── vendor/ # Local vendored @bytelyst/* packages (symlinked or copied) ``` --- ## Import Boundary Rules ### Rule 1 — `shared/` is the only cross-surface code No surface may import directly from another surface's `src/`. | Importer | May import from | |---|---| | `backend/src/` | `shared/`, `vendor/bytelyst/*`, npm packages | | `web/src/` | `shared/`, `vendor/bytelyst/*`, npm packages | | `mobile/` | `shared/`, `vendor/bytelyst/*`, npm packages | | `shared/` | npm packages only — never from backend, web, or mobile | **Violation example (never do this):** ```ts // In web/src — WRONG import { TradeExecutor } from '../../../backend/src/services/TradeExecutor.js'; ``` ### Rule 2 — `config/index.ts` is the only `process.env` reader in the backend All environment variable access in `backend/src/` goes through `config/index.ts`. No other file calls `process.env` directly. This makes the config surface auditable and testable in isolation. ### Rule 3 — `domain/` contains no I/O `backend/src/domain/` is pure TypeScript: enums, value types, and functions with no database calls, no HTTP, and no filesystem access. It may be imported by any other backend module. ### Rule 4 — `repositories/` only talk to Cosmos `backend/src/repositories/` (or `services/*Repository.ts`) are the only files that import `@azure/cosmos` or call Cosmos client methods. Services and strategies call repositories; they do not call Cosmos directly. ### Rule 5 — `scripts/` are not imported at runtime `backend/src/scripts/` contains verification contracts (e.g., `verifyWebsocketContract.ts`) that run as standalone processes. They are never `import`-ed by `backend/src/index.ts` or any other runtime module. Root-level `backend/*.ts` scripts follow the same rule. ### Rule 6 — `shared/` exports must be serialisable Everything exported from `shared/` must be importable in all three environments: Node.js (backend), browser (web), and React Native (mobile). No Node.js built-ins, no DOM APIs, no React Native-specific APIs. ### Rule 7 — Trading domain logic stays in the backend No trading strategy logic, risk rules, capital guard calculations, or execution logic may be moved into `shared/`, `web/`, or `mobile/`. Backend is authoritative. --- ## Naming Conventions ### Files | Context | Convention | Example | |---|---|---| | TypeScript source | `camelCase.ts` | `apiServer.ts`, `healthTracker.ts` | | React components | `PascalCase.tsx` | `OverviewTab.tsx`, `AuthContext.tsx` | | React hooks | `use` prefix, `camelCase.ts` | `useWebSocket.ts`, `useTabFeatureFlags.ts` | | Test files | `.test.ts` / `.test.tsx` | `App.dom.test.tsx` | | Verification scripts | `verify*.ts` / `test*.ts` | `verifyApiContract.ts` | | Docs | `SCREAMING_SNAKE.md` | `CONVENTIONS.md`, `OPERATIONS.md` | ### Identifiers | Context | Convention | Example | |---|---|---| | Classes | `PascalCase` | `ApiServer`, `TradeExecutor` | | Interfaces / types | `PascalCase` | `TradingFeatureFlagsResponse`, `BotState` | | Constants (module-level) | `SCREAMING_SNAKE_CASE` | `SOCKET_NAMESPACES`, `BACKTEST_FLAG_KEYS` | | Functions | `camelCase` | `buildTradingSocketOptions`, `createRequestId` | | React components | `PascalCase` | `OverviewTab`, `LivePulseTicker` | | Environment variables | `SCREAMING_SNAKE_CASE` | `COSMOS_ENDPOINT`, `TAB_MARKETPLACE_ENABLED` | ### API Endpoints | Scope | Prefix | Auth | |---|---|---| | Public product API | `/api/` | `requireAuth` (platform JWT) | | Internal operator tooling | `/internal/` | `requireAuth` — firewall-restrict in prod | | Admin-only mutations | `/api/admin/` | `requireAuth` + `requireAdmin` | | Health / observability | `/health`, `/metrics` | None — firewall-restrict in prod | ### Socket.IO Events (backend → client) | Event | Payload type | Notes | |---|---|---| | `state` | `BotState` | Full state on connect | | `symbol_update` | `{ symbol, data }` | Per-symbol signal/indicator update | | `positions_update` | `Position[]` | Full position list replacement | | `orders_update` | `Order[]` | Full order list replacement | | `history_update` | `HistoryRow` | Single new closed trade | | `new_alert` | `Alert` | Single new alert | | `health_update` | `HealthSnapshot` | Loop health and trading control state | | `account_snapshot` | `AccountSnapshot` | Exchange account balance snapshot | | `order_failure` | `OrderFailureRecord` | Single order failure notification | | `operational_event` | `OperationalEvent` | Structured operational log entry | | `operational_event_cleared` | — | Signals log has been cleared | --- ## Feature Flag Conventions - Feature flags are defined in `shared/feature-flags.ts` as TypeScript interfaces. - Flag key constants (`BACKTEST_FLAG_KEYS`, `TAB_FLAG_KEYS`) are the single source of truth for env var names — never hardcode the string elsewhere. - Backend reads env vars via `config/index.ts`; web/mobile read via `GET /api/feature-flags`. - Admin accounts bypass all feature flags — they always see everything. - New flags default to **enabled** (opt-out model) unless gating a genuinely unreleased feature. --- ## Request Tracing Convention Every HTTP request from web or mobile must include: ``` x-request-id: Authorization: Bearer ``` Backend echoes `x-request-id` in all responses. Use this header as the primary correlation key when tracing a request across client logs and backend logs. --- ## Test / Verification Script Convention Backend verification scripts follow this pattern: ```ts // verify*.ts or test*.ts at backend/ root or backend/src/scripts/ import assert from 'node:assert/strict'; function main() { // ... assertions ... console.log('[PASS] Description of what passed.'); } main(); ``` - Exit with a non-zero code on `AssertionError` (Node.js default behaviour). - Print `[PASS] ...` on success; never `console.log` progress in the happy path. - Never connect to real infrastructure — use in-memory fixtures only. - Wire into `package.json` scripts as `check:*` and into `npm run test` or `npm run lint`.