@libredb/studio 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/.claude/settings.local.json +127 -0
  2. package/.cursorrules +426 -0
  3. package/.devin/wiki.json +143 -0
  4. package/.dockerignore +80 -0
  5. package/.env.example +159 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +49 -0
  7. package/.github/ISSUE_TEMPLATE/feature_request.md +29 -0
  8. package/.github/PULL_REQUEST_TEMPLATE.md +57 -0
  9. package/.github/workflows/ci.yml +185 -0
  10. package/.github/workflows/codeql.yml +57 -0
  11. package/.github/workflows/docker-build-push.yml +118 -0
  12. package/.github/workflows/helm-release.yml +113 -0
  13. package/CLAUDE.md +265 -0
  14. package/CODE_OF_CONDUCT.md +124 -0
  15. package/CONTRIBUTING.md +154 -0
  16. package/Dockerfile +73 -0
  17. package/LICENSE +21 -0
  18. package/README.md +614 -0
  19. package/SECURITY.md +107 -0
  20. package/artifacthub-repo.yml +4 -0
  21. package/bun.lock +1714 -0
  22. package/bunfig.toml +3 -0
  23. package/charts/libredb-studio/.helmignore +11 -0
  24. package/charts/libredb-studio/Chart.lock +6 -0
  25. package/charts/libredb-studio/Chart.yaml +50 -0
  26. package/charts/libredb-studio/README.md +206 -0
  27. package/charts/libredb-studio/templates/NOTES.txt +59 -0
  28. package/charts/libredb-studio/templates/_helpers.tpl +135 -0
  29. package/charts/libredb-studio/templates/configmap.yaml +37 -0
  30. package/charts/libredb-studio/templates/deployment.yaml +184 -0
  31. package/charts/libredb-studio/templates/hpa.yaml +32 -0
  32. package/charts/libredb-studio/templates/ingress.yaml +41 -0
  33. package/charts/libredb-studio/templates/networkpolicy.yaml +50 -0
  34. package/charts/libredb-studio/templates/pdb.yaml +18 -0
  35. package/charts/libredb-studio/templates/pvc.yaml +23 -0
  36. package/charts/libredb-studio/templates/secret.yaml +30 -0
  37. package/charts/libredb-studio/templates/seed-configmap.yaml +11 -0
  38. package/charts/libredb-studio/templates/service.yaml +22 -0
  39. package/charts/libredb-studio/templates/serviceaccount.yaml +13 -0
  40. package/charts/libredb-studio/values.schema.json +246 -0
  41. package/charts/libredb-studio/values.yaml +286 -0
  42. package/components.json +22 -0
  43. package/conductor/code_styleguides/typescript.md +43 -0
  44. package/conductor/product-guidelines.md +43 -0
  45. package/conductor/product.md +3 -0
  46. package/conductor/setup_state.json +1 -0
  47. package/conductor/tech-stack.md +39 -0
  48. package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +8 -0
  49. package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +44 -0
  50. package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +31 -0
  51. package/conductor/tracks.md +8 -0
  52. package/conductor/workflow.md +333 -0
  53. package/database-compose.yml +55 -0
  54. package/docker/postgres-init/01-extensions.sql +10 -0
  55. package/docker/postgres-init/02-sample-data.sql +585 -0
  56. package/docker/postgres.yml +68 -0
  57. package/docker-compose.yml +38 -0
  58. package/docs/AI_PLAN.md +74 -0
  59. package/docs/API_DOCS.md +875 -0
  60. package/docs/ARCHITECTURE.md +218 -0
  61. package/docs/DATABASE_PROVIDERS.md +358 -0
  62. package/docs/FEATURES.md +116 -0
  63. package/docs/HELM_CHART.md +252 -0
  64. package/docs/LOGIN_PAGE.md +178 -0
  65. package/docs/MONACO_EDITOR_PERFORMANCE.md +315 -0
  66. package/docs/OIDC_ARCH.md +681 -0
  67. package/docs/OIDC_SETUP.md +322 -0
  68. package/docs/POSTGRES_METRICS.md +516 -0
  69. package/docs/QUERY_OPTIMIZATION.md +370 -0
  70. package/docs/SEED_CONNECTIONS.md +468 -0
  71. package/docs/SQL_ALIAS_COMPLETION.md +190 -0
  72. package/docs/STORAGE_ARCHITECTURE.md +565 -0
  73. package/docs/STORAGE_QUICK_SETUP.md +419 -0
  74. package/docs/TECHNICAL_PLAN.md +36 -0
  75. package/docs/THEMING.md +345 -0
  76. package/docs/adding-a-new-database-provider.md +642 -0
  77. package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +360 -0
  78. package/docs/backlogs/001-INLINE_DATA_EDITING.md +118 -0
  79. package/docs/backlogs/002-DATA_IMPORT.md +215 -0
  80. package/docs/backlogs/003-QUERY_TIME_MACHINE.md +183 -0
  81. package/docs/backlogs/004-AI_DATA_STORYTELLER.md +292 -0
  82. package/docs/backlogs/005-QUERY_PLAYGROUND.md +352 -0
  83. package/docs/backlogs/006-DATA_MASKING.md +418 -0
  84. package/docs/enterprise-features.md +718 -0
  85. package/docs/kubernetes-helm-chart-artifacthub-plan.md +803 -0
  86. package/docs/medium-koyeb-article-en.md +215 -0
  87. package/docs/plans/test-plans.md +445 -0
  88. package/docs/releases/RELEASE.V0.3.0.md +22 -0
  89. package/docs/releases/RELEASE.V0.4.0.md +154 -0
  90. package/docs/releases/RELEASE.V0.5.0.md +252 -0
  91. package/docs/releases/RELEASE_v0.5.6.md +145 -0
  92. package/docs/releases/RELEASE_v0.6.1.md +303 -0
  93. package/docs/releases/RELEASE_v0.6.7.md +292 -0
  94. package/docs/releases/RELEASE_v0.7.0.md +332 -0
  95. package/docs/releases/RELEASE_v0.8.0.md +521 -0
  96. package/docs/sampledb/titanic.sql +1379 -0
  97. package/docs/superpowers/plans/2026-03-25-seed-connections.md +1362 -0
  98. package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +590 -0
  99. package/e2e/admin-dashboard.spec.ts +64 -0
  100. package/e2e/connection-management.spec.ts +58 -0
  101. package/e2e/export.spec.ts +34 -0
  102. package/e2e/login.spec.ts +85 -0
  103. package/e2e/query-execution.spec.ts +35 -0
  104. package/e2e/tab-management.spec.ts +64 -0
  105. package/eslint.config.mjs +28 -0
  106. package/fly.toml +43 -0
  107. package/next.config.ts +32 -0
  108. package/package.json +130 -0
  109. package/playwright.config.ts +34 -0
  110. package/postcss.config.mjs +7 -0
  111. package/public/favicon-32x32.png +0 -0
  112. package/public/favicon.ico +0 -0
  113. package/public/file.svg +1 -0
  114. package/public/globe.svg +1 -0
  115. package/public/logo.svg +32 -0
  116. package/public/next.svg +1 -0
  117. package/public/screenshots/code-generator.png +0 -0
  118. package/public/screenshots/connection-modal.png +0 -0
  119. package/public/screenshots/data-profiler.png +0 -0
  120. package/public/screenshots/erd-diagram.png +0 -0
  121. package/public/screenshots/hero-editor.png +0 -0
  122. package/public/screenshots/nl2sql.png +0 -0
  123. package/public/vercel.svg +1 -0
  124. package/public/window.svg +1 -0
  125. package/render.yaml +58 -0
  126. package/scripts/merge-lcov.mjs +239 -0
  127. package/sonar-project.properties +16 -0
  128. package/src/app/admin/error.tsx +46 -0
  129. package/src/app/admin/page.tsx +10 -0
  130. package/src/app/api/admin/audit/route.ts +52 -0
  131. package/src/app/api/admin/fleet-health/route.ts +81 -0
  132. package/src/app/api/ai/autopilot/route.ts +105 -0
  133. package/src/app/api/ai/chat/route.ts +132 -0
  134. package/src/app/api/ai/describe-schema/route.ts +52 -0
  135. package/src/app/api/ai/explain/route.ts +86 -0
  136. package/src/app/api/ai/impact/route.ts +97 -0
  137. package/src/app/api/ai/index-advisor/route.ts +98 -0
  138. package/src/app/api/ai/nl2sql/route.ts +87 -0
  139. package/src/app/api/ai/query-safety/route.ts +87 -0
  140. package/src/app/api/auth/login/route.ts +62 -0
  141. package/src/app/api/auth/logout/route.ts +25 -0
  142. package/src/app/api/auth/me/route.ts +10 -0
  143. package/src/app/api/auth/oidc/callback/route.ts +82 -0
  144. package/src/app/api/auth/oidc/login/route.ts +43 -0
  145. package/src/app/api/connections/managed/route.ts +35 -0
  146. package/src/app/api/db/cancel/route.ts +42 -0
  147. package/src/app/api/db/disconnect/route.ts +28 -0
  148. package/src/app/api/db/health/route.ts +49 -0
  149. package/src/app/api/db/maintenance/route.ts +72 -0
  150. package/src/app/api/db/monitoring/route.ts +62 -0
  151. package/src/app/api/db/multi-query/route.ts +116 -0
  152. package/src/app/api/db/pool-stats/route.ts +37 -0
  153. package/src/app/api/db/profile/route.ts +144 -0
  154. package/src/app/api/db/provider-meta/route.ts +49 -0
  155. package/src/app/api/db/query/route.ts +50 -0
  156. package/src/app/api/db/schema/route.ts +47 -0
  157. package/src/app/api/db/schema-snapshot/route.ts +42 -0
  158. package/src/app/api/db/test-connection/route.ts +55 -0
  159. package/src/app/api/db/transaction/route.ts +111 -0
  160. package/src/app/api/storage/[collection]/route.ts +67 -0
  161. package/src/app/api/storage/config/route.ts +17 -0
  162. package/src/app/api/storage/migrate/route.ts +45 -0
  163. package/src/app/api/storage/route.ts +32 -0
  164. package/src/app/error.tsx +49 -0
  165. package/src/app/global-error.tsx +55 -0
  166. package/src/app/globals.css +146 -0
  167. package/src/app/icon.svg +42 -0
  168. package/src/app/layout.tsx +34 -0
  169. package/src/app/login/login-form.tsx +301 -0
  170. package/src/app/login/page.tsx +11 -0
  171. package/src/app/monitoring/page.tsx +8 -0
  172. package/src/app/not-found.tsx +29 -0
  173. package/src/app/page.tsx +5 -0
  174. package/src/components/AIAutopilotPanel.tsx +238 -0
  175. package/src/components/CodeGenerator.tsx +271 -0
  176. package/src/components/CommandPalette.tsx +227 -0
  177. package/src/components/ConnectionModal.tsx +759 -0
  178. package/src/components/CreateTableModal.tsx +281 -0
  179. package/src/components/DataCharts.tsx +962 -0
  180. package/src/components/DataImportModal.tsx +582 -0
  181. package/src/components/DataProfiler.tsx +335 -0
  182. package/src/components/DatabaseDocs.tsx +251 -0
  183. package/src/components/MaskingSettings.tsx +414 -0
  184. package/src/components/MobileNav.tsx +50 -0
  185. package/src/components/NL2SQLPanel.tsx +281 -0
  186. package/src/components/PivotTable.tsx +257 -0
  187. package/src/components/QueryEditor.tsx +760 -0
  188. package/src/components/QueryHistory.tsx +344 -0
  189. package/src/components/QuerySafetyDialog.tsx +290 -0
  190. package/src/components/ResultsGrid.tsx +644 -0
  191. package/src/components/SaveQueryModal.tsx +104 -0
  192. package/src/components/SavedQueries.tsx +128 -0
  193. package/src/components/SchemaDiagram.tsx +473 -0
  194. package/src/components/SchemaDiff.tsx +473 -0
  195. package/src/components/SnapshotTimeline.tsx +116 -0
  196. package/src/components/Studio.tsx +639 -0
  197. package/src/components/TestDataGenerator.tsx +261 -0
  198. package/src/components/VisualExplain.tsx +820 -0
  199. package/src/components/admin/AdminDashboard.tsx +163 -0
  200. package/src/components/admin/tabs/AuditTab.tsx +531 -0
  201. package/src/components/admin/tabs/MonitoringEmbed.tsx +11 -0
  202. package/src/components/admin/tabs/OperationsTab.tsx +646 -0
  203. package/src/components/admin/tabs/OverviewTab.tsx +1328 -0
  204. package/src/components/admin/tabs/SecurityTab.tsx +284 -0
  205. package/src/components/community-section.tsx +92 -0
  206. package/src/components/icons/db-icons.tsx +84 -0
  207. package/src/components/libredb-logo.tsx +61 -0
  208. package/src/components/monitoring/MonitoringDashboard.tsx +345 -0
  209. package/src/components/monitoring/tabs/MetricChart.tsx +82 -0
  210. package/src/components/monitoring/tabs/OverviewTab.tsx +263 -0
  211. package/src/components/monitoring/tabs/PerformanceTab.tsx +254 -0
  212. package/src/components/monitoring/tabs/PoolTab.tsx +174 -0
  213. package/src/components/monitoring/tabs/QueriesTab.tsx +287 -0
  214. package/src/components/monitoring/tabs/SessionsTab.tsx +316 -0
  215. package/src/components/monitoring/tabs/StorageTab.tsx +335 -0
  216. package/src/components/monitoring/tabs/TablesTab.tsx +300 -0
  217. package/src/components/results-grid/ResultCard.tsx +111 -0
  218. package/src/components/results-grid/RowDetailSheet.tsx +178 -0
  219. package/src/components/results-grid/StatsBar.tsx +201 -0
  220. package/src/components/results-grid/index.ts +1 -0
  221. package/src/components/results-grid/utils.ts +23 -0
  222. package/src/components/schema-explorer/ColumnList.tsx +53 -0
  223. package/src/components/schema-explorer/SchemaExplorer.tsx +182 -0
  224. package/src/components/schema-explorer/TableItem.tsx +210 -0
  225. package/src/components/schema-explorer/index.ts +1 -0
  226. package/src/components/sidebar/ConnectionItem.tsx +105 -0
  227. package/src/components/sidebar/ConnectionsList.tsx +62 -0
  228. package/src/components/sidebar/Sidebar.tsx +130 -0
  229. package/src/components/sidebar/index.ts +2 -0
  230. package/src/components/studio/BottomPanel.tsx +286 -0
  231. package/src/components/studio/QueryToolbar.tsx +180 -0
  232. package/src/components/studio/StudioDesktopHeader.tsx +114 -0
  233. package/src/components/studio/StudioMobileHeader.tsx +340 -0
  234. package/src/components/studio/StudioTabBar.tsx +82 -0
  235. package/src/components/studio/index.ts +5 -0
  236. package/src/components/ui/accordion.tsx +66 -0
  237. package/src/components/ui/alert-dialog.tsx +157 -0
  238. package/src/components/ui/alert.tsx +66 -0
  239. package/src/components/ui/aspect-ratio.tsx +11 -0
  240. package/src/components/ui/avatar.tsx +53 -0
  241. package/src/components/ui/badge.tsx +46 -0
  242. package/src/components/ui/breadcrumb.tsx +109 -0
  243. package/src/components/ui/button-group.tsx +83 -0
  244. package/src/components/ui/button.tsx +60 -0
  245. package/src/components/ui/calendar.tsx +216 -0
  246. package/src/components/ui/card.tsx +92 -0
  247. package/src/components/ui/carousel.tsx +241 -0
  248. package/src/components/ui/chart.tsx +357 -0
  249. package/src/components/ui/checkbox.tsx +32 -0
  250. package/src/components/ui/collapsible.tsx +33 -0
  251. package/src/components/ui/command.tsx +184 -0
  252. package/src/components/ui/context-menu.tsx +252 -0
  253. package/src/components/ui/dialog.tsx +143 -0
  254. package/src/components/ui/drawer.tsx +135 -0
  255. package/src/components/ui/dropdown-menu.tsx +257 -0
  256. package/src/components/ui/empty.tsx +104 -0
  257. package/src/components/ui/field.tsx +248 -0
  258. package/src/components/ui/form.tsx +167 -0
  259. package/src/components/ui/hover-card.tsx +44 -0
  260. package/src/components/ui/input-group.tsx +170 -0
  261. package/src/components/ui/input-otp.tsx +77 -0
  262. package/src/components/ui/input.tsx +21 -0
  263. package/src/components/ui/item.tsx +193 -0
  264. package/src/components/ui/kbd.tsx +28 -0
  265. package/src/components/ui/label.tsx +24 -0
  266. package/src/components/ui/menubar.tsx +276 -0
  267. package/src/components/ui/navigation-menu.tsx +168 -0
  268. package/src/components/ui/pagination.tsx +127 -0
  269. package/src/components/ui/popover.tsx +48 -0
  270. package/src/components/ui/progress.tsx +31 -0
  271. package/src/components/ui/radio-group.tsx +45 -0
  272. package/src/components/ui/resizable.tsx +56 -0
  273. package/src/components/ui/scroll-area.tsx +58 -0
  274. package/src/components/ui/select.tsx +187 -0
  275. package/src/components/ui/separator.tsx +28 -0
  276. package/src/components/ui/sheet.tsx +139 -0
  277. package/src/components/ui/sidebar.tsx +726 -0
  278. package/src/components/ui/skeleton.tsx +13 -0
  279. package/src/components/ui/slider.tsx +63 -0
  280. package/src/components/ui/sonner.tsx +40 -0
  281. package/src/components/ui/spinner.tsx +16 -0
  282. package/src/components/ui/switch.tsx +31 -0
  283. package/src/components/ui/table.tsx +116 -0
  284. package/src/components/ui/tabs.tsx +66 -0
  285. package/src/components/ui/textarea.tsx +18 -0
  286. package/src/components/ui/toggle-group.tsx +83 -0
  287. package/src/components/ui/toggle.tsx +47 -0
  288. package/src/components/ui/tooltip.tsx +61 -0
  289. package/src/exports/components.ts +15 -0
  290. package/src/exports/index.ts +4 -0
  291. package/src/exports/providers.ts +4 -0
  292. package/src/exports/types.ts +26 -0
  293. package/src/hooks/use-ai-chat.ts +182 -0
  294. package/src/hooks/use-all-connections.ts +66 -0
  295. package/src/hooks/use-api-call.ts +71 -0
  296. package/src/hooks/use-auth.ts +51 -0
  297. package/src/hooks/use-connection-form.ts +349 -0
  298. package/src/hooks/use-connection-manager.ts +169 -0
  299. package/src/hooks/use-connection-payload.ts +15 -0
  300. package/src/hooks/use-inline-editing.ts +109 -0
  301. package/src/hooks/use-mobile.ts +20 -0
  302. package/src/hooks/use-monitoring-data.ts +270 -0
  303. package/src/hooks/use-provider-metadata.ts +62 -0
  304. package/src/hooks/use-query-execution.ts +478 -0
  305. package/src/hooks/use-storage-sync.ts +259 -0
  306. package/src/hooks/use-tab-manager.ts +231 -0
  307. package/src/hooks/use-toast.ts +20 -0
  308. package/src/hooks/use-transaction-control.ts +64 -0
  309. package/src/lib/api/error-codes.ts +30 -0
  310. package/src/lib/api/errors.ts +236 -0
  311. package/src/lib/api/with-error-handler.ts +41 -0
  312. package/src/lib/audit.ts +105 -0
  313. package/src/lib/auth.ts +87 -0
  314. package/src/lib/connection-string-parser.ts +172 -0
  315. package/src/lib/data-masking.ts +385 -0
  316. package/src/lib/db/base-provider.ts +325 -0
  317. package/src/lib/db/errors.ts +317 -0
  318. package/src/lib/db/factory.ts +324 -0
  319. package/src/lib/db/index.ts +123 -0
  320. package/src/lib/db/providers/document/index.ts +6 -0
  321. package/src/lib/db/providers/document/mongodb.ts +992 -0
  322. package/src/lib/db/providers/keyvalue/redis.ts +554 -0
  323. package/src/lib/db/providers/sql/index.ts +11 -0
  324. package/src/lib/db/providers/sql/mssql.ts +1065 -0
  325. package/src/lib/db/providers/sql/mysql.ts +978 -0
  326. package/src/lib/db/providers/sql/oracle.ts +1044 -0
  327. package/src/lib/db/providers/sql/postgres.ts +1179 -0
  328. package/src/lib/db/providers/sql/sql-base.ts +174 -0
  329. package/src/lib/db/providers/sql/sqlite.ts +721 -0
  330. package/src/lib/db/types.ts +437 -0
  331. package/src/lib/db/utils/pool-manager.ts +287 -0
  332. package/src/lib/db/utils/query-limiter.ts +239 -0
  333. package/src/lib/db-ui-config.ts +86 -0
  334. package/src/lib/editor/mongodb-completions.ts +172 -0
  335. package/src/lib/editor/sql-completions.ts +280 -0
  336. package/src/lib/llm/base-provider.ts +117 -0
  337. package/src/lib/llm/factory.ts +102 -0
  338. package/src/lib/llm/index.ts +90 -0
  339. package/src/lib/llm/providers/custom.ts +181 -0
  340. package/src/lib/llm/providers/gemini.ts +126 -0
  341. package/src/lib/llm/providers/ollama.ts +154 -0
  342. package/src/lib/llm/providers/openai.ts +146 -0
  343. package/src/lib/llm/types.ts +173 -0
  344. package/src/lib/llm/utils/config.ts +187 -0
  345. package/src/lib/llm/utils/retry.ts +119 -0
  346. package/src/lib/llm/utils/streaming.ts +202 -0
  347. package/src/lib/logger.ts +127 -0
  348. package/src/lib/monitoring-thresholds.ts +44 -0
  349. package/src/lib/oidc.ts +262 -0
  350. package/src/lib/query-generators.ts +61 -0
  351. package/src/lib/schema-diff/diff-engine.ts +273 -0
  352. package/src/lib/schema-diff/migration-generator.ts +208 -0
  353. package/src/lib/schema-diff/types.ts +55 -0
  354. package/src/lib/seed/config-loader.ts +79 -0
  355. package/src/lib/seed/connection-filter.ts +49 -0
  356. package/src/lib/seed/credential-resolver.ts +62 -0
  357. package/src/lib/seed/index.ts +40 -0
  358. package/src/lib/seed/resolve-connection.ts +57 -0
  359. package/src/lib/seed/types.ts +69 -0
  360. package/src/lib/sql/alias-extractor.ts +267 -0
  361. package/src/lib/sql/index.ts +8 -0
  362. package/src/lib/sql/statement-splitter.ts +167 -0
  363. package/src/lib/sql/types.ts +40 -0
  364. package/src/lib/ssh/tunnel.ts +142 -0
  365. package/src/lib/storage/factory.ts +84 -0
  366. package/src/lib/storage/index.ts +14 -0
  367. package/src/lib/storage/local-storage.ts +99 -0
  368. package/src/lib/storage/providers/postgres.ts +225 -0
  369. package/src/lib/storage/providers/sqlite.ts +153 -0
  370. package/src/lib/storage/storage-facade.ts +272 -0
  371. package/src/lib/storage/types.ts +75 -0
  372. package/src/lib/time-series-buffer.ts +58 -0
  373. package/src/lib/types.ts +173 -0
  374. package/src/lib/utils.ts +6 -0
  375. package/src/proxy.ts +104 -0
  376. package/src/types/db-drivers.d.ts +23 -0
  377. package/src/types/html2canvas.d.ts +9 -0
  378. package/tests/api/admin/audit.test.ts +178 -0
  379. package/tests/api/admin/fleet-health.test.ts +183 -0
  380. package/tests/api/ai/autopilot.test.ts +174 -0
  381. package/tests/api/ai/chat.test.ts +250 -0
  382. package/tests/api/ai/describe-schema.test.ts +266 -0
  383. package/tests/api/ai/explain.test.ts +199 -0
  384. package/tests/api/ai/impact.test.ts +168 -0
  385. package/tests/api/ai/index-advisor.test.ts +171 -0
  386. package/tests/api/ai/nl2sql.test.ts +202 -0
  387. package/tests/api/ai/query-safety.test.ts +196 -0
  388. package/tests/api/auth/login.test.ts +170 -0
  389. package/tests/api/auth/logout.test.ts +140 -0
  390. package/tests/api/auth/me.test.ts +73 -0
  391. package/tests/api/auth/oidc-callback.test.ts +215 -0
  392. package/tests/api/auth/oidc-login.test.ts +127 -0
  393. package/tests/api/db/cancel.test.ts +198 -0
  394. package/tests/api/db/disconnect.test.ts +124 -0
  395. package/tests/api/db/health.test.ts +222 -0
  396. package/tests/api/db/maintenance.test.ts +263 -0
  397. package/tests/api/db/monitoring.test.ts +221 -0
  398. package/tests/api/db/multi-query.test.ts +316 -0
  399. package/tests/api/db/pool-stats.test.ts +135 -0
  400. package/tests/api/db/profile.test.ts +330 -0
  401. package/tests/api/db/provider-meta.test.ts +193 -0
  402. package/tests/api/db/query.test.ts +314 -0
  403. package/tests/api/db/schema-snapshot.test.ts +170 -0
  404. package/tests/api/db/schema.test.ts +191 -0
  405. package/tests/api/db/test-connection.test.ts +185 -0
  406. package/tests/api/db/transaction.test.ts +314 -0
  407. package/tests/api/proxy.test.ts +191 -0
  408. package/tests/api/seed/managed-route.test.ts +113 -0
  409. package/tests/api/storage/config.test.ts +42 -0
  410. package/tests/api/storage/storage-routes.test.ts +309 -0
  411. package/tests/components/AIAutopilotPanel.test.tsx +756 -0
  412. package/tests/components/AdminPage.test.tsx +33 -0
  413. package/tests/components/CodeGenerator.test.tsx +182 -0
  414. package/tests/components/CommandPalette.test.tsx +428 -0
  415. package/tests/components/CommunitySection.test.tsx +91 -0
  416. package/tests/components/ConnectionModal.mobile.test.tsx +284 -0
  417. package/tests/components/ConnectionModal.test.tsx +570 -0
  418. package/tests/components/CreateTableModal.test.tsx +383 -0
  419. package/tests/components/DataCharts.test.tsx +739 -0
  420. package/tests/components/DataImportModal.test.tsx +751 -0
  421. package/tests/components/DataProfiler.test.tsx +589 -0
  422. package/tests/components/DatabaseDocs.test.tsx +353 -0
  423. package/tests/components/LoginPage.test.tsx +163 -0
  424. package/tests/components/LoginPageOIDC.test.tsx +92 -0
  425. package/tests/components/MaskingSettings.test.tsx +498 -0
  426. package/tests/components/MobileNav.test.tsx +30 -0
  427. package/tests/components/MonitoringPage.test.tsx +32 -0
  428. package/tests/components/NL2SQLPanel.test.tsx +621 -0
  429. package/tests/components/Page.test.tsx +33 -0
  430. package/tests/components/PivotTable.test.tsx +350 -0
  431. package/tests/components/QueryEditor.test.tsx +1730 -0
  432. package/tests/components/QueryHistory.test.tsx +572 -0
  433. package/tests/components/QuerySafetyDialog.test.tsx +586 -0
  434. package/tests/components/ResultsGrid.test.tsx +804 -0
  435. package/tests/components/RootLayout.test.tsx +83 -0
  436. package/tests/components/SaveQueryModal.test.tsx +25 -0
  437. package/tests/components/SavedQueries.test.tsx +43 -0
  438. package/tests/components/SchemaDiagram.test.tsx +1034 -0
  439. package/tests/components/SchemaDiff.test.tsx +906 -0
  440. package/tests/components/SnapshotTimeline.test.tsx +174 -0
  441. package/tests/components/Studio.test.tsx +1030 -0
  442. package/tests/components/TestDataGenerator.test.tsx +291 -0
  443. package/tests/components/VisualExplain.test.tsx +704 -0
  444. package/tests/components/admin/AdminDashboard.test.tsx +205 -0
  445. package/tests/components/admin/AuditTab.test.tsx +220 -0
  446. package/tests/components/admin/MonitoringEmbed.test.tsx +58 -0
  447. package/tests/components/admin/OperationsTab.test.tsx +975 -0
  448. package/tests/components/admin/OverviewTab.test.tsx +254 -0
  449. package/tests/components/admin/SecurityTab.test.tsx +467 -0
  450. package/tests/components/monitoring/MetricChart.test.tsx +111 -0
  451. package/tests/components/monitoring/MonitoringDashboard.test.tsx +259 -0
  452. package/tests/components/monitoring/OverviewTab.test.tsx +78 -0
  453. package/tests/components/monitoring/PerformanceTab.test.tsx +87 -0
  454. package/tests/components/monitoring/PoolTab.test.tsx +42 -0
  455. package/tests/components/monitoring/QueriesTab.test.tsx +80 -0
  456. package/tests/components/monitoring/SessionsTab.test.tsx +154 -0
  457. package/tests/components/monitoring/StorageTab.test.tsx +127 -0
  458. package/tests/components/monitoring/TablesTab.test.tsx +153 -0
  459. package/tests/components/results-grid/ResultCard.test.tsx +105 -0
  460. package/tests/components/results-grid/RowDetailSheet.test.tsx +308 -0
  461. package/tests/components/results-grid/StatsBar.test.tsx +162 -0
  462. package/tests/components/schema-explorer/ColumnList.test.tsx +151 -0
  463. package/tests/components/schema-explorer/SchemaExplorer.test.tsx +461 -0
  464. package/tests/components/schema-explorer/TableItem.test.tsx +415 -0
  465. package/tests/components/sidebar/ConnectionItem.test.tsx +201 -0
  466. package/tests/components/sidebar/ConnectionsList.test.tsx +176 -0
  467. package/tests/components/sidebar/Sidebar.test.tsx +187 -0
  468. package/tests/components/studio/BottomPanel.test.tsx +383 -0
  469. package/tests/components/studio/QueryToolbar.test.tsx +321 -0
  470. package/tests/components/studio/StudioDesktopHeader.test.tsx +377 -0
  471. package/tests/components/studio/StudioMobileHeader.test.tsx +198 -0
  472. package/tests/components/studio/StudioTabBar.test.tsx +331 -0
  473. package/tests/fixtures/connections.ts +96 -0
  474. package/tests/fixtures/masking-configs.ts +86 -0
  475. package/tests/fixtures/query-results.ts +71 -0
  476. package/tests/fixtures/schemas.ts +64 -0
  477. package/tests/fixtures/seed-connections/invalid-config.yaml +7 -0
  478. package/tests/fixtures/seed-connections/minimal-config.yaml +8 -0
  479. package/tests/fixtures/seed-connections/mixed-credentials.yaml +23 -0
  480. package/tests/fixtures/seed-connections/multi-role-config.yaml +30 -0
  481. package/tests/fixtures/seed-connections/valid-config.json +15 -0
  482. package/tests/fixtures/seed-connections/valid-config.yaml +51 -0
  483. package/tests/helpers/mock-fetch.ts +59 -0
  484. package/tests/helpers/mock-monaco.ts +112 -0
  485. package/tests/helpers/mock-navigation.ts +28 -0
  486. package/tests/helpers/mock-next.ts +80 -0
  487. package/tests/helpers/mock-provider.ts +133 -0
  488. package/tests/helpers/mock-sonner.ts +29 -0
  489. package/tests/helpers/render-with-providers.tsx +19 -0
  490. package/tests/hooks/use-ai-chat.test.ts +600 -0
  491. package/tests/hooks/use-auth.test.ts +371 -0
  492. package/tests/hooks/use-connection-form.test.ts +743 -0
  493. package/tests/hooks/use-connection-manager.test.ts +466 -0
  494. package/tests/hooks/use-inline-editing.test.ts +321 -0
  495. package/tests/hooks/use-mobile.test.ts +177 -0
  496. package/tests/hooks/use-monitoring-data.test.ts +819 -0
  497. package/tests/hooks/use-provider-metadata.test.ts +228 -0
  498. package/tests/hooks/use-query-execution.test.ts +1212 -0
  499. package/tests/hooks/use-tab-manager.test.ts +756 -0
  500. package/tests/hooks/use-toast.test.ts +74 -0
  501. package/tests/hooks/use-transaction-control.test.ts +211 -0
  502. package/tests/integration/db/mongodb-provider.test.ts +698 -0
  503. package/tests/integration/db/mssql-provider.test.ts +840 -0
  504. package/tests/integration/db/mysql-provider.test.ts +872 -0
  505. package/tests/integration/db/oracle-provider.test.ts +843 -0
  506. package/tests/integration/db/postgres-provider.test.ts +1382 -0
  507. package/tests/integration/db/redis-provider.test.ts +526 -0
  508. package/tests/integration/db/sqlite-provider.test.ts +480 -0
  509. package/tests/integration/seed/seed-pipeline.test.ts +102 -0
  510. package/tests/isolated/factory-singleton.test.ts +150 -0
  511. package/tests/isolated/use-storage-sync.test.ts +389 -0
  512. package/tests/run-components.sh +196 -0
  513. package/tests/setup-dom.ts +58 -0
  514. package/tests/setup.ts +40 -0
  515. package/tests/unit/api-errors.test.ts +210 -0
  516. package/tests/unit/code-generator-functions.test.ts +271 -0
  517. package/tests/unit/components/column-list.test.tsx +190 -0
  518. package/tests/unit/components/data-import-modal.test.tsx +441 -0
  519. package/tests/unit/components/studio-mobile-header.test.tsx +327 -0
  520. package/tests/unit/data-charts-functions.test.ts +496 -0
  521. package/tests/unit/data-import-functions.test.ts +320 -0
  522. package/tests/unit/data-import-utils.test.ts +125 -0
  523. package/tests/unit/db/base-provider.test.ts +517 -0
  524. package/tests/unit/db/errors.test.ts +403 -0
  525. package/tests/unit/db/factory.test.ts +436 -0
  526. package/tests/unit/db/pool-manager.test.ts +440 -0
  527. package/tests/unit/db/query-limiter.test.ts +387 -0
  528. package/tests/unit/db/sql-base.test.ts +438 -0
  529. package/tests/unit/lib/api/error-codes.test.ts +39 -0
  530. package/tests/unit/lib/audit.test.ts +326 -0
  531. package/tests/unit/lib/auth.test.ts +146 -0
  532. package/tests/unit/lib/connection-string-parser.test.ts +424 -0
  533. package/tests/unit/lib/data-masking.test.ts +583 -0
  534. package/tests/unit/lib/db-icons.test.tsx +41 -0
  535. package/tests/unit/lib/monitoring-thresholds.test.ts +133 -0
  536. package/tests/unit/lib/oidc.test.ts +509 -0
  537. package/tests/unit/lib/query-generators.test.ts +127 -0
  538. package/tests/unit/lib/storage/factory.test.ts +71 -0
  539. package/tests/unit/lib/storage/local-storage.test.ts +114 -0
  540. package/tests/unit/lib/storage/providers/postgres.test.ts +312 -0
  541. package/tests/unit/lib/storage/providers/sqlite.test.ts +232 -0
  542. package/tests/unit/lib/storage/storage-facade-extended.test.ts +331 -0
  543. package/tests/unit/lib/storage/storage-facade.test.ts +184 -0
  544. package/tests/unit/lib/storage.test.ts +317 -0
  545. package/tests/unit/lib/time-series-buffer.test.ts +212 -0
  546. package/tests/unit/lib/utils.test.ts +24 -0
  547. package/tests/unit/llm/base-provider.test.ts +238 -0
  548. package/tests/unit/llm/config.test.ts +262 -0
  549. package/tests/unit/llm/custom-provider.test.ts +281 -0
  550. package/tests/unit/llm/gemini-provider.test.ts +248 -0
  551. package/tests/unit/llm/llm-factory.test.ts +155 -0
  552. package/tests/unit/llm/ollama-provider.test.ts +288 -0
  553. package/tests/unit/llm/openai-provider.test.ts +324 -0
  554. package/tests/unit/llm/retry.test.ts +180 -0
  555. package/tests/unit/llm/streaming.test.ts +355 -0
  556. package/tests/unit/logger.test.ts +198 -0
  557. package/tests/unit/mongodb-completions.test.ts +516 -0
  558. package/tests/unit/pivot-table-functions.test.ts +76 -0
  559. package/tests/unit/query-cancelled-error.test.ts +81 -0
  560. package/tests/unit/schema-diff/diff-engine.test.ts +367 -0
  561. package/tests/unit/schema-diff/migration-generator.test.ts +513 -0
  562. package/tests/unit/seed/config-loader.test.ts +73 -0
  563. package/tests/unit/seed/connection-filter.test.ts +91 -0
  564. package/tests/unit/seed/credential-resolver.test.ts +85 -0
  565. package/tests/unit/seed/index.test.ts +72 -0
  566. package/tests/unit/seed/resolve-connection.test.ts +74 -0
  567. package/tests/unit/seed/types.test.ts +129 -0
  568. package/tests/unit/sql/alias-extractor.test.ts +444 -0
  569. package/tests/unit/sql/statement-splitter.test.ts +348 -0
  570. package/tests/unit/sql-completions.test.ts +463 -0
  571. package/tests/unit/ssh-tunnel.test.ts +465 -0
  572. package/tsconfig.json +42 -0
