Skip to content
Draft
Show file tree
Hide file tree
Changes from 235 commits
Commits
Show all changes
542 commits
Select commit Hold shift + click to select a range
442de62
test(jobs): lock in Hangfire dashboard BasicAuth behavior with regres…
iammukeshm Apr 24, 2026
e8da0e3
test(multitenancy): assert all provisioning steps transition to Compl…
iammukeshm Apr 24, 2026
d598f34
fix(identity): apply auth rate limit policy to reset-password and sel…
iammukeshm Apr 24, 2026
c3dd9b9
Merge Phase 1 of API Hardening Sprint into develop
iammukeshm Apr 24, 2026
45512ed
feat(billing): add ops endpoint for manual usage snapshot capture
iammukeshm Apr 24, 2026
b6bf460
feat(webhooks): add production dispatcher with Hangfire retry on tran…
iammukeshm Apr 24, 2026
faf2eea
feat(idempotency): wire .WithIdempotency() on high-value mutating end…
iammukeshm Apr 24, 2026
e7d7934
test(multitenancy): explicit regression test for tenant seed data on …
iammukeshm Apr 24, 2026
1566da6
Merge Phase 2 of API Hardening Sprint into develop
iammukeshm Apr 24, 2026
18db49c
feat(identity): enforce account lockout after consecutive failed logins
iammukeshm Apr 24, 2026
104da4e
feat(identity): add TOTP two-factor authentication (enroll, verify, d…
iammukeshm Apr 24, 2026
b5b5016
Merge Phase 3 of API Hardening Sprint into develop
iammukeshm Apr 24, 2026
f5f2703
feat(jobs): harden HangfireOptions; lock in health probes with tests
iammukeshm Apr 24, 2026
9b020a0
Merge Phase 4 of API Hardening Sprint into develop — SPRINT COMPLETE
iammukeshm Apr 24, 2026
4e7e4d3
fix(ui): remove hardcoded test credentials from login forms
iammukeshm Apr 24, 2026
b2cb81d
feat(ui): eslint config, route-level error boundary, permission-aware…
iammukeshm Apr 24, 2026
dda46e3
feat(ui): add sonner toast surface; document SSE token refresh invariant
iammukeshm Apr 24, 2026
b54d417
Merge Phase 1 of UI Hardening Sprint — correctness + shared infrastru…
iammukeshm Apr 24, 2026
d403f2f
feat(admin-ui): tenant create + detail page with live provisioning st…
iammukeshm Apr 24, 2026
47d93b9
feat(dashboard-ui): add dev-only one-click login as default seeded admin
iammukeshm Apr 24, 2026
af5ada1
fix(web): run CORS before HTTPS redirection so preflights aren't redi…
iammukeshm Apr 24, 2026
462e96e
chore: pre-upgrade checkpoint — dashboard https default + audit recur…
iammukeshm Apr 29, 2026
6e91786
chore(deps): bump NuGet packages to latest patch + minor
iammukeshm Apr 29, 2026
cd3bd54
test: fix pre-existing failures uncovered during package upgrade
iammukeshm Apr 29, 2026
fe8b265
chore(deps): bump coverlet.collector 8.0.1 -> 10.0.0
iammukeshm Apr 29, 2026
7bd86d4
chore(deps): bump Asp.Versioning.* 8.1.1 -> 10.0.0
iammukeshm Apr 29, 2026
06f0802
chore(deps): drop unused Mapster dependency
iammukeshm Apr 29, 2026
3d85683
fix(identity): emit RFC 7519 'sub' claim in JWT alongside NameIdentifier
iammukeshm Apr 29, 2026
a9412dd
fix(identity): make access Token optional on RefreshTokenCommand
iammukeshm Apr 29, 2026
31331fb
fix(dashboard): align refresh request and response shapes with server…
iammukeshm Apr 29, 2026
a699555
feat(dashboard): modern design-token system, theme switcher, login re…
iammukeshm Apr 29, 2026
7723599
feat(dashboard/overview): redesign overview page with KPI strip + ani…
iammukeshm Apr 29, 2026
3332fa1
feat(dashboard): require confirmation dialog before sign-out
iammukeshm Apr 29, 2026
6b322ed
fix(identity+dashboard): resolve username 'Unknown' by emitting RFC s…
iammukeshm Apr 29, 2026
70071ba
feat(dashboard): collapsible sidebar with persisted state, refreshed …
iammukeshm Apr 29, 2026
3680ea5
feat(dashboard): add Settings page with deep-linkable pill tabs
iammukeshm Apr 29, 2026
9b04dc1
feat(dashboard): selectable accent palettes + 12 fonts in Appearance
iammukeshm Apr 29, 2026
be766c5
feat(dashboard): redesign topbar as profile dropdown
iammukeshm Apr 29, 2026
3ba4395
feat(dashboard/invoices): refresh into KPI + token-driven list vocabu…
iammukeshm Apr 29, 2026
f50812e
feat(dashboard): command palette (⌘K) with five action groups
iammukeshm Apr 29, 2026
1f420de
feat(dashboard/security): wire active sessions to the real backend
iammukeshm Apr 29, 2026
79713eb
feat(dashboard): wire density mode (compact spacing across pages)
iammukeshm Apr 29, 2026
7ec45b3
feat(dashboard): catalog pages + frontend-design polish
iammukeshm Apr 30, 2026
d304380
feat(dashboard): polish dialogs, skeletons, settings + lazy-load routes
iammukeshm Apr 30, 2026
aa9eaa1
feat(tickets): add Tickets module — second demo vertical
iammukeshm Apr 30, 2026
600f124
feat(catalog,tickets): soft delete + restore for all entities
iammukeshm Apr 30, 2026
d4202ed
test(catalog,tickets): coverage for soft-delete + Tickets endpoints
iammukeshm Apr 30, 2026
607f566
feat(dashboard): tickets pages + unified trash view
iammukeshm Apr 30, 2026
69b59e0
feat(auditing): production-grade hardening + named query filters
iammukeshm Apr 30, 2026
a338847
feat(dashboard/health): rack-unit faceplate styling for check cards
iammukeshm Apr 30, 2026
e1a450e
feat(identity,dashboard): tenant-wide sessions admin console
iammukeshm Apr 30, 2026
f73627b
feat(admin): user management console (Phase 2.2 UI)
iammukeshm May 6, 2026
d8d5656
feat(identity): system role/group protection + last-admin guards
iammukeshm May 6, 2026
672121f
fix(dashboard): eliminate double scrollbar from sidebar overflow
iammukeshm May 6, 2026
8c6d1ca
Merge feature/ui-admin-management into develop
iammukeshm May 6, 2026
fa91023
chore: in-flight WIP sweep — Playground→Starter rename, dev seeding, …
iammukeshm May 6, 2026
f7f5300
Merge feature/ui-admin-management — WIP sweep (Playground→Starter, de…
iammukeshm May 6, 2026
754f1af
fix(apphost): normalize minio-init script line endings to LF
iammukeshm May 6, 2026
06c1e97
fix(api): ensure wwwroot/ exists so the API can boot
iammukeshm May 6, 2026
0df9f8f
fix(dashboard): rebuild toast layout in flex; modernise the chrome
iammukeshm May 6, 2026
025339a
feat(dashboard): mirror server-side system-role guards in role-detail UI
iammukeshm May 6, 2026
5f2118e
feat(dashboard/overview): cockpit hero + first-run panel + recent ope…
iammukeshm May 6, 2026
85a8b0e
feat(dashboard/appearance): custom-accent picker — pick any brand hue
iammukeshm May 6, 2026
5d6e8a5
feat(dashboard/audits): related-events timeline in the detail drawer
iammukeshm May 6, 2026
395d821
feat(dashboard): unified PageHero across non-list surfaces
iammukeshm May 6, 2026
55eb23f
feat(dashboard/sidebar): single-select accordion sections + top-level…
iammukeshm May 6, 2026
a5548ec
feat(dashboard/sidebar): subtle accordion animations + matched typogr…
iammukeshm May 6, 2026
7f74102
fix(dashboard/hero): stop clipping descenders on Settings, Audit trai…
iammukeshm May 6, 2026
e40187c
feat(dashboard/login): brand-story column on wide viewports
iammukeshm May 6, 2026
93b05fd
feat(dashboard/login): editorial product-page redesign
iammukeshm May 6, 2026
5b33117
feat(dashboard/login): blueprint-style centered redesign + demo popup
iammukeshm May 6, 2026
01e798d
fix: achieve zero-warning build across all projects
May 9, 2026
00e8fec
test: enhance coverage and stabilize infrastructure
May 9, 2026
d1b82b3
Merge branch 'fix/zero-warnings' into integrate/stabilized-base
May 9, 2026
c5f5f5b
test: remove TODO to achieve zero-warning build in architecture tests
May 9, 2026
0ee7c20
Merge branch 'feat/test-coverage-improvements' into integrate/stabili…
May 9, 2026
292b458
chore: fix CI build errors and architecture test discovery
May 9, 2026
9024fb6
chore: stabilize architecture tests and fix CA1062 warnings
May 9, 2026
73a5cb0
chore: stabilize CI pipeline by resolving 60 build errors (CA, MSG, S…
May 9, 2026
208fc7b
Merge feat/test-coverage-improvements into fix/zero-warnings stabiliz…
May 9, 2026
b09a106
security: fix CodeQL CWE-312 — do not log SharedPassword in clear text
May 10, 2026
c7b70aa
security: fix CodeQL CWE-312 — do not log SharedPassword in clear text
May 10, 2026
559f5ca
Merge pull request #1240 from cesarcastrocuba/feat/test-coverage-impr…
iammukeshm May 11, 2026
c4f9e52
ui
iammukeshm May 11, 2026
ae78e9b
Merge branch 'develop' of github.com:fullstackhero/dotnet-starter-kit…
iammukeshm May 11, 2026
68f974a
Merge pull request #1239 from cesarcastrocuba/fix/zero-warnings
iammukeshm May 12, 2026
064092d
docs(specs): Files module design spec
iammukeshm May 12, 2026
36a3de9
docs(plans): Files module Phase A implementation plan
iammukeshm May 12, 2026
63245f7
feat(files): scaffold Modules.Files + .Contracts projects
iammukeshm May 12, 2026
b64ffd0
feat(storage): presigned URL + HEAD on IStorageService
iammukeshm May 12, 2026
b3f2b39
feat(apphost): MinIO CORS for browser presigned PUT uploads
iammukeshm May 12, 2026
344b1ae
feat(files): FileAsset aggregate + FilesDbContext + appsettings
iammukeshm May 12, 2026
28046f8
feat(files): module skeleton registration + EF migration for FileAssets
iammukeshm May 12, 2026
e3c1fef
feat(files): module services + contracts + 23 unit tests
iammukeshm May 12, 2026
5a8c11c
feat(files): 6 endpoints + handlers + module wiring
iammukeshm May 12, 2026
a85b528
feat(files): Hangfire purge jobs + recurring registration
iammukeshm May 12, 2026
a5d865c
feat(files): admin endpoints — RestoreFile + ListTrashedFiles
iammukeshm May 12, 2026
6db3c1a
fix(files): architecture compliance — drop IHttpContextAccessor + add…
iammukeshm May 12, 2026
9a2f733
test(files): MinIO integration tests + wire Files module into Mediator
iammukeshm May 12, 2026
af0db33
feat(dashboard): Files module UI — useFileUpload + Dropzone + Gallery…
iammukeshm May 12, 2026
19bed3b
feat(files): product image + avatar upload + preview modal
iammukeshm May 12, 2026
7d618e1
chore(arch): allow Set verb + suppress CA1055 on BuildPublicUrl
iammukeshm May 12, 2026
ccfeddc
chore(aspire): upgrade to Aspire 13.3.0
iammukeshm May 12, 2026
beeda07
fix(apphost): MinIO CORS via server env var, not mc admin config
iammukeshm May 12, 2026
6696c33
fix(files): PDF preview + drop category-tab UX in My Files
iammukeshm May 12, 2026
39c0fdd
fix(dashboard): toast follows in-app theme, not OS preference
iammukeshm May 12, 2026
9a3c90c
feat(dashboard): confirmation dialog before deleting a file
iammukeshm May 12, 2026
832894e
feat(catalog): multi-image product support + gallery + thumbnail
iammukeshm May 12, 2026
6182c24
fix(catalog): AddProductImage 500 — ProductImage.Id ValueGeneratedNever
iammukeshm May 12, 2026
6c6dbf1
fix(catalog): SetProductThumbnail/RemoveImage 404 for unknown image id
iammukeshm May 12, 2026
40227f4
fix(catalog): drop partial unique index on ProductImages.IsThumbnail
iammukeshm May 12, 2026
9f02777
fix(files): preview reliability — fresh URL per modal open + onError …
iammukeshm May 12, 2026
b00ab29
docs(specs): Chat module design spec
iammukeshm May 12, 2026
3181d69
docs(plans): Chat module implementation plan
iammukeshm May 12, 2026
ae94c52
feat(chat-1): scaffold Modules.Chat + Modules.Chat.Contracts projects
iammukeshm May 12, 2026
070fc0a
feat(chat-1): permissions + ChatChannel/Message aggregates + domain e…
iammukeshm May 12, 2026
1120883
feat(chat-1): ChatDbContext + EF configurations + module registration…
iammukeshm May 12, 2026
5c25594
feat(chat-1): contracts — DTOs, commands, queries
iammukeshm May 12, 2026
9a938b4
feat(chat-1): CreateChannel feature + ChatMappers + wire Mediator mar…
iammukeshm May 12, 2026
4946f42
feat(chat-1): channel management endpoints — Update, Archive, Restore…
iammukeshm May 12, 2026
f3c392f
feat(chat): channel/message queries + edit/delete/read-marker endpoints
iammukeshm May 12, 2026
d666c9a
test(arch): include Chat module in contracts purity + host boundary c…
iammukeshm May 12, 2026
389cd36
test(chat): unit tests for ChatChannel + Message aggregate invariants
iammukeshm May 12, 2026
e218f3b
test(chat): integration tests for channels + messages (23 tests)
iammukeshm May 12, 2026
b071013
feat(chat-2): SignalR AppHub + Redis backplane + handler broadcasts
iammukeshm May 12, 2026
261b907
test(chat-2): SignalR realtime integration tests + auth fix
iammukeshm May 12, 2026
bdbf60a
feat(chat-3): scaffold Notifications module + InitialNotifications mi…
iammukeshm May 12, 2026
7a63b9b
feat(chat-3): Notifications REST endpoints (list/count/mark/mark-all)
iammukeshm May 12, 2026
adba177
feat(chat-3): MessageMention domain + @username parsing in SendMessage
iammukeshm May 12, 2026
b555dcc
feat(chat-3): MentionedInChannel handler + integration tests (3)
iammukeshm May 12, 2026
d8841c7
feat(chat-4): thread replies endpoint + message reactions
iammukeshm May 12, 2026
c3d1614
feat(chat-4): full-text message search via Postgres tsvector
iammukeshm May 12, 2026
c7a1f72
test(chat-4): typing-indicator integration tests (3)
iammukeshm May 12, 2026
1fe8499
feat(chat-4): ChatChannelFileAccessPolicy for message attachments
iammukeshm May 12, 2026
16734df
feat(chat-4): dashboard /chat page + NotificationBell + RealtimeProvider
iammukeshm May 12, 2026
33d2ace
feat(chat-4): UI polish pass — unread divider, jump pill, live status…
iammukeshm May 13, 2026
84d65e0
fix(chat-4): composer sent empty body when optimistic clear raced the…
iammukeshm May 13, 2026
688bc18
feat(chat-4): resolve user IDs to real names in messages, DM titles, …
iammukeshm May 13, 2026
141e6f9
fix(cors): allow credentialed requests in dev so SignalR negotiate works
iammukeshm May 13, 2026
2ea0dbe
feat(chat-4): topbar chat-unread badge + global toast on incoming mes…
iammukeshm May 13, 2026
152d280
feat(chat-4): @mention autocomplete in composer
iammukeshm May 13, 2026
a16a066
feat(chat-4): redesign chat toast — opt out of .fsh-toast tone-rail
iammukeshm May 13, 2026
39f8e71
fix(chat-4): chat toasts vanished after the previous redesign — kept …
iammukeshm May 13, 2026
fe80223
feat(chat-4): MessageList lands at the latest message on channel open
iammukeshm May 13, 2026
d09a171
feat(realtime): rebuild SignalR hub on token rotation + warn on missi…
iammukeshm May 13, 2026
919bb50
feat(files): paginate ListTrashedFiles via PagedResponse
iammukeshm May 13, 2026
6a43f8f
test(chat): integration tests for POST /messages mirroring dashboard …
iammukeshm May 13, 2026
d334d57
docs(chat-4): spec for deferred UI items — ThreadPanel, mention profi…
iammukeshm May 13, 2026
814b9c4
docs(chat-4): implementation plan for deferred UI items
iammukeshm May 13, 2026
2b13ce2
feat(chat-4): partner avatar on 1-on-1 DM rail rows
iammukeshm May 13, 2026
8aa4b63
feat(chat-4): mention pill opens profile peek with Open DM action
iammukeshm May 13, 2026
2c6d52d
feat(chat-4): ThreadPanel overlay — wire onReply through to a reply s…
iammukeshm May 13, 2026
dbb1115
feat(chat-4): Teams-style inline replies — quote in composer + inline…
iammukeshm May 13, 2026
93abc2f
feat(chat-4): Teams-style chat — right-aligned own bubbles, flat feed…
iammukeshm May 13, 2026
9273d13
feat(chat-4): hover-only merged-row time + jump-to-parent on reply pr…
iammukeshm May 13, 2026
5ad9a5b
feat(chat-4): inline search overlay + smooth scroll on jump-to-parent
iammukeshm May 13, 2026
7c0577a
feat(chat-5): optimistic send — message lands in feed before the netw…
iammukeshm May 13, 2026
53e1156
feat(chat-5): channel settings dialog — rename, members, archive/leave
iammukeshm May 13, 2026
be1d22d
feat(chat-5): message pagination — load older on scroll-to-top
iammukeshm May 13, 2026
1957eef
feat(ui): modernize sonner toasts — frosted gradient-border + tone-ti…
iammukeshm May 13, 2026
3700111
feat(chat-5): file attachments in composer + message bubbles
iammukeshm May 13, 2026
077fb20
feat(chat-5): read receipts under the caller's latest top-level message
iammukeshm May 13, 2026
9137cee
feat(chat-5): mobile responsive sweep — rail / message column alterna…
iammukeshm May 13, 2026
d8ea0d6
fix(chat-5): increase merged-row spacing — bubbles no longer overlap
iammukeshm May 13, 2026
c7402a5
feat(chat-5): pin messages — domain + endpoints + realtime + UI
iammukeshm May 13, 2026
ff5543a
feat(presence): online dots driven by an in-memory PresenceTracker
iammukeshm May 13, 2026
69f2a64
test(chat-5): integration tests for pin messages + presence (18 new) …
iammukeshm May 13, 2026
b828875
fix(chat-5): live read receipts + scope presence broadcasts to tenant…
iammukeshm May 13, 2026
38560bf
feat(infra): FSH.Starter.DbMigrator — dedicated console for applying …
iammukeshm May 13, 2026
0831d10
fix(chat-5): dedupe own-send temp against the SignalR echo to kill th…
iammukeshm May 13, 2026
d130f3f
feat(infra): wire DbMigrator into Aspire + advisory lock + wait-for-DB
iammukeshm May 13, 2026
b5d3818
fix(infra): DbMigrator end-to-end smoke clean — DI + logging + IHoste…
iammukeshm May 13, 2026
011a6e9
fix(chat-5): more breathing room between consecutive bubbles
iammukeshm May 13, 2026
f691c9d
fix(chat-5): bubble halo + much more breathing room between merged rows
iammukeshm May 13, 2026
d78f7d8
fix(chat-5): make merged-row spacing uniform — drop conditional row p…
iammukeshm May 13, 2026
0f4d1f8
fix(chat-5): presign chat attachment URLs at upload so SendMessage do…
iammukeshm May 13, 2026
9edaafe
fix(chat-5): allow attachment-only messages + skip markRead for optim…
iammukeshm May 13, 2026
7fd285a
test(catalog): integration tests for the product CRUD endpoints
iammukeshm May 13, 2026
76fec24
fix(persistence): soft-delete interceptor leaves owned-type reference…
iammukeshm May 13, 2026
e3fac31
fix(migrator): clear CI -warnaserror analyzer errors
iammukeshm May 13, 2026
122a44d
build: treat warnings as errors locally to match CI
iammukeshm May 13, 2026
eda868b
build(aspire): bump Aspire to 13.3.2
iammukeshm May 14, 2026
be2afee
refactor(multitenancy): remove API auto-migration; DbMigrator is the …
iammukeshm May 14, 2026
22cf457
fix(chat): align MessageTests with attachment-only-message contract
iammukeshm May 14, 2026
bdfee3b
build: bump runtime packages to 10.0.8 / 10.6.0; adapt Testcontainers…
iammukeshm May 14, 2026
1f7f4d8
docs: backend health audit — 2026-05-14 (Grade A, 97/100)
iammukeshm May 14, 2026
a432f4c
docs: add CONTRIBUTING.md and SECURITY.md
iammukeshm May 14, 2026
f85d266
fix(docs/deps): patch 8 Dependabot alerts via npm audit fix
iammukeshm May 14, 2026
8483312
test: add Catalog/Notifications/Billing endpoint tests; fix README do…
iammukeshm May 14, 2026
7e0a764
build: finish Testcontainers 4.11 API adaptation in 3 remaining files
iammukeshm May 14, 2026
6e9e22d
fix(security): resolve 5 CodeQL alerts (1 high, 4 medium)
iammukeshm May 15, 2026
dabecf4
fix(ci): use ContainerImageTags (plural) in DbMigrator smoke publish
iammukeshm May 15, 2026
bb370a7
fix(ci): drop legacy PublishProfile=DefaultContainer, use PublishCont…
iammukeshm May 15, 2026
e08f3ff
feat: multitenancy hardening, impersonation, admin app rebuild, demo …
iammukeshm May 18, 2026
169bb4e
fix(security): bump devalue 5.6.4 → 5.8.1 (GHSA-77vg-94rm-hx3p)
iammukeshm May 18, 2026
861381e
fix(migrator): resolve JwtOptions validation failure in Aspire orches…
cesarcastrocuba May 18, 2026
4b307cd
feat(v1-ui): admin + dashboard gap closure with Playwright coverage
iammukeshm May 18, 2026
59aaaa0
feat(v1-backend): v1 P0 hardening pass (security + correctness)
iammukeshm May 18, 2026
e2a740c
fix(migrator): inject JwtOptions placeholder when SigningKey is empty
iammukeshm May 18, 2026
ab38a51
build(aspire): bump Aspire.Hosting.* + AppHost SDK 13.3.2 → 13.3.3
iammukeshm May 18, 2026
40352a4
fix(ui): audit-detail crash, banner redesign, cursor affordance
iammukeshm May 18, 2026
ed6e699
refactor(admin/audits): redesign /audits/:id for the forensic-record …
iammukeshm May 18, 2026
68e5884
feat(admin/impersonation): re-open session button for closed-browser …
iammukeshm May 18, 2026
59265c3
docs(spec): production docker-compose deploy design
iammukeshm May 18, 2026
5c00d18
docs(spec): docs site rebuild — Astro + Tailwind 4, blog visual twin
iammukeshm May 18, 2026
95ba548
docs(plan): implementation plan for production docker-compose deploy
iammukeshm May 18, 2026
b8ffa2a
docs(plan): docs site rebuild — 25-task implementation plan
iammukeshm May 18, 2026
5f99319
feat(docs): scaffold project files (package.json, tsconfig, gitignore)
iammukeshm May 18, 2026
53788bc
feat(docs): install astro 6 + tailwind 4 + integrations
iammukeshm May 18, 2026
dbfdda6
feat(docs): import design tokens verbatim from codewithmukesh/blog
iammukeshm May 18, 2026
d5f0d85
feat(docs): swap primary token to green (#15803d / soft #16a34a)
iammukeshm May 18, 2026
5f359cf
feat(docs): rebrand gradient to green; drop unused tailwind plugins
iammukeshm May 18, 2026
846101d
feat(docs): wire astro.config with green-tinted EC overrides
iammukeshm May 18, 2026
6477a63
feat(docs): site config, content schema, modified-time remark plugin
iammukeshm May 18, 2026
957f4d9
feat(docs): BaseLayout with SEO meta, theme init, skip-link
iammukeshm May 18, 2026
ce5fbb4
feat(docs): ThemeToggle (Astro component, mirrors blog) with View Tra…
iammukeshm May 18, 2026
d81fd80
feat(docs): Header — visual twin of blog with docs nav
iammukeshm May 18, 2026
2755287
feat(docs): Footer — visual twin with project links (no newsletter)
iammukeshm May 18, 2026
04cb11a
feat(docs): MarketingLayout + 404 page
iammukeshm May 18, 2026
345a5d0
feat(docs): landing page with placeholder hero
iammukeshm May 18, 2026
eb38481
fix(docs): adapt config for astro 6 — static output, drop formkit import
iammukeshm May 18, 2026
2ba613b
feat(docs): seed initial MDX content (overview + per-section stubs)
iammukeshm May 18, 2026
b926c40
build(docker): tighten root .dockerignore for frontend + test artifacts
iammukeshm May 18, 2026
9eb560b
feat(docs): sidebar tree builder derived from content collection
iammukeshm May 18, 2026
abcbf49
feat(docs): Sidebar + TOC + PageHeader + Breadcrumbs + PrevNext
iammukeshm May 18, 2026
873161d
feat(docs): MDX component map (Callout, CodeGroup)
iammukeshm May 18, 2026
b7fdf7a
feat(docs): DocsLayout + dynamic [...slug] route
iammukeshm May 18, 2026
a010aa1
refactor(admin): load /config.json at boot for runtime-configurable A…
iammukeshm May 18, 2026
0380fd2
feat(docs): pagefind-powered search (Orama swapped due to Astro 6 inc…
iammukeshm May 18, 2026
47aa12f
feat(docs): full landing page (Hero, FeatureGrid, InstallSnippet, Fin…
iammukeshm May 18, 2026
79adfe6
feat(docs): favicon + Cloudflare Pages config (wrangler.toml)
iammukeshm May 18, 2026
da5c3ec
refactor(dashboard): load /config.json at boot for runtime-configurab…
iammukeshm May 18, 2026
83857a5
feat(docs): README + final purple-hex comment cleanup
iammukeshm May 18, 2026
e1308b1
fix(docs): zod 4 strict default — provide explicit sidebar object
iammukeshm May 18, 2026
d2a1d96
build(admin): Dockerfile with nginx + runtime /config.json envsubst
iammukeshm May 18, 2026
535e100
fix(docs): wire Astro 6 <Font> components — auto-injection removed in…
iammukeshm May 18, 2026
727d74a
build(dashboard): Dockerfile with nginx + runtime /config.json envsubst
iammukeshm May 18, 2026
59b513e
build(api): chiseled runtime + APP_UID; bump bases off preview
iammukeshm May 18, 2026
07e08f6
build(migrator): chiseled Dockerfile + APP_UID + csproj container har…
iammukeshm May 18, 2026
be1b89d
build(deploy): docker-compose .env.example with all knobs documented
iammukeshm May 18, 2026
7cea2e9
feat(docs): redesign landing — conversion-focused with modern code wi…
iammukeshm May 18, 2026
c897e42
build(deploy): postgres init SQL — required extensions
iammukeshm May 18, 2026
7ec33c3
build(deploy): production docker-compose.yml — full stack on one host
iammukeshm May 18, 2026
a13ee83
docs(deploy): five-minute docker-compose deploy guide
iammukeshm May 18, 2026
3f2d202
fix(docs): theme toggle, nav active, alignment, code panel polish
iammukeshm May 18, 2026
896aa69
fix(docs): use blog's exact MDX codeblock style (drop custom code-win…
iammukeshm May 18, 2026
90a6fa3
fix(deploy): resolve 3 issues found during e2e smoke test
iammukeshm May 18, 2026
4130e15
test(deploy): end-to-end docker-compose smoke verified locally
iammukeshm May 18, 2026
9846e0c
docs: point README at deploy/docker for the production deploy story
iammukeshm May 18, 2026
4246fa3
feat(docs): redesign CodeFirst as VS Code-style editor with file tree
iammukeshm May 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
65 changes: 65 additions & 0 deletions .agents/rules/api-conventions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
paths:
- "src/Modules/**/Features/**/*"
- "src/Modules/**/*Endpoint*.cs"
---

# API Conventions

Rules for API endpoints in FSH.

## Endpoint Requirements

Every endpoint MUST have:

```csharp
endpoints.MapPost("/", handler)
.WithName(nameof(CommandOrQuery)) // Required: Unique name
.WithSummary("Description") // Required: OpenAPI description
.RequirePermission(Permission) // Required: Or .AllowAnonymous()
```

## HTTP Method Mapping

| Operation | Method | Return |
|-----------|--------|--------|
| Create | `MapPost` | `TypedResults.Created(...)` |
| Read single | `MapGet` | `TypedResults.Ok(...)` |
| Read list | `MapGet` | `TypedResults.Ok(...)` |
| Update | `MapPut` | `TypedResults.Ok(...)` or `NoContent()` |
| Delete | `MapDelete` | `TypedResults.NoContent()` |

## Route Patterns

```
/api/v1/{module}/{entities} # Collection
/api/v1/{module}/{entities}/{id} # Single item
/api/v1/{module}/{entities}/{id}/sub # Sub-resource
```

## Response Types

Always use `TypedResults`:
- `TypedResults.Ok(data)`
- `TypedResults.Created($"/path/{id}", data)`
- `TypedResults.NoContent()`
- `TypedResults.NotFound()`
- `TypedResults.BadRequest(errors)`

Never return raw objects or use `Results.Ok()`.

## Permission Format

```csharp
.RequirePermission({Module}Permissions.{Entity}.{Action})
```

Actions: `View`, `Create`, `Update`, `Delete`

## Query Parameters

Use `[AsParameters]` for complex queries:

```csharp
endpoints.MapGet("/", async ([AsParameters] GetProductsQuery query, ...) => ...)
```
247 changes: 247 additions & 0 deletions .agents/rules/architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,247 @@
---
paths:
- "src/**"
---

# Architecture Rules

FSH is a **Modular Monolith** — NOT microservices, NOT a traditional layered architecture.

## Core Principles

### 1. Modular Monolith

```
Single deployment unit
Multiple bounded contexts (modules)
Each module is self-contained
Communication via Contracts (interfaces/DTOs)
```

**Modules:**
- Identity (users, roles, permissions)
- Multitenancy (tenants, subscriptions)
- Auditing (audit trails)
- Your business modules (e.g., Catalog, Orders)

**Rules:**
- Modules CANNOT reference other module internals
- Modules CAN reference other module Contracts
- Modules share BuildingBlocks (framework code)

### 2. CQRS (Mediator Library)

**Commands** (write operations):
```csharp
public record CreateUserCommand(string Email) : ICommand<Guid>;

public class CreateUserHandler : ICommandHandler<CreateUserCommand, Guid>
{
public async ValueTask<Guid> Handle(CreateUserCommand cmd, CancellationToken ct)
{
// Write to database
return user.Id;
}
}
```

**Queries** (read operations):
```csharp
public record GetUserQuery(Guid Id) : IQuery<UserDto>;

public class GetUserHandler : IQueryHandler<GetUserQuery, UserDto>
{
public async ValueTask<UserDto> Handle(GetUserQuery query, CancellationToken ct)
{
// Read from database
return userDto;
}
}
```

⚠️ **NOT MediatR:** FSH uses `Mediator` library (different interfaces!)

### 3. Domain-Driven Design

**Entities** inherit `BaseEntity`:
```csharp
public class Product : BaseEntity, IAuditable
{
public string Name { get; private set; } = default!;
public Money Price { get; private set; } = default!;

public static Product Create(string name, Money price)
{
// Factory method, enforce invariants
return new Product { Name = name, Price = price };
}
}
```

**Value Objects** (immutable):
```csharp
public record Money(decimal Amount, string Currency);
```

**Aggregates:**
- Root entity controls access to child entities
- Enforce business rules
- Transaction boundary

### 4. Multi-Tenancy

**Finbuckle.MultiTenant:**
- Shared database, tenant isolation via TenantId
- Automatic query filtering
- Tenant resolution from HTTP header or claim

```csharp
// Tenant-aware entity
public class Order : BaseEntity, IMustHaveTenant
{
public Guid TenantId { get; set; } // Auto-filtered
}
```

**Tenant Resolution Order:**
1. HTTP header: `X-Tenant`
2. JWT claim: `tenant`
3. Host/route strategy (optional)

### 5. Vertical Slice Architecture

Each feature = complete slice (command/handler/validator/endpoint in one folder).

```
Features/v1/CreateProduct/
├── CreateProductCommand.cs
├── CreateProductHandler.cs
├── CreateProductValidator.cs
└── CreateProductEndpoint.cs
```

**Benefits:**
- High cohesion (related code together)
- Low coupling (features don't depend on each other)
- Easy to find/modify

### 6. BuildingBlocks (Shared Kernel)

11 packages providing cross-cutting concerns:

| Package | Purpose |
|---------|---------|
| Core | Base entities, interfaces, exceptions |
| Persistence | EF Core, repositories, specifications |
| Caching | Redis/memory caching |
| Mailing | Email templates, MailKit integration |
| Jobs | Hangfire background jobs |
| Storage | File storage (AWS S3, local) |
| Web | API conventions, filters, middleware |
| Eventing | Domain events, message bus |
| Blazor.UI | UI components (optional) |
| Shared | DTOs, constants |
| Eventing.Abstractions | Event contracts |

**Protected:** BuildingBlocks should NOT be modified without approval. See `.claude/rules/buildingblocks-protection.md`.

### 7. Dependency Flow

```
API Layer (Minimal APIs)
Application Layer (Commands/Queries/Handlers)
Domain Layer (Entities/Value Objects)
Infrastructure Layer (Persistence/External Services)
```

**Rules:**
- Domain CANNOT depend on infrastructure
- Application CANNOT depend on infrastructure directly
- Infrastructure implements domain interfaces

### 8. Persistence Strategy

**DbContext per Module:**
- IdentityDbContext
- MultitenancyDbContext
- AuditingDbContext
- Your module DbContexts

**Repository Pattern:**
```csharp
public interface IRepository<T> where T : BaseEntity
{
Task<T?> GetByIdAsync(Guid id, CancellationToken ct);
Task<List<T>> ListAsync(Specification<T> spec, CancellationToken ct);
Task<T> AddAsync(T entity, CancellationToken ct);
Task UpdateAsync(T entity, CancellationToken ct);
Task DeleteAsync(T entity, CancellationToken ct);
}
```

**Specification Pattern** (queries):
```csharp
public class ActiveProductsSpec : Specification<Product>
{
public ActiveProductsSpec()
{
Query.Where(p => !p.IsDeleted && p.IsActive);
}
}
```

## Architectural Tests

`Architecture.Tests` project enforces rules:

```csharp
[Fact]
public void Modules_Should_Not_Reference_Other_Modules()
{
// Fails if Module A references Module B directly
}

[Fact]
public void Domain_Should_Not_Depend_On_Infrastructure()
{
// Fails if domain entities reference EF Core
}
```

## Technology Stack

- **.NET 10** (latest LTS)
- **EF Core 10** (PostgreSQL provider)
- **Mediator** (CQRS)
- **FluentValidation** (input validation)
- **Mapster** (object mapping)
- **Hangfire** (background jobs)
- **Finbuckle.MultiTenant** (multi-tenancy)
- **MailKit** (email)
- **Scalar** (OpenAPI docs)
- **Serilog** (logging)
- **OpenTelemetry** (observability)
- **Aspire** (orchestration)

## Key Takeaways

1. **Modular Monolith** ≠ Microservices. Modules share process, database, infrastructure.
2. **CQRS** separates reads/writes. Use `ICommand`/`IQuery`, not `IRequest`.
3. **DDD** enforces business rules in domain. Entities control their state.
4. **Multi-Tenancy** is built-in. Every entity is either tenant-aware or shared.
5. **Vertical Slices** keep features independent. No shared "services" layer.
6. **BuildingBlocks** provide infrastructure. Don't reinvent, reuse.
7. **Tests enforce architecture**. Violate rules → build fails.

---

For implementation details, see:
- `ARCHITECTURE_ANALYSIS.md` (deep dive)
- `.claude/rules/modules.md` (module patterns)
- `.claude/rules/persistence.md` (data access patterns)
36 changes: 36 additions & 0 deletions .agents/rules/buildingblocks-protection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
---
paths:
- "src/BuildingBlocks/**/*"
---

# ⚠️ BuildingBlocks Protection

**STOP. You are modifying BuildingBlocks.**

Changes to BuildingBlocks affect ALL modules across the entire framework. These are core abstractions that many projects depend on.

## Before Proceeding

1. **Confirm explicit approval** - Has the user specifically approved this change?
2. **Consider alternatives** - Can this be done in the module instead?
3. **Assess impact** - What modules will this affect?

## If Approved

- Make minimal, focused changes
- Ensure backward compatibility
- Update all affected modules
- Run full test suite: `dotnet test src/FSH.Framework.slnx`
- Document the change

## Alternatives to Consider

| Instead of... | Consider... |
|---------------|-------------|
| Modifying Core | Extension method in module |
| Changing Persistence | Custom repository in module |
| Updating Web | Module-specific middleware |

## If Not Approved

Do not proceed. Suggest alternatives that don't require BuildingBlocks modifications.
Loading
Loading