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,290 @@
1
+ /**
2
+ * MCP (Model Context Protocol) scanner.
3
+ *
4
+ * Detects MCP-related configuration files, server definitions,
5
+ * and dependencies in a repository.
6
+ */
7
+ import { join, basename, extname } from 'node:path';
8
+ import { readFile, stat } from 'node:fs/promises';
9
+ import { walkDirectory, readTextFile, fileExists } from '../utils/fs.js';
10
+ /** Directories to skip during traversal. */
11
+ const SKIP_DIRS = new Set([
12
+ 'node_modules', '.git', 'dist', 'build', 'coverage',
13
+ '__pycache__', '.next', '.nuxt', '.cache', '.turbo',
14
+ '.parcel-cache', '.vscode', '.idea', 'vendor', 'tmp',
15
+ '.tmp', '.terraform', 'src',
16
+ ]);
17
+ /**
18
+ * Safely parse a JSON file. Returns null on failure.
19
+ */
20
+ async function readJsonFile(filePath) {
21
+ try {
22
+ const content = await readFile(filePath, 'utf-8');
23
+ const parsed = JSON.parse(content);
24
+ if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
25
+ return parsed;
26
+ }
27
+ return null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ /**
34
+ * Extract MCP server definitions from a parsed JSON config.
35
+ */
36
+ function extractServers(data, filePath) {
37
+ const assets = [];
38
+ // Check for "mcpServers" key (standard format)
39
+ const serversKey = Object.keys(data).find((k) => k === 'mcpServers' || k === 'mcp_servers');
40
+ if (serversKey) {
41
+ const servers = data[serversKey];
42
+ if (typeof servers === 'object' && servers !== null && !Array.isArray(servers)) {
43
+ const serversObj = servers;
44
+ for (const [name, config] of Object.entries(serversObj)) {
45
+ let transport = 'unknown';
46
+ if (typeof config === 'object' && config !== null) {
47
+ const configObj = config;
48
+ if (typeof configObj['transport'] === 'string') {
49
+ transport = configObj['transport'];
50
+ }
51
+ else if (typeof configObj['command'] === 'string') {
52
+ transport = 'stdio';
53
+ }
54
+ else if (typeof configObj['url'] === 'string') {
55
+ transport = 'sse';
56
+ }
57
+ }
58
+ assets.push({
59
+ path: filePath,
60
+ type: 'mcp-config',
61
+ serverName: name,
62
+ transport,
63
+ description: `MCP server "${name}" (transport: ${transport})`,
64
+ });
65
+ }
66
+ return assets;
67
+ }
68
+ }
69
+ // If no servers found but file matches MCP naming, still report it
70
+ return assets;
71
+ }
72
+ /**
73
+ * Scan well-known MCP config file locations.
74
+ */
75
+ async function scanKnownMcpFiles(rootPath) {
76
+ const assets = [];
77
+ const knownPaths = [
78
+ join(rootPath, '.mcp.json'),
79
+ join(rootPath, 'mcp.json'),
80
+ ];
81
+ for (const filePath of knownPaths) {
82
+ if (!(await fileExists(filePath)))
83
+ continue;
84
+ const data = await readJsonFile(filePath);
85
+ if (data) {
86
+ const servers = extractServers(data, filePath);
87
+ if (servers.length > 0) {
88
+ assets.push(...servers);
89
+ }
90
+ else {
91
+ assets.push({
92
+ path: filePath,
93
+ type: 'mcp-config',
94
+ description: `MCP configuration file: ${basename(filePath)}`,
95
+ });
96
+ }
97
+ }
98
+ else {
99
+ assets.push({
100
+ path: filePath,
101
+ type: 'mcp-config',
102
+ description: `MCP configuration file (parse failed): ${basename(filePath)}`,
103
+ });
104
+ }
105
+ }
106
+ return assets;
107
+ }
108
+ /**
109
+ * Scan .claude/ directory for MCP-related JSON files.
110
+ */
111
+ async function scanClaudeMcpFiles(rootPath) {
112
+ const assets = [];
113
+ const claudeDir = join(rootPath, '.claude');
114
+ try {
115
+ const claudeStat = await stat(claudeDir);
116
+ if (!claudeStat.isDirectory())
117
+ return assets;
118
+ }
119
+ catch {
120
+ return assets;
121
+ }
122
+ const entries = await walkDirectory(claudeDir, { ignoreDirs: SKIP_DIRS });
123
+ for (const entry of entries) {
124
+ if (!entry.isFile)
125
+ continue;
126
+ const fileName = basename(entry.path);
127
+ if (fileName.startsWith('mcp') && fileName.endsWith('.json')) {
128
+ const data = await readJsonFile(entry.path);
129
+ if (data) {
130
+ const servers = extractServers(data, entry.path);
131
+ if (servers.length > 0) {
132
+ assets.push(...servers);
133
+ }
134
+ else {
135
+ assets.push({
136
+ path: entry.path,
137
+ type: 'mcp-config',
138
+ description: `MCP configuration in .claude/: ${fileName}`,
139
+ });
140
+ }
141
+ }
142
+ else {
143
+ assets.push({
144
+ path: entry.path,
145
+ type: 'mcp-config',
146
+ description: `MCP configuration in .claude/ (parse failed): ${fileName}`,
147
+ });
148
+ }
149
+ }
150
+ }
151
+ return assets;
152
+ }
153
+ /**
154
+ * Scan files for MCP-related content patterns.
155
+ */
156
+ async function scanForMcpContent(rootPath) {
157
+ const assets = [];
158
+ const mcpPatterns = [
159
+ /["']?mcpServers["']?\s*:/,
160
+ /["']?mcp_servers["']?\s*:/,
161
+ ];
162
+ const mcpReferencePatterns = [
163
+ /ModelContextProtocol/,
164
+ /@modelcontextprotocol/,
165
+ ];
166
+ const textExtensions = new Set([
167
+ '.json', '.yaml', '.yml', '.toml',
168
+ '.ts', '.js', '.mjs', '.cjs',
169
+ '.md', '.txt', '.cfg', '.conf',
170
+ ]);
171
+ const entries = await walkDirectory(rootPath, { ignoreDirs: SKIP_DIRS });
172
+ for (const entry of entries) {
173
+ if (!entry.isFile)
174
+ continue;
175
+ const ext = extname(entry.path).toLowerCase();
176
+ if (!textExtensions.has(ext))
177
+ continue;
178
+ // Skip files we already check via specific scanners
179
+ const fileName = basename(entry.path);
180
+ if (fileName === '.mcp.json' || fileName === 'mcp.json')
181
+ continue;
182
+ if (fileName === 'package.json')
183
+ continue;
184
+ const relativeToClaude = entry.path.includes('.claude/') || entry.path.includes('.claude\\');
185
+ if (relativeToClaude && fileName.startsWith('mcp') && fileName.endsWith('.json')) {
186
+ continue;
187
+ }
188
+ const content = await readTextFile(entry.path);
189
+ if (!content)
190
+ continue;
191
+ // Check for server config patterns
192
+ for (const pattern of mcpPatterns) {
193
+ if (pattern.test(content)) {
194
+ assets.push({
195
+ path: entry.path,
196
+ type: 'mcp-related',
197
+ description: `File contains MCP server configuration pattern.`,
198
+ });
199
+ break;
200
+ }
201
+ }
202
+ // Check for MCP reference patterns (only if not already matched)
203
+ if (!assets.some((a) => a.path === entry.path)) {
204
+ for (const pattern of mcpReferencePatterns) {
205
+ if (pattern.test(content)) {
206
+ assets.push({
207
+ path: entry.path,
208
+ type: 'mcp-related',
209
+ description: `File references Model Context Protocol.`,
210
+ });
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ }
216
+ return assets;
217
+ }
218
+ /**
219
+ * Scan package.json for MCP-related dependencies.
220
+ */
221
+ async function scanPackageJsonMcp(rootPath) {
222
+ const assets = [];
223
+ const pkgPath = join(rootPath, 'package.json');
224
+ const data = await readJsonFile(pkgPath);
225
+ if (!data)
226
+ return assets;
227
+ const depSections = ['dependencies', 'devDependencies', 'peerDependencies'];
228
+ const mcpDepPatterns = [/mcp/, /model-context-protocol/, /modelcontextprotocol/];
229
+ for (const section of depSections) {
230
+ const deps = data[section];
231
+ if (typeof deps !== 'object' || deps === null)
232
+ continue;
233
+ const depsObj = deps;
234
+ for (const [name, version] of Object.entries(depsObj)) {
235
+ const isMcp = mcpDepPatterns.some((p) => p.test(name.toLowerCase()));
236
+ if (isMcp && typeof version === 'string') {
237
+ assets.push({
238
+ path: pkgPath,
239
+ type: 'mcp-server',
240
+ serverName: name,
241
+ description: `MCP-related dependency: ${name}@${version} (in ${section})`,
242
+ });
243
+ }
244
+ }
245
+ }
246
+ return assets;
247
+ }
248
+ /**
249
+ * Scan a repository for MCP-related files and configurations.
250
+ *
251
+ * Detects:
252
+ * - .mcp.json, mcp.json root config files
253
+ * - .claude/mcp*.json config files
254
+ * - Files containing "mcpServers" or "mcp_servers" patterns
255
+ * - package.json MCP-related dependencies
256
+ * - Files referencing "ModelContextProtocol" or "@modelcontextprotocol"
257
+ *
258
+ * @param rootPath Absolute path to the repository root.
259
+ * @returns Array of detected MCP assets.
260
+ */
261
+ export async function scanForMCP(rootPath) {
262
+ // Verify root exists
263
+ try {
264
+ const rootStat = await stat(rootPath);
265
+ if (!rootStat.isDirectory())
266
+ return [];
267
+ }
268
+ catch {
269
+ return [];
270
+ }
271
+ const results = await Promise.all([
272
+ scanKnownMcpFiles(rootPath),
273
+ scanClaudeMcpFiles(rootPath),
274
+ scanPackageJsonMcp(rootPath),
275
+ scanForMcpContent(rootPath),
276
+ ]);
277
+ const allAssets = results.flat();
278
+ // Deduplicate by path + type + serverName
279
+ const seen = new Set();
280
+ const deduped = [];
281
+ for (const asset of allAssets) {
282
+ const key = `${asset.path}:${asset.type}:${asset.serverName ?? ''}`;
283
+ if (!seen.has(key)) {
284
+ seen.add(key);
285
+ deduped.push(asset);
286
+ }
287
+ }
288
+ return deduped;
289
+ }
290
+ //# sourceMappingURL=mcpScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpScanner.js","sourceRoot":"","sources":["../../src/core/mcpScanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Universal model registry for codeprobe.
3
+ *
4
+ * Contains pricing, context-window, and capability metadata for AI models
5
+ * across all major providers. Used by the benchmark runner for cost estimation
6
+ * and by the CLI for model discovery.
7
+ */
8
+ export interface ModelInfo {
9
+ id: string;
10
+ provider: string;
11
+ name: string;
12
+ contextWindow: number;
13
+ maxOutput: number;
14
+ inputPricePer1M: number;
15
+ outputPricePer1M: number;
16
+ }
17
+ /** Look up a model by its id. Returns undefined if not found. */
18
+ export declare function getModel(id: string): ModelInfo | undefined;
19
+ /** Return every registered model. */
20
+ export declare function getAllModels(): ModelInfo[];
21
+ /** Return all models belonging to a specific provider. */
22
+ export declare function getModelsByProvider(provider: string): ModelInfo[];
23
+ /** Return the distinct list of provider names, sorted alphabetically. */
24
+ export declare function getProviders(): string[];
25
+ /**
26
+ * Get the context window size for a model.
27
+ * Returns 200 000 as a safe default when the model id is not found.
28
+ */
29
+ export declare function getContextWindow(modelId: string): number;
30
+ /**
31
+ * Estimate the dollar cost for a given number of input and output tokens.
32
+ * Returns 0 when the model is not in the registry.
33
+ */
34
+ export declare function estimateCost(modelId: string, inputTokens: number, outputTokens: number): number;
35
+ //# sourceMappingURL=modelRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelRegistry.d.ts","sourceRoot":"","sources":["../../src/core/modelRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAiED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE1D;AAED,qCAAqC;AACrC,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAE1C;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAEjE;AAED,yEAAyE;AACzE,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAGvC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAMR"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Universal model registry for codeprobe.
3
+ *
4
+ * Contains pricing, context-window, and capability metadata for AI models
5
+ * across all major providers. Used by the benchmark runner for cost estimation
6
+ * and by the CLI for model discovery.
7
+ */
8
+ /** Internal model registry keyed by model id. */
9
+ const MODEL_REGISTRY = new Map();
10
+ function register(model) {
11
+ MODEL_REGISTRY.set(model.id, model);
12
+ }
13
+ // ---------------------------------------------------------------------------
14
+ // Anthropic
15
+ // ---------------------------------------------------------------------------
16
+ register({ id: 'claude-opus-4-6', provider: 'anthropic', name: 'Claude Opus 4.6', contextWindow: 200000, maxOutput: 16384, inputPricePer1M: 15, outputPricePer1M: 75 });
17
+ register({ id: 'claude-sonnet-4-6', provider: 'anthropic', name: 'Claude Sonnet 4.6', contextWindow: 200000, maxOutput: 16384, inputPricePer1M: 3, outputPricePer1M: 15 });
18
+ register({ id: 'claude-haiku-4-5', provider: 'anthropic', name: 'Claude Haiku 4.5', contextWindow: 200000, maxOutput: 8192, inputPricePer1M: 0.80, outputPricePer1M: 4 });
19
+ // ---------------------------------------------------------------------------
20
+ // OpenAI
21
+ // ---------------------------------------------------------------------------
22
+ register({ id: 'gpt-4.1', provider: 'openai', name: 'GPT-4.1', contextWindow: 1047576, maxOutput: 32768, inputPricePer1M: 2, outputPricePer1M: 8 });
23
+ register({ id: 'gpt-4.1-mini', provider: 'openai', name: 'GPT-4.1 Mini', contextWindow: 1047576, maxOutput: 32768, inputPricePer1M: 0.40, outputPricePer1M: 1.60 });
24
+ register({ id: 'gpt-4.1-nano', provider: 'openai', name: 'GPT-4.1 Nano', contextWindow: 1047576, maxOutput: 32768, inputPricePer1M: 0.10, outputPricePer1M: 0.40 });
25
+ register({ id: 'gpt-4o', provider: 'openai', name: 'GPT-4o', contextWindow: 128000, maxOutput: 16384, inputPricePer1M: 2.50, outputPricePer1M: 10 });
26
+ register({ id: 'o3', provider: 'openai', name: 'o3', contextWindow: 200000, maxOutput: 100000, inputPricePer1M: 2, outputPricePer1M: 8 });
27
+ register({ id: 'o4-mini', provider: 'openai', name: 'o4-mini', contextWindow: 200000, maxOutput: 100000, inputPricePer1M: 1.10, outputPricePer1M: 4.40 });
28
+ // ---------------------------------------------------------------------------
29
+ // Google
30
+ // ---------------------------------------------------------------------------
31
+ register({ id: 'gemini-2.5-pro', provider: 'google', name: 'Gemini 2.5 Pro', contextWindow: 1048576, maxOutput: 65536, inputPricePer1M: 1.25, outputPricePer1M: 10 });
32
+ register({ id: 'gemini-2.5-flash', provider: 'google', name: 'Gemini 2.5 Flash', contextWindow: 1048576, maxOutput: 65536, inputPricePer1M: 0.15, outputPricePer1M: 0.60 });
33
+ // ---------------------------------------------------------------------------
34
+ // DeepSeek
35
+ // ---------------------------------------------------------------------------
36
+ register({ id: 'deepseek-v3', provider: 'deepseek', name: 'DeepSeek V3', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.27, outputPricePer1M: 1.10 });
37
+ register({ id: 'deepseek-r1', provider: 'deepseek', name: 'DeepSeek R1', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.55, outputPricePer1M: 2.19 });
38
+ // ---------------------------------------------------------------------------
39
+ // Qwen (Alibaba)
40
+ // ---------------------------------------------------------------------------
41
+ register({ id: 'qwen-3-235b', provider: 'qwen', name: 'Qwen 3 235B', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.80, outputPricePer1M: 2.40 });
42
+ register({ id: 'qwen-3-32b', provider: 'qwen', name: 'Qwen 3 32B', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0.20, outputPricePer1M: 0.60 });
43
+ // ---------------------------------------------------------------------------
44
+ // Meta (via API providers)
45
+ // ---------------------------------------------------------------------------
46
+ register({ id: 'llama-4-maverick', provider: 'meta', name: 'Llama 4 Maverick', contextWindow: 1048576, maxOutput: 16384, inputPricePer1M: 0.20, outputPricePer1M: 0.60 });
47
+ register({ id: 'llama-4-scout', provider: 'meta', name: 'Llama 4 Scout', contextWindow: 524288, maxOutput: 16384, inputPricePer1M: 0.10, outputPricePer1M: 0.30 });
48
+ // ---------------------------------------------------------------------------
49
+ // Mistral
50
+ // ---------------------------------------------------------------------------
51
+ register({ id: 'codestral-25.01', provider: 'mistral', name: 'Codestral', contextWindow: 256000, maxOutput: 8192, inputPricePer1M: 0.30, outputPricePer1M: 0.90 });
52
+ register({ id: 'mistral-large', provider: 'mistral', name: 'Mistral Large', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 2, outputPricePer1M: 6 });
53
+ // ---------------------------------------------------------------------------
54
+ // Local (Ollama / vLLM — free)
55
+ // ---------------------------------------------------------------------------
56
+ register({ id: 'local', provider: 'local', name: 'Local Model', contextWindow: 131072, maxOutput: 8192, inputPricePer1M: 0, outputPricePer1M: 0 });
57
+ // ---------------------------------------------------------------------------
58
+ // Public API
59
+ // ---------------------------------------------------------------------------
60
+ /** Look up a model by its id. Returns undefined if not found. */
61
+ export function getModel(id) {
62
+ return MODEL_REGISTRY.get(id);
63
+ }
64
+ /** Return every registered model. */
65
+ export function getAllModels() {
66
+ return Array.from(MODEL_REGISTRY.values());
67
+ }
68
+ /** Return all models belonging to a specific provider. */
69
+ export function getModelsByProvider(provider) {
70
+ return getAllModels().filter((m) => m.provider === provider);
71
+ }
72
+ /** Return the distinct list of provider names, sorted alphabetically. */
73
+ export function getProviders() {
74
+ const providers = new Set(getAllModels().map((m) => m.provider));
75
+ return Array.from(providers).sort();
76
+ }
77
+ /**
78
+ * Get the context window size for a model.
79
+ * Returns 200 000 as a safe default when the model id is not found.
80
+ */
81
+ export function getContextWindow(modelId) {
82
+ const model = MODEL_REGISTRY.get(modelId);
83
+ return model ? model.contextWindow : 200_000;
84
+ }
85
+ /**
86
+ * Estimate the dollar cost for a given number of input and output tokens.
87
+ * Returns 0 when the model is not in the registry.
88
+ */
89
+ export function estimateCost(modelId, inputTokens, outputTokens) {
90
+ const model = MODEL_REGISTRY.get(modelId);
91
+ if (!model)
92
+ return 0;
93
+ const inputCost = (inputTokens / 1_000_000) * model.inputPricePer1M;
94
+ const outputCost = (outputTokens / 1_000_000) * model.outputPricePer1M;
95
+ return inputCost + outputCost;
96
+ }
97
+ //# sourceMappingURL=modelRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelRegistry.js","sourceRoot":"","sources":["../../src/core/modelRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Prompt diff — compare two prompt spec YAML files field by field
3
+ * and report what changed.
4
+ */
5
+ export interface DiffDetail {
6
+ field: string;
7
+ before: string;
8
+ after: string;
9
+ }
10
+ export interface DiffResult {
11
+ systemPromptChanged: boolean;
12
+ promptChanged: boolean;
13
+ modelChanged: boolean;
14
+ testsChanged: boolean;
15
+ otherChanges: string[];
16
+ details: DiffDetail[];
17
+ }
18
+ /**
19
+ * Parse two prompt spec YAML files and compare them field by field.
20
+ *
21
+ * Returns a structured DiffResult indicating which fields changed
22
+ * and the before/after values.
23
+ */
24
+ export declare function diffPrompts(pathA: string, pathB: string): Promise<DiffResult>;
25
+ //# sourceMappingURL=promptDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptDiff.d.ts","sourceRoot":"","sources":["../../src/core/promptDiff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AA6CD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAqGrB"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Prompt diff — compare two prompt spec YAML files field by field
3
+ * and report what changed.
4
+ */
5
+ import { resolve } from 'node:path';
6
+ import { parsePromptSpec } from './promptRunner.js';
7
+ // ---------------------------------------------------------------------------
8
+ // Helpers
9
+ // ---------------------------------------------------------------------------
10
+ /**
11
+ * Serialize a value to a stable string for comparison.
12
+ */
13
+ function serialize(value) {
14
+ if (value === undefined || value === null) {
15
+ return '';
16
+ }
17
+ if (typeof value === 'string') {
18
+ return value;
19
+ }
20
+ return JSON.stringify(value, null, 2);
21
+ }
22
+ /**
23
+ * Compare two values and return a DiffDetail if they differ.
24
+ */
25
+ function compareField(field, before, after) {
26
+ const beforeStr = serialize(before);
27
+ const afterStr = serialize(after);
28
+ if (beforeStr === afterStr) {
29
+ return null;
30
+ }
31
+ return {
32
+ field,
33
+ before: beforeStr,
34
+ after: afterStr,
35
+ };
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Public API
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * Parse two prompt spec YAML files and compare them field by field.
42
+ *
43
+ * Returns a structured DiffResult indicating which fields changed
44
+ * and the before/after values.
45
+ */
46
+ export async function diffPrompts(pathA, pathB) {
47
+ const absoluteA = resolve(pathA);
48
+ const absoluteB = resolve(pathB);
49
+ const specA = await parsePromptSpec(absoluteA);
50
+ const specB = await parsePromptSpec(absoluteB);
51
+ const details = [];
52
+ const otherChanges = [];
53
+ // Compare name
54
+ const nameDiff = compareField('name', specA.name, specB.name);
55
+ if (nameDiff) {
56
+ details.push(nameDiff);
57
+ otherChanges.push('name');
58
+ }
59
+ // Compare description
60
+ const descDiff = compareField('description', specA.description, specB.description);
61
+ if (descDiff) {
62
+ details.push(descDiff);
63
+ otherChanges.push('description');
64
+ }
65
+ // Compare model
66
+ const modelDiff = compareField('model', specA.model, specB.model);
67
+ const modelChanged = modelDiff !== null;
68
+ if (modelDiff) {
69
+ details.push(modelDiff);
70
+ }
71
+ // Compare system prompt
72
+ const systemDiff = compareField('system', specA.system, specB.system);
73
+ const systemPromptChanged = systemDiff !== null;
74
+ if (systemDiff) {
75
+ details.push(systemDiff);
76
+ }
77
+ // Compare prompt
78
+ const promptDiff = compareField('prompt', specA.prompt, specB.prompt);
79
+ const promptChanged = promptDiff !== null;
80
+ if (promptDiff) {
81
+ details.push(promptDiff);
82
+ }
83
+ // Compare tests
84
+ const testsA = serialize(specA.tests);
85
+ const testsB = serialize(specB.tests);
86
+ const testsChanged = testsA !== testsB;
87
+ if (testsChanged) {
88
+ // Add a summary diff for the tests array
89
+ details.push({
90
+ field: 'tests',
91
+ before: testsA || '(none)',
92
+ after: testsB || '(none)',
93
+ });
94
+ // Add per-test diffs for more granularity
95
+ const maxLen = Math.max(specA.tests?.length ?? 0, specB.tests?.length ?? 0);
96
+ for (let i = 0; i < maxLen; i++) {
97
+ const testA = specA.tests?.[i];
98
+ const testB = specB.tests?.[i];
99
+ if (!testA && testB) {
100
+ details.push({
101
+ field: `tests[${i}]`,
102
+ before: '(not present)',
103
+ after: serialize(testB),
104
+ });
105
+ }
106
+ else if (testA && !testB) {
107
+ details.push({
108
+ field: `tests[${i}]`,
109
+ before: serialize(testA),
110
+ after: '(removed)',
111
+ });
112
+ }
113
+ else if (testA && testB) {
114
+ const testDiff = compareField(`tests[${i}]`, testA, testB);
115
+ if (testDiff) {
116
+ details.push(testDiff);
117
+ }
118
+ }
119
+ }
120
+ }
121
+ return {
122
+ systemPromptChanged,
123
+ promptChanged,
124
+ modelChanged,
125
+ testsChanged,
126
+ otherChanges,
127
+ details,
128
+ };
129
+ }
130
+ //# sourceMappingURL=promptDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptDiff.js","sourceRoot":"","sources":["../../src/core/promptDiff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Prompt explainer: offline analysis of a prompt spec.
3
+ *
4
+ * Generates a plain-text explanation of what a prompt does,
5
+ * identifies potential weaknesses, and suggests improvements --
6
+ * all without making any LLM calls.
7
+ */
8
+ /**
9
+ * Analyze a prompt spec file and generate a plain-text explanation.
10
+ *
11
+ * This is a purely offline analysis -- no LLM calls are made.
12
+ *
13
+ * @param specPath Absolute path to a YAML prompt spec file.
14
+ * @returns Multi-line plain-text explanation.
15
+ */
16
+ export declare function explainPrompt(specPath: string): Promise<string>;
17
+ //# sourceMappingURL=promptExplainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptExplainer.d.ts","sourceRoot":"","sources":["../../src/core/promptExplainer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2VH;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCrE"}