@Override
    public boolean process(
            final @NonNull Set<? extends TypeElement> annotations,
            final @NonNull RoundEnvironment roundEnv
    ) {
        final List<String> validTypes = new ArrayList<>();

        final Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(CommandContainer.class);
        if (elements.isEmpty()) {
            return false; // Nothing to process...
        }

        for (final Element element : elements) {
            if (element.getKind() != ElementKind.CLASS) {
                this.processingEnv.getMessager().printMessage(
                        Diagnostic.Kind.ERROR,
                        String.format(
                                "@Command found on unsupported element type '%s' (%s)",
                                element.getKind().name(),
                                element.getSimpleName().toString()
                        ),
                        element
                );
                return false;
            }

            element.accept(new CommandContainerVisitor(this.processingEnv, validTypes), null);
        }

        for (final String type : validTypes) {
            this.processingEnv.getMessager().printMessage(
                    Diagnostic.Kind.NOTE,
                    String.format(
                            "Found valid @CommandContainer-annotated class: %s",
                            type
                    )
            );
        }
        this.writeCommandFile(validTypes);

        // https://errorprone.info/bugpattern/DoNotClaimAnnotations
        return false;
    }
The file in which all command container names are stored.
cloud-annotations/src/main/java/org/incendo/cloud/annotations/processing/CommandContainerProcessor.java