@cdxgen/cdxgen 13.5.0 → 13.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +17 -10
  2. package/bin/audit.js +7 -4
  3. package/bin/cdxgen.js +260 -37
  4. package/bin/convert.js +146 -22
  5. package/bin/evinse.js +28 -3
  6. package/bin/repl.js +47 -3
  7. package/bin/sign.js +211 -34
  8. package/bin/tracebom.js +18 -6
  9. package/bin/validate.js +24 -3
  10. package/bin/verify.js +113 -5
  11. package/data/behavior-taxonomy.schema.json +1491 -0
  12. package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
  13. package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
  14. package/data/license-aliases.json +24 -2
  15. package/data/pqc-migration.json +239 -0
  16. package/data/remediations.json +176 -0
  17. package/data/rules/ai-bom.yaml +1 -1
  18. package/data/rules/brotli-decoder.yaml +107 -0
  19. package/data/rules/cbom-security.yaml +4 -3
  20. package/data/rules/package-integrity.yaml +28 -0
  21. package/data/rules/vscode-extensions.yaml +75 -0
  22. package/data/spdx-license-list.json +121 -7
  23. package/data/spdx-licenses.json +69 -0
  24. package/data/spdx.schema.json +845 -2
  25. package/lib/audit/index.js +25 -3
  26. package/lib/cli/bomAssembly.js +172 -4
  27. package/lib/cli/cliOptions.js +121 -17
  28. package/lib/cli/index.js +720 -902
  29. package/lib/cli/jsBom.js +156 -64
  30. package/lib/cli/jvmBom.js +602 -86
  31. package/lib/cli/managedBom.js +161 -19
  32. package/lib/cli/nativeBom.js +52 -5
  33. package/lib/core/boundedFile.js +344 -0
  34. package/lib/core/brotliProbe.js +182 -0
  35. package/lib/core/env.js +34 -0
  36. package/lib/core/fs.js +138 -3
  37. package/lib/core/globPatterns.js +218 -0
  38. package/lib/core/httpClient.js +98 -1
  39. package/lib/core/lockPaths.js +38 -0
  40. package/lib/core/paths.js +24 -1
  41. package/lib/core/processTree.js +100 -8
  42. package/lib/core/projectConfig.js +332 -25
  43. package/lib/core/toolRegistry.js +184 -0
  44. package/lib/ecosystems/cppEvidence.js +263 -106
  45. package/lib/ecosystems/cppIncludeResolver.js +16 -5
  46. package/lib/ecosystems/denoutils.js +2 -2
  47. package/lib/ecosystems/ecosystems.js +25 -10
  48. package/lib/ecosystems/gemHostProbe.js +301 -0
  49. package/lib/ecosystems/golem.js +3 -8
  50. package/lib/ecosystems/gradleutils.js +1909 -229
  51. package/lib/ecosystems/jsEvidence.js +90 -38
  52. package/lib/ecosystems/kosi.js +3 -5
  53. package/lib/ecosystems/npmVersionResolution.js +376 -0
  54. package/lib/ecosystems/parsers-bazel.js +107 -6
  55. package/lib/ecosystems/parsers-js.js +505 -22
  56. package/lib/ecosystems/parsers-misc.js +209 -20
  57. package/lib/ecosystems/parsers-python.js +178 -30
  58. package/lib/ecosystems/parsers-rust.js +117 -15
  59. package/lib/ecosystems/pythonutils.js +128 -2
  60. package/lib/ecosystems/remote/huggingface.js +22 -0
  61. package/lib/ecosystems/rubyutils.js +538 -31
  62. package/lib/ecosystems/rusi.js +2 -4
  63. package/lib/ecosystems/scalacliutils.js +2 -0
  64. package/lib/ecosystems/scalasem.js +798 -152
  65. package/lib/ecosystems/vendoredCode.js +237 -3
  66. package/lib/ecosystems/venvProbe.js +360 -0
  67. package/lib/evinser/evinser.js +536 -71
  68. package/lib/evinser/scalasem.js +5 -1
  69. package/lib/helpers/agenticToolutils.js +525 -94
  70. package/lib/helpers/bomSigner.js +43 -9
  71. package/lib/helpers/jssSigner.js +1276 -0
  72. package/lib/helpers/vsixutils.js +1574 -315
  73. package/lib/inventory/agentBlueprint.js +193 -0
  74. package/lib/inventory/agentToolNames.js +145 -0
  75. package/lib/inventory/aiCollector.js +153 -7
  76. package/lib/inventory/aiInventory.js +44 -8
  77. package/lib/inventory/aiProviders.js +324 -0
  78. package/lib/inventory/atomUtils.js +77 -0
  79. package/lib/inventory/bomUtils.js +8 -1
  80. package/lib/inventory/brotliDecoder.js +142 -0
  81. package/lib/inventory/buildToolRateLimit.js +1 -1
  82. package/lib/inventory/cbomutils.js +56 -7
  83. package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
  84. package/lib/inventory/citations.js +31 -2
  85. package/lib/inventory/communityAiConfigParser.js +978 -80
  86. package/lib/inventory/cyclonedx20.js +152 -0
  87. package/lib/inventory/cyclonedx20Common.js +286 -0
  88. package/lib/inventory/cyclonedx20Derived.js +159 -0
  89. package/lib/inventory/cyclonedx20Parties.js +552 -0
  90. package/lib/inventory/cyclonedx20Read.js +768 -0
  91. package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
  92. package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
  93. package/lib/inventory/cyclonedx20ReadContext.js +380 -0
  94. package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
  95. package/lib/inventory/cyclonedx20ReadSections.js +599 -0
  96. package/lib/inventory/cyclonedx20Render.js +766 -0
  97. package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
  98. package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
  99. package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
  100. package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
  101. package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
  102. package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
  103. package/lib/inventory/cyclonedx20RenderSections.js +499 -0
  104. package/lib/inventory/cyclonedx20Tables.js +594 -0
  105. package/lib/inventory/deps.js +141 -13
  106. package/lib/inventory/dosai.js +375 -6
  107. package/lib/inventory/dosaiParsers.js +3 -6
  108. package/lib/inventory/dotnetRuntime.js +367 -0
  109. package/lib/inventory/ecosystemFormulationParsers.js +979 -0
  110. package/lib/inventory/envcontext.js +436 -48
  111. package/lib/inventory/evidenceUtils.js +13 -1
  112. package/lib/inventory/fetchBatch.js +1 -1
  113. package/lib/inventory/formulationParsers.js +124 -14
  114. package/lib/inventory/gtfobins.js +13 -0
  115. package/lib/inventory/hbom.js +45 -6
  116. package/lib/inventory/hbomLoader.js +166 -0
  117. package/lib/inventory/hostRuntimeProbe.js +686 -0
  118. package/lib/inventory/jvmLocalRepos.js +9 -2
  119. package/lib/inventory/jvmToolEnv.js +29 -0
  120. package/lib/inventory/licenseEnhancer.js +12 -0
  121. package/lib/inventory/mavenCentralMirror.js +534 -0
  122. package/lib/inventory/mcpConfigParser.js +5 -0
  123. package/lib/inventory/nodeBuildInfo.js +218 -0
  124. package/lib/inventory/nodeHostProbe.js +202 -0
  125. package/lib/inventory/occurrenceKey.js +90 -0
  126. package/lib/inventory/osPackageResolver.js +182 -0
  127. package/lib/inventory/phpBuildInfo.js +10 -59
  128. package/lib/inventory/phpHostProbe.js +32 -488
  129. package/lib/inventory/pqcMigration.js +426 -0
  130. package/lib/inventory/rubyBuildInfo.js +972 -0
  131. package/lib/inventory/rubyHostProbe.js +218 -0
  132. package/lib/inventory/rustFormulationParser.js +21 -10
  133. package/lib/inventory/scalaCoords.js +4 -3
  134. package/lib/inventory/scalaDedupe.js +440 -0
  135. package/lib/inventory/source.js +114 -8
  136. package/lib/managers/binary.js +337 -3
  137. package/lib/managers/docker.js +79 -0
  138. package/lib/parsers/huggingfaceManifest.js +9 -1
  139. package/lib/parsers/huggingfaceUtils.js +18 -0
  140. package/lib/parsers/kiroPermissions.js +166 -0
  141. package/lib/parsers/largeJson.js +28 -11
  142. package/lib/parsers/vscodeExtensionId.js +183 -0
  143. package/lib/server/server.js +48 -35
  144. package/lib/stages/postgen/postgen.js +41 -1
  145. package/lib/stages/postgen/ruleEngine.js +13 -5
  146. package/lib/stages/postgen/specVersionCompat.js +76 -0
  147. package/lib/stages/pregen/envAudit.js +1 -0
  148. package/lib/stages/pregen/pregen.js +114 -57
  149. package/lib/validator/bomValidator.js +14 -2
  150. package/lib/validator/complianceEngine.js +30 -3
  151. package/lib/validator/complianceRules.js +1416 -4
  152. package/lib/validator/generated/validate-1.6.mjs +1 -1
  153. package/lib/validator/generated/validate-1.7.mjs +1 -1
  154. package/lib/validator/generated/validate-2.0.mjs +57554 -13851
  155. package/lib/validator/index.js +49 -8
  156. package/lib/validator/reporters/json.js +6 -0
  157. package/package.json +11 -10
  158. package/types/bin/repl.d.ts.map +1 -1
  159. package/types/lib/audit/index.d.ts +6 -2
  160. package/types/lib/audit/index.d.ts.map +1 -1
  161. package/types/lib/cli/bomAssembly.d.ts +29 -1
  162. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  163. package/types/lib/cli/cliOptions.d.ts +6 -0
  164. package/types/lib/cli/cliOptions.d.ts.map +1 -1
  165. package/types/lib/cli/index.d.ts.map +1 -1
  166. package/types/lib/cli/jsBom.d.ts +3 -18
  167. package/types/lib/cli/jsBom.d.ts.map +1 -1
  168. package/types/lib/cli/jvmBom.d.ts +15 -0
  169. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  170. package/types/lib/cli/managedBom.d.ts.map +1 -1
  171. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  172. package/types/lib/core/boundedFile.d.ts +100 -0
  173. package/types/lib/core/boundedFile.d.ts.map +1 -0
  174. package/types/lib/core/brotliProbe.d.ts +37 -0
  175. package/types/lib/core/brotliProbe.d.ts.map +1 -0
  176. package/types/lib/core/env.d.ts +14 -0
  177. package/types/lib/core/env.d.ts.map +1 -1
  178. package/types/lib/core/fs.d.ts +4 -0
  179. package/types/lib/core/fs.d.ts.map +1 -1
  180. package/types/lib/core/globPatterns.d.ts +70 -0
  181. package/types/lib/core/globPatterns.d.ts.map +1 -0
  182. package/types/lib/core/httpClient.d.ts +24 -0
  183. package/types/lib/core/httpClient.d.ts.map +1 -1
  184. package/types/lib/core/lockPaths.d.ts +19 -0
  185. package/types/lib/core/lockPaths.d.ts.map +1 -0
  186. package/types/lib/core/paths.d.ts +9 -0
  187. package/types/lib/core/paths.d.ts.map +1 -1
  188. package/types/lib/core/processTree.d.ts +17 -4
  189. package/types/lib/core/processTree.d.ts.map +1 -1
  190. package/types/lib/core/projectConfig.d.ts +47 -8
  191. package/types/lib/core/projectConfig.d.ts.map +1 -1
  192. package/types/lib/core/toolRegistry.d.ts +36 -0
  193. package/types/lib/core/toolRegistry.d.ts.map +1 -0
  194. package/types/lib/ecosystems/cppEvidence.d.ts +40 -13
  195. package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
  196. package/types/lib/ecosystems/cppIncludeResolver.d.ts +2 -1
  197. package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -1
  198. package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
  199. package/types/lib/ecosystems/gemHostProbe.d.ts +28 -0
  200. package/types/lib/ecosystems/gemHostProbe.d.ts.map +1 -0
  201. package/types/lib/ecosystems/golem.d.ts.map +1 -1
  202. package/types/lib/ecosystems/gradleutils.d.ts +294 -20
  203. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  204. package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
  205. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
  206. package/types/lib/ecosystems/kosi.d.ts.map +1 -1
  207. package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
  208. package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
  209. package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -1
  210. package/types/lib/ecosystems/parsers-js.d.ts +17 -20
  211. package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
  212. package/types/lib/ecosystems/parsers-misc.d.ts +19 -0
  213. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
  214. package/types/lib/ecosystems/parsers-python.d.ts +10 -0
  215. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  216. package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
  217. package/types/lib/ecosystems/pythonutils.d.ts +19 -1
  218. package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
  219. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
  220. package/types/lib/ecosystems/rubyutils.d.ts +144 -12
  221. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
  222. package/types/lib/ecosystems/rusi.d.ts.map +1 -1
  223. package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -1
  224. package/types/lib/ecosystems/scalasem.d.ts +58 -16
  225. package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
  226. package/types/lib/ecosystems/vendoredCode.d.ts +26 -0
  227. package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -1
  228. package/types/lib/ecosystems/venvProbe.d.ts +40 -0
  229. package/types/lib/ecosystems/venvProbe.d.ts.map +1 -0
  230. package/types/lib/evinser/evinser.d.ts +120 -13
  231. package/types/lib/evinser/evinser.d.ts.map +1 -1
  232. package/types/lib/evinser/scalasem.d.ts.map +1 -1
  233. package/types/lib/helpers/agenticToolutils.d.ts +53 -19
  234. package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
  235. package/types/lib/helpers/bomSigner.d.ts +20 -3
  236. package/types/lib/helpers/bomSigner.d.ts.map +1 -1
  237. package/types/lib/helpers/jssSigner.d.ts +288 -0
  238. package/types/lib/helpers/jssSigner.d.ts.map +1 -0
  239. package/types/lib/helpers/vsixutils.d.ts +303 -19
  240. package/types/lib/helpers/vsixutils.d.ts.map +1 -1
  241. package/types/lib/inventory/agentBlueprint.d.ts +70 -0
  242. package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
  243. package/types/lib/inventory/agentToolNames.d.ts +51 -0
  244. package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
  245. package/types/lib/inventory/aiCollector.d.ts.map +1 -1
  246. package/types/lib/inventory/aiInventory.d.ts.map +1 -1
  247. package/types/lib/inventory/aiProviders.d.ts +85 -0
  248. package/types/lib/inventory/aiProviders.d.ts.map +1 -0
  249. package/types/lib/inventory/atomUtils.d.ts +19 -0
  250. package/types/lib/inventory/atomUtils.d.ts.map +1 -1
  251. package/types/lib/inventory/bomUtils.d.ts.map +1 -1
  252. package/types/lib/inventory/brotliDecoder.d.ts +58 -0
  253. package/types/lib/inventory/brotliDecoder.d.ts.map +1 -0
  254. package/types/lib/inventory/cbomutils.d.ts +17 -0
  255. package/types/lib/inventory/cbomutils.d.ts.map +1 -1
  256. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
  257. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
  258. package/types/lib/inventory/citations.d.ts +5 -0
  259. package/types/lib/inventory/citations.d.ts.map +1 -1
  260. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
  261. package/types/lib/inventory/cyclonedx20.d.ts +99 -0
  262. package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
  263. package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
  264. package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
  265. package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
  266. package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
  267. package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
  268. package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
  269. package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
  270. package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
  271. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
  272. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
  273. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
  274. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
  275. package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
  276. package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
  277. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
  278. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
  279. package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
  280. package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
  281. package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
  282. package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
  283. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
  284. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
  285. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
  286. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
  287. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
  288. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
  289. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
  290. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
  291. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
  292. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
  293. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
  294. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
  295. package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
  296. package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
  297. package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
  298. package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
  299. package/types/lib/inventory/deps.d.ts +35 -2
  300. package/types/lib/inventory/deps.d.ts.map +1 -1
  301. package/types/lib/inventory/dosai.d.ts +36 -1
  302. package/types/lib/inventory/dosai.d.ts.map +1 -1
  303. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
  304. package/types/lib/inventory/dotnetRuntime.d.ts +91 -0
  305. package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -0
  306. package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
  307. package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
  308. package/types/lib/inventory/envcontext.d.ts +74 -12
  309. package/types/lib/inventory/envcontext.d.ts.map +1 -1
  310. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  311. package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
  312. package/types/lib/inventory/gtfobins.d.ts.map +1 -1
  313. package/types/lib/inventory/hbom.d.ts +11 -0
  314. package/types/lib/inventory/hbom.d.ts.map +1 -1
  315. package/types/lib/inventory/hbomLoader.d.ts +54 -0
  316. package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
  317. package/types/lib/inventory/hostRuntimeProbe.d.ts +44 -0
  318. package/types/lib/inventory/hostRuntimeProbe.d.ts.map +1 -0
  319. package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
  320. package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
  321. package/types/lib/inventory/jvmToolEnv.d.ts +12 -0
  322. package/types/lib/inventory/jvmToolEnv.d.ts.map +1 -1
  323. package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -1
  324. package/types/lib/inventory/mavenCentralMirror.d.ts +170 -0
  325. package/types/lib/inventory/mavenCentralMirror.d.ts.map +1 -0
  326. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
  327. package/types/lib/inventory/nodeBuildInfo.d.ts +95 -0
  328. package/types/lib/inventory/nodeBuildInfo.d.ts.map +1 -0
  329. package/types/lib/inventory/nodeHostProbe.d.ts +15 -0
  330. package/types/lib/inventory/nodeHostProbe.d.ts.map +1 -0
  331. package/types/lib/inventory/occurrenceKey.d.ts +52 -0
  332. package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
  333. package/types/lib/inventory/osPackageResolver.d.ts +38 -0
  334. package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
  335. package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -1
  336. package/types/lib/inventory/phpHostProbe.d.ts.map +1 -1
  337. package/types/lib/inventory/pqcMigration.d.ts +84 -0
  338. package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
  339. package/types/lib/inventory/rubyBuildInfo.d.ts +271 -0
  340. package/types/lib/inventory/rubyBuildInfo.d.ts.map +1 -0
  341. package/types/lib/inventory/rubyHostProbe.d.ts +47 -0
  342. package/types/lib/inventory/rubyHostProbe.d.ts.map +1 -0
  343. package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
  344. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
  345. package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
  346. package/types/lib/inventory/scalaDedupe.d.ts +43 -0
  347. package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
  348. package/types/lib/inventory/source.d.ts +25 -0
  349. package/types/lib/inventory/source.d.ts.map +1 -1
  350. package/types/lib/managers/binary.d.ts.map +1 -1
  351. package/types/lib/managers/docker.d.ts +12 -0
  352. package/types/lib/managers/docker.d.ts.map +1 -1
  353. package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
  354. package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
  355. package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
  356. package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
  357. package/types/lib/parsers/kiroPermissions.d.ts +62 -0
  358. package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
  359. package/types/lib/parsers/largeJson.d.ts +4 -3
  360. package/types/lib/parsers/largeJson.d.ts.map +1 -1
  361. package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
  362. package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
  363. package/types/lib/server/server.d.ts.map +1 -1
  364. package/types/lib/stages/postgen/postgen.d.ts +7 -0
  365. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  366. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  367. package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
  368. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
  369. package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
  370. package/types/lib/stages/pregen/pregen.d.ts +12 -8
  371. package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
  372. package/types/lib/validator/bomValidator.d.ts +5 -1
  373. package/types/lib/validator/bomValidator.d.ts.map +1 -1
  374. package/types/lib/validator/complianceEngine.d.ts +4 -4
  375. package/types/lib/validator/complianceEngine.d.ts.map +1 -1
  376. package/types/lib/validator/complianceRules.d.ts +14 -2
  377. package/types/lib/validator/complianceRules.d.ts.map +1 -1
  378. package/types/lib/validator/index.d.ts +10 -0
  379. package/types/lib/validator/index.d.ts.map +1 -1
  380. package/types/lib/validator/reporters/json.d.ts.map +1 -1
