@@ -322,6 +322,11 @@ func enhanceSBOM(cfg *config.Config, mgr *manager.Manager, cmd *cobra.Command) e
322322
323323// resolveSBOMTool finds the tool binary in goenv-managed paths
324324func resolveSBOMTool (cfg * config.Config , tool string ) (string , error ) {
325+ sbomTools := map [string ]string {
326+ "cyclonedx-gomod" : "github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod" ,
327+ "syft" : "github.com/anchore/syft/cmd/syft" ,
328+ }
329+
325330 // Check host-specific bin directory first using consolidated utility
326331 hostBin := cfg .HostBinDir ()
327332 if toolPath , err := utils .FindExecutable (hostBin , tool ); err == nil {
@@ -333,14 +338,37 @@ func resolveSBOMTool(cfg *config.Config, tool string) (string, error) {
333338 return path , nil
334339 }
335340
341+ goTool , ok := sbomTools [tool ]
342+ if ! ok {
343+ return "" , fmt .Errorf ("unsupported SBOM tool: %s" , tool )
344+ }
345+
346+ goTool = fmt .Sprintf ("%s@latest" , goTool )
347+
348+ fmt .Printf ("goenv: %s not found in goenv-managed paths or system PATH. Attempting to install...\n " , tool )
349+
350+ cmd := exec .Command ("goenv" , "tools" , "install" , goTool )
351+ cmd .Stdout = os .Stdout
352+ cmd .Stderr = os .Stderr
353+
354+ err := cmd .Run ()
355+ if err == nil {
356+ // Retry finding the tool after installation; it will be rehashed into the shims automatically
357+ if toolPath , err := utils .FindExecutable (hostBin , tool ); err == nil {
358+ return toolPath , nil
359+ }
360+ } else {
361+ return "" , fmt .Errorf ("goenv: Failed to install %s: %w" , tool , err )
362+ }
363+
336364 // Tool not found - provide actionable error
337365 return "" , fmt .Errorf (`%s not found
338366
339367To install:
340- goenv tools install %s@latest
368+ goenv tools install %s
341369
342370Or install system-wide with:
343- go install <package-path> ` , tool , tool )
371+ go install %s ` , tool , goTool , goTool )
344372}
345373
346374// buildCycloneDXCommand builds the cyclonedx-gomod command
0 commit comments