Repository: quarkusio/quarkus
Issue: CLI help message contains text for registry add command instead of extension add command

### Describe the bug

CLI help message contains text for registry add command instead of extension add command.

There is no `add` command listed under `registry`.

```
jbang app install --force --name qss ~/.m2/repository/io/quarkus/quarkus-cli/999-SNAPSHOT/quarkus-cli-999-SNAPSHOT-runner.jar

qss --help
...
  extension, ext      List, add, and remove extensions of an existing project.
    list, ls          List platforms and extensions.
    categories, cat   List extension categories.
    add               Add a Quarkus extension registry to the registry client
                        configuration
    remove, rm        Remove extension(s) from this project.
  registry            Manage extension registries.
    list              List enabled Quarkus registries
    remove            Remove a Quarkus extension registry from the registry
                        client configuration
  version             Display version information.
  completion          bash/zsh completion:  source <(quarkus completion)
```



### Expected behavior

`add` sub-command is listed for both `extension` and `registry` commands

### Actual behavior

`add` sub-command is listed just for `registry` command but with text for `add` sub-command for `extension` command.

### How to Reproduce?

`qss --help` or `quarkus --help`

### Output of `uname -a` or `ver`

macOS BigSur

### Output of `java -version`

Java 11

### GraalVM version (if different from Java)

_No response_

### Quarkus version or git rev

main

### Build tool (ie. output of `mvnw --version` or `gradlew --version`)

_No response_

### Additional information

Running `qss ext --help` and `qss registry --help` gives correct info.

As if cli had hard time to handle two different sub-commands with the same `name = "add"`.
When I changed value of `name` attribute to `rs` in `RegistryAddCommand`, `qss --help` message got rendered properly.

Changed files:
devtools/cli/src/main/java/io/quarkus/cli/Registry.java, devtools/cli/src/main/java/io/quarkus/cli/RegistryAddCommand.java, devtools/cli/src/main/java/io/quarkus/cli/ProjectExtensions.java, devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java, devtools/cli/src/main/java/io/quarkus/cli/RegistryRemoveCommand.java, devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java