package/bin/convert.js CHANGED
@@ -20,9 +20,16 @@ import {
20
20
  } from "../lib/helpers/exportUtils.js";
21
21
  import {
22
22
  getNonCycloneDxErrorMessage,
23
+ isCycloneDx20SpecVersion,
23
24
  isCycloneDxBom,
24
25
  toCycloneDxSpecVersionString,
25
26
  } from "../lib/inventory/bomUtils.js";
27
+ import {
28
+ CDX20_INTERNAL_SECTIONS_KEY,
29
+ loadBomForAnalysis,
30
+ renderCycloneDx20WithReport,
31
+ } from "../lib/inventory/cyclonedx20.js";
32
+ import { hardwareRenderContext } from "../lib/inventory/hbomLoader.js";
26
33
  import {
27
34
  importProtobomModule,
28
35
  isProtoBomPath,
@@ -31,13 +38,19 @@ import { sortBomCollections } from "../lib/stages/postgen/sortBom.js";
31
38
  import { convertCycloneDxToSpdx } from "../lib/stages/postgen/spdxConverter.js";
32
39
  import {
33
40
  applySpecVersionCompatibility,
34
- collectFieldPaths,
41
+ diffMissingLeafValues,
42
+ diffRemovedFieldPaths,
35
43
  } from "../lib/stages/postgen/specVersionCompat.js";
36
44
  import { validateBom, validateSpdx } from "../lib/validator/bomValidator.js";
37
45
 
38
46
  // cdxgen bundles CycloneDX JSON schemas for these versions only, so a
39
47
  // conversion to any other version is written without a schema check.
40
48
  const VALIDATABLE_SPEC_VERSIONS = new Set(["1.6", "1.7", "2.0"]);
49
+ // The 2.0 renderer reads the 1.x model of these versions; older input has
50
+ // shapes it does not convert (a 1.5 tools array, a single identity object).
51
+ const CDX20_SOURCE_SPEC_VERSIONS = new Set(["1.6", "1.7", "2.0"]);
52
+ // Longest value printed for a missing 2.0 leaf; the comparison uses all of it.
53
+ const MAX_PRINTED_LEAF_LENGTH = 160;
41
54
 
42
55
  const _yargs = yargs(hideBin(process.argv));
43
56
 
@@ -55,7 +68,7 @@ const args = _yargs
55
68
  .option("to", {
56
69
  default: "spdx",
57
70
  description:
58
- "Conversion target. 'spdx' exports SPDX 3.0.1 JSON-LD. A CycloneDX spec version (1.5, 1.6, 1.7) cross-converts the BOM to that version instead.",
71
+ "Conversion target. 'spdx' exports SPDX 3.0.1 JSON-LD. A CycloneDX spec version (1.5, 1.6, 1.7, 2.0) cross-converts the BOM to that version instead.",
59
72
  })
60
73
  .option("validate", {
61
74
  type: "boolean",
@@ -63,6 +76,12 @@ const args = _yargs
63
76
  description:
64
77
  "Validate the converted output against its schema. Pass --no-validate to skip.",
65
78
  })
79
+ .option("fail-on-loss", {
80
+ type: "boolean",
81
+ default: false,
82
+ description:
83
+ "Exit 2, without writing the output, when the conversion loses data: a CycloneDX 2.0 input's read losses for a 1.x or SPDX target, values the 2.0 render drops, or field paths the target version does not define.",
84
+ })
66
85
  .option("json-pretty", {
67
86
  type: "boolean",
68
87
  default: false,
@@ -116,10 +135,11 @@ const targetSpecVersion = toCycloneDxSpecVersionString(args.to);
116
135
  const isSpdxTarget = `${args.to}`.trim().toLowerCase() === "spdx";
117
136
  if (!isSpdxTarget && !targetSpecVersion) {
118
137
  console.error(
119
- `Unsupported conversion target '${args.to}'. Pass --to spdx for an SPDX 3.0.1 export, or a CycloneDX spec version such as 1.5, 1.6, or 1.7.`,
138
+ `Unsupported conversion target '${args.to}'. Pass --to spdx for an SPDX 3.0.1 export, or a CycloneDX spec version such as 1.5, 1.6, 1.7 or 2.0.`,
120
139
  );
121
140
  process.exit(1);
122
141
  }
142
+ const isCdx20Target = !isSpdxTarget && targetSpecVersion === "2.0";
123
143
 
124
144
  const bomJson = await loadCycloneDxBom(args.input);
125
145
 
@@ -127,17 +147,66 @@ if (!isCycloneDxBom(bomJson)) {
127
147
  console.error(getNonCycloneDxErrorMessage(bomJson, "cdx-convert"));
128
148
  process.exit(1);
129
149
  }
130
- const cdxSpecVersion = toCycloneDxSpecVersionString(bomJson?.specVersion);
150
+ // A 2.0 input reads into the 1.x-shaped internal model first; the losses say
151
+ // what of the input that model (and so any 1.x or SPDX output) cannot hold.
152
+ let analysis;
153
+ try {
154
+ analysis = loadBomForAnalysis(bomJson);
155
+ } catch (err) {
156
+ console.error(`cdx-convert: ${args.input}: ${err.message}`);
157
+ process.exit(1);
158
+ }
159
+ const { internalBom, losses } = analysis;
160
+ const isCdx20Input =
161
+ isCycloneDx20SpecVersion(bomJson?.specVersion) || !!bomJson?.specFormat;
162
+ const cdxSpecVersion = isCdx20Input
163
+ ? "2.0"
164
+ : toCycloneDxSpecVersionString(bomJson?.specVersion);
165
+ if (isCdx20Target && !CDX20_SOURCE_SPEC_VERSIONS.has(cdxSpecVersion)) {
166
+ console.error(
167
+ `cdx-convert --to 2.0 reads CycloneDX 1.6, 1.7 or 2.0 input, and '${args.input}' is CycloneDX ${bomJson?.specVersion ?? "(no specVersion)"}. Convert it with --to 1.7 first, then convert that file to 2.0.`,
168
+ );
169
+ process.exit(1);
170
+ }
171
+
172
+ // Every loss is printed, whatever the target; --fail-on-loss counts the ones
173
+ // the output really lacks.
174
+ let lostCount = 0;
175
+ if (losses.length) {
176
+ const targetLabel = isSpdxTarget
177
+ ? "the SPDX 3.0.1 export lacks what they name"
178
+ : isCdx20Target
179
+ ? "the 2.0 output keeps what the read model carries for 2.0, and any difference is reported below"
180
+ : `the CycloneDX ${targetSpecVersion} output lacks what they name`;
181
+ console.warn(
182
+ `Reading the CycloneDX 2.0 input into cdxgen's 1.x model reported ${losses.length} loss(es); ${targetLabel}:`,
183
+ );
184
+ for (const loss of losses) {
185
+ console.warn(` - ${loss.pointer || "(root)"}: ${loss.reason}`);
186
+ }
187
+ if (!isCdx20Target) {
188
+ lostCount += losses.length;
189
+ }
190
+ }
191
+ const failIfLost = () => {
192
+ if (args.failOnLoss && lostCount > 0) {
193
+ console.error(
194
+ `--fail-on-loss is set and the conversion lost data (${lostCount} loss(es) above).`,
195
+ );
196
+ process.exit(2);
197
+ }
198
+ };
131
199
 
132
200
  if (isSpdxTarget) {
133
- if (!["1.6", "1.7"].includes(cdxSpecVersion)) {
201
+ if (!["1.6", "1.7", "2.0"].includes(cdxSpecVersion)) {
134
202
  console.error(
135
- `Unsupported CycloneDX specVersion '${bomJson?.specVersion}'. cdx-convert currently supports CycloneDX 1.6 or 1.7 input and exports SPDX 3.0.1.`,
203
+ `Unsupported CycloneDX specVersion '${bomJson?.specVersion}'. cdx-convert supports CycloneDX 1.6, 1.7 and 2.0 input and exports SPDX 3.0.1.`,
136
204
  );
137
205
  process.exit(1);
138
206
  }
207
+ failIfLost();
139
208
 
140
- const spdxJson = convertCycloneDxToSpdx(bomJson, args);
209
+ const spdxJson = convertCycloneDxToSpdx(internalBom, args);
141
210
  if (!spdxJson) {
142
211
  console.error("Conversion failed: unable to generate SPDX output.");
143
212
  process.exit(1);
@@ -167,24 +236,79 @@ if (isSpdxTarget) {
167
236
 
168
237
  // The same normalizer the postgen stage applies to freshly generated BOMs, so
169
238
  // `cdx-convert --to 1.6` and `cdxgen --spec-version 1.6` agree on the result.
170
- const sourceFieldPaths = collectFieldPaths(bomJson);
171
- const convertedBomJson = applySpecVersionCompatibility(bomJson, {
172
- specVersion: targetSpecVersion,
173
- });
174
- sortBomCollections(convertedBomJson);
175
-
176
- const retainedFieldPaths = collectFieldPaths(convertedBomJson);
177
- const removedFieldPaths = [...sourceFieldPaths]
178
- .filter((fieldPath) => !retainedFieldPaths.has(fieldPath))
179
- .sort();
180
- if (removedFieldPaths.length) {
181
- console.warn(
182
- `Converting to CycloneDX ${targetSpecVersion} dropped ${removedFieldPaths.length} field path(s) that version does not define:`,
239
+ const convertedModel = applySpecVersionCompatibility(
240
+ structuredClone(internalBom),
241
+ { specVersion: targetSpecVersion },
242
+ );
243
+ let convertedBomJson = convertedModel;
244
+ if (isCdx20Target) {
245
+ // A 1.6/1.7 input is sorted, as postProcess sorts before its render, so
246
+ // `cdx-convert --to 2.0` and `cdxgen --spec-version 2.0` agree on the
247
+ // order. A 2.0 input keeps its own order: sorting would reorder the
248
+ // objects the read model keeps as 2.0 originals, and they would no
249
+ // longer render back unchanged.
250
+ if (!isCdx20Input) {
251
+ sortBomCollections(convertedModel);
252
+ }
253
+ // The optional cdx-hbom hardware mapper, as cdxgen --spec-version 2.0
254
+ // uses it, so both render an HBOM the same way.
255
+ const { bomJson: rendered, report } = renderCycloneDx20WithReport(
256
+ convertedModel,
257
+ await hardwareRenderContext(convertedModel),
258
+ );
259
+ convertedBomJson = rendered;
260
+ const dropLabels = Object.keys(report.drops);
261
+ const dropCount = dropLabels.reduce(
262
+ (sum, label) => sum + report.drops[label],
263
+ 0,
183
264
  );
184
- for (const fieldPath of removedFieldPaths) {
185
- console.warn(` - ${fieldPath}`);
265
+ if (dropCount) {
266
+ console.warn(
267
+ `Rendering CycloneDX 2.0 dropped ${dropCount} value(s) the 2.0 format has no place for:`,
268
+ );
269
+ for (const label of dropLabels) {
270
+ console.warn(` - ${label} ×${report.drops[label]}`);
271
+ }
272
+ lostCount += dropCount;
273
+ }
274
+ if (isCdx20Input) {
275
+ // The read model carries 2.0-only content for 2.0 output, so a 2.0 to
276
+ // 2.0 conversion loses only what is missing from the output.
277
+ const missing = diffMissingLeafValues(bomJson, convertedBomJson);
278
+ if (missing.length) {
279
+ console.warn(
280
+ `The CycloneDX 2.0 output lacks ${missing.length} value(s) of the input (member order ignored):`,
281
+ );
282
+ for (const leaf of missing) {
283
+ console.warn(
284
+ ` - ${leaf.length > MAX_PRINTED_LEAF_LENGTH ? `${leaf.slice(0, MAX_PRINTED_LEAF_LENGTH)}…` : leaf}`,
285
+ );
286
+ }
287
+ lostCount += missing.length;
288
+ }
289
+ }
290
+ } else {
291
+ sortBomCollections(convertedBomJson);
292
+ const removedFieldPaths = diffRemovedFieldPaths(
293
+ internalBom,
294
+ convertedBomJson,
295
+ )
296
+ // The internal sections key is a transport detail of the 1.x model,
297
+ // not a document field, so it never counts as dropped data.
298
+ .filter(
299
+ (fieldPath) => !fieldPath.startsWith(CDX20_INTERNAL_SECTIONS_KEY),
300
+ );
301
+ if (removedFieldPaths.length) {
302
+ console.warn(
303
+ `Converting to CycloneDX ${targetSpecVersion} dropped ${removedFieldPaths.length} field path(s) that version does not define:`,
304
+ );
305
+ for (const fieldPath of removedFieldPaths) {
306
+ console.warn(` - ${fieldPath}`);
307
+ }
308
+ lostCount += removedFieldPaths.length;
186
309
  }
187
310
  }
311
+ failIfLost();
188
312
 
189
313
  if (args.validate) {
190
314
  if (VALIDATABLE_SPEC_VERSIONS.has(targetSpecVersion)) {
package/bin/evinse.js CHANGED
@@ -12,12 +12,16 @@ import { safeExistsSync } from "../lib/ecosystems/utils.js";
12
12
  import {
13
13
  analyzeProject,
14
14
  createEvinseFile,
15
+ loadEvinseInputBom,
15
16
  prepareDB,
17
+ reportEvinseInputLosses,
16
18
  } from "../lib/evinser/evinser.js";
17
19
  import {
18
20
  getNonCycloneDxErrorMessage,
21
+ isCycloneDx20SpecVersion,
19
22
  isCycloneDxBom,
20
23
  } from "../lib/inventory/bomUtils.js";
24
+ import { loadBomForAnalysis } from "../lib/inventory/cyclonedx20.js";
21
25
  import {
22
26
  printCallStack,
23
27
  printOccurrences,
@@ -269,6 +273,9 @@ const args = yargs(hideBin(process.argv))
269
273
  description: "Use an existing usages slices file.",
270
274
  default: "usages.slices.json",
271
275
  })
276
+ .option("callsites-slices-file", {
277
+ description: "Use an existing callsites slices file (JS/TS).",
278
+ })
272
279
  .option("scalasem-command", {
273
280
  description:
274
281
  "Use a specific scalasem script for Scala evidence analysis. Defaults to SCALASEM_CMD.",
@@ -360,6 +367,22 @@ function ensureCycloneDxInput(inputFile) {
360
367
  }
361
368
  }
362
369
  ensureCycloneDxInput(args.input);
370
+ // A CycloneDX 2.0 input is read into the 1.x internal model once, here. The
371
+ // model goes to prepareDB, analyzeProject and createEvinseFile as
372
+ // `inputBomJson`, so the analysis works on the 1.x shape, and the evinser's
373
+ // postProcess pass writes the result back at 2.0.
374
+ if (safeExistsSync(args.input)) {
375
+ try {
376
+ const { bomJson: inputBom, losses } = loadEvinseInputBom(args);
377
+ if (isCycloneDx20SpecVersion(inputBom?.specVersion)) {
378
+ args.specVersion = "2.0";
379
+ args.inputBomJson = inputBom;
380
+ reportEvinseInputLosses(losses);
381
+ }
382
+ } catch {
383
+ // ensureCycloneDxInput already reported the parse failure.
384
+ }
385
+ }
363
386
  (async () => {
364
387
  // First, prepare the database by cataloging jars and other libraries
365
388
  const dbObjMap = await prepareDB(args);
@@ -373,10 +396,12 @@ ensureCycloneDxInput(args.input);
373
396
  process.exit(1);
374
397
  }
375
398
  if (args.print) {
376
- printOccurrences(bomJson);
377
- printCallStack(bomJson);
399
+ // The print helpers walk the 1.x shape; a 2.0 result is read back.
400
+ const printBom = loadBomForAnalysis(bomJson).internalBom;
401
+ printOccurrences(printBom);
402
+ printCallStack(printBom);
378
403
  printReachables(sliceArtefacts);
379
- printServices(bomJson);
404
+ printServices(printBom);
380
405
  }
381
406
  }
382
407
  })();
package/bin/repl.js CHANGED
@@ -10,6 +10,7 @@ import jsonata from "jsonata";
10
10
 
11
11
  import { createBom } from "../lib/cli/index.js";
12
12
  import { readEnvironmentVariable } from "../lib/core/activity.js";
13
+ import { thoughtLog } from "../lib/core/logger.js";
13
14
  import {
14
15
  getTmpDir,
15
16
  isDryRun,
@@ -19,6 +20,11 @@ import {
19
20
  safeWriteSync,
20
21
  } from "../lib/ecosystems/utils.js";
21
22
  import { isSpdxJsonLd } from "../lib/inventory/bomUtils.js";
23
+ import {
24
+ formatReadLossNotice,
25
+ loadBomForAnalysis,
26
+ renderCycloneDx20,
27
+ } from "../lib/inventory/cyclonedx20.js";
22
28
  import {
23
29
  printAiBomDatasets,
24
30
  printAiBomInsights,
@@ -89,6 +95,20 @@ if (readEnvironmentVariable("CDXGEN_NODE_OPTIONS")) {
89
95
 
90
96
  // The current sbom is stored here
91
97
  let sbom;
98
+ // For an imported CycloneDX 2.0 document, `sbom` holds the 1.x-shaped model
99
+ // the pivots read. `sbomIs20` says the BOM is a 2.0 one, so .validate and
100
+ // .save work with 2.0 documents; `importedBom20` keeps the document as read
101
+ // until .update changes the model.
102
+ let sbomIs20 = false;
103
+ let importedBom20;
104
+
105
+ /** The current BOM as a document: the 2.0 one for a 2.0 import. */
106
+ const getBomDocument = () => {
107
+ if (!sbomIs20) {
108
+ return sbom;
109
+ }
110
+ return importedBom20 ?? renderCycloneDx20(sbom);
111
+ };
92
112
  const getInteractiveBom = () => toCycloneDxLikeBom(sbom);
93
113
 
94
114
  function getContainerRegistryHost(reference) {
@@ -427,7 +447,20 @@ export const importSbom = async (sbomOrPath) => {
427
447
  }
428
448
  if (importTarget.endsWith(".json") && safeExistsSync(importTarget)) {
429
449
  try {
430
- sbom = JSON.parse(readFileSync(importTarget, "utf-8"));
450
+ const importedBom = JSON.parse(readFileSync(importTarget, "utf-8"));
451
+ // A CycloneDX 2.0 document is read into the 1.x internal model so the
452
+ // pivots below keep working; the number of read losses is noted once.
453
+ const { internalBom, losses, specVersion } =
454
+ loadBomForAnalysis(importedBom);
455
+ sbom = internalBom;
456
+ sbomIs20 = specVersion === "2.0" && internalBom !== importedBom;
457
+ importedBom20 = sbomIs20 ? importedBom : undefined;
458
+ if (losses.length) {
459
+ console.log(`ℹ ${formatReadLossNotice(losses)}`);
460
+ for (const loss of losses) {
461
+ thoughtLog(`cdxi 2.0 loss at ${loss.pointer}: ${loss.reason}`);
462
+ }
463
+ }
431
464
  let bomType = "SBOM";
432
465
  if (isSpdxJsonLd(sbom)) {
433
466
  bomType = "SPDX";
@@ -473,10 +506,14 @@ export const importSbom = async (sbomOrPath) => {
473
506
  "protobuf BOM input",
474
507
  );
475
508
  sbom = readBinary(importTarget, true);
509
+ sbomIs20 = false;
510
+ importedBom20 = undefined;
476
511
  printSummary(sbom);
477
512
  } else if (isSupportedSbomRegistryReference(importTarget)) {
478
513
  try {
479
514
  sbom = await getBomWithOras(importTarget);
515
+ sbomIs20 = false;
516
+ importedBom20 = undefined;
480
517
  if (sbom) {
481
518
  printSummary(sbom);
482
519
  } else {
@@ -557,6 +594,8 @@ cdxgenRepl.defineCommand("create", {
557
594
  });
558
595
  if (bomNSData) {
559
596
  sbom = bomNSData.bomJson;
597
+ sbomIs20 = false;
598
+ importedBom20 = undefined;
560
599
  console.log("✅ BOM imported successfully.");
561
600
  console.log("💭 Type .print to view the BOM as a table");
562
601
  console.log(
@@ -1381,7 +1420,8 @@ cdxgenRepl.defineCommand("validate", {
1381
1420
  help: "validate the bom using jsonschema",
1382
1421
  action() {
1383
1422
  if (sbom) {
1384
- validateBom(sbom).then((result) => {
1423
+ // A 2.0 import is validated as the 2.0 document, not as the model.
1424
+ validateBom(getBomDocument()).then((result) => {
1385
1425
  if (result) {
1386
1426
  console.log("BOM is valid!");
1387
1427
  }
@@ -1408,7 +1448,9 @@ cdxgenRepl.defineCommand("save", {
1408
1448
  this.displayPrompt();
1409
1449
  return;
1410
1450
  }
1411
- safeWriteSync(saveToFile, JSON.stringify(sbom, null, 2));
1451
+ // A 2.0 import is saved as a 2.0 document rendered from the model.
1452
+ const document = sbomIs20 ? renderCycloneDx20(sbom) : sbom;
1453
+ safeWriteSync(saveToFile, JSON.stringify(document, null, 2));
1412
1454
  console.log(`BOM saved successfully to ${saveToFile}`);
1413
1455
  } else {
1414
1456
  console.log(
@@ -1436,6 +1478,8 @@ cdxgenRepl.defineCommand("update", {
1436
1478
  const newSbom = await expression.evaluate(sbom);
1437
1479
  if (newSbom && newSbom.components.length <= sbom.components.length) {
1438
1480
  sbom = newSbom;
1481
+ // The model changed, so a 2.0 import is rendered again on use.
1482
+ importedBom20 = undefined;
1439
1483
  }
1440
1484
  console.log("BOM updated successfully.");
1441
1485
  } else {