Repository navigation
Expand file tree
/
Copy pathDirectory.Build.props
More file actions
175 lines (147 loc) · 9.9 KB
/
Copy pathDirectory.Build.props
File metadata and controls
175 lines (147 loc) · 9.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<!-- ⛔ TreatWarningsAsErrors DOES NOT REACH MSBuild's OWN WARNINGS, so a ProjectReference to a
project that no longer exists is MSB9008, a warning, and the build succeeds having
skipped it. Measured in plans/00007 by pointing AgentForge.Core back at the deleted
JsonC project: the build and all 80 architecture guards stayed green. Only that one code
is escalated, not every MSB warning, because the rest were never measured here. -->
<MSBuildWarningsAsErrors>$(MSBuildWarningsAsErrors);MSB9008</MSBuildWarningsAsErrors>
<!-- ⛔ THE SINGULAR FORM IS LOAD-BEARING, and two projects once believed otherwise.
src/ClaudeForge and LayeredEditors.Avalonia.Services (since plans/00005 the AppServices
packages) each declared a plural
<TargetFrameworks> adding net10.0-windows10.0.19041.0, with comments saying it took
precedence over this property. It does not: MSBuild cross-targets only when
TargetFramework is EMPTY, so both projects built net10.0 alone for the whole life of
those declarations, and the MAUI Essentials share path they existed for never
compiled. Both declarations are now gone.
Adding a platform TFM to any project therefore means CLEARING this property for it
first — `<TargetFramework></TargetFramework>` in that csproj, before the plural form
— and re-adding EnableWindowsTargeting, which used to sit here so a Windows TFM
would restore on macOS / Linux CI hosts without NETSDK1100. Neither is needed while
every project is single-TFM, and leaving them in place documents a capability the
build does not have. -->
</PropertyGroup>
<PropertyGroup>
<!-- Turn the generator ON for the consuming projects -->
<GenerateAutoVersionedAssemblyInfo>true</GenerateAutoVersionedAssemblyInfo>
<!-- Company and product names; consumed by the source generator at build time -->
<AssemblyCompany>Bennewitz.Ninja</AssemblyCompany>
<!--
The DEFAULT product, which is now the shared library family rather than either app.
⚠ This used to be `ClaudeForge`, which stamped that name into every assembly in the
repository — including AgentForge.*, which is product-neutral by
design and are consumed by both apps. A shared library reporting itself as one of its
two consumers is wrong in a file properties dialog, in a crash dump, and in any
support bundle that lists loaded modules.
Each app OVERRIDES this in its own csproj with its own name. Adding a third app means
adding the same one-line override there, not editing this.
-->
<AssemblyProduct>AgentForge</AssemblyProduct>
<CopyrightHolder>Brian Bennewitz</CopyrightHolder>
<!-- Map CI environment variables to the MSBuild properties the generator reads.
Replace $(GITHUB_SHA) / $(GITHUB_ACTIONS) with your CI provider's equivalents,
e.g. GitLab: $(CI_COMMIT_SHA) / $(GITLAB_CI), Bitbucket: $(BITBUCKET_COMMIT) / $(CI). -->
<CommitSha Condition="'$(CommitSha)' == ''">$(GITHUB_SHA)</CommitSha>
<IsContinuousIntegration>$(GITHUB_ACTIONS)</IsContinuousIntegration>
</PropertyGroup>
<!--
══ THE VERSION OF THE FIVE SHARED PACKAGES THE RELEASE CONSUMES ════════════════════════
Five since plans/00007: the AgentForge.* family. JsonC was the sixth and now has its own
repository and its own pin, JsonCVersion, below.
plans/00003, Phase D. This is a COMMITTED PIN, deliberately, and it belongs in the ROOT
props rather than src/'s: the test projects consume the packages too, and only the root
file reaches them.
⭐ WHY A PIN AND NOT A DERIVED VALUE. The app release tag and the package tag are
independent — 'v2026.3.918' and 'packages-v2026.3.918' are separate releases on separate
schedules — so nothing about an app tag says which package version it should consume. An
explicit value also satisfies Directory.Build.targets' refusal to invent a default, makes
the release reproducible from its tag with no workflow inputs, and turns every version
move into a diff a human approves.
⚠ THIS IS INERT UNTIL UseSharedPackages=true. In the default development mode nothing
reads it, the feed is never contacted, and a clone with no credentials restores normally.
The canary passes its own throwaway version on the command line, and a global property
still outranks this one.
⛔ BUMPING THIS IS A RELEASE ACTION. It must name a version that actually exists on the
feed: a value pointing at an unpublished version fails the restore rather than falling
back, which is the intended behaviour.
-->
<PropertyGroup>
<SharedPackageVersion Condition="'$(SharedPackageVersion)' == ''">2026.4.1019</SharedPackageVersion>
</PropertyGroup>
<!--
══ THE SEVEN nuget.org PACKAGES THAT REPLACE LayeredEditors ════════════════════════════
plans/00005. TWO properties because the seven ids come from two repositories with
independent release cadences: Bennewitz.Ninja.AppServices (four ids) and
Bennewitz.Ninja.ScopedEditors (three). One version per repository, from one source, so
moving a pin is a one-line diff a human approves.
⛔ UNLIKE SharedPackageVersion ABOVE, THESE ARE NEVER INERT. The seven are PackageReferences
in every mode; there is no project to fall back to, so every restore reads them.
⛔ THE PIN MUST CARRY THE IsTrimmable MARK. ClaudeForge publishes with TrimMode=partial,
which trims and analyses only marked assemblies. 2026.3.923 shipped without it, so there
the seven were kept whole and a clean trim result said nothing about them; 2026.3.924
carries it on all seven (read from the DLLs). Check before moving the pin. See plans/00005.
No Condition, deliberately: the value in this file must beat a same-named environment
variable, and a global property on the command line still outranks it.
-->
<PropertyGroup>
<AppServicesVersion>2026.4.1001</AppServicesVersion>
<ScopedEditorsVersion>2026.3.924</ScopedEditorsVersion>
</PropertyGroup>
<!--
══ Bennewitz.Ninja.JsonC, FROM ITS OWN REPOSITORY ══════════════════════════════════════
plans/00007. JsonC was the sixth shared project here; it now lives in
JanusMael/Bennewitz.Ninja.JsonC and publishes to nuget.org. AgentForge.Core takes it as a
PackageReference at this version.
⛔ NEVER INERT, like the two above: there is no project to fall back to in either mode, so
the UseSharedPackages switch must not see it, and every restore reads this pin.
⛔ 2026.3.926 IS THE FLOOR. Every JsonC version up to 2026.3.925 exists only on this
repository's GitHub feed, from before the move; 2026.3.926 is the first on nuget.org and is
the same code (JsonC's PROGRESS.md records the decompile comparison). It carries the
IsTrimmable mark, which TrimMode=partial needs for the trim result to cover it.
-->
<PropertyGroup>
<JsonCVersion>2026.3.926</JsonCVersion>
</PropertyGroup>
<!--
PDB policy — applies to all projects in the solution unless a project overrides.
Debug: portable PDB (separate .pdb file alongside the assembly).
Portable format is cross-platform and required for local source-stepping;
the separate file is expected and convenient in the debug output directory.
Release: embedded PDB (debug info baked directly into the managed assembly).
The embedded format is the portable format inlined as a PE section;
no separate .pdb file is produced, so there are no loose symbol files
to exclude from zips or installers. When PublishSingleFile bundles
an assembly into the single-file executable the embedded PDB travels
with it automatically — giving full symbols inside the shipped binary
with zero extra files.
-->
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<DebugType>portable</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<DebugType>embedded</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<!-- AutoVersioning source generator — applies to every project in the solution.
Hoisted here because the previous per-csproj pattern duplicated the
identical PackageReference block across 13 projects (52 lines of noise).
The generator is gated by GenerateAutoVersionedAssemblyInfo=true above,
so it actually runs on every project; this single declaration is all
that's needed.
PrivateAssets="all" keeps the generator from flowing transitively to
consumers of any library this repo ships (it's a build-time tool, not
a runtime dependency). IncludeAssets enumerates the asset types the
generator legitimately needs at build time. -->
<ItemGroup>
<PackageReference Include="Bennewitz.Ninja.AutoVersioning" Version="2026.3.928">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>