diff --git a/devtools/cli/src/main/java/io/quarkus/cli/ProjectExtensions.java b/devtools/cli/src/main/java/io/quarkus/cli/ProjectExtensions.java
index 39d60cba957..a166379e57d 100644
--- a/devtools/cli/src/main/java/io/quarkus/cli/ProjectExtensions.java
+++ b/devtools/cli/src/main/java/io/quarkus/cli/ProjectExtensions.java
@@ -10,7 +10,7 @@
 import picocli.CommandLine.Unmatched;
 
 @CommandLine.Command(name = "extension", aliases = {
-        "ext" }, sortOptions = false, mixinStandardHelpOptions = false, header = "List, add, and remove extensions of an existing project.", subcommands = {
+        "ext" }, sortOptions = false, mixinStandardHelpOptions = false, header = "Configure extensions of an existing project.", subcommands = {
                 ProjectExtensionsList.class, ProjectExtensionsCategories.class,
                 ProjectExtensionsAdd.class,
                 ProjectExtensionsRemove.class }, headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", optionListHeading = "Options:%n")
diff --git a/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java b/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java
index 3510185f290..346915aacb4 100644
--- a/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java
+++ b/devtools/cli/src/main/java/io/quarkus/cli/QuarkusCli.java
@@ -3,7 +3,6 @@
 import static picocli.CommandLine.Model.UsageMessageSpec.SECTION_KEY_COMMAND_LIST;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.concurrent.Callable;
 
@@ -94,22 +93,28 @@ public String render(Help help) {
             if (spec.subcommands().isEmpty()) {
                 return "";
             }
-            Map<String, String> tableElements = new LinkedHashMap<>();
-            addHierarchy(spec.subcommands().values(), tableElements, "");
-            return help.createTextTable(tableElements).toString();
+
+            Help.Column commands = new Help.Column(24, 2, CommandLine.Help.Column.Overflow.SPAN);
+            Help.Column descriptions = new Help.Column(spec.usageMessage().width() - 24, 2,
+                    CommandLine.Help.Column.Overflow.WRAP);
+            Help.TextTable textTable = Help.TextTable.forColumns(help.colorScheme(), commands, descriptions);
+            textTable.setAdjustLineBreaksForWideCJKCharacters(spec.usageMessage().adjustLineBreaksForWideCJKCharacters());
+
+            addHierarchy(spec.subcommands().values(), textTable, "");
+            return textTable.toString();
         }
 
-        private void addHierarchy(Collection<CommandLine> collection, Map<String, String> tableElements,
+        private void addHierarchy(Collection<CommandLine> collection, Help.TextTable textTable,
                 String indent) {
             collection.stream().distinct().forEach(subcommand -> {
                 // create comma-separated list of command name and aliases
                 String names = String.join(", ", subcommand.getCommandSpec().names());
                 String description = description(subcommand.getCommandSpec().usageMessage());
-                tableElements.put(indent + names, description);
+                textTable.addRowValues(indent + names, description);
 
                 Map<String, CommandLine> subcommands = subcommand.getSubcommands();
                 if (!subcommands.isEmpty()) {
-                    addHierarchy(subcommands.values(), tableElements, indent + "  ");
+                    addHierarchy(subcommands.values(), textTable, indent + "  ");
                 }
             });
         }
diff --git a/devtools/cli/src/main/java/io/quarkus/cli/Registry.java b/devtools/cli/src/main/java/io/quarkus/cli/Registry.java
index f88d0e04c8d..d46ec57f0a2 100644
--- a/devtools/cli/src/main/java/io/quarkus/cli/Registry.java
+++ b/devtools/cli/src/main/java/io/quarkus/cli/Registry.java
@@ -7,7 +7,7 @@
 import picocli.CommandLine.ParseResult;
 import picocli.CommandLine.Unmatched;
 
-@CommandLine.Command(name = "registry", sortOptions = false, mixinStandardHelpOptions = false, header = "Manage extension registries.", subcommands = {
+@CommandLine.Command(name = "registry", sortOptions = false, mixinStandardHelpOptions = false, header = "Configure Quarkus registry client", subcommands = {
         RegistryAddCommand.class,
         RegistryListCommand.class,
         RegistryRemoveCommand.class }, headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", optionListHeading = "%nOptions:%n")
diff --git a/devtools/cli/src/main/java/io/quarkus/cli/RegistryAddCommand.java b/devtools/cli/src/main/java/io/quarkus/cli/RegistryAddCommand.java
index f1e6b6c31a3..73194c506c8 100644
--- a/devtools/cli/src/main/java/io/quarkus/cli/RegistryAddCommand.java
+++ b/devtools/cli/src/main/java/io/quarkus/cli/RegistryAddCommand.java
@@ -16,8 +16,8 @@
 import io.quarkus.registry.config.json.RegistriesConfigMapperHelper;
 import picocli.CommandLine;
 
-@CommandLine.Command(name = "add", sortOptions = false, showDefaultValues = true, mixinStandardHelpOptions = false, header = "Add a Quarkus extension registry to the registry client configuration", description = "%n"
-        + "This command will add a Quarkus extension registry to the registry client configuration unless it's already present", headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", parameterListHeading = "%n", optionListHeading = "Options:%n")
+@CommandLine.Command(name = "add", sortOptions = false, showDefaultValues = true, mixinStandardHelpOptions = false, header = "Add a Quarkus extension registry", description = "%n"
+        + "This command will add a Quarkus extension registry to the registry client configuration unless it's already present.", headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", parameterListHeading = "%n", optionListHeading = "Options:%n")
 public class RegistryAddCommand extends BaseRegistryCommand {
 
     @CommandLine.Mixin
diff --git a/devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java b/devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java
index 96872de2fba..79879122707 100644
--- a/devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java
+++ b/devtools/cli/src/main/java/io/quarkus/cli/RegistryListCommand.java
@@ -14,7 +14,7 @@
 import picocli.CommandLine;
 
 @CommandLine.Command(name = "list", sortOptions = false, showDefaultValues = true, mixinStandardHelpOptions = false, header = "List enabled Quarkus registries", description = "%n"
-        + "This command will list currently enabled Quarkus extension registries", headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", parameterListHeading = "%n", optionListHeading = "Options:%n")
+        + "This command will list currently enabled Quarkus extension registries.", headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", parameterListHeading = "%n", optionListHeading = "Options:%n")
 public class RegistryListCommand extends BaseRegistryCommand {
 
     @CommandLine.Mixin
diff --git a/devtools/cli/src/main/java/io/quarkus/cli/RegistryRemoveCommand.java b/devtools/cli/src/main/java/io/quarkus/cli/RegistryRemoveCommand.java
index a3a3a649f19..6d159ce28e5 100644
--- a/devtools/cli/src/main/java/io/quarkus/cli/RegistryRemoveCommand.java
+++ b/devtools/cli/src/main/java/io/quarkus/cli/RegistryRemoveCommand.java
@@ -15,8 +15,8 @@
 import io.quarkus.registry.config.json.RegistriesConfigMapperHelper;
 import picocli.CommandLine;
 
-@CommandLine.Command(name = "remove", sortOptions = false, showDefaultValues = true, mixinStandardHelpOptions = false, header = "Remove a Quarkus extension registry from the registry client configuration", description = "%n"
-        + "This command will remove a Quarkus extension registry from the registry client configuration", headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", parameterListHeading = "%n", optionListHeading = "Options:%n")
+@CommandLine.Command(name = "remove", sortOptions = false, showDefaultValues = true, mixinStandardHelpOptions = false, header = "Remove a Quarkus extension registry", description = "%n"
+        + "This command will remove a Quarkus extension registry from the registry client configuration.", headerHeading = "%n", commandListHeading = "%nCommands:%n", synopsisHeading = "%nUsage: ", parameterListHeading = "%n", optionListHeading = "Options:%n")
 public class RegistryRemoveCommand extends BaseRegistryCommand {
 
     @CommandLine.Mixin