@vyuhlabs/dxkit 2.4.6 → 2.4.8

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 (357) hide show
  1. package/CHANGELOG.md +1076 -0
  2. package/README.md +132 -27
  3. package/dist/analysis-result.d.ts +112 -0
  4. package/dist/analysis-result.d.ts.map +1 -0
  5. package/dist/analysis-result.js +52 -0
  6. package/dist/analysis-result.js.map +1 -0
  7. package/dist/analyzers/bom/detailed.d.ts.map +1 -1
  8. package/dist/analyzers/bom/detailed.js +19 -0
  9. package/dist/analyzers/bom/detailed.js.map +1 -1
  10. package/dist/analyzers/bom/gather.d.ts +27 -26
  11. package/dist/analyzers/bom/gather.d.ts.map +1 -1
  12. package/dist/analyzers/bom/gather.js +26 -87
  13. package/dist/analyzers/bom/gather.js.map +1 -1
  14. package/dist/analyzers/bom/index.d.ts +0 -7
  15. package/dist/analyzers/bom/index.d.ts.map +1 -1
  16. package/dist/analyzers/bom/index.js +98 -48
  17. package/dist/analyzers/bom/index.js.map +1 -1
  18. package/dist/analyzers/bom/types.d.ts +11 -13
  19. package/dist/analyzers/bom/types.d.ts.map +1 -1
  20. package/dist/analyzers/cache.d.ts +95 -0
  21. package/dist/analyzers/cache.d.ts.map +1 -0
  22. package/dist/analyzers/cache.js +309 -0
  23. package/dist/analyzers/cache.js.map +1 -0
  24. package/dist/analyzers/coverage-runner.d.ts +56 -0
  25. package/dist/analyzers/coverage-runner.d.ts.map +1 -0
  26. package/dist/analyzers/coverage-runner.js +72 -0
  27. package/dist/analyzers/coverage-runner.js.map +1 -0
  28. package/dist/analyzers/dashboard/index.d.ts +24 -0
  29. package/dist/analyzers/dashboard/index.d.ts.map +1 -0
  30. package/dist/analyzers/dashboard/index.js +667 -0
  31. package/dist/analyzers/dashboard/index.js.map +1 -0
  32. package/dist/analyzers/developer/gather.d.ts.map +1 -1
  33. package/dist/analyzers/developer/gather.js +205 -37
  34. package/dist/analyzers/developer/gather.js.map +1 -1
  35. package/dist/analyzers/developer/index.d.ts +1 -1
  36. package/dist/analyzers/developer/index.d.ts.map +1 -1
  37. package/dist/analyzers/developer/index.js +21 -9
  38. package/dist/analyzers/developer/index.js.map +1 -1
  39. package/dist/analyzers/dispatcher.d.ts +52 -0
  40. package/dist/analyzers/dispatcher.d.ts.map +1 -1
  41. package/dist/analyzers/dispatcher.js +92 -9
  42. package/dist/analyzers/dispatcher.js.map +1 -1
  43. package/dist/analyzers/docs/shallow.d.ts +17 -5
  44. package/dist/analyzers/docs/shallow.d.ts.map +1 -1
  45. package/dist/analyzers/docs/shallow.js +65 -2
  46. package/dist/analyzers/docs/shallow.js.map +1 -1
  47. package/dist/analyzers/dx/shallow.d.ts +17 -5
  48. package/dist/analyzers/dx/shallow.d.ts.map +1 -1
  49. package/dist/analyzers/dx/shallow.js +66 -2
  50. package/dist/analyzers/dx/shallow.js.map +1 -1
  51. package/dist/analyzers/health/actions.d.ts +1 -1
  52. package/dist/analyzers/health/actions.d.ts.map +1 -1
  53. package/dist/analyzers/health/actions.js +27 -9
  54. package/dist/analyzers/health/actions.js.map +1 -1
  55. package/dist/analyzers/health/detailed.d.ts +2 -1
  56. package/dist/analyzers/health/detailed.d.ts.map +1 -1
  57. package/dist/analyzers/health/detailed.js +11 -7
  58. package/dist/analyzers/health/detailed.js.map +1 -1
  59. package/dist/analyzers/health.d.ts +27 -0
  60. package/dist/analyzers/health.d.ts.map +1 -1
  61. package/dist/analyzers/health.js +282 -34
  62. package/dist/analyzers/health.js.map +1 -1
  63. package/dist/analyzers/licenses/gather.d.ts +35 -8
  64. package/dist/analyzers/licenses/gather.d.ts.map +1 -1
  65. package/dist/analyzers/licenses/gather.js +86 -13
  66. package/dist/analyzers/licenses/gather.js.map +1 -1
  67. package/dist/analyzers/licenses/index.d.ts +1 -1
  68. package/dist/analyzers/licenses/index.d.ts.map +1 -1
  69. package/dist/analyzers/licenses/index.js +52 -11
  70. package/dist/analyzers/licenses/index.js.map +1 -1
  71. package/dist/analyzers/licenses/types.d.ts +15 -0
  72. package/dist/analyzers/licenses/types.d.ts.map +1 -1
  73. package/dist/analyzers/maintainability/shallow.d.ts +17 -5
  74. package/dist/analyzers/maintainability/shallow.d.ts.map +1 -1
  75. package/dist/analyzers/maintainability/shallow.js +80 -2
  76. package/dist/analyzers/maintainability/shallow.js.map +1 -1
  77. package/dist/analyzers/quality/detailed.d.ts.map +1 -1
  78. package/dist/analyzers/quality/detailed.js +4 -6
  79. package/dist/analyzers/quality/detailed.js.map +1 -1
  80. package/dist/analyzers/quality/gather.d.ts +1 -14
  81. package/dist/analyzers/quality/gather.d.ts.map +1 -1
  82. package/dist/analyzers/quality/gather.js +48 -137
  83. package/dist/analyzers/quality/gather.js.map +1 -1
  84. package/dist/analyzers/quality/index.d.ts +9 -2
  85. package/dist/analyzers/quality/index.d.ts.map +1 -1
  86. package/dist/analyzers/quality/index.js +197 -117
  87. package/dist/analyzers/quality/index.js.map +1 -1
  88. package/dist/analyzers/quality/shallow.d.ts +50 -5
  89. package/dist/analyzers/quality/shallow.d.ts.map +1 -1
  90. package/dist/analyzers/quality/shallow.js +155 -2
  91. package/dist/analyzers/quality/shallow.js.map +1 -1
  92. package/dist/analyzers/quality/types.d.ts +14 -0
  93. package/dist/analyzers/quality/types.d.ts.map +1 -1
  94. package/dist/analyzers/security/actions.d.ts +11 -4
  95. package/dist/analyzers/security/actions.d.ts.map +1 -1
  96. package/dist/analyzers/security/actions.js +87 -37
  97. package/dist/analyzers/security/actions.js.map +1 -1
  98. package/dist/analyzers/security/aggregator.d.ts +236 -0
  99. package/dist/analyzers/security/aggregator.d.ts.map +1 -0
  100. package/dist/analyzers/security/aggregator.js +349 -0
  101. package/dist/analyzers/security/aggregator.js.map +1 -0
  102. package/dist/analyzers/security/detailed.d.ts +2 -2
  103. package/dist/analyzers/security/detailed.d.ts.map +1 -1
  104. package/dist/analyzers/security/detailed.js +10 -9
  105. package/dist/analyzers/security/detailed.js.map +1 -1
  106. package/dist/analyzers/security/gather.d.ts +104 -1
  107. package/dist/analyzers/security/gather.d.ts.map +1 -1
  108. package/dist/analyzers/security/gather.js +299 -9
  109. package/dist/analyzers/security/gather.js.map +1 -1
  110. package/dist/analyzers/security/index.d.ts +15 -0
  111. package/dist/analyzers/security/index.d.ts.map +1 -1
  112. package/dist/analyzers/security/index.js +463 -50
  113. package/dist/analyzers/security/index.js.map +1 -1
  114. package/dist/analyzers/security/shallow.d.ts +50 -6
  115. package/dist/analyzers/security/shallow.d.ts.map +1 -1
  116. package/dist/analyzers/security/shallow.js +154 -2
  117. package/dist/analyzers/security/shallow.js.map +1 -1
  118. package/dist/analyzers/security/types.d.ts +51 -0
  119. package/dist/analyzers/security/types.d.ts.map +1 -1
  120. package/dist/analyzers/tests/detailed.d.ts.map +1 -1
  121. package/dist/analyzers/tests/detailed.js +2 -3
  122. package/dist/analyzers/tests/detailed.js.map +1 -1
  123. package/dist/analyzers/tests/gather.d.ts +2 -1
  124. package/dist/analyzers/tests/gather.d.ts.map +1 -1
  125. package/dist/analyzers/tests/gather.js +98 -69
  126. package/dist/analyzers/tests/gather.js.map +1 -1
  127. package/dist/analyzers/tests/index.d.ts +11 -2
  128. package/dist/analyzers/tests/index.d.ts.map +1 -1
  129. package/dist/analyzers/tests/index.js +83 -18
  130. package/dist/analyzers/tests/index.js.map +1 -1
  131. package/dist/analyzers/tests/shallow.d.ts +19 -5
  132. package/dist/analyzers/tests/shallow.d.ts.map +1 -1
  133. package/dist/analyzers/tests/shallow.js +89 -2
  134. package/dist/analyzers/tests/shallow.js.map +1 -1
  135. package/dist/analyzers/tests/types.d.ts +41 -1
  136. package/dist/analyzers/tests/types.d.ts.map +1 -1
  137. package/dist/analyzers/tools/autogen-header.d.ts +8 -0
  138. package/dist/analyzers/tools/autogen-header.d.ts.map +1 -0
  139. package/dist/analyzers/tools/autogen-header.js +107 -0
  140. package/dist/analyzers/tools/autogen-header.js.map +1 -0
  141. package/dist/analyzers/tools/cloc.d.ts.map +1 -1
  142. package/dist/analyzers/tools/cloc.js +36 -5
  143. package/dist/analyzers/tools/cloc.js.map +1 -1
  144. package/dist/analyzers/tools/deadline.d.ts +67 -0
  145. package/dist/analyzers/tools/deadline.d.ts.map +1 -0
  146. package/dist/analyzers/tools/deadline.js +81 -0
  147. package/dist/analyzers/tools/deadline.js.map +1 -0
  148. package/dist/analyzers/tools/debug-statements.d.ts +17 -0
  149. package/dist/analyzers/tools/debug-statements.d.ts.map +1 -0
  150. package/dist/analyzers/tools/debug-statements.js +58 -0
  151. package/dist/analyzers/tools/debug-statements.js.map +1 -0
  152. package/dist/analyzers/tools/default-exclusions.gitignore +28 -0
  153. package/dist/analyzers/tools/exclusions.d.ts +33 -6
  154. package/dist/analyzers/tools/exclusions.d.ts.map +1 -1
  155. package/dist/analyzers/tools/exclusions.js +95 -26
  156. package/dist/analyzers/tools/exclusions.js.map +1 -1
  157. package/dist/analyzers/tools/generic.d.ts +17 -2
  158. package/dist/analyzers/tools/generic.d.ts.map +1 -1
  159. package/dist/analyzers/tools/generic.js +206 -109
  160. package/dist/analyzers/tools/generic.js.map +1 -1
  161. package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
  162. package/dist/analyzers/tools/gitleaks.js +48 -1
  163. package/dist/analyzers/tools/gitleaks.js.map +1 -1
  164. package/dist/analyzers/tools/graphify.d.ts +30 -2
  165. package/dist/analyzers/tools/graphify.d.ts.map +1 -1
  166. package/dist/analyzers/tools/graphify.js +131 -15
  167. package/dist/analyzers/tools/graphify.js.map +1 -1
  168. package/dist/analyzers/tools/jscpd.d.ts +12 -2
  169. package/dist/analyzers/tools/jscpd.d.ts.map +1 -1
  170. package/dist/analyzers/tools/jscpd.js +129 -6
  171. package/dist/analyzers/tools/jscpd.js.map +1 -1
  172. package/dist/analyzers/tools/lint-label.d.ts +29 -0
  173. package/dist/analyzers/tools/lint-label.d.ts.map +1 -0
  174. package/dist/analyzers/tools/lint-label.js +23 -0
  175. package/dist/analyzers/tools/lint-label.js.map +1 -0
  176. package/dist/analyzers/tools/minified-detection.d.ts +9 -0
  177. package/dist/analyzers/tools/minified-detection.d.ts.map +1 -0
  178. package/dist/analyzers/tools/minified-detection.js +147 -0
  179. package/dist/analyzers/tools/minified-detection.js.map +1 -0
  180. package/dist/analyzers/tools/nuget-package-reference.d.ts +133 -0
  181. package/dist/analyzers/tools/nuget-package-reference.d.ts.map +1 -0
  182. package/dist/analyzers/tools/nuget-package-reference.js +177 -0
  183. package/dist/analyzers/tools/nuget-package-reference.js.map +1 -0
  184. package/dist/analyzers/tools/osv-scanner-deps.d.ts +3 -2
  185. package/dist/analyzers/tools/osv-scanner-deps.d.ts.map +1 -1
  186. package/dist/analyzers/tools/osv-scanner-deps.js +32 -14
  187. package/dist/analyzers/tools/osv-scanner-deps.js.map +1 -1
  188. package/dist/analyzers/tools/osv.d.ts +36 -0
  189. package/dist/analyzers/tools/osv.d.ts.map +1 -1
  190. package/dist/analyzers/tools/osv.js +26 -0
  191. package/dist/analyzers/tools/osv.js.map +1 -1
  192. package/dist/analyzers/tools/parallel.d.ts +1 -1
  193. package/dist/analyzers/tools/parallel.d.ts.map +1 -1
  194. package/dist/analyzers/tools/parallel.js +2 -2
  195. package/dist/analyzers/tools/parallel.js.map +1 -1
  196. package/dist/analyzers/tools/report-date.d.ts +17 -0
  197. package/dist/analyzers/tools/report-date.d.ts.map +1 -0
  198. package/dist/analyzers/tools/report-date.js +26 -0
  199. package/dist/analyzers/tools/report-date.js.map +1 -0
  200. package/dist/analyzers/tools/risk-score.d.ts +7 -0
  201. package/dist/analyzers/tools/risk-score.d.ts.map +1 -1
  202. package/dist/analyzers/tools/risk-score.js +9 -2
  203. package/dist/analyzers/tools/risk-score.js.map +1 -1
  204. package/dist/analyzers/tools/run-tests-helper.d.ts +43 -0
  205. package/dist/analyzers/tools/run-tests-helper.d.ts.map +1 -0
  206. package/dist/analyzers/tools/run-tests-helper.js +156 -0
  207. package/dist/analyzers/tools/run-tests-helper.js.map +1 -0
  208. package/dist/analyzers/tools/runner.d.ts.map +1 -1
  209. package/dist/analyzers/tools/runner.js +75 -12
  210. package/dist/analyzers/tools/runner.js.map +1 -1
  211. package/dist/analyzers/tools/semgrep.d.ts +39 -2
  212. package/dist/analyzers/tools/semgrep.d.ts.map +1 -1
  213. package/dist/analyzers/tools/semgrep.js +131 -9
  214. package/dist/analyzers/tools/semgrep.js.map +1 -1
  215. package/dist/analyzers/tools/timing.d.ts +17 -3
  216. package/dist/analyzers/tools/timing.d.ts.map +1 -1
  217. package/dist/analyzers/tools/timing.js +36 -14
  218. package/dist/analyzers/tools/timing.js.map +1 -1
  219. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  220. package/dist/analyzers/tools/tool-registry.js +11 -1
  221. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  222. package/dist/analyzers/tools/tools-unavailable-prose.d.ts +18 -0
  223. package/dist/analyzers/tools/tools-unavailable-prose.d.ts.map +1 -0
  224. package/dist/analyzers/tools/tools-unavailable-prose.js +69 -0
  225. package/dist/analyzers/tools/tools-unavailable-prose.js.map +1 -0
  226. package/dist/analyzers/tools/upgrade-plan-resolver.d.ts.map +1 -1
  227. package/dist/analyzers/tools/upgrade-plan-resolver.js +7 -0
  228. package/dist/analyzers/tools/upgrade-plan-resolver.js.map +1 -1
  229. package/dist/analyzers/tools/vendored-advisor.d.ts +43 -0
  230. package/dist/analyzers/tools/vendored-advisor.d.ts.map +1 -0
  231. package/dist/analyzers/tools/vendored-advisor.js +107 -0
  232. package/dist/analyzers/tools/vendored-advisor.js.map +1 -0
  233. package/dist/analyzers/tools/walk-paths.d.ts +78 -0
  234. package/dist/analyzers/tools/walk-paths.d.ts.map +1 -0
  235. package/dist/analyzers/tools/walk-paths.js +150 -0
  236. package/dist/analyzers/tools/walk-paths.js.map +1 -0
  237. package/dist/analyzers/tools/walk-source-files.d.ts +70 -0
  238. package/dist/analyzers/tools/walk-source-files.d.ts.map +1 -0
  239. package/dist/analyzers/tools/walk-source-files.js +369 -0
  240. package/dist/analyzers/tools/walk-source-files.js.map +1 -0
  241. package/dist/analyzers/types.d.ts +204 -4
  242. package/dist/analyzers/types.d.ts.map +1 -1
  243. package/dist/analyzers/xlsx/bom.d.ts.map +1 -1
  244. package/dist/analyzers/xlsx/bom.js +8 -1
  245. package/dist/analyzers/xlsx/bom.js.map +1 -1
  246. package/dist/cli.d.ts.map +1 -1
  247. package/dist/cli.js +581 -189
  248. package/dist/cli.js.map +1 -1
  249. package/dist/detect.d.ts.map +1 -1
  250. package/dist/detect.js +24 -7
  251. package/dist/detect.js.map +1 -1
  252. package/dist/doctor.d.ts.map +1 -1
  253. package/dist/doctor.js +103 -53
  254. package/dist/doctor.js.map +1 -1
  255. package/dist/languages/capabilities/provider.d.ts +130 -1
  256. package/dist/languages/capabilities/provider.d.ts.map +1 -1
  257. package/dist/languages/capabilities/types.d.ts +68 -7
  258. package/dist/languages/capabilities/types.d.ts.map +1 -1
  259. package/dist/languages/csharp.d.ts +15 -1
  260. package/dist/languages/csharp.d.ts.map +1 -1
  261. package/dist/languages/csharp.js +624 -146
  262. package/dist/languages/csharp.js.map +1 -1
  263. package/dist/languages/go.d.ts.map +1 -1
  264. package/dist/languages/go.js +89 -11
  265. package/dist/languages/go.js.map +1 -1
  266. package/dist/languages/index.d.ts +132 -2
  267. package/dist/languages/index.d.ts.map +1 -1
  268. package/dist/languages/index.js +207 -0
  269. package/dist/languages/index.js.map +1 -1
  270. package/dist/languages/java.d.ts.map +1 -1
  271. package/dist/languages/java.js +113 -26
  272. package/dist/languages/java.js.map +1 -1
  273. package/dist/languages/kotlin.d.ts.map +1 -1
  274. package/dist/languages/kotlin.js +132 -26
  275. package/dist/languages/kotlin.js.map +1 -1
  276. package/dist/languages/python.d.ts.map +1 -1
  277. package/dist/languages/python.js +149 -44
  278. package/dist/languages/python.js.map +1 -1
  279. package/dist/languages/ruby.d.ts +39 -1
  280. package/dist/languages/ruby.d.ts.map +1 -1
  281. package/dist/languages/ruby.js +178 -44
  282. package/dist/languages/ruby.js.map +1 -1
  283. package/dist/languages/rust.d.ts.map +1 -1
  284. package/dist/languages/rust.js +103 -16
  285. package/dist/languages/rust.js.map +1 -1
  286. package/dist/languages/types.d.ts +228 -5
  287. package/dist/languages/types.d.ts.map +1 -1
  288. package/dist/languages/typescript.d.ts.map +1 -1
  289. package/dist/languages/typescript.js +201 -14
  290. package/dist/languages/typescript.js.map +1 -1
  291. package/dist/scoring/dimensions/documentation.d.ts +53 -0
  292. package/dist/scoring/dimensions/documentation.d.ts.map +1 -0
  293. package/dist/scoring/dimensions/documentation.js +106 -0
  294. package/dist/scoring/dimensions/documentation.js.map +1 -0
  295. package/dist/scoring/dimensions/dx.d.ts +53 -0
  296. package/dist/scoring/dimensions/dx.d.ts.map +1 -0
  297. package/dist/scoring/dimensions/dx.js +105 -0
  298. package/dist/scoring/dimensions/dx.js.map +1 -0
  299. package/dist/scoring/dimensions/maintainability.d.ts +53 -0
  300. package/dist/scoring/dimensions/maintainability.d.ts.map +1 -0
  301. package/dist/scoring/dimensions/maintainability.js +101 -0
  302. package/dist/scoring/dimensions/maintainability.js.map +1 -0
  303. package/dist/scoring/dimensions/quality.d.ts +108 -0
  304. package/dist/scoring/dimensions/quality.d.ts.map +1 -0
  305. package/dist/scoring/dimensions/quality.js +174 -0
  306. package/dist/scoring/dimensions/quality.js.map +1 -0
  307. package/dist/scoring/dimensions/security.d.ts +84 -0
  308. package/dist/scoring/dimensions/security.d.ts.map +1 -0
  309. package/dist/scoring/dimensions/security.js +135 -0
  310. package/dist/scoring/dimensions/security.js.map +1 -0
  311. package/dist/scoring/dimensions/testing.d.ts +56 -0
  312. package/dist/scoring/dimensions/testing.d.ts.map +1 -0
  313. package/dist/scoring/dimensions/testing.js +98 -0
  314. package/dist/scoring/dimensions/testing.js.map +1 -0
  315. package/dist/scoring/evaluator.d.ts +27 -0
  316. package/dist/scoring/evaluator.d.ts.map +1 -0
  317. package/dist/scoring/evaluator.js +124 -0
  318. package/dist/scoring/evaluator.js.map +1 -0
  319. package/dist/scoring/format.d.ts +34 -0
  320. package/dist/scoring/format.d.ts.map +1 -0
  321. package/dist/scoring/format.js +63 -0
  322. package/dist/scoring/format.js.map +1 -0
  323. package/dist/scoring/index.d.ts +37 -0
  324. package/dist/scoring/index.d.ts.map +1 -0
  325. package/dist/scoring/index.js +57 -0
  326. package/dist/scoring/index.js.map +1 -0
  327. package/dist/scoring/overall.d.ts +54 -0
  328. package/dist/scoring/overall.d.ts.map +1 -0
  329. package/dist/scoring/overall.js +76 -0
  330. package/dist/scoring/overall.js.map +1 -0
  331. package/dist/scoring/result.d.ts +111 -0
  332. package/dist/scoring/result.d.ts.map +1 -0
  333. package/dist/scoring/result.js +14 -0
  334. package/dist/scoring/result.js.map +1 -0
  335. package/dist/scoring/spec.d.ts +76 -0
  336. package/dist/scoring/spec.d.ts.map +1 -0
  337. package/dist/scoring/spec.js +22 -0
  338. package/dist/scoring/spec.js.map +1 -0
  339. package/dist/scoring/thresholds.d.ts +56 -0
  340. package/dist/scoring/thresholds.d.ts.map +1 -0
  341. package/dist/scoring/thresholds.js +75 -0
  342. package/dist/scoring/thresholds.js.map +1 -0
  343. package/dist/tools-cli.d.ts.map +1 -1
  344. package/dist/tools-cli.js +21 -2
  345. package/dist/tools-cli.js.map +1 -1
  346. package/dist/types.d.ts +16 -0
  347. package/dist/types.d.ts.map +1 -1
  348. package/package.json +1 -1
  349. package/templates/.claude/commands/dashboard.md +17 -9
  350. package/dist/analyzers/scoring.d.ts +0 -49
  351. package/dist/analyzers/scoring.d.ts.map +0 -1
  352. package/dist/analyzers/scoring.js +0 -422
  353. package/dist/analyzers/scoring.js.map +0 -1
  354. package/dist/analyzers/security/scoring.d.ts +0 -29
  355. package/dist/analyzers/security/scoring.d.ts.map +0 -1
  356. package/dist/analyzers/security/scoring.js +0 -40
  357. package/dist/analyzers/security/scoring.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { HealthMetrics, HealthReport } from './types';
