@js-recon/js-recon 1.4.3 → 2.0.1-alpha.1

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 (461) hide show
  1. package/.claude-sync/sync.sh +1 -1
  2. package/.github/workflows/build-and-prettify.yaml +55 -25
  3. package/.github/workflows/codeql.yml +33 -0
  4. package/.github/workflows/exploit-smoke-test.yaml +160 -0
  5. package/.github/workflows/framework-detection-smoke-test.yaml +135 -0
  6. package/.github/workflows/plumber.yml +20 -0
  7. package/.github/workflows/promote-js-recon.yml +5 -3
  8. package/.github/workflows/publish-js-recon.yml +6 -1
  9. package/.github/workflows/rules-smoke-test.yaml +15 -7
  10. package/.nvmrc +1 -0
  11. package/.plumber.yaml +151 -0
  12. package/CHANGELOG.md +54 -0
  13. package/CONTRIBUTING.md +32 -0
  14. package/Dockerfile +1 -0
  15. package/README.md +55 -2
  16. package/SECURITY.md +1 -1
  17. package/build/analyze/engine/astEngine.js +10 -9
  18. package/build/analyze/engine/astEngine.js.map +1 -1
  19. package/build/analyze/engine/csMastSEngine.js +6 -6
  20. package/build/analyze/engine/csMastSEngine.js.map +1 -1
  21. package/build/analyze/engine/index.js +1 -1
  22. package/build/analyze/engine/index.js.map +1 -1
  23. package/build/analyze/engine/requestEngine.js +6 -6
  24. package/build/analyze/engine/requestEngine.js.map +1 -1
  25. package/build/analyze/helpers/determineCompatibleVersion.js +70 -0
  26. package/build/analyze/helpers/determineCompatibleVersion.js.map +1 -0
  27. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +9 -3
  28. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
  29. package/build/analyze/helpers/initRules.js +42 -24
  30. package/build/analyze/helpers/initRules.js.map +1 -1
  31. package/build/analyze/helpers/outputHelper.js +3 -3
  32. package/build/analyze/helpers/outputHelper.js.map +1 -1
  33. package/build/analyze/helpers/schemas.js +1 -0
  34. package/build/analyze/helpers/schemas.js.map +1 -1
  35. package/build/analyze/helpers/validate.js +9 -5
  36. package/build/analyze/helpers/validate.js.map +1 -1
  37. package/build/analyze/index.js +26 -16
  38. package/build/analyze/index.js.map +1 -1
  39. package/build/cliProgram.js +710 -0
  40. package/build/cliProgram.js.map +1 -0
  41. package/build/completion/index.js +245 -339
  42. package/build/completion/index.js.map +1 -1
  43. package/build/completion/introspect.js +17 -0
  44. package/build/completion/introspect.js.map +1 -0
  45. package/build/config/applicationConfig.js +494 -0
  46. package/build/config/applicationConfig.js.map +1 -0
  47. package/build/cs_mast/index.js +18 -17
  48. package/build/cs_mast/index.js.map +1 -1
  49. package/build/endpoints/gen_report/gen_json.js +2 -2
  50. package/build/endpoints/gen_report/gen_json.js.map +1 -1
  51. package/build/endpoints/gen_report/utility/iterate_n_store.js +1 -1
  52. package/build/endpoints/gen_report/utility/iterate_n_store.js.map +1 -1
  53. package/build/endpoints/index.js +12 -12
  54. package/build/endpoints/index.js.map +1 -1
  55. package/build/endpoints/next_js/client_jsFilesHref.js +3 -3
  56. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
  57. package/build/endpoints/next_js/client_jsonParse.js +4 -4
  58. package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
  59. package/build/endpoints/next_js/client_mappedJsonFile.js +6 -6
  60. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
  61. package/build/endpoints/next_js/client_subsequentRequests.js +5 -5
  62. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
  63. package/build/exploit/angular/cve-2026-68945.js +61 -0
  64. package/build/exploit/angular/cve-2026-68945.js.map +1 -0
  65. package/build/exploit/index.js +60 -0
  66. package/build/exploit/index.js.map +1 -0
  67. package/build/exploit/next/cve-2025-29927.js +65 -0
  68. package/build/exploit/next/cve-2025-29927.js.map +1 -0
  69. package/build/exploit/next/cve-2026-64645.js +51 -0
  70. package/build/exploit/next/cve-2026-64645.js.map +1 -0
  71. package/build/exploit/nuxt/cve-2026-71315.js +47 -0
  72. package/build/exploit/nuxt/cve-2026-71315.js.map +1 -0
  73. package/build/exploit/nuxt/cve-2026-71320.js +114 -0
  74. package/build/exploit/nuxt/cve-2026-71320.js.map +1 -0
  75. package/build/exploit/react/cve-2025-55182.js +116 -0
  76. package/build/exploit/react/cve-2025-55182.js.map +1 -0
  77. package/build/exploit/registry/cveRegistry.js +115 -0
  78. package/build/exploit/registry/cveRegistry.js.map +1 -0
  79. package/build/exploit/types.js +2 -0
  80. package/build/exploit/types.js.map +1 -0
  81. package/build/exploit/utility/compareResponses.js +29 -0
  82. package/build/exploit/utility/compareResponses.js.map +1 -0
  83. package/build/exploit/utility/outputHelper.js +22 -0
  84. package/build/exploit/utility/outputHelper.js.map +1 -0
  85. package/build/exploit/utility/rawRequest.js +54 -0
  86. package/build/exploit/utility/rawRequest.js.map +1 -0
  87. package/build/exploit/utility/sandboxRce.js +49 -0
  88. package/build/exploit/utility/sandboxRce.js.map +1 -0
  89. package/build/exploit/utility/toEngineOutput.js +28 -0
  90. package/build/exploit/utility/toEngineOutput.js.map +1 -0
  91. package/build/exploit/utility/wsClient.js +78 -0
  92. package/build/exploit/utility/wsClient.js.map +1 -0
  93. package/build/exploit/vite/cve-2025-30208.js +44 -0
  94. package/build/exploit/vite/cve-2025-30208.js.map +1 -0
  95. package/build/exploit/vite/cve-2026-39363.js +60 -0
  96. package/build/exploit/vite/cve-2026-39363.js.map +1 -0
  97. package/build/fingerprint/index.js +11 -21
  98. package/build/fingerprint/index.js.map +1 -1
  99. package/build/globalConfig.js +2 -2
  100. package/build/globalConfig.js.map +1 -1
  101. package/build/index.js +16 -555
  102. package/build/index.js.map +1 -1
  103. package/build/lazyLoad/angular/angular_getFromPageSource.js +3 -3
  104. package/build/lazyLoad/angular/angular_getFromPageSource.js.map +1 -1
  105. package/build/lazyLoad/downloadFilesUtil.js +51 -40
  106. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  107. package/build/lazyLoad/downloadQueue.js +154 -50
  108. package/build/lazyLoad/downloadQueue.js.map +1 -1
  109. package/build/lazyLoad/downloadResponse.js +113 -0
  110. package/build/lazyLoad/downloadResponse.js.map +1 -0
  111. package/build/lazyLoad/generic/generic_crawlPages.js +186 -0
  112. package/build/lazyLoad/generic/generic_crawlPages.js.map +1 -0
  113. package/build/lazyLoad/generic/generic_downloadFiles.js +81 -0
  114. package/build/lazyLoad/generic/generic_downloadFiles.js.map +1 -0
  115. package/build/lazyLoad/generic/generic_extractLinks.js +79 -0
  116. package/build/lazyLoad/generic/generic_extractLinks.js.map +1 -0
  117. package/build/lazyLoad/generic/generic_getScriptTags.js +152 -0
  118. package/build/lazyLoad/generic/generic_getScriptTags.js.map +1 -0
  119. package/build/lazyLoad/generic/generic_importMapDiscovery.js +87 -0
  120. package/build/lazyLoad/generic/generic_importMapDiscovery.js.map +1 -0
  121. package/build/lazyLoad/generic/generic_resolveScope.js +61 -0
  122. package/build/lazyLoad/generic/generic_resolveScope.js.map +1 -0
  123. package/build/lazyLoad/generic/generic_scanAttributesForJs.js +122 -0
  124. package/build/lazyLoad/generic/generic_scanAttributesForJs.js.map +1 -0
  125. package/build/lazyLoad/generic/generic_stringsDiscovery.js +103 -0
  126. package/build/lazyLoad/generic/generic_stringsDiscovery.js.map +1 -0
  127. package/build/lazyLoad/generic/generic_webpackChunkPaths.js +56 -0
  128. package/build/lazyLoad/generic/generic_webpackChunkPaths.js.map +1 -0
  129. package/build/lazyLoad/globals.js +35 -0
  130. package/build/lazyLoad/globals.js.map +1 -1
  131. package/build/lazyLoad/index.js +311 -175
  132. package/build/lazyLoad/index.js.map +1 -1
  133. package/build/lazyLoad/methodFilter.js +2 -0
  134. package/build/lazyLoad/methodFilter.js.map +1 -1
  135. package/build/lazyLoad/next_js/NextJsCrawler.js +39 -14
  136. package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
  137. package/build/lazyLoad/next_js/next_GetJSScript.js +3 -3
  138. package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -1
  139. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +4 -4
  140. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
  141. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +21 -20
  142. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  143. package/build/lazyLoad/next_js/next_SubsequentRequests.js +100 -99
  144. package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
  145. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +1 -1
  146. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -1
  147. package/build/lazyLoad/next_js/next_buildId.js +2 -2
  148. package/build/lazyLoad/next_js/next_buildId.js.map +1 -1
  149. package/build/lazyLoad/next_js/next_getClientSidePaths.js +2 -2
  150. package/build/lazyLoad/next_js/next_getClientSidePaths.js.map +1 -1
  151. package/build/lazyLoad/next_js/next_parseLayoutJs.js +6 -6
  152. package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
  153. package/build/lazyLoad/next_js/next_promiseResolve.js +1 -1
  154. package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
  155. package/build/lazyLoad/next_js/next_routerStateForge.js +341 -0
  156. package/build/lazyLoad/next_js/next_routerStateForge.js.map +1 -0
  157. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +1 -1
  158. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
  159. package/build/lazyLoad/next_js/next_serverActionIdScan.js +77 -0
  160. package/build/lazyLoad/next_js/next_serverActionIdScan.js.map +1 -0
  161. package/build/lazyLoad/nuxt_js/nuxt_astParse.js +15 -13
  162. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
  163. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js +2 -2
  164. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js.map +1 -1
  165. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -3
  166. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
  167. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +2 -2
  168. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
  169. package/build/lazyLoad/outputPath.js +92 -0
  170. package/build/lazyLoad/outputPath.js.map +1 -0
  171. package/build/lazyLoad/react/react_followImports.js +15 -5
  172. package/build/lazyLoad/react/react_followImports.js.map +1 -1
  173. package/build/lazyLoad/react/react_getScriptTags.js +11 -6
  174. package/build/lazyLoad/react/react_getScriptTags.js.map +1 -1
  175. package/build/lazyLoad/react/react_sourcemapUrls.js +3 -2
  176. package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -1
  177. package/build/lazyLoad/react/react_webpackChunkPaths.js +12 -203
  178. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
  179. package/build/lazyLoad/researchUtils.js +15 -0
  180. package/build/lazyLoad/researchUtils.js.map +1 -0
  181. package/build/lazyLoad/shared/webpackChunkParsers.js +218 -0
  182. package/build/lazyLoad/shared/webpackChunkParsers.js.map +1 -0
  183. package/build/lazyLoad/stagnation/stagnationMonitor.js +63 -0
  184. package/build/lazyLoad/stagnation/stagnationMonitor.js.map +1 -0
  185. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +1 -0
  186. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -1
  187. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +5 -5
  188. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
  189. package/build/lazyLoad/svelte/svelte_getVersionJson.js +2 -2
  190. package/build/lazyLoad/svelte/svelte_getVersionJson.js.map +1 -1
  191. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +6 -6
  192. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -1
  193. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +2 -2
  194. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
  195. package/build/lazyLoad/techDetect/checkAngularJS.js +1 -1
  196. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
  197. package/build/lazyLoad/techDetect/checkNuxtJS.js +3 -3
  198. package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -1
  199. package/build/lazyLoad/techDetect/checkSvelte.js +0 -1
  200. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
  201. package/build/lazyLoad/techDetect/checkVueJS.js +6 -6
  202. package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -1
  203. package/build/lazyLoad/techDetect/index.js +106 -60
  204. package/build/lazyLoad/techDetect/index.js.map +1 -1
  205. package/build/lazyLoad/vue/vue_RuntimeJs.js +20 -15
  206. package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
  207. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +10 -5
  208. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
  209. package/build/lazyLoad/vue/vue_discoverJsFiles.js +20 -17
  210. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
  211. package/build/lazyLoad/vue/vue_getClientSidePaths.js +70 -46
  212. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
  213. package/build/lazyLoad/vue/vue_jsImports.js +3 -2
  214. package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
  215. package/build/lazyLoad/vue/vue_pageSrc.js +3 -2
  216. package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -1
  217. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +6 -5
  218. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
  219. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +10 -21
  220. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
  221. package/build/lazyLoad/vue/vue_severalJsFilesHome.js +5 -4
  222. package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
  223. package/build/lazyLoad/vue/vue_stringJsFiles.js +28 -25
  224. package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -1
  225. package/build/lazyLoad/vue/vue_viteMapDeps.js +8 -2
  226. package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
  227. package/build/load/index.js +8 -7
  228. package/build/load/index.js.map +1 -1
  229. package/build/map/angular_js/getAngularConnections.js +6 -6
  230. package/build/map/angular_js/getAngularConnections.js.map +1 -1
  231. package/build/map/graphql/resolveGraphql.js +6 -6
  232. package/build/map/graphql/resolveGraphql.js.map +1 -1
  233. package/build/map/index.js +17 -17
  234. package/build/map/index.js.map +1 -1
  235. package/build/map/interactive-mode/commandHandler.js +278 -0
  236. package/build/map/interactive-mode/commandHandler.js.map +1 -0
  237. package/build/map/interactive-mode/commandHelpers.js +189 -0
  238. package/build/map/interactive-mode/commandHelpers.js.map +1 -0
  239. package/build/map/interactive-mode/esqueryGen.js.map +1 -0
  240. package/build/map/interactive-mode/helpMenu.js +11 -0
  241. package/build/map/interactive-mode/helpMenu.js.map +1 -0
  242. package/build/map/interactive-mode/inputPatch.js.map +1 -0
  243. package/build/map/interactive-mode/interactive.js +71 -0
  244. package/build/map/interactive-mode/interactive.js.map +1 -0
  245. package/build/map/interactive-mode/keybindings.js.map +1 -0
  246. package/build/map/interactive-mode/printer.js.map +1 -0
  247. package/build/map/interactive-mode/ui.js.map +1 -0
  248. package/build/map/next_js/getAxiosInstances.js +5 -5
  249. package/build/map/next_js/getAxiosInstances.js.map +1 -1
  250. package/build/map/next_js/getExports.js +4 -4
  251. package/build/map/next_js/getExports.js.map +1 -1
  252. package/build/map/next_js/getFetchInstances.js +10 -10
  253. package/build/map/next_js/getFetchInstances.js.map +1 -1
  254. package/build/map/next_js/getTurbopackConnections.js +8 -8
  255. package/build/map/next_js/getTurbopackConnections.js.map +1 -1
  256. package/build/map/next_js/getWebpackConnections.js +27 -16
  257. package/build/map/next_js/getWebpackConnections.js.map +1 -1
  258. package/build/map/next_js/interactive.js +3 -65
  259. package/build/map/next_js/interactive.js.map +1 -1
  260. package/build/map/next_js/interactive_helpers/commandHandler.js +38 -290
  261. package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -1
  262. package/build/map/next_js/interactive_helpers/commandHelpers.js +0 -184
  263. package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
  264. package/build/map/next_js/interactive_helpers/helpMenu.js +2 -10
  265. package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
  266. package/build/map/next_js/resolveAxios.js +6 -6
  267. package/build/map/next_js/resolveAxios.js.map +1 -1
  268. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +4 -4
  269. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -1
  270. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -2
  271. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
  272. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +5 -5
  273. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
  274. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +10 -10
  275. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
  276. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +13 -9
  277. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
  278. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +12 -8
  279. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -1
  280. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +12 -8
  281. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -1
  282. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +11 -11
  283. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
  284. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +16 -16
  285. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
  286. package/build/map/next_js/resolveFetch.js +23 -23
  287. package/build/map/next_js/resolveFetch.js.map +1 -1
  288. package/build/map/next_js/resolveNewRequest.js +10 -10
  289. package/build/map/next_js/resolveNewRequest.js.map +1 -1
  290. package/build/map/next_js/resolveServerActions.js +4 -4
  291. package/build/map/next_js/resolveServerActions.js.map +1 -1
  292. package/build/map/next_js/utils.js +8 -2
  293. package/build/map/next_js/utils.js.map +1 -1
  294. package/build/map/react_js/getReactConnections.js +21 -14
  295. package/build/map/react_js/getReactConnections.js.map +1 -1
  296. package/build/map/svelte_js/interactive.js +3 -54
  297. package/build/map/svelte_js/interactive.js.map +1 -1
  298. package/build/map/vue_js/getViteConnections.js +23 -16
  299. package/build/map/vue_js/getViteConnections.js.map +1 -1
  300. package/build/map/vue_js/interactive.js +3 -63
  301. package/build/map/vue_js/interactive.js.map +1 -1
  302. package/build/map/vue_js/interactive_helpers/commandHandler.js +34 -283
  303. package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -1
  304. package/build/map/vue_js/interactive_helpers/helpMenu.js +2 -10
  305. package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -1
  306. package/build/map/vue_js/taint_utils.js +1 -1
  307. package/build/map/vue_js/taint_utils.js.map +1 -1
  308. package/build/map/vue_js/vue_resolveFetch.js +12 -12
  309. package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
  310. package/build/map/vue_js/vue_resolveHttpClient.js +18 -18
  311. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
  312. package/build/map/vue_js/vue_resolveXhr.js +11 -11
  313. package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
  314. package/build/mcp/chatOneShot.js +7 -7
  315. package/build/mcp/chatOneShot.js.map +1 -1
  316. package/build/mcp/claudeCodeCreds.js +5 -5
  317. package/build/mcp/claudeCodeCreds.js.map +1 -1
  318. package/build/mcp/cli.js +36 -35
  319. package/build/mcp/cli.js.map +1 -1
  320. package/build/mcp/config.js +4 -4
  321. package/build/mcp/config.js.map +1 -1
  322. package/build/mcp/index.js +7 -7
  323. package/build/mcp/index.js.map +1 -1
  324. package/build/mcp/mcpServer.js +3 -2
  325. package/build/mcp/mcpServer.js.map +1 -1
  326. package/build/mcp/skills.js +1 -0
  327. package/build/mcp/skills.js.map +1 -1
  328. package/build/mcp/tools.js +5 -4
  329. package/build/mcp/tools.js.map +1 -1
  330. package/build/proxy/checkFeasibility.js +8 -4
  331. package/build/proxy/checkFeasibility.js.map +1 -1
  332. package/build/proxy/checkFireWallBlocking.js +23 -13
  333. package/build/proxy/checkFireWallBlocking.js.map +1 -1
  334. package/build/proxy/detectBlockedResponse.js +205 -0
  335. package/build/proxy/detectBlockedResponse.js.map +1 -0
  336. package/build/proxy/genReq.js +434 -127
  337. package/build/proxy/genReq.js.map +1 -1
  338. package/build/proxy/index.js +3 -3
  339. package/build/proxy/index.js.map +1 -1
  340. package/build/proxy/oxylabsFallback.js +110 -0
  341. package/build/proxy/oxylabsFallback.js.map +1 -0
  342. package/build/proxy/proxyFeasibilityRequest.js +11 -9
  343. package/build/proxy/proxyFeasibilityRequest.js.map +1 -1
  344. package/build/refactor/index.js +83 -79
  345. package/build/refactor/index.js.map +1 -1
  346. package/build/refactor/next/index.js +69 -26
  347. package/build/refactor/next/index.js.map +1 -1
  348. package/build/refactor/next/transform.js +11 -4
  349. package/build/refactor/next/transform.js.map +1 -1
  350. package/build/refactor/next/validator.js +7 -7
  351. package/build/refactor/next/validator.js.map +1 -1
  352. package/build/refactor/react/index.js +13 -13
  353. package/build/refactor/react/index.js.map +1 -1
  354. package/build/refactor/react/validator.js +7 -7
  355. package/build/refactor/react/validator.js.map +1 -1
  356. package/build/refactor/react-vite/index.js +3 -3
  357. package/build/refactor/react-vite/index.js.map +1 -1
  358. package/build/refactor/remote/hf-client.js +1 -0
  359. package/build/refactor/remote/hf-client.js.map +1 -1
  360. package/build/refactor/remote/version-detect.js +12 -12
  361. package/build/refactor/remote/version-detect.js.map +1 -1
  362. package/build/refactor/vue/index.js +6 -6
  363. package/build/refactor/vue/index.js.map +1 -1
  364. package/build/refactor/vue/vite.js +6 -6
  365. package/build/refactor/vue/vite.js.map +1 -1
  366. package/build/report/index.js +30 -8
  367. package/build/report/index.js.map +1 -1
  368. package/build/report/swaggerJacker.js +63 -0
  369. package/build/report/swaggerJacker.js.map +1 -0
  370. package/build/report/utility/genHtml.js +7 -7
  371. package/build/report/utility/genHtml.js.map +1 -1
  372. package/build/report/utility/populateDb/populateAnalysisFindings.js +2 -2
  373. package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -1
  374. package/build/report/utility/populateDb/populateEndpoints.js +3 -3
  375. package/build/report/utility/populateDb/populateEndpoints.js.map +1 -1
  376. package/build/report/utility/populateDb/populateMappedJson.js +2 -2
  377. package/build/report/utility/populateDb/populateMappedJson.js.map +1 -1
  378. package/build/report/utility/populateDb/populateMappedOpenapi.js +3 -3
  379. package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -1
  380. package/build/run/bundler-detect.js +45 -9
  381. package/build/run/bundler-detect.js.map +1 -1
  382. package/build/run/cancellableStep.js +27 -0
  383. package/build/run/cancellableStep.js.map +1 -0
  384. package/build/run/dashboard/dashboardHtml.js +150 -0
  385. package/build/run/dashboard/dashboardHtml.js.map +1 -0
  386. package/build/run/dashboard/fsBrowser.js +43 -0
  387. package/build/run/dashboard/fsBrowser.js.map +1 -0
  388. package/build/run/dashboard/server.js +123 -0
  389. package/build/run/dashboard/server.js.map +1 -0
  390. package/build/run/dashboard/state.js +97 -0
  391. package/build/run/dashboard/state.js.map +1 -0
  392. package/build/run/index.js +239 -204
  393. package/build/run/index.js.map +1 -1
  394. package/build/run/interruptHandler.js +18 -0
  395. package/build/run/interruptHandler.js.map +1 -1
  396. package/build/run/outputDirectory.js +377 -0
  397. package/build/run/outputDirectory.js.map +1 -0
  398. package/build/sourcemaps/index.js +116 -29
  399. package/build/sourcemaps/index.js.map +1 -1
  400. package/build/strings/index.js +38 -28
  401. package/build/strings/index.js.map +1 -1
  402. package/build/strings/openapi.js +4 -4
  403. package/build/strings/openapi.js.map +1 -1
  404. package/build/strings/permutate.js +4 -4
  405. package/build/strings/permutate.js.map +1 -1
  406. package/build/strings/secrets.js +1 -0
  407. package/build/strings/secrets.js.map +1 -1
  408. package/build/strings/trufflehog.js +66 -19
  409. package/build/strings/trufflehog.js.map +1 -1
  410. package/build/strings/trufflehogConfig.js +36 -0
  411. package/build/strings/trufflehogConfig.js.map +1 -0
  412. package/build/strings/trufflehogDownload.js +115 -0
  413. package/build/strings/trufflehogDownload.js.map +1 -0
  414. package/build/utility/ai.js +33 -4
  415. package/build/utility/ai.js.map +1 -1
  416. package/build/utility/banner.js +4 -3
  417. package/build/utility/banner.js.map +1 -1
  418. package/build/utility/configureSandbox.js +2 -2
  419. package/build/utility/configureSandbox.js.map +1 -1
  420. package/build/utility/downloadProgress.js +99 -0
  421. package/build/utility/downloadProgress.js.map +1 -0
  422. package/build/utility/globals.js +19 -11
  423. package/build/utility/globals.js.map +1 -1
  424. package/build/utility/heap.js +2 -1
  425. package/build/utility/heap.js.map +1 -1
  426. package/build/utility/makeReq.js +490 -257
  427. package/build/utility/makeReq.js.map +1 -1
  428. package/build/utility/openapiGenerator.js +2 -2
  429. package/build/utility/openapiGenerator.js.map +1 -1
  430. package/build/utility/printMsg.js +53 -0
  431. package/build/utility/printMsg.js.map +1 -0
  432. package/build/utility/progressLog.js +68 -7
  433. package/build/utility/progressLog.js.map +1 -1
  434. package/build/utility/resolvePath.js +2 -1
  435. package/build/utility/resolvePath.js.map +1 -1
  436. package/build/utility/ruleVersionMap.js +73 -0
  437. package/build/utility/ruleVersionMap.js.map +1 -0
  438. package/build/utility/targetInputs.js +177 -0
  439. package/build/utility/targetInputs.js.map +1 -0
  440. package/build/utility/urlUtils.js +37 -1
  441. package/build/utility/urlUtils.js.map +1 -1
  442. package/config.dist.yaml +251 -0
  443. package/contributing/testing.md +106 -0
  444. package/eslint.config.js +24 -0
  445. package/package.json +22 -5
  446. package/scripts/exploit-smoke-test.js +82 -0
  447. package/scripts/framework-detect-smoke-test.js +64 -0
  448. package/scripts/postinstall-completion.mjs +40 -0
  449. package/scripts/smoke-test.js +12 -0
  450. package/build/lazyLoad/downloadLoadedJsUtil.js +0 -98
  451. package/build/lazyLoad/downloadLoadedJsUtil.js.map +0 -1
  452. package/build/map/next_js/interactive_helpers/esqueryGen.js.map +0 -1
  453. package/build/map/next_js/interactive_helpers/inputPatch.js.map +0 -1
  454. package/build/map/next_js/interactive_helpers/keybindings.js.map +0 -1
  455. package/build/map/next_js/interactive_helpers/printer.js.map +0 -1
  456. package/build/map/next_js/interactive_helpers/ui.js.map +0 -1
  457. /package/build/map/{next_js/interactive_helpers → interactive-mode}/esqueryGen.js +0 -0
  458. /package/build/map/{next_js/interactive_helpers → interactive-mode}/inputPatch.js +0 -0
  459. /package/build/map/{next_js/interactive_helpers → interactive-mode}/keybindings.js +0 -0
  460. /package/build/map/{next_js/interactive_helpers → interactive-mode}/printer.js +0 -0
  461. /package/build/map/{next_js/interactive_helpers → interactive-mode}/ui.js +0 -0
