Avalonia desktop app. Projects under src/:
-
Euterpe— the app: oneFeatures/<Name>/folder per feature, holding only views, viewmodels and view-specific code (converters etc.);Shell/for app-level windows. -
Euterpe.Abstractions— service interfaces. -
Euterpe.Contracts— wire contracts: any request/response DTO serialized to or from an external API belongs here. -
Euterpe.Controls— reusable Avalonia controls and the app theme.Themes/EuterpeTheme.axamlis generated at build time — edit the per-control/per-style files, never the generated file. -
Euterpe.Core— service implementations underServices/. -
Euterpe.Generators— Roslyn incremental source generators, driven by the marker attributes inEuterpe.Shared. -
Euterpe.Localization— localized.resxstring tables:XAMLfor view text,Interactionfor code-side messages. -
Euterpe.Models— app-internal models, DTOs, enums and records (types that cross the network go inEuterpe.Contractsinstead). -
Euterpe.Shared— dependency-free utilities referenced across projects: attributes, collections, extensions, threading helpers, constants. -
Euterpe.Tasks— custom MSBuild build tasks (e.g. generatingEuterpeTheme.axaml). Tests undertests/(TUnit): -
Euterpe.Generators.Tests— source generator tests, snapshot-verified with Verify (snapshots/). -
Euterpe.Headless.Tests— anything that needs running Avalonia UI (controls, views, bindings, input, theming) on Avalonia.Headless. -
Euterpe.Tests— plain unit tests; folders mirror the source projects (App/=src/Euterpe, plusCore/,Models/,Shared/,Contracts/).
- Never push to a remote (
jj git push/git push) — commit locally at most; the user reviews and pushes themselves.
Before changing code, read the applicable rule files:
- Any C# change:
docs/agent-rules/csharp.md - Anything under
tests/: bothdocs/agent-rules/csharp.mdanddocs/agent-rules/tests.md - Any XAML/Avalonia UI change:
docs/agent-rules/xaml.md
Treat these files as mandatory project instructions, not optional references.