# Project memory > Curated long-term knowledge. **Hard cap: 60 lines of entries.** ## Verified facts - LexAI monorepo: `packages/{chrome,vscode,cli,website}`; shared `src/lib`. - Portable core: `providers.ts`, `actions.ts`, `types.ts`. Chrome-only: `crypto.ts`, `messaging.ts`. - Providers: OpenAI, Anthropic, Groq, OpenRouter — `callProvider` / `PROVIDER_SPECS`. - VS Code: Secret Storage; Code Assist; prefs `lexai.*`. - CLI: `lexai prompt`; `LEXAI_API_KEY` required; optional `LEXAI_PROVIDER` / `LEXAI_MODEL`; `~/.lexai/config.json` never holds apiKey. - Chrome entrypoints: `packages/chrome/entrypoints/`; build → `packages/chrome/.output/chrome-mv3/`. - Selection minimum: `MIN_SELECTION_LENGTH` (10). Chrome `onMessage` must `return true`; snapshot before `await`. ## Conventions - Style Chrome UI with inline styles (Tailwind not wired). - Prefer encrypted Chrome key path; keep plaintext `apiKey` fallback until migration. - VS Code / CLI must not import `@lib/crypto` or `@lib/messaging`. - Root scripts: `install:all`, `chrome:*`, `vscode:*`, `cli:*`. ## Environment quirks - Node 22 pinned in CI; `npx wxt prepare` required before Chrome typecheck on fresh clone. - PowerShell may not accept `&&` — chain with `; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }`. ## Key paths and entry points | What | Where | | --- | --- | | Chrome entrypoints | `packages/chrome/entrypoints/` | | Shared lib | `src/lib/` | | VS Code | `packages/vscode/` | | CLI | `packages/cli/` | | Website | `packages/website/` (Vite React; Home, Docs, Contribute, Community) | | OSS meta | root `README.md`, `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md` | | Issue/PR templates | `.gitea/ISSUE_TEMPLATE/`, `.gitea/PULL_REQUEST_TEMPLATE.md` | | CI workflows | `.gitea/workflows/ci-{chrome,vscode,cli,website}.yml` (no deploy/release yet) | ## Expiring notes - _None yet._ ## Consolidation log | Date | Action | Reason | | --- | --- | --- | | 2026-08-13 | Seeded after VS Code v1 | `/project-init` stubs + port |