Fallout.Migrate.Analyzers
11.0.18
Prefix Reserved
dotnet add package Fallout.Migrate.Analyzers --version 11.0.18
NuGet\Install-Package Fallout.Migrate.Analyzers -Version 11.0.18
<PackageReference Include="Fallout.Migrate.Analyzers" Version="11.0.18"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="Fallout.Migrate.Analyzers" Version="11.0.18" />
<PackageReference Include="Fallout.Migrate.Analyzers"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add Fallout.Migrate.Analyzers --version 11.0.18
#r "nuget: Fallout.Migrate.Analyzers, 11.0.18"
#:package Fallout.Migrate.Analyzers@11.0.18
#addin nuget:?package=Fallout.Migrate.Analyzers&version=11.0.18
#tool nuget:?package=Fallout.Migrate.Analyzers&version=11.0.18
Fallout.Migrate.Analyzers
Roslyn analyzer + codefix that rewrites legacy Nuke.* references to Fallout.* in C# source. Install it temporarily while migrating; uninstall once you're done.
What it does
Emits a single diagnostic, FALLOUT004 (severity: Warning), at each of:
using Nuke.<X>;directivesusing static Nuke.<X>.<Y>.<Type>;directives- Fully-qualified type references like
Nuke.Common.AbsolutePath - Bare type names
NukeBuildandINukeBuild
The codefix rewrites all of those to their Fallout.* equivalents in a single edit (Migrate to Fallout.*), including the type renames (NukeBuild → FalloutBuild, INukeBuild → IFalloutBuild). Fix all in Document / Project / Solution is supported.
How to use
dotnet add build/_build.csproj package Fallout.Migrate.Analyzers
Open your build project in an IDE that supports Roslyn analyzers (Visual Studio, Rider, VS Code with C# Dev Kit). Each FALLOUT004 site becomes a lightbulb / quick-fix; apply individually or Fix all in Solution.
When the diagnostic count drops to zero:
dotnet remove build/_build.csproj package Fallout.Migrate.Analyzers
What it does not do
- It does not update
PackageReferenceitems in your_build.csproj— that's outside Roslyn's domain. Once the source is migrated, swapNuke.CommonforFallout.Common(and friends) in your project file by hand. - It does not touch bootstrap scripts (
build.ps1,build.sh,build.cmd). Those keep their names. - It does not fire on pure-NUKE projects (no
Fallout.*reference present). The diagnostic is guarded byCompilation.ReferencedAssemblyNames— you have to be partway into the migration before warnings appear.
Alternative: bulk rewrite via CLI
If you want to migrate an entire repo in one shot from the command line, use the fallout-migrate global tool instead. It does the same rewrites plus updates PackageReferences and bootstrap scripts.
Deprecation
This package will be removed alongside the Nuke.Common transition shim. Track the shim's deprecation timeline in docs/rebrand-plan.md. Plan: ship through the 11.x line, remove in 12.0.
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 11.0.18 | 96 | 5/29/2026 |
| 11.0.17 | 103 | 5/29/2026 |
| 11.0.15 | 92 | 5/28/2026 |
| 11.0.14 | 102 | 5/28/2026 |
| 11.0.13 | 85 | 5/28/2026 |
| 11.0.12 | 88 | 5/28/2026 |
| 11.0.8 | 102 | 5/28/2026 |
| 11.0.7 | 88 | 5/27/2026 |
| 11.0.6 | 92 | 5/27/2026 |
| 11.0.5 | 90 | 5/27/2026 |
| 11.0.3 | 91 | 5/27/2026 |
| 11.0.1 | 94 | 5/27/2026 |
| 10.3.49 | 85 | 5/29/2026 |
| 10.3.47 | 94 | 5/27/2026 |
| 10.3.45 | 91 | 5/27/2026 |
| 10.3.44 | 91 | 5/27/2026 |
| 10.3.42 | 107 | 5/27/2026 |
| 10.3.41 | 87 | 5/27/2026 |
| 10.3.40 | 87 | 5/27/2026 |
| 10.3.38 | 91 | 5/26/2026 |
### Breaking changes
• **Inlined vs-solutionpersistence parser • renamed Fallout.SolutionModel → Fallout.Solution; namespace Fallout.Common.ProjectModel → Fallout.Solutions*• (closes #248). The vendored Microsoft fork (vendor/vs-solutionpersistence/, submodule, fork-of-fork-of-Microsoft) is gone — sources inlined into a new Fallout.Persistence.Solution project under src/Persistence/. The facade was renamed and rehoused alongside it (src/Persistence/Fallout.Solution/), with the long-standing rebrand-era namespace mismatch (Fallout.Common.ProjectModel) fixed to match the assembly name (Fallout.Solutions, plural per BCL convention to avoid Fallout.Solution.Solution awkwardness).
• **Package IDs**: Fallout.SolutionModel → Fallout.Solution, Fallout.VisualStudio.SolutionPersistence → Fallout.Persistence.Solution. Consumers that explicitly referenced either need to update their PackageReference/ProjectReference.
• **Namespaces**: Fallout.Common.ProjectModel → Fallout.Solutions; Microsoft.VisualStudio.SolutionPersistence.{Model,Serializer,Utilities,...} → Fallout.Persistence.Solution.{Model,Serializer,Utilities,...}. Replace using statements accordingly. The Nuke.Common.ProjectModel.* transition-shim path is preserved (ShimMarker.cs now mirrors both Fallout.Common.* → Nuke.Common.* and Fallout.Solutions.* → Nuke.Common.ProjectModel.*), so NUKE-era consumer code using using Nuke.Common.ProjectModel; [Solution] readonly Solution Solution; keeps compiling.
• **Onion layering**: this PR establishes src/Persistence/ as the layered home for persistence-ring code. Future persistence-related projects go under the same directory.
• **Visibility narrowing deferred**: parser types remain public for this PR; the IVT decorations in Fallout.Persistence.Solution.csproj are future-intent. Per-type internal narrowing will follow in a later PR (cascading CS0050 analysis needed).
• **Codefix follow-up**: Fallout.Migrate.Analyzers's Nuke→Fallout rewriter still produces Fallout.Common.ProjectModel.* rather than Fallout.Solutions.*. Tracked separately.
• **Consumer-compat sentinel updated**: tests/Consumers/Fallout.Consumer.Local/ (added in the prior PR to detect exactly this kind of rename) had its ProjectReference path and using statement updated in this PR — that update IS the documented consumer migration recipe. Nuke.Consumer and Fallout.Consumer.NuGet (pinned to 11.0.8) were unaffected, confirming the shim coverage and prior-release stability hold.
• **AES-GCM v2 secret format for EncryptionUtility — parameters.json encrypted values*• (#214, closes #212). The secret-encryption scheme used by fallout :secrets is now AES-GCM with per-secret random salt • nonce and 600,000 PBKDF2-SHA256 iterations (OWASP 2023). Previous v1: (AES-CBC, static salt, 10,000 iterations, unauthenticated) values **continue to decrypt*• — the Decrypt path dispatches on v1:/v2:/unprefixed-legacy. New Encrypt calls always emit v2:.
• **On-disk format**: v2:base64(salt[16] || nonce[12] || tag[16] || ciphertext). v1: was v1:base64(salt-as-iv || ciphertext) with a static Ivan Medvedev salt.
• **Migration path**: existing .fallout/parameters.json files with v1: values stay readable. Re-running fallout :secrets to add or update **any*• secret naturally re-encrypts that entry under v2: (existing SaveSecrets flow already calls Encrypt per value). A whole-file rekey command can be added if there's demand.
• **Mixed-version repos**: developers on Fallout < 11.0 pulling a parameters.json that contains v2: values from a teammate on 11.0• get Could not decrypt 'X' with provided password. Upgrade direction is fine (v1: reads keep working); downgrade is not.
• **Rfc2898DeriveBytes constructor obsoletion (SYSLIB0060)*• cleared — both legacy and current paths now use the static Rfc2898DeriveBytes.Pbkdf2(...). No public-API impact; just stops the warning.
• **Fallout.GlobalTool package renamed to Fallout.Cli*• (#206). The dotnet-tool install command is now dotnet tool install -g Fallout.Cli. The CLI **command name stays fallout*• — no script or invocation changes needed.
• **NuGet package ID changes**: Fallout.GlobalTool (frozen at 10.3.40, then unlisted) → Fallout.Cli (10.3.41 onward, then 11.0.x).
• **Project / assembly / namespace rename**: src/Fallout.GlobalTool/ → src/Fallout.Cli/, tests/Fallout.GlobalTool.Tests/ → tests/Fallout.Cli.Tests/, namespace Fallout.GlobalTool[.*] → namespace Fallout.Cli[.*] across 48 files. Internal types only — no public-API consumer breakage from the namespace rename itself.
• **Migration for consumers**: see [docs/migration/from-globaltool-to-cli.md](docs/migration/from-globaltool-to-cli.md). Short form: dotnet tool uninstall -g Fallout.GlobalTool && dotnet tool install -g Fallout.Cli, and in repos with a local manifest, edit .config/dotnet-tools.json to replace fallout.globaltool with fallout.cli.
• **Update-notification text*• in UpdateNotificationAttribute already points at the new name, so existing Fallout.GlobalTool installs will prompt users toward Fallout.Cli on next run.
• **Thin bootstrappers • .config/dotnet-tools.json manifest; build.cmd dropped*• (#204, PR-B of #203). The per-repo build.cmd/build.sh/build.ps1 shape changes substantially — and the [GitHubActions] generator now emits a different workflow shape downstream consumers will see on the next regen.
• **build.cmd is gone*• from the canonical scaffold. fallout :setup no longer emits it. New repos get only build.sh • build.ps1.
• **build.sh / build.ps1 are ~60-line thin shims**: provision dotnet (kept verbatim from the pre-existing block), dotnet tool restore, exec dotnet fallout $@. The BUILD_PROJECT_FILE / BUILD_DIRECTORY config • explicit dotnet build • dotnet run --project lines are gone — Fallout.Cli's in-tool runner (added in #201) does that work now.
• **.config/dotnet-tools.json*• is the new home of the pin. fallout :setup writes one with the tool pinned at the running CLI's own version. Skipped if one already exists (consumer may have other local tools pinned).
• **[GitHubActions] generator*• (Fallout.Common/CI/GitHubActions/Configuration/GitHubActionsRunStep.cs): the single run: ./{BuildCmdPath} {targets} step is replaced with three steps — actions/setup-dotnet@v4 (reads global.json), dotnet tool restore, dotnet fallout {targets}. Downstream consumers using [GitHubActions(InvokedTargets = ...)] see the new shape on next workflow regen.
• **BuildCmdPath property*• on GitHubActionsAttribute is no longer consumed (the run-step no longer references it). The Azure Pipelines / AppVeyor / TeamCity / SpaceAutomation generators still fall back to a literal build.cmd if BuildCmdPath is unset — keeps those legacy providers functional for the demand-driven revival (#8) without forcing this repo to keep a build.cmd.
• **Migration**: existing repos can keep their fat bootstrappers and they'll work indefinitely (the bootstrapper does its own dotnet build • dotnet run --project, doesn't depend on the global tool). To adopt the new shape, re-run fallout :setup --force (or hand-edit the shims to match the new template).
• **Last-mile Newtonsoft removal — closes the #83 migration tree*• (#119 STJ-6, #115 STJ-2 tail). Every Fallout source file is STJ-native; Newtonsoft.Json.dll survives in the closure only as a transitive of NuGet.Packaging and Serilog.Formatting.Compact.Reader. The Newtonsoft.Json PackageVersion is gone from Directory.Packages.props entirely.
• **GitHubActions.GitHubEvent is now JsonObject*• (was Newtonsoft JObject). Consumers that introspect the event payload need to swap using Newtonsoft.Json.Linq → using System.Text.Json.Nodes and update accessors ([key].Value<T>() → [key].GetValue<T>(), Property(name) → indexer, etc.).
• **Fallout.Utilities.Net HttpRequestExtensions.WithJsonContent / HttpResponseExtensions.GetBodyAsJson defaults are STJ.*• The [Obsolete]-marked Newtonsoft overloads (JsonSerializerSettings parameter, JObject return) are gone. JsonSerializerOptions overloads remain for explicit configuration; the parameterless default uses STJ with default options. GetBodyAsJsonObject returns System.Text.Json.Nodes.JsonObject.
• **SlackMessageActionButton.Type / TeamsMessage.Type / TeamsMessage.Context**: hand-written [JsonProperty(...)] attributes swapped to [JsonPropertyName(...)]. Consumer impact only if you subclass these types and added [JsonProperty]-style attributes — switch to [JsonPropertyName].
• **TwitterTasks**: internal error-parsing path swapped from JObject.Parse to JsonNode.Parse. No public-API change.
• **ArgumentsFromParametersFileAttribute*• (#115 STJ-2 tail): parameters.json reading swapped from JObject to JsonObject. Behaviour identical for valid input; STJ may be slightly stricter about malformed JSON.
• **SchemaUtility rewritten on System.Text.Json — NJsonSchema gone*• (#114, STJ-1 of #83). The build-parameter schema generator (which emits .fallout/build.schema.json for editor autocomplete) no longer goes through NJsonSchema. It now hand-rolls the draft-04 schema using JsonNode/JsonObject directly — same output shape, no Rico-entanglement.
• **Dropped packages**: NJsonSchema, NJsonSchema.NewtonsoftJson, NJsonSchema.Annotations, Namotion.Reflection — four packages and ~12 transitive dependencies gone from Fallout.Build. Newtonsoft.Json stays in the closure only via Fallout.Common's *Tasks.cs (Slack/Twitter/Teams) until #119 lands.
• **API**: SchemaUtility.GetJsonString(IFalloutBuild) and GetJsonDocument(IFalloutBuild) unchanged for consumers.
• **Behavior preserved**: well-known definitions in canonical order (Host, ExecutableTarget, Verbosity, FalloutBuild), allOf:[user, base] envelope, [CustomParameter] subclasses render as plain string (not recursive), value-type Nullable<T> → [T, null], reference-type nullables → [null, T] for primitives / oneOf [null, $ref] for refs, [TypeConverter]-attributed types (AbsolutePath, Solution, etc.) render as string.
• **Fallout.Tooling engine migrated to System.Text.Json*• (#117 STJ-4, #118 STJ-5). The tool-options ↔ JSON layer that powers every tool wrapper is now STJ-native:
• Options.InternalOptions is now System.Text.Json.Nodes.JsonObject (was Newtonsoft JObject). Options.JsonSerializer and Options.JsonSerializerSettings are gone — use Options.SerializerOptions (JsonSerializerOptions) instead.
• The Options→InternalOptions converter is now a JsonConverterFactory registered on SerializerOptions.Converters (STJ doesn't inherit class-level [JsonConverter] attributes onto subclasses). LookupTable<,> round-trips through a parallel ObjectFromFieldConverter factory; Enumeration subclasses go through a new EnumerationJsonConverterFactory that bridges [TypeConverter]-attributed types (which STJ doesn't honour natively).
• All 62 generated tool wrappers regenerated with [JsonPropertyName] instead of [JsonProperty] (#118). The generator's own JSON model (Fallout.Tooling.Generator) is migrated too — Tool / Property / DataClass / Enumeration / Task use [JsonRequired] / [JsonPropertyName] / [JsonIgnore] from System.Text.Json.Serialization.
• IReadOnlyDictionary<string, object> round-trips deserialize values as JsonElement (not string as Newtonsoft did); DelegateHelper.ParseCollection coerces both shapes back to string.
• **Newtonsoft.Json PackageReference removed*• from Fallout.Tooling, Fallout.Tooling.Generator, and Fallout.Utilities.Text.Json. Object.ToJObject deleted (closes the residual #116 tail). Fallout.Common still references Newtonsoft for *Tasks.cs files until #119 (STJ-6) lands.
• Migration for consumers: replace Options.JsonSerializerSettings → Options.SerializerOptions; replace obj.ToJObject(serializer) → JsonSerializer.SerializeToNode(obj, Options.SerializerOptions).AsObject(); tool wrappers using hand-written [JsonProperty] (e.g. SlackMessage.Type) need to switch to [JsonPropertyName].
• **Fallout.Utilities.Text.Json Newtonsoft surface removed*• (#116, STJ-3 of #83). The [Obsolete]-marked Newtonsoft.Json overloads added in 10.3.x are gone:
• **Deleted types:*• JObjectExtensions (GetChildren/GetPropertyValue/GetPropertyStringValue/GetPropertyValueOrNull on JObject), AllWritableContractResolver, Base64JsonConverter<T>, Object.ToJObject.
• **JsonExtensions stripped to System.Text.Json only**: DefaultSerializerSettings removed (use DefaultSerializerOptions); the JsonSerializerSettings-taking overloads of ToJson / GetJson / ReadJson / WriteJson / UpdateJson and the JObject-returning GetJson/ReadJson/UpdateJson(Action<JObject>) are gone. Equivalent STJ surface: same method names taking JsonSerializerOptions (now defaulted to DefaultSerializerOptions when omitted), plus GetJsonObject / ReadJsonObject / UpdateJsonObject(Action<JsonObject>) for JsonNode-based access.
• **Migration**: replace obj.ToJson(settings) with obj.ToJson(JsonExtensions.DefaultSerializerOptions) (or pass your own JsonSerializerOptions); replace content.GetJson<JObject>() with content.GetJsonObject(); replace JObject.GetPropertyValue<T>(name) with JsonObject.GetPropertyValue<T>(name) (same method name, different receiver type via using System.Text.Json.Nodes).
• **Fixed Fallout.SolutionModel 10.2.24–10.2.34 unrestorable*• (#107): the vendored SolutionPersistence wrapper was IsPackable=false, so dotnet pack fell back to emitting the dependency under the *assembly• name (Microsoft.VisualStudio.SolutionPersistence) at the Fallout version — which doesn't exist on nuget.org. Wrapper now packs as Fallout.VisualStudio.SolutionPersistence (PackageId set explicitly; AssemblyName preserved for drop-in type identity), so Fallout.SolutionModel.nuspec declares the correct transitive dep. Also affected Fallout.Common, Fallout.Build, Fallout.ProjectModel, Fallout.Components — all fixed.
• **--skip-duplicate on the publish push*• (#108): release.yml's IPublish.PushSettings now enables skip-duplicate, so a partial publish failure (e.g. one package's API key permission gap) no longer makes reruns error on the already-uploaded versions. Pipeline is idempotent.
• **Fixed build.ps1 bootstrap on PowerShell 7.5+*• (#15): the script now uses Join-Path for SDK resolution so newer PowerShell's stricter path handling doesn't break the launcher.
• **Fixed solution folder names starting with digits*• (#16): StronglyTypedSolutionGenerator prefixes a leading underscore when the folder name would produce an invalid C# identifier.
• **Retired GitVersion.Tool*• (#81) — version is now sourced exclusively from Nerdbank.GitVersioning via version.json. MajorMinorPatchVersion and friends in Build.cs read NB.GV's $(Version) MSBuild output.
• **Trimmed unused / replaceable dependencies*• (#75, #78, #79, #80, #82): dropped JetBrains.ReSharper.GlobalTools, the matkoch Spectre.Console fork (swapped for upstream Spectre.Console), Microsoft.ApplicationInsights, Codecov.Tool, and xunit.runner.console. See docs/dependencies.md for the current graph.
• **Bumped Scriban 7.1.0 → 7.2.0*• (#84) to clear NU1903.
• **Fixed [GitHubActions] CheckoutRef breaking cross-repo / fork PRs**. The generator emitted ref: ${{ github.head_ref }} but didn't set repository:, so the default ${{ github.repository }} was used. For PRs from a fork, the source branch only exists on the fork; checkout tried to resolve it on origin and failed with branch or tag could not be found (regressed in #175). Generator now also emits repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} whenever CheckoutRef is set — works for fork PRs, same-repo PRs, AND push events (the || fallback). Regenerate via any dotnet fallout <target> to pick up the fix.
• **Fixed fallout-migrate producing unrestorable _build.csproj*• (closes #217). The Nuke → Fallout namespace rewrite carried the original NUKE Version=10.1.0 pins onto Fallout.* packages — but Fallout.* was never published at 10.1.0, so NuGet hit NU1603 (not found, falling back to next-higher) and WarningsAsErrors in the migrated project escalated to fatal. Migrate now bumps inline Version=... attributes on Nuke → Fallout PackageReferences to the running migrate tool's own version in the same regex pass, and strips the stale System.Security.Cryptography.Xml <PackageReference> (NUKE-era projects often pinned an older major that conflicts with Fallout.Common's transitive ≥ 10.0.6 — NU1605 downgrade). CPM-managed references (no inline Version) keep namespace-only rewrite — version stays in Directory.Packages.props.
### Added
• **Extracted Fallout.Core — the pure domain • graph foundation*• (#88, v11 plugin-architecture foundation). New bottom-layer project (netstandard2.1;net10.0) holding the side-effect-free types of the build execution pipeline: ITargetModel (read-only target projection — the seed for the v12 plugin SDK), ExecutionStatus, and TopoSort / PlanResult<T> (pure topological sort • strongly-connected-component cycle detection). Fallout.Core references nothing else in the repo and is held to a strict purity bar — no System.IO, Process, Console, or Serilog — enforced by a NetArchTest architecture-fitness test (broader suite tracked in #95).
• **Fully backward-compatible.*• ExecutionStatus moved assemblies (Fallout.Build → Fallout.Core) but is [TypeForwardedTo], and namespaces are unchanged, so existing consumer using Fallout.Common.Execution; code compiles untouched. The live ExecutableTarget stays in Fallout.Build and now implements ITargetModel; ExecutionPlanner is reduced to a thin orchestration wrapper over Fallout.Core's pure TopoSort (it still owns reading the strict parameter, failing the build on a cycle, and mutating target state).
• The graph primitives (Vertex / StronglyConnectedComponent*) moved from Fallout.Utilities into Fallout.Core as an internal implementation detail of TopoSort; they had no external consumers.
### Process
• **Added Default to backwards compatibility rule to the AGENTS.md AI brief*• (#262). Critical rules now state the principle explicitly — prefer additive over breaking changes; [Obsolete], transition shims, and overload-based extension before a hard break. The existing breaking-change PR-creation flow (label • ⚠️ callout • version.json bump • CHANGELOG entry with migration path) remains the mechanics for when a break is unavoidable. Issue [#262](https://github.com/ChrisonSimtian/Fallout/issues/262) stays open for the broader policy discussion (LTS stance for the Nuke.* shims, what qualifies as backwards compatible for on-disk formats and CI workflow generators, when transition-shim generators are the right answer, etc.).
Full changelog at https://github.com/ChrisonSimtian/Fallout/blob/main/CHANGELOG.md