Build/net8 multi targeting - #1
Merged
Merged
Conversation
… 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
force-pushed
the
build/net8-multi-targeting
branch
from
February 4, 2026 18:13
bc24467 to
fc6a8b0
Compare
- 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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.