@
Problem
Adopting Fallout on a project that already has CI means hand-rewriting every
workflow — there's no path in. And moving a pipeline between hosts (GitHub
Actions ⇄ Azure Pipelines) is a full manual rewrite each direction.
Outcome
A fallout migrate <host> command reads existing CI YAML and emits idiomatic
Fallout C#. The forward generators already exist; this adds the reverse. Once a
project's logic lives in C#, retargeting another host is a regenerated shim
(./build.ps1 <Target>), not a second migration — Fallout becomes the
translation layer between hosts.
Two buckets on import:
- Lift — recognized commands (
dotnet build/test/restore/pack, …) become
tool-wrapper targets.
- Stub — anything unconvertible (marketplace actions, host-native deploy)
becomes a compiling target that throws NotImplementedException, carrying
the original step and source ref inline for a human to finish.
Acceptance criteria
Notes
- Architecture: reuse
ConfigurationEntity as a shared IR; readers (IConfigurationReader) symmetric with the existing IConfigurationGenerator writers. Forward side + tool catalog already exist (~half the work).
- Recognizer can ship empty and grow — without it, lifted steps fall back to shell
Executes; the rest still stubs. So MVP = readers + C# emitter + stub emitter + CLI.
- GitLab and other hosts out of scope for first cut.
@
@
Problem
Adopting Fallout on a project that already has CI means hand-rewriting every
workflow — there's no path in. And moving a pipeline between hosts (GitHub
Actions ⇄ Azure Pipelines) is a full manual rewrite each direction.
Outcome
A
fallout migrate <host>command reads existing CI YAML and emits idiomaticFallout C#. The forward generators already exist; this adds the reverse. Once a
project's logic lives in C#, retargeting another host is a regenerated shim
(
./build.ps1 <Target>), not a second migration — Fallout becomes thetranslation layer between hosts.
Two buckets on import:
dotnet build/test/restore/pack, …) becometool-wrapper targets.
becomes a compiling target that throws
NotImplementedException, carryingthe original step and source ref inline for a human to finish.
Acceptance criteria
fallout migrate githubreads.github/workflows/*.yml→ emits/updatesBuild.cs+[GitHubActions]fallout migrate azuredoes the same forazure-pipelines.yml+[AzurePipelines]dotnet test --no-build→DotNetTest(s => s.EnableNoBuild()))path:lineref +NotImplementedException--dry-runreports lift/stub counts per host, writes nothingNotes
ConfigurationEntityas a shared IR; readers (IConfigurationReader) symmetric with the existingIConfigurationGeneratorwriters. Forward side + tool catalog already exist (~half the work).Executes; the rest still stubs. So MVP = readers + C# emitter + stub emitter + CLI.@