2
+ import type { AnalysisResult, AnalysisResultBody } from '../analysis-result';
2
3
  /** Default values for all HealthMetrics fields. */
3
4
  export declare function defaultMetrics(): HealthMetrics;
4
5
  /** Options for analyzeHealth. */
@@ -17,4 +18,30 @@ export declare function analyzeHealthWithMetrics(repoPath: string, options?: Ana
17
18
  }>;
18
19
  /** Run a full health analysis on a repository. */
19
20
  export declare function analyzeHealth(repoPath: string, options?: AnalyzeHealthOptions): Promise<HealthReport>;
21
+ /**
22
+ * The gather pipeline — everything that produces an `AnalysisResultBody`
23
+ * for a given repo. Pure with respect to the working tree: same SHA +
24
+ * same `.dxkit-ignore` + same dxkit version means same output. Scoring
25
+ * and formatting are deliberately NOT part of this — they live in
26
+ * `scoreAndFormatHealth` so cache hits skip the tool gather entirely
27
+ * but still re-render the report (cheap, deterministic, decoupled from
28
+ * I/O).
29
+ *
30
+ * Called by the cache layer (`readOrBuildAnalysisResult`) on a miss.
31
+ * Exported so other analyzers can drop into the same pattern in
32
+ * subsequent migrations: each subcommand asks the cache for a
33
+ * `AnalysisResult`, builder is supplied as `gatherAnalysisResultBody`,
34
+ * and the subcommand renders its own report from the body.
35
+ */
36
+ export declare function gatherAnalysisResultBody(repoPath: string, options?: AnalyzeHealthOptions): Promise<AnalysisResultBody>;
37
+ /**
38
+ * Score the six dimensions and format the result into a `HealthReport`.
39
+ * Pure function over a cached `AnalysisResult` — no I/O, no tool
40
+ * shell-outs. Provenance fields (commitSha, branch, analyzedAt) come
41
+ * directly from the cached result, which means two `health` calls on
42
+ * the same commit produce reports with the SAME `analyzedAt`
43
+ * timestamp: it's "when this gather was built," not "when this read
44
+ * happened." That's the cross-process-consistency contract.
45
+ */
46
+ export declare function scoreAndFormatHealth(result: AnalysisResult): HealthReport;
20
47
  //# sourceMappingURL=health.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/analyzers/health.ts"],"names":[],"mappings":"AAWA,OAAO,EAAoB,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA4BxE,mDAAmD;AACnD,wBAAgB,cAAc,IAAI,aAAa,CAyC9C;AAED,iCAAiC;AACjC,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CAE3D;AAED,kDAAkD;AAClD,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,YAAY,CAAC,CAEvB"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/analyzers/health.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAoB,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAgC7E,mDAAmD;AACnD,wBAAgB,cAAc,IAAI,aAAa,CAiD9C;AAED,iCAAiC;AACjC,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CAE3D;AAED,kDAAkD;AAClD,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,YAAY,CAAC,CAEvB;AAcD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAuG7B;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,YAAY,CA0BzE"}
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.defaultMetrics = defaultMetrics;
37
37
  exports.analyzeHealthWithMetrics = analyzeHealthWithMetrics;
