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,358 @@
1
+ /**
2
+ * Context packer — the killer feature.
3
+ *
4
+ * Analyzes a repository, categorizes files, ranks them by likely usefulness,
5
+ * and builds an optimal pack plan that maximizes value within a context
6
+ * window budget.
7
+ */
8
+ import { resolve, basename, dirname } from 'node:path';
9
+ import { analyzeContext } from './contextAnalyzer.js';
10
+ import { walkDirectory, readTextFile } from '../utils/fs.js';
11
+ import { estimateTokens } from '../tokenizers/claudeTokenizer.js';
12
+ import { logger } from '../utils/logger.js';
13
+ // ---------------------------------------------------------------------------
14
+ // File categorization heuristics
15
+ // ---------------------------------------------------------------------------
16
+ /** Lock / dependency-resolution files — excluded from pack plans. */
17
+ const EXCLUDED_FILENAMES = new Set([
18
+ 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb',
19
+ 'composer.lock', 'gemfile.lock', 'poetry.lock', 'cargo.lock',
20
+ 'go.sum', 'flake.lock', 'packages.lock.json', 'shrinkwrap.json',
21
+ ]);
22
+ /** Extensions that indicate core source code. */
23
+ const CORE_SOURCE_EXTENSIONS = new Set([
24
+ '.ts', '.js', '.py', '.go', '.rs', '.java', '.rb',
25
+ '.tsx', '.jsx', '.vue', '.svelte', '.swift', '.kt',
26
+ '.cs', '.cpp', '.c', '.h', '.hpp', '.scala', '.clj',
27
+ '.ex', '.exs', '.hs', '.ml', '.mli', '.php',
28
+ ]);
29
+ /** Extensions that indicate documentation. */
30
+ const DOC_EXTENSIONS = new Set([
31
+ '.md', '.txt', '.rst', '.adoc', '.org',
32
+ ]);
33
+ /** Extensions that indicate config files. */
34
+ const CONFIG_EXTENSIONS = new Set([
35
+ '.json', '.yaml', '.yml', '.toml', '.ini', '.cfg',
36
+ '.env.example', '.editorconfig', '.prettierrc',
37
+ ]);
38
+ /** Directories that indicate core source code. */
39
+ const CORE_DIRS = new Set([
40
+ 'src', 'lib', 'app', 'apps', 'packages', 'modules',
41
+ 'components', 'pages', 'views', 'controllers', 'services',
42
+ 'models', 'utils', 'helpers', 'core',
43
+ ]);
44
+ /** Directories that indicate test code. */
45
+ const TEST_DIRS = new Set([
46
+ 'test', 'tests', '__tests__', 'spec', 'specs',
47
+ 'e2e', 'integration', 'unit', 'fixtures',
48
+ ]);
49
+ /** Directories that indicate generated/build output. */
50
+ const GENERATED_DIRS = new Set([
51
+ 'dist', 'build', '.next', '.nuxt', 'coverage', 'out',
52
+ '.output', '.cache', '.turbo', 'target',
53
+ ]);
54
+ /** Directories that indicate documentation. */
55
+ const DOC_DIRS = new Set([
56
+ 'docs', 'doc', 'documentation', 'wiki',
57
+ ]);
58
+ /** File name patterns for test files. */
59
+ const TEST_FILE_PATTERNS = [
60
+ /\.test\.\w+$/,
61
+ /\.spec\.\w+$/,
62
+ /_test\.\w+$/,
63
+ /_spec\.\w+$/,
64
+ /test_.*\.\w+$/,
65
+ ];
66
+ /** File names that are documentation regardless of extension. */
67
+ const DOC_FILE_NAMES = new Set([
68
+ 'readme', 'changelog', 'changes', 'history',
69
+ 'contributing', 'license', 'authors', 'todo',
70
+ 'claude.md', 'claude',
71
+ ]);
72
+ /** Config file names (exact match, case-insensitive). */
73
+ const CONFIG_FILE_NAMES = new Set([
74
+ 'package.json', 'tsconfig.json', 'jest.config.js',
75
+ 'vite.config.ts', 'webpack.config.js', 'rollup.config.js',
76
+ 'babel.config.js', '.babelrc', '.eslintrc', '.eslintrc.js',
77
+ '.eslintrc.json', '.prettierrc', '.prettierrc.js',
78
+ 'tailwind.config.js', 'tailwind.config.ts',
79
+ 'postcss.config.js', 'next.config.js', 'next.config.mjs',
80
+ 'nuxt.config.ts', 'svelte.config.js',
81
+ 'docker-compose.yml', 'docker-compose.yaml',
82
+ 'dockerfile', 'makefile', 'cargo.toml', 'go.mod',
83
+ 'go.sum', 'requirements.txt', 'pyproject.toml',
84
+ 'gemfile', 'mix.exs', 'build.gradle', 'pom.xml',
85
+ ]);
86
+ // ---------------------------------------------------------------------------
87
+ // Categorization logic
88
+ // ---------------------------------------------------------------------------
89
+ function categorizeFile(relativePath, extension) {
90
+ const lowerPath = relativePath.toLowerCase();
91
+ const fileName = basename(lowerPath);
92
+ const dirParts = dirname(lowerPath).split('/').filter(Boolean);
93
+ // Check if it's in a generated directory
94
+ for (const part of dirParts) {
95
+ if (GENERATED_DIRS.has(part)) {
96
+ return 'generated';
97
+ }
98
+ }
99
+ // Check if it's a test file by name pattern
100
+ for (const pattern of TEST_FILE_PATTERNS) {
101
+ if (pattern.test(fileName)) {
102
+ return 'tests';
103
+ }
104
+ }
105
+ // Check if it's in a test directory
106
+ for (const part of dirParts) {
107
+ if (TEST_DIRS.has(part)) {
108
+ return 'tests';
109
+ }
110
+ }
111
+ // Check if it's a known config file
112
+ if (CONFIG_FILE_NAMES.has(fileName)) {
113
+ return 'configs';
114
+ }
115
+ // Check if it's a documentation file
116
+ const nameWithoutExt = fileName.replace(/\.[^.]+$/, '');
117
+ if (DOC_FILE_NAMES.has(nameWithoutExt)) {
118
+ return 'docs';
119
+ }
120
+ // Check by directory
121
+ for (const part of dirParts) {
122
+ if (DOC_DIRS.has(part)) {
123
+ return 'docs';
124
+ }
125
+ }
126
+ // Check by extension
127
+ if (DOC_EXTENSIONS.has(extension)) {
128
+ return 'docs';
129
+ }
130
+ if (CONFIG_EXTENSIONS.has(extension)) {
131
+ return 'configs';
132
+ }
133
+ if (CORE_SOURCE_EXTENSIONS.has(extension)) {
134
+ // Bonus: check if in a core directory
135
+ return 'core';
136
+ }
137
+ return 'assets';
138
+ }
139
+ /**
140
+ * Assign a priority score to a categorized file.
141
+ * Higher scores = higher priority for inclusion.
142
+ */
143
+ function assignPriority(file) {
144
+ const dirParts = dirname(file.path).split('/').filter(Boolean);
145
+ let priority = 0;
146
+ switch (file.category) {
147
+ case 'core':
148
+ priority = 100;
149
+ // Boost files in core directories
150
+ for (const part of dirParts) {
151
+ if (CORE_DIRS.has(part)) {
152
+ priority += 20;
153
+ break;
154
+ }
155
+ }
156
+ // Boost smaller files (more likely to be focused modules)
157
+ if (file.estimatedTokens < 500)
158
+ priority += 10;
159
+ if (file.estimatedTokens < 200)
160
+ priority += 5;
161
+ break;
162
+ case 'docs':
163
+ priority = 60;
164
+ // Boost README and CLAUDE.md
165
+ const fileName = basename(file.path).toLowerCase();
166
+ if (fileName === 'readme.md' || fileName === 'readme')
167
+ priority += 30;
168
+ if (fileName === 'claude.md')
169
+ priority += 25;
170
+ if (fileName === 'changelog.md')
171
+ priority += 10;
172
+ break;
173
+ case 'configs':
174
+ priority = 50;
175
+ // Boost root-level configs
176
+ if (dirParts.length <= 1)
177
+ priority += 15;
178
+ break;
179
+ case 'tests':
180
+ priority = 30;
181
+ break;
182
+ case 'generated':
183
+ priority = 5;
184
+ break;
185
+ case 'assets':
186
+ priority = 10;
187
+ break;
188
+ }
189
+ return priority;
190
+ }
191
+ function allocateBudgets(targetTokens, config) {
192
+ const budgets = config?.contextBudgets;
193
+ // Normalize: if values are > 1, they're percentages (e.g. 10 = 10%); convert to fractions
194
+ const norm = (v, fallback) => {
195
+ const val = v ?? fallback;
196
+ return val > 1 ? val / 100 : val;
197
+ };
198
+ const systemPromptFrac = norm(budgets?.systemPrompt, 0.10);
199
+ const coreFilesFrac = norm(budgets?.coreFiles, 0.50);
200
+ const docsFrac = norm(budgets?.docs, 0.20);
201
+ const toolMetaFrac = norm(budgets?.toolMeta, 0.10);
202
+ const freeFrac = 1.0 - systemPromptFrac - coreFilesFrac - docsFrac - toolMetaFrac;
203
+ return {
204
+ systemPrompt: Math.round(targetTokens * systemPromptFrac),
205
+ coreFiles: Math.round(targetTokens * coreFilesFrac),
206
+ docs: Math.round(targetTokens * docsFrac),
207
+ toolMeta: Math.round(targetTokens * toolMetaFrac),
208
+ free: Math.round(targetTokens * Math.max(freeFrac, 0)),
209
+ };
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Packing algorithm
213
+ // ---------------------------------------------------------------------------
214
+ /**
215
+ * Pack files into budget buckets using a greedy approach.
216
+ * Files are sorted by priority (descending), then by token count (ascending)
217
+ * to maximize the number of high-value files that fit.
218
+ */
219
+ function packFiles(files, budgets) {
220
+ const included = [];
221
+ const summarize = [];
222
+ const excluded = [];
223
+ // Sort by priority desc, then by token count asc (fit more smaller files)
224
+ const sorted = [...files].sort((a, b) => {
225
+ if (b.priority !== a.priority)
226
+ return b.priority - a.priority;
227
+ return a.estimatedTokens - b.estimatedTokens;
228
+ });
229
+ // Track remaining budget per category
230
+ const remaining = {
231
+ core: budgets.coreFiles,
232
+ docs: budgets.docs,
233
+ configs: budgets.toolMeta,
234
+ tests: budgets.free,
235
+ assets: 0,
236
+ generated: 0,
237
+ };
238
+ // Also track a spillover budget from free allocation
239
+ let spillover = budgets.free;
240
+ for (const file of sorted) {
241
+ const categoryBudget = remaining[file.category];
242
+ if (file.category === 'generated' || file.category === 'assets') {
243
+ excluded.push(file);
244
+ continue;
245
+ }
246
+ if (file.estimatedTokens <= categoryBudget) {
247
+ // Fits in its category budget
248
+ remaining[file.category] -= file.estimatedTokens;
249
+ included.push(file);
250
+ }
251
+ else if (file.estimatedTokens <= spillover) {
252
+ // Fits in the spillover/free budget
253
+ spillover -= file.estimatedTokens;
254
+ included.push(file);
255
+ }
256
+ else if (file.estimatedTokens > 2000 && file.category === 'core') {
257
+ // Large core file: recommend summarizing
258
+ summarize.push(file);
259
+ }
260
+ else {
261
+ excluded.push(file);
262
+ }
263
+ }
264
+ return { included, summarize, excluded };
265
+ }
266
+ // ---------------------------------------------------------------------------
267
+ // Public API
268
+ // ---------------------------------------------------------------------------
269
+ /**
270
+ * Build an optimized context pack plan for a repository.
271
+ *
272
+ * 1. Analyzes the repo using contextAnalyzer
273
+ * 2. Categorizes files (core, docs, configs, tests, assets, generated)
274
+ * 3. Ranks files by likely usefulness
275
+ * 4. Allocates budgets per category
276
+ * 5. Packs files greedily into the target context window
277
+ * 6. Returns a plan with include/summarize/exclude recommendations
278
+ */
279
+ export async function packContext(rootPath, options) {
280
+ const absoluteRoot = resolve(rootPath);
281
+ const targetTokens = options.target === '200k' ? 200_000 : 1_000_000;
282
+ const targetLabel = options.target === '200k' ? '200k' : '1M';
283
+ logger.debug(`Packing context for ${absoluteRoot} (target: ${targetLabel})`);
284
+ // Step 1: Run the full analysis (used for validation / logging)
285
+ await analyzeContext(absoluteRoot, options.config);
286
+ // Step 2 & 3: Categorize and rank all text files
287
+ const ignoreDirs = new Set([
288
+ 'node_modules', '.git', 'dist', 'build', 'coverage',
289
+ '.DS_Store', '__pycache__', '.next', '.nuxt', '.svelte-kit',
290
+ '.turbo', '.vercel', 'vendor', '.venv', 'env', '.env',
291
+ ]);
292
+ if (options.config?.ignorePaths) {
293
+ for (const p of options.config.ignorePaths) {
294
+ ignoreDirs.add(p);
295
+ }
296
+ }
297
+ const entries = await walkDirectory(absoluteRoot, { ignoreDirs });
298
+ const fileEntries = entries.filter((e) => e.isFile);
299
+ const categorizedFiles = [];
300
+ for (const entry of fileEntries) {
301
+ // Skip lock / dependency-resolution files
302
+ if (EXCLUDED_FILENAMES.has(basename(entry.path).toLowerCase()))
303
+ continue;
304
+ // Skip binary extensions
305
+ const binaryExts = new Set([
306
+ '.png', '.jpg', '.jpeg', '.gif', '.ico', '.woff', '.woff2',
307
+ '.ttf', '.eot', '.mp3', '.mp4', '.zip', '.tar', '.gz',
308
+ '.pdf', '.exe', '.dll', '.so', '.dylib', '.class', '.pyc',
309
+ '.o', '.obj', '.bin', '.dat', '.sqlite', '.db',
310
+ ]);
311
+ if (binaryExts.has(entry.extension)) {
312
+ continue;
313
+ }
314
+ const content = await readTextFile(entry.path);
315
+ if (content === null) {
316
+ continue;
317
+ }
318
+ const tokens = estimateTokens(content);
319
+ const category = categorizeFile(entry.relativePath, entry.extension);
320
+ const file = {
321
+ path: entry.relativePath,
322
+ bytes: entry.size,
323
+ estimatedTokens: tokens,
324
+ category,
325
+ priority: 0,
326
+ };
327
+ file.priority = assignPriority(file);
328
+ categorizedFiles.push(file);
329
+ }
330
+ // Step 4: Allocate budgets
331
+ const budgets = allocateBudgets(targetTokens, options.config);
332
+ // Step 5: Pack files into budgets
333
+ const { included, summarize, excluded } = packFiles(categorizedFiles, budgets);
334
+ // Calculate total tokens for included files
335
+ const totalIncluded = included.reduce((sum, f) => sum + f.estimatedTokens, 0);
336
+ // Strip category/priority from the public FileTokenInfo results
337
+ const toFileTokenInfo = (f) => ({
338
+ path: f.path,
339
+ bytes: f.bytes,
340
+ estimatedTokens: f.estimatedTokens,
341
+ });
342
+ const plan = {
343
+ target: targetTokens,
344
+ targetLabel,
345
+ systemPromptBudget: budgets.systemPrompt,
346
+ coreFilesBudget: budgets.coreFiles,
347
+ docsBudget: budgets.docs,
348
+ toolMetaBudget: budgets.toolMeta,
349
+ remainingFree: budgets.free,
350
+ includeFirst: included.map(toFileTokenInfo),
351
+ summarize: summarize.map(toFileTokenInfo),
352
+ exclude: excluded.map(toFileTokenInfo),
353
+ totalEstimatedTokens: totalIncluded,
354
+ };
355
+ logger.debug(`Pack plan: ${included.length} include, ${summarize.length} summarize, ${excluded.length} exclude (${totalIncluded} tokens)`);
356
+ return plan;
357
+ }
358
+ //# sourceMappingURL=contextPacker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextPacker.js","sourceRoot":"","sources":["../../src/core/contextPacker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Dataset test runner — runs a prompt spec against each row in a JSONL dataset.
3
+ */
4
+ import type { DatasetResult } from '../types/dataset.js';
5
+ import type { RunOptions } from './promptRunner.js';
6
+ /**
7
+ * Run a prompt spec against each row of a JSONL dataset file.
8
+ */
9
+ export declare function runDatasetTests(specPath: string, datasetPath: string, options: RunOptions): Promise<DatasetResult>;
10
+ //# sourceMappingURL=datasetRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetRunner.d.ts","sourceRoot":"","sources":["../../src/core/datasetRunner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA+DpD;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,CAAC,CAoFxB"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Dataset test runner — runs a prompt spec against each row in a JSONL dataset.
3
+ */
4
+ import { readFile } from 'node:fs/promises';
5
+ import { resolve } from 'node:path';
6
+ import { parsePromptSpec, runSingleTest, evaluateAssertions } from './promptRunner.js';
7
+ import { logger } from '../utils/logger.js';
8
+ /**
9
+ * Parse a JSONL file into an array of DatasetRow objects.
10
+ */
11
+ function parseJsonl(content) {
12
+ const rows = [];
13
+ const lines = content.split('\n');
14
+ for (let i = 0; i < lines.length; i++) {
15
+ const line = lines[i].trim();
16
+ if (!line) {
17
+ continue;
18
+ }
19
+ try {
20
+ const parsed = JSON.parse(line);
21
+ if (typeof parsed !== 'object' || parsed === null) {
22
+ logger.warn(`JSONL line ${i + 1}: expected an object, got ${typeof parsed}`);
23
+ continue;
24
+ }
25
+ const obj = parsed;
26
+ if (typeof obj.input !== 'string') {
27
+ logger.warn(`JSONL line ${i + 1}: missing or non-string "input" field`);
28
+ continue;
29
+ }
30
+ const row = {
31
+ input: obj.input,
32
+ };
33
+ if (typeof obj.expected === 'string') {
34
+ row.expected = obj.expected;
35
+ }
36
+ if (typeof obj.metadata === 'object' && obj.metadata !== null) {
37
+ row.metadata = obj.metadata;
38
+ }
39
+ rows.push(row);
40
+ }
41
+ catch {
42
+ logger.warn(`JSONL line ${i + 1}: invalid JSON, skipping`);
43
+ }
44
+ }
45
+ return rows;
46
+ }
47
+ /**
48
+ * Build a TestExpectation from a dataset row's expected field.
49
+ * If the row has an expected string, create a "contains" assertion for it.
50
+ */
51
+ function buildExpectationFromRow(row) {
52
+ if (!row.expected) {
53
+ return undefined;
54
+ }
55
+ return {
56
+ contains: [row.expected],
57
+ };
58
+ }
59
+ /**
60
+ * Run a prompt spec against each row of a JSONL dataset file.
61
+ */
62
+ export async function runDatasetTests(specPath, datasetPath, options) {
63
+ const absoluteSpecPath = resolve(specPath);
64
+ const absoluteDatasetPath = resolve(datasetPath);
65
+ // Parse the prompt spec
66
+ const spec = await parsePromptSpec(absoluteSpecPath);
67
+ // Read and parse the JSONL dataset
68
+ const datasetContent = await readFile(absoluteDatasetPath, 'utf-8');
69
+ const rows = parseJsonl(datasetContent);
70
+ if (rows.length === 0) {
71
+ logger.warn(`No valid rows found in dataset "${absoluteDatasetPath}"`);
72
+ return {
73
+ datasetPath: absoluteDatasetPath,
74
+ promptName: spec.name,
75
+ totalRows: 0,
76
+ passed: 0,
77
+ failed: 0,
78
+ results: [],
79
+ };
80
+ }
81
+ logger.info(`Running "${spec.name}" against ${rows.length} dataset row(s)...`);
82
+ const results = [];
83
+ let passed = 0;
84
+ let failed = 0;
85
+ for (let i = 0; i < rows.length; i++) {
86
+ const row = rows[i];
87
+ // Build a test with the row's input
88
+ const testCase = {
89
+ name: `dataset-row-${i}`,
90
+ input: row.input,
91
+ expect: buildExpectationFromRow(row),
92
+ };
93
+ // Run the test
94
+ const testResult = await runSingleTest(spec, testCase, options);
95
+ // If the dataset row has its own expected field, evaluate those assertions
96
+ let assertions = testResult.assertions;
97
+ if (row.expected && testCase.expect) {
98
+ assertions = evaluateAssertions(testResult.output, testCase.expect);
99
+ }
100
+ const rowPassed = assertions.length === 0 || assertions.every((a) => a.passed);
101
+ if (rowPassed) {
102
+ passed++;
103
+ }
104
+ else {
105
+ failed++;
106
+ }
107
+ results.push({
108
+ rowIndex: i,
109
+ input: row.input,
110
+ expected: row.expected,
111
+ output: testResult.output,
112
+ passed: rowPassed,
113
+ assertions,
114
+ });
115
+ if (options.verbose) {
116
+ const status = rowPassed ? 'PASS' : 'FAIL';
117
+ logger.info(` Row ${i}: ${status}`);
118
+ }
119
+ }
120
+ logger.info(`Dataset run complete: ${passed}/${rows.length} passed, ${failed} failed`);
121
+ return {
122
+ datasetPath: absoluteDatasetPath,
123
+ promptName: spec.name,
124
+ totalRows: rows.length,
125
+ passed,
126
+ failed,
127
+ results,
128
+ };
129
+ }
130
+ //# sourceMappingURL=datasetRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetRunner.js","sourceRoot":"","sources":["../../src/core/datasetRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Doctor runner: environment and project diagnostics.
3
+ *
4
+ * Runs a series of checks to verify that the development environment
5
+ * and project structure are properly configured for codeprobe.
6
+ */
7
+ import type { DiagnosticCheck } from '../types/diagnostics.js';
8
+ /**
9
+ * Run all diagnostic checks and return the results.
10
+ *
11
+ * Checks:
12
+ * 1. Node.js version (>= 18)
13
+ * 2. prompts/ directory exists
14
+ * 3. datasets/ directory exists
15
+ * 4. codeprobe.config.yaml exists
16
+ * 5. ANTHROPIC_API_KEY env var is set
17
+ * 6. .cache/ directory exists/writable
18
+ * 7. package.json exists
19
+ * 8. TypeScript installed
20
+ *
21
+ * @returns Array of diagnostic check results.
22
+ */
23
+ export declare function runDiagnostics(): Promise<DiagnosticCheck[]>;
24
+ //# sourceMappingURL=doctorRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctorRunner.d.ts","sourceRoot":"","sources":["../../src/core/doctorRunner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA8Q/D;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAajE"}