@@ -0,0 +1,127 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(grep:*)",
5
+ "Bash(find:*)",
6
+ "Bash(xargs:*)",
7
+ "Bash(bun run lint:*)",
8
+ "Bash(npx tsc:*)",
9
+ "Bash(bun run build:*)",
10
+ "Bash(bun add:*)",
11
+ "Bash(bun create:*)",
12
+ "Bash(bun remove:*)",
13
+ "Bash(ls:*)",
14
+ "Bash(bun pm ls:*)",
15
+ "Bash(npm ls:*)",
16
+ "Bash(npm audit:*)",
17
+ "Bash(docker network:*)",
18
+ "Bash(docker ps:*)",
19
+ "Bash(docker build:*)",
20
+ "Bash(.)",
21
+ "Bash(docker rm:*)",
22
+ "Bash(docker run:*)",
23
+ "Bash(libredb-studio:test)",
24
+ "Bash(curl:*)",
25
+ "WebFetch(domain:ui.shadcn.com)",
26
+ "WebFetch(domain:www.shadcnblocks.com)",
27
+ "Bash(PGPASSWORD='npg_qMrKIcQ0X6hn' psql:*)",
28
+ "Bash(PGPASSWORD='readonly_secure_pass_2024' psql:*)",
29
+ "Bash(docker logs:*)",
30
+ "Bash(docker stop:*)",
31
+ "Bash(libredb-test:*)",
32
+ "Bash(PGPASSWORD='npg_qMrKIcQ0X6hn' psql -h ep-falling-morning-ag8brons-pooler.c-2.eu-central-1.aws.neon.tech -U neondb_owner -d employees -c \"\nSELECT table_name\nFROM information_schema.tables\nWHERE table_schema = ''employees''\nORDER BY table_name;\n\")",
33
+ "mcp__ide__getDiagnostics",
34
+ "Bash(lsof:*)",
35
+ "WebFetch(domain:github.com)",
36
+ "Bash(claude mcp add:*)",
37
+ "mcp__playwright",
38
+ "WebSearch",
39
+ "Bash(wc:*)",
40
+ "Bash(fuser:*)",
41
+ "Bash(pkill:*)",
42
+ "Bash(npm run build:*)",
43
+ "Bash(source:*)",
44
+ "Bash(echo $ADMIN_PASSWORD)",
45
+ "Bash(echo $USER_PASSWORD)",
46
+ "Bash(mysql:*)",
47
+ "Bash(bun dev)",
48
+ "Bash(echo:*)",
49
+ "Bash(git -C /home/cevheri/projects/cevheribozoglan/libredb-studio status)",
50
+ "Bash(git -C /home/cevheri/projects/cevheribozoglan/libredb-studio diff --stat)",
51
+ "Bash(git -C /home/cevheri/projects/cevheribozoglan/libredb-studio log --oneline -5)",
52
+ "Bash(git -C /home/cevheri/projects/cevheribozoglan/libredb-studio diff src/components/Studio.tsx src/components/monitoring/MonitoringDashboard.tsx src/lib/db/providers/sql/mysql.ts src/lib/storage.ts)",
53
+ "Bash(docker exec:*)",
54
+ "Bash(docker compose:*)",
55
+ "Bash(PGPASSWORD=postgres psql:*)",
56
+ "Bash(bun --version:*)",
57
+ "Bash(bun test:*)",
58
+ "Bash(bun -e:*)",
59
+ "Bash(node:*)",
60
+ "Bash(while read f)",
61
+ "Bash(do)",
62
+ "Bash(if ! grep -q 'cleanup' \"$f\")",
63
+ "Bash(then)",
64
+ "Bash(fi)",
65
+ "Bash(done)",
66
+ "Bash(/home/cevheri/projects/cevheribozoglan/libredb-studio/tests/_debug-screen.test.tsx:*)",
67
+ "Bash(__NEW_LINE_b497933af27a2c60__ bun test tests/_debug-screen.test.tsx)",
68
+ "Bash(# Test::*)",
69
+ "Bash(git stash:*)",
70
+ "Bash(tests/_debug_tabs.test.tsx:*)",
71
+ "Bash(bun run test:*)",
72
+ "Bash(bun run:*)",
73
+ "Bash(bunx playwright install:*)",
74
+ "Bash(bunx playwright test:*)",
75
+ "Bash(npx eslint:*)",
76
+ "Bash(bunx eslint:*)",
77
+ "Bash(chmod:*)",
78
+ "Bash(bash tests/run-components.sh)",
79
+ "Bash(gh run list:*)",
80
+ "Bash(bash)",
81
+ "Bash(~/.bun/bin/bun:*)",
82
+ "Bash(tar:*)",
83
+ "Bash(/tmp/gh_2.65.0_linux_amd64/bin/gh:*)",
84
+ "Bash(cat:*)",
85
+ "Bash(for i in 1 2 3)",
86
+ "Bash(do echo \"=== Run $i ===\")",
87
+ "Bash(genhtml:*)",
88
+ "Bash(/tmp/debug-schema-diff.tsx:*)",
89
+ "Bash(python3:*)",
90
+ "Bash(/tmp/test-login-debug.tsx:*)",
91
+ "Bash(/home/cevheri/projects/cevheribozoglan/libredb-studio/tests/_debug_login.tsx:*)",
92
+ "Bash(/tmp/bad-test.test.ts:*)",
93
+ "Bash(bunx tsc:*)",
94
+ "WebFetch(domain:registry.npmjs.org)",
95
+ "WebFetch(domain:libredb.eu.auth0.com)",
96
+ "Bash(psql:*)",
97
+ "WebFetch(domain:railway.com)",
98
+ "WebFetch(domain:render.com)",
99
+ "WebFetch(domain:fly.io)",
100
+ "WebFetch(domain:coolify.io)",
101
+ "WebFetch(domain:northflank.com)",
102
+ "WebFetch(domain:www.koyeb.com)",
103
+ "WebFetch(domain:zeabur.com)",
104
+ "WebFetch(domain:www.porter.run)",
105
+ "WebFetch(domain:www.digitalocean.com)",
106
+ "WebFetch(domain:aws.amazon.com)",
107
+ "WebFetch(domain:sliplane.io)",
108
+ "WebFetch(domain:neon.com)",
109
+ "WebFetch(domain:supabase.com)",
110
+ "WebFetch(domain:xata.io)",
111
+ "WebFetch(domain:www.tembo.io)",
112
+ "WebFetch(domain:docs.digitalocean.com)",
113
+ "WebFetch(domain:planetscale.com)",
114
+ "WebFetch(domain:azure.microsoft.com)",
115
+ "WebFetch(domain:developers.cloudflare.com)",
116
+ "WebFetch(domain:www.analyticsvidhya.com)",
117
+ "Bash(unzip:*)",
118
+ "WebFetch(domain:helm.sh)",
119
+ "WebFetch(domain:artifacthub.io)",
120
+ "WebFetch(domain:libredb.org)"
121
+ ]
122
+ },
123
+ "enableAllProjectMcpServers": true,
124
+ "enabledMcpjsonServers": [
125
+ "playwright"
126
+ ]
127
+ }
package/.cursorrules ADDED
@@ -0,0 +1,426 @@
1
+ # LibreDB Studio - Cursor Rules
2
+
3
+ This file provides comprehensive guidance for AI assistants and developers working on LibreDB Studio. Follow these rules to maintain code quality, consistency, and architectural integrity.
4
+
5
+ ## Project Overview
6
+
7
+ LibreDB Studio is a modern, AI-powered, open-source SQL IDE for cloud-native teams. It provides a web-based interface for managing PostgreSQL, MySQL, SQLite, and MongoDB databases with features like AI-assisted query generation, visual schema exploration, and real-time monitoring.
8
+
9
+ **Key Characteristics:**
10
+ - Mobile-first, professional-always design philosophy
11
+ - Zero-install browser-based solution
12
+ - Multi-database support via Strategy Pattern
13
+ - AI-native with multi-model LLM support (Gemini, OpenAI, Ollama, Custom)
14
+ - Enterprise-grade with RBAC, query auditing, and health monitoring
15
+
16
+ ## Tech Stack
17
+
18
+ ### Core Framework
19
+ - **Next.js 15** (App Router) with React 19
20
+ - **TypeScript** (strict mode enabled)
21
+ - **Bun** (preferred runtime) or Node.js 20+
22
+ - **Tailwind CSS 4** with `@theme inline` theming
23
+ - **shadcn/ui** components (Radix UI primitives)
24
+
25
+ ### Key Libraries
26
+ - **Monaco Editor** - SQL editor (VS Code engine)
27
+ - **TanStack Table & Virtual** - Virtualized data grids
28
+ - **Framer Motion** - Animations
29
+ - **Jose** - JWT authentication
30
+ - **Zod** - Runtime type validation
31
+ - **React Hook Form** - Form management
32
+
33
+ ### Database Drivers
34
+ - PostgreSQL: `pg`
35
+ - MySQL: `mysql2`
36
+ - SQLite: `better-sqlite3` (via dynamic import)
37
+ - MongoDB: `mongodb`
38
+
39
+ ## Code Style & Conventions
40
+
41
+ ### TypeScript
42
+
43
+ - **Always use TypeScript** - No JavaScript files unless absolutely necessary
44
+ - **Strict mode** - TypeScript strict mode is enabled, respect it
45
+ - **Avoid `any`** - Use `unknown` or proper types instead. If `any` is unavoidable, add a comment explaining why
46
+ - **Explicit types** - Prefer explicit return types for functions, especially public APIs
47
+ - **Type imports** - Use `import type` for type-only imports
48
+ - **Interfaces over types** - Prefer `interface` for object shapes, use `type` for unions, intersections, and aliases
49
+
50
+ ```typescript
51
+ // ✅ Good
52
+ interface DatabaseConnection {
53
+ id: string;
54
+ name: string;
55
+ type: DatabaseType;
56
+ }
57
+
58
+ type DatabaseType = 'postgres' | 'mysql' | 'sqlite' | 'mongodb' | 'redis' | 'oracle' | 'mssql';
59
+
60
+ // ❌ Bad
61
+ type DatabaseConnection = {
62
+ id: string;
63
+ name: string;
64
+ }
65
+ ```
66
+
67
+ ### Naming Conventions
68
+
69
+ - **Files**: kebab-case for components (`query-editor.tsx`), PascalCase for components (`QueryEditor.tsx`)
70
+ - **Components**: PascalCase (`QueryEditor`, `Dashboard`)
71
+ - **Functions/Variables**: camelCase (`fetchUser`, `activeConnection`)
72
+ - **Constants**: UPPER_SNAKE_CASE (`DEFAULT_TIMEOUT`, `MAX_POOL_SIZE`)
73
+ - **Types/Interfaces**: PascalCase (`DatabaseConnection`, `QueryResult`)
74
+ - **Hooks**: camelCase starting with `use` (`useToast`, `useMonitoringData`)
75
+ - **API Routes**: kebab-case (`/api/db/query`, `/api/auth/login`)
76
+
77
+ ### React Patterns
78
+
79
+ - **Functional components only** - No class components
80
+ - **Hooks over HOCs** - Prefer custom hooks for shared logic
81
+ - **Server Components by default** - Use `"use client"` only when necessary (interactivity, hooks, browser APIs)
82
+ - **Component organization**:
83
+ ```typescript
84
+ // 1. Imports (external, then internal)
85
+ // 2. Types/Interfaces
86
+ // 3. Component
87
+ // 4. Exports
88
+ ```
89
+ - **Props destructuring** - Destructure props in function signature
90
+ - **Memoization** - Use `useMemo`/`useCallback` sparingly, only for expensive computations or stable references
91
+
92
+ ```typescript
93
+ // ✅ Good
94
+ export default function QueryEditor({ query, onChange }: QueryEditorProps) {
95
+ const handleChange = useCallback((value: string) => {
96
+ onChange(value);
97
+ }, [onChange]);
98
+
99
+ return <MonacoEditor value={query} onChange={handleChange} />;
100
+ }
101
+
102
+ // ❌ Bad
103
+ export default function QueryEditor(props: QueryEditorProps) {
104
+ return <MonacoEditor value={props.query} onChange={props.onChange} />;
105
+ }
106
+ ```
107
+
108
+ ### File Organization
109
+
110
+ ```
111
+ src/
112
+ ├── app/ # Next.js App Router
113
+ │ ├── api/ # API routes (REST endpoints)
114
+ │ ├── (pages)/ # Page components
115
+ │ └── layout.tsx # Root layout
116
+ ├── components/ # React components
117
+ │ ├── ui/ # shadcn/ui primitives
118
+ │ └── [Feature].tsx # Feature components
119
+ ├── hooks/ # Custom React hooks
120
+ ├── lib/ # Utilities and business logic
121
+ │ ├── db/ # Database providers (Strategy Pattern)
122
+ │ ├── llm/ # LLM providers (Strategy Pattern)
123
+ │ └── utils.ts # General utilities
124
+ └── types.ts # Shared TypeScript types
125
+ ```
126
+
127
+ ### Import Order
128
+
129
+ 1. External dependencies (React, Next.js, third-party)
130
+ 2. Internal absolute imports (`@/components`, `@/lib`)
131
+ 3. Relative imports (`./types`, `../utils`)
132
+ 4. Type-only imports last (if separate)
133
+
134
+ ```typescript
135
+ // ✅ Good
136
+ import { useState } from 'react';
137
+ import { NextRequest, NextResponse } from 'next/server';
138
+ import { Button } from '@/components/ui/button';
139
+ import { cn } from '@/lib/utils';
140
+ import type { DatabaseConnection } from '@/lib/types';
141
+ ```
142
+
143
+ ## Architecture Patterns
144
+
145
+ ### Strategy Pattern for Providers
146
+
147
+ Both database and LLM providers use the Strategy Pattern:
148
+
149
+ ```typescript
150
+ // Base interface
151
+ interface DatabaseProvider {
152
+ connect(): Promise<void>;
153
+ query(sql: string): Promise<QueryResult>;
154
+ disconnect(): Promise<void>;
155
+ }
156
+
157
+ // Implementation
158
+ class PostgresProvider extends SQLBaseProvider implements DatabaseProvider {
159
+ // Implementation
160
+ }
161
+
162
+ // Factory
163
+ export async function createDatabaseProvider(
164
+ connection: DatabaseConnection
165
+ ): Promise<DatabaseProvider> {
166
+ switch (connection.type) {
167
+ case 'postgres':
168
+ const { PostgresProvider } = await import('./providers/sql/postgres');
169
+ return new PostgresProvider(connection);
170
+ // ...
171
+ }
172
+ }
173
+ ```
174
+
175
+ **Key Points:**
176
+ - Use dynamic imports for providers to reduce initial bundle size
177
+ - All providers implement the same interface
178
+ - Factory function handles provider creation
179
+ - Cache providers for connection reuse
180
+
181
+ ### API Routes
182
+
183
+ - **Error handling** - Always use try-catch, return appropriate HTTP status codes
184
+ - **Type safety** - Validate request bodies with Zod when needed
185
+ - **Authentication** - Check JWT via middleware or `getUserFromRequest()`
186
+ - **Response format** - Consistent JSON structure: `{ data?, error?, code? }`
187
+
188
+ ```typescript
189
+ // ✅ Good
190
+ export async function POST(req: NextRequest) {
191
+ try {
192
+ const { connection, sql } = await req.json();
193
+
194
+ if (!connection || !sql) {
195
+ return NextResponse.json(
196
+ { error: 'Connection and SQL query are required' },
197
+ { status: 400 }
198
+ );
199
+ }
200
+
201
+ const provider = await getOrCreateProvider(connection);
202
+ const result = await provider.query(sql);
203
+
204
+ return NextResponse.json(result);
205
+ } catch (error) {
206
+ if (error instanceof QueryError) {
207
+ return NextResponse.json(
208
+ { error: error.message, code: error.code },
209
+ { status: 400 }
210
+ );
211
+ }
212
+ return NextResponse.json(
213
+ { error: 'Internal server error' },
214
+ { status: 500 }
215
+ );
216
+ }
217
+ }
218
+ ```
219
+
220
+ ### Error Handling
221
+
222
+ - **Custom error classes** - Use project-specific error types (`DatabaseError`, `QueryError`, `TimeoutError`)
223
+ - **Error boundaries** - Use React error boundaries for component-level errors
224
+ - **User-friendly messages** - Never expose internal errors to users
225
+ - **Logging** - Log errors with context: `console.error('[API:query] Error:', error)`
226
+
227
+ ```typescript
228
+ // ✅ Good
229
+ try {
230
+ await provider.query(sql);
231
+ } catch (error) {
232
+ if (error instanceof QueryError) {
233
+ // Handle query-specific error
234
+ } else if (isDatabaseError(error)) {
235
+ // Handle database error
236
+ } else {
237
+ // Handle unknown error
238
+ }
239
+ }
240
+ ```
241
+
242
+ ## Component Guidelines
243
+
244
+ ### shadcn/ui Components
245
+
246
+ - **Use existing components** - Check `src/components/ui/` before creating new ones
247
+ - **Composition over configuration** - Prefer component composition
248
+ - **Accessibility** - All components should be keyboard navigable and screen-reader friendly
249
+ - **Theming** - Use CSS variables for theming, defined in `globals.css`
250
+
251
+ ### Custom Components
252
+
253
+ - **Single responsibility** - One component, one purpose
254
+ - **Props interface** - Always define explicit props interface
255
+ - **Default exports** - Use default export for main component, named exports for sub-components
256
+ - **Documentation** - Add JSDoc comments for complex components
257
+
258
+ ```typescript
259
+ /**
260
+ * QueryEditor component - Monaco-based SQL editor
261
+ *
262
+ * @param query - Current SQL query text
263
+ * @param onChange - Callback when query changes
264
+ * @param onExecute - Callback when execute is triggered
265
+ */
266
+ export interface QueryEditorProps {
267
+ query: string;
268
+ onChange: (query: string) => void;
269
+ onExecute?: () => void;
270
+ }
271
+
272
+ export default function QueryEditor({ query, onChange, onExecute }: QueryEditorProps) {
273
+ // Implementation
274
+ }
275
+ ```
276
+
277
+ ## Database Provider Development
278
+
279
+ ### Adding a New Database Provider
280
+
281
+ 1. **Create provider class** in `src/lib/db/providers/[category]/[name].ts`
282
+ 2. **Extend base class** - `SQLBaseProvider` for SQL databases, `BaseDatabaseProvider` for others
283
+ 3. **Implement required methods** - `connect()`, `query()`, `disconnect()`, `getSchema()`
284
+ 4. **Add to factory** - Update `src/lib/db/factory.ts` with new case
285
+ 5. **Add types** - Update `DatabaseType` union in `src/lib/types.ts`
286
+ 6. **Handle errors** - Use appropriate error classes from `src/lib/db/errors.ts`
287
+
288
+ ### Connection Pooling
289
+
290
+ - **Use connection pools** - For SQL databases, always use connection pooling
291
+ - **Pool configuration** - Use `DEFAULT_POOL_CONFIG` or provide custom config
292
+ - **Cleanup** - Always disconnect and clear pools on errors or shutdown
293
+
294
+ ## LLM Provider Development
295
+
296
+ ### Adding a New LLM Provider
297
+
298
+ 1. **Create provider class** in `src/lib/llm/providers/[name].ts`
299
+ 2. **Extend `BaseLLMProvider`** - Implement `generate()` and `stream()` methods
300
+ 3. **Add to factory** - Update `src/lib/llm/factory.ts`
301
+ 4. **Add environment variables** - Document required env vars in README
302
+ 5. **Handle rate limits** - Implement retry logic with exponential backoff
303
+
304
+ ## Styling Guidelines
305
+
306
+ ### Tailwind CSS 4
307
+
308
+ - **Use utility classes** - Prefer Tailwind utilities over custom CSS
309
+ - **Theme variables** - Use CSS variables for colors: `bg-background`, `text-foreground`
310
+ - **Responsive design** - Mobile-first approach: `md:`, `lg:`, `xl:` breakpoints
311
+ - **Dark mode** - All components must support dark mode via theme variables
312
+ - **Custom utilities** - Use `@apply` sparingly, prefer component composition
313
+
314
+ ### Component Styling
315
+
316
+ ```typescript
317
+ // ✅ Good - Tailwind utilities
318
+ <Button className="bg-primary text-primary-foreground hover:bg-primary/90">
319
+ Submit
320
+ </Button>
321
+
322
+ // ✅ Good - Conditional classes with cn()
323
+ <div className={cn(
324
+ "base-classes",
325
+ isActive && "active-classes",
326
+ variant === "primary" && "primary-classes"
327
+ )}>
328
+ ```
329
+
330
+ ## Testing & Quality
331
+
332
+ ### Code Quality
333
+
334
+ - **ESLint** - Follow ESLint rules, run `bun lint` before committing
335
+ - **Type checking** - Ensure `tsc --noEmit` passes
336
+ - **No console.log in production** - Use `console.error` for errors, remove debug logs
337
+
338
+ ### Performance
339
+
340
+ - **Code splitting** - Use dynamic imports for heavy dependencies
341
+ - **Virtualization** - Use TanStack Virtual for large lists
342
+ - **Memoization** - Memoize expensive computations
343
+ - **Image optimization** - Use Next.js Image component for images
344
+
345
+ ## Git & Commit Messages
346
+
347
+ ### Commit Message Format
348
+
349
+ Follow conventional commits:
350
+
351
+ ```
352
+ type(scope): subject
353
+
354
+ body (optional)
355
+
356
+ footer (optional)
357
+ ```
358
+
359
+ **Types:**
360
+ - `feat`: New feature
361
+ - `fix`: Bug fix
362
+ - `docs`: Documentation changes
363
+ - `style`: Code style changes (formatting, no logic change)
364
+ - `refactor`: Code refactoring
365
+ - `perf`: Performance improvements
366
+ - `test`: Adding or updating tests
367
+ - `chore`: Maintenance tasks
368
+
369
+ **Examples:**
370
+ ```
371
+ feat(db): add SQLite provider support
372
+ fix(api): handle connection timeout errors
373
+ docs(readme): update installation instructions
374
+ refactor(components): extract query editor logic to hook
375
+ ```
376
+
377
+ ## Environment Variables
378
+
379
+ ### Required
380
+ - `ADMIN_PASSWORD` - Admin user password
381
+ - `USER_PASSWORD` - Regular user password
382
+ - `JWT_SECRET` - JWT signing secret (min 32 characters)
383
+
384
+ ### Optional
385
+ - `LLM_PROVIDER` - AI provider: `gemini`, `openai`, `ollama`, `custom`
386
+ - `LLM_API_KEY` - API key for LLM provider
387
+ - `LLM_MODEL` - Model name (e.g., `gemini-2.5-flash`)
388
+ - `LLM_API_URL` - Custom API URL (for local LLMs)
389
+
390
+ ## Common Pitfalls to Avoid
391
+
392
+ 1. **Don't use `any`** - Always type your code properly
393
+ 2. **Don't ignore errors** - Always handle errors appropriately
394
+ 3. **Don't commit secrets** - Never commit `.env.local` or API keys
395
+ 4. **Don't break the Strategy Pattern** - Keep provider interfaces consistent
396
+ 5. **Don't mix server and client code** - Be explicit about `"use client"`
397
+ 6. **Don't forget accessibility** - All interactive elements must be keyboard accessible
398
+ 7. **Don't skip error boundaries** - Protect the app from component errors
399
+ 8. **Don't use inline styles** - Use Tailwind classes or CSS variables
400
+
401
+ ## AI Assistant Guidelines
402
+
403
+ When working on this codebase:
404
+
405
+ 1. **Understand the architecture** - Read `docs/ARCHITECTURE.md` before making changes
406
+ 2. **Follow patterns** - Match existing code patterns and conventions
407
+ 3. **Ask for clarification** - If unsure about approach, ask before implementing
408
+ 4. **Test thoroughly** - Ensure changes work across different database types
409
+ 5. **Update documentation** - Keep README and docs up to date
410
+ 6. **Consider mobile** - All features must work on mobile browsers
411
+ 7. **Respect RBAC** - Admin-only features must check user role
412
+ 8. **Performance first** - Optimize for large datasets and slow connections
413
+
414
+ ## Resources
415
+
416
+ - **Architecture**: `docs/ARCHITECTURE.md`
417
+ - **API Documentation**: `docs/API_DOCS.md`
418
+ - **Theming Guide**: `docs/THEMING.md`
419
+ - **Contributing**: `CONTRIBUTING.md`
420
+ - **Claude Guide**: `CLAUDE.md`
421
+
422
+ ---
423
+
424
+ **Last Updated**: 2025-01-XX
425
+ **Project Version**: 0.6.1
426
+