Skip to content

Extract RefitterRunner as shared generation workflow#1166

Merged
christianhelle merged 8 commits into
mainfrom
extract-refitter-runner
Jun 20, 2026
Merged

Extract RefitterRunner as shared generation workflow#1166
christianhelle merged 8 commits into
mainfrom
extract-refitter-runner

Conversation

@christianhelle

@christianhelle christianhelle commented Jun 20, 2026

Copy link
Copy Markdown
Owner

Summary

Extracts a shared \RefitterRunner\ class into \Refitter.Core\ that encapsulates the complete generation workflow, then refactors all three distribution forms (CLI, MSBuild, Source Generator) as thin adapters around it.

Changes

Core Library (\Refitter.Core)

  • *\RefitterRunner.RunAsync()* — new shared entry point that handles: generator creation, code generation (single/multi-file), output planning, validation, warning detection, and file writing
  • *\RunResult* — result record with \GeneratedFiles, \Warnings, \Diagnostics, \Elapsed, \ExitCode, \Exception\
  • *\RunnerDiagnostic* — (Message, IsError) record for validation errors
  • *\Warning* — (Title, Description) record, moved from CLI project
  • *\IValidator* — interface for OpenAPI spec validation
  • *\OpenApiValidatorAdapter* — wraps \OpenApiValidator\ behind \IValidator\

CLI (\Refitter)

  • \GenerationOrchestrator\ delegates to \RefitterRunner, removing inline generation/validation logic
  • Removed \FormatFileSize\ helper and its tests (no longer needed)

MSBuild (\Refitter.MSBuild)

  • \RefitterGenerateTask.ProcessRefitterFile\ delegates to \RefitterRunner.RunAsync()\
  • Uses \MsBuildFileWriter\ + \OpenApiValidatorAdapter\

Source Generator (\Refitter.SourceGenerator)

  • \GenerateCode\ delegates to \RefitterRunner.RunAsync()\
  • Sets default \OutputFilename\ to source generator convention ({refitterName}.g.cs)
  • Removes inline \GetOutputPath\ and \WriteGeneratedFile\ methods
  • Maps \RunResult\ warnings/diagnostics back to Roslyn diagnostics

Testing

  • \RefitterRunnerTests\ — 10 unit tests covering: basic generation, writer integration, validator integration, warnings (IsoDateFormat, deprecated Polly), multiple files, error handling, validation errors, multiple OpenAPI paths
  • All 2359 existing tests pass

Summary by CodeRabbit

  • Refactor
    • Standardized the code generation workflow across CLI, MSBuild, and source generator so behavior and outputs are consistent.
    • Improved OpenAPI validation handling and error reporting, including surfaced configuration warnings and the non-fatal “all paths filtered” notice.
  • New Features
    • Added a reusable generation-run result that includes planned files, warnings, diagnostics, and timing.
  • Tests
    • Added a dedicated test suite covering validation, writer behavior, warning detection, success and failure paths.

…d Warning types to Refitter.Core

- RefitterRunner: new class encapsulating the shared generation workflow
- RunResult: result record with generated files, warnings, diagnostics, elapsed, exit code
- RunnerDiagnostic: validation/error diagnostic record
- IValidator: interface for OpenAPI validation (implemented by OpenApiValidatorAdapter)
- Warning: moved to Refitter.Core for cross-form reuse
Tests cover: basic generation, file writer integration, validator integration,
warning detection (UseIsoDateFormat, deprecated Polly), multiple files mode,
error handling, validation errors, and multiple OpenAPI paths.
- GenerationOrchestrator reduced to thin CLI adapter: parses CLI settings,
  creates writer/validator, calls runner, formats results via IGenerationReporter
- Warning record moved from CLI project to Refitter.Core
- Removed FormatFileSize tests (private method deleted)
- Added XML doc comments to all new public types
- All 2359 tests pass
@coderabbitai

coderabbitai Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 91b4490f-6c0b-466d-99a8-291fffc4f3cd

📥 Commits

Reviewing files that changed from the base of the PR and between 93eb7ee and 5dc492c.

📒 Files selected for processing (2)
  • src/Refitter.Core/RefitterRunner.cs
  • src/Refitter.Tests/RefitterRunnerTests.cs
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/Refitter.Core/RefitterRunner.cs
  • src/Refitter.Tests/RefitterRunnerTests.cs