38
38
  exports.analyzeHealth = analyzeHealth;
39
+ exports.gatherAnalysisResultBody = gatherAnalysisResultBody;
40
+ exports.scoreAndFormatHealth = scoreAndFormatHealth;
39
41
  /**
40
42
  * Health analyzer orchestrator.
41
43
  *
@@ -43,25 +45,35 @@ exports.analyzeHealth = analyzeHealth;
43
45
  * 2. Run tools -> gather metrics (deterministic)
44
46
  * 3. Score metrics -> formulas (deterministic)
45
47
  * 4. Format report -> structured JSON
48
+ *
49
+ * Steps 1–2 are wrapped in an `AnalysisResult` and persisted via the
50
+ * cross-process cache (`src/analyzers/cache.ts`). Step 3 + 4 (scoring
51
+ * + formatting) run on every call but read from the cached result;
52
+ * two `vyuh-dxkit health` invocations on the same commit produce
53
+ * byte-identical reports without re-shelling out to any tool.
46
54
  */
47
55
  const path = __importStar(require("path"));
48
56
  const detect_1 = require("../detect");
57
+ const cache_1 = require("./cache");
49
58
  const generic_1 = require("./tools/generic");
50
59
  const parallel_1 = require("./tools/parallel");
60
+ const lint_label_1 = require("./tools/lint-label");
51
61
  const coverage_1 = require("./tools/coverage");
