codeprobe 0.1.0

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 (355) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +406 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +104 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/ab.d.ts +7 -0
  8. package/dist/commands/ab.d.ts.map +1 -0
  9. package/dist/commands/ab.js +230 -0
  10. package/dist/commands/ab.js.map +1 -0
  11. package/dist/commands/agents.d.ts +10 -0
  12. package/dist/commands/agents.d.ts.map +1 -0
  13. package/dist/commands/agents.js +326 -0
  14. package/dist/commands/agents.js.map +1 -0
  15. package/dist/commands/autotest.d.ts +10 -0
  16. package/dist/commands/autotest.d.ts.map +1 -0
  17. package/dist/commands/autotest.js +408 -0
  18. package/dist/commands/autotest.js.map +1 -0
  19. package/dist/commands/benchmark.d.ts +6 -0
  20. package/dist/commands/benchmark.d.ts.map +1 -0
  21. package/dist/commands/benchmark.js +215 -0
  22. package/dist/commands/benchmark.js.map +1 -0
  23. package/dist/commands/check.d.ts +10 -0
  24. package/dist/commands/check.d.ts.map +1 -0
  25. package/dist/commands/check.js +333 -0
  26. package/dist/commands/check.js.map +1 -0
  27. package/dist/commands/context.d.ts +16 -0
  28. package/dist/commands/context.d.ts.map +1 -0
  29. package/dist/commands/context.js +219 -0
  30. package/dist/commands/context.js.map +1 -0
  31. package/dist/commands/cost.d.ts +9 -0
  32. package/dist/commands/cost.d.ts.map +1 -0
  33. package/dist/commands/cost.js +142 -0
  34. package/dist/commands/cost.js.map +1 -0
  35. package/dist/commands/dashboard.d.ts +10 -0
  36. package/dist/commands/dashboard.d.ts.map +1 -0
  37. package/dist/commands/dashboard.js +462 -0
  38. package/dist/commands/dashboard.js.map +1 -0
  39. package/dist/commands/diff.d.ts +6 -0
  40. package/dist/commands/diff.d.ts.map +1 -0
  41. package/dist/commands/diff.js +118 -0
  42. package/dist/commands/diff.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +12 -0
  44. package/dist/commands/doctor.d.ts.map +1 -0
  45. package/dist/commands/doctor.js +203 -0
  46. package/dist/commands/doctor.js.map +1 -0
  47. package/dist/commands/explain.d.ts +7 -0
  48. package/dist/commands/explain.d.ts.map +1 -0
  49. package/dist/commands/explain.js +164 -0
  50. package/dist/commands/explain.js.map +1 -0
  51. package/dist/commands/flaky.d.ts +10 -0
  52. package/dist/commands/flaky.d.ts.map +1 -0
  53. package/dist/commands/flaky.js +141 -0
  54. package/dist/commands/flaky.js.map +1 -0
  55. package/dist/commands/generateClaudeMd.d.ts +11 -0
  56. package/dist/commands/generateClaudeMd.d.ts.map +1 -0
  57. package/dist/commands/generateClaudeMd.js +278 -0
  58. package/dist/commands/generateClaudeMd.js.map +1 -0
  59. package/dist/commands/generateRules.d.ts +11 -0
  60. package/dist/commands/generateRules.d.ts.map +1 -0
  61. package/dist/commands/generateRules.js +413 -0
  62. package/dist/commands/generateRules.js.map +1 -0
  63. package/dist/commands/heatmap.d.ts +7 -0
  64. package/dist/commands/heatmap.d.ts.map +1 -0
  65. package/dist/commands/heatmap.js +117 -0
  66. package/dist/commands/heatmap.js.map +1 -0
  67. package/dist/commands/history.d.ts +13 -0
  68. package/dist/commands/history.d.ts.map +1 -0
  69. package/dist/commands/history.js +113 -0
  70. package/dist/commands/history.js.map +1 -0
  71. package/dist/commands/hooks.d.ts +9 -0
  72. package/dist/commands/hooks.d.ts.map +1 -0
  73. package/dist/commands/hooks.js +199 -0
  74. package/dist/commands/hooks.js.map +1 -0
  75. package/dist/commands/improve.d.ts +7 -0
  76. package/dist/commands/improve.d.ts.map +1 -0
  77. package/dist/commands/improve.js +192 -0
  78. package/dist/commands/improve.js.map +1 -0
  79. package/dist/commands/init.d.ts +9 -0
  80. package/dist/commands/init.d.ts.map +1 -0
  81. package/dist/commands/init.js +270 -0
  82. package/dist/commands/init.js.map +1 -0
  83. package/dist/commands/installHook.d.ts +9 -0
  84. package/dist/commands/installHook.d.ts.map +1 -0
  85. package/dist/commands/installHook.js +78 -0
  86. package/dist/commands/installHook.js.map +1 -0
  87. package/dist/commands/lint.d.ts +6 -0
  88. package/dist/commands/lint.d.ts.map +1 -0
  89. package/dist/commands/lint.js +237 -0
  90. package/dist/commands/lint.js.map +1 -0
  91. package/dist/commands/map.d.ts +9 -0
  92. package/dist/commands/map.d.ts.map +1 -0
  93. package/dist/commands/map.js +114 -0
  94. package/dist/commands/map.js.map +1 -0
  95. package/dist/commands/mcp.d.ts +6 -0
  96. package/dist/commands/mcp.d.ts.map +1 -0
  97. package/dist/commands/mcp.js +151 -0
  98. package/dist/commands/mcp.js.map +1 -0
  99. package/dist/commands/models.d.ts +9 -0
  100. package/dist/commands/models.d.ts.map +1 -0
  101. package/dist/commands/models.js +89 -0
  102. package/dist/commands/models.js.map +1 -0
  103. package/dist/commands/pack.d.ts +10 -0
  104. package/dist/commands/pack.d.ts.map +1 -0
  105. package/dist/commands/pack.js +248 -0
  106. package/dist/commands/pack.js.map +1 -0
  107. package/dist/commands/recommend.d.ts +10 -0
  108. package/dist/commands/recommend.d.ts.map +1 -0
  109. package/dist/commands/recommend.js +472 -0
  110. package/dist/commands/recommend.js.map +1 -0
  111. package/dist/commands/regression.d.ts +10 -0
  112. package/dist/commands/regression.d.ts.map +1 -0
  113. package/dist/commands/regression.js +212 -0
  114. package/dist/commands/regression.js.map +1 -0
  115. package/dist/commands/repl.d.ts +9 -0
  116. package/dist/commands/repl.d.ts.map +1 -0
  117. package/dist/commands/repl.js +245 -0
  118. package/dist/commands/repl.js.map +1 -0
  119. package/dist/commands/scan.d.ts +10 -0
  120. package/dist/commands/scan.d.ts.map +1 -0
  121. package/dist/commands/scan.js +352 -0
  122. package/dist/commands/scan.js.map +1 -0
  123. package/dist/commands/score.d.ts +10 -0
  124. package/dist/commands/score.d.ts.map +1 -0
  125. package/dist/commands/score.js +192 -0
  126. package/dist/commands/score.js.map +1 -0
  127. package/dist/commands/security.d.ts +10 -0
  128. package/dist/commands/security.d.ts.map +1 -0
  129. package/dist/commands/security.js +211 -0
  130. package/dist/commands/security.js.map +1 -0
  131. package/dist/commands/simulate.d.ts +7 -0
  132. package/dist/commands/simulate.d.ts.map +1 -0
  133. package/dist/commands/simulate.js +149 -0
  134. package/dist/commands/simulate.js.map +1 -0
  135. package/dist/commands/summary.d.ts +9 -0
  136. package/dist/commands/summary.d.ts.map +1 -0
  137. package/dist/commands/summary.js +271 -0
  138. package/dist/commands/summary.js.map +1 -0
  139. package/dist/commands/test.d.ts +9 -0
  140. package/dist/commands/test.d.ts.map +1 -0
  141. package/dist/commands/test.js +219 -0
  142. package/dist/commands/test.js.map +1 -0
  143. package/dist/commands/ui.d.ts +8 -0
  144. package/dist/commands/ui.d.ts.map +1 -0
  145. package/dist/commands/ui.js +222 -0
  146. package/dist/commands/ui.js.map +1 -0
  147. package/dist/commands/validate.d.ts +7 -0
  148. package/dist/commands/validate.d.ts.map +1 -0
  149. package/dist/commands/validate.js +254 -0
  150. package/dist/commands/validate.js.map +1 -0
  151. package/dist/commands/workflow.d.ts +39 -0
  152. package/dist/commands/workflow.d.ts.map +1 -0
  153. package/dist/commands/workflow.js +309 -0
  154. package/dist/commands/workflow.js.map +1 -0
  155. package/dist/core/__tests__/contextAnalyzer.test.d.ts +2 -0
  156. package/dist/core/__tests__/contextAnalyzer.test.d.ts.map +1 -0
  157. package/dist/core/__tests__/contextAnalyzer.test.js +48 -0
  158. package/dist/core/__tests__/contextAnalyzer.test.js.map +1 -0
  159. package/dist/core/__tests__/promptLinter.test.d.ts +2 -0
  160. package/dist/core/__tests__/promptLinter.test.d.ts.map +1 -0
  161. package/dist/core/__tests__/promptLinter.test.js +74 -0
  162. package/dist/core/__tests__/promptLinter.test.js.map +1 -0
  163. package/dist/core/__tests__/promptRunner.test.d.ts +2 -0
  164. package/dist/core/__tests__/promptRunner.test.d.ts.map +1 -0
  165. package/dist/core/__tests__/promptRunner.test.js +84 -0
  166. package/dist/core/__tests__/promptRunner.test.js.map +1 -0
  167. package/dist/core/__tests__/securityScanner.test.d.ts +2 -0
  168. package/dist/core/__tests__/securityScanner.test.d.ts.map +1 -0
  169. package/dist/core/__tests__/securityScanner.test.js +39 -0
  170. package/dist/core/__tests__/securityScanner.test.js.map +1 -0
  171. package/dist/core/agentTracer.d.ts +21 -0
  172. package/dist/core/agentTracer.d.ts.map +1 -0
  173. package/dist/core/agentTracer.js +355 -0
  174. package/dist/core/agentTracer.js.map +1 -0
  175. package/dist/core/anthropicClient.d.ts +26 -0
  176. package/dist/core/anthropicClient.d.ts.map +1 -0
  177. package/dist/core/anthropicClient.js +62 -0
  178. package/dist/core/anthropicClient.js.map +1 -0
  179. package/dist/core/benchmarkRunner.d.ts +25 -0
  180. package/dist/core/benchmarkRunner.d.ts.map +1 -0
  181. package/dist/core/benchmarkRunner.js +182 -0
  182. package/dist/core/benchmarkRunner.js.map +1 -0
  183. package/dist/core/contextAnalyzer.d.ts +19 -0
  184. package/dist/core/contextAnalyzer.d.ts.map +1 -0
  185. package/dist/core/contextAnalyzer.js +221 -0
  186. package/dist/core/contextAnalyzer.js.map +1 -0
  187. package/dist/core/contextPacker.d.ts +26 -0
  188. package/dist/core/contextPacker.d.ts.map +1 -0
  189. package/dist/core/contextPacker.js +358 -0
  190. package/dist/core/contextPacker.js.map +1 -0
  191. package/dist/core/datasetRunner.d.ts +10 -0
  192. package/dist/core/datasetRunner.d.ts.map +1 -0
  193. package/dist/core/datasetRunner.js +130 -0
  194. package/dist/core/datasetRunner.js.map +1 -0
  195. package/dist/core/doctorRunner.d.ts +24 -0
  196. package/dist/core/doctorRunner.d.ts.map +1 -0
  197. package/dist/core/doctorRunner.js +278 -0
  198. package/dist/core/doctorRunner.js.map +1 -0
  199. package/dist/core/hookScanner.d.ts +24 -0
  200. package/dist/core/hookScanner.d.ts.map +1 -0
  201. package/dist/core/hookScanner.js +226 -0
  202. package/dist/core/hookScanner.js.map +1 -0
  203. package/dist/core/mcpScanner.d.ts +22 -0
  204. package/dist/core/mcpScanner.d.ts.map +1 -0
  205. package/dist/core/mcpScanner.js +290 -0
  206. package/dist/core/mcpScanner.js.map +1 -0
  207. package/dist/core/modelRegistry.d.ts +35 -0
  208. package/dist/core/modelRegistry.d.ts.map +1 -0
  209. package/dist/core/modelRegistry.js +97 -0
  210. package/dist/core/modelRegistry.js.map +1 -0
  211. package/dist/core/promptDiff.d.ts +25 -0
  212. package/dist/core/promptDiff.d.ts.map +1 -0
  213. package/dist/core/promptDiff.js +130 -0
  214. package/dist/core/promptDiff.js.map +1 -0
  215. package/dist/core/promptExplainer.d.ts +17 -0
  216. package/dist/core/promptExplainer.d.ts.map +1 -0
  217. package/dist/core/promptExplainer.js +334 -0
  218. package/dist/core/promptExplainer.js.map +1 -0
  219. package/dist/core/promptImprover.d.ts +19 -0
  220. package/dist/core/promptImprover.d.ts.map +1 -0
  221. package/dist/core/promptImprover.js +260 -0
  222. package/dist/core/promptImprover.js.map +1 -0
  223. package/dist/core/promptLinter.d.ts +24 -0
  224. package/dist/core/promptLinter.d.ts.map +1 -0
  225. package/dist/core/promptLinter.js +319 -0
  226. package/dist/core/promptLinter.js.map +1 -0
  227. package/dist/core/promptRunner.d.ts +31 -0
  228. package/dist/core/promptRunner.d.ts.map +1 -0
  229. package/dist/core/promptRunner.js +427 -0
  230. package/dist/core/promptRunner.js.map +1 -0
  231. package/dist/core/providers/anthropic.d.ts +10 -0
  232. package/dist/core/providers/anthropic.d.ts.map +1 -0
  233. package/dist/core/providers/anthropic.js +26 -0
  234. package/dist/core/providers/anthropic.js.map +1 -0
  235. package/dist/core/providers/base.d.ts +22 -0
  236. package/dist/core/providers/base.d.ts.map +1 -0
  237. package/dist/core/providers/base.js +2 -0
  238. package/dist/core/providers/base.js.map +1 -0
  239. package/dist/core/providers/factory.d.ts +7 -0
  240. package/dist/core/providers/factory.d.ts.map +1 -0
  241. package/dist/core/providers/factory.js +42 -0
  242. package/dist/core/providers/factory.js.map +1 -0
  243. package/dist/core/providers/google.d.ts +10 -0
  244. package/dist/core/providers/google.d.ts.map +1 -0
  245. package/dist/core/providers/google.js +47 -0
  246. package/dist/core/providers/google.js.map +1 -0
  247. package/dist/core/providers/openai.d.ts +19 -0
  248. package/dist/core/providers/openai.d.ts.map +1 -0
  249. package/dist/core/providers/openai.js +54 -0
  250. package/dist/core/providers/openai.js.map +1 -0
  251. package/dist/core/regressionRunner.d.ts +11 -0
  252. package/dist/core/regressionRunner.d.ts.map +1 -0
  253. package/dist/core/regressionRunner.js +116 -0
  254. package/dist/core/regressionRunner.js.map +1 -0
  255. package/dist/core/repositorySimulator.d.ts +17 -0
  256. package/dist/core/repositorySimulator.d.ts.map +1 -0
  257. package/dist/core/repositorySimulator.js +104 -0
  258. package/dist/core/repositorySimulator.js.map +1 -0
  259. package/dist/core/scorer.d.ts +30 -0
  260. package/dist/core/scorer.d.ts.map +1 -0
  261. package/dist/core/scorer.js +317 -0
  262. package/dist/core/scorer.js.map +1 -0
  263. package/dist/core/securityScanner.d.ts +23 -0
  264. package/dist/core/securityScanner.d.ts.map +1 -0
  265. package/dist/core/securityScanner.js +216 -0
  266. package/dist/core/securityScanner.js.map +1 -0
  267. package/dist/core/skillValidator.d.ts +41 -0
  268. package/dist/core/skillValidator.d.ts.map +1 -0
  269. package/dist/core/skillValidator.js +235 -0
  270. package/dist/core/skillValidator.js.map +1 -0
  271. package/dist/core/testHistory.d.ts +44 -0
  272. package/dist/core/testHistory.d.ts.map +1 -0
  273. package/dist/core/testHistory.js +91 -0
  274. package/dist/core/testHistory.js.map +1 -0
  275. package/dist/tokenizers/claudeTokenizer.d.ts +26 -0
  276. package/dist/tokenizers/claudeTokenizer.d.ts.map +1 -0
  277. package/dist/tokenizers/claudeTokenizer.js +83 -0
  278. package/dist/tokenizers/claudeTokenizer.js.map +1 -0
  279. package/dist/types/agent.d.ts +26 -0
  280. package/dist/types/agent.d.ts.map +1 -0
  281. package/dist/types/agent.js +5 -0
  282. package/dist/types/agent.js.map +1 -0
  283. package/dist/types/config.d.ts +30 -0
  284. package/dist/types/config.d.ts.map +1 -0
  285. package/dist/types/config.js +5 -0
  286. package/dist/types/config.js.map +1 -0
  287. package/dist/types/context.d.ts +77 -0
  288. package/dist/types/context.d.ts.map +1 -0
  289. package/dist/types/context.js +5 -0
  290. package/dist/types/context.js.map +1 -0
  291. package/dist/types/dataset.d.ts +26 -0
  292. package/dist/types/dataset.d.ts.map +1 -0
  293. package/dist/types/dataset.js +5 -0
  294. package/dist/types/dataset.js.map +1 -0
  295. package/dist/types/diagnostics.d.ts +31 -0
  296. package/dist/types/diagnostics.d.ts.map +1 -0
  297. package/dist/types/diagnostics.js +5 -0
  298. package/dist/types/diagnostics.js.map +1 -0
  299. package/dist/types/prompt.d.ts +53 -0
  300. package/dist/types/prompt.d.ts.map +1 -0
  301. package/dist/types/prompt.js +5 -0
  302. package/dist/types/prompt.js.map +1 -0
  303. package/dist/types/results.d.ts +42 -0
  304. package/dist/types/results.d.ts.map +1 -0
  305. package/dist/types/results.js +5 -0
  306. package/dist/types/results.js.map +1 -0
  307. package/dist/ui/dashboard.d.ts +57 -0
  308. package/dist/ui/dashboard.d.ts.map +1 -0
  309. package/dist/ui/dashboard.js +644 -0
  310. package/dist/ui/dashboard.js.map +1 -0
  311. package/dist/utils/__tests__/hashing.test.d.ts +2 -0
  312. package/dist/utils/__tests__/hashing.test.d.ts.map +1 -0
  313. package/dist/utils/__tests__/hashing.test.js +28 -0
  314. package/dist/utils/__tests__/hashing.test.js.map +1 -0
  315. package/dist/utils/__tests__/output.test.d.ts +2 -0
  316. package/dist/utils/__tests__/output.test.d.ts.map +1 -0
  317. package/dist/utils/__tests__/output.test.js +62 -0
  318. package/dist/utils/__tests__/output.test.js.map +1 -0
  319. package/dist/utils/cache.d.ts +29 -0
  320. package/dist/utils/cache.d.ts.map +1 -0
  321. package/dist/utils/cache.js +87 -0
  322. package/dist/utils/cache.js.map +1 -0
  323. package/dist/utils/config.d.ts +15 -0
  324. package/dist/utils/config.d.ts.map +1 -0
  325. package/dist/utils/config.js +61 -0
  326. package/dist/utils/config.js.map +1 -0
  327. package/dist/utils/errors.d.ts +43 -0
  328. package/dist/utils/errors.d.ts.map +1 -0
  329. package/dist/utils/errors.js +83 -0
  330. package/dist/utils/errors.js.map +1 -0
  331. package/dist/utils/fs.d.ts +44 -0
  332. package/dist/utils/fs.d.ts.map +1 -0
  333. package/dist/utils/fs.js +119 -0
  334. package/dist/utils/fs.js.map +1 -0
  335. package/dist/utils/hashing.d.ts +13 -0
  336. package/dist/utils/hashing.d.ts.map +1 -0
  337. package/dist/utils/hashing.js +18 -0
  338. package/dist/utils/hashing.js.map +1 -0
  339. package/dist/utils/logger.d.ts +32 -0
  340. package/dist/utils/logger.d.ts.map +1 -0
  341. package/dist/utils/logger.js +76 -0
  342. package/dist/utils/logger.js.map +1 -0
  343. package/dist/utils/output.d.ts +34 -0
  344. package/dist/utils/output.d.ts.map +1 -0
  345. package/dist/utils/output.js +99 -0
  346. package/dist/utils/output.js.map +1 -0
  347. package/dist/utils/paths.d.ts +33 -0
  348. package/dist/utils/paths.d.ts.map +1 -0
  349. package/dist/utils/paths.js +51 -0
  350. package/dist/utils/paths.js.map +1 -0
  351. package/dist/utils/spinner.d.ts +23 -0
  352. package/dist/utils/spinner.d.ts.map +1 -0
  353. package/dist/utils/spinner.js +79 -0
  354. package/dist/utils/spinner.js.map +1 -0
  355. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `codeprobe cost [path]` — Estimate context cost across AI models.
