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,270 @@
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 { mkdir, writeFile, access } from 'node:fs/promises';
8
+ import { join } from 'node:path';
9
+ import { resolvePath } from '../utils/paths.js';
10
+ import { fileExists, isDirectory } from '../utils/fs.js';
11
+ const EXAMPLE_PROMPT_SPEC = `# Example prompt spec for codeprobe
12
+ name: summarize
13
+ description: Summarize an article into bullet points
14
+ model: claude-sonnet-4-6
15
+
16
+ system: |
17
+ You are a concise summarizer. Given an article, produce 3-5 bullet points
18
+ capturing the key ideas.
19
+
20
+ prompt: |
21
+ Summarize the following article into 3-5 bullet points:
22
+
23
+ {{input}}
24
+
25
+ tests:
26
+ - name: produces bullet points
27
+ input: >
28
+ Artificial intelligence is transforming industries worldwide.
29
+ Healthcare, finance, and transportation are seeing significant
30
+ improvements through machine learning applications.
31
+ expect:
32
+ contains:
33
+ - "artificial intelligence"
34
+ regex:
35
+ - "^[\\\\s]*[-*]"
36
+ - name: handles short input
37
+ input: "The sky is blue."
38
+ expect:
39
+ contains:
40
+ - "sky"
41
+ `;
42
+ const EXAMPLE_DATASET = `{"input":"Machine learning models require large amounts of data for training.","expected":"Summary mentioning data requirements"}
43
+ {"input":"Climate change is affecting weather patterns globally, leading to more extreme events.","expected":"Summary mentioning climate and weather"}
44
+ {"input":"Remote work has become the new norm since the pandemic reshaped how companies operate.","expected":"Summary mentioning remote work trends"}
45
+ `;
46
+ const EXAMPLE_FIXTURE = `The Rise of Context Engineering
47
+
48
+ Context engineering is the emerging discipline of designing and optimizing
49
+ the information provided to large language models (LLMs) to achieve better
50
+ outputs. Unlike prompt engineering, which focuses narrowly on the instruction
51
+ text, context engineering considers the entire input window: system prompts,
52
+ few-shot examples, retrieved documents, tool definitions, and conversation
53
+ history.
54
+
55
+ Key principles of context engineering include:
56
+
57
+ 1. Token budget management — understanding how to allocate the finite
58
+ context window across different information types.
59
+
60
+ 2. Information density — ensuring every token carries maximum signal
61
+ and minimal noise.
62
+
63
+ 3. Structured formatting — using consistent formats (YAML, XML, markdown)
64
+ that models parse reliably.
65
+
66
+ 4. Progressive disclosure — loading information on demand rather than
67
+ stuffing everything upfront.
68
+
69
+ 5. Validation loops — testing that context changes actually improve
70
+ model behavior on representative tasks.
71
+
72
+ As context windows grow from 8K to 200K to 1M+ tokens, context engineering
73
+ becomes increasingly important. The challenge shifts from "what fits" to
74
+ "what matters" — curating the right information at the right level of
75
+ detail for each specific task.
76
+ `;
77
+ const EXAMPLE_CONFIG = `# codeprobe configuration
78
+ # See: https://github.com/anthropics/codeprobe
79
+
80
+ defaultModel: claude-sonnet-4-6
81
+ defaultContextTarget: 200k
82
+
83
+ # Paths to ignore during context analysis
84
+ ignorePaths:
85
+ - node_modules
86
+ - .git
87
+ - dist
88
+ - coverage
89
+ - "*.min.js"
90
+ - "*.map"
91
+
92
+ # Enable result caching
93
+ caching: true
94
+
95
+ # Context window budget allocation (percentages)
96
+ contextBudgets:
97
+ systemPrompt: 10
98
+ coreFiles: 50
99
+ docs: 20
100
+ toolMeta: 10
101
+
102
+ # Watch mode settings
103
+ watchDefaults:
104
+ debounceMs: 300
105
+ clearScreen: true
106
+
107
+ # Benchmark defaults
108
+ benchmarkDefaults:
109
+ models:
110
+ - claude-sonnet-4-6
111
+ - claude-opus-4-6
112
+ runs: 3
113
+ warmup: true
114
+ `;
115
+ async function pathExists(path) {
116
+ try {
117
+ await access(path);
118
+ return true;
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ }
124
+ /**
125
+ * Auto-detect AI tools in use by checking for known config files/directories.
126
+ */
127
+ async function detectAITools(root) {
128
+ const detected = [];
129
+ const checks = [
130
+ { name: 'Claude Code', paths: ['CLAUDE.md', '.claude/settings.json'] },
131
+ { name: 'Cursor', paths: ['.cursorrules', '.cursor/rules'] },
132
+ { name: 'Windsurf', paths: ['.windsurfrules', '.windsurf/rules'] },
133
+ { name: 'GitHub Copilot', paths: ['.github/copilot-instructions.md', '.copilot'] },
134
+ { name: 'Aider', paths: ['.aider.conf.yml', '.aiderignore'] },
135
+ { name: 'Continue', paths: ['.continue/config.json', '.continuerules'] },
136
+ { name: 'Cline', paths: ['.clinerules', '.cline'] },
137
+ { name: 'Codex', paths: ['codex.md', 'CODEX.md', '.codex'] },
138
+ ];
139
+ for (const check of checks) {
140
+ for (const p of check.paths) {
141
+ if (await pathExists(join(root, p))) {
142
+ detected.push({ name: check.name, indicator: p });
143
+ break;
144
+ }
145
+ }
146
+ }
147
+ return detected;
148
+ }
149
+ export function registerInitCommand(program) {
150
+ program
151
+ .command('init')
152
+ .description('Create starter folders, example prompt files, dataset examples, and config')
153
+ .option('--force', 'Overwrite existing files')
154
+ .action(async (options) => {
155
+ const chalk = (await import('chalk')).default;
156
+ const root = process.cwd();
157
+ // Auto-detect AI tools
158
+ const detectedTools = await detectAITools(root);
159
+ const items = [
160
+ {
161
+ type: 'dir',
162
+ path: 'prompts',
163
+ description: 'Prompt specs directory',
164
+ },
165
+ {
166
+ type: 'file',
167
+ path: join('prompts', 'summarize.prompt.yaml'),
168
+ content: EXAMPLE_PROMPT_SPEC,
169
+ description: 'Example prompt spec',
170
+ },
171
+ {
172
+ type: 'dir',
173
+ path: 'datasets',
174
+ description: 'Datasets directory',
175
+ },
176
+ {
177
+ type: 'file',
178
+ path: join('datasets', 'sample.jsonl'),
179
+ content: EXAMPLE_DATASET,
180
+ description: 'Example dataset',
181
+ },
182
+ {
183
+ type: 'dir',
184
+ path: 'fixtures',
185
+ description: 'Test fixtures directory',
186
+ },
187
+ {
188
+ type: 'file',
189
+ path: join('fixtures', 'article.txt'),
190
+ content: EXAMPLE_FIXTURE,
191
+ description: 'Sample fixture',
192
+ },
193
+ {
194
+ type: 'dir',
195
+ path: 'examples',
196
+ description: 'Examples directory',
197
+ },
198
+ {
199
+ type: 'file',
200
+ path: 'codeprobe.config.yaml',
201
+ content: EXAMPLE_CONFIG,
202
+ description: 'Configuration file',
203
+ },
204
+ ];
205
+ let created = 0;
206
+ let skipped = 0;
207
+ const createdFiles = [];
208
+ for (const item of items) {
209
+ const fullPath = resolvePath(join(root, item.path));
210
+ if (item.type === 'dir') {
211
+ if (await isDirectory(fullPath)) {
212
+ if (!options.force) {
213
+ console.log(chalk.dim(` skip ${item.path}/ (already exists)`));
214
+ skipped++;
215
+ continue;
216
+ }
217
+ }
218
+ await mkdir(fullPath, { recursive: true });
219
+ console.log(chalk.green(` create ${item.path}/`));
220
+ created++;
221
+ }
222
+ else {
223
+ if ((await fileExists(fullPath)) && !options.force) {
224
+ console.log(chalk.dim(` skip ${item.path} (already exists)`));
225
+ skipped++;
226
+ continue;
227
+ }
228
+ // Ensure parent directory exists
229
+ const parentDir = fullPath.substring(0, fullPath.lastIndexOf('/'));
230
+ await mkdir(parentDir, { recursive: true });
231
+ await writeFile(fullPath, item.content ?? '', 'utf-8');
232
+ console.log(chalk.green(` create ${item.path}`));
233
+ createdFiles.push(item.path);
234
+ created++;
235
+ }
236
+ }
237
+ console.log('');
238
+ console.log(chalk.bold(`Initialized codeprobe project: ${created} created, ${skipped} skipped`));
239
+ // Show detected AI tools
240
+ if (detectedTools.length > 0) {
241
+ console.log('');
242
+ console.log(chalk.bold(' Detected AI tools:'));
243
+ for (const tool of detectedTools) {
244
+ console.log(chalk.cyan(` ${tool.name}`) + chalk.dim(` (${tool.indicator})`));
245
+ }
246
+ // Hint about Cursor rules generation if Cursor is detected but no .cursorrules
247
+ const hasCursor = detectedTools.some(t => t.name === 'Cursor');
248
+ const hasCursorRules = await pathExists(join(root, '.cursorrules'));
249
+ if (hasCursor && !hasCursorRules) {
250
+ console.log(chalk.dim(' Tip: generate Cursor rules with: codeprobe generate-rules --tool cursor'));
251
+ }
252
+ }
253
+ else {
254
+ console.log('');
255
+ console.log(chalk.dim(' No AI tools detected. Generate configs with:'));
256
+ console.log(chalk.dim(' codeprobe generate-claudemd (Claude Code)'));
257
+ console.log(chalk.dim(' codeprobe generate-rules (Cursor, Windsurf, etc.)'));
258
+ }
259
+ // Context-aware "What's next?" section
260
+ console.log('');
261
+ console.log(chalk.bold(' What\'s next:'));
262
+ console.log(chalk.white(' 1. Run a full scan: ') + chalk.cyan('codeprobe scan'));
263
+ console.log(chalk.white(' 2. See the dashboard: ') + chalk.cyan('codeprobe'));
264
+ console.log(chalk.white(' 3. Generate AI tool config: ') + chalk.cyan('codeprobe generate-claudemd'));
265
+ console.log(chalk.white(' 4. Test your prompts: ') + chalk.cyan('codeprobe test'));
266
+ console.log(chalk.white(' 5. Auto-generate tests: ') + chalk.cyan('codeprobe autotest prompts/summarize.prompt.yaml'));
267
+ console.log('');
268
+ });
269
+ }
270
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `codeprobe install-hook` — Install a Claude Code hook into .claude/settings.json.
3
+ *
4
+ * Merges a hook entry (e.g. PreCommit) into the project's Claude settings
5
+ * without overwriting existing entries.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerInstallHookCommand(program: Command): void;
9
+ //# sourceMappingURL=installHook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installHook.d.ts","sourceRoot":"","sources":["../../src/commands/installHook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqFjE"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * `codeprobe install-hook` — Install a Claude Code hook into .claude/settings.json.
3
+ *
4
+ * Merges a hook entry (e.g. PreCommit) into the project's Claude settings
5
+ * without overwriting existing entries.
6
+ */
7
+ import { mkdir, writeFile } from 'node:fs/promises';
8
+ import { join } from 'node:path';
9
+ import { fileExists, readTextFile } from '../utils/fs.js';
10
+ export function registerInstallHookCommand(program) {
11
+ program
12
+ .command('install-hook')
13
+ .description('Install a Claude Code hook into .claude/settings.json')
14
+ .option('--event <event>', 'Hook event name', 'PreCommit')
15
+ .option('--command <cmd>', 'Command to run', 'codeprobe test --json')
16
+ .option('--dry-run', 'Show what would be written without modifying files')
17
+ .action(async (options) => {
18
+ const chalk = (await import('chalk')).default;
19
+ const projectRoot = process.cwd();
20
+ const claudeDir = join(projectRoot, '.claude');
21
+ const settingsPath = join(claudeDir, 'settings.json');
22
+ // Read existing settings or start fresh
23
+ let settings = {};
24
+ if (await fileExists(settingsPath)) {
25
+ const content = await readTextFile(settingsPath);
26
+ if (content) {
27
+ try {
28
+ settings = JSON.parse(content);
29
+ }
30
+ catch {
31
+ console.error(chalk.red('Error: .claude/settings.json contains invalid JSON.'));
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ }
36
+ }
37
+ // Ensure hooks object exists
38
+ if (!settings.hooks) {
39
+ settings.hooks = {};
40
+ }
41
+ // Ensure event array exists
42
+ const eventName = options.event;
43
+ if (!settings.hooks[eventName]) {
44
+ settings.hooks[eventName] = [];
45
+ }
46
+ const newEntry = {
47
+ command: options.command,
48
+ description: 'Run prompt regression tests',
49
+ };
50
+ // Check for duplicate — same command already registered
51
+ const existing = settings.hooks[eventName];
52
+ const alreadyExists = existing.some((e) => e.command === newEntry.command);
53
+ if (alreadyExists) {
54
+ console.log(chalk.yellow(`\nHook already exists: ${eventName} -> "${newEntry.command}"\n` +
55
+ 'No changes made.\n'));
56
+ return;
57
+ }
58
+ // Append to the array (merge, not overwrite)
59
+ existing.push(newEntry);
60
+ const resultJson = JSON.stringify(settings, null, 2);
61
+ if (options.dryRun) {
62
+ console.log(chalk.dim('\n[dry-run] Would write to .claude/settings.json:\n'));
63
+ console.log(resultJson);
64
+ console.log('');
65
+ return;
66
+ }
67
+ // Create .claude/ directory if needed
68
+ await mkdir(claudeDir, { recursive: true });
69
+ // Write settings
70
+ await writeFile(settingsPath, resultJson + '\n', 'utf-8');
71
+ console.log(chalk.green('\nHook installed successfully!\n'));
72
+ console.log(` Event: ${chalk.bold(eventName)}`);
73
+ console.log(` Command: ${chalk.bold(newEntry.command)}`);
74
+ console.log(` File: ${chalk.dim('.claude/settings.json')}`);
75
+ console.log('');
76
+ });
77
+ }
78
+ //# sourceMappingURL=installHook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installHook.js","sourceRoot":"","sources":["../../src/commands/installHook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `codeprobe lint [path]` — Lint prompt spec files for common issues.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function registerLintCommand(program: Command): void;
6
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6LpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6E1D"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * `codeprobe lint [path]` — Lint prompt spec files for common issues.
3
+ */
4
+ import { resolve } from 'node:path';
5
+ import { resolvePath } from '../utils/paths.js';
6
+ import { readTextFile, isDirectory, fileExists, getRelativePath as getRelPath } from '../utils/fs.js';
7
+ import { setLogLevel } from '../utils/logger.js';
8
+ /**
9
+ * Find all prompt spec files in a directory.
10
+ */
11
+ async function findSpecFiles(dirPath) {
12
+ const { glob } = await import('glob');
13
+ const pattern = resolve(dirPath, '**/*.prompt.{yaml,yml}');
14
+ return glob(pattern, { absolute: true });
15
+ }
16
+ /**
17
+ * Lint a single prompt spec file.
18
+ */
19
+ async function lintFile(filePath, rootPath) {
20
+ const yaml = (await import('js-yaml')).default;
21
+ const warnings = [];
22
+ const relPath = getRelPath(rootPath, filePath);
23
+ const content = await readTextFile(filePath);
24
+ if (!content) {
25
+ warnings.push({
26
+ file: relPath,
27
+ rule: 'file-read',
28
+ severity: 'error',
29
+ message: 'Could not read file',
30
+ });
31
+ return warnings;
32
+ }
33
+ // Parse YAML
34
+ let parsed;
35
+ try {
36
+ parsed = yaml.load(content);
37
+ }
38
+ catch (err) {
39
+ warnings.push({
40
+ file: relPath,
41
+ rule: 'yaml-parse',
42
+ severity: 'error',
43
+ message: `Invalid YAML: ${err instanceof Error ? err.message : String(err)}`,
44
+ });
45
+ return warnings;
46
+ }
47
+ if (!parsed || typeof parsed !== 'object') {
48
+ warnings.push({
49
+ file: relPath,
50
+ rule: 'yaml-parse',
51
+ severity: 'error',
52
+ message: 'YAML did not parse to an object',
53
+ });
54
+ return warnings;
55
+ }
56
+ // Check required fields
57
+ if (!parsed['name']) {
58
+ warnings.push({
59
+ file: relPath,
60
+ rule: 'missing-name',
61
+ severity: 'warning',
62
+ message: 'Missing "name" field',
63
+ });
64
+ }
65
+ if (!parsed['prompt']) {
66
+ warnings.push({
67
+ file: relPath,
68
+ rule: 'missing-prompt',
69
+ severity: 'error',
70
+ message: 'Missing "prompt" field — every spec needs a prompt',
71
+ });
72
+ }
73
+ // Check prompt quality
74
+ const prompt = parsed['prompt'];
75
+ if (typeof prompt === 'string') {
76
+ if (prompt.length < 10) {
77
+ warnings.push({
78
+ file: relPath,
79
+ rule: 'short-prompt',
80
+ severity: 'warning',
81
+ message: 'Prompt is very short (< 10 characters). Consider adding more detail.',
82
+ });
83
+ }
84
+ if (prompt.length > 10_000) {
85
+ warnings.push({
86
+ file: relPath,
87
+ rule: 'long-prompt',
88
+ severity: 'info',
89
+ message: `Prompt is very long (${prompt.length} chars). Consider splitting into system + prompt.`,
90
+ });
91
+ }
92
+ if (!parsed['system'] && prompt.includes('You are')) {
93
+ warnings.push({
94
+ file: relPath,
95
+ rule: 'system-in-prompt',
96
+ severity: 'info',
97
+ message: 'Prompt contains "You are" — consider moving persona to the "system" field.',
98
+ });
99
+ }
100
+ }
101
+ // Check model
102
+ if (parsed['model'] && typeof parsed['model'] === 'string') {
103
+ const model = parsed['model'];
104
+ if (!model.startsWith('claude-') && !model.startsWith('gpt-') && !model.includes('/')) {
105
+ warnings.push({
106
+ file: relPath,
107
+ rule: 'unknown-model',
108
+ severity: 'warning',
109
+ message: `Unknown model format: "${model}". Expected claude-*, gpt-*, or provider/model.`,
110
+ });
111
+ }
112
+ }
113
+ // Check tests
114
+ if (!parsed['tests'] || !Array.isArray(parsed['tests'])) {
115
+ warnings.push({
116
+ file: relPath,
117
+ rule: 'no-tests',
118
+ severity: 'warning',
119
+ message: 'No tests defined. Add tests to validate prompt behavior.',
120
+ });
121
+ }
122
+ else {
123
+ const tests = parsed['tests'];
124
+ for (let i = 0; i < tests.length; i++) {
125
+ const test = tests[i];
126
+ if (!test['name']) {
127
+ warnings.push({
128
+ file: relPath,
129
+ rule: 'test-missing-name',
130
+ severity: 'warning',
131
+ message: `Test at index ${i} is missing a "name" field.`,
132
+ });
133
+ }
134
+ if (!test['expect']) {
135
+ warnings.push({
136
+ file: relPath,
137
+ rule: 'test-no-expect',
138
+ severity: 'info',
139
+ message: `Test "${test['name'] ?? `index ${i}`}" has no "expect" block.`,
140
+ });
141
+ }
142
+ }
143
+ }
144
+ // Check description
145
+ if (!parsed['description']) {
146
+ warnings.push({
147
+ file: relPath,
148
+ rule: 'no-description',
149
+ severity: 'info',
150
+ message: 'Missing "description" field. Add one for documentation.',
151
+ });
152
+ }
153
+ return warnings;
154
+ }
155
+ /**
156
+ * Lint all prompt specs in a path.
157
+ */
158
+ async function promptLinter(targetPath) {
159
+ let files;
160
+ if (await fileExists(targetPath)) {
161
+ files = [targetPath];
162
+ }
163
+ else if (await isDirectory(targetPath)) {
164
+ files = await findSpecFiles(targetPath);
165
+ }
166
+ else {
167
+ throw new Error(`Path not found: ${targetPath}`);
168
+ }
169
+ const allWarnings = [];
170
+ for (const file of files) {
171
+ const warnings = await lintFile(file, process.cwd());
172
+ allWarnings.push(...warnings);
173
+ }
174
+ return allWarnings;
175
+ }
176
+ export function registerLintCommand(program) {
177
+ program
178
+ .command('lint [path]')
179
+ .description('Lint prompt spec files for common issues and best practices')
180
+ .option('--json', 'Output warnings as JSON')
181
+ .option('--fix', 'Show fix suggestions (future)')
182
+ .option('--output <file>', 'Write JSON results to a file')
183
+ .action(async (pathArg, options) => {
184
+ if (options.json || options.output) {
185
+ setLogLevel('silent');
186
+ }
187
+ const chalk = (await import('chalk')).default;
188
+ const targetPath = resolvePath(pathArg ?? 'prompts');
189
+ const warnings = await promptLinter(targetPath);
190
+ if (options.output) {
191
+ const { writeFile } = await import('node:fs/promises');
192
+ await writeFile(resolvePath(options.output), JSON.stringify(warnings, null, 2));
193
+ console.log(`Results written to ${options.output}`);
194
+ return;
195
+ }
196
+ if (options.json) {
197
+ console.log(JSON.stringify(warnings, null, 2));
198
+ return;
199
+ }
200
+ if (warnings.length === 0) {
201
+ console.log(chalk.green('\nNo lint issues found.\n'));
202
+ return;
203
+ }
204
+ // Group by file
205
+ const grouped = new Map();
206
+ for (const w of warnings) {
207
+ const list = grouped.get(w.file) ?? [];
208
+ list.push(w);
209
+ grouped.set(w.file, list);
210
+ }
211
+ const severityIcon = (s) => {
212
+ switch (s) {
213
+ case 'error': return chalk.red('ERR');
214
+ case 'warning': return chalk.yellow('WRN');
215
+ case 'info': return chalk.blue('INF');
216
+ }
217
+ };
218
+ console.log(chalk.bold(`\nLint Results (${warnings.length} issues)`));
219
+ console.log('');
220
+ for (const [file, fileWarnings] of grouped) {
221
+ console.log(chalk.bold(` ${file}`));
222
+ for (const w of fileWarnings) {
223
+ const lineStr = w.line ? `:${w.line}` : '';
224
+ console.log(` ${severityIcon(w.severity)} ${w.rule}${lineStr}: ${w.message}`);
225
+ }
226
+ console.log('');
227
+ }
228
+ const errorCount = warnings.filter((w) => w.severity === 'error').length;
229
+ const warnCount = warnings.filter((w) => w.severity === 'warning').length;
230
+ const infoCount = warnings.filter((w) => w.severity === 'info').length;
231
+ console.log(chalk.dim(` ${errorCount} errors, ${warnCount} warnings, ${infoCount} info\n`));
232
+ if (errorCount > 0) {
233
+ process.exitCode = 1;
234
+ }
235
+ });
236
+ }
237
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `codeprobe map [path]` — Repository context map.
3
+ *
4
+ * Shows directory-level token distribution as a tree with bar
5
+ * visualizations.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerMapCommand(program: Command): void;
9
+ //# sourceMappingURL=map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsEpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiEzD"}