@@ -0,0 +1,1475 @@
+package com.github.sormuras.bach.internal;%0A%0Aimport java.lang.module.ModuleDescriptor;%0Aimport java.util.Optional;%0Aimport java.util.spi.ToolProvider;%0A%0Apublic class ToolProviders %7B%0A%0A  public static String describe(ToolProvider provider) %7B%0A    var name = provider.name();%0A    var module = provider.getClass().getModule();%0A    var by =%0A        Optional.ofNullable(module.getDescriptor())%0A            .map(ModuleDescriptor::toNameAndVersion)%0A            .orElse(module.toString());%0A    var info =%0A        switch (name) %7B%0A          case %22jar%22 -%3E %22Create an archive for classes and resources, and update or restore them%22;%0A          case %22javac%22 -%3E %22Read Java class and interface definitions and compile them into classes%22;%0A          case %22javadoc%22 -%3E %22Generate HTML pages of API documentation from Java source files%22;%0A          case %22javap%22 -%3E %22Disassemble one or more class files%22;%0A          case %22jdeps%22 -%3E %22Launch the Java class dependency analyzer%22;%0A          case %22jlink%22 -%3E %22Assemble and optimize a set of modules into a custom runtime image%22;%0A          case %22jmod%22 -%3E %22Create JMOD files and list the content of existing JMOD files%22;%0A          case %22jpackage%22 -%3E %22Package a self-contained Java application%22;%0A          case %22junit%22 -%3E %22Launch the JUnit Platform%22;%0A          default -%3E provider.toString();%0A        %7D;%0A    return %22%25s (provided by module %25s)%5Cn%25s%22.formatted(name, by, info.indent(2)).trim();%0A  %7D%0A%0A  /** Hidden default constructor. */%0A  private ToolProviders() %7B%7D%0A%7D%0A

Add tool provider related helper