Skip to content

chore(rebrand): rename Nuke.* → Fallout.* (namespaces, csprojs, assemblies, package IDs)#54

Merged
ChrisonSimtian merged 3 commits into
mainfrom
chore/p3-namespace-and-assembly-rename
May 20, 2026
Merged

chore(rebrand): rename Nuke.* → Fallout.* (namespaces, csprojs, assemblies, package IDs)#54
ChrisonSimtian merged 3 commits into
mainfrom
chore/p3-namespace-and-assembly-rename

Conversation

@ChrisonSimtian

Copy link
Copy Markdown
Collaborator

Closes #32. Mechanical 1:1 prefix swap per docs/rebrand-plan.md. Type identifier renames (NukeBuild, INukeBuild, NUKE_* env vars, credential store name) are deliberately deferred to a follow-up PR — see the scope-split decision on #32.

What changed

  • 17 src/ folders + 8 tests/ folders renamed via git mv (history follows the rename)
  • 26 .csproj files renamed in lockstep
  • 4 ancillary files renamed: Nuke.Common.props/.targets, Nuke.MSBuildTasks.targets, Nuke.Components.csproj.DotSettings
  • fallout.slnx repointed at every new path (26 <Project> entries)
  • Every ProjectReference path updated across every csproj
  • namespace declarations + using directives + qualified type references swapped in ~625 .cs files via anchored regex (\bNuke\.)
  • AssemblyInfo.cs InternalsVisibleTo entries updated for first-party assemblies; external entries (Nuke.VisualStudio, ReSharper.Nuke, Nuke.Remote.Functions, Nuke.Website.Functions) kept as Nuke.* because they refer to outside-this-repo projects
  • Constants.cs:29: nameof(Nuke) + "." + nameof(Common) replaced with the literal "Fallout.Common" (the nameof hack wouldn't compile after namespace rename anyway)
  • Tool wrapper JSON files (~70): inline namespace references swapped
  • templates/_build.csproj: PackageReference Nuke.CommonFallout.Common (new user projects get the new brand from day one)
  • build/Build.cs: Solution.Nuke_XSolution.Fallout_X (source-generator emits these from project names; rename cascaded automatically, call sites needed manual update)
  • Verify snapshot regenerated: tests/Fallout.SourceGenerators.Tests/StronglyTypedSolutionGeneratorTest.Test#Solution.g.verified.cs

Carve-outs preserved

Surface Why
Constants.UpstreamNukeRepository / UpstreamNukeRepositoryGit Deliberate legacy-recognition constants for upstream URL identification
Constants.LegacyNukeDirectoryName = ".nuke" Back-compat for pre-Fallout consumer projects
Telemetry.Properties.IsCommonType legacy-NUKE path Recognizes NUKE 10.x assemblies that embed the upstream RepositoryUrl
tests/Fallout.Build.Tests/GitRepositoryTest.cs, tests/Fallout.Common.Tests/GitHubTasksTest.cs Fixtures that deliberately parse nuke-build/nuke URLs
tests/Fallout.Tooling.Tests/NuGetPackageResolverTest.cs Uses real-world Nuke.Generation.Specifications nuget.org package as integration fixture
src/Fallout.Utilities/EnvironmentInfo.SpecialFolder.cs:34 Historical link to upstream NUKE PR #825
build/_build.csproj:33 commented NukeExternalFiles block References historical upstream URLs
README.md / CONTRIBUTING.md / CLAUDE.md attribution paragraphs Project history
CHANGELOG.md historical entries Project history

Verification

Check Result
dotnet build fallout.slnx -c Debug ✅ 0 errors, 15 pre-existing warnings (CS1591 XML doc + Scriban CVE — unrelated to rename)
dotnet test fallout.slnx ⚠️ 392 passing, 7 skipped, 1 failing
grep -rE '\bNuke\.' src/ build/ tests/ -- ":!CHANGELOG.md" ":!README.md" ":!CONTRIBUTING.md" ":!CLAUDE.md" ":!docs/" Only carve-outs remain

The one failing test

Fallout.ProjectModel.Tests.MSBuildProjectTestSystem.IO.FileNotFoundException : Could not load file or assembly 'Microsoft.Build, Version=15.1.0.0'.

  • Was passing on main with the old Nuke.ProjectModel.Tests.csproj (verified by git stash + run + git stash pop).
  • Fails on this branch. Reproducible in this Windows env after clean build.
  • Failure happens before the test body executes — looks like a ModuleInitializer / MSBuildLocator interaction sensitive to the assembly name change.
  • Not yet root-caused. Likely Windows-specific given that PR chore(rebrand): audit and update string references to nuke.build, nuke-build/nuke (#30) #52 verified all suites green on ubuntu CI.

I'm letting CI on ubuntu-latest give the authoritative read. If green there, the test is the only follow-up; if also red there, this needs investigation before merge.

Deferred to follow-up PR

Surface Action
NukeBuild (96 uses), INukeBuild (87 uses) Rename to FalloutBuild / IFalloutBuild
Internal identifiers: NukeFileName, NukeDirectoryName, NukeCommonPackageId, NukeVersion, GetNukeDirectory, GlobalNukeDirectory, NukeTelemetryVersion Rename prefix to Fallout
NUKE_GLOBAL_TOOL_VERSION, NUKE_GLOBAL_TOOL_START_TIME, NUKE_INTERNAL_INTERCEPTOR, NUKE_TELEMETRY_OPTOUT env vars Rename to FALLOUT_* with one-cycle NUKE_* fallback for migration
Credential store name prefix "NUKE: ..." Rename to "Fallout: ..." with read-fallback on legacy prefix
Telemetry property keys version_nuke_* Rename to version_fallout_*

Downstream now unblocked

🤖 Generated with Claude Code

ChrisonSimtian and others added 3 commits May 20, 2026 15:36
…blies, package IDs)

Closes #32. Mechanical 1:1 prefix swap per docs/rebrand-plan.md. Type
identifier renames (NukeBuild, INukeBuild, NUKE_* env vars, credential
store name) deferred to a follow-up PR per the scope-split decision in
the #32 thread.

## What changed
- 17 src/ folders + 8 tests/ folders renamed via git mv (history follows)
- 26 .csproj files renamed in lockstep
- 4 ancillary files renamed: Nuke.Common.props/.targets, Nuke.MSBuildTasks.targets, Nuke.Components.csproj.DotSettings
- fallout.slnx repointed at every new path
- Every ProjectReference path updated across all csprojs
- namespace declarations + using directives + qualified type references swapped in ~625 .cs files via anchored regex (\bNuke\.)
- AssemblyInfo.cs InternalsVisibleTo entries updated for first-party assemblies (external entries kept as Nuke.* — they refer to outside projects)
- Constants.cs:29 nameof(Nuke) + "." + nameof(Common) replaced with the literal "Fallout.Common" (the nameof hack wouldn't compile after namespace rename anyway)
- Tool wrapper JSON files (~70): inline namespace references swapped
- GlobalTool templates/_build.csproj: PackageReference Nuke.Common → Fallout.Common (new user projects get the new brand from day one)
- build/Build.cs: Solution.Nuke_X → Solution.Fallout_X (source-generator-emitted property names changed with the rename)
- Verify snapshot at tests/Fallout.SourceGenerators.Tests/StronglyTypedSolutionGeneratorTest.Test#Solution.g.verified.cs regenerated

## Carve-outs preserved
- Constants.UpstreamNukeRepository / UpstreamNukeRepositoryGit (deliberate legacy-recognition constants)
- Constants.LegacyNukeDirectoryName = ".nuke" (back-compat for pre-Fallout consumer projects)
- Telemetry.Properties.IsCommonType legacy NUKE recognition path
- tests/Fallout.Build.Tests/GitRepositoryTest.cs + tests/Fallout.Common.Tests/GitHubTasksTest.cs URL parsing fixtures (hardcoded nuke-build/nuke URLs)
- tests/Fallout.Tooling.Tests/NuGetPackageResolverTest.cs: real-world Nuke.Generation.Specifications package ID used as nuget.org integration fixture
- src/Fallout.Utilities/EnvironmentInfo.SpecialFolder.cs:34 historical PR link
- build/_build.csproj:33 commented-out NukeExternalFiles block referencing upstream URLs
- README/CONTRIBUTING/CLAUDE.md attribution paragraphs
- CHANGELOG history

## Verification
- dotnet build fallout.slnx -c Debug: 0 errors, 15 pre-existing warnings (mostly CS1591 XML doc + Scriban CVE warning unrelated to rename)
- dotnet test fallout.slnx: 392 passing, 7 skipped, 1 failing
- The 1 failure is tests/Fallout.ProjectModel.Tests MSBuildProjectTest: System.IO.FileNotFoundException : Could not load file or assembly 'Microsoft.Build, Version=15.1.0.0'. The test was passing on main; the failure is reproducible in this Windows env after the rename but the root cause is unclear — looks like MSBuildLocator picking up a different MSBuild copy after the assembly name change. Likely Windows-specific. CI on ubuntu-latest will confirm.

## Deferred to follow-up PR
- NukeBuild → FalloutBuild (96 uses), INukeBuild → IFalloutBuild (87 uses)
- Internal identifiers: NukeFileName, NukeDirectoryName, NukeCommonPackageId, NukeVersion, GetNukeDirectory, GlobalNukeDirectory, NukeTelemetryVersion
- Environment variables: NUKE_GLOBAL_TOOL_VERSION, NUKE_GLOBAL_TOOL_START_TIME, NUKE_INTERNAL_INTERCEPTOR, NUKE_TELEMETRY_OPTOUT (with deprecation fallback)
- Credential store name prefix "NUKE: ..." (with migration handling)
- Telemetry property keys version_nuke_common, version_nuke_global_tool

## Downstream now unblocked
- #36 (Roslyn codefix), #37 (migration guide), #47 (shim packages), #48 (migrator CLI)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Runtime session lock file from the Claude Code harness — got swept in
by the prior commit's git add -A. Untracking it and adding to .gitignore
so future runs don't reintroduce it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
)

MSBuildProjectTest failed with `FileNotFoundException: Microsoft.Build,
Version=15.1.0.0` because the JIT resolves the test method's local of
type Microsoft.Build.Evaluation.Project before any code in
Fallout.ProjectModel.dll runs — so before its [ModuleInitializer] can
install the MSBuildLocator AssemblyResolve handler.

Adds a [ModuleInitializer] in the test assembly that invokes
ProjectModelTasks.Initialize() to force-load Fallout.ProjectModel
(and run its module init) at test-assembly load time. typeof()
alone is not enough — the runtime requires an actual method
invocation to fire a foreign assembly's module initializer.

Latent issue on main too; the rename perturbed load order enough
to surface it. Sibling ProjectTest avoided the trap by wrapping
the call in an Action lambda.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ChrisonSimtian
ChrisonSimtian merged commit 6967a09 into main May 20, 2026
1 check passed
@ChrisonSimtian
ChrisonSimtian deleted the chore/p3-namespace-and-assembly-rename branch May 20, 2026 21:34
ChrisonSimtian added a commit that referenced this pull request May 20, 2026
…utBuild (#59)

Mechanical type-identifier rename deferred from #54.

## What changed

- 7 files renamed (git mv preserves history):
  - src/Fallout.Build/NukeBuild.{,Events,Interface,Statics,Output}.cs
    → FalloutBuild.{,Events,Interface,Statics,Output}.cs
  - src/Fallout.Build/INukeBuild.cs → IFalloutBuild.cs
  - src/Fallout.SourceGenerators/Shims/NukeBuild.cs → FalloutBuild.cs
- ~281 identifier occurrences across 84 files swapped via anchored
  regex (\bNukeBuild\b, \bINukeBuild\b)
- Verify snapshots (cake-scripts/*.verified.cs, SchemaUtilityTest
  verified.json) updated to match the new generator output
- build/Build.cs (this repo's own build script) updated alongside

## Carve-outs preserved

- CHANGELOG.md — historical entries reference the old types verbatim
- .fallout/build.schema.json — regenerated by the build, not hand-edited

## Out of scope (follow-up PRs)

While auditing, I found more identifiers carrying the legacy Nuke
brand than the issue body anticipated:

- Constants.cs internals: NukeFileName, NukeDirectoryName,
  NukeCommonPackageId, GetNukeDirectory, GlobalNukeDirectory
- MSBuild target / property names (consumer-visible, BREAKING):
  NukeTasksAssembly, NukeContinueOnError, NukeTaskTimeout,
  NukeBaseDirectory, NukeUseNestedNamespaces, NukeRepositoryUrl,
  NukeUpdateReferences, NukeExternalFiles, NukePackPackageTools,
  NukeEmbedPackagesForSelfContained, NukeCodeGeneration,
  NukeSpecificationFiles, NukeBaseNamespace, NukeTasksDirectory,
  NukeTasksEnabled, NukeDefaultExcludes, NukeRootDirectory,
  NukeScriptDirectory, NukeTelemetryVersion
- Env vars (NUKE_TELEMETRY_OPTOUT, NUKE_GLOBAL_TOOL_*, NUKE_INTERNAL_INTERCEPTOR)
- Credential store name prefix "NUKE: ..."
- Telemetry property keys version_nuke_common, version_nuke_global_tool

The MSBuild props are consumer-visible and need their own deprecation
discussion (set both old + new for a release? Read both with warning?).
Env vars + credential store need migration logic. Splitting these out
keeps the diff reviewable and lets each concern get its own design call.

#57 updated to reflect the expanded scope.

## Verification

- dotnet build fallout.slnx -c Debug: 0 errors, 15 pre-existing warnings
- dotnet test fallout.slnx: 391 passed, 7 skipped, 0 failed

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ChrisonSimtian added a commit that referenced this pull request May 21, 2026
Closes #38.

## Changes

- src/Fallout.GlobalTool/Fallout.GlobalTool.csproj: <ToolCommandName>
  flipped from `nuke` to `fallout`. Anyone installing the next published
  version of Fallout.GlobalTool gets `dotnet fallout` (not `dotnet nuke`).
- src/Fallout.GlobalTool/Program.Complete.cs: CommandName constant
  flipped to "fallout". Shell completion parses `fallout <args>` now.
- docs/01-getting-started/01-installation.md: post-install path-check
  hint references `where fallout`.
- docs/architecture.md: package table + dotnet command refreshed
  Nuke.* → Fallout.* (the rest of the file was already updated by #54;
  this row was missed).

## Migration impact

Existing users on `Nuke.GlobalTool` keep `dotnet nuke`; they're a
different package, untouched.

Existing users who already pulled `Fallout.GlobalTool` (published earlier
today at 10.2.x with the legacy `nuke` ToolCommandName) will see
`dotnet nuke` flip to `dotnet fallout` on next update. That's expected
— Fallout.GlobalTool has been on nuget.org for hours, not days; no
established muscle memory yet. Migration guide (#37) will call this out.

## Verification

- dotnet build fallout.slnx -c Debug: 0 errors, 15 pre-existing warnings
- dotnet test fallout.slnx: 391 passed, 7 skipped, 0 failed

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ChrisonSimtian added a commit that referenced this pull request May 21, 2026
… update CI header (#67)

* chore(rebrand): regenerate tool wrappers + update CI config header

Closes #39.

## Changes

### CI config generator
- src/Fallout.Build/CICD/ConfigurationAttributeBase.cs: generated YAML/
  Kotlin header comment now reads "fallout --generate-configuration ..."
  instead of "nuke --generate-configuration ...".
- .github/workflows/{ubuntu,windows,macos}-latest.yml: refreshed headers
  to match. Tests under tests/Fallout.Common.Tests/CI/*.verified.txt
  re-baselined alongside (6 snapshots, one header line each).

### Tool wrappers
- build/Build.CodeGeneration.cs: SpecificationsDirectory was pointing at
  the pre-#54 `source/` directory; GlobFiles returned empty and the
  GenerateTools target silently no-op'd. Fixed to `src/`.
- 62 Generated.cs files regenerated via `GenerateTools`. Picks up the
  WriterExtensions.cs URL update made earlier in the rebrand — every
  `<remarks>` block now links to github.com/ChrisonSimtian/Fallout
  instead of the dead `https://www.nuke.build/docs/...` URL. Also picks
  up the GitHub source-file URL change from `nuke-build/nuke` paths
  to `ChrisonSimtian/Fallout`.
- .fallout/build.schema.json: regenerated as a side-effect.

## Verification

- dotnet build fallout.slnx -c Debug: 0 errors, 11 pre-existing warnings
- dotnet test fallout.slnx: 391 passed, 7 skipped, 0 failed
- Spot check: src/Fallout.Common/Tools/Boots/Boots.Generated.cs no
  longer contains "nuke.build"; remarks link now points at
  github.com/ChrisonSimtian/Fallout

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci: nudge workflow trigger

* fix(ci): emit `paths-ignore` instead of negative-only `paths` filter

PR #67 didn't trigger ubuntu-latest CI — root cause: the GitHub Actions
trigger generator emits a `paths:` block of only `!`-prefixed entries
when only ExcludePaths is configured (no IncludePaths). GitHub treats
that as "fire only when files match these negative patterns", which is
never true, so the workflow never runs.

Fix in GitHubActionsVcsTrigger.cs: when only ExcludePaths is set, emit
`paths-ignore:` (without `!`) instead of `paths:` with negative-only
entries. Mixed include+exclude still uses `paths:` as before.

The repo's own .github/workflows/ubuntu-latest.yml regenerated as a
side-effect — now uses `paths-ignore`. Expectation: this PR's next push
finally fires the ubuntu-latest workflow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ChrisonSimtian added a commit that referenced this pull request May 21, 2026
Closes part of #48 (MVP — see "What's NOT in this PR" below).

## What it does

A new `dotnet tool` that walks a consumer repo and rewrites the
NUKE-era artifacts into their Fallout equivalents in place:

  dotnet tool install -g Fallout.Migrate
  cd path/to/my-nuke-repo
  fallout-migrate            # apply
  fallout-migrate --dry-run  # preview without writing

Transformations:

| Layer | Rewriter | What changes |
|---|---|---|
| `.csproj` | CsprojRewriter | PackageReference Include="Nuke.X" → Fallout.X; MSBuild props on the known P3.5b list (NukeRootDirectory, NukeBaseDirectory, NukeTelemetryVersion, NukeTasksEnabled, …) → Fallout* |
| `.cs` | CodeRewriter | `\bNuke\.(?=[A-Z])` → `Fallout.` for using directives, attribute namespaces, qualified type references; `\bNukeBuild\b` → `FalloutBuild`; `\bINukeBuild\b` → `IFalloutBuild` |
| `build.{cmd,ps1,sh}` | ScriptRewriter | `dotnet nuke` → `dotnet fallout`; `.nuke/` path references → `.fallout/`; legacy NUKE_* env vars → FALLOUT_* |
| `.nuke/` dir | DirectoryRenamer | Renames to `.fallout/` (warning emitted if both exist) |

Each rewriter uses anchored regex matching the same approach the
rebrand itself used in #54 / #59 (`\bNuke\.` with case-aware lookaheads).
Internal regex-only — no Roslyn dependency, no MSBuild evaluation,
keeps the tool a single small binary.

## Output

  fallout-migrate — migrating: /path/to/repo
  edit    build/_build.csproj  (3 changes)
  edit    build/Build.cs       (2 changes)
  edit    build.sh             (2 changes)
  rename  .nuke -> .fallout

  Files changed:   3
  Edits made:      7
  Directories:     1 renamed

  Migration complete. Verify the build:  ./build.ps1   (or ./build.sh on unix)

## Tests

17 tests:
- CsprojRewriterTest: PackageReference, MSBuild property, false-positive guard, no-op
- CodeRewriterTest: using directive, qualified type, NukeBuild, INukeBuild, partial-identifier guard, lowercase .nuke guard
- ScriptRewriterTest: dotnet nuke, .nuke dir refs, env vars, plain-word guard
- MigrationIntegrationTest: end-to-end vanilla fixture (csproj+cs+sh+.nuke), dry-run, both-dirs warning

Plus a manual end-to-end smoke from a fixture in /tmp confirmed dry-run
output matches the expected diff.

## What's NOT in this PR (deferred)

- Roslyn-based AST rewrites — kept it regex-only for MVP. The issue
  mentions reusing the Cake rewriting infrastructure; that's more
  appropriate when we hit cases regex can't handle (e.g. partial
  identifier disambiguation, semantic-aware refactors). None observed
  in vanilla consumer repos yet.
- Tested on a real external NUKE consumer repo — volunteer needed
  per the issue's "Done when" list. Open follow-up.
- Published to GitHub Packages — release pipeline will pick this up
  on next push to main since the project is in fallout.slnx and
  PackAsTool=true.
- Link from migration guide (#37) — that PR doesn't exist yet.

## Side-effect

StronglyTypedSolutionGeneratorTest verify snapshot regenerated —
solution generator now emits Solution.Fallout_Migrate and
Solution.Fallout_Migrate_Tests properties from the two new projects.

## Verification

- dotnet build src/Fallout.Migrate: 0 errors, 0 warnings
- dotnet test fallout.slnx: 408 passed (was 391; +17 new), 7 skipped, 0 failed
- End-to-end dry-run on /tmp fixture: edits + rename reported correctly

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ChrisonSimtian added a commit that referenced this pull request May 22, 2026
CLAUDE.md no longer claimed the Nuke.* → Fallout.* structural rename
was pending — that landed in #54, #60, #65, #66 ages ago. Updates the
rebrand-status paragraph, the src/tests layout table, the production
project groupings (now including Fallout.Migrate and the vendored
Fallout.VisualStudio.SolutionPersistence), the tool-wrapper paths, and
fixes the CI-revival roadmap link from #7 (which is the CodeQL ticket)
to #8 (the actual CI-revival tracker).

README.md said releases publish to GitHub Packages — nuget.org has been
the primary feed since #58. Build-status table also had three URLs
hardcoded to ChrisonSimtian/nuke (the pre-rename slug). Also notes the
new docs-only paths-ignore on the release workflow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.

[P3] Execute solution-wide Nuke.* → Fallout.* namespace rename (BREAKING)

1 participant