@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.
- package/README.md +17 -10
- package/bin/audit.js +7 -4
- package/bin/cdxgen.js +260 -37
- package/bin/convert.js +146 -22
- package/bin/evinse.js +28 -3
- package/bin/repl.js +47 -3
- package/bin/sign.js +211 -34
- package/bin/tracebom.js +18 -6
- package/bin/validate.js +24 -3
- package/bin/verify.js +113 -5
- package/data/behavior-taxonomy.schema.json +1491 -0
- package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
- package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
- package/data/license-aliases.json +24 -2
- package/data/pqc-migration.json +239 -0
- package/data/remediations.json +176 -0
- package/data/rules/ai-bom.yaml +1 -1
- package/data/rules/brotli-decoder.yaml +107 -0
- package/data/rules/cbom-security.yaml +4 -3
- package/data/rules/package-integrity.yaml +28 -0
- package/data/rules/vscode-extensions.yaml +75 -0
- package/data/spdx-license-list.json +121 -7
- package/data/spdx-licenses.json +69 -0
- package/data/spdx.schema.json +845 -2
- package/lib/audit/index.js +25 -3
- package/lib/cli/bomAssembly.js +172 -4
- package/lib/cli/cliOptions.js +121 -17
- package/lib/cli/index.js +720 -902
- package/lib/cli/jsBom.js +156 -64
- package/lib/cli/jvmBom.js +602 -86
- package/lib/cli/managedBom.js +161 -19
- package/lib/cli/nativeBom.js +52 -5
- package/lib/core/boundedFile.js +344 -0
- package/lib/core/brotliProbe.js +182 -0
- package/lib/core/env.js +34 -0
- package/lib/core/fs.js +138 -3
- package/lib/core/globPatterns.js +218 -0
- package/lib/core/httpClient.js +98 -1
- package/lib/core/lockPaths.js +38 -0
- package/lib/core/paths.js +24 -1
- package/lib/core/processTree.js +100 -8
- package/lib/core/projectConfig.js +332 -25
- package/lib/core/toolRegistry.js +184 -0
- package/lib/ecosystems/cppEvidence.js +263 -106
- package/lib/ecosystems/cppIncludeResolver.js +16 -5
- package/lib/ecosystems/denoutils.js +2 -2
- package/lib/ecosystems/ecosystems.js +25 -10
- package/lib/ecosystems/gemHostProbe.js +301 -0
- package/lib/ecosystems/golem.js +3 -8
- package/lib/ecosystems/gradleutils.js +1909 -229
- package/lib/ecosystems/jsEvidence.js +90 -38
- package/lib/ecosystems/kosi.js +3 -5
- package/lib/ecosystems/npmVersionResolution.js +376 -0
- package/lib/ecosystems/parsers-bazel.js +107 -6
- package/lib/ecosystems/parsers-js.js +505 -22
- package/lib/ecosystems/parsers-misc.js +209 -20
- package/lib/ecosystems/parsers-python.js +178 -30
- package/lib/ecosystems/parsers-rust.js +117 -15
- package/lib/ecosystems/pythonutils.js +128 -2
- package/lib/ecosystems/remote/huggingface.js +22 -0
- package/lib/ecosystems/rubyutils.js +538 -31
- package/lib/ecosystems/rusi.js +2 -4
- package/lib/ecosystems/scalacliutils.js +2 -0
- package/lib/ecosystems/scalasem.js +798 -152
- package/lib/ecosystems/vendoredCode.js +237 -3
- package/lib/ecosystems/venvProbe.js +360 -0
- package/lib/evinser/evinser.js +536 -71
- package/lib/evinser/scalasem.js +5 -1
- package/lib/helpers/agenticToolutils.js +525 -94
- package/lib/helpers/bomSigner.js +43 -9
- package/lib/helpers/jssSigner.js +1276 -0
- package/lib/helpers/vsixutils.js +1574 -315
- package/lib/inventory/agentBlueprint.js +193 -0
- package/lib/inventory/agentToolNames.js +145 -0
- package/lib/inventory/aiCollector.js +153 -7
- package/lib/inventory/aiInventory.js +44 -8
- package/lib/inventory/aiProviders.js +324 -0
- package/lib/inventory/atomUtils.js +77 -0
- package/lib/inventory/bomUtils.js +8 -1
- package/lib/inventory/brotliDecoder.js +142 -0
- package/lib/inventory/buildToolRateLimit.js +1 -1
- package/lib/inventory/cbomutils.js +56 -7
- package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
- package/lib/inventory/citations.js +31 -2
- package/lib/inventory/communityAiConfigParser.js +978 -80
- package/lib/inventory/cyclonedx20.js +152 -0
- package/lib/inventory/cyclonedx20Common.js +286 -0
- package/lib/inventory/cyclonedx20Derived.js +159 -0
- package/lib/inventory/cyclonedx20Parties.js +552 -0
- package/lib/inventory/cyclonedx20Read.js +768 -0
- package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
- package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
- package/lib/inventory/cyclonedx20ReadContext.js +380 -0
- package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
- package/lib/inventory/cyclonedx20ReadSections.js +599 -0
- package/lib/inventory/cyclonedx20Render.js +766 -0
- package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
- package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
- package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
- package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
- package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
- package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
- package/lib/inventory/cyclonedx20RenderSections.js +499 -0
- package/lib/inventory/cyclonedx20Tables.js +594 -0
- package/lib/inventory/deps.js +141 -13
- package/lib/inventory/dosai.js +375 -6
- package/lib/inventory/dosaiParsers.js +3 -6
- package/lib/inventory/dotnetRuntime.js +367 -0
- package/lib/inventory/ecosystemFormulationParsers.js +979 -0
- package/lib/inventory/envcontext.js +436 -48
- package/lib/inventory/evidenceUtils.js +13 -1
- package/lib/inventory/fetchBatch.js +1 -1
- package/lib/inventory/formulationParsers.js +124 -14
- package/lib/inventory/gtfobins.js +13 -0
- package/lib/inventory/hbom.js +45 -6
- package/lib/inventory/hbomLoader.js +166 -0
- package/lib/inventory/hostRuntimeProbe.js +686 -0
- package/lib/inventory/jvmLocalRepos.js +9 -2
- package/lib/inventory/jvmToolEnv.js +29 -0
- package/lib/inventory/licenseEnhancer.js +12 -0
- package/lib/inventory/mavenCentralMirror.js +534 -0
- package/lib/inventory/mcpConfigParser.js +5 -0
- package/lib/inventory/nodeBuildInfo.js +218 -0
- package/lib/inventory/nodeHostProbe.js +202 -0
- package/lib/inventory/occurrenceKey.js +90 -0
- package/lib/inventory/osPackageResolver.js +182 -0
- package/lib/inventory/phpBuildInfo.js +10 -59
- package/lib/inventory/phpHostProbe.js +32 -488
- package/lib/inventory/pqcMigration.js +426 -0
- package/lib/inventory/rubyBuildInfo.js +972 -0
- package/lib/inventory/rubyHostProbe.js +218 -0
- package/lib/inventory/rustFormulationParser.js +21 -10
- package/lib/inventory/scalaCoords.js +4 -3
- package/lib/inventory/scalaDedupe.js +440 -0
- package/lib/inventory/source.js +114 -8
- package/lib/managers/binary.js +337 -3
- package/lib/managers/docker.js +79 -0
- package/lib/parsers/huggingfaceManifest.js +9 -1
- package/lib/parsers/huggingfaceUtils.js +18 -0
- package/lib/parsers/kiroPermissions.js +166 -0
- package/lib/parsers/largeJson.js +28 -11
- package/lib/parsers/vscodeExtensionId.js +183 -0
- package/lib/server/server.js +48 -35
- package/lib/stages/postgen/postgen.js +41 -1
- package/lib/stages/postgen/ruleEngine.js +13 -5
- package/lib/stages/postgen/specVersionCompat.js +76 -0
- package/lib/stages/pregen/envAudit.js +1 -0
- package/lib/stages/pregen/pregen.js +114 -57
- package/lib/validator/bomValidator.js +14 -2
- package/lib/validator/complianceEngine.js +30 -3
- package/lib/validator/complianceRules.js +1416 -4
- package/lib/validator/generated/validate-1.6.mjs +1 -1
- package/lib/validator/generated/validate-1.7.mjs +1 -1
- package/lib/validator/generated/validate-2.0.mjs +57554 -13851
- package/lib/validator/index.js +49 -8
- package/lib/validator/reporters/json.js +6 -0
- package/package.json +11 -10
- package/types/bin/repl.d.ts.map +1 -1
- package/types/lib/audit/index.d.ts +6 -2
- package/types/lib/audit/index.d.ts.map +1 -1
- package/types/lib/cli/bomAssembly.d.ts +29 -1
- package/types/lib/cli/bomAssembly.d.ts.map +1 -1
- package/types/lib/cli/cliOptions.d.ts +6 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -1
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/cli/jsBom.d.ts +3 -18
- package/types/lib/cli/jsBom.d.ts.map +1 -1
- package/types/lib/cli/jvmBom.d.ts +15 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -1
- package/types/lib/cli/managedBom.d.ts.map +1 -1
- package/types/lib/cli/nativeBom.d.ts.map +1 -1
- package/types/lib/core/boundedFile.d.ts +100 -0
- package/types/lib/core/boundedFile.d.ts.map +1 -0
- package/types/lib/core/brotliProbe.d.ts +37 -0
- package/types/lib/core/brotliProbe.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +14 -0
- package/types/lib/core/env.d.ts.map +1 -1
- package/types/lib/core/fs.d.ts +4 -0
- package/types/lib/core/fs.d.ts.map +1 -1
- package/types/lib/core/globPatterns.d.ts +70 -0
- package/types/lib/core/globPatterns.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +24 -0
- package/types/lib/core/httpClient.d.ts.map +1 -1
- package/types/lib/core/lockPaths.d.ts +19 -0
- package/types/lib/core/lockPaths.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +9 -0
- package/types/lib/core/paths.d.ts.map +1 -1
- package/types/lib/core/processTree.d.ts +17 -4
- package/types/lib/core/processTree.d.ts.map +1 -1
- package/types/lib/core/projectConfig.d.ts +47 -8
- package/types/lib/core/projectConfig.d.ts.map +1 -1
- package/types/lib/core/toolRegistry.d.ts +36 -0
- package/types/lib/core/toolRegistry.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +40 -13
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/cppIncludeResolver.d.ts +2 -1
- package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -1
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
- package/types/lib/ecosystems/gemHostProbe.d.ts +28 -0
- package/types/lib/ecosystems/gemHostProbe.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -1
- package/types/lib/ecosystems/gradleutils.d.ts +294 -20
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
- package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/kosi.d.ts.map +1 -1
- package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
- package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-js.d.ts +17 -20
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-misc.d.ts +19 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-python.d.ts +10 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
- package/types/lib/ecosystems/pythonutils.d.ts +19 -1
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
- package/types/lib/ecosystems/rubyutils.d.ts +144 -12
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
- package/types/lib/ecosystems/rusi.d.ts.map +1 -1
- package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -1
- package/types/lib/ecosystems/scalasem.d.ts +58 -16
- package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
- package/types/lib/ecosystems/vendoredCode.d.ts +26 -0
- package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -1
- package/types/lib/ecosystems/venvProbe.d.ts +40 -0
- package/types/lib/ecosystems/venvProbe.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +120 -13
- package/types/lib/evinser/evinser.d.ts.map +1 -1
- package/types/lib/evinser/scalasem.d.ts.map +1 -1
- package/types/lib/helpers/agenticToolutils.d.ts +53 -19
- package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
- package/types/lib/helpers/bomSigner.d.ts +20 -3
- package/types/lib/helpers/bomSigner.d.ts.map +1 -1
- package/types/lib/helpers/jssSigner.d.ts +288 -0
- package/types/lib/helpers/jssSigner.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +303 -19
- package/types/lib/helpers/vsixutils.d.ts.map +1 -1
- package/types/lib/inventory/agentBlueprint.d.ts +70 -0
- package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
- package/types/lib/inventory/agentToolNames.d.ts +51 -0
- package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -1
- package/types/lib/inventory/aiInventory.d.ts.map +1 -1
- package/types/lib/inventory/aiProviders.d.ts +85 -0
- package/types/lib/inventory/aiProviders.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +19 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -1
- package/types/lib/inventory/bomUtils.d.ts.map +1 -1
- package/types/lib/inventory/brotliDecoder.d.ts +58 -0
- package/types/lib/inventory/brotliDecoder.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +17 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -1
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +5 -0
- package/types/lib/inventory/citations.d.ts.map +1 -1
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/cyclonedx20.d.ts +99 -0
- package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +35 -2
- package/types/lib/inventory/deps.d.ts.map +1 -1
- package/types/lib/inventory/dosai.d.ts +36 -1
- package/types/lib/inventory/dosai.d.ts.map +1 -1
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
- package/types/lib/inventory/dotnetRuntime.d.ts +91 -0
- package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +74 -12
- package/types/lib/inventory/envcontext.d.ts.map +1 -1
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
- package/types/lib/inventory/gtfobins.d.ts.map +1 -1
- package/types/lib/inventory/hbom.d.ts +11 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -1
- package/types/lib/inventory/hbomLoader.d.ts +54 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
- package/types/lib/inventory/hostRuntimeProbe.d.ts +44 -0
- package/types/lib/inventory/hostRuntimeProbe.d.ts.map +1 -0
- package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
- package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
- package/types/lib/inventory/jvmToolEnv.d.ts +12 -0
- package/types/lib/inventory/jvmToolEnv.d.ts.map +1 -1
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -1
- package/types/lib/inventory/mavenCentralMirror.d.ts +170 -0
- package/types/lib/inventory/mavenCentralMirror.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/nodeBuildInfo.d.ts +95 -0
- package/types/lib/inventory/nodeBuildInfo.d.ts.map +1 -0
- package/types/lib/inventory/nodeHostProbe.d.ts +15 -0
- package/types/lib/inventory/nodeHostProbe.d.ts.map +1 -0
- package/types/lib/inventory/occurrenceKey.d.ts +52 -0
- package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +38 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
- package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -1
- package/types/lib/inventory/phpHostProbe.d.ts.map +1 -1
- package/types/lib/inventory/pqcMigration.d.ts +84 -0
- package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
- package/types/lib/inventory/rubyBuildInfo.d.ts +271 -0
- package/types/lib/inventory/rubyBuildInfo.d.ts.map +1 -0
- package/types/lib/inventory/rubyHostProbe.d.ts +47 -0
- package/types/lib/inventory/rubyHostProbe.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
- package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
- package/types/lib/inventory/scalaDedupe.d.ts +43 -0
- package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +25 -0
- package/types/lib/inventory/source.d.ts.map +1 -1
- package/types/lib/managers/binary.d.ts.map +1 -1
- package/types/lib/managers/docker.d.ts +12 -0
- package/types/lib/managers/docker.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
- package/types/lib/parsers/kiroPermissions.d.ts +62 -0
- package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
- package/types/lib/parsers/largeJson.d.ts +4 -3
- package/types/lib/parsers/largeJson.d.ts.map +1 -1
- package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
- package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
- package/types/lib/server/server.d.ts.map +1 -1
- package/types/lib/stages/postgen/postgen.d.ts +7 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
- package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
- package/types/lib/stages/pregen/pregen.d.ts +12 -8
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
- package/types/lib/validator/bomValidator.d.ts +5 -1
- package/types/lib/validator/bomValidator.d.ts.map +1 -1
- package/types/lib/validator/complianceEngine.d.ts +4 -4
- package/types/lib/validator/complianceEngine.d.ts.map +1 -1
- package/types/lib/validator/complianceRules.d.ts +14 -2
- package/types/lib/validator/complianceRules.d.ts.map +1 -1
- package/types/lib/validator/index.d.ts +10 -0
- package/types/lib/validator/index.d.ts.map +1 -1
- package/types/lib/validator/reporters/json.d.ts.map +1 -1
package/lib/cli/managedBom.js
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
extname,
|
|
7
7
|
isAbsolute,
|
|
8
8
|
join,
|
|
9
|
+
relative,
|
|
9
10
|
resolve,
|
|
10
11
|
} from "node:path";
|
|
11
12
|
import process from "node:process";
|
|
@@ -101,11 +102,14 @@ import {
|
|
|
101
102
|
addRubyGemsDistributionUrls,
|
|
102
103
|
addRubyRuntimeComponent,
|
|
103
104
|
collectGemModuleNames,
|
|
105
|
+
collectProjectRubyDeclarations,
|
|
104
106
|
describeProjectGem,
|
|
105
107
|
enrichGemsFromLocalCache,
|
|
106
108
|
parseBundleConfig,
|
|
107
109
|
parseGemfileLockData,
|
|
108
110
|
parseGemspecData,
|
|
111
|
+
resolveProjectRuby,
|
|
112
|
+
toGemPurl,
|
|
109
113
|
} from "../ecosystems/rubyutils.js";
|
|
110
114
|
import { getTerraformRegistryMetadata } from "../ecosystems/terraformRegistry.js";
|
|
111
115
|
import {
|
|
@@ -143,6 +147,7 @@ import {
|
|
|
143
147
|
dosaiFailureReported,
|
|
144
148
|
dosaiMethodsSectionsArgument,
|
|
145
149
|
dosaiReportFileOmittedSections,
|
|
150
|
+
dosaiSlicesFileIsFresh,
|
|
146
151
|
dosaiToolComponents,
|
|
147
152
|
isDosaiDotnetLanguage,
|
|
148
153
|
normalizeDosaiServiceMap,
|
|
@@ -152,7 +157,11 @@ import {
|
|
|
152
157
|
import { addEvidenceForDotnet } from "../inventory/evidenceUtils.js";
|
|
153
158
|
import { resolvePluginBinary } from "../inventory/plugins.js";
|
|
154
159
|
import { nugetPurl, pypiBomRef } from "../inventory/purl.js";
|
|
155
|
-
import {
|
|
160
|
+
import { isInsideInstalledGem } from "../inventory/rubyBuildInfo.js";
|
|
161
|
+
import {
|
|
162
|
+
classifyProbeResult,
|
|
163
|
+
parseGemfileLockBundlerVersion,
|
|
164
|
+
} from "../inventory/toolRequirements.js";
|
|
156
165
|
import { getPluginToolComponents } from "../managers/binary.js";
|
|
157
166
|
import { getTreeWithPlugin } from "../managers/piptree.js";
|
|
158
167
|
import {
|
|
@@ -1429,7 +1438,14 @@ export async function createRubyBom(path, options) {
|
|
|
1429
1438
|
if (typeof options.includeNodeModulesDir === "undefined" || options.deep) {
|
|
1430
1439
|
options.includeNodeModulesDir = true;
|
|
1431
1440
|
}
|
|
1432
|
-
|
|
1441
|
+
// RubyGems caches the specs it fetched from a source under ~/.cache/gem/specs
|
|
1442
|
+
// and ~/.gem/specs, Marshal-dumped into files named <gem>-<version>.gemspec.
|
|
1443
|
+
// Those describe what a source offered, not what is installed.
|
|
1444
|
+
const excludeList = (options.exclude || []).concat([
|
|
1445
|
+
"**/vendor/cache/**",
|
|
1446
|
+
"**/.cache/gem/specs/**",
|
|
1447
|
+
"**/.gem/specs/**",
|
|
1448
|
+
]);
|
|
1433
1449
|
const gemLockExcludeList = (options.exclude || []).concat([
|
|
1434
1450
|
"**/vendor/bundle/ruby/**/Gemfile.lock",
|
|
1435
1451
|
"**/test/data/**/Gemfile*.lock",
|
|
@@ -1455,6 +1471,12 @@ export async function createRubyBom(path, options) {
|
|
|
1455
1471
|
exclude: gemLockExcludeList,
|
|
1456
1472
|
},
|
|
1457
1473
|
);
|
|
1474
|
+
// An installed gem's own directory can hold its development Gemfile.lock,
|
|
1475
|
+
// nested gemspecs and manifests (rbs ships steep/Gemfile.lock, typeprof a
|
|
1476
|
+
// VS Code extension). They describe how the gem is developed, not what is
|
|
1477
|
+
// installed, and would add gems that are not there.
|
|
1478
|
+
const isGemInternalFile = (f) =>
|
|
1479
|
+
isInsideInstalledGem(f, safeExistsSync, path);
|
|
1458
1480
|
let gemspecFiles = getAllFiles(
|
|
1459
1481
|
path,
|
|
1460
1482
|
`${options.multiProject ? "**/" : ""}*.gemspec`,
|
|
@@ -1462,7 +1484,7 @@ export async function createRubyBom(path, options) {
|
|
|
1462
1484
|
...options,
|
|
1463
1485
|
exclude: excludeList,
|
|
1464
1486
|
},
|
|
1465
|
-
);
|
|
1487
|
+
).filter((f) => !isGemInternalFile(f));
|
|
1466
1488
|
let gemHome =
|
|
1467
1489
|
readEnvironmentVariable("CDXGEN_GEM_HOME") ||
|
|
1468
1490
|
readEnvironmentVariable("GEM_HOME");
|
|
@@ -1543,7 +1565,9 @@ export async function createRubyBom(path, options) {
|
|
|
1543
1565
|
...options,
|
|
1544
1566
|
exclude: gemLockExcludeList,
|
|
1545
1567
|
},
|
|
1546
|
-
);
|
|
1568
|
+
).filter((f) => !isGemInternalFile(f));
|
|
1569
|
+
// The lockfiles each Bundler release resolved
|
|
1570
|
+
const bundlerVersions = new Map();
|
|
1547
1571
|
if (gemLockFiles.length) {
|
|
1548
1572
|
for (const f of gemLockFiles) {
|
|
1549
1573
|
if (DEBUG_MODE) {
|
|
@@ -1551,6 +1575,15 @@ export async function createRubyBom(path, options) {
|
|
|
1551
1575
|
}
|
|
1552
1576
|
const gemLockData = readFileSync(f, { encoding: "utf-8" });
|
|
1553
1577
|
const retMap = await parseGemfileLockData(gemLockData, f, { gemHome });
|
|
1578
|
+
// Bundler is not listed among the specs, but runs every bundle: the
|
|
1579
|
+
// lockfile names the release that resolved it under BUNDLED WITH.
|
|
1580
|
+
const bundlerVersion = parseGemfileLockBundlerVersion(gemLockData);
|
|
1581
|
+
if (bundlerVersion) {
|
|
1582
|
+
bundlerVersions.set(bundlerVersion, [
|
|
1583
|
+
...(bundlerVersions.get(bundlerVersion) || []),
|
|
1584
|
+
f,
|
|
1585
|
+
]);
|
|
1586
|
+
}
|
|
1554
1587
|
if (retMap.pkgList?.length) {
|
|
1555
1588
|
pkgList = pkgList.concat(retMap.pkgList);
|
|
1556
1589
|
pkgList = trimComponents(pkgList);
|
|
@@ -1633,6 +1666,42 @@ export async function createRubyBom(path, options) {
|
|
|
1633
1666
|
options,
|
|
1634
1667
|
));
|
|
1635
1668
|
}
|
|
1669
|
+
for (const [bundlerVersion, lockFiles] of [...bundlerVersions.entries()].sort(
|
|
1670
|
+
(a, b) => a[0].localeCompare(b[0]),
|
|
1671
|
+
)) {
|
|
1672
|
+
const purl = toGemPurl("bundler", bundlerVersion);
|
|
1673
|
+
const ref = decodeURIComponent(purl);
|
|
1674
|
+
if (pkgList.some((p) => p["bom-ref"] === ref)) {
|
|
1675
|
+
continue;
|
|
1676
|
+
}
|
|
1677
|
+
pkgList.push({
|
|
1678
|
+
name: "bundler",
|
|
1679
|
+
version: bundlerVersion,
|
|
1680
|
+
purl,
|
|
1681
|
+
"bom-ref": ref,
|
|
1682
|
+
scope: "required",
|
|
1683
|
+
properties: [
|
|
1684
|
+
{ name: "cdx:gem:bundledWith", value: "true" },
|
|
1685
|
+
{ name: "internal:SrcFile", value: lockFiles.join(", ") },
|
|
1686
|
+
],
|
|
1687
|
+
evidence: {
|
|
1688
|
+
identity: [
|
|
1689
|
+
{
|
|
1690
|
+
field: "purl",
|
|
1691
|
+
confidence: 0.8,
|
|
1692
|
+
methods: [
|
|
1693
|
+
{
|
|
1694
|
+
technique: "manifest-analysis",
|
|
1695
|
+
confidence: 0.8,
|
|
1696
|
+
value: lockFiles.join(", "),
|
|
1697
|
+
},
|
|
1698
|
+
],
|
|
1699
|
+
},
|
|
1700
|
+
],
|
|
1701
|
+
},
|
|
1702
|
+
});
|
|
1703
|
+
rootList.push(ref);
|
|
1704
|
+
}
|
|
1636
1705
|
if (rootList.length) {
|
|
1637
1706
|
dependencies = mergeDependencies(
|
|
1638
1707
|
dependencies,
|
|
@@ -1737,18 +1806,76 @@ export async function createRubyBom(path, options) {
|
|
|
1737
1806
|
pkgList = await enrichGemsFromLocalCache(pkgList, { gemHome });
|
|
1738
1807
|
// The download URL of a gem from the public registry needs no network call
|
|
1739
1808
|
pkgList = addRubyGemsDistributionUrls(pkgList);
|
|
1740
|
-
//
|
|
1741
|
-
//
|
|
1742
|
-
//
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
) {
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1809
|
+
// The project and its gems declare the Ruby they run on; surface it as the
|
|
1810
|
+
// runtime they depend on. A pinned Ruby (Gemfile.lock, .ruby-version,
|
|
1811
|
+
// .tool-versions, mise, the Gemfile) is a version with a CPE, which every
|
|
1812
|
+
// spec version can carry. A bare range needs CycloneDX 1.7's versionRange
|
|
1813
|
+
// and isExternal. A container image ships its own Ruby, which the image
|
|
1814
|
+
// scan reads from the interpreter's files.
|
|
1815
|
+
if (!hasAnyProjectType(["oci"], options, false)) {
|
|
1816
|
+
// Each project of a multi-project scan pins its own Ruby
|
|
1817
|
+
const rootDir = resolve(path);
|
|
1818
|
+
const projectDirs = [rootDir];
|
|
1819
|
+
if (options.multiProject) {
|
|
1820
|
+
for (const f of [...gemLockFiles, ...gemFiles]) {
|
|
1821
|
+
const dir = dirname(resolve(f));
|
|
1822
|
+
if (!projectDirs.includes(dir)) {
|
|
1823
|
+
projectDirs.push(dir);
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1826
|
+
}
|
|
1827
|
+
const rubies = [];
|
|
1828
|
+
for (const dir of projectDirs) {
|
|
1829
|
+
const ruby = resolveProjectRuby(collectProjectRubyDeclarations(dir));
|
|
1830
|
+
if (!ruby) {
|
|
1831
|
+
continue;
|
|
1832
|
+
}
|
|
1833
|
+
if (dir !== rootDir && ruby.source) {
|
|
1834
|
+
ruby.source = relative(rootDir, join(dir, ruby.source)).replaceAll(
|
|
1835
|
+
"\\",
|
|
1836
|
+
"/",
|
|
1837
|
+
);
|
|
1838
|
+
}
|
|
1839
|
+
if (ruby.conflicts?.length) {
|
|
1840
|
+
console.log(
|
|
1841
|
+
`NOTE: The project in ${dir} declares more than one Ruby. The BOM records ${ruby.engine} ${ruby.version} from ${ruby.source}; also declared: ${ruby.conflicts.join(", ")}.`,
|
|
1842
|
+
);
|
|
1843
|
+
}
|
|
1844
|
+
rubies.push(ruby);
|
|
1845
|
+
}
|
|
1846
|
+
// One runtime per distinct pinned Ruby; the scanned directory's first
|
|
1847
|
+
const pinned = [];
|
|
1848
|
+
for (const ruby of rubies) {
|
|
1849
|
+
if (
|
|
1850
|
+
ruby.version &&
|
|
1851
|
+
!pinned.some(
|
|
1852
|
+
(other) =>
|
|
1853
|
+
other.engine === ruby.engine && other.version === ruby.version,
|
|
1854
|
+
)
|
|
1855
|
+
) {
|
|
1856
|
+
pinned.push(ruby);
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
const [primary, ...others] = pinned.length ? pinned : rubies.slice(0, 1);
|
|
1860
|
+
if (options.specVersion >= 1.7 || primary?.version) {
|
|
1861
|
+
({ pkgList, dependencies } = addRubyRuntimeComponent(
|
|
1862
|
+
pkgList,
|
|
1863
|
+
parentComponent,
|
|
1864
|
+
dependencies,
|
|
1865
|
+
primary,
|
|
1866
|
+
));
|
|
1867
|
+
}
|
|
1868
|
+
// The gems were linked to the first; the others hang off the project
|
|
1869
|
+
for (const ruby of others) {
|
|
1870
|
+
let extra;
|
|
1871
|
+
({ pkgList: extra, dependencies } = addRubyRuntimeComponent(
|
|
1872
|
+
[],
|
|
1873
|
+
parentComponent,
|
|
1874
|
+
dependencies,
|
|
1875
|
+
ruby,
|
|
1876
|
+
));
|
|
1877
|
+
pkgList = pkgList.concat(extra);
|
|
1878
|
+
}
|
|
1752
1879
|
}
|
|
1753
1880
|
return buildBomNSData(options, pkgList, "gem", {
|
|
1754
1881
|
src: path,
|
|
@@ -2379,9 +2506,13 @@ export async function createCsharpBom(path, options) {
|
|
|
2379
2506
|
// Anything else needs only the sections cdxgen reads, so dosai
|
|
2380
2507
|
// leaves the rest out (Metadata.OmittedSections names it).
|
|
2381
2508
|
const willRunEvinse = runsEvidenceAnalysis(options);
|
|
2382
|
-
// Reuse an existing slice as-is, with
|
|
2509
|
+
// Reuse an existing slice as-is, with two exceptions. A trimmed file
|
|
2383
2510
|
// (an earlier --deep run left it behind) is regenerated full before
|
|
2384
|
-
// an evidence run uses it, so dosai still runs once per scan.
|
|
2511
|
+
// an evidence run uses it, so dosai still runs once per scan. A slice
|
|
2512
|
+
// older than the sources it describes is regenerated for every run:
|
|
2513
|
+
// it holds the occurrences of the sources as they were when it was
|
|
2514
|
+
// written, so reusing one keeps occurrences of call sites that no
|
|
2515
|
+
// longer exist (issue 4675).
|
|
2385
2516
|
let reuseExisting = safeExistsSync(slicesFile);
|
|
2386
2517
|
if (reuseExisting && willRunEvinse) {
|
|
2387
2518
|
const omitted = dosaiReportFileOmittedSections(slicesFile);
|
|
@@ -2394,6 +2525,17 @@ export async function createCsharpBom(path, options) {
|
|
|
2394
2525
|
reuseExisting = false;
|
|
2395
2526
|
}
|
|
2396
2527
|
}
|
|
2528
|
+
if (
|
|
2529
|
+
reuseExisting &&
|
|
2530
|
+
!dosaiSlicesFileIsFresh(slicesFile, path, options)
|
|
2531
|
+
) {
|
|
2532
|
+
if (DEBUG_MODE) {
|
|
2533
|
+
console.log(
|
|
2534
|
+
`The existing dosai methods slice "${slicesFile}" is older than the sources it describes; regenerating it.`,
|
|
2535
|
+
);
|
|
2536
|
+
}
|
|
2537
|
+
reuseExisting = false;
|
|
2538
|
+
}
|
|
2397
2539
|
// Create the slices file if it doesn't exist
|
|
2398
2540
|
if (!reuseExisting) {
|
|
2399
2541
|
thoughtLog(
|
|
@@ -2425,7 +2567,7 @@ export async function createCsharpBom(path, options) {
|
|
|
2425
2567
|
}
|
|
2426
2568
|
} else if (DEBUG_MODE) {
|
|
2427
2569
|
console.log(
|
|
2428
|
-
`Reusing the existing dosai methods slice "${slicesFile}"
|
|
2570
|
+
`Reusing the existing dosai methods slice "${slicesFile}", which is newer than the sources it describes. The slice is still not checked against the current --exclude patterns; delete the file to force a fresh run.`,
|
|
2429
2571
|
);
|
|
2430
2572
|
}
|
|
2431
2573
|
pkgList = addEvidenceForDotnet(pkgList, slicesFile, {
|
package/lib/cli/nativeBom.js
CHANGED
|
@@ -45,7 +45,12 @@ import {
|
|
|
45
45
|
emptyCppBuildContext,
|
|
46
46
|
resolveCppBuildContext,
|
|
47
47
|
} from "../ecosystems/cppBuildContext.js";
|
|
48
|
-
import {
|
|
48
|
+
import {
|
|
49
|
+
getCppModules,
|
|
50
|
+
hasCppSources,
|
|
51
|
+
installedVcpkgPorts,
|
|
52
|
+
parseVcpkgManifest,
|
|
53
|
+
} from "../ecosystems/cppEvidence.js";
|
|
49
54
|
import {
|
|
50
55
|
getCratesMetadata,
|
|
51
56
|
getSwiftPackageMetadata,
|
|
@@ -132,6 +137,10 @@ import { resolveZigGraph } from "../ecosystems/zigResolver.js";
|
|
|
132
137
|
import { cmakeBuildDirCandidates } from "../inventory/cmakeBuildDirs.js";
|
|
133
138
|
import { mergeDependencies, trimComponents } from "../inventory/depsUtils.js";
|
|
134
139
|
import { convertOSQueryResults } from "../inventory/evidenceUtils.js";
|
|
140
|
+
import {
|
|
141
|
+
clojureMirrorArgs,
|
|
142
|
+
leiningenMirrorArgs,
|
|
143
|
+
} from "../inventory/mavenCentralMirror.js";
|
|
135
144
|
import { applyPurl, nixBomRef, tryBuildPurl } from "../inventory/purl.js";
|
|
136
145
|
import {
|
|
137
146
|
classifyProbeResult,
|
|
@@ -1420,6 +1429,16 @@ export async function createDartBom(path, options) {
|
|
|
1420
1429
|
pkgList = pkgList.concat(retMap.pkgList);
|
|
1421
1430
|
}
|
|
1422
1431
|
if (retMap?.rootList?.length) {
|
|
1432
|
+
// A pubspec.lock read without its pubspec.yaml still names the
|
|
1433
|
+
// project's direct dependencies; the project is then named after the
|
|
1434
|
+
// directory that holds the lock file.
|
|
1435
|
+
if (!parentComponent) {
|
|
1436
|
+
parentComponent = createDefaultParentComponent(
|
|
1437
|
+
dirname(f),
|
|
1438
|
+
"generic",
|
|
1439
|
+
options,
|
|
1440
|
+
);
|
|
1441
|
+
}
|
|
1423
1442
|
const thisParentDependsOn = [
|
|
1424
1443
|
{
|
|
1425
1444
|
ref: parentComponent["bom-ref"],
|
|
@@ -1806,10 +1825,33 @@ export function createCppBom(path, options) {
|
|
|
1806
1825
|
// The need for java >= 21 with atom is causing confusions since there could be C projects
|
|
1807
1826
|
// inside of other project types. So we currently limit this analyis only when -t argument
|
|
1808
1827
|
// is used.
|
|
1809
|
-
if (
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1828
|
+
if (!isImageScan && options.createMultiXBom && !options.deep) {
|
|
1829
|
+
// The atom analysis below is skipped in this mode, but a vcpkg manifest is
|
|
1830
|
+
// read without running anything, and its declared ports are as much a
|
|
1831
|
+
// part of the project as CMake's find_package names.
|
|
1832
|
+
const manifest = parseVcpkgManifest(path, {
|
|
1833
|
+
installedPorts: installedVcpkgPorts(path, options),
|
|
1834
|
+
isListed: (name) =>
|
|
1835
|
+
pkgList.some(
|
|
1836
|
+
(p) => !p.group && p.name?.toLowerCase() === `${name}`.toLowerCase(),
|
|
1837
|
+
),
|
|
1838
|
+
});
|
|
1839
|
+
if (manifest.pkgList.length) {
|
|
1840
|
+
pkgList = pkgList.concat(manifest.pkgList);
|
|
1841
|
+
if (!parentComponent && manifest.parentComponent) {
|
|
1842
|
+
parentComponent = manifest.parentComponent;
|
|
1843
|
+
}
|
|
1844
|
+
if (parentComponent?.["bom-ref"]) {
|
|
1845
|
+
dependencies = mergeDependencies(dependencies, [
|
|
1846
|
+
{
|
|
1847
|
+
ref: parentComponent["bom-ref"],
|
|
1848
|
+
dependsOn: manifest.pkgList.map((p) => p["bom-ref"]),
|
|
1849
|
+
},
|
|
1850
|
+
]);
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
if (!isImageScan && (!options.createMultiXBom || options.deep)) {
|
|
1813
1855
|
let osPkgsList = [];
|
|
1814
1856
|
// Case 1: Development libraries installed in this OS environment might be used for build
|
|
1815
1857
|
// We collect OS packages with the word dev in the name using osquery here
|
|
@@ -1967,6 +2009,10 @@ export function createClojureBom(path, options) {
|
|
|
1967
2009
|
if (readEnvironmentVariable("LEIN_ARGS")) {
|
|
1968
2010
|
LEIN_ARGS = readEnvironmentVariable("LEIN_ARGS").split(" ");
|
|
1969
2011
|
}
|
|
2012
|
+
const leinProjectContent = safeExistsSync(leinFiles[0])
|
|
2013
|
+
? readFileSync(leinFiles[0], { encoding: "utf-8" })
|
|
2014
|
+
: undefined;
|
|
2015
|
+
LEIN_ARGS = leiningenMirrorArgs(LEIN_ARGS, leinProjectContent);
|
|
1970
2016
|
// `lein deps :tree-data` evaluates project.clj, which is a Clojure
|
|
1971
2017
|
// program, so it belongs to the dependency-tooling surface disabled by
|
|
1972
2018
|
// --no-install-deps and the pre-build lifecycle.
|
|
@@ -2058,6 +2104,7 @@ export function createClojureBom(path, options) {
|
|
|
2058
2104
|
if (readEnvironmentVariable("CLJ_ARGS")) {
|
|
2059
2105
|
CLJ_ARGS = readEnvironmentVariable("CLJ_ARGS").split(" ");
|
|
2060
2106
|
}
|
|
2107
|
+
CLJ_ARGS = clojureMirrorArgs(CLJ_ARGS);
|
|
2061
2108
|
for (const f of ednFiles) {
|
|
2062
2109
|
const basePath = dirname(f);
|
|
2063
2110
|
console.log("Executing", CLJ_CMD, "in", basePath);
|