@Override
    public List<String> tabComplete(LuckPermsPlugin plugin, Sender sender, ArgumentList args) {
        return TabCompleter.create()
                .at(0, CompletionSupplier.startsWith(() -> this.children.stream()
                        .filter(s -> s.isAuthorized(sender, this.type))
                        .map(s -> s.getName().toLowerCase(Locale.ROOT))
                ))
                .from(1, partial -> this.children.stream()
                        .filter(s -> s.isAuthorized(sender, this.type))
                        .filter(s -> s.getName().equalsIgnoreCase(args.get(0)))
                        .findFirst()
                        .map(cmd -> cmd.tabComplete(plugin, sender, args.subList(1, args.size())))
                        .orElse(Collections.emptyList())
                )
                .complete(args);
    }
A shared main command. Shared meaning it can apply to both users and groups.
This extends sub command as they're actually sub commands of the main user/group commands.
@param <T>
common/src/main/java/me/lucko/luckperms/common/command/abstraction/GenericParentCommand.java