3
+ *
4
+ * Analyzes the repository token count and shows how much it would cost
5
+ * to send the full context to various popular models.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerCostCommand(program: Command): void;
9
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkH1D"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * `codeprobe cost [path]` — Estimate context cost across AI models.
3
+ *
4
+ * Analyzes the repository token count and shows how much it would cost
5
+ * to send the full context to various popular models.
6
+ */
7
+ import { resolvePath } from '../utils/paths.js';
8
+ import { stat } from 'node:fs/promises';
9
+ import { setLogLevel } from '../utils/logger.js';
10
+ import { analyzeContext } from '../core/contextAnalyzer.js';
11
+ import { getModel } from '../core/modelRegistry.js';
12
+ import { formatTokens, formatTable } from '../utils/output.js';
13
+ /** Popular models to display by default (a curated subset). */
14
+ const POPULAR_MODEL_IDS = [
15
+ 'claude-sonnet-4-6',
16
+ 'claude-opus-4-6',
17
+ 'gpt-4.1',
18
+ 'gpt-4o',
19
+ 'gemini-2.5-pro',
20
+ 'gemini-2.5-flash',
21
+ 'deepseek-v3',
22
+ ];
23
+ function formatContextWindow(tokens) {
24
+ if (tokens >= 1_000_000)
25
+ return `${(tokens / 1_000_000).toFixed(0)}M`;
26
+ return `${Math.round(tokens / 1000)}k`;
27
+ }
28
+ function formatDollars(amount) {
29
+ if (amount < 0.005)
30
+ return `$${amount.toFixed(4)}`;
31
+ return `$${amount.toFixed(2)}`;
32
+ }
33
+ function buildEstimates(models, estimatedTokens) {
34
+ return models.map((model) => {
35
+ const inputCost = (estimatedTokens / 1_000_000) * model.inputPricePer1M;
36
+ const outputCostPer1k = (1000 / 1_000_000) * model.outputPricePer1M;
37
+ return { model, inputCost, outputCostPer1k };
38
+ });
39
+ }
40
+ export function registerCostCommand(program) {
41
+ program
42
+ .command('cost [path]')
43
+ .description('Estimate context cost — how much it costs to send this repo to various AI models')
44
+ .option('--model <model>', 'Show cost for a specific model only')
45
+ .option('--json', 'Output cost estimates as JSON')
46
+ .action(async (pathArg, options) => {
47
+ if (options.json) {
48
+ setLogLevel('silent');
49
+ }
50
+ const chalk = (await import('chalk')).default;
51
+ const targetPath = resolvePath(pathArg ?? '.');
52
+ try {
53
+ await stat(targetPath);
54
+ }
55
+ catch {
56
+ console.error(`Error: path not found: ${targetPath}`);
57
+ process.exitCode = 1;
58
+ return;
59
+ }
60
+ // Analyze the repository to get token count
61
+ const analysis = await analyzeContext(targetPath);
62
+ const estimatedTokens = analysis.estimatedTokens;
63
+ // Determine which models to show
64
+ let models;
65
+ if (options.model) {
66
+ const modelInfo = getModel(options.model);
67
+ if (!modelInfo) {
68
+ console.error(`Error: unknown model "${options.model}". Use a model id from the registry (e.g., claude-sonnet-4-6, gpt-4o, gemini-2.5-pro).`);
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ models = [modelInfo];
73
+ }
74
+ else {
75
+ models = POPULAR_MODEL_IDS
76
+ .map((id) => getModel(id))
77
+ .filter((m) => m !== undefined);
78
+ }
79
+ const estimates = buildEstimates(models, estimatedTokens);
80
+ // Find cheapest
81
+ const cheapest = [...estimates].sort((a, b) => a.inputCost - b.inputCost)[0];
82
+ // Find best value (cheapest among models with >= 500k context)
83
+ const largeContextModels = estimates.filter((e) => e.model.contextWindow >= 500_000);
84
+ const bestValue = largeContextModels.length > 0
85
+ ? [...largeContextModels].sort((a, b) => a.inputCost - b.inputCost)[0]
86
+ : undefined;
87
+ if (options.json) {
88
+ const jsonResult = {
89
+ rootPath: targetPath,
90
+ estimatedTokens,
91
+ estimates: estimates.map((e) => ({
92
+ modelId: e.model.id,
93
+ modelName: e.model.name,
94
+ provider: e.model.provider,
95
+ contextWindow: e.model.contextWindow,
96
+ inputCost: e.inputCost,
97
+ outputCostPer1k: e.outputCostPer1k,
98
+ fits: estimatedTokens <= e.model.contextWindow,
99
+ })),
100
+ cheapest: cheapest ? { modelId: cheapest.model.id, inputCost: cheapest.inputCost } : null,
101
+ bestValue: bestValue ? { modelId: bestValue.model.id, inputCost: bestValue.inputCost, contextWindow: bestValue.model.contextWindow } : null,
102
+ };
103
+ console.log(JSON.stringify(jsonResult, null, 2));
104
+ return;
105
+ }
106
+ // Pretty-print output
107
+ console.log(chalk.bold('\nContext Cost Estimate'));
108
+ console.log(chalk.dim(` Repository: ${targetPath}`));
109
+ console.log(` Estimated tokens: ${formatTokens(estimatedTokens)}`);
110
+ console.log('');
111
+ const headers = ['Model', 'Context', 'Input Cost', 'Output Cost (1k tokens)'];
112
+ const rows = estimates.map((e) => {
113
+ const fits = estimatedTokens <= e.model.contextWindow;
114
+ const contextStr = formatContextWindow(e.model.contextWindow);
115
+ const contextDisplay = fits ? contextStr : chalk.red(contextStr + ' *');
116
+ return [
117
+ e.model.name,
118
+ contextDisplay,
119
+ formatDollars(e.inputCost),
120
+ formatDollars(e.outputCostPer1k),
121
+ ];
122
+ });
123
+ const table = formatTable(headers, rows);
124
+ for (const line of table.split('\n')) {
125
+ console.log(` ${line}`);
126
+ }
127
+ // Show if any model can't fit the context
128
+ const overflowModels = estimates.filter((e) => estimatedTokens > e.model.contextWindow);
129
+ if (overflowModels.length > 0) {
130
+ console.log(chalk.dim(`\n * Context exceeds model's window`));
131
+ }
132
+ console.log('');
133
+ if (cheapest) {
134
+ console.log(` Cheapest: ${chalk.green(cheapest.model.name)} (${formatDollars(cheapest.inputCost)} input)`);
135
+ }
136
+ if (bestValue && bestValue !== cheapest) {
137
+ console.log(` Best value: ${chalk.green(bestValue.model.name)} (${formatDollars(bestValue.inputCost)} input, ${formatContextWindow(bestValue.model.contextWindow)} context)`);
138
+ }
139
+ console.log('');
140
+ });
141
+ }
142
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `codeprobe dashboard [path]` — Rich terminal dashboard.
3
+ *
4
+ * Runs context analysis, asset scanning, doctor checks, and workflow
5
+ * detection, then prints a beautiful overview using chalk and Unicode
6
+ * box-drawing characters.
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare function registerDashboardCommand(program: Command): void;
10
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4cpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmJ/D"}
@@ -0,0 +1,462 @@
1
+ /**
2
+ * `codeprobe dashboard [path]` — Rich terminal dashboard.
3
+ *
4
+ * Runs context analysis, asset scanning, doctor checks, and workflow
5
+ * detection, then prints a beautiful overview using chalk and Unicode
6
+ * box-drawing characters.
7
+ */
8
+ import { resolve, basename } from 'node:path';
9
+ import { stat } from 'node:fs/promises';
10
+ import { setLogLevel } from '../utils/logger.js';
11
+ import { analyzeContext } from '../core/contextAnalyzer.js';
12
+ import { scanForClaudeAssets } from '../core/agentTracer.js';
13
+ import { doctorRunner } from './doctor.js';
14
+ import { analyzeWorkflow } from './workflow.js';
15
+ import { formatTokens, formatBytes } from '../utils/output.js';
16
+ const BOX_WIDTH = 66;
17
+ function topBox(chalk, title, subtitle) {
18
+ const lines = [];
19
+ const inner = BOX_WIDTH - 2;
20
+ lines.push(chalk.dim('\u2554' + '\u2550'.repeat(inner) + '\u2557'));
21
+ // Title row: pad based on visible length
22
+ const styledTitle = ' ' + chalk.bold(chalk.cyan(title));
23
+ const titleVisible = ' ' + title;
24
+ const titlePad = inner - titleVisible.length;
25
+ lines.push(chalk.dim('\u2551') + styledTitle + ' '.repeat(Math.max(0, titlePad)) + chalk.dim('\u2551'));
26
+ // Subtitle row: pad based on visible length
27
+ const styledSub = ' ' + chalk.dim(subtitle);
28
+ const subVisible = ' ' + subtitle;
29
+ const subPad = inner - subVisible.length;
30
+ lines.push(chalk.dim('\u2551') + styledSub + ' '.repeat(Math.max(0, subPad)) + chalk.dim('\u2551'));
31
+ lines.push(chalk.dim('\u255A' + '\u2550'.repeat(inner) + '\u255D'));
32
+ return lines.join('\n');
33
+ }
34
+ function sectionTop(chalk, title) {
35
+ const inner = BOX_WIDTH - 2;
36
+ const label = `\u2500 ${title} `;
37
+ const pad = inner - label.length;
38
+ return chalk.dim('\u250C') + chalk.dim(label) + chalk.dim('\u2500'.repeat(Math.max(0, pad))) + chalk.dim('\u2510');
39
+ }
40
+ function sectionRow(chalk, content) {
41
+ const inner = BOX_WIDTH - 2;
42
+ // Strip ANSI for length calculation
43
+ const stripped = content.replace(/\u001B\[[0-9;]*m/g, '');
44
+ if (stripped.length > inner) {
45
+ // Truncate content to fit inside the box
46
+ // We need to truncate the visible characters while preserving ANSI codes
47
+ let visibleCount = 0;
48
+ const ansiRegex = /\u001B\[[0-9;]*m/g;
49
+ let lastIndex = 0;
50
+ let match;
51
+ const segments = [];
52
+ while ((match = ansiRegex.exec(content)) !== null) {
53
+ if (match.index > lastIndex) {
54
+ segments.push({ start: lastIndex, end: match.index, isAnsi: false });
55
+ }
56
+ segments.push({ start: match.index, end: match.index + match[0].length, isAnsi: true });
57
+ lastIndex = match.index + match[0].length;
58
+ }
59
+ if (lastIndex < content.length) {
60
+ segments.push({ start: lastIndex, end: content.length, isAnsi: false });
61
+ }
62
+ let truncated = '';
63
+ const maxVisible = inner - 1; // Leave room for closing border
64
+ for (const seg of segments) {
65
+ if (seg.isAnsi) {
66
+ truncated += content.slice(seg.start, seg.end);
67
+ }
68
+ else {
69
+ const remaining = maxVisible - visibleCount;
70
+ const text = content.slice(seg.start, seg.end);
71
+ if (text.length <= remaining) {
72
+ truncated += text;
73
+ visibleCount += text.length;
74
+ }
75
+ else {
76
+ truncated += text.slice(0, remaining);
77
+ visibleCount += remaining;
78
+ break;
79
+ }
80
+ }
81
+ }
82
+ const truncStripped = truncated.replace(/\u001B\[[0-9;]*m/g, '');
83
+ const truncPad = inner - truncStripped.length;
84
+ return chalk.dim('\u2502') + truncated + ' '.repeat(Math.max(0, truncPad)) + chalk.dim('\u2502');
85
+ }
86
+ const pad = inner - stripped.length;
87
+ return chalk.dim('\u2502') + content + ' '.repeat(Math.max(0, pad)) + chalk.dim('\u2502');
88
+ }
89
+ function sectionBottom(chalk) {
90
+ const inner = BOX_WIDTH - 2;
91
+ return chalk.dim('\u2514') + chalk.dim('\u2500'.repeat(inner)) + chalk.dim('\u2518');
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Bar rendering
95
+ // ---------------------------------------------------------------------------
96
+ function renderBar(chalk, ratio, barWidth) {
97
+ const clamped = Math.max(0, Math.min(1, ratio));
98
+ const filled = Math.round(clamped * barWidth);
99
+ const empty = barWidth - filled;
100
+ return chalk.green('\u2588'.repeat(filled)) + chalk.dim('\u2591'.repeat(empty));
101
+ }
102
+ function renderFitBar(chalk, ratio, barWidth, fits) {
103
+ const clamped = Math.max(0, Math.min(1, ratio));
104
+ const filled = Math.round(clamped * barWidth);
105
+ const empty = barWidth - filled;
106
+ const color = fits ? chalk.green : chalk.red;
107
+ return color('\u2588'.repeat(filled)) + chalk.dim('\u2591'.repeat(empty));
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Section renderers
111
+ // ---------------------------------------------------------------------------
112
+ function renderOverview(chalk, analysis, doctorChecks, workflowScore, workflowMax, aiToolCount) {
113
+ const lines = [];
114
+ lines.push(sectionTop(chalk, 'Overview'));
115
+ const passCount = doctorChecks.filter((c) => c.status === 'pass').length;
116
+ const totalChecks = doctorChecks.length;
117
+ const hasFail = doctorChecks.some((c) => c.status === 'fail');
118
+ const hasWarn = doctorChecks.some((c) => c.status === 'warn');
119
+ const doctorIcon = hasFail ? chalk.red('\u2717') : hasWarn ? chalk.yellow('!') : chalk.green('\u2713');
120
+ const filesStr = `Files: ${analysis.totalFiles}`;
121
+ const tokensStr = `Tokens: ${formatTokens(analysis.estimatedTokens)}`;
122
+ const sizeStr = `Size: ${formatBytes(analysis.totalBytes)}`;
123
+ const row1 = ` ${filesStr.padEnd(16)}${tokensStr.padEnd(21)}${sizeStr}`;
124
+ lines.push(sectionRow(chalk, row1));
125
+ const workflowStr = `Workflow: ${workflowScore}/${workflowMax}`;
126
+ const aiStr = `AI Tools: ${aiToolCount} detected`;
127
+ // Handle ANSI in doctorIcon when calculating padding
128
+ const row2Content = ` Doctor: ${passCount}/${totalChecks} ${doctorIcon}`;
129
+ const row2Stripped = ` Doctor: ${passCount}/${totalChecks} X`;
130
+ const row2Pad = 16 - row2Stripped.length;
131
+ const row2Final = row2Content + ' '.repeat(Math.max(0, row2Pad)) + workflowStr.padEnd(20) + aiStr;
132
+ lines.push(sectionRow(chalk, row2Final));
133
+ lines.push(sectionBottom(chalk));
134
+ return lines;
135
+ }
136
+ function renderContextFit(chalk, analysis) {
137
+ const lines = [];
138
+ lines.push(sectionTop(chalk, 'Context Window Fit'));
139
+ lines.push(sectionRow(chalk, ''));
140
+ // Models to show fit for
141
+ const fitModels = [
142
+ { id: 'gpt-4o', label: 'GPT-4o (128k)', contextWindow: 128_000 },
143
+ { id: 'claude-sonnet-4-6', label: 'Claude (200k)', contextWindow: 200_000 },
144
+ { id: 'gemini-2.5-pro', label: 'Gemini 2.5 (1M)', contextWindow: 1_048_576 },
145
+ { id: 'gpt-4.1', label: 'GPT-4.1 (1M)', contextWindow: 1_047_576 },
146
+ ];
147
+ const barWidth = 32;
148
+ const totalTokens = analysis.estimatedTokens;
149
+ const labelWidth = 18;
150
+ for (const model of fitModels) {
151
+ const ratio = totalTokens / model.contextWindow;
152
+ const pct = Math.min(Math.round(ratio * 100), 999);
153
+ const fits = totalTokens <= model.contextWindow;
154
+ const bar = renderFitBar(chalk, ratio, barWidth, fits);
155
+ const icon = fits ? chalk.green('\u2713') : chalk.red('\u2717');
156
+ const pctStr = `${pct}%`.padStart(4);
157
+ const label = model.label.padEnd(labelWidth);
158
+ lines.push(sectionRow(chalk, ` ${label} ${bar} ${pctStr} ${icon}`));
159
+ }
160
+ lines.push(sectionRow(chalk, ''));
161
+ lines.push(sectionBottom(chalk));
162
+ return lines;
163
+ }
164
+ function renderTopFiles(chalk, analysis) {
165
+ const lines = [];
166
+ lines.push(sectionTop(chalk, 'Top Files by Tokens'));
167
+ lines.push(sectionRow(chalk, ''));
168
+ const topFiles = analysis.largestFiles.slice(0, 10);
169
+ if (topFiles.length === 0) {
170
+ lines.push(sectionRow(chalk, chalk.dim(' No files found')));
171
+ lines.push(sectionRow(chalk, ''));
172
+ lines.push(sectionBottom(chalk));
173
+ return lines;
174
+ }
175
+ const maxTokens = topFiles[0]?.estimatedTokens ?? 1;
176
+ const barWidth = 16;
177
+ const nameWidth = 30;
178
+ for (const file of topFiles) {
179
+ const ratio = file.estimatedTokens / maxTokens;
180
+ const bar = renderBar(chalk, ratio, barWidth);
181
+ const name = file.path.length > nameWidth
182
+ ? '...' + file.path.slice(-(nameWidth - 3))
183
+ : file.path.padEnd(nameWidth);
184
+ const tokenStr = formatTokens(file.estimatedTokens).padStart(6);
185
+ lines.push(sectionRow(chalk, ` ${name} ${bar} ${tokenStr}`));
186
+ }
187
+ if (analysis.largestFiles.length > 10) {
188
+ lines.push(sectionRow(chalk, chalk.dim(` ... ${analysis.largestFiles.length - 10} more files`)));
189
+ }
190
+ lines.push(sectionRow(chalk, ''));
191
+ lines.push(sectionBottom(chalk));
192
+ return lines;
193
+ }
194
+ function renderExtensions(chalk, analysis) {
195
+ const lines = [];
196
+ lines.push(sectionTop(chalk, 'Extensions'));
197
+ const totalTokens = analysis.estimatedTokens || 1;
198
+ const barWidth = 20;
199
+ // Show top extensions, group the rest as "other"
200
+ const topExtCount = 4;
201
+ const topExts = analysis.extensionBreakdown.slice(0, topExtCount);
202
+ const otherExts = analysis.extensionBreakdown.slice(topExtCount);
203
+ const otherFiles = otherExts.reduce((sum, e) => sum + e.fileCount, 0);
204
+ const otherTokens = otherExts.reduce((sum, e) => sum + e.estimatedTokens, 0);
205
+ for (const ext of topExts) {
206
+ const pct = ext.estimatedTokens / totalTokens;
207
+ const bar = renderBar(chalk, pct, barWidth);
208
+ const pctStr = `${Math.round(pct * 100)}%`.padStart(4);
209
+ const extLabel = ext.extension.padEnd(6);
210
+ const countStr = `${ext.fileCount} files`.padEnd(10);
211
+ const tokenStr = `${formatTokens(ext.estimatedTokens)} tokens`.padEnd(14);
212
+ lines.push(sectionRow(chalk, ` ${extLabel} ${countStr} ${tokenStr} ${bar} ${pctStr}`));
213
+ }
214
+ if (otherFiles > 0) {
215
+ const pct = otherTokens / totalTokens;
216
+ const bar = renderBar(chalk, pct, barWidth);
217
+ const pctStr = `${Math.round(pct * 100)}%`.padStart(4);
218
+ const extLabel = 'other'.padEnd(6);
219
+ const countStr = `${otherFiles} files`.padEnd(10);
220
+ const tokenStr = `${formatTokens(otherTokens)} tokens`.padEnd(14);
221
+ lines.push(sectionRow(chalk, ` ${extLabel} ${countStr} ${tokenStr} ${bar} ${pctStr}`));
222
+ }
223
+ lines.push(sectionBottom(chalk));
224
+ return lines;
225
+ }
226
+ function renderDoctor(chalk, checks) {
227
+ const lines = [];
228
+ lines.push(sectionTop(chalk, 'Doctor'));
229
+ // Render checks in compact rows of 3
230
+ const items = checks.map((c) => {
231
+ const icon = c.status === 'pass'
232
+ ? chalk.green('\u2713')
233
+ : c.status === 'warn'
234
+ ? chalk.yellow('!')
235
+ : chalk.red('\u2717');
236
+ // Extract short label from name and message
237
+ let label = c.name;
238
+ if (c.name === 'Node.js version') {
239
+ const verMatch = c.message.match(/v[\d.]+/);
240
+ label = `Node.js ${verMatch ? verMatch[0] : ''}`;
241
+ }
242
+ else if (c.name === 'npm') {
243
+ label = `npm ${c.message}`;
244
+ }
245
+ else if (c.name === 'git') {
246
+ const gitMatch = c.message.match(/[\d.]+/);
247
+ label = `git v${gitMatch ? gitMatch[0] : ''}`;
248
+ }
249
+ else if (c.name === 'package.json') {
250
+ label = 'package.json';
251
+ }
252
+ else if (c.name === 'codeprobe config' || c.name === 'Configuration file') {
253
+ label = 'config';
254
+ }
255
+ else if (c.name === 'CLAUDE.md') {
256
+ label = 'CLAUDE.md';
257
+ }
258
+ else if (c.name === 'prompts/ directory') {
259
+ label = 'prompts/';
260
+ }
261
+ else if (c.name === 'tiktoken') {
262
+ label = 'tiktoken';
263
+ }
264
+ else if (c.name === 'Cache directory' || c.name === '.cache/ directory') {
265
+ label = 'cache';
266
+ }
267
+ return `${icon} ${label}`;
268
+ });
269
+ // Layout in rows of 3
270
+ const perRow = 3;
271
+ const colWidth = 20;
272
+ for (let i = 0; i < items.length; i += perRow) {
273
+ const row = items.slice(i, i + perRow);
274
+ // Pad each item to colWidth (accounting for ANSI)
275
+ const paddedItems = row.map((item) => {
276
+ const stripped = item.replace(/\u001B\[[0-9;]*m/g, '');
277
+ const pad = colWidth - stripped.length;
278
+ return item + ' '.repeat(Math.max(0, pad));
279
+ });
280
+ lines.push(sectionRow(chalk, ' ' + paddedItems.join('')));
281
+ }
282
+ lines.push(sectionBottom(chalk));
283
+ return lines;
284
+ }
285
+ function renderAITools(chalk, assets) {
286
+ const lines = [];
287
+ lines.push(sectionTop(chalk, 'AI Tools'));
288
+ if (assets.length === 0) {
289
+ lines.push(sectionRow(chalk, chalk.dim(' No AI tool configurations detected')));
290
+ lines.push(sectionBottom(chalk));
291
+ return lines;
292
+ }
293
+ // Group by type and show a summary line per tool
294
+ const typeLabels = {
295
+ 'claude-config': 'Claude Code',
296
+ 'cursor-config': 'Cursor',
297
+ 'windsurf-config': 'Windsurf',
298
+ 'copilot-config': 'GitHub Copilot',
299
+ 'aider-config': 'Aider',
300
+ 'continue-config': 'Continue',
301
+ 'cline-config': 'Cline',
302
+ 'codex-config': 'Codex',
303
+ 'agent': 'Agent',
304
+ 'skill': 'Skill',
305
+ 'hook': 'Hook',
306
+ 'mcp-config': 'MCP Config',
307
+ 'prompt-spec': 'Prompt Spec',
308
+ 'context-file': 'Context File',
309
+ 'agentic-workflow': 'Workflow',
310
+ };
311
+ const grouped = new Map();
312
+ for (const asset of assets) {
313
+ const label = typeLabels[asset.type] ?? asset.type;
314
+ const existing = grouped.get(label);
315
+ const fileName = basename(asset.path);
316
+ if (existing) {
317
+ existing.push(fileName);
318
+ }
319
+ else {
320
+ grouped.set(label, [fileName]);
321
+ }
322
+ }
323
+ for (const [tool, files] of grouped) {
324
+ lines.push(sectionRow(chalk, ` ${chalk.bold(tool)}: ${files.join(', ')}`));
325
+ }
326
+ lines.push(sectionBottom(chalk));
327
+ return lines;
328
+ }
329
+ // ---------------------------------------------------------------------------
330
+ // Main command
331
+ // ---------------------------------------------------------------------------
332
+ export function registerDashboardCommand(program) {
333
+ program
334
+ .command('dashboard')
335
+ .argument('[path]', 'Path to analyze', '.')
336
+ .description('Rich terminal dashboard — context, models, doctor, and AI tools at a glance')
337
+ .option('--json', 'Output dashboard data as JSON')
338
+ .action(async (pathArg, options) => {
339
+ if (options.json) {
340
+ setLogLevel('silent');
341
+ }
342
+ const targetPath = resolve(pathArg);
343
+ // Verify path exists
344
+ try {
345
+ const s = await stat(targetPath);
346
+ if (!s.isDirectory()) {
347
+ console.error(`Error: not a directory: ${targetPath}`);
348
+ process.exitCode = 1;
349
+ return;
350
+ }
351
+ }
352
+ catch {
353
+ console.error(`Error: path not found: ${targetPath}`);
354
+ process.exitCode = 1;
355
+ return;
356
+ }
357
+ // Run all analyses in parallel
358
+ const [analysis, assets, doctorChecks, workflow] = await Promise.all([
359
+ analyzeContext(targetPath),
360
+ scanForClaudeAssets(targetPath),
361
+ doctorRunner(),
362
+ analyzeWorkflow(targetPath),
363
+ ]);
364
+ // Count unique AI tool types
365
+ const aiToolTypes = new Set(assets.map((a) => a.type));
366
+ const aiToolCount = aiToolTypes.size > 0 ? assets.length : 0;
367
+ // JSON output
368
+ if (options.json) {
369
+ const fitModels = [
370
+ { id: 'gpt-4o', label: 'GPT-4o (128k)', contextWindow: 128_000 },
371
+ { id: 'claude-sonnet-4-6', label: 'Claude (200k)', contextWindow: 200_000 },
372
+ { id: 'gemini-2.5-pro', label: 'Gemini 2.5 (1M)', contextWindow: 1_048_576 },
373
+ { id: 'gpt-4.1', label: 'GPT-4.1 (1M)', contextWindow: 1_047_576 },
374
+ ];
375
+ const data = {
376
+ path: targetPath,
377
+ overview: {
378
+ files: analysis.totalFiles,
379
+ tokens: analysis.estimatedTokens,
380
+ bytes: analysis.totalBytes,
381
+ doctorPass: doctorChecks.filter((c) => c.status === 'pass').length,
382
+ doctorTotal: doctorChecks.length,
383
+ workflowScore: workflow.score,
384
+ workflowMax: workflow.maxScore,
385
+ aiToolCount,
386
+ },
387
+ contextFit: fitModels.map((m) => ({
388
+ model: m.label,
389
+ contextWindow: m.contextWindow,
390
+ utilization: analysis.estimatedTokens / m.contextWindow,
391
+ fits: analysis.estimatedTokens <= m.contextWindow,
392
+ })),
393
+ topFiles: analysis.largestFiles.slice(0, 10).map((f) => ({
394
+ path: f.path,
395
+ tokens: f.estimatedTokens,
396
+ })),
397
+ extensions: analysis.extensionBreakdown.map((e) => ({
398
+ extension: e.extension,
399
+ files: e.fileCount,
400
+ tokens: e.estimatedTokens,
401
+ percentage: analysis.estimatedTokens > 0
402
+ ? e.estimatedTokens / analysis.estimatedTokens
403
+ : 0,
404
+ })),
405
+ doctor: doctorChecks.map((c) => ({
406
+ name: c.name,
407
+ status: c.status,
408
+ message: c.message,
409
+ })),
410
+ aiTools: assets.map((a) => ({
411
+ type: a.type,
412
+ path: a.path,
413
+ })),
414
+ };
415
+ console.log(JSON.stringify(data, null, 2));
416
+ return;
417
+ }
418
+ // Rich terminal output
419
+ const chalk = (await import('chalk')).default;
420
+ console.log('');
421
+ // Header box
422
+ console.log(topBox(chalk, 'codeprobe dashboard', targetPath));
423
+ console.log('');
424
+ // Overview
425
+ const overviewLines = renderOverview(chalk, analysis, doctorChecks, workflow.score, workflow.maxScore, aiToolCount);
426
+ for (const line of overviewLines) {
427
+ console.log(line);
428
+ }
429
+ console.log('');
430
+ // Context Window Fit
431
+ const fitLines = renderContextFit(chalk, analysis);
432
+ for (const line of fitLines) {
433
+ console.log(line);
434
+ }
435
+ console.log('');
436
+ // Top Files
437
+ const topFilesLines = renderTopFiles(chalk, analysis);
438
+ for (const line of topFilesLines) {
439
+ console.log(line);
440
+ }
441
+ console.log('');
442
+ // Extensions
443
+ const extLines = renderExtensions(chalk, analysis);
444
+ for (const line of extLines) {
445
+ console.log(line);
446
+ }
447
+ console.log('');
448
+ // Doctor
449
+ const doctorLines = renderDoctor(chalk, doctorChecks);
450
+ for (const line of doctorLines) {
451
+ console.log(line);
452
+ }
453
+ console.log('');
454
+ // AI Tools
455
+ const aiToolLines = renderAITools(chalk, assets);
456
+ for (const line of aiToolLines) {
457
+ console.log(line);
458
+ }
459
+ console.log('');
460
+ });
461
+ }
462
+ //# sourceMappingURL=dashboard.js.map