Draft
Conversation
Replaces netstandard2.0 stub with net6.0;net8.0;net10.0 targets, wires up ASP.NET Core FrameworkReference and Atomizer project reference, and adds folder skeleton (Abstractions, Authorization, Configuration, Contracts, DependencyInjection, Endpoints, Hubs, StaticFiles, Storage). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tions Adds a null-object event sink registered via TryAddSingleton so dashboard consumers can override it, plus JobQuery and PagedResult<T> for paginated job querying. Includes netstandard2.0 IsExternalInit polyfill for init property support. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…torage Defines the IAtomizerDashboardStorage interface and QueueStats type in the dashboard package, implements them via InMemoryDashboardStorage reading from internal InMemoryStorage snapshots, and adds 12 unit tests covering all query filters, pagination, ordering, and queue stats. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drop the unused IAtomizerClock field from InMemoryDashboardStorage (snapshot methods require no clock), move lease token creation into the branches that need it, and rename the misleading active-server test method to accurately reflect its assertion. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…t index Implements IAtomizerDashboardStorage for the EF Core backend using IDbContextFactory, AsNoTracking, and LINQ-only queries. Adds a CreatedAt index to AtomizerJobEntityConfiguration to support efficient ORDER BY CreatedAt DESC. Includes integration tests against PostgreSQL, MySQL, and SQL Server containers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bootstraps the SPA in frontend/, wires it into the MSBuild pipeline via a BuildSpa target that runs once at the outer build level (TargetFramework == '') to avoid parallel node_modules corruption across multi-TFM builds. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.
Overview
Implements the first half of the
Atomizer.DashboardNuGet package — a read-only monitoring dashboard for Atomizer background jobs, schedules, queues, and servers. The dashboard ships as a React+TypeScript SPA embedded as DLL resources, served via ASP.NET Core at a configurable route prefix.This PR covers Steps 1–6 of the 12-step plan. Steps 7–13 (ASP.NET Core integration, REST API, React views, tests, NuGet packaging) will follow on this branch.
Architecture decisions
IAtomizerStorageis unchanged — no new methods, no breaking changes for custom storage implementers.IAtomizerDashboardStorageinterface lives inAtomizer.Dashboard. Two built-in adapters (InMemoryDashboardStorage,EntityFrameworkCoreDashboardStorage) wire up automatically viaAddAtomizerDashboard().dotnet packproduces a complete artifact with the embedded SPA. Consumers never run npm.What's in this PR
Atomizer.Dashboard.csproj, folder structure)4c924e2JobQuery,PagedResult<T>inAtomizer(+IAtomizerEventSink— later removed as unused)5cd0d93IAtomizerDashboardStorage+InMemoryDashboardStoragewith unit tests93899f5EntityFrameworkCoreDashboardStorage(LINQ-only, no raw SQL) + integration tests +CreatedAtindex12c7ca8NotifyingStorageDecorator— eliminated; SignalR removed in favour of polling (no backplane required)158b127,9fcba1aBuildSpatarget embeds dist assets633263d,3cd5533Notable implementation details
BuildSpafires atBeforeTargets="DispatchToInnerBuilds"withTargetFramework == ''guard — this prevents the multi-TFM project from runningnpm cithree times in parallel and corruptingnode_modules/esbuild.SkipSpaBuild=trueMSBuild property lets CI lanes without Node skip the npm step."type": "module"inpackage.jsonis required for@tailwindcss/vite(ESM-only package)..nvmrc.frontend/node_modules/andfrontend/dist/excluded from git.Steps remaining (7–13)
DashboardOptions, DI, routing,EmbeddedSpaFileProvider)/api/jobs,/api/schedules,/api/queues/stats,/api/servers)WebApplicationFactoryintegration tests)Test plan
dotnet buildtriggersBuildSpavia MSBuild and embeds dist assetsdotnet build -p:SkipSpaBuild=truesucceeds without npmnpm ci && npm run buildproducesfrontend/dist/index.htmldotnet test)dotnet csharpier check .passes🤖 Generated with Claude Code