📝 Walkthrough

Walkthrough

Introduces RefitterRunner in Refitter.Core as a shared orchestration layer alongside new public contracts (IValidator, RunResult, RunnerDiagnostic, Warning) and OpenApiValidatorAdapter. The CLI GenerationOrchestrator, MSBuild RefitterGenerateTask, and source generator RefitterSourceGenerator are each refactored to delegate generation, validation, and file-writing to RefitterRunner.RunAsync. Warning is moved from IGenerationReporter into Refitter.Core.

Changes

RefitterRunner Orchestration Core

Layer / File(s) Summary
Core data contracts and IValidator interface
src/Refitter.Core/Abstractions/IValidator.cs, src/Refitter.Core/RunnerDiagnostic.cs, src/Refitter.Core/Warning.cs, src/Refitter.Core/RunResult.cs, src/Refitter/IGenerationReporter.cs
Adds IValidator, RunnerDiagnostic, Warning, and RunResult as the shared public surface; removes the Warning record from IGenerationReporter.
RefitterRunner and OpenApiValidatorAdapter implementation
src/Refitter.Core/Validation/OpenApiValidatorAdapter.cs, src/Refitter.Core/RefitterRunner.cs
OpenApiValidatorAdapter wraps OpenApiValidator behind IValidator; RefitterRunner.RunAsync orchestrates generation, output planning, optional writing, per-path validation, warning detection, and timing, returning RunResult with helpers for code generation, validation, file writing, path filtering, and configuration warning detection.
CLI GenerationOrchestrator refactored
src/Refitter/GenerationOrchestrator.cs
Removes in-method generation/validation/write branching and public constructors; now constructs CliFileWriter and optional OpenApiValidatorAdapter and delegates to RefitterRunner.RunAsync, surfacing result.Warnings and scanning diagnostics for the "All paths were filtered" condition.
MSBuild RefitterGenerateTask refactored
src/Refitter.MSBuild/RefitterGenerateTask.cs
Replaces manual generation and validation loop with a RefitterRunner call; conditionally provides OpenApiValidatorAdapter when SkipValidation is false; checks result.ExitCode to throw and maps result.GeneratedFiles to fully-qualified paths.
Source generator GenerateCode refactored
src/Refitter.SourceGenerator/RefitterSourceGenerator.cs
Switches from direct RefitGenerator+PlannedFile construction to RefitterRunner.RunAsync with SourceGeneratorFileWriter; defaults settings.OutputFilename when blank; translates runner warnings/errors into GeneratedDiagnostics; removes GetOutputPath, WriteGeneratedFile, and GetDirectoryName helpers.
RefitterRunner tests and removed obsolete tests
src/Refitter.Tests/RefitterRunnerTests.cs, src/Refitter.Tests/GenerationOrchestratorTests.cs
Adds RefitterRunnerTests covering successful generation, conditional writer/validator invocation, warning detection (ISO date and Polly deprecation), multi-file/multi-path scenarios, and failure cases with MockFileWriter and MockValidator; removes reflection-based FormatFileSize tests and System.Reflection import.

Sequence Diagram(s)

sequenceDiagram
  participant CLI as GenerationOrchestrator
  participant MSB as RefitterGenerateTask
  participant SG as RefitterSourceGenerator
  participant Runner as RefitterRunner
  participant Gen as RefitGenerator
  participant Planner as OutputPlannerAdapter
  participant Writer as IFileWriter
  participant Val as IValidator

  CLI->>Runner: RunAsync(settings, CliFileWriter, OpenApiValidatorAdapter)
  MSB->>Runner: RunAsync(settings, writer, OpenApiValidatorAdapter or null)
  SG->>Runner: RunAsync(settings, SourceGeneratorFileWriter, null)
  Runner->>Gen: CreateAsync / GenerateAsync
  Gen-->>Runner: generated output
  Runner->>Planner: Plan files
  Planner-->>Runner: PlannedFiles
  Runner->>Writer: WriteAsync(PlannedFile)
  loop per OpenAPI path
    Runner->>Val: ValidateAsync(openApiPath)
    Val-->>Runner: OpenApiValidationResult
  end
  Runner-->>CLI: RunResult
  Runner-->>MSB: RunResult
  Runner-->>SG: RunResult
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • christianhelle/refitter#1164: The main PR routes all generation through IOutputPlanner/OutputPlannerAdapter and IFileWriter abstractions introduced in this PR.
  • christianhelle/refitter#1128: Both PRs modify GenerationOrchestrator.RunAsync orchestration — #1128 introduced the full in-method implementation that this PR now replaces with RefitterRunner delegation.
  • christianhelle/refitter#1143: Both PRs modify RefitterSourceGenerator's file-generation and output-path handling in directly overlapping ways.

