Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/ci-hotreload.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: CI - HotReload

on:
push:
branches: [main]
paths:
- 'src/HotReload/**'
- 'eng/**'
- 'Directory.Build.props'
- 'Directory.Build.targets'
- 'Directory.Packages.props'
- 'global.json'
- 'NuGet.config'
pull_request:
types: [opened, synchronize, reopened, edited]
branches: [main]
paths:
- 'src/HotReload/**'
- 'eng/**'
- 'Directory.Build.props'
- 'Directory.Build.targets'
- 'Directory.Packages.props'
- 'global.json'
- 'NuGet.config'

jobs:
build:
uses: ./.github/workflows/_build.yml
with:
project-path: src/HotReload/HotReload.slnf
project-name: hotreload
run-tests: false
pack: true
install-workloads: false
6 changes: 6 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ This repository hosts experimental .NET MAUI packages. It is a **multi-product m
| **Cli** | `Microsoft.Maui.Cli` (global tool: `maui`) | Unified MAUI command-line tool: environment diagnostics (`maui doctor`), Android SDK/JDK/emulator management, Apple platform management, device listing, `maui go` for rapid prototyping, `maui profile startup` for performance tracing, and the `maui devflow` automation surface. |
| **DevFlow** | `Microsoft.Maui.DevFlow.*` packages plus the unified `maui devflow` CLI surface | Runtime MAUI automation toolkit. In-app agent with HTTP API, visual tree inspection, CDP bridge for Blazor WebViews, MCP server for AI agents, cross-platform driver library. |
| **Comet** | `Comet`, `Comet.SourceGenerator`, `Comet.Layout.Yoga` | Experimental MVU UI framework for .NET MAUI — C# fluent UI, signals/reactive state, Yoga layout. |
| **HotReload** | `Microsoft.Maui.HotReload` | MetadataUpdateHandler for .NET MAUI hot reload — `IHotReloadable` interface with per-instance `OnHotReload()` callbacks, backed by a Roslyn source generator. |
| **Go** | `Microsoft.Maui.Go.Server` + Comet Go companion app | Single-file Comet apps server and companion app for rapid prototyping (alpha; sister to Comet). |
| **Essentials.AI** | `Microsoft.Maui.Essentials.AI` | On-device AI for .NET MAUI — semantic search, chat completion, embeddings, and tool use against local models. |
| **AIExtensions** | `Microsoft.Maui.AI.Attributes` | Source-generated AI tool bindings — turns decorated C# methods into `Microsoft.Extensions.AI`-callable tools using Roslyn, with DI parameter binding and AOT support. |
Expand Down Expand Up @@ -128,6 +129,11 @@ maui-labs/
│ ├── Linux.Gtk4/ # Linux GTK4 platform backend
│ ├── MacOS/ # macOS AppKit platform backend
│ └── Windows.WPF/ # WPF platform backend
├── src/
│ └── HotReload/ # HotReload product
│ ├── Microsoft.Maui.HotReload/ # Shipping package (IHotReloadable, registry, handler)
│ ├── Microsoft.Maui.HotReload.SourceGen/ # Roslyn source generator (bundled as analyzer)
│ └── HotReload.slnf # Solution filter
├── samples/ # Sample MAUI apps (not shipped)
├── playground/ # Manual test/scratch apps
├── eng/ # Shared build infrastructure
Expand Down
4 changes: 4 additions & 0 deletions MauiLabs.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
<Project Path="samples/EssentialsAISample/EssentialsAISample.csproj" />
</Folder>
<Folder Name="/src/" />
<Folder Name="/src/HotReload/">
<Project Path="src/HotReload/Microsoft.Maui.HotReload/Microsoft.Maui.HotReload.csproj" />
<Project Path="src/HotReload/Microsoft.Maui.HotReload.SourceGen/Microsoft.Maui.HotReload.SourceGen.csproj" />
</Folder>
<Folder Name="/src/AI/">
<Project Path="src/AI/Microsoft.Maui.Essentials.AI/Microsoft.Maui.Essentials.AI.csproj" />
</Folder>
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,14 @@ Built artifacts are exposed as `@(MauiAppArtifact)` items with `ArtifactType`, `
|---------|-------------|
| `Microsoft.Maui.Build.AppProjectReference` | Build-time app project reference with artifact discovery |

### HotReload

A `MetadataUpdateHandler` for .NET MAUI that delivers per-instance hot reload callbacks via the `IHotReloadable` interface, backed by a Roslyn source generator.

| Package | Description |
|---------|-------------|
| `Microsoft.Maui.HotReload` | MetadataUpdateHandler for .NET MAUI hot reload with `IHotReloadable` callbacks |

## Agent Skills

This repository is also a marketplace for distributable agent skills for .NET MAUI development. Skills are organized as plugins compatible with Copilot CLI, Claude Code, and VS Code.
Expand Down
87 changes: 86 additions & 1 deletion eng/pipelines/devflow-official.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ parameters:
displayName: 'Publish EssentialsAI packages to NuGet.org'
type: boolean
default: false
- name: publishHotReloadNuget
displayName: 'Publish HotReload packages to NuGet.org'
type: boolean
default: false

variables:
- template: /eng/pipelines/common-variables.yml@self
Expand Down Expand Up @@ -387,7 +391,33 @@ extends:
-projects $(Build.SourcesDirectory)\platforms\MacOS\MacOS-libs.slnf
$(_OfficialBuildArgs)
displayName: Build, Test and Pack macOS AppKit


# HotReload targets netstandard2.0 + net10.0 with no MAUI workloads.
# Builds and packs on Windows for MicroBuild/ESRP signing.
- job: HotReload
displayName: HotReload - Windows
pool:
name: NetCore1ESPool-Internal
demands: ImageOverride -equals windows.vs2026preview.scout.amd64
strategy:
matrix:
Release:
_BuildConfig: Release
_OfficialBuildArgs: /p:DotNetSignType=$(_SignType)
/p:TeamName=$(_TeamName)
/p:OfficialBuildId=$(BUILD.BUILDNUMBER)
steps:
- task: UseDotNet@2
displayName: Install .NET SDK
inputs:
version: 10.0.105
- script: eng\common\cibuild.cmd
-configuration $(_BuildConfig)
-prepareMachine
-projects $(Build.SourcesDirectory)\src\HotReload\HotReload.slnf
$(_OfficialBuildArgs)
displayName: Build and Pack HotReload

- template: /eng/common/templates-official/post-build/post-build.yml@self
parameters:
enableSourceLinkValidation: false
Expand Down Expand Up @@ -834,3 +864,58 @@ extends:
packageParentPath: '$(Pipeline.Workspace)/MacOSPackages'
nuGetFeedType: external
publishFeedCredentials: 'nuget.org (dotnetframework)'

# Publish HotReload packages to NuGet.org
- ${{ if eq(parameters.publishHotReloadNuget, true) }}:
- stage: publish_hotreload_nuget
displayName: 'Publish HotReload to NuGet.org'
dependsOn:
- Validate
- publish_using_darc
jobs:
- job: PrepareArtifacts
displayName: 'Prepare HotReload Artifacts'
timeoutInMinutes: 15
pool:
name: NetCore1ESPool-Internal
image: windows.vs2026preview.scout.amd64
os: windows
templateContext:
outputs:
- output: pipelineArtifact
displayName: Publish HotReload Packages
targetPath: '$(Pipeline.Workspace)/HotReloadPackages'
artifactName: HotReloadPackagesForNuGet
steps:
- download: current
artifact: PackageArtifacts
displayName: Download PackageArtifacts
- powershell: |
New-Item -ItemType Directory -Force -Path '$(Pipeline.Workspace)/HotReloadPackages'
Copy-Item '$(Pipeline.Workspace)/PackageArtifacts/Microsoft.Maui.HotReload.*.nupkg' '$(Pipeline.Workspace)/HotReloadPackages/' -Verbose
displayName: Filter HotReload packages

- job: PublishNuGet
displayName: 'Push HotReload to NuGet.org'
dependsOn: PrepareArtifacts
timeoutInMinutes: 30
pool:
name: NetCore1ESPool-Internal
image: windows.vs2026preview.scout.amd64
os: windows
templateContext:
type: releaseJob
isProduction: true
inputs:
- input: pipelineArtifact
artifactName: HotReloadPackagesForNuGet
targetPath: '$(Pipeline.Workspace)/HotReloadPackages'
steps:
- task: 1ES.PublishNuget@1
displayName: 'Push HotReload to NuGet.org'
inputs:
useDotNetTask: false
packagesToPush: '$(Pipeline.Workspace)/HotReloadPackages/*.nupkg'
packageParentPath: '$(Pipeline.Workspace)/HotReloadPackages'
nuGetFeedType: external
publishFeedCredentials: 'nuget.org (dotnetframework)'
9 changes: 9 additions & 0 deletions src/HotReload/HotReload.slnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"solution": {
"path": "../../MauiLabs.slnx",
"projects": [
"src\\HotReload\\Microsoft.Maui.HotReload\\Microsoft.Maui.HotReload.csproj",
"src\\HotReload\\Microsoft.Maui.HotReload.SourceGen\\Microsoft.Maui.HotReload.SourceGen.csproj"
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
; Shipped analyzer releases
; https://github.com/dotnet/roslyn-analyzers/blob/master/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
; Unshipped analyzer release
; https://github.com/dotnet/roslyn-analyzers/blob/master/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md

### New Rules

Rule ID | Category | Severity | Notes
--------|----------|----------|-------
MUH0001 | HotReload | Info | HotReloadInitialize not called in constructor
Loading
Loading