52
62
  const package_json_1 = require("./tools/package-json");
63
+ const gather_1 = require("./quality/gather");
53
64
  const timing_1 = require("./tools/timing");
54
65
  const dispatcher_1 = require("./dispatcher");
55
66
  const descriptors_1 = require("../languages/capabilities/descriptors");
56
67
  const capabilities_1 = require("../languages/capabilities");
68
+ const gather_2 = require("./security/gather");
69
+ const gather_3 = require("./licenses/gather");
57
70
  const shallow_1 = require("./tests/shallow");
58
71
  const shallow_2 = require("./quality/shallow");
59
72
  const shallow_3 = require("./docs/shallow");
60
73
  const shallow_4 = require("./security/shallow");
61
74
  const shallow_5 = require("./maintainability/shallow");
62
75
  const shallow_6 = require("./dx/shallow");
63
- const scoring_1 = require("./scoring");
64
- const runner_1 = require("./tools/runner");
76
+ const scoring_1 = require("../scoring");
65
77
  /** Default values for all HealthMetrics fields. */
66
78
  function defaultMetrics() {
67
79
  return {
@@ -76,6 +88,7 @@ function defaultMetrics() {
76
88
  filesOver500Lines: 0,
77
89
  largestFileLines: 0,
78
90
  largestFilePath: '',
91
+ largestFiles: [],
79
92
  consoleLogCount: 0,
80
93
  anyTypeCount: 0,
81
94
  readmeExists: false,
@@ -89,8 +102,15 @@ function defaultMetrics() {
89
102
  privateKeyFiles: 0,
90
103
  envFilesInGit: 0,
91
104
  tlsDisabledCount: 0,
105
+ todoCount: 0,
106
+ fixmeCount: 0,
107
+ hackCount: 0,
108
+ staleFiles: 0,
109
+ mixedLanguages: false,
110
+ commentRatio: null,
92
111
  controllers: 0,
93
112
  models: 0,
113
+ routeHandlerFiles: 0,
94
114
  directories: 0,
95
115
  languages: [],
96
116
  nodeEngineVersion: null,
@@ -118,15 +138,40 @@ async function analyzeHealth(repoPath, options = {}) {
118
138
  return (await analyzeHealthInternal(repoPath, options)).report;
119
139
  }
120
140
  async function analyzeHealthInternal(repoPath, options = {}) {
141
+ const result = await (0, cache_1.readOrBuildAnalysisResult)({
142
+ cwd: repoPath,
143
+ build: (cwd) => gatherAnalysisResultBody(cwd, options),
144
+ });
145
+ const report = scoreAndFormatHealth(result);
146
+ return { report, metrics: result.metrics };
147
+ }
148
+ /**
149
+ * The gather pipeline — everything that produces an `AnalysisResultBody`
150
+ * for a given repo. Pure with respect to the working tree: same SHA +
151
+ * same `.dxkit-ignore` + same dxkit version means same output. Scoring
152
+ * and formatting are deliberately NOT part of this — they live in
153
+ * `scoreAndFormatHealth` so cache hits skip the tool gather entirely
154
+ * but still re-render the report (cheap, deterministic, decoupled from
155
+ * I/O).
156
+ *
157
+ * Called by the cache layer (`readOrBuildAnalysisResult`) on a miss.
158
+ * Exported so other analyzers can drop into the same pattern in
159
+ * subsequent migrations: each subcommand asks the cache for a
160
+ * `AnalysisResult`, builder is supplied as `gatherAnalysisResultBody`,
161
+ * and the subcommand renders its own report from the body.
162
+ */
163
+ async function gatherAnalysisResultBody(repoPath, options = {}) {
121
164
  const verbose = !!options.verbose;
122
165
  // Step 1: Detect stack
123
166
  const stack = (0, timing_1.timed)('detect', verbose, () => (0, detect_1.detect)(repoPath));
124
- // Step 2: Gather metrics -- generic first, then language-specific, then optional
125
- const generic = (0, timing_1.timed)('generic (Layer 0)', verbose, () => (0, generic_1.gatherGenericMetrics)(repoPath));
167
+ // Step 2: Gather metrics -- generic first, then language-specific, then optional.
168
+ // Active-pack flags from `stack` drive the architecturalShape-aware
169
+ // path counters (primary components, route handlers, data models).
170
+ const generic = (0, timing_1.timed)('generic (Layer 0)', verbose, () => (0, generic_1.gatherGenericMetrics)(repoPath, stack.languages));
126
171
  const metrics = { ...defaultMetrics(), ...generic };
127
172
  // `package.json` metrics: npm-script count + `engines.node` pin. These
128
173
  // don't fit any capability (Node-specific by nature) and used to live
129
- // in the typescript pack's `gatherMetrics` body; extracted in C.5 into
174
+ // in the typescript pack's `gatherMetrics` body; extracted later into
130
175
  // a direct helper so they survive the per-pack channel deletion.
131
176
  const pkg = (0, timing_1.timed)('package.json', verbose, () => (0, package_json_1.gatherPackageJsonMetrics)(repoPath));
132
177
  metrics.npmScriptsCount = pkg.npmScriptsCount;
@@ -135,8 +180,25 @@ async function analyzeHealthInternal(repoPath, options = {}) {
135
180
  // counts, graphify AST stats. Reshaped from the dispatcher's cached
136
181
  // envelopes (`tools/parallel.ts`), so each tool shells out at most once
137
182
  // per analyzer run.
138
- const layer2 = (0, timing_1.timed)('layer2 (parallel)', verbose, () => (0, parallel_1.gatherLayer2Parallel)(repoPath, verbose));
183
+ const layer2 = await (0, timing_1.timedAsync)('layer2 (parallel)', verbose, () => (0, parallel_1.gatherLayer2Parallel)(repoPath, verbose));
139
184
  mergeLayer2(metrics, layer2);
185
+ // Hygiene + comment-ratio metrics shared with the standalone Quality
186
+ // report. Live in HealthMetrics so the canonical Quality scorer
187
+ // sees the same values from both consumer paths — closes the
188
+ // dual-Quality-formula drift class structurally. The standalone
189
+ // analyzeQuality reads these straight off the cached AnalysisResult.
190
+ const hygiene = (0, timing_1.timed)('hygiene (grep)', verbose, () => (0, gather_1.gatherHygieneMarkers)(repoPath));
191
+ metrics.todoCount = hygiene.todoCount;
192
+ metrics.fixmeCount = hygiene.fixmeCount;
193
+ metrics.hackCount = hygiene.hackCount;
194
+ // hygiene.consoleLogCount is intentionally NOT mirrored — Layer 2
195
+ // already populates metrics.consoleLogCount via the shared
196
+ // gatherDebugStatements helper, and both paths converge on the
197
+ // same number by construction.
198
+ metrics.staleFiles = hygiene.staleFiles.length;
199
+ metrics.mixedLanguages = hygiene.mixedLanguages;
200
+ const comments = (0, timing_1.timed)('cloc (comment ratio)', verbose, () => (0, gather_1.gatherCommentRatio)(repoPath));
201
+ metrics.commentRatio = comments.ratio;
140
202
  // Surface the coverage tool name in `toolsUsed` even though its data
141
203
  // lives under `capabilities.coverage`. `loadCoverage` and the COVERAGE
142
204
  // dispatcher share the same underlying providers — the call here is
@@ -161,22 +223,58 @@ async function analyzeHealthInternal(repoPath, options = {}) {
161
223
  lang.percentage = Math.round((lang.lines / totalCodeLines) * 100);
162
224
  }
163
225
  }
164
- // Phase 10e.C.1: capability envelopes alongside legacy metrics. Dispatched
165
- // in parallel; providers the legacy path already ran are served from the
166
- // dispatcher cache (free). Scorers read capability-owned fields from this
167
- // bundle (C.2).
226
+ // Capability envelopes alongside legacy metrics. Dispatched in parallel;
227
+ // providers the legacy path already ran are served from the dispatcher
228
+ // cache (free). Scorers read capability-owned fields from this bundle.
168
229
  const capabilities = await (0, timing_1.timedAsync)('capabilities', verbose, () => gatherCapabilityReport(repoPath));
169
230
  // Synthesize per-pack tool names (eslint, npm-audit, ruff, pip-audit,
170
231
  // clippy, cargo-audit, golangci-lint, govulncheck, dotnet-format,
171
232
  // dotnet-vulnerable) into `metrics.toolsUsed` from the LINT + DEP_VULNS
172
- // envelopes. Pre-C.5 these came from each pack's `gatherMetrics`; now
173
- // they come from the dispatcher's already-computed `tool` field.
233
+ // envelopes. Sourced from the dispatcher's already-computed `tool` field
234
+ // rather than each pack's gather body.
174
235
  for (const name of toolsFromCapabilities(capabilities)) {
175
236
  if (!metrics.toolsUsed.includes(name))
176
237
  metrics.toolsUsed.push(name);
177
238
  }
178
- // Step 3: Score
179
- const scoreInput = { metrics, capabilities };
239
+ // Push attempted-but-failed capabilities into metrics.toolsUnavailable
240
+ // so consumers reading the report see the failure honestly rather
241
+ // than as silent absence. Reads from the *Availability sibling
242
+ // fields populated above. The reason text is consumer-renderable;
243
+ // keep it concise (~one short sentence).
244
+ pushUnavailable(metrics, capabilities.codePatternsAvailability, 'semgrep');
245
+ pushUnavailable(metrics, capabilities.duplicationAvailability, 'jscpd');
246
+ pushUnavailable(metrics, capabilities.structuralAvailability, 'graphify');
247
+ pushUnavailable(metrics, capabilities.lintAvailability, 'lint');
248
+ return { stack, capabilities, metrics };
249
+ }
250
+ /**
251
+ * Append a `<toolName> (<reason>)` entry to `metrics.toolsUnavailable`
252
+ * when an availability sibling reports the capability was attempted
253
+ * but failed. No-ops when the capability is fully clean (available:
254
+ * true) or when the sibling is absent. Deduplicates against any
255
+ * entry already pushed by Layer 2's parallel.ts (which renders
256
+ * gitleaks / graphify failures into the same field).
257
+ */
258
+ function pushUnavailable(metrics, avail, toolName) {
259
+ if (!avail || avail.available)
260
+ return;
261
+ const entry = avail.unavailableReason ? `${toolName} (${avail.unavailableReason})` : toolName;
262
+ if (!metrics.toolsUnavailable.some((e) => e === entry || e.startsWith(`${toolName} (`))) {
263
+ metrics.toolsUnavailable.push(entry);
264
+ }
265
+ }
266
+ /**
267
+ * Score the six dimensions and format the result into a `HealthReport`.
268
+ * Pure function over a cached `AnalysisResult` — no I/O, no tool
269
+ * shell-outs. Provenance fields (commitSha, branch, analyzedAt) come
270
+ * directly from the cached result, which means two `health` calls on
271
+ * the same commit produce reports with the SAME `analyzedAt`
272
+ * timestamp: it's "when this gather was built," not "when this read
273
+ * happened." That's the cross-process-consistency contract.
274
+ */
275
+ function scoreAndFormatHealth(result) {
276
+ const { stack, capabilities, metrics } = result;
277
+ const scoreInput = { metrics, capabilities, languageFlags: stack.languages };
180
278
  const dimensions = {
181
279
  testing: (0, shallow_1.scoreTestsDimension)(scoreInput),
182
280
  quality: (0, shallow_2.scoreQualityDimension)(scoreInput),
@@ -185,23 +283,20 @@ async function analyzeHealthInternal(repoPath, options = {}) {
185
283
  maintainability: (0, shallow_5.scoreMaintainabilityDimension)(scoreInput),
186
284
  developerExperience: (0, shallow_6.scoreDxDimension)(scoreInput),
187
285
  };
188
- const { overallScore, grade } = (0, scoring_1.computeOverall)(dimensions);
189
- // Step 4: Format report
190
- const commitSha = (0, runner_1.run)('git rev-parse --short HEAD 2>/dev/null', repoPath);
191
- const branch = (0, runner_1.run)('git rev-parse --abbrev-ref HEAD 2>/dev/null', repoPath);
192
- const report = {
193
- repo: stack.projectName || path.basename(repoPath),
194
- analyzedAt: new Date().toISOString(),
195
- commitSha,
196
- branch,
197
- summary: { overallScore, grade },
286
+ const { overallScore, rating } = (0, scoring_1.computeOverall)(dimensions);
287
+ return {
288
+ repo: stack.projectName || path.basename(result.cwd),
289
+ analyzedAt: result.builtAt,
290
+ commitSha: result.commitSha,
291
+ branch: result.branch,
292
+ summary: { overallScore, rating },
198
293
  dimensions,
199
294
  languages: metrics.languages,
295
+ largestFiles: metrics.largestFiles,
200
296
  toolsUsed: metrics.toolsUsed,
201
297
  toolsUnavailable: metrics.toolsUnavailable,
202
298
  capabilities,
203
299
  };
204
- return { report, metrics };
205
300
  }
206
301
  /**
207
302
  * Extract user-facing tool names from every capability envelope that
@@ -240,7 +335,16 @@ function toolsFromCapabilities(caps) {
240
335
  return names;
241
336
  }
242
337
  function splitToolNames(tool) {
243
- return tool
338
+ // The lint label may carry a `(not run: <pack> — <reason>[, ...])`
339
+ // parenthetical (built by the lint augmentation block earlier in
340
+ // this file). The Tools-used footer wants only the actual tool that
341
+ // ran — leaving the parenthetical in makes the footer row read as
342
+ // "ruff didn't run because of typescript" and also breaks the
343
+ // comma-split here when multiple packs are skipped (internal commas
344
+ // inside the parenthetical get treated as tool boundaries). Strip
345
+ // it before splitting. The not-run packs still surface via the
346
+ // dedicated Lint coverage gap row downstream.
347
+ return (0, lint_label_1.stripNotRunSuffix)(tool)
244
348
  .split(',')
245
349
  .map((s) => s.trim())
246
350
  .filter((s) => s.length > 0);
@@ -254,22 +358,104 @@ function splitToolNames(tool) {
254
358
  * isolates provider failures.
255
359
  */
256
360
  async function gatherCapabilityReport(cwd) {
257
- const [depVulns, lint, coverage, imports, testFramework, secrets, codePatterns, duplication, structural,] = await Promise.all([
258
- dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.DEP_VULNS, (0, capabilities_1.providersFor)(descriptors_1.DEP_VULNS, cwd)),
259
- dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.LINT, (0, capabilities_1.providersFor)(descriptors_1.LINT, cwd)),
361
+ // D025b (2.4.7): depVulns gathers via `gatherDepVulnsWithAvailability`
362
+ // (NOT the dispatcher) so the per-pack availability discriminant
363
+ // survives to the health-side scorer. Health doesn't need the
364
+ // enrichment passes (EPSS/KEV/reachability/risk) that the standalone
365
+ // vuln scan does — those run on the standalone path inside
366
+ // `gatherDepVulns`. The shared primitive returns the same
367
+ // `DepVulnResult` envelope shape the dispatcher would produce, plus
368
+ // the availability metadata.
369
+ const [depVulnsWithAvail, lintOutcome, coverage, imports, testFramework, secrets, codePatternsOutcome, duplicationOutcome, structuralOutcome, licensesWithAvail,] = await Promise.all([
370
+ (0, gather_2.gatherDepVulnsWithAvailability)(cwd),
371
+ // gatherWithProvenance (not gather) so the cached LintResult.tool
372
+ // can carry the "(not run: <packs>)" suffix when one of the
373
+ // active packs returned null silently. Standalone analyzeQuality
374
+ // reads the augmented label off the cached envelope — closes the
375
+ // cross-process drift class where two surfaces could disagree on
376
+ // whether a linter ran on a given pack.
377
+ dispatcher_1.defaultDispatcher.gatherWithProvenance(cwd, descriptors_1.LINT, (0, capabilities_1.providersFor)(descriptors_1.LINT, cwd)),
260
378
  dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.COVERAGE, (0, capabilities_1.providersFor)(descriptors_1.COVERAGE, cwd)),
261
379
  dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.IMPORTS, (0, capabilities_1.providersFor)(descriptors_1.IMPORTS, cwd)),
262
380
  dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.TEST_FRAMEWORK, (0, capabilities_1.providersFor)(descriptors_1.TEST_FRAMEWORK, cwd)),
263
381
  dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.SECRETS, (0, capabilities_1.providersFor)(descriptors_1.SECRETS, cwd)),
264
- dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.CODE_PATTERNS, (0, capabilities_1.providersFor)(descriptors_1.CODE_PATTERNS, cwd)),
265
- dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.DUPLICATION, (0, capabilities_1.providersFor)(descriptors_1.DUPLICATION, cwd)),
266
- dispatcher_1.defaultDispatcher.gather(cwd, descriptors_1.STRUCTURAL, (0, capabilities_1.providersFor)(descriptors_1.STRUCTURAL, cwd)),
382
+ // gatherWithProvenance so the cache builder can plumb per-capability
383
+ // availability metadata for tools that may legitimately gather
384
+ // attempted-but-failed (semgrep / jscpd / graphify under resource
385
+ // contention; tool not installed; etc.). Without this the cache's
386
+ // metrics.toolsUnavailable can't distinguish "tool didn't try" from
387
+ // "tool tried and failed silently" — the same dishonest-rendering
388
+ // class as the lint case the LINT switch above closes.
389
+ dispatcher_1.defaultDispatcher.gatherWithProvenance(cwd, descriptors_1.CODE_PATTERNS, (0, capabilities_1.providersFor)(descriptors_1.CODE_PATTERNS, cwd)),
390
+ dispatcher_1.defaultDispatcher.gatherWithProvenance(cwd, descriptors_1.DUPLICATION, (0, capabilities_1.providersFor)(descriptors_1.DUPLICATION, cwd)),
391
+ dispatcher_1.defaultDispatcher.gatherWithProvenance(cwd, descriptors_1.STRUCTURAL, (0, capabilities_1.providersFor)(descriptors_1.STRUCTURAL, cwd)),
392
+ (0, gather_3.gatherLicensesWithAvailability)(cwd),
267
393
  ]);
394
+ const codePatterns = codePatternsOutcome.envelope;
395
+ const duplication = duplicationOutcome.envelope;
396
+ const structural = structuralOutcome.envelope;
268
397
  const report = {};
269
- if (depVulns)
270
- report.depVulns = depVulns;
398
+ if (depVulnsWithAvail.envelope)
399
+ report.depVulns = depVulnsWithAvail.envelope;
400
+ // Always plumb availability — even when envelope is null, the bool
401
+ // disambiguates "no active pack" (available=true, no cap) from
402
+ // "active pack returned unavailable" (available=false, cap fires).
403
+ report.depVulnsAvailability = {
404
+ available: depVulnsWithAvail.available,
405
+ unavailableReason: depVulnsWithAvail.unavailableReason,
406
+ };
407
+ // Augment the lint envelope's tool label with skipped-pack
408
+ // provenance before caching, so consumers see the same label
409
+ // analyzeQuality's old standalone gather produced. Reconstructed
410
+ // (not mutated) because envelope.tool is readonly.
411
+ //
412
+ // When `skipReasons` carries a per-pack reason (the typescript +
413
+ // python lint providers expose `gatherOutcome` for exactly this),
414
+ // the label includes it so customers can act on the disclosure
415
+ // instead of being told "typescript lint not run" with no
416
+ // explanation. Example post-fix label on a platform-style polyglot:
417
+ // `ruff (not run: typescript — no eslint config found)`
418
+ const lint = (() => {
419
+ if (!lintOutcome.envelope || lintOutcome.skipped.length === 0) {
420
+ return lintOutcome.envelope;
421
+ }
422
+ const annotated = lintOutcome.skipped
423
+ .map((src) => {
424
+ const reason = lintOutcome.skipReasons[src];
425
+ return reason ? `${src} — ${reason}` : src;
426
+ })
427
+ .join(', ');
428
+ return {
429
+ ...lintOutcome.envelope,
430
+ tool: `${lintOutcome.envelope.tool} (not run: ${annotated})`,
431
+ };
432
+ })();
271
433
  if (lint)
272
434
  report.lint = lint;
435
+ // Lint availability so consumers can distinguish "no active
436
+ // lint-capable pack" (vacuous clean, available=true, no envelope)
437
+ // from "every active provider returned null" (available=false —
438
+ // actionable "try installing dependencies"). Same shape as
439
+ // licensesAvailability + depVulnsAvailability.
440
+ if (lintOutcome.attempted.length > 0 && lintOutcome.succeeded.length === 0) {
441
+ // Every attempted provider returned null — surface the per-pack
442
+ // reasons (when available via `gatherOutcome`) so the customer
443
+ // sees what to fix, not just which packs gave up.
444
+ const annotated = lintOutcome.attempted
445
+ .map((src) => {
446
+ const reason = lintOutcome.skipReasons[src];
447
+ return reason ? `${src} — ${reason}` : src;
448
+ })
449
+ .join('; ');
450
+ const pluralS = lintOutcome.attempted.length === 1 ? '' : 's';
451
+ report.lintAvailability = {
452
+ available: false,
453
+ unavailableReason: `provider${pluralS} returned no data: ${annotated}`,
454
+ };
455
+ }
456
+ else {
457
+ report.lintAvailability = { available: true, unavailableReason: '' };
458
+ }
273
459
  if (coverage)
274
460
  report.coverage = coverage;
275
461
  if (imports)
@@ -280,12 +466,74 @@ async function gatherCapabilityReport(cwd) {
280
466
  report.secrets = secrets;
281
467
  if (codePatterns)
282
468
  report.codePatterns = codePatterns;
469
+ // Same shape as lintAvailability — distinguishes "no rulesets
470
+ // active" (vacuous clean) from "semgrep/jscpd/graphify was
471
+ // attempted but every provider returned null" (actionable —
472
+ // the customer's report shouldn't silently miss the tool).
473
+ report.codePatternsAvailability = availabilityFromOutcome(codePatternsOutcome, 'semgrep');
283
474
  if (duplication)
284
475
  report.duplication = duplication;
476
+ report.duplicationAvailability = availabilityFromOutcome(duplicationOutcome, 'jscpd');
285
477
  if (structural)
286
478
  report.structural = structural;
479
+ report.structuralAvailability = availabilityFromOutcome(structuralOutcome, 'graphify');
480
+ if (licensesWithAvail.envelope)
481
+ report.licenses = licensesWithAvail.envelope;
482
+ // Always plumb availability — even when envelope is null, the bool
483
+ // disambiguates "no active pack with a licenses provider" (vacuous
484
+ // success) from "active pack returned unavailable" (banner fires).
485
+ report.licensesAvailability = {
486
+ available: licensesWithAvail.available,
487
+ unavailableReason: licensesWithAvail.unavailableReason,
488
+ };
489
+ // G_v4_8 (C1.3): build the canonical aggregate from everything we
490
+ // just gathered, plus the two security finders not represented in
491
+ // the capability layer (tls-bypass-registry walk, file findings).
492
+ // Stored on the CapabilityReport so dimension scorers — currently
493
+ // `security/shallow.ts` — read the SAME aggregate the standalone
494
+ // vuln-scan reads. Closes the D086 class of cross-consumer drift
495
+ // by construction.
496
+ report.securityAggregate = await (0, gather_2.buildSecurityAggregateForHealth)(cwd, secrets ?? undefined, codePatterns ?? undefined, depVulnsWithAvail.envelope ?? undefined, depVulnsWithAvail.available, depVulnsWithAvail.unavailableReason);
287
497
  return report;
288
498
  }
499
+ /**
500
+ * Derive `<cap>Availability` metadata from a gatherWithProvenance
501
+ * outcome. Mirrors the depVulnsAvailability / licensesAvailability
502
+ * pattern: `available === false` only when at least one provider was
503
+ * attempted AND none succeeded (i.e. tried + failed silently).
504
+ * Empty `attempted` list reports available: true (vacuous — nothing
505
+ * to try, nothing to fail).
506
+ */
507
+ function availabilityFromOutcome(outcome, _toolLabel) {
508
+ if (outcome.attempted.length === 0) {
509
+ return { available: true, unavailableReason: '' };
510
+ }
511
+ if (outcome.succeeded.length > 0) {
512
+ return { available: true, unavailableReason: '' };
513
+ }
514
+ // Prefer the per-source reason from the dispatcher's skipReasons map
515
+ // when present — that channel carries the tool's actual failure mode
516
+ // (`not installed` / `timed out at 600s` / `exit code 137 (stderr: ...)`
517
+ // / `no output` / `parse error`). Falls back to the generic prose for
518
+ // legacy providers without a `gatherOutcome` method, which collapse
519
+ // every failure to "null returned from gather()" with no reason text.
520
+ //
521
+ // The reason intentionally omits the tool name — pushUnavailable
522
+ // prepends it as `<tool> (<reason>)`, so duplicating the name here
523
+ // would render as `jscpd (jscpd attempted ...)`.
524
+ const skipReasons = outcome.skipReasons ?? {};
525
+ const firstSkipWithReason = outcome.skipped.find((s) => skipReasons[s]);
526
+ if (firstSkipWithReason) {
527
+ return {
528
+ available: false,
529
+ unavailableReason: skipReasons[firstSkipWithReason],
530
+ };
531
+ }
532
+ return {
533
+ available: false,
534
+ unavailableReason: 'attempted but produced no output (likely killed by resource limits — try running dxkit on this repo alone)',
535
+ };
536
+ }
289
537
  /**
290
538
  * Merge `gatherLayer2Parallel` output (cloc + gitleaks + graphify reshape)
291
539
  * into the accumulator. Layer 2 only writes non-capability fields and
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/analyzers/health.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,wCAyCC;AAaD,4DAKC;AAGD,sCAKC;AA3GD;;;;;;;GAOG;AACH,2CAA6B;AAC7B,sCAAmC;AAGnC,6CAAuD;AACvD,+CAAwD;AACxD,+CAAgD;AAChD,uDAAgE;AAChE,2CAAmD;AACnD,6CAAiD;AACjD,uEAU+C;AAC/C,4DAAyD;AACzD,6CAAsD;AACtD,+CAA0D;AAC1D,4CAAoD;AACpD,gDAA4D;AAC5D,uDAA0E;AAC1E,0CAAgD;AAChD,uCAAuD;AACvD,2CAAqC;AAErC,mDAAmD;AACnD,SAAgB,cAAc;IAC5B,OAAO;QACL,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE,IAAI;QAChB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,CAAC;QACnB,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,CAAC;QAClB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;QAClB,YAAY,EAAE,KAAK;QACnB,qBAAqB,EAAE,KAAK;QAC5B,kBAAkB,EAAE,KAAK;QACzB,eAAe,EAAE,KAAK;QACtB,SAAS,EAAE,CAAC;QACZ,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,CAAC;QAChB,gBAAgB,EAAE,CAAC;QACnB,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE;QACb,iBAAiB,EAAE,IAAI;QACvB,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,CAAC;QACpB,oBAAoB,EAAE,CAAC;QACvB,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,EAAE;QACpB,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC;AAQD;;;;GAIG;AACI,KAAK,UAAU,wBAAwB,CAC5C,QAAgB,EAChB,UAAgC,EAAE;IAElC,OAAO,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,kDAAkD;AAC3C,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,UAAgC,EAAE;IAElC,OAAO,CAAC,MAAM,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,UAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAElC,uBAAuB;IACvB,MAAM,KAAK,GAAG,IAAA,cAAK,EAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,CAAC;IAE/D,iFAAiF;IACjF,MAAM,OAAO,GAAG,IAAA,cAAK,EAAC,mBAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,8BAAoB,EAAC,QAAQ,CAAC,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAkB,EAAE,GAAG,cAAc,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC;IAEnE,uEAAuE;IACvE,sEAAsE;IACtE,uEAAuE;IACvE,iEAAiE;IACjE,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,uCAAwB,EAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;IAC9C,OAAO,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAElD,uEAAuE;IACvE,oEAAoE;IACpE,wEAAwE;IACxE,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAA,cAAK,EAAC,mBAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,+BAAoB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAClG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE7B,qEAAqE;IACrE,uEAAuE;IACvE,oEAAoE;IACpE,uEAAuE;IACvE,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAU,EAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,iEAAiE;IACjE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,aAAa;QACvC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,UAAU,EAAE,CAAC,EAAE,iBAAiB;SACjC,CAAC,CAAC;QACL,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAElC,uCAAuC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,gBAAgB;IAChB,MAAM,YAAY,GAAG,MAAM,IAAA,mBAAU,EAAC,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,CAClE,sBAAsB,CAAC,QAAQ,CAAC,CACjC,CAAC;IAEF,sEAAsE;IACtE,kEAAkE;IAClE,wEAAwE;IACxE,sEAAsE;IACtE,iEAAiE;IACjE,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,YAAY,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,gBAAgB;IAChB,MAAM,UAAU,GAAe,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IACzD,MAAM,UAAU,GAAG;QACjB,OAAO,EAAE,IAAA,6BAAmB,EAAC,UAAU,CAAC;QACxC,OAAO,EAAE,IAAA,+BAAqB,EAAC,UAAU,CAAC;QAC1C,aAAa,EAAE,IAAA,4BAAkB,EAAC,UAAU,CAAC;QAC7C,QAAQ,EAAE,IAAA,gCAAsB,EAAC,UAAU,CAAC;QAC5C,eAAe,EAAE,IAAA,uCAA6B,EAAC,UAAU,CAAC;QAC1D,mBAAmB,EAAE,IAAA,0BAAgB,EAAC,UAAU,CAAC;KAClD,CAAC;IACF,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAA,wBAAc,EAAC,UAAU,CAAC,CAAC;IAE3D,wBAAwB;IACxB,MAAM,SAAS,GAAG,IAAA,YAAG,EAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAA,YAAG,EAAC,6CAA6C,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,MAAM,GAAiB;QAC3B,IAAI,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClD,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,SAAS;QACT,MAAM;QACN,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE;QAChC,UAAU;QACV,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,YAAY;KACb,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,qBAAqB,CAAC,IAAsB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,IAAI,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,sBAAsB,CAAC,GAAW;IAC/C,MAAM,CACJ,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,aAAa,EACb,OAAO,EACP,YAAY,EACZ,WAAW,EACX,UAAU,EACX,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpB,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,uBAAS,EAAE,IAAA,2BAAY,EAAC,uBAAS,EAAE,GAAG,CAAC,CAAC;QACtE,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAI,EAAE,IAAA,2BAAY,EAAC,kBAAI,EAAE,GAAG,CAAC,CAAC;QAC5D,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,sBAAQ,EAAE,IAAA,2BAAY,EAAC,sBAAQ,EAAE,GAAG,CAAC,CAAC;QACpE,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,qBAAO,EAAE,IAAA,2BAAY,EAAC,qBAAO,EAAE,GAAG,CAAC,CAAC;QAClE,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,4BAAc,EAAE,IAAA,2BAAY,EAAC,4BAAc,EAAE,GAAG,CAAC,CAAC;QAChF,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,qBAAO,EAAE,IAAA,2BAAY,EAAC,qBAAO,EAAE,GAAG,CAAC,CAAC;QAClE,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,2BAAa,EAAE,IAAA,2BAAY,EAAC,2BAAa,EAAE,GAAG,CAAC,CAAC;QAC9E,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,yBAAW,EAAE,IAAA,2BAAY,EAAC,yBAAW,EAAE,GAAG,CAAC,CAAC;QAC1E,8BAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,wBAAU,EAAE,IAAA,2BAAY,EAAC,wBAAU,EAAE,GAAG,CAAC,CAAC;KACzE,CAAC,CAAC;IACH,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzC,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAC7B,IAAI,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzC,IAAI,OAAO;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,IAAI,aAAa;QAAE,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;IACxD,IAAI,OAAO;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,IAAI,YAAY;QAAE,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;IACrD,IAAI,WAAW;QAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IAClD,IAAI,UAAU;QAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,IAAmB,EAAE,OAA+B;IACvE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,IAAI,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAI,KAAkB,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAI,KAAkB,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC7D,IAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,SAAS,sBAAsB,CAC7B,KAAoB;IAEpB,MAAM,KAAK,GAA8E,EAAE,CAAC;IAC5F,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtE,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;IAC5B,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/analyzers/health.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,42 @@
1
1
  /**
2
- * Licenses analyzer data-gather a thin wrapper around the capability
3
- * dispatcher. The work of invoking per-pack license tools lives in
4
- * `src/languages/{typescript,python,go,rust,csharp}.ts`; this module
5
- * just routes through the dispatcher and unpacks the aggregated
6
- * envelope so the analyzer index can compute its cross-report summary.
2
+ * Licenses analyzer data-gather. D031 (2.4.7): mirrors the D025b
3
+ * pattern for dep-vulns bypasses the dispatcher cache to harvest
4
+ * per-pack `LicensesGatherOutcome` discriminants. The dispatcher's
5
+ * `gather()` collapses every non-success outcome to null, which
6
+ * makes the licenses report unable to differentiate "0 packages —
7
+ * scan ran cleanly" from "0 packages — tool not installed" (the F12
8
+ * customer-credibility class observed on the .NET WinForms benchmark).
9
+ *
10
+ * Per-pack helpers live in `src/languages/{typescript,python,go,
11
+ * rust,csharp}.ts` (kotlin/java/ruby don't declare a licenses
12
+ * capability — no canonical CLI license tool for those ecosystems
13
+ * yet). Each pack's `LicensesProvider.gatherOutcome` returns the
14
+ * discriminant; we aggregate success envelopes via the existing
15
+ * LICENSES descriptor + track first-unavailable for the framing
16
+ * notice.
7
17
  */
8
18
  import type { LicensesResult } from '../../languages/capabilities/types';
9
19
  /**
10
- * Dispatch the LICENSES capability against `cwd`. Returns null when no
11
- * pack contributed (e.g. a polyglot-negative repo) so the caller can
12
- * emit an empty-but-shaped report rather than fabricating data.
20
+ * Shared primitive for availability-aware licenses aggregation. Used
21
+ * by both the standalone licenses analyzer and the BoM report.
22
+ *
23
+ * `envelope` is null only when NO pack contributed a success outcome.
24
+ * `available` is false when at least one active pack with a licenses
25
+ * provider returned `'unavailable'`. `'no-manifest'` outcomes do NOT
26
+ * degrade availability — polyglot repos where one pack activates but
27
+ * has nothing to license (e.g. python pack on a Python-tooling-only
28
+ * repo with no `requirements.txt`) are clean "nothing to license."
29
+ */
30
+ export declare function gatherLicensesWithAvailability(cwd: string): Promise<{
31
+ envelope: LicensesResult | null;
32
+ available: boolean;
33
+ unavailableReason: string;
34
+ }>;
35
+ /**
36
+ * Legacy entry point — preserved for callers that don't need the
37
+ * availability metadata. New callers should use
38
+ * `gatherLicensesWithAvailability` directly so the framing notice
39
+ * + degraded-inventory fallback paths can engage.
13
40
  */
14
41
  export declare function gatherLicensesResult(cwd: string): Promise<LicensesResult | null>;
15
42
  //# sourceMappingURL=gather.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/analyzers/licenses/gather.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAItF"}
1
+ {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/analyzers/licenses/gather.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE;;;;;;;;;;GAUG;AACH,wBAAsB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACzE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC,CA4DD;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAGtF"}