Suggested labels

enhancement, .NET

🐇 A runner was born in the core of the code,
To carry the generation load!
IValidator checks specs with care,
RunResult returns what's generated there.
Three forms now delegate their quest —
One RunAsync does all the rest! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.12% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: extracting RefitterRunner as a shared generation workflow class into the core library, which aligns with all the substantial refactoring described in the PR objectives.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch extract-refitter-runner

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@christianhelle christianhelle changed the title feat: extract RefitterRunner as shared generation workflow (PRD-005) Extract RefitterRunner as shared generation workflow Jun 20, 2026
@christianhelle christianhelle self-assigned this Jun 20, 2026
@christianhelle

Copy link
Copy Markdown
Owner Author

@copilot resolve the merge conflicts in this pull request

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (4)
src/Refitter.Tests/RefitterRunnerTests.cs (3)

467-476: ⚡ Quick win

Rename _result to remove underscore prefix.

Private fields in this repo should use camelCase without a leading underscore.

Suggested refactor
-        private readonly OpenApiValidationResult _result;
+        private readonly OpenApiValidationResult result;
...
-            _result = result ?? new OpenApiValidationResult(
+            this.result = result ?? new OpenApiValidationResult(
                 new OpenApiDiagnostic(),
                 new OpenApiStats());
...
-            return Task.FromResult(_result);
+            return Task.FromResult(result);

As per coding guidelines, private fields must not be prefixed with underscore and should be camelCase.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Refitter.Tests/RefitterRunnerTests.cs` around lines 467 - 476, In the
MockValidator class, rename the private field _result to result to follow the
repository's camelCase naming convention for private fields without underscore
prefixes. Update all references to _result throughout the MockValidator class to
use the new result name instead.

Source: Coding guidelines


42-57: ⚡ Quick win

Replace var with explicit local types in this test suite.

The file repeatedly uses var where the type is explicit and known; repo C# style here discourages var.

As per coding guidelines, csharp_style_var_* = false:silent means explicit local types are preferred over var in C# files.

Also applies to: 81-97, 115-130, 147-163

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Refitter.Tests/RefitterRunnerTests.cs` around lines 42 - 57, Replace
`var` keyword declarations with explicit type declarations throughout the test
methods in RefitterRunnerTests.cs, specifically for variables like `workspace`
(returned from CreateTempDirectory), `openApiPath` (returned from
CreateOpenApiSpec), `settings` (where applicable), `runner` (RefitterRunner),
and `result` (returned from RunAsync), as the repository's C# coding style
guidelines prefer explicit types over var declarations. Determine the correct
return types for each method call and use those explicit types in place of var.

Source: Coding guidelines


16-37: ⚡ Quick win

Use SwaggerFileHelper.CreateSwaggerJsonFile for temporary JSON fixtures.

This helper is required in src/Refitter.Tests and avoids ad-hoc fixture setup duplication.

Suggested refactor
-    private static string CreateOpenApiSpec(string directory, string fileName = "spec.json")
-    {
-        Directory.CreateDirectory(directory);
-        var path = Path.Combine(directory, fileName);
-        File.WriteAllText(
-            path,
-            """
-            {
-              "openapi": "3.0.0",
-              "info": { "title": "Test API", "version": "1.0.0" },
-              "paths": {
-                "/pets": {
-                  "get": {
-                    "operationId": "GetPets",
-                    "responses": { "200": { "description": "ok" } }
-                  }
-                }
-              }
-            }
-            """);
-        return path;
-    }
+    private static string CreateOpenApiSpec()
+    {
+        return SwaggerFileHelper.CreateSwaggerJsonFile(
+            """
+            {
+              "openapi": "3.0.0",
+              "info": { "title": "Test API", "version": "1.0.0" },
+              "paths": {
+                "/pets": {
+                  "get": {
+                    "operationId": "GetPets",
+                    "responses": { "200": { "description": "ok" } }
+                  }
+                }
+              }
+            }
+            """);
+    }

As per coding guidelines, unit tests in src/Refitter.Tests/**/*.cs should use SwaggerFileHelper.CreateSwaggerFile(contents) for YAML and CreateSwaggerJsonFile for JSON fixtures.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Refitter.Tests/RefitterRunnerTests.cs` around lines 16 - 37, The
CreateOpenApiSpec method is manually creating and writing a temporary JSON file
instead of using the standardized test fixture helper. Replace the
Directory.CreateDirectory and File.WriteAllText logic in the CreateOpenApiSpec
method with a call to SwaggerFileHelper.CreateSwaggerJsonFile, passing the
OpenAPI specification JSON content string to this helper method. This helper
will handle the temporary file creation and path management according to project
coding guidelines for test fixtures.

Source: Coding guidelines

src/Refitter.SourceGenerator/RefitterSourceGenerator.cs (1)

106-112: ⚡ Quick win

Consider handling all runner warnings, not just "Date Format Override".

RefitterRunner.DetectWarnings also emits a "Deprecated Setting" warning when usePolly is configured. This warning will be silently dropped because only "Date Format Override" is translated to a diagnostic. The CLI reports all result.Warnings via reporter.ReportConfigurationWarnings.

To maintain parity, consider translating other warning types or adding a generic warning diagnostic:

♻️ Suggested approach
 foreach (var warning in result.Warnings)
 {
     if (warning.Title == "Date Format Override")
     {
         diagnostics.Add(CreateIsoDateFormatOverrideDiagnostic());
     }
+    else
+    {
+        diagnostics.Add(new GeneratedDiagnostic(
+            "REFITTER006",
+            warning.Title,
+            warning.Description,
+            DiagnosticSeverity.Warning));
+    }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Refitter.SourceGenerator/RefitterSourceGenerator.cs` around lines 106 -
112, The foreach loop over result.Warnings only handles the "Date Format
Override" warning and silently ignores other warnings emitted by
RefitterRunner.DetectWarnings such as "Deprecated Setting". To maintain parity
with the CLI behavior that reports all configuration warnings via
reporter.ReportConfigurationWarnings, extend the warning handling logic to
either add specific diagnostic methods for other warning types (similar to
CreateIsoDateFormatOverrideDiagnostic) or add a generic fallback case that
creates a diagnostic for any warning title that is not specifically handled by
an existing condition.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/Refitter.Core/RefitterRunner.cs`:
- Around line 26-131: The RunAsync method exceeds SonarCloud's cognitive
complexity threshold (22 vs allowed 15) due to multiple nested conditional
blocks and branching logic. Extract the main logical sections into focused
private helper methods: create a private method to handle the code generation
logic (the GenerateMultipleFiles vs Generate branching), a private async method
to handle validation when validator is not null, a private async method to
handle file writing when writer is not null, and consider extracting the path
filtering check logic. This will reduce the complexity of the RunAsync method
itself while maintaining the same functionality and error handling behavior in
the catch block.
- Around line 52-53: The line ending normalization in RefitterRunner.cs is
converting all line endings to LF only (backslash n), but the repository's
coding guidelines require CRLF (carriage return plus line feed) for C# files.
Replace the two chained Replace calls that normalize to LF with Replace calls
that normalize to CRLF instead, ensuring the generated C# output complies with
the repository's line-ending standards.

In `@src/Refitter.Tests/RefitterRunnerTests.cs`:
- Around line 366-367: Replace the hardcoded Windows path literal assigned to
the OpenApiPath property with a cross-platform path construction method. Use
Path.Combine to build the path dynamically, or alternatively use a
guaranteed-missing temporary path that will work reliably across Windows, Linux,
and macOS runners in CI environments.

---

Nitpick comments:
In `@src/Refitter.SourceGenerator/RefitterSourceGenerator.cs`:
- Around line 106-112: The foreach loop over result.Warnings only handles the
"Date Format Override" warning and silently ignores other warnings emitted by
RefitterRunner.DetectWarnings such as "Deprecated Setting". To maintain parity
with the CLI behavior that reports all configuration warnings via
reporter.ReportConfigurationWarnings, extend the warning handling logic to
either add specific diagnostic methods for other warning types (similar to
CreateIsoDateFormatOverrideDiagnostic) or add a generic fallback case that
creates a diagnostic for any warning title that is not specifically handled by
an existing condition.

In `@src/Refitter.Tests/RefitterRunnerTests.cs`:
- Around line 467-476: In the MockValidator class, rename the private field
_result to result to follow the repository's camelCase naming convention for
private fields without underscore prefixes. Update all references to _result
throughout the MockValidator class to use the new result name instead.
- Around line 42-57: Replace `var` keyword declarations with explicit type
declarations throughout the test methods in RefitterRunnerTests.cs, specifically
for variables like `workspace` (returned from CreateTempDirectory),
`openApiPath` (returned from CreateOpenApiSpec), `settings` (where applicable),
`runner` (RefitterRunner), and `result` (returned from RunAsync), as the
repository's C# coding style guidelines prefer explicit types over var
declarations. Determine the correct return types for each method call and use
those explicit types in place of var.
- Around line 16-37: The CreateOpenApiSpec method is manually creating and
writing a temporary JSON file instead of using the standardized test fixture
helper. Replace the Directory.CreateDirectory and File.WriteAllText logic in the
CreateOpenApiSpec method with a call to SwaggerFileHelper.CreateSwaggerJsonFile,
passing the OpenAPI specification JSON content string to this helper method.
This helper will handle the temporary file creation and path management
according to project coding guidelines for test fixtures.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 73df9aa6-20e3-4a62-9841-ac26c1659c8c

📥 Commits

Reviewing files that changed from the base of the PR and between 2062eab and 93eb7ee.

📒 Files selected for processing (12)
  • src/Refitter.Core/Abstractions/IValidator.cs
  • src/Refitter.Core/RefitterRunner.cs
  • src/Refitter.Core/RunResult.cs
  • src/Refitter.Core/RunnerDiagnostic.cs
  • src/Refitter.Core/Validation/OpenApiValidatorAdapter.cs
  • src/Refitter.Core/Warning.cs
  • src/Refitter.MSBuild/RefitterGenerateTask.cs
  • src/Refitter.SourceGenerator/RefitterSourceGenerator.cs
  • src/Refitter.Tests/GenerationOrchestratorTests.cs
  • src/Refitter.Tests/RefitterRunnerTests.cs
  • src/Refitter/GenerationOrchestrator.cs
  • src/Refitter/IGenerationReporter.cs
💤 Files with no reviewable changes (2)
  • src/Refitter.Tests/GenerationOrchestratorTests.cs
  • src/Refitter/IGenerationReporter.cs

Comment thread src/Refitter.Core/RefitterRunner.cs
Comment thread src/Refitter.Core/RefitterRunner.cs Outdated
Comment thread src/Refitter.Tests/RefitterRunnerTests.cs Outdated

Copilot AI commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit c1f6dc6. The only conflict was in GenerationOrchestrator.cs — kept the RefitterRunner delegation approach from this branch and dropped the private helper methods that origin/main (PR #1164) added for its inline approach. The auto-merged changes from main (improved timestamp assertion in SourceGeneratorFileWriterTests.cs) were retained. Build succeeds with 0 errors.

@codecov

codecov Bot commented Jun 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 95.83333% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 95.04%. Comparing base (48dce33) to head (5dc492c).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
src/Refitter/GenerationOrchestrator.cs 85.71% 0 Missing and 3 partials ⚠️
src/Refitter.Core/RefitterRunner.cs 97.72% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1166      +/-   ##
==========================================
+ Coverage   94.78%   95.04%   +0.25%     
==========================================
  Files          75       80       +5     
  Lines        3568     3553      -15     
==========================================
- Hits         3382     3377       -5     
+ Misses         76       68       -8     
+ Partials      110      108       -2     
Flag Coverage Δ
unittests 95.04% <95.83%> (+0.25%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai

coderabbitai Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 2 file(s) based on 3 unresolved review comments.

Files modified:

  • src/Refitter.Core/RefitterRunner.cs
  • src/Refitter.Tests/RefitterRunnerTests.cs

Commit: 5dc492cd8e8588e8477c9f1d2aa57aa107ecbb01

The changes have been pushed to the extract-refitter-runner branch.

Time taken: 2m 43s

Fixed 2 file(s) based on 3 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@christianhelle
christianhelle merged commit 753bd40 into main Jun 20, 2026
14 checks passed
@christianhelle
christianhelle deleted the extract-refitter-runner branch June 20, 2026 22:39
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants