@code-insights/cli 2.1.0 → 3.0.1

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 (271) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +146 -156
  3. package/dashboard-dist/assets/index-BMhL7wL8.css +1 -0
  4. package/dashboard-dist/assets/index-CuCBzQyQ.js +548 -0
  5. package/dashboard-dist/dist/assets/index-BMhL7wL8.css +1 -0
  6. package/dashboard-dist/dist/assets/index-CUWKxcRo.js +548 -0
  7. package/dashboard-dist/dist/assets/index-CuCBzQyQ.js +548 -0
  8. package/dashboard-dist/dist/favicon.svg +4 -0
  9. package/dashboard-dist/dist/index.html +33 -0
  10. package/dashboard-dist/favicon.svg +4 -0
  11. package/dashboard-dist/index.html +33 -0
  12. package/dist/commands/config.d.ts.map +1 -1
  13. package/dist/commands/config.js +188 -69
  14. package/dist/commands/config.js.map +1 -1
  15. package/dist/commands/dashboard.d.ts +16 -0
  16. package/dist/commands/dashboard.d.ts.map +1 -0
  17. package/dist/commands/dashboard.js +82 -0
  18. package/dist/commands/dashboard.js.map +1 -0
  19. package/dist/commands/init.d.ts +3 -4
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +24 -201
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/install-hook.d.ts.map +1 -1
  24. package/dist/commands/install-hook.js +4 -21
  25. package/dist/commands/install-hook.js.map +1 -1
  26. package/dist/commands/open.d.ts +2 -1
  27. package/dist/commands/open.d.ts.map +1 -1
  28. package/dist/commands/open.js +10 -21
  29. package/dist/commands/open.js.map +1 -1
  30. package/dist/commands/reset.d.ts.map +1 -1
  31. package/dist/commands/reset.js +38 -69
  32. package/dist/commands/reset.js.map +1 -1
  33. package/dist/commands/stats/actions/error-handler.d.ts.map +1 -1
  34. package/dist/commands/stats/actions/error-handler.js +1 -11
  35. package/dist/commands/stats/actions/error-handler.js.map +1 -1
  36. package/dist/commands/stats/data/local.d.ts +0 -2
  37. package/dist/commands/stats/data/local.d.ts.map +1 -1
  38. package/dist/commands/stats/data/local.js +44 -44
  39. package/dist/commands/stats/data/local.js.map +1 -1
  40. package/dist/commands/stats/data/source.d.ts +3 -9
  41. package/dist/commands/stats/data/source.d.ts.map +1 -1
  42. package/dist/commands/stats/data/source.js +3 -35
  43. package/dist/commands/stats/data/source.js.map +1 -1
  44. package/dist/commands/stats/data/types.d.ts +1 -12
  45. package/dist/commands/stats/data/types.d.ts.map +1 -1
  46. package/dist/commands/stats/data/types.js +0 -16
  47. package/dist/commands/stats/data/types.js.map +1 -1
  48. package/dist/commands/stats/shared.d.ts.map +1 -1
  49. package/dist/commands/stats/shared.js +1 -5
  50. package/dist/commands/stats/shared.js.map +1 -1
  51. package/dist/commands/status.d.ts.map +1 -1
  52. package/dist/commands/status.js +53 -92
  53. package/dist/commands/status.js.map +1 -1
  54. package/dist/commands/sync.d.ts +5 -5
  55. package/dist/commands/sync.d.ts.map +1 -1
  56. package/dist/commands/sync.js +31 -39
  57. package/dist/commands/sync.js.map +1 -1
  58. package/dist/commands/telemetry.d.ts.map +1 -1
  59. package/dist/commands/telemetry.js +0 -1
  60. package/dist/commands/telemetry.js.map +1 -1
  61. package/dist/constants/llm-providers.d.ts +5 -0
  62. package/dist/constants/llm-providers.d.ts.map +1 -0
  63. package/dist/constants/llm-providers.js +56 -0
  64. package/dist/constants/llm-providers.js.map +1 -0
  65. package/dist/db/client.d.ts +17 -0
  66. package/dist/db/client.d.ts.map +1 -0
  67. package/dist/db/client.js +53 -0
  68. package/dist/db/client.js.map +1 -0
  69. package/dist/db/migrate.d.ts +9 -0
  70. package/dist/db/migrate.d.ts.map +1 -0
  71. package/dist/db/migrate.js +31 -0
  72. package/dist/db/migrate.js.map +1 -0
  73. package/dist/db/read.d.ts +42 -0
  74. package/dist/db/read.d.ts.map +1 -0
  75. package/dist/db/read.js +194 -0
  76. package/dist/db/read.js.map +1 -0
  77. package/dist/db/schema.d.ts +3 -0
  78. package/dist/db/schema.d.ts.map +1 -0
  79. package/dist/db/schema.js +129 -0
  80. package/dist/db/schema.js.map +1 -0
  81. package/dist/db/write.d.ts +24 -0
  82. package/dist/db/write.d.ts.map +1 -0
  83. package/dist/db/write.js +287 -0
  84. package/dist/db/write.js.map +1 -0
  85. package/dist/firebase/client.d.ts +5 -0
  86. package/dist/firebase/client.d.ts.map +1 -1
  87. package/dist/firebase/client.js +23 -0
  88. package/dist/firebase/client.js.map +1 -1
  89. package/dist/index.js +12 -12
  90. package/dist/index.js.map +1 -1
  91. package/dist/providers/context.d.ts +3 -0
  92. package/dist/providers/context.d.ts.map +1 -0
  93. package/dist/providers/context.js +13 -0
  94. package/dist/providers/context.js.map +1 -0
  95. package/dist/providers/copilot.d.ts +18 -0
  96. package/dist/providers/copilot.d.ts.map +1 -0
  97. package/dist/providers/copilot.js +289 -0
  98. package/dist/providers/copilot.js.map +1 -0
  99. package/dist/providers/cursor.d.ts.map +1 -1
  100. package/dist/providers/cursor.js +8 -3
  101. package/dist/providers/cursor.js.map +1 -1
  102. package/dist/providers/registry.d.ts.map +1 -1
  103. package/dist/providers/registry.js +3 -0
  104. package/dist/providers/registry.js.map +1 -1
  105. package/dist/types.d.ts +38 -47
  106. package/dist/types.d.ts.map +1 -1
  107. package/dist/utils/browser.d.ts +6 -0
  108. package/dist/utils/browser.d.ts.map +1 -0
  109. package/dist/utils/browser.js +23 -0
  110. package/dist/utils/browser.js.map +1 -0
  111. package/dist/utils/config.d.ts +9 -21
  112. package/dist/utils/config.d.ts.map +1 -1
  113. package/dist/utils/config.js +23 -50
  114. package/dist/utils/config.js.map +1 -1
  115. package/dist/utils/telemetry.js +2 -7
  116. package/dist/utils/telemetry.js.map +1 -1
  117. package/dist/utils/tips.js +1 -1
  118. package/dist/utils/tips.js.map +1 -1
  119. package/package.json +19 -5
  120. package/server-dist/dist/index.d.ts +12 -0
  121. package/server-dist/dist/index.d.ts.map +1 -0
  122. package/server-dist/dist/index.js +92 -0
  123. package/server-dist/dist/index.js.map +1 -0
  124. package/server-dist/dist/llm/analysis.d.ts +80 -0
  125. package/server-dist/dist/llm/analysis.d.ts.map +1 -0
  126. package/server-dist/dist/llm/analysis.js +509 -0
  127. package/server-dist/dist/llm/analysis.js.map +1 -0
  128. package/server-dist/dist/llm/client.d.ts +27 -0
  129. package/server-dist/dist/llm/client.d.ts.map +1 -0
  130. package/server-dist/dist/llm/client.js +71 -0
  131. package/server-dist/dist/llm/client.js.map +1 -0
  132. package/server-dist/dist/llm/index.d.ts +7 -0
  133. package/server-dist/dist/llm/index.d.ts.map +1 -0
  134. package/server-dist/dist/llm/index.js +5 -0
  135. package/server-dist/dist/llm/index.js.map +1 -0
  136. package/server-dist/dist/llm/prompts.d.ts +73 -0
  137. package/server-dist/dist/llm/prompts.d.ts.map +1 -0
  138. package/server-dist/dist/llm/prompts.js +242 -0
  139. package/server-dist/dist/llm/prompts.js.map +1 -0
  140. package/server-dist/dist/llm/providers/anthropic.d.ts +3 -0
  141. package/server-dist/dist/llm/providers/anthropic.d.ts.map +1 -0
  142. package/server-dist/dist/llm/providers/anthropic.js +45 -0
  143. package/server-dist/dist/llm/providers/anthropic.js.map +1 -0
  144. package/server-dist/dist/llm/providers/gemini.d.ts +3 -0
  145. package/server-dist/dist/llm/providers/gemini.d.ts.map +1 -0
  146. package/server-dist/dist/llm/providers/gemini.js +51 -0
  147. package/server-dist/dist/llm/providers/gemini.js.map +1 -0
  148. package/server-dist/dist/llm/providers/ollama.d.ts +12 -0
  149. package/server-dist/dist/llm/providers/ollama.d.ts.map +1 -0
  150. package/server-dist/dist/llm/providers/ollama.js +61 -0
  151. package/server-dist/dist/llm/providers/ollama.js.map +1 -0
  152. package/server-dist/dist/llm/providers/openai.d.ts +3 -0
  153. package/server-dist/dist/llm/providers/openai.d.ts.map +1 -0
  154. package/server-dist/dist/llm/providers/openai.js +39 -0
  155. package/server-dist/dist/llm/providers/openai.js.map +1 -0
  156. package/server-dist/dist/llm/types.d.ts +22 -0
  157. package/server-dist/dist/llm/types.d.ts.map +1 -0
  158. package/server-dist/dist/llm/types.js +5 -0
  159. package/server-dist/dist/llm/types.js.map +1 -0
  160. package/server-dist/dist/routes/analysis.d.ts +4 -0
  161. package/server-dist/dist/routes/analysis.d.ts.map +1 -0
  162. package/server-dist/dist/routes/analysis.js +103 -0
  163. package/server-dist/dist/routes/analysis.js.map +1 -0
  164. package/server-dist/dist/routes/analytics.d.ts +4 -0
  165. package/server-dist/dist/routes/analytics.d.ts.map +1 -0
  166. package/server-dist/dist/routes/analytics.js +47 -0
  167. package/server-dist/dist/routes/analytics.js.map +1 -0
  168. package/server-dist/dist/routes/config.d.ts +4 -0
  169. package/server-dist/dist/routes/config.d.ts.map +1 -0
  170. package/server-dist/dist/routes/config.js +108 -0
  171. package/server-dist/dist/routes/config.js.map +1 -0
  172. package/server-dist/dist/routes/export.d.ts +4 -0
  173. package/server-dist/dist/routes/export.d.ts.map +1 -0
  174. package/server-dist/dist/routes/export.js +52 -0
  175. package/server-dist/dist/routes/export.js.map +1 -0
  176. package/server-dist/dist/routes/insights.d.ts +4 -0
  177. package/server-dist/dist/routes/insights.d.ts.map +1 -0
  178. package/server-dist/dist/routes/insights.js +80 -0
  179. package/server-dist/dist/routes/insights.js.map +1 -0
  180. package/server-dist/dist/routes/messages.d.ts +4 -0
  181. package/server-dist/dist/routes/messages.d.ts.map +1 -0
  182. package/server-dist/dist/routes/messages.js +19 -0
  183. package/server-dist/dist/routes/messages.js.map +1 -0
  184. package/server-dist/dist/routes/projects.d.ts +4 -0
  185. package/server-dist/dist/routes/projects.d.ts.map +1 -0
  186. package/server-dist/dist/routes/projects.js +32 -0
  187. package/server-dist/dist/routes/projects.js.map +1 -0
  188. package/server-dist/dist/routes/sessions.d.ts +4 -0
  189. package/server-dist/dist/routes/sessions.d.ts.map +1 -0
  190. package/server-dist/dist/routes/sessions.js +65 -0
  191. package/server-dist/dist/routes/sessions.js.map +1 -0
  192. package/server-dist/dist/utils.d.ts +6 -0
  193. package/server-dist/dist/utils.d.ts.map +1 -0
  194. package/server-dist/dist/utils.js +9 -0
  195. package/server-dist/dist/utils.js.map +1 -0
  196. package/server-dist/index.d.ts +12 -0
  197. package/server-dist/index.d.ts.map +1 -0
  198. package/server-dist/index.js +92 -0
  199. package/server-dist/index.js.map +1 -0
  200. package/server-dist/llm/analysis.d.ts +80 -0
  201. package/server-dist/llm/analysis.d.ts.map +1 -0
  202. package/server-dist/llm/analysis.js +509 -0
  203. package/server-dist/llm/analysis.js.map +1 -0
  204. package/server-dist/llm/client.d.ts +27 -0
  205. package/server-dist/llm/client.d.ts.map +1 -0
  206. package/server-dist/llm/client.js +71 -0
  207. package/server-dist/llm/client.js.map +1 -0
  208. package/server-dist/llm/index.d.ts +7 -0
  209. package/server-dist/llm/index.d.ts.map +1 -0
  210. package/server-dist/llm/index.js +5 -0
  211. package/server-dist/llm/index.js.map +1 -0
  212. package/server-dist/llm/prompts.d.ts +73 -0
  213. package/server-dist/llm/prompts.d.ts.map +1 -0
  214. package/server-dist/llm/prompts.js +242 -0
  215. package/server-dist/llm/prompts.js.map +1 -0
  216. package/server-dist/llm/providers/anthropic.d.ts +3 -0
  217. package/server-dist/llm/providers/anthropic.d.ts.map +1 -0
  218. package/server-dist/llm/providers/anthropic.js +45 -0
  219. package/server-dist/llm/providers/anthropic.js.map +1 -0
  220. package/server-dist/llm/providers/gemini.d.ts +3 -0
  221. package/server-dist/llm/providers/gemini.d.ts.map +1 -0
  222. package/server-dist/llm/providers/gemini.js +51 -0
  223. package/server-dist/llm/providers/gemini.js.map +1 -0
  224. package/server-dist/llm/providers/ollama.d.ts +12 -0
  225. package/server-dist/llm/providers/ollama.d.ts.map +1 -0
  226. package/server-dist/llm/providers/ollama.js +61 -0
  227. package/server-dist/llm/providers/ollama.js.map +1 -0
  228. package/server-dist/llm/providers/openai.d.ts +3 -0
  229. package/server-dist/llm/providers/openai.d.ts.map +1 -0
  230. package/server-dist/llm/providers/openai.js +39 -0
  231. package/server-dist/llm/providers/openai.js.map +1 -0
  232. package/server-dist/llm/types.d.ts +22 -0
  233. package/server-dist/llm/types.d.ts.map +1 -0
  234. package/server-dist/llm/types.js +5 -0
  235. package/server-dist/llm/types.js.map +1 -0
  236. package/server-dist/routes/analysis.d.ts +4 -0
  237. package/server-dist/routes/analysis.d.ts.map +1 -0
  238. package/server-dist/routes/analysis.js +103 -0
  239. package/server-dist/routes/analysis.js.map +1 -0
  240. package/server-dist/routes/analytics.d.ts +4 -0
  241. package/server-dist/routes/analytics.d.ts.map +1 -0
  242. package/server-dist/routes/analytics.js +47 -0
  243. package/server-dist/routes/analytics.js.map +1 -0
  244. package/server-dist/routes/config.d.ts +4 -0
  245. package/server-dist/routes/config.d.ts.map +1 -0
  246. package/server-dist/routes/config.js +108 -0
  247. package/server-dist/routes/config.js.map +1 -0
  248. package/server-dist/routes/export.d.ts +4 -0
  249. package/server-dist/routes/export.d.ts.map +1 -0
  250. package/server-dist/routes/export.js +52 -0
  251. package/server-dist/routes/export.js.map +1 -0
  252. package/server-dist/routes/insights.d.ts +4 -0
  253. package/server-dist/routes/insights.d.ts.map +1 -0
  254. package/server-dist/routes/insights.js +80 -0
  255. package/server-dist/routes/insights.js.map +1 -0
  256. package/server-dist/routes/messages.d.ts +4 -0
  257. package/server-dist/routes/messages.d.ts.map +1 -0
  258. package/server-dist/routes/messages.js +19 -0
  259. package/server-dist/routes/messages.js.map +1 -0
  260. package/server-dist/routes/projects.d.ts +4 -0
  261. package/server-dist/routes/projects.d.ts.map +1 -0
  262. package/server-dist/routes/projects.js +32 -0
  263. package/server-dist/routes/projects.js.map +1 -0
  264. package/server-dist/routes/sessions.d.ts +4 -0
  265. package/server-dist/routes/sessions.d.ts.map +1 -0
  266. package/server-dist/routes/sessions.js +65 -0
  267. package/server-dist/routes/sessions.js.map +1 -0
  268. package/server-dist/utils.d.ts +6 -0
  269. package/server-dist/utils.d.ts.map +1 -0
  270. package/server-dist/utils.js +9 -0
  271. package/server-dist/utils.js.map +1 -0
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
2
+ <rect width="32" height="32" rx="6" fill="#18181b"/>
3
+ <path d="M8 22 L12 14 L16 18 L20 10 L24 22" stroke="#a1a1aa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
4
+ </svg>
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Code Insights</title>
7
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8
+ <!-- FOUC prevention: apply theme class before React renders to avoid flash.
9
+ Wrapped in try/catch so it silently degrades to light mode in
10
+ restricted environments where localStorage access is blocked. -->
11
+ <script>
12
+ (function () {
13
+ try {
14
+ var stored = localStorage.getItem('code-insights-theme');
15
+ var isDark = stored === 'dark';
16
+ var isSystem = !stored || stored === 'system' || (stored !== 'light' && stored !== 'dark');
17
+ var resolved = isDark || (isSystem && window.matchMedia('(prefers-color-scheme: dark)').matches)
18
+ ? 'dark'
19
+ : 'light';
20
+ } catch (e) {
21
+ var resolved = 'light';
22
+ }
23
+ document.documentElement.classList.remove('light', 'dark');
24
+ document.documentElement.classList.add(resolved);
25
+ })();
26
+ </script>
27
+ <script type="module" crossorigin src="/assets/index-CUWKxcRo.js"></script>
28
+ <link rel="stylesheet" crossorigin href="/assets/index-BMhL7wL8.css">
29
+ </head>
30
+ <body>
31
+ <div id="root"></div>
32
+ </body>
33
+ </html>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
2
+ <rect width="32" height="32" rx="6" fill="#18181b"/>
3
+ <path d="M8 22 L12 14 L16 18 L20 10 L24 22" stroke="#a1a1aa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
4
+ </svg>
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Code Insights</title>
7
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8
+ <!-- FOUC prevention: apply theme class before React renders to avoid flash.
9
+ Wrapped in try/catch so it silently degrades to light mode in
10
+ restricted environments where localStorage access is blocked. -->
11
+ <script>
12
+ (function () {
13
+ try {
14
+ var stored = localStorage.getItem('code-insights-theme');
15
+ var isDark = stored === 'dark';
16
+ var isSystem = !stored || stored === 'system' || (stored !== 'light' && stored !== 'dark');
17
+ var resolved = isDark || (isSystem && window.matchMedia('(prefers-color-scheme: dark)').matches)
18
+ ? 'dark'
19
+ : 'light';
20
+ } catch (e) {
21
+ var resolved = 'light';
22
+ }
23
+ document.documentElement.classList.remove('light', 'dark');
24
+ document.documentElement.classList.add(resolved);
25
+ })();
26
+ </script>
27
+ <script type="module" crossorigin src="/assets/index-CuCBzQyQ.js"></script>
28
+ <link rel="stylesheet" crossorigin href="/assets/index-BMhL7wL8.css">
29
+ </head>
30
+ <body>
31
+ <div id="root"></div>
32
+ </body>
33
+ </html>
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkGpC,eAAO,MAAM,aAAa,SAItB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqEpC,eAAO,MAAM,aAAa,SAItB,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
- import { loadConfig, saveConfig, isConfigured, resolveDataSourcePreference, isFirebaseConfigured } from '../utils/config.js';
3
+ import inquirer from 'inquirer';
4
+ import { loadConfig, saveConfig, isConfigured } from '../utils/config.js';
4
5
  import { trackEvent } from '../utils/telemetry.js';
6
+ import { PROVIDERS, getDefaultModel } from '../constants/llm-providers.js';
5
7
  /**
6
8
  * Show current configuration summary.
7
9
  */
@@ -15,43 +17,39 @@ function showConfigAction() {
15
17
  console.log(chalk.red('\nFailed to load config.\n'));
16
18
  return;
17
19
  }
18
- const effectiveSource = resolveDataSourcePreference();
19
- const firebaseConfigured = isFirebaseConfigured();
20
20
  console.log(chalk.cyan('\n Code Insights Configuration\n'));
21
- // Data source
22
- console.log(chalk.white(' Data Source:'));
23
- if (config.dataSource) {
24
- console.log(chalk.gray(` Configured: ${config.dataSource}`));
25
- }
26
- else {
27
- console.log(chalk.gray(` Configured: (not set)`));
28
- }
29
- console.log(chalk.gray(` Effective: ${effectiveSource}`));
30
- // Firebase
31
- console.log(chalk.white('\n Firebase:'));
32
- if (firebaseConfigured) {
33
- console.log(chalk.green(` Status: configured`));
34
- console.log(chalk.gray(` Project: ${config.firebase.projectId}`));
35
- }
36
- else {
37
- console.log(chalk.yellow(` Status: not configured`));
38
- }
39
21
  // Sync
40
- console.log(chalk.white('\n Sync:'));
22
+ console.log(chalk.white(' Sync:'));
41
23
  console.log(chalk.gray(` Claude dir: ${config.sync.claudeDir}`));
42
24
  if (config.sync.excludeProjects.length > 0) {
43
25
  console.log(chalk.gray(` Excluded: ${config.sync.excludeProjects.join(', ')}`));
44
26
  }
45
- // Dashboard
46
- if (config.dashboardUrl) {
27
+ // Dashboard (Phase 3)
28
+ if (config.dashboard?.port) {
47
29
  console.log(chalk.white('\n Dashboard:'));
48
- console.log(chalk.gray(` URL: ${config.dashboardUrl}`));
30
+ console.log(chalk.gray(` Port: ${config.dashboard.port}`));
31
+ }
32
+ // LLM config
33
+ if (config.dashboard?.llm) {
34
+ const llm = config.dashboard.llm;
35
+ const maskedKey = llm.apiKey && llm.apiKey.length >= 8
36
+ ? llm.apiKey.slice(0, 4) + '...' + llm.apiKey.slice(-4)
37
+ : llm.apiKey ? '***' : '(none)';
38
+ console.log(chalk.white('\n LLM:'));
39
+ console.log(chalk.gray(` Provider: ${llm.provider}`));
40
+ console.log(chalk.gray(` Model: ${llm.model}`));
41
+ if (llm.provider !== 'ollama') {
42
+ console.log(chalk.gray(` API Key: ${maskedKey}`));
43
+ }
44
+ if (llm.baseUrl) {
45
+ console.log(chalk.gray(` Base URL: ${llm.baseUrl}`));
46
+ }
49
47
  }
50
48
  // Telemetry — default is enabled; env vars can override at runtime
51
49
  console.log(chalk.white('\n Telemetry:'));
52
- const telemetryEnabled = config.telemetry !== false; // default true
50
+ const telemetryEnabled = config.telemetry !== false;
53
51
  if (process.env.CODE_INSIGHTS_TELEMETRY_DISABLED === '1' || process.env.DO_NOT_TRACK === '1') {
54
- console.log(chalk.yellow(` Status: disabled (via env var)`));
52
+ console.log(chalk.yellow(' Status: disabled (via env var)'));
55
53
  }
56
54
  else {
57
55
  console.log(chalk.gray(` Status: ${telemetryEnabled ? 'enabled' : 'disabled'}`));
@@ -59,72 +57,193 @@ function showConfigAction() {
59
57
  console.log('');
60
58
  trackEvent('config', true);
61
59
  }
62
- /**
63
- * Set the preferred data source ('local' or 'firebase').
64
- */
65
- function setSourceAction(source) {
66
- if (source !== 'local' && source !== 'firebase') {
67
- console.error(chalk.red(`\nInvalid source "${source}". Must be "local" or "firebase".\n`));
68
- process.exit(1);
69
- }
70
- const config = loadConfig();
71
- if (!config) {
72
- console.error(chalk.red('\nNot configured. Run `code-insights init` first.\n'));
73
- process.exit(1);
74
- }
75
- if (source === 'firebase' && !isFirebaseConfigured()) {
76
- console.error(chalk.red('\nFirebase credentials not configured.'));
77
- console.error(chalk.gray('Run `code-insights init` to add Firebase credentials before setting source to "firebase".\n'));
78
- process.exit(1);
79
- }
80
- config.dataSource = source;
81
- saveConfig(config);
82
- console.log(chalk.green(`\nData source preference set to "${source}".\n`));
83
- trackEvent('config', true, 'set-source');
84
- }
85
60
  export const configCommand = new Command('config')
86
- .description('Show or update Code Insights configuration')
61
+ .description('Show Code Insights configuration')
87
62
  .action(() => {
88
63
  showConfigAction();
89
64
  });
90
- configCommand
91
- .command('set-source <source>')
92
- .description('Set preferred data source (local or firebase)')
93
- .action((source) => {
94
- setSourceAction(source);
95
- });
96
65
  configCommand
97
66
  .command('set <key> <value>')
98
- .description('Set a configuration value (telemetry, source)')
67
+ .description('Set a configuration value (telemetry)')
99
68
  .action((key, value) => {
100
69
  if (key === 'telemetry') {
101
70
  if (value !== 'true' && value !== 'false') {
102
71
  console.error(chalk.red(`\nInvalid value "${value}". Must be "true" or "false".\n`));
103
72
  process.exit(1);
104
73
  }
105
- const config = loadConfig();
106
- if (!config) {
107
- // No existing config — create minimal one so telemetry pref is persisted
74
+ const existing = loadConfig();
75
+ if (!existing) {
108
76
  saveConfig({
109
77
  sync: { claudeDir: '~/.claude/projects', excludeProjects: [] },
110
- dataSource: 'local',
111
78
  telemetry: value === 'true',
112
79
  });
113
80
  }
114
81
  else {
115
- config.telemetry = value === 'true';
116
- saveConfig(config);
82
+ existing.telemetry = value === 'true';
83
+ saveConfig(existing);
117
84
  }
118
85
  console.log(chalk.green(`\nTelemetry ${value === 'true' ? 'enabled' : 'disabled'}.\n`));
119
86
  trackEvent('config', true, 'set');
120
87
  }
121
- else if (key === 'source') {
122
- setSourceAction(value);
123
- // trackEvent already called inside setSourceAction
124
- }
125
88
  else {
126
- console.error(chalk.red(`\nUnknown config key "${key}". Available: telemetry, source.\n`));
89
+ console.error(chalk.red(`\nUnknown config key "${key}". Available: telemetry.\n`));
127
90
  process.exit(1);
128
91
  }
129
92
  });
93
+ // ── config llm ────────────────────────────────────────────────────────────────
94
+ const llmCommand = configCommand
95
+ .command('llm')
96
+ .description('Configure LLM provider for AI-powered session analysis')
97
+ .option('--provider <provider>', 'LLM provider (openai, anthropic, gemini, ollama)')
98
+ .option('--model <model>', 'Model ID (e.g., gpt-4o, claude-sonnet-4-20250514)')
99
+ .option('--api-key <key>', 'API key for the selected provider')
100
+ .option('--base-url <url>', 'Custom base URL (for Ollama or local endpoints)')
101
+ .option('--show', 'Show current LLM configuration')
102
+ .action(async (options) => {
103
+ // --show: display current LLM config and exit
104
+ if (options.show) {
105
+ const config = loadConfig();
106
+ const llm = config?.dashboard?.llm;
107
+ if (!llm) {
108
+ console.log(chalk.yellow('\nLLM not configured. Run `code-insights config llm` to set up.\n'));
109
+ return;
110
+ }
111
+ const maskedKey = llm.apiKey && llm.apiKey.length >= 8
112
+ ? llm.apiKey.slice(0, 4) + '...' + llm.apiKey.slice(-4)
113
+ : llm.apiKey ? '***' : '(none)';
114
+ console.log(chalk.cyan('\n LLM Configuration\n'));
115
+ console.log(chalk.gray(` Provider: ${llm.provider}`));
116
+ console.log(chalk.gray(` Model: ${llm.model}`));
117
+ if (llm.provider !== 'ollama') {
118
+ console.log(chalk.gray(` API Key: ${maskedKey}`));
119
+ }
120
+ if (llm.baseUrl) {
121
+ console.log(chalk.gray(` Base URL: ${llm.baseUrl}`));
122
+ }
123
+ console.log('');
124
+ return;
125
+ }
126
+ // Non-interactive: all required fields provided via flags
127
+ if (options.provider && options.model) {
128
+ const validProviders = PROVIDERS.map(p => p.id);
129
+ if (!validProviders.includes(options.provider)) {
130
+ console.error(chalk.red(`\nInvalid provider "${options.provider}". Must be one of: ${validProviders.join(', ')}\n`));
131
+ process.exit(1);
132
+ }
133
+ const providerInfo = PROVIDERS.find(p => p.id === options.provider);
134
+ if (providerInfo?.requiresApiKey && !options.apiKey) {
135
+ console.error(chalk.red(`\nProvider "${options.provider}" requires an API key. Use --api-key <key>\n`));
136
+ process.exit(1);
137
+ }
138
+ const llmConfig = {
139
+ provider: options.provider,
140
+ model: options.model,
141
+ ...(options.apiKey ? { apiKey: options.apiKey } : {}),
142
+ ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
143
+ };
144
+ saveLLMConfig(llmConfig);
145
+ console.log(chalk.green(`\nLLM configured: ${options.provider} / ${options.model}\n`));
146
+ return;
147
+ }
148
+ // Interactive flow
149
+ await runInteractiveLLMConfig();
150
+ });
151
+ /**
152
+ * Interactive LLM configuration wizard.
153
+ */
154
+ async function runInteractiveLLMConfig() {
155
+ const existing = loadConfig()?.dashboard?.llm;
156
+ console.log(chalk.cyan('\n LLM Configuration\n'));
157
+ console.log(chalk.gray(' Configure the AI provider used for session analysis.\n'));
158
+ // Step 1: Select provider
159
+ const { provider } = await inquirer.prompt([
160
+ {
161
+ type: 'list',
162
+ name: 'provider',
163
+ message: 'Select LLM provider:',
164
+ choices: PROVIDERS.map(p => ({
165
+ name: `${p.name}${p.requiresApiKey ? '' : ' (no API key needed)'}`,
166
+ value: p.id,
167
+ })),
168
+ default: existing?.provider ?? 'ollama',
169
+ },
170
+ ]);
171
+ const providerInfo = PROVIDERS.find(p => p.id === provider);
172
+ if (!providerInfo) {
173
+ console.error(chalk.red('\nFailed to find provider info. Aborting.\n'));
174
+ process.exit(1);
175
+ }
176
+ // Step 2: Select model
177
+ const { model } = await inquirer.prompt([
178
+ {
179
+ type: 'list',
180
+ name: 'model',
181
+ message: 'Select model:',
182
+ choices: providerInfo.models.map(m => ({
183
+ name: `${m.name}${m.description ? ` — ${m.description}` : ''}`,
184
+ value: m.id,
185
+ })),
186
+ default: existing?.model ?? getDefaultModel(provider),
187
+ },
188
+ ]);
189
+ const llmConfig = { provider, model };
190
+ // Step 3: API key (if required)
191
+ if (providerInfo.requiresApiKey) {
192
+ const maskedExisting = existing?.apiKey && existing.apiKey.length >= 8
193
+ ? `${existing.apiKey.slice(0, 4)}...${existing.apiKey.slice(-4)}`
194
+ : undefined;
195
+ const { apiKey } = await inquirer.prompt([
196
+ {
197
+ type: 'password',
198
+ name: 'apiKey',
199
+ message: `API key${maskedExisting ? ` (current: ${maskedExisting}, leave blank to keep)` : ''}:`,
200
+ mask: '*',
201
+ validate: (val) => {
202
+ if (!val && !existing?.apiKey) {
203
+ return `API key required for ${providerInfo.name}`;
204
+ }
205
+ return true;
206
+ },
207
+ },
208
+ ]);
209
+ // Preserve existing key if blank input
210
+ if (apiKey) {
211
+ llmConfig.apiKey = apiKey;
212
+ }
213
+ else if (existing?.apiKey) {
214
+ llmConfig.apiKey = existing.apiKey;
215
+ }
216
+ }
217
+ // Step 4: Base URL (Ollama or custom)
218
+ if (provider === 'ollama') {
219
+ const { baseUrl } = await inquirer.prompt([
220
+ {
221
+ type: 'input',
222
+ name: 'baseUrl',
223
+ message: 'Ollama URL (leave blank for default http://localhost:11434):',
224
+ default: existing?.baseUrl ?? '',
225
+ },
226
+ ]);
227
+ if (baseUrl && baseUrl !== 'http://localhost:11434') {
228
+ llmConfig.baseUrl = baseUrl;
229
+ }
230
+ }
231
+ saveLLMConfig(llmConfig);
232
+ console.log(chalk.green(`\nLLM configured: ${providerInfo.name} / ${model}\n`));
233
+ if (providerInfo.apiKeyLink && !llmConfig.apiKey) {
234
+ console.log(chalk.dim(` Get an API key: ${providerInfo.apiKeyLink}\n`));
235
+ }
236
+ }
237
+ /**
238
+ * Save LLM config into the dashboard.llm field of the CLI config file.
239
+ */
240
+ function saveLLMConfig(llmConfig) {
241
+ const existing = loadConfig() ?? {
242
+ sync: { claudeDir: '~/.claude/projects', excludeProjects: [] },
243
+ };
244
+ existing.dashboard = { ...existing.dashboard, llm: llmConfig };
245
+ saveConfig(existing);
246
+ }
247
+ // Suppress unused variable warning — llmCommand is registered via .command() side-effect
248
+ void llmCommand;
130
249
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ interface DashboardOptions {
2
+ port: string;
3
+ open: boolean;
4
+ }
5
+ /**
6
+ * Start the Code Insights local dashboard server.
7
+ *
8
+ * Loads server/dist/index.js by file URL rather than package name to avoid a
9
+ * circular workspace dependency (server depends on @code-insights/cli, so CLI
10
+ * cannot list @code-insights/server as a build-time dep). pathToFileURL ensures
11
+ * the import works on Windows where absolute paths like C:\... are not valid
12
+ * ESM import specifiers.
13
+ */
14
+ export declare function dashboardCommand(options: DashboardOptions): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAQA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAuBD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D/E"}
@@ -0,0 +1,82 @@
1
+ import { resolve, dirname } from 'path';
2
+ import { fileURLToPath, pathToFileURL } from 'url';
3
+ import { existsSync } from 'fs';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import net from 'net';
7
+ import { trackEvent } from '../utils/telemetry.js';
8
+ /**
9
+ * Check if a port is already in use.
10
+ * - Checks only EADDRINUSE, not other errors (e.g. EACCES for privileged ports).
11
+ * - Waits for the test socket to fully close before resolving, avoiding a TOCTOU
12
+ * race where the real server tries to bind before the OS releases the port.
13
+ */
14
+ function isPortInUse(port) {
15
+ return new Promise((resolvePromise) => {
16
+ const server = net.createServer();
17
+ server.once('error', (err) => {
18
+ server.close();
19
+ resolvePromise(err.code === 'EADDRINUSE');
20
+ });
21
+ server.once('listening', () => {
22
+ // Wait for close callback before resolving so the OS fully releases the port
23
+ server.close(() => resolvePromise(false));
24
+ });
25
+ server.listen(port, '127.0.0.1');
26
+ });
27
+ }
28
+ /**
29
+ * Start the Code Insights local dashboard server.
30
+ *
31
+ * Loads server/dist/index.js by file URL rather than package name to avoid a
32
+ * circular workspace dependency (server depends on @code-insights/cli, so CLI
33
+ * cannot list @code-insights/server as a build-time dep). pathToFileURL ensures
34
+ * the import works on Windows where absolute paths like C:\... are not valid
35
+ * ESM import specifiers.
36
+ */
37
+ export async function dashboardCommand(options) {
38
+ const port = parseInt(options.port, 10);
39
+ if (isNaN(port) || port < 1 || port > 65535) {
40
+ console.error(chalk.red(` Invalid port: ${options.port}`));
41
+ process.exit(1);
42
+ }
43
+ const inUse = await isPortInUse(port);
44
+ if (inUse) {
45
+ console.error(chalk.red(` Port ${port} is already in use.`));
46
+ console.error(chalk.dim(` Try: code-insights dashboard --port <number>`));
47
+ process.exit(1);
48
+ }
49
+ const spinner = ora('Starting Code Insights dashboard...').start();
50
+ try {
51
+ const __filename = fileURLToPath(import.meta.url);
52
+ const __dirname = dirname(__filename);
53
+ // cli/dist/commands/dashboard.js -> workspace root is 3 levels up
54
+ const workspaceRoot = resolve(__dirname, '..', '..', '..');
55
+ // cli/dist/commands/dashboard.js -> CLI package root is 2 levels up
56
+ const cliRoot = resolve(__dirname, '..', '..');
57
+ // Try workspace layout first (dev), then npm-installed layout (production)
58
+ let serverEntryPath = resolve(workspaceRoot, 'server', 'dist', 'index.js');
59
+ let staticDir = resolve(workspaceRoot, 'dashboard', 'dist');
60
+ if (!existsSync(serverEntryPath)) {
61
+ serverEntryPath = resolve(cliRoot, 'server-dist', 'index.js');
62
+ staticDir = resolve(cliRoot, 'dashboard-dist');
63
+ }
64
+ if (!existsSync(serverEntryPath)) {
65
+ spinner.fail('Dashboard server not found.');
66
+ console.error(chalk.dim(' Run from a workspace checkout: pnpm install && pnpm build\n' +
67
+ ' Or install globally: npm install -g @code-insights/cli\n' +
68
+ ' See: https://github.com/melagiri/code-insights#development'));
69
+ process.exit(1);
70
+ }
71
+ const { startServer } = await import(pathToFileURL(serverEntryPath).href);
72
+ spinner.stop();
73
+ trackEvent('dashboard', true, 'started');
74
+ await startServer({ port, staticDir, openBrowser: options.open });
75
+ }
76
+ catch (err) {
77
+ spinner.fail('Failed to start dashboard server.');
78
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
79
+ process.exit(1);
80
+ }
81
+ }
82
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,8 @@
1
1
  export interface InitOptions {
2
- fromJson?: string;
3
- webConfig?: string;
4
2
  }
5
3
  /**
6
- * Initialize Code Insights configuration
4
+ * Initialize Code Insights configuration.
5
+ * Sets up sync preferences and initializes the local SQLite database.
7
6
  */
8
- export declare function initCommand(options: InitOptions): Promise<void>;
7
+ export declare function initCommand(_options?: InitOptions): Promise<void>;
9
8
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoErE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;CAE3B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C3E"}