@@ -1,30 +1,77 @@
1
- import chalk from "chalk";
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
2
10
  import { execSync, spawn } from "child_process";
3
- const isTrufflehogInstalled = () => {
11
+ import inquirer from "inquirer";
12
+ import { printMsg, MSG } from "../utility/printMsg.js";
13
+ import { downloadTrufflehog } from "./trufflehogDownload.js";
14
+ import { isConsentGiven, giveConsent } from "./trufflehogConfig.js";
15
+ const isTrufflehogInstalled = (bin) => {
4
16
  try {
5
- execSync("which trufflehog", { stdio: "pipe" });
17
+ execSync(`which ${bin}`, { stdio: "pipe" });
6
18
  return true;
7
19
  }
8
20
  catch (_a) {
9
21
  return false;
10
22
  }
11
23
  };
24
+ /**
25
+ * Resolves the trufflehog binary to invoke: an explicit `--trufflehog-bin`/PATH binary if
26
+ * present, otherwise auto-downloads from TruffleHog's official GitHub releases after
27
+ * obtaining one-time consent (interactive prompt, or `--trufflehog-accept-terms` for CI).
28
+ */
29
+ const resolveTrufflehogBin = (trufflehogBin, acceptTerms) => __awaiter(void 0, void 0, void 0, function* () {
30
+ if (isTrufflehogInstalled(trufflehogBin)) {
31
+ return trufflehogBin;
32
+ }
33
+ if (!isConsentGiven()) {
34
+ if (acceptTerms) {
35
+ giveConsent();
36
+ }
37
+ else if (process.stdin.isTTY) {
38
+ printMsg(MSG.Header, "[i] --trufflehog was set but the trufflehog binary was not found.");
39
+ printMsg(MSG.Warn, " JS Recon can download it directly from trufflesecurity/trufflehog's official GitHub releases");
40
+ printMsg(MSG.Warn, " and run it as a separate process. TruffleHog is licensed under AGPL-3.0.");
41
+ const { confirmed } = yield inquirer.prompt([
42
+ {
43
+ type: "confirm",
44
+ name: "confirmed",
45
+ message: "Download and run TruffleHog?",
46
+ default: true,
47
+ },
48
+ ]);
49
+ if (!confirmed) {
50
+ printMsg(MSG.Err, "[!] TruffleHog download declined.");
51
+ printMsg(MSG.Warn, " Re-run with --trufflehog-accept-terms, or point --trufflehog-bin at an existing install.");
52
+ process.exit(32);
53
+ }
54
+ giveConsent();
55
+ }
56
+ else {
57
+ printMsg(MSG.Err, "[!] trufflehog not found and terms not accepted.");
58
+ printMsg(MSG.Warn, " Re-run with --trufflehog-accept-terms to allow auto-download in non-interactive contexts,");
59
+ printMsg(MSG.Warn, " or point --trufflehog-bin at an existing install.");
60
+ process.exit(32);
61
+ }
62
+ }
63
+ return downloadTrufflehog(process.env.HOME || "~");
64
+ });
12
65
  const maskSecret = (value) => {
13
66
  if (!value || value.length <= 4)
14
67
  return "****";
15
68
  return value.slice(0, 4) + "****";
16
69
  };
17
- export const runTrufflehog = (directory) => {
70
+ export const runTrufflehog = (directory_1, ...args_1) => __awaiter(void 0, [directory_1, ...args_1], void 0, function* (directory, trufflehogBin = "trufflehog", acceptTerms = false) {
71
+ const resolvedBin = yield resolveTrufflehogBin(trufflehogBin, acceptTerms);
18
72
  return new Promise((resolve) => {
19
- if (!isTrufflehogInstalled()) {
20
- console.error(chalk.red("[!] trufflehog not found in PATH."));
21
- console.error(chalk.yellow(" Install: curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh"));
22
- console.error(chalk.yellow(" Or: brew install trufflehog"));
23
- console.error(chalk.yellow(" Then re-run with --trufflehog."));
24
- process.exit(1);
25
- }
26
- console.log(chalk.cyan("[i] Running TruffleHog on output directory"));
27
- const proc = spawn("trufflehog", ["filesystem", directory, "--json", "--no-update"], {
73
+ printMsg(MSG.Header, "[i] Running TruffleHog on output directory");
74
+ const proc = spawn(resolvedBin, ["filesystem", directory, "--json", "--no-update"], {
28
75
  stdio: ["ignore", "pipe", "pipe"],
29
76
  });
30
77
  let totalFindings = 0;
@@ -42,8 +89,8 @@ export const runTrufflehog = (directory) => {
42
89
  const detector = (_c = (_b = finding.DetectorName) !== null && _b !== void 0 ? _b : finding.detectorName) !== null && _c !== void 0 ? _c : "Unknown";
43
90
  const raw = (_e = (_d = finding.Raw) !== null && _d !== void 0 ? _d : finding.raw) !== null && _e !== void 0 ? _e : "";
44
91
  const file = (_o = (_j = (_h = (_g = (_f = finding.SourceMetadata) === null || _f === void 0 ? void 0 : _f.Data) === null || _g === void 0 ? void 0 : _g.Filesystem) === null || _h === void 0 ? void 0 : _h.file) !== null && _j !== void 0 ? _j : (_m = (_l = (_k = finding.sourceMetadata) === null || _k === void 0 ? void 0 : _k.data) === null || _l === void 0 ? void 0 : _l.filesystem) === null || _m === void 0 ? void 0 : _m.file) !== null && _o !== void 0 ? _o : "unknown file";
45
- console.log(chalk.green(`[✓] [trufflehog] ${detector} found in ${file}`));
46
- console.log(chalk.bgGreen(` → ${maskSecret(raw)}`));
92
+ printMsg(MSG.Run, `[✓] [trufflehog] ${detector} found in ${file}`);
93
+ printMsg(MSG.Run, ` → ${maskSecret(raw)}`);
47
94
  totalFindings++;
48
95
  }
49
96
  catch (_p) {
@@ -54,18 +101,18 @@ export const runTrufflehog = (directory) => {
54
101
  proc.stderr.on("data", (chunk) => {
55
102
  const msg = chunk.toString().trim();
56
103
  if (msg) {
57
- console.error(chalk.yellow(`[trufflehog] ${msg}`));
104
+ printMsg(MSG.Warn, `[trufflehog] ${msg}`);
58
105
  }
59
106
  });
60
107
  proc.on("close", () => {
61
108
  if (totalFindings === 0) {
62
- console.log(chalk.yellow("[!] TruffleHog found no secrets"));
109
+ printMsg(MSG.Warn, "[!] TruffleHog found no secrets");
63
110
  }
64
111
  else {
65
- console.log(chalk.green(`[✓] TruffleHog found ${totalFindings} secrets`));
112
+ printMsg(MSG.Run, `[✓] TruffleHog found ${totalFindings} secrets`);
66
113
  }
67
114
  resolve();
68
115
  });
69
116
  });
70
- };
117
+ });
71
118
  //# sourceMappingURL=trufflehog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trufflehog.js","sourceRoot":"","sources":["../../src/strings/trufflehog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trufflehog.js","sourceRoot":"","sources":["../../src/strings/trufflehog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import YAML from "yaml";
4
+ const DEFAULT_CONFIG = {
5
+ terms_accepted: false,
6
+ };
7
+ const CONFIG_DIR = path.join(process.env.HOME || "~", ".js-recon");
8
+ const CONFIG_FILE = path.join(CONFIG_DIR, "trufflehog.yaml");
9
+ const ensureConfigDir = () => {
10
+ if (!fs.existsSync(CONFIG_DIR)) {
11
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
12
+ }
13
+ };
14
+ const loadConfig = () => {
15
+ ensureConfigDir();
16
+ if (!fs.existsSync(CONFIG_FILE)) {
17
+ return Object.assign({}, DEFAULT_CONFIG);
18
+ }
19
+ try {
20
+ const raw = fs.readFileSync(CONFIG_FILE, "utf-8");
21
+ const parsed = YAML.parse(raw);
22
+ return Object.assign(Object.assign({}, DEFAULT_CONFIG), parsed);
23
+ }
24
+ catch (_a) {
25
+ return Object.assign({}, DEFAULT_CONFIG);
26
+ }
27
+ };
28
+ const saveConfig = (config) => {
29
+ ensureConfigDir();
30
+ fs.writeFileSync(CONFIG_FILE, YAML.stringify(config), "utf-8");
31
+ };
32
+ export const isConsentGiven = () => loadConfig().terms_accepted;
33
+ export const giveConsent = () => {
34
+ saveConfig(Object.assign(Object.assign({}, loadConfig()), { terms_accepted: true }));
35
+ };
36
+ //# sourceMappingURL=trufflehogConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trufflehogConfig.js","sourceRoot":"","sources":["../../src/strings/trufflehogConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,MAAM,CAAC;AAMxB,MAAM,cAAc,GAAqB;IACrC,cAAc,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,CAAC,CAAC;AACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAE7D,MAAM,eAAe,GAAG,GAAS,EAAE;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,GAAqB,EAAE;IACtC,eAAe,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,yBAAY,cAAc,EAAG;IACjC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8B,CAAC;QAC5D,uCAAY,cAAc,GAAK,MAAM,EAAG;IAC5C,CAAC;IAAC,WAAM,CAAC;QACL,yBAAY,cAAc,EAAG;IACjC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAwB,EAAQ,EAAE;IAClD,eAAe,EAAE,CAAC;IAClB,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAY,EAAE,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC;AAEzE,MAAM,CAAC,MAAM,WAAW,GAAG,GAAS,EAAE;IAClC,UAAU,iCAAM,UAAU,EAAE,KAAE,cAAc,EAAE,IAAI,IAAG,CAAC;AAC1D,CAAC,CAAC"}
@@ -0,0 +1,115 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import fs from "fs";
11
+ import path from "path";
12
+ import * as tar from "tar";
13
+ import { withActiveProxyDispatcher } from "../utility/makeReq.js";
14
+ import { printMsg, MSG } from "../utility/printMsg.js";
15
+ const TRUFFLEHOG_RELEASE_URL = "https://api.github.com/repos/trufflesecurity/trufflehog/releases/latest";
16
+ /**
17
+ * Maps Node's platform/arch identifiers to TruffleHog's GitHub release asset naming
18
+ * (e.g. `trufflehog_3.96.0_darwin_amd64.tar.gz`).
19
+ *
20
+ * @param platform - `process.platform` value
21
+ * @param arch - `process.arch` value
22
+ * @returns The `<os>_<arch>` fragment used in TruffleHog's release asset names
23
+ */
24
+ export const resolveAssetName = (platform, arch) => {
25
+ const osMap = {
26
+ darwin: "darwin",
27
+ linux: "linux",
28
+ win32: "windows",
29
+ };
30
+ const archMap = {
31
+ x64: "amd64",
32
+ arm64: "arm64",
33
+ };
34
+ const os = osMap[platform];
35
+ const mappedArch = archMap[arch];
36
+ if (!os || !mappedArch) {
37
+ throw new Error(`Unsupported platform/arch for TruffleHog auto-download: ${platform}/${arch}`);
38
+ }
39
+ return `${os}_${mappedArch}`;
40
+ };
41
+ const fetchLatestTrufflehogRelease = (options) => __awaiter(void 0, void 0, void 0, function* () {
42
+ const response = yield fetch(TRUFFLEHOG_RELEASE_URL, options);
43
+ if (!response.ok) {
44
+ throw new Error(`TruffleHog release lookup failed with HTTP ${response.status}`);
45
+ }
46
+ const release = (yield response.json());
47
+ if (typeof release !== "object" || release === null) {
48
+ throw new Error("TruffleHog release response was not an object");
49
+ }
50
+ const { tag_name: tagName, assets } = release;
51
+ if (typeof tagName !== "string" || !Array.isArray(assets)) {
52
+ throw new Error("TruffleHog release response is missing tag_name or assets");
53
+ }
54
+ const assetSuffix = resolveAssetName(process.platform, process.arch);
55
+ const asset = assets.find((a) => typeof a === "object" &&
56
+ a !== null &&
57
+ typeof a.name === "string" &&
58
+ a.name.includes(assetSuffix) &&
59
+ a.name.endsWith(".tar.gz"));
60
+ if (!asset || typeof asset.browser_download_url !== "string") {
61
+ throw new Error(`No TruffleHog release asset found for platform/arch "${assetSuffix}"`);
62
+ }
63
+ const parsedUrl = new URL(asset.browser_download_url);
64
+ if (parsedUrl.protocol !== "https:" ||
65
+ !["github.com", "objects.githubusercontent.com"].includes(parsedUrl.hostname)) {
66
+ throw new Error("TruffleHog release response contains an unexpected download URL");
67
+ }
68
+ return Object.freeze({ tagName, downloadUrl: parsedUrl.toString() });
69
+ });
70
+ /**
71
+ * Downloads and caches the TruffleHog binary from its official GitHub releases.
72
+ *
73
+ * Fetches the latest release directly from `trufflesecurity/trufflehog` and extracts the
74
+ * platform-matching binary under `~/.js-recon/trufflehog/<version>/`. JS Recon never mirrors
75
+ * or hosts its own copy of the binary — every download resolves the asset URL from GitHub's
76
+ * release API at request time.
77
+ *
78
+ * @param homeDir - The user's home directory path
79
+ * @returns Absolute path to the cached (or freshly downloaded) trufflehog binary
80
+ */
81
+ export const downloadTrufflehog = (homeDir) => __awaiter(void 0, void 0, void 0, function* () {
82
+ const trufflehogRoot = path.join(homeDir, ".js-recon", "trufflehog");
83
+ const binName = process.platform === "win32" ? "trufflehog.exe" : "trufflehog";
84
+ if (fs.existsSync(trufflehogRoot)) {
85
+ const cachedVersionDirs = fs.readdirSync(trufflehogRoot);
86
+ for (const versionDir of cachedVersionDirs) {
87
+ const cachedBin = path.join(trufflehogRoot, versionDir, binName);
88
+ if (fs.existsSync(cachedBin)) {
89
+ return cachedBin;
90
+ }
91
+ }
92
+ }
93
+ printMsg(MSG.Header, "[i] TruffleHog not found. Downloading from GitHub...");
94
+ const buffer = yield withActiveProxyDispatcher((options) => __awaiter(void 0, void 0, void 0, function* () {
95
+ const release = yield fetchLatestTrufflehogRelease(options);
96
+ const downloadResponse = yield fetch(release.downloadUrl, options);
97
+ if (!downloadResponse.ok) {
98
+ throw new Error(`Failed to download TruffleHog: ${downloadResponse.statusText}`);
99
+ }
100
+ return { buffer: Buffer.from(yield downloadResponse.arrayBuffer()), tagName: release.tagName };
101
+ }));
102
+ const version = buffer.tagName.replace(/^v/, "");
103
+ const extractPath = path.join(trufflehogRoot, version);
104
+ fs.mkdirSync(extractPath, { recursive: true });
105
+ const tarPath = path.join(extractPath, "trufflehog.tar.gz");
106
+ fs.writeFileSync(tarPath, buffer.buffer);
107
+ printMsg(MSG.Header, "[i] Extracting TruffleHog...");
108
+ yield tar.x({ file: tarPath, cwd: extractPath });
109
+ fs.unlinkSync(tarPath);
110
+ const binPath = path.join(extractPath, binName);
111
+ fs.chmodSync(binPath, 0o755);
112
+ printMsg(MSG.Run, "[✓] TruffleHog downloaded successfully.");
113
+ return binPath;
114
+ });
115
+ //# sourceMappingURL=trufflehogDownload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trufflehogDownload.js","sourceRoot":"","sources":["../../src/strings/trufflehogDownload.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import OpenAI from "openai";
11
11
  import { Ollama } from "ollama";
12
+ import Anthropic from "@anthropic-ai/sdk";
12
13
  import * as globals from "./globals.js";
13
14
  /**
14
15
  * OpenAI client instance.
@@ -16,11 +17,11 @@ import * as globals from "./globals.js";
16
17
  * @remarks
17
18
  * This client is used to communicate with the OpenAI API.
18
19
  * The base URL and API key are configurable via the
19
- * `setAiEndpoint` and `setOpenaiApiKey` functions.
20
+ * `setAiEndpoint` and `setAiApiKey` functions.
20
21
  */
21
22
  const openai_client = new OpenAI({
22
23
  baseURL: globals.getAiEndpoint() || "https://api.openai.com/v1",
23
- apiKey: globals.getOpenaiApiKey(),
24
+ apiKey: globals.getAiApiKey(),
24
25
  });
25
26
  /**
26
27
  * Ollama client instance.
@@ -32,6 +33,16 @@ const openai_client = new OpenAI({
32
33
  const ollama_client = new Ollama({
33
34
  host: globals.getAiEndpoint() || "http://127.0.0.1:11434",
34
35
  });
36
+ /**
37
+ * Anthropic client instance.
38
+ *
39
+ * @remarks
40
+ * This client is used to communicate with the Anthropic Messages API.
41
+ * The API key is configurable via the `setAiApiKey` function.
42
+ */
43
+ const anthropic_client = new Anthropic({
44
+ apiKey: globals.getAiApiKey(),
45
+ });
35
46
  /**
36
47
  * Returns an AI client instance based on the configured provider.
37
48
  *
@@ -46,6 +57,9 @@ const ai = () => __awaiter(void 0, void 0, void 0, function* () {
46
57
  if (provider === "ollama") {
47
58
  return { client: ollama_client, model };
48
59
  }
60
+ if (provider === "anthropic") {
61
+ return { client: anthropic_client, model };
62
+ }
49
63
  throw new Error(`AI service provider "${provider}" is not supported or configured.`);
50
64
  });
51
65
  /**
@@ -64,7 +78,7 @@ function getCompletion(prompt_1) {
64
78
  throw new Error(`AI service provider "${provider}" is not supported or configured.`);
65
79
  }
66
80
  if (provider === "openai") {
67
- // @ts-ignore
81
+ // @ts-expect-error -- openai SDK types don't yet cover the Responses API shape used here
68
82
  const completion = yield client.responses.create({
69
83
  input: [
70
84
  { role: "system", content: systemPrompt },
@@ -91,7 +105,22 @@ function getCompletion(prompt_1) {
91
105
  });
92
106
  return response.message.content || "none";
93
107
  }
108
+ if (provider === "anthropic") {
109
+ // @ts-expect-error -- openai SDK types don't yet cover the Responses API shape used here
110
+ const response = yield client.messages.create({
111
+ model: model || "claude-haiku-4-5-20251001",
112
+ max_tokens: 4096,
113
+ system: systemPrompt,
114
+ messages: [{ role: "user", content: prompt }],
115
+ temperature: 0.1,
116
+ });
117
+ const text = response.content
118
+ .filter((block) => block.type === "text")
119
+ .map((block) => block.text)
120
+ .join("");
121
+ return text || "none";
122
+ }
94
123
  });
95
124
  }
96
- export { ai, openai_client, ollama_client, getCompletion };
125
+ export { ai, openai_client, ollama_client, anthropic_client, getCompletion };
97
126
  //# sourceMappingURL=ai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/utility/ai.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,2BAA2B;IAC/D,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE;CACpC,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,wBAAwB;CAC5D,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,EAAE,GAAG,GAA8D,EAAE;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAEhD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,mCAAmC,CAAC,CAAC;AACzF,CAAC,CAAA,CAAC;AAEF;;;;;;GAMG;AACH,SAAe,aAAa;yDAAC,MAAM,EAAE,YAAY,GAAG,8BAA8B;;QAC9E,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,mCAAmC,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxB,aAAa;YACb,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC7C,KAAK,EAAE;oBACH,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;oBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;iBACpC;gBACD,KAAK,EAAE,KAAK,IAAI,aAAa;gBAC7B,WAAW,EAAE,GAAG;aACnB,CAAC,CAAC;YACH,OAAO,CAAA,MAAA,MAAA,MAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAG,CAAC,CAAC,0CAAE,OAAO,0CAAG,CAAC,CAAC,0CAAE,IAAI,KAAI,MAAM,CAAC;QACjE,CAAC;QAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;gBACtC,KAAK,EAAE,KAAK,IAAI,UAAU;gBAC1B,QAAQ,EAAE;oBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;oBACzC;wBACI,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,MAAM;qBAClB;iBACJ;gBACD,OAAO,EAAE;oBACL,WAAW,EAAE,GAAG;iBACnB;aACJ,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;QAC9C,CAAC;IACL,CAAC;CAAA;AAED,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/utility/ai.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ import path from "path";
14
14
  import https from "https";
15
15
  import os from "os";
16
16
  import CONFIG from "../globalConfig.js";
17
+ import { printMsg, MSG } from "./printMsg.js";
17
18
  const LOGO_URL = "https://js-recon.io/img/js-recon-logo.png";
18
19
  const CACHE_DIR = path.join(os.homedir(), ".js-recon");
19
20
  const LOGO_CACHE = path.join(CACHE_DIR, "logo.png");
@@ -60,9 +61,9 @@ export function printBanner() {
60
61
  const name = chalk.bold.hex("#00d4ff")("JS Recon");
61
62
  const version = chalk.dim(`v${CONFIG.version}`);
62
63
  const tagline = chalk.hex("#888888")(CONFIG.toolDesc);
63
- console.log(` ${name} ${version}`);
64
- console.log(` ${tagline}`);
65
- console.log();
64
+ printMsg(MSG.Plain, ` ${name} ${version}`);
65
+ printMsg(MSG.Plain, ` ${tagline}`);
66
+ printMsg(MSG.Plain, "");
66
67
  });
67
68
  }
68
69
  //# sourceMappingURL=banner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utility/banner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utility/banner.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import chalk from "chalk";
2
1
  import * as globalsUtil from "./globals.js";
2
+ import { printMsg, MSG } from "./printMsg.js";
3
3
  /**
4
4
  * Configures the browser sandbox based on command-line flags and environment variables.
5
5
  * @param cmd - The commander command object.
@@ -7,7 +7,7 @@ import * as globalsUtil from "./globals.js";
7
7
  const configureSandbox = (cmd) => {
8
8
  if (process.env.IS_DOCKER === "true" || cmd.sandbox === false) {
9
9
  globalsUtil.setDisableSandbox(true);
10
- console.error(chalk.yellow(`[!] Disabling browser sandbox`));
10
+ printMsg(MSG.Warn, `[!] Disabling browser sandbox`);
11
11
  }
12
12
  };
13
13
  export default configureSandbox;
@@ -1 +1 @@
1
- {"version":3,"file":"configureSandbox.js","sourceRoot":"","sources":["../../src/utility/configureSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,EAAE;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5D,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACjE,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"configureSandbox.js","sourceRoot":"","sources":["../../src/utility/configureSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAE9C;;;GAGG;AACH,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,EAAE;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5D,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,99 @@
1
+ import chalk from "chalk";
2
+ import cliProgress from "cli-progress";
3
+ import { activateBarLogger, cleanupProgressResources, computeBarSize, watchBarResize } from "./progressLog.js";
4
+ const FORMAT_OVERHEAD = 91;
5
+ const renderBar = (progress, size) => {
6
+ const completeSize = Math.round(progress * size);
7
+ return "█".repeat(completeSize) + "░".repeat(size - completeSize);
8
+ };
9
+ export const formatDownloadProgress = (_options, params, payload) => {
10
+ const maxWidth = Math.max(1, params.maxWidth || 80);
11
+ // Avoid the terminal's final column: writing into it can trigger an
12
+ // automatic wrap and leave a stray blank line below the progress bar.
13
+ const renderWidth = Math.max(1, maxWidth - 1);
14
+ const percentage = Math.floor(params.progress * 100);
15
+ const label = "[i] Downloading chunks ";
16
+ const details = `${percentage}% | ${params.value}/${params.total} | ${payload.downloaded} saved | ${payload.failed} failed | ${payload.ignored} skipped`;
17
+ const barSize = renderWidth - label.length - details.length - 3;
18
+ if (barSize >= 8) {
19
+ return `${chalk.cyan(label)}[${renderBar(params.progress, barSize)}] ${details}`;
20
+ }
21
+ const compactLabel = "[i] Chunks ";
22
+ const compactDetails = `${params.value}/${params.total} | +${payload.downloaded} !${payload.failed} -${payload.ignored}`;
23
+ const compact = `${chalk.cyan(compactLabel)}${compactDetails}`;
24
+ if (compactLabel.length + compactDetails.length <= renderWidth)
25
+ return compact;
26
+ const minimal = `${params.value}/${params.total} +${payload.downloaded} !${payload.failed}`;
27
+ return minimal.slice(0, renderWidth);
28
+ };
29
+ const payloadFor = (progress) => ({
30
+ downloaded: progress.downloaded,
31
+ failed: progress.failed,
32
+ ignored: progress.ignored,
33
+ });
34
+ export const createDownloadProgressOptions = () => ({
35
+ format: formatDownloadProgress,
36
+ barsize: computeBarSize(FORMAT_OVERHEAD),
37
+ hideCursor: false,
38
+ clearOnComplete: true,
39
+ stopOnComplete: false,
40
+ forceRedraw: true,
41
+ // The formatter already budgets visible width. cli-progress's linewrap
42
+ // mode truncates raw strings and therefore mistakes ANSI bytes for columns.
43
+ linewrap: false,
44
+ stream: process.stdout,
45
+ });
46
+ const createDefaultMultiBar = () => new cliProgress.MultiBar(createDownloadProgressOptions(), cliProgress.Presets.shades_classic);
47
+ /** TTY-only renderer for the aggregate state emitted by DownloadQueue. */
48
+ export class DownloadProgress {
49
+ constructor(options = {}) {
50
+ var _a, _b, _c;
51
+ this.multiBar = null;
52
+ this.bar = null;
53
+ this.stopResize = null;
54
+ this.releaseLogger = null;
55
+ this.total = 0;
56
+ this.disabled = false;
57
+ this.isTTY = (_a = options.isTTY) !== null && _a !== void 0 ? _a : Boolean(process.stdout.isTTY);
58
+ this.createMultiBar = (_b = options.createMultiBar) !== null && _b !== void 0 ? _b : createDefaultMultiBar;
59
+ this.resizeWatcher = (_c = options.watchResize) !== null && _c !== void 0 ? _c : watchBarResize;
60
+ }
61
+ update(progress) {
62
+ if (!this.isTTY || this.disabled || progress.total === 0)
63
+ return;
64
+ try {
65
+ if (!this.bar) {
66
+ this.multiBar = this.createMultiBar();
67
+ this.bar = this.multiBar.create(progress.total, progress.processed, payloadFor(progress));
68
+ this.total = progress.total;
69
+ this.stopResize = this.resizeWatcher(this.bar, FORMAT_OVERHEAD);
70
+ this.releaseLogger = activateBarLogger(this.multiBar);
71
+ return;
72
+ }
73
+ if (progress.total !== this.total) {
74
+ this.bar.setTotal(progress.total);
75
+ this.total = progress.total;
76
+ }
77
+ this.bar.update(progress.processed, payloadFor(progress));
78
+ }
79
+ catch (_a) {
80
+ // Rendering is observational and must never interrupt downloads.
81
+ this.disabled = true;
82
+ this.stop();
83
+ }
84
+ }
85
+ stop() {
86
+ const multiBar = this.multiBar;
87
+ if (!multiBar)
88
+ return;
89
+ const stopResize = this.stopResize;
90
+ const releaseLogger = this.releaseLogger;
91
+ this.multiBar = null;
92
+ this.bar = null;
93
+ this.stopResize = null;
94
+ this.releaseLogger = null;
95
+ cleanupProgressResources(() => stopResize === null || stopResize === void 0 ? void 0 : stopResize(), () => { var _a; return (_a = multiBar.update) === null || _a === void 0 ? void 0 : _a.call(multiBar); }, () => multiBar.stop(), () => releaseLogger === null || releaseLogger === void 0 ? void 0 : releaseLogger());
96
+ }
97
+ }
98
+ export default DownloadProgress;
99
+ //# sourceMappingURL=downloadProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloadProgress.js","sourceRoot":"","sources":["../../src/utility/downloadProgress.ts"],"names":[],"mappings":"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"}
@@ -208,11 +208,11 @@ export const getRequestTimeout = () => {
208
208
  // AI Configuration
209
209
  /** Array of AI analysis options */
210
210
  export let ai = [];
211
- /** OpenAI API key */
212
- export let openaiApiKey = "";
211
+ /** API key for the configured AI provider */
212
+ export let aiApiKey = "";
213
213
  /** AI model to use for analysis */
214
214
  export let aiModel = "gpt-4o-mini";
215
- /** AI service provider (openai, ollama, etc.) */
215
+ /** AI service provider (openai, ollama, anthropic, etc.) */
216
216
  export let aiServiceProvider = "openai";
217
217
  /** Number of AI analysis threads */
218
218
  export let aiThreads = 5;
@@ -226,11 +226,11 @@ export const setAi = (value) => {
226
226
  ai = value;
227
227
  };
228
228
  /**
229
- * Sets the OpenAI API key.
230
- * @param value - OpenAI API key
229
+ * Sets the API key for the configured AI provider.
230
+ * @param value - AI provider API key
231
231
  */
232
- export const setOpenaiApiKey = (value) => {
233
- openaiApiKey = value;
232
+ export const setAiApiKey = (value) => {
233
+ aiApiKey = value;
234
234
  };
235
235
  /**
236
236
  * Gets the current AI analysis options.
@@ -240,11 +240,11 @@ export const getAi = () => {
240
240
  return ai;
241
241
  };
242
242
  /**
243
- * Gets the OpenAI API key.
244
- * @returns OpenAI API key
243
+ * Gets the API key for the configured AI provider.
244
+ * @returns AI provider API key
245
245
  */
246
- export const getOpenaiApiKey = () => {
247
- return openaiApiKey;
246
+ export const getAiApiKey = () => {
247
+ return aiApiKey;
248
248
  };
249
249
  /**
250
250
  * Gets the current AI model.
@@ -310,6 +310,14 @@ export const setQuiet = (value) => {
310
310
  export const getQuiet = () => {
311
311
  return quiet;
312
312
  };
313
+ // Verbose mode — shows detailed file write error messages
314
+ export let verbose = false;
315
+ export const setVerbose = (value) => {
316
+ verbose = value;
317
+ };
318
+ export const getVerbose = () => {
319
+ return verbose;
320
+ };
313
321
  // Technology Detection
314
322
  /** Detected technology stack */
315
323
  export let tech = "";