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,113 @@
1
+ /**
2
+ * `codeprobe history` — View test run history and trends.
3
+ *
4
+ * Subcommands/options:
5
+ * codeprobe history Show recent test runs (default: last 10)
6
+ * --limit <n> Number of runs to show
7
+ * --test <name> Show trend for a specific test
8
+ * --clear Clear all history
9
+ * --json JSON output
10
+ */
11
+ import { loadHistory, getTestTrend, clearHistory } from '../core/testHistory.js';
12
+ import { formatTable, formatDuration } from '../utils/output.js';
13
+ /**
14
+ * Format an ISO timestamp to a short date string like "2026-03-15 23:15".
15
+ */
16
+ function formatDate(iso) {
17
+ const d = new Date(iso);
18
+ const year = d.getFullYear();
19
+ const month = String(d.getMonth() + 1).padStart(2, '0');
20
+ const day = String(d.getDate()).padStart(2, '0');
21
+ const hours = String(d.getHours()).padStart(2, '0');
22
+ const minutes = String(d.getMinutes()).padStart(2, '0');
23
+ return `${year}-${month}-${day} ${hours}:${minutes}`;
24
+ }
25
+ /**
26
+ * Extract the short spec name from a full file path.
27
+ */
28
+ function shortSpecName(specFile) {
29
+ const parts = specFile.replace(/\\/g, '/').split('/');
30
+ const fileName = parts[parts.length - 1] ?? specFile;
31
+ return fileName
32
+ .replace(/\.prompt\.ya?ml$/, '')
33
+ .replace(/\.ya?ml$/, '');
34
+ }
35
+ export function registerHistoryCommand(program) {
36
+ program
37
+ .command('history')
38
+ .description('View test run history and trends')
39
+ .option('--limit <n>', 'Number of runs to show', '10')
40
+ .option('--test <name>', 'Show trend for a specific test')
41
+ .option('--clear', 'Clear all history')
42
+ .option('--json', 'Output as JSON')
43
+ .action(async (options) => {
44
+ const chalk = (await import('chalk')).default;
45
+ const limit = parseInt(options.limit ?? '10', 10);
46
+ // Clear history
47
+ if (options.clear) {
48
+ await clearHistory();
49
+ if (options.json) {
50
+ console.log(JSON.stringify({ cleared: true }));
51
+ }
52
+ else {
53
+ console.log(chalk.green('History cleared.'));
54
+ }
55
+ return;
56
+ }
57
+ // Show trend for a specific test
58
+ if (options.test) {
59
+ const trend = await getTestTrend(options.test, limit);
60
+ if (options.json) {
61
+ console.log(JSON.stringify(trend, null, 2));
62
+ return;
63
+ }
64
+ if (trend.length === 0) {
65
+ console.log(chalk.yellow(`\nNo history found for test: ${options.test}`));
66
+ return;
67
+ }
68
+ console.log(chalk.bold(`\nTrend: ${options.test}\n`));
69
+ const headers = ['Date', 'Passed', 'Duration'];
70
+ const rows = trend.map((entry) => [
71
+ formatDate(entry.timestamp),
72
+ entry.passed ? chalk.green('YES') : chalk.red('NO'),
73
+ formatDuration(entry.duration),
74
+ ]);
75
+ console.log(formatTable(headers, rows)
76
+ .split('\n')
77
+ .map((line) => ` ${line}`)
78
+ .join('\n'));
79
+ const passCount = trend.filter((e) => e.passed).length;
80
+ const passRate = ((passCount / trend.length) * 100).toFixed(1);
81
+ console.log(`\n Pass rate: ${passRate}% (${passCount}/${trend.length})`);
82
+ console.log('');
83
+ return;
84
+ }
85
+ // Default: show recent runs
86
+ const records = await loadHistory(limit);
87
+ if (options.json) {
88
+ console.log(JSON.stringify(records, null, 2));
89
+ return;
90
+ }
91
+ if (records.length === 0) {
92
+ console.log(chalk.yellow('\nNo test history found. Run `codeprobe test` to create some.'));
93
+ return;
94
+ }
95
+ console.log(chalk.bold(`\nTest Run History (last ${limit})\n`));
96
+ const headers = ['Run', 'Date', 'Spec', 'Pass', 'Fail', 'Total', 'Duration'];
97
+ const rows = records.map((r) => [
98
+ r.id.slice(0, 8),
99
+ formatDate(r.timestamp),
100
+ shortSpecName(r.specFile),
101
+ String(r.passed),
102
+ r.failed > 0 ? chalk.red(String(r.failed)) : String(r.failed),
103
+ String(r.totalTests),
104
+ formatDuration(r.duration),
105
+ ]);
106
+ console.log(formatTable(headers, rows)
107
+ .split('\n')
108
+ .map((line) => ` ${line}`)
109
+ .join('\n'));
110
+ console.log('');
111
+ });
112
+ }
113
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `codeprobe hooks [path]` — Detect hooks in the project.
3
+ *
4
+ * Scans for git hooks, Claude hooks, pre-commit configs, and
5
+ * other hook-like configurations.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerHooksCommand(program: Command): void;
9
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoKpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD3D"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * `codeprobe hooks [path]` — Detect hooks in the project.
3
+ *
4
+ * Scans for git hooks, Claude hooks, pre-commit configs, and
5
+ * other hook-like configurations.
6
+ */
7
+ import { resolvePath } from '../utils/paths.js';
8
+ import { walkDirectory, getRelativePath, fileExists, readTextFile } from '../utils/fs.js';
9
+ import { join } from 'node:path';
10
+ import { setLogLevel } from '../utils/logger.js';
11
+ const DEFAULT_IGNORE_DIRS = new Set([
12
+ 'node_modules', 'dist', 'build', 'coverage',
13
+ '.cache', '.turbo', 'src',
14
+ ]);
15
+ /** Patterns for detecting hooks. */
16
+ const HOOK_PATTERNS = [
17
+ {
18
+ namePattern: /^pre-commit$/,
19
+ type: 'git-hook',
20
+ description: 'Git pre-commit hook',
21
+ },
22
+ {
23
+ namePattern: /^pre-push$/,
24
+ type: 'git-hook',
25
+ description: 'Git pre-push hook',
26
+ },
27
+ {
28
+ namePattern: /^commit-msg$/,
29
+ type: 'git-hook',
30
+ description: 'Git commit-msg hook',
31
+ },
32
+ {
33
+ namePattern: /^post-merge$/,
34
+ type: 'git-hook',
35
+ description: 'Git post-merge hook',
36
+ },
37
+ {
38
+ namePattern: /^\.pre-commit-config\.ya?ml$/,
39
+ type: 'pre-commit-config',
40
+ description: 'pre-commit framework configuration',
41
+ },
42
+ {
43
+ namePattern: /^\.husky\/?/,
44
+ type: 'husky',
45
+ description: 'Husky git hooks directory',
46
+ },
47
+ {
48
+ namePattern: /^\.lintstagedrc/,
49
+ type: 'lint-staged',
50
+ description: 'lint-staged configuration',
51
+ },
52
+ {
53
+ namePattern: /hooks?\.(ts|js|ya?ml|json)$/,
54
+ type: 'custom-hook',
55
+ description: 'Custom hook configuration',
56
+ },
57
+ {
58
+ namePattern: /\.claude\/hooks/,
59
+ type: 'claude-hook',
60
+ description: 'Claude Code hook',
61
+ },
62
+ ];
63
+ /**
64
+ * Scan for hooks in a project.
65
+ */
66
+ async function hookScanner(rootPath) {
67
+ const hooks = [];
68
+ // Check .git/hooks
69
+ const gitHooksDir = join(rootPath, '.git', 'hooks');
70
+ if (await fileExists(join(gitHooksDir, 'pre-commit'))) {
71
+ hooks.push({
72
+ path: '.git/hooks/pre-commit',
73
+ type: 'git-hook',
74
+ description: 'Git pre-commit hook',
75
+ });
76
+ }
77
+ if (await fileExists(join(gitHooksDir, 'pre-push'))) {
78
+ hooks.push({
79
+ path: '.git/hooks/pre-push',
80
+ type: 'git-hook',
81
+ description: 'Git pre-push hook',
82
+ });
83
+ }
84
+ if (await fileExists(join(gitHooksDir, 'commit-msg'))) {
85
+ hooks.push({
86
+ path: '.git/hooks/commit-msg',
87
+ type: 'git-hook',
88
+ description: 'Git commit-msg hook',
89
+ });
90
+ }
91
+ // Scan project files
92
+ const entries = await walkDirectory(rootPath, { ignoreDirs: DEFAULT_IGNORE_DIRS });
93
+ for (const entry of entries) {
94
+ const relPath = getRelativePath(rootPath, entry.path);
95
+ const fileName = entry.path.split('/').pop() ?? '';
96
+ for (const pattern of HOOK_PATTERNS) {
97
+ if (pattern.namePattern.test(fileName) || pattern.namePattern.test(relPath)) {
98
+ // Avoid duplicates from git hooks dir
99
+ if (relPath.startsWith('.git/hooks/') && hooks.some((h) => h.path === relPath)) {
100
+ continue;
101
+ }
102
+ const info = {
103
+ path: relPath,
104
+ type: pattern.type,
105
+ description: pattern.description,
106
+ };
107
+ // Try to detect events from config files
108
+ if (entry.isFile && entry.size < 50_000) {
109
+ const content = await readTextFile(entry.path);
110
+ if (content) {
111
+ const events = [];
112
+ if (/pre-commit/i.test(content))
113
+ events.push('pre-commit');
114
+ if (/pre-push/i.test(content))
115
+ events.push('pre-push');
116
+ if (/commit-msg/i.test(content))
117
+ events.push('commit-msg');
118
+ if (/post-merge/i.test(content))
119
+ events.push('post-merge');
120
+ if (events.length > 0) {
121
+ info.events = events;
122
+ }
123
+ }
124
+ }
125
+ hooks.push(info);
126
+ break;
127
+ }
128
+ }
129
+ }
130
+ // Check package.json for husky/lint-staged
131
+ const pkgPath = join(rootPath, 'package.json');
132
+ const pkgContent = await readTextFile(pkgPath);
133
+ if (pkgContent) {
134
+ try {
135
+ const pkg = JSON.parse(pkgContent);
136
+ if (pkg['husky']) {
137
+ hooks.push({
138
+ path: 'package.json',
139
+ type: 'husky',
140
+ description: 'Husky configuration in package.json',
141
+ });
142
+ }
143
+ if (pkg['lint-staged']) {
144
+ hooks.push({
145
+ path: 'package.json',
146
+ type: 'lint-staged',
147
+ description: 'lint-staged configuration in package.json',
148
+ });
149
+ }
150
+ }
151
+ catch {
152
+ // Invalid JSON — skip
153
+ }
154
+ }
155
+ return hooks;
156
+ }
157
+ export function registerHooksCommand(program) {
158
+ program
159
+ .command('hooks [path]')
160
+ .description('Detect hooks — git hooks, husky, lint-staged, Claude hooks')
161
+ .option('--json', 'Output findings as JSON')
162
+ .action(async (pathArg, options) => {
163
+ if (options.json) {
164
+ setLogLevel('silent');
165
+ }
166
+ const chalk = (await import('chalk')).default;
167
+ const targetPath = resolvePath(pathArg ?? '.');
168
+ const hooks = await hookScanner(targetPath);
169
+ if (options.json) {
170
+ console.log(JSON.stringify(hooks, null, 2));
171
+ return;
172
+ }
173
+ if (hooks.length === 0) {
174
+ console.log(chalk.dim('\nNo hooks detected.\n'));
175
+ return;
176
+ }
177
+ console.log(chalk.bold(`\nHooks Detected (${hooks.length})`));
178
+ console.log('');
179
+ // Group by type
180
+ const grouped = new Map();
181
+ for (const hook of hooks) {
182
+ const list = grouped.get(hook.type) ?? [];
183
+ list.push(hook);
184
+ grouped.set(hook.type, list);
185
+ }
186
+ for (const [type, items] of grouped) {
187
+ console.log(chalk.bold(` ${type}`));
188
+ for (const item of items) {
189
+ let line = ` ${item.path} ${chalk.dim(item.description)}`;
190
+ if (item.events && item.events.length > 0) {
191
+ line += chalk.cyan(` [${item.events.join(', ')}]`);
192
+ }
193
+ console.log(line);
194
+ }
195
+ console.log('');
196
+ }
197
+ });
198
+ }
199
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `codeprobe improve <prompt-file>` — Suggest improvements for a
3
+ * prompt spec.
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function registerImproveCommand(program: Command): void;
7
+ //# sourceMappingURL=improve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve.d.ts","sourceRoot":"","sources":["../../src/commands/improve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyJpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D7D"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * `codeprobe improve <prompt-file>` — Suggest improvements for a
3
+ * prompt spec.
4
+ */
5
+ import { resolvePath } from '../utils/paths.js';
6
+ import { readTextFile, fileExists } from '../utils/fs.js';
7
+ import { setLogLevel } from '../utils/logger.js';
8
+ /**
9
+ * Parse a YAML prompt spec.
10
+ */
11
+ async function parseSpec(filePath) {
12
+ const yaml = (await import('js-yaml')).default;
13
+ const content = await readTextFile(filePath);
14
+ if (!content) {
15
+ throw new Error(`Could not read prompt spec: ${filePath}`);
16
+ }
17
+ const parsed = yaml.load(content);
18
+ return {
19
+ name: parsed['name'] ?? 'unnamed',
20
+ description: parsed['description'],
21
+ model: parsed['model'],
22
+ system: parsed['system'],
23
+ prompt: parsed['prompt'] ?? '',
24
+ tests: parsed['tests'],
25
+ };
26
+ }
27
+ /**
28
+ * Analyze a prompt spec and generate improvement suggestions.
29
+ */
30
+ function promptImprover(spec) {
31
+ const suggestions = [];
32
+ // System prompt analysis
33
+ if (!spec.system) {
34
+ suggestions.push({
35
+ category: 'Structure',
36
+ priority: 'high',
37
+ message: 'Add a system prompt to set the model persona and constraints.',
38
+ details: 'System prompts help establish consistent behavior. Define who the model is, ' +
39
+ 'what it should and should not do, and the output format.',
40
+ });
41
+ }
42
+ else {
43
+ if (spec.system.length < 50) {
44
+ suggestions.push({
45
+ category: 'Structure',
46
+ priority: 'medium',
47
+ message: 'System prompt is very brief. Consider adding more constraints.',
48
+ details: 'A well-defined system prompt typically includes: persona, task scope, ' +
49
+ 'output format, edge case handling, and tone guidelines.',
50
+ });
51
+ }
52
+ if (!/\b(format|output|respond|return)\b/i.test(spec.system)) {
53
+ suggestions.push({
54
+ category: 'Output Control',
55
+ priority: 'medium',
56
+ message: 'System prompt does not specify output format.',
57
+ details: 'Define expected output format (JSON, markdown, bullet points, etc.) ' +
58
+ 'for more predictable results.',
59
+ });
60
+ }
61
+ }
62
+ // Prompt analysis
63
+ const prompt = spec.prompt;
64
+ if (prompt.length < 20) {
65
+ suggestions.push({
66
+ category: 'Clarity',
67
+ priority: 'high',
68
+ message: 'Prompt is very short. Add more detail about the expected task.',
69
+ });
70
+ }
71
+ if (!/\{\{.*?\}\}/.test(prompt) && !/\$\{.*?\}/.test(prompt)) {
72
+ suggestions.push({
73
+ category: 'Templating',
74
+ priority: 'medium',
75
+ message: 'No template variables found ({{variable}}).',
76
+ details: 'Use template variables like {{input}} to make the prompt reusable ' +
77
+ 'across different inputs and test cases.',
78
+ });
79
+ }
80
+ if (!/\b(example|e\.g\.|for instance|such as)\b/i.test(prompt) &&
81
+ !/\b(input|output):/im.test(prompt)) {
82
+ suggestions.push({
83
+ category: 'Few-shot',
84
+ priority: 'medium',
85
+ message: 'Consider adding examples (few-shot) to the prompt.',
86
+ details: 'Including 1-3 input/output examples significantly improves consistency.',
87
+ });
88
+ }
89
+ if (!/\b(do not|don\'t|never|avoid|must not)\b/i.test(prompt) &&
90
+ !/\b(do not|don\'t|never|avoid|must not)\b/i.test(spec.system ?? '')) {
91
+ suggestions.push({
92
+ category: 'Guardrails',
93
+ priority: 'low',
94
+ message: 'Consider adding negative constraints (what the model should NOT do).',
95
+ details: 'Explicit negative instructions help prevent common failure modes.',
96
+ });
97
+ }
98
+ // Test analysis
99
+ const tests = spec.tests ?? [];
100
+ if (tests.length === 0) {
101
+ suggestions.push({
102
+ category: 'Testing',
103
+ priority: 'high',
104
+ message: 'No tests defined. Add at least 2-3 test cases.',
105
+ details: 'Tests should cover: happy path, edge cases, and adversarial inputs.',
106
+ });
107
+ }
108
+ else if (tests.length < 3) {
109
+ suggestions.push({
110
+ category: 'Testing',
111
+ priority: 'medium',
112
+ message: `Only ${tests.length} test(s) defined. Consider adding more for better coverage.`,
113
+ details: 'Aim for at least 3 tests: basic functionality, edge case, and error handling.',
114
+ });
115
+ }
116
+ const hasNegativeTest = tests.some((t) => t.expect?.notContains && t.expect.notContains.length > 0);
117
+ if (!hasNegativeTest && tests.length > 0) {
118
+ suggestions.push({
119
+ category: 'Testing',
120
+ priority: 'low',
121
+ message: 'No negative test assertions (notContains). Consider testing what output should NOT include.',
122
+ });
123
+ }
124
+ // Model analysis
125
+ if (!spec.model) {
126
+ suggestions.push({
127
+ category: 'Configuration',
128
+ priority: 'low',
129
+ message: 'No model specified. Will use config default.',
130
+ details: 'Specifying the model ensures reproducible results across environments.',
131
+ });
132
+ }
133
+ // Description analysis
134
+ if (!spec.description) {
135
+ suggestions.push({
136
+ category: 'Documentation',
137
+ priority: 'low',
138
+ message: 'Add a description field for documentation and discoverability.',
139
+ });
140
+ }
141
+ return suggestions;
142
+ }
143
+ export function registerImproveCommand(program) {
144
+ program
145
+ .command('improve <prompt-file>')
146
+ .description('Suggest improvements for a prompt spec file')
147
+ .option('--json', 'Output suggestions as JSON')
148
+ .action(async (promptFile, options) => {
149
+ if (options.json) {
150
+ setLogLevel('silent');
151
+ }
152
+ const chalk = (await import('chalk')).default;
153
+ const filePath = resolvePath(promptFile);
154
+ if (!(await fileExists(filePath))) {
155
+ throw new Error(`File not found: ${filePath}`);
156
+ }
157
+ const spec = await parseSpec(filePath);
158
+ const suggestions = promptImprover(spec);
159
+ if (options.json) {
160
+ console.log(JSON.stringify({ file: promptFile, suggestions }, null, 2));
161
+ return;
162
+ }
163
+ if (suggestions.length === 0) {
164
+ console.log(chalk.green(`\nNo improvements suggested for "${spec.name}". Looks good!\n`));
165
+ return;
166
+ }
167
+ console.log(chalk.bold(`\nImprovement Suggestions for "${spec.name}"`));
168
+ console.log(chalk.dim(` File: ${promptFile}`));
169
+ console.log(` ${suggestions.length} suggestion(s)\n`);
170
+ // Group by priority
171
+ const priorityOrder = ['high', 'medium', 'low'];
172
+ const priorityColors = {
173
+ high: chalk.red,
174
+ medium: chalk.yellow,
175
+ low: chalk.blue,
176
+ };
177
+ for (const priority of priorityOrder) {
178
+ const items = suggestions.filter((s) => s.priority === priority);
179
+ if (items.length === 0)
180
+ continue;
181
+ console.log(chalk.bold(` ${priorityColors[priority](priority.toUpperCase())} priority`));
182
+ for (const item of items) {
183
+ console.log(` [${item.category}] ${item.message}`);
184
+ if (item.details) {
185
+ console.log(chalk.dim(` ${item.details}`));
186
+ }
187
+ }
188
+ console.log('');
189
+ }
190
+ });
191
+ }
192
+ //# sourceMappingURL=improve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve.js","sourceRoot":"","sources":["../../src/commands/improve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `codeprobe init` — Create starter folders, example prompt files,
3
+ * dataset examples, and configuration.
4
+ *
5
+ * Auto-detects AI tools in use and provides context-aware next steps.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerInitCommand(program: Command): void;
9
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoKpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiI1D"}