Skip to content

Build/net8 multi targeting - #1

Merged
RoboNET merged 3 commits into
mainfrom
build/net8-multi-targeting
Feb 4, 2026
Merged

Build/net8 multi targeting#1
RoboNET merged 3 commits into
mainfrom
build/net8-multi-targeting

Conversation

@RoboNET

@RoboNET RoboNET commented Feb 4, 2026

Copy link
Copy Markdown
Owner

No description provided.

… trusted publishing

- Add net8.0 target alongside net10.0 across all projects
- Restructure release.yml into 4 jobs: test → publish-nuget + build-native → release
- Build native AOT binaries for osx-arm64, linux-x64, win-x64
- Switch NuGet publishing to OIDC trusted publishing (nuget/login@v1)
- Add conditional SkiaSharp native assets per platform in CLI csproj
- Fix flaky CLI test on net8.0 (Console.Out race condition with xUnit)
- Embed Inter font in snapshot tests for cross-platform determinism
- Add 5% tolerance for cross-platform anti-aliasing differences
- Fix YamlPreprocessor \r\n line ending handling for Windows
- Update AGENTS.md, llms.txt, llms-full.txt with distribution channels

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
@RoboNET
RoboNET force-pushed the build/net8-multi-targeting branch from bc24467 to fc6a8b0 Compare February 4, 2026 18:13
RoboNET and others added 2 commits February 4, 2026 21:49
- Add DeterministicRendering option to FlexRenderOptions (default false)
  When enabled, disables font hinting and subpixel rendering for
  identical output across macOS/Linux/Windows
- Wire option through SkiaRenderer → TextRenderer → CreateFont()
- Fix SnapshotComparer R↔B channel swap bug: raw MemoryMarshal.Cast
  misinterpreted Rgba8888 bytes as Bgra8888 SKColor, inflating diff %
  for any non-gray color (e.g. 73% instead of 0% for blue backgrounds)
- Fix YamlPreprocessor \r\n handling for Windows compatibility
- Skip 3 font-metric-sensitive tests on non-macOS platforms
- Regenerate golden images with deterministic rendering

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Add macOS-only guards to TextSimple, TextVariables, and FlexRow snapshot
tests. DirectWrite (Windows) renders fonts differently enough from Core
Text (macOS) to exceed the 5% pixel difference threshold.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
@RoboNET
RoboNET merged commit a2721f7 into main Feb 4, 2026
3 checks passed
@RoboNET
RoboNET deleted the build/net8-multi-targeting branch February 4, 2026 18:59
RoboNET added a commit that referenced this pull request Feb 5, 2026
Build/net8 multi targeting (#1)

* build: add net8.0 multi-targeting, release workflow with native AOT & trusted publishing

fix: specify target framework for AOT publish with multi-targeting

dotnet publish requires explicit -f net10.0 when the project targets
multiple frameworks (net8.0, net10.0).

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

fix: ignore snupkg push errors for packages without symbols

The metapackage has no code/PDBs, so its .snupkg is empty and nuget.org
rejects it with 400. Symbol package push is best-effort.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

fix: publish all NuGet packages with proper symbol support

- Disable snupkg for metapackage (no code/PDBs, caused 400 on push)
- Remove separate snupkg push (dotnet push handles paired snupkg automatically)

Previously only the metapackage was published because its empty snupkg
caused a 400 error that aborted the entire push command.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

feat: include README.md in NuGet packages

Adds PackageReadmeFile to Directory.Build.props so all NuGet packages
display the project README on nuget.org.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

docs: add NuGet, CI, and license badges to README

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

feat: add --base-path CLI option for relative file resolution

Replace hardcoded Environment.CurrentDirectory with explicit --base-path
option. When not specified, defaults to the template file's directory,
which is more intuitive for typical usage.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

feat: add native BMP encoder and XML documentation

- Add BmpEncoder class with fast span-based BGRA8888 path
- Add RenderToBmp to IFlexRenderer, SkiaRenderer, and extensions
- Update CLI commands to use BmpEncoder instead of PNG fallback
- Enable GenerateDocumentationFile for NuGet IntelliSense
- Fix IHttpClientFactory cref in XML docs

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

feat: enable .NET analyzers and fix all analyzer warnings

- Enable EnableNETAnalyzers, AnalysisLevel=latest-Recommended, EnforceCodeStyleInBuild
- Fix CA1805: Remove explicit default value initializations
- Fix CA1822: Make methods static where possible
- Fix CA1305: Add CultureInfo.InvariantCulture to int.Parse/ToString
- Fix CA1716: Rename 'template' parameter to 'layoutTemplate' in interfaces
- Fix CA1725: Rename parameter to match interface declaration
- Fix CA1304/CA1311: Use ToLowerInvariant instead of ToLower
- Fix CA1859: Use concrete types for better performance
- Suppress CA1707/CA1816/CA1852/CA1859/CA1861 in test projects

perf: optimize memory allocations in hot paths

- Replace LINQ with foreach loops in LayoutEngine hot paths
- Add token buffer reuse in ExpressionLexer/TemplateProcessor
- Use StringBuilder in YamlPreprocessor.ReplaceItemReferences
- Remove redundant .ToList() in ProcessEachBlock
- Add capacity hints to List<T> where size is predictable
- Add Performance & Memory section to AGENTS.md with best practices

perf: add capacity hints to hot path list allocations

- ExpressionEvaluator: estimate PathSegment list capacity from path separators
- TextRenderer: estimate lines capacity from newline count
- TextRenderer: use RemoveRange instead of ToList() for maxLines truncation

feat: add AST-level control flow (type: each, type: if)

Add EachElement and IfElement for template-level iteration and conditionals.
This enables template caching - parse once, render with different data.

- Add ConditionOperator enum (Equals, NotEquals)
- Add EachElement with array path, item variable, loop variables (@index, @FIRST, @last)
- Add IfElement with condition, equals/notEquals, then/else/elseIf branches
- Add TemplateExpander for expanding control flow into concrete elements
- Integrate TemplateExpander into SkiaRenderer pipeline
- Add receipt-dynamic.yaml example demonstrating new syntax
- Add 36 unit tests for parsing and expansion

fix: resolve font paths through BasePath

Font paths in templates were not being resolved relative to BasePath,
causing fonts to fail loading when using --base-path CLI option.

- Add FlexRenderOptions parameter to SkiaRenderer constructor
- Add ResolveFontPath helper method
- Update DI registration to pass options to renderer

docs: update README and documentation for AST control flow

- Add type: each and type: if syntax documentation
- Update Quick Start example with new syntax
- Add TemplateExpander to API Reference
- Add debug-layout and --base-path to CLI commands
- Update AGENTS.md and llms.txt with control flow docs
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.

1 participant