Code review comment: I am not there yet, but to make it more consistent and simple, my intent is to go toward atomic operations (without having to deal with the writer close/save from outside): - create (directly with or without extensions) - add extension(s) - remove extension(s)  Using the same writer would make it more performant when doing multiple of those, but I guess there is no use case for it.  One good example of the risk of having this close/save handled externally is that (as I did without knowing) having multiple writer and closing the one without the modification after ending up with reseting the modification 😅  WDYT?

Code under review:
public QuarkusCommandOutcome execute(QuarkusCommandInvocation invocation) throws QuarkusCommandException {
        final ProjectWriter projectWriter = new FileProjectWriter(
                invocation.getQuarkusProject().getProjectFolderPath().toFile());
        if (!projectWriter.init()) {
            return QuarkusCommandOutcome.failure();
        }

        final QuarkusPlatformDescriptor platformDescr = invocation.getPlatformDescriptor();
        invocation.setValue(BOM_GROUP_ID, platformDescr.getBomGroupId());
        invocation.setValue(BOM_ARTIFACT_ID, platformDescr.getBomArtifactId());
        invocation.setValue(QUARKUS_VERSION, platformDescr.getQuarkusVersion());
        invocation.setValue(BOM_VERSION, platformDescr.getBomVersion());

        final Properties quarkusProps = ToolsUtils.readQuarkusProperties(platformDescr);
        quarkusProps.forEach((k, v) -> invocation.setValue(k.toString().replace("-", "_"), v.toString()));

        try (BuildFile buildFile = invocation.getBuildFile()) {
            String className = invocation.getStringValue(CLASS_NAME);
            if (className != null) {
                className = invocation.getValue(SOURCE_TYPE, SourceType.JAVA).stripExtensionFrom(className);
                int idx = className.lastIndexOf('.');
                if (idx >= 0) {
                    String pkgName = invocation.getStringValue(PACKAGE_NAME);
                    if (pkgName == null) {
                        invocation.setValue(PACKAGE_NAME, className.substring(0, idx));
                    }
                    className = className.substring(idx + 1);
                }
                invocation.setValue(CLASS_NAME, className);
            }
            ProjectGeneratorRegistry.get(BasicRestProjectGenerator.NAME).generate(projectWriter, invocation);

            
            buildFile.completeFile(invocation.getStringValue(PROJECT_GROUP_ID),
                    invocation.getStringValue(PROJECT_ARTIFACT_ID),
                    invocation.getStringValue(PROJECT_VERSION),
                    platformDescr, quarkusProps);
        } catch (IOException e) {
            throw new QuarkusCommandException("Failed to create project", e);
        }
        return QuarkusCommandOutcome.success();
    }

Line commented on: invocation.getQuarkusProject().getProjectFolderPath().toFile());

Revised code:
public QuarkusCommandOutcome execute(QuarkusCommandInvocation invocation) throws QuarkusCommandException {
        final ProjectWriter projectWriter = new FileProjectWriter(
                invocation.getQuarkusProject().getProjectFolderPath().toFile());
        if (!projectWriter.init()) {
            return QuarkusCommandOutcome.failure();
        }

        final QuarkusPlatformDescriptor platformDescr = invocation.getPlatformDescriptor();
        invocation.setValue(BOM_GROUP_ID, platformDescr.getBomGroupId());
        invocation.setValue(BOM_ARTIFACT_ID, platformDescr.getBomArtifactId());
        invocation.setValue(QUARKUS_VERSION, platformDescr.getQuarkusVersion());
        invocation.setValue(BOM_VERSION, platformDescr.getBomVersion());

        final Properties quarkusProps = ToolsUtils.readQuarkusProperties(platformDescr);
        quarkusProps.forEach((k, v) -> invocation.setValue(k.toString().replace("-", "_"), v.toString()));

        try (BuildFile buildFile = invocation.getBuildFile()) {
            String className = invocation.getStringValue(CLASS_NAME);
            if (className != null) {
                className = invocation.getValue(SOURCE_TYPE, SourceType.JAVA).stripExtensionFrom(className);
                int idx = className.lastIndexOf('.');
                if (idx >= 0) {
                    String pkgName = invocation.getStringValue(PACKAGE_NAME);
                    if (pkgName == null) {
                        invocation.setValue(PACKAGE_NAME, className.substring(0, idx));
                    }
                    className = className.substring(idx + 1);
                }
                invocation.setValue(CLASS_NAME, className);
            }
            ProjectGeneratorRegistry.get(BasicRestProjectGenerator.NAME).generate(projectWriter, invocation);

            
            buildFile.completeFile(invocation.getStringValue(PROJECT_GROUP_ID),
                    invocation.getStringValue(PROJECT_ARTIFACT_ID),
                    invocation.getStringValue(PROJECT_VERSION),
                    platformDescr, quarkusProps);
        } catch (IOException e) {
            throw new QuarkusCommandException("Failed to create project", e);
        }
        return QuarkusCommandOutcome.success();
    }