From c67bc8c2fa0d337ad9510652ca517cd4f4f82c9d Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Wed, 11 Nov 2026 13:04:20 +0100 Subject: [PATCH 1/2] feat: generate versioned AI documentation with LibMentor --- .config/dotnet-tools.json | 13 ++++ .github/actions/libmentor/action.yml | 19 ++++++ .github/scripts/libmentor-version.py | 11 ++++ .github/workflows/libmentor.yml | 19 ++++++ .github/workflows/pages.yml | 12 ++++ .gitignore | 3 + LIBMENTOR.md | 11 ++++ README.md | 98 ++++++++++++++-------------- libmentor.json | 33 ++++++++++ 9 files changed, 170 insertions(+), 49 deletions(-) create mode 100644 .config/dotnet-tools.json create mode 100644 .github/actions/libmentor/action.yml create mode 100644 .github/scripts/libmentor-version.py create mode 100644 .github/workflows/libmentor.yml create mode 100644 LIBMENTOR.md create mode 100644 libmentor.json diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 00000000..7f363e6f --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "libmentor": { + "version": "0.1.0", + "commands": [ + "libmentor" + ], + "rollForward": false + } + } +} diff --git a/.github/actions/libmentor/action.yml b/.github/actions/libmentor/action.yml new file mode 100644 index 00000000..39b61a02 --- /dev/null +++ b/.github/actions/libmentor/action.yml @@ -0,0 +1,19 @@ +name: Generate LibMentor documentation +description: Build validated AI documentation from a versioned source snapshot +runs: + using: composite + steps: + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + - name: Restore pinned CLI + shell: bash + working-directory: ${{ github.workspace }} + run: dotnet tool restore + - name: Generate and verify + shell: bash + working-directory: ${{ github.workspace }} + run: | + version="$(python3 .github/scripts/libmentor-version.py)" + dotnet tool run libmentor -- generate --revision "$GITHUB_SHA" --library-version "$version" + dotnet tool run libmentor -- generate --check --revision "$GITHUB_SHA" --library-version "$version" diff --git a/.github/scripts/libmentor-version.py b/.github/scripts/libmentor-version.py new file mode 100644 index 00000000..77c740cb --- /dev/null +++ b/.github/scripts/libmentor-version.py @@ -0,0 +1,11 @@ +import json +import os +from pathlib import Path +import xml.etree.ElementTree as ET + +version = ET.parse("Version.props").findtext(".//PackageVersion") +if not version: + raise SystemExit("Library version could not be resolved.") +revision = os.environ.get("GITHUB_SHA", "local")[:12] +base = version.split("+", 1)[0] +print(base + (".source." if "-" in base else "-source.") + revision) diff --git a/.github/workflows/libmentor.yml b/.github/workflows/libmentor.yml new file mode 100644 index 00000000..27036ad9 --- /dev/null +++ b/.github/workflows/libmentor.yml @@ -0,0 +1,19 @@ +name: LibMentor validation +on: + pull_request: + push: + branches: [main] + workflow_dispatch: +permissions: + contents: read +jobs: + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/libmentor + - uses: actions/upload-artifact@v4 + with: + name: libmentor-documentation + path: .libmentor + include-hidden-files: true diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index f85af7a8..fca74aec 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -12,6 +12,13 @@ on: branches: [main] paths: - 'docs/**' + - 'Nextended.*/**' + - 'Version.props' + - 'README.md' + - 'libmentor.json' + - '.config/dotnet-tools.json' + - '.github/actions/libmentor/**' + - '.github/scripts/libmentor-version.py' - 'icon.png' - '.github/workflows/pages.yml' workflow_dispatch: @@ -52,6 +59,11 @@ jobs: working-directory: docs run: npm run build + - uses: ./.github/actions/libmentor + + - name: Include AI documentation + run: cp -R .libmentor docs/.vitepress/dist/ai + - uses: actions/configure-pages@v5 - uses: actions/upload-pages-artifact@v3 diff --git a/.gitignore b/.gitignore index ac874631..9cc102c0 100644 --- a/.gitignore +++ b/.gitignore @@ -364,3 +364,6 @@ MigrationBackup/ docs/node_modules/ docs/.vitepress/dist/ docs/.vitepress/cache/ + +.libmentor/ +.libmentor-inputs/ diff --git a/LIBMENTOR.md b/LIBMENTOR.md new file mode 100644 index 00000000..fcd33581 --- /dev/null +++ b/LIBMENTOR.md @@ -0,0 +1,11 @@ +# AI documentation + +LibMentor generates versioned documentation from this repository. Restore the pinned tool with `dotnet tool restore`, then run `dotnet tool run libmentor -- generate`. + +CI resolves the library version from its existing metadata and adds a source revision suffix. This describes the source snapshot, rather than claiming that a package with the same version has already been released. Files are generated under `.libmentor/`; repository contributor instructions are preserved. + +The consumer entry point after deployment is [llms.txt](https://fgilde.github.io/Nextended/ai/llms.txt). The same output is available as the `libmentor-documentation` workflow artifact. The first LibMentor 0.1.0 NuGet release must exist before tool restore can succeed. + +The published skill is under `ai/skills/`. Copy the complete library folder, including its references, to your client's skills directory. + +Generation validates local Markdown links and explicit API-symbol links. C# source declarations are parsed without a project build; see extraction evidence in `knowledge.json`. Compiled Razor APIs require compiler XML input. Markdown code fences are not compiled automatically. diff --git a/README.md b/README.md index e0f22692..ec4fe341 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +

Nextended

@@ -17,8 +17,8 @@

- 📖 Documentation (English) · - 📖 Dokumentation (Deutsch) + ?? Documentation (English) � + ?? Dokumentation (Deutsch)

@@ -33,61 +33,61 @@ | --- | --- | --- | | **Documentation portal** | [fgilde.github.io/Nextended](https://fgilde.github.io/Nextended/) | [Dokumentationsportal](docs/de/index.md) | | **Getting started** | [Installation](docs/guides/installation.md) | [Installation](docs/de/guides/installation.md) | -| **Architecture** | [Overview](docs/guides/architecture.md) | [Überblick](docs/de/guides/architecture.md) | -| **Per-package guides** | [Projects](docs/projects/README.md) | [Projekte](docs/de/projects/README.md) | -| **Examples** | [Common use cases](docs/examples/common-use-cases.md) | [Typische Anwendungsfälle](docs/de/examples/common-use-cases.md) | +| **Architecture** | [Overview](docs/guides/architecture.md) | [�berblick](docs/de/guides/architecture.md) | +| **Per-package guides** | [Projects](docs/projects/index.md) | [Projekte](docs/de/projects/index.md) | +| **Examples** | [Common use cases](docs/examples/common-use-cases.md) | [Typische Anwendungsf�lle](docs/de/examples/common-use-cases.md) | ## Packages - + ### Core libraries | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Core](Nextended.Core/README.md)** | Foundation library — extension methods, custom types (Money, Date, BaseId, SuperType), class mapping, deep clone, encryption, hashing and the code-generation attributes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Core.svg)](https://www.nuget.org/packages/Nextended.Core/) | [Docs](https://fgilde.github.io/Nextended/projects/core) | -| **[Nextended.Cache](Nextended.Cache/README.md)** | Expression-based caching — automatic cache keys from method expressions, CacheProvider with condition-based invalidation, thread-safe AddOrGetExisting. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Cache.svg)](https://www.nuget.org/packages/Nextended.Cache/) | [Docs](https://fgilde.github.io/Nextended/projects/cache) | +| **[Nextended.Core](Nextended.Core/README.md)** | Foundation library - extension methods, custom types (Money, Date, BaseId, SuperType), class mapping, deep clone, encryption, hashing and the code-generation attributes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Core.svg)](https://www.nuget.org/packages/Nextended.Core/) | [Docs](https://fgilde.github.io/Nextended/projects/core) | +| **[Nextended.Cache](Nextended.Cache/README.md)** | Expression-based caching - automatic cache keys from method expressions, CacheProvider with condition-based invalidation, thread-safe AddOrGetExisting. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Cache.svg)](https://www.nuget.org/packages/Nextended.Cache/) | [Docs](https://fgilde.github.io/Nextended/projects/cache) | ### Data access | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.EF](Nextended.EF/README.md)** | Entity Framework Core extensions — graph loading (LoadGraphAsync, IncludeAll, MultiInclude), declarative include definitions, paging, dynamic sorting and bulk operations. | [![NuGet](https://img.shields.io/nuget/v/Nextended.EF.svg)](https://www.nuget.org/packages/Nextended.EF/) | [Docs](https://fgilde.github.io/Nextended/projects/ef) | +| **[Nextended.EF](Nextended.EF/README.md)** | Entity Framework Core extensions - graph loading (LoadGraphAsync, IncludeAll, MultiInclude), declarative include definitions, paging, dynamic sorting and bulk operations. | [![NuGet](https://img.shields.io/nuget/v/Nextended.EF.svg)](https://www.nuget.org/packages/Nextended.EF/) | [Docs](https://fgilde.github.io/Nextended/projects/ef) | ### ASP.NET Core & web | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Web](Nextended.Web/README.md)** | ASP.NET Core utilities — zero-config OData (AddODataAuto), composable IQueryable OData appliers, strongly typed controller URLs, streaming download helpers and a background executor that can replay a captured request. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Web.svg)](https://www.nuget.org/packages/Nextended.Web/) | [Docs](https://fgilde.github.io/Nextended/projects/web) | -| **[Nextended.ResponseFilters](Nextended.ResponseFilters/README.md)** | Fluent, provider-agnostic pipeline that redacts, masks, rounds, truncates, hashes, prunes and restructures response DTOs before serialization — per request, per user, per permission. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters) | -| **[Nextended.ResponseFilters.AspNetCore](Nextended.ResponseFilters.AspNetCore/README.md)** | ASP.NET Core adapter for Nextended.ResponseFilters — registers the pipeline as a global IAsyncResultFilter and replays structural edits against the serialized JSON tree. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.AspNetCore.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters.AspNetCore/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters-aspnetcore) | +| **[Nextended.Web](Nextended.Web/README.md)** | ASP.NET Core utilities - zero-config OData (AddODataAuto), composable IQueryable OData appliers, strongly typed controller URLs, streaming download helpers and a background executor that can replay a captured request. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Web.svg)](https://www.nuget.org/packages/Nextended.Web/) | [Docs](https://fgilde.github.io/Nextended/projects/web) | +| **[Nextended.ResponseFilters](Nextended.ResponseFilters/README.md)** | Fluent, provider-agnostic pipeline that redacts, masks, rounds, truncates, hashes, prunes and restructures response DTOs before serialization - per request, per user, per permission. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters) | +| **[Nextended.ResponseFilters.AspNetCore](Nextended.ResponseFilters.AspNetCore/README.md)** | ASP.NET Core adapter for Nextended.ResponseFilters - registers the pipeline as a global IAsyncResultFilter and replays structural edits against the serialized JSON tree. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.AspNetCore.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters.AspNetCore/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters-aspnetcore) | ### UI libraries | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Blazor](Nextended.Blazor/README.md)** | Blazor helpers — IBrowserFile extensions (bytes, data URLs, downloads), a hierarchical model for browsing inside uploaded zip/tar/rar archives, MIME-type detection and component-parameter reflection. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Blazor.svg)](https://www.nuget.org/packages/Nextended.Blazor/) | [Docs](https://fgilde.github.io/Nextended/projects/blazor) | -| **[Nextended.UI](Nextended.UI/README.md)** | WPF and Windows desktop helpers — a global input-binding manager with hold/sequence matching, DirectInput and XInput gamepad readers, key-bind capture controls, converters, behaviours, markup extensions and runtime-defined PropertyGrid types. | [![NuGet](https://img.shields.io/nuget/v/Nextended.UI.svg)](https://www.nuget.org/packages/Nextended.UI/) | [Docs](https://fgilde.github.io/Nextended/projects/ui) | +| **[Nextended.Blazor](Nextended.Blazor/README.md)** | Blazor helpers - IBrowserFile extensions (bytes, data URLs, downloads), a hierarchical model for browsing inside uploaded zip/tar/rar archives, MIME-type detection and component-parameter reflection. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Blazor.svg)](https://www.nuget.org/packages/Nextended.Blazor/) | [Docs](https://fgilde.github.io/Nextended/projects/blazor) | +| **[Nextended.UI](Nextended.UI/README.md)** | WPF and Windows desktop helpers - a global input-binding manager with hold/sequence matching, DirectInput and XInput gamepad readers, key-bind capture controls, converters, behaviours, markup extensions and runtime-defined PropertyGrid types. | [![NuGet](https://img.shields.io/nuget/v/Nextended.UI.svg)](https://www.nuget.org/packages/Nextended.UI/) | [Docs](https://fgilde.github.io/Nextended/projects/ui) | ### Code generation & tooling | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Imaging](Nextended.Imaging/README.md)** | Image processing — aspect-preserving resize, crop, colour replacement, brightness-based foreground picking, thumbnail generation, byte/data-URL conversion and MIME detection from magic bytes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Imaging.svg)](https://www.nuget.org/packages/Nextended.Imaging/) | [Docs](https://fgilde.github.io/Nextended/projects/imaging) | -| **[Nextended.CodeGen](Nextended.CodeGen/README.md)** | Roslyn source generator — DTOs and interfaces from your entities, strongly typed classes from JSON/XML, lookup tables from Excel, and documentation from source files. | [![NuGet](https://img.shields.io/nuget/v/Nextended.CodeGen.svg)](https://www.nuget.org/packages/Nextended.CodeGen/) | [Docs](https://fgilde.github.io/Nextended/projects/codegen) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/CodeGenSample) | +| **[Nextended.Imaging](Nextended.Imaging/README.md)** | Image processing - aspect-preserving resize, crop, colour replacement, brightness-based foreground picking, thumbnail generation, byte/data-URL conversion and MIME detection from magic bytes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Imaging.svg)](https://www.nuget.org/packages/Nextended.Imaging/) | [Docs](https://fgilde.github.io/Nextended/projects/imaging) | +| **[Nextended.CodeGen](Nextended.CodeGen/README.md)** | Roslyn source generator - DTOs and interfaces from your entities, strongly typed classes from JSON/XML, lookup tables from Excel, and documentation from source files. | [![NuGet](https://img.shields.io/nuget/v/Nextended.CodeGen.svg)](https://www.nuget.org/packages/Nextended.CodeGen/) | [Docs](https://fgilde.github.io/Nextended/projects/codegen) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/CodeGenSample) | ### .NET Aspire hosting | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Aspire](Nextended.Aspire/README.md)** | Conditional AppHost builder extensions — WithReferenceIf / WaitForIf / WithExplicitStartIf, strongly typed environment variables from config objects, HTTPS dev-cert wiring, Docker guards, GitHub-source resources and npm app discovery. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.svg)](https://www.nuget.org/packages/Nextended.Aspire/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire) | -| **[Nextended.Aspire.Hosting.Supabase](Nextended.Aspire.Hosting.Supabase/README.md)** | The complete Supabase stack — Postgres, Auth (GoTrue), REST, Realtime, Storage, Studio, Kong and Edge Functions — as one composable Aspire resource. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Supabase.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Supabase/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-supabase) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Supabase.AppHost) | -| **[Nextended.Aspire.Hosting.N8n](Nextended.Aspire.Hosting.N8n/README.md)** | The n8n workflow-automation platform as an Aspire resource, with Postgres persistence, workflow import and a typed client for triggering workflows from .NET. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.N8n.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.N8n/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-n8n) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/N8n.AppHost) | -| **[Nextended.Aspire.Hosting.Grafana](Nextended.Aspire.Hosting.Grafana/README.md)** | Grafana, Prometheus, Loki, Tempo, Promtail, cAdvisor, postgres_exporter and the OpenTelemetry Collector as composable resources with auto-provisioned datasources. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Grafana.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Grafana/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-grafana) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Grafana.AppHost) | -| **[Nextended.Aspire.Hosting.WebDataStudio](Nextended.Aspire.Hosting.WebDataStudio/README.md)** | WebDataStudio — a browser database studio for PostgreSQL, MySQL, SQL Server, SQLite, Oracle, DuckDB, ClickHouse, MongoDB and Redis — wired to the databases of your stack, with accounts and roles, an optional SQL assistant, and an MCP endpoint for AI agents. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.WebDataStudio.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.WebDataStudio/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-webdatastudio) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/WebDataStudio.AppHost) | -| **[Nextended.Aspire.Hosting.AspireUI](Nextended.Aspire.Hosting.AspireUI/README.md)** | AspireUI — the visual AppHost builder — as a resource inside your own Aspire stack, with an optional pre-seeded admin user and a starter stack built from your project paths. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.AspireUI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.AspireUI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-aspireui) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AspireUI.AppHost) | -| **[Nextended.Aspire.Hosting.LocalAI](Nextended.Aspire.Hosting.LocalAI/README.md)** | Self-hosted, OpenAI-compatible multimodal AI — image generation, text-to-speech, speech-to-text and video — with gallery model management, GPU support and Open WebUI. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.LocalAI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.LocalAI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-localai) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AiStack.AppHost) | -| **[Nextended.Aspire.Hosting.Php](Nextended.Aspire.Hosting.Php/README.md)** | Run PHP endpoints inside your Aspire stack — a docroot folder or a single router script served by PHP's built-in web server, with php.ini settings as fluent options. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Php.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Php/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-php) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Php.AppHost) | -| **[Nextended.Aspire.Hosting.DbTools](Nextended.Aspire.Hosting.DbTools/README.md)** | Database tools for an Aspire app host. The first: fill a database resource from a database that already exists — schema and data — from another resource in the stack or from a server it does not model. PostgreSQL, SQL Server, MySQL/MariaDB, MongoDB and Redis, each through its own engine's dump and restore tools. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.DbTools.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.DbTools/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-dbtools) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/DbTools.AppHost) | +| **[Nextended.Aspire](Nextended.Aspire/README.md)** | Conditional AppHost builder extensions - WithReferenceIf / WaitForIf / WithExplicitStartIf, strongly typed environment variables from config objects, HTTPS dev-cert wiring, Docker guards, GitHub-source resources and npm app discovery. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.svg)](https://www.nuget.org/packages/Nextended.Aspire/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire) | +| **[Nextended.Aspire.Hosting.Supabase](Nextended.Aspire.Hosting.Supabase/README.md)** | The complete Supabase stack - Postgres, Auth (GoTrue), REST, Realtime, Storage, Studio, Kong and Edge Functions - as one composable Aspire resource. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Supabase.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Supabase/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-supabase) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Supabase.AppHost) | +| **[Nextended.Aspire.Hosting.N8n](Nextended.Aspire.Hosting.N8n/README.md)** | The n8n workflow-automation platform as an Aspire resource, with Postgres persistence, workflow import and a typed client for triggering workflows from .NET. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.N8n.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.N8n/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-n8n) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/N8n.AppHost) | +| **[Nextended.Aspire.Hosting.Grafana](Nextended.Aspire.Hosting.Grafana/README.md)** | Grafana, Prometheus, Loki, Tempo, Promtail, cAdvisor, postgres_exporter and the OpenTelemetry Collector as composable resources with auto-provisioned datasources. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Grafana.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Grafana/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-grafana) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Grafana.AppHost) | +| **[Nextended.Aspire.Hosting.WebDataStudio](Nextended.Aspire.Hosting.WebDataStudio/README.md)** | WebDataStudio - a browser database studio for PostgreSQL, MySQL, SQL Server, SQLite, Oracle, DuckDB, ClickHouse, MongoDB and Redis - wired to the databases of your stack, with accounts and roles, an optional SQL assistant, and an MCP endpoint for AI agents. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.WebDataStudio.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.WebDataStudio/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-webdatastudio) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/WebDataStudio.AppHost) | +| **[Nextended.Aspire.Hosting.AspireUI](Nextended.Aspire.Hosting.AspireUI/README.md)** | AspireUI - the visual AppHost builder - as a resource inside your own Aspire stack, with an optional pre-seeded admin user and a starter stack built from your project paths. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.AspireUI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.AspireUI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-aspireui) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AspireUI.AppHost) | +| **[Nextended.Aspire.Hosting.LocalAI](Nextended.Aspire.Hosting.LocalAI/README.md)** | Self-hosted, OpenAI-compatible multimodal AI - image generation, text-to-speech, speech-to-text and video - with gallery model management, GPU support and Open WebUI. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.LocalAI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.LocalAI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-localai) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AiStack.AppHost) | +| **[Nextended.Aspire.Hosting.Php](Nextended.Aspire.Hosting.Php/README.md)** | Run PHP endpoints inside your Aspire stack - a docroot folder or a single router script served by PHP's built-in web server, with php.ini settings as fluent options. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Php.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Php/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-php) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Php.AppHost) | +| **[Nextended.Aspire.Hosting.DbTools](Nextended.Aspire.Hosting.DbTools/README.md)** | Database tools for an Aspire app host. The first: fill a database resource from a database that already exists - schema and data - from another resource in the stack or from a server it does not model. PostgreSQL, SQL Server, MySQL/MariaDB, MongoDB and Redis, each through its own engine's dump and restore tools. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.DbTools.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.DbTools/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-dbtools) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/DbTools.AppHost) | ## Quick start @@ -101,7 +101,7 @@ using Nextended.Core.Extensions; using Nextended.Core.Types; using Nextended.Core.DeepClone; -// Object mapping — no profiles, no configuration +// Object mapping - no profiles, no configuration var dto = user.MapTo(); var dtos = users.MapElementsTo(); @@ -125,7 +125,7 @@ Every Aspire integration and the source generator ship with a sample project you | Sample | Shows | | --- | --- | | [Supabase.AppHost](Tests/TestProjects/Supabase.AppHost) | The full Supabase stack as one Aspire resource | -| [AiStack.AppHost](Tests/TestProjects/AiStack.AppHost) | LocalAI and n8n together — self-hosted multimodal AI driven by workflows | +| [AiStack.AppHost](Tests/TestProjects/AiStack.AppHost) | LocalAI and n8n together - self-hosted multimodal AI driven by workflows | | [N8n.AppHost](Tests/TestProjects/N8n.AppHost) | n8n with Postgres persistence and workflow import | | [Grafana.AppHost](Tests/TestProjects/Grafana.AppHost) | Grafana, Prometheus, Loki, Tempo with auto-provisioned datasources | | [WebDataStudio.AppHost](Tests/TestProjects/WebDataStudio.AppHost) | One browser database studio across several databases | @@ -137,21 +137,21 @@ Every Aspire integration and the source generator ship with a sample project you ``` Nextended.sln -├─ Nextended.Core/ foundation: extensions, types, mapping, facets -├─ Nextended.Cache/ expression-based caching -├─ Nextended.EF/ EF Core query and graph extensions -├─ Nextended.Web/ ASP.NET Core + OData -├─ Nextended.ResponseFilters/ response shaping pipeline (provider-agnostic) -├─ Nextended.ResponseFilters.AspNetCore/ MVC adapter for the above -├─ Nextended.Blazor/ Blazor helpers -├─ Nextended.UI/ WPF / Windows desktop -├─ Nextended.Imaging/ image processing (Windows) -├─ Nextended.CodeGen/ Roslyn source generator -├─ Nextended.Aspire*/ .NET Aspire hosting integrations -├─ Tests/ unit tests and the runnable sample projects -├─ docs/ documentation site (English), docs/de (German) -│ └─ data/packages.json single source of truth for every package listing -└─ tools/Update-PackageDocs.ps1 regenerates the listings, README blocks and the docs icon +�� Nextended.Core/ foundation: extensions, types, mapping, facets +�� Nextended.Cache/ expression-based caching +�� Nextended.EF/ EF Core query and graph extensions +�� Nextended.Web/ ASP.NET Core + OData +�� Nextended.ResponseFilters/ response shaping pipeline (provider-agnostic) +�� Nextended.ResponseFilters.AspNetCore/ MVC adapter for the above +�� Nextended.Blazor/ Blazor helpers +�� Nextended.UI/ WPF / Windows desktop +�� Nextended.Imaging/ image processing (Windows) +�� Nextended.CodeGen/ Roslyn source generator +�� Nextended.Aspire*/ .NET Aspire hosting integrations +�� Tests/ unit tests and the runnable sample projects +�� docs/ documentation site (English), docs/de (German) +� �� data/packages.json single source of truth for every package listing +�� tools/Update-PackageDocs.ps1 regenerates the listings, README blocks and the docs icon ``` ## Contributing @@ -159,7 +159,7 @@ Nextended.sln Pull requests are welcome. Package listings, README headers/footers and the documentation-site icon are **generated**. Edit -[`docs/data/packages.json`](docs/data/packages.json) — never the generated blocks — and then run: +[`docs/data/packages.json`](docs/data/packages.json) - never the generated blocks - and then run: ```bash pwsh tools/Update-PackageDocs.ps1 @@ -176,11 +176,11 @@ generator: every NuGet package, every README and the documentation site pick up ## License -MIT — see [LICENSE](LICENSE). +MIT - see [LICENSE](LICENSE). ## Links -- 🏠 [Documentation](https://fgilde.github.io/Nextended/) -- 📦 [NuGet packages](https://www.nuget.org/packages?q=Nextended) -- 🧑‍💻 [Source repository](https://github.com/fgilde/Nextended) -- 🐛 [Report an issue](https://github.com/fgilde/Nextended/issues) +- ?? [Documentation](https://fgilde.github.io/Nextended/) +- ?? [NuGet packages](https://www.nuget.org/packages?q=Nextended) +- ????? [Source repository](https://github.com/fgilde/Nextended) +- ?? [Report an issue](https://github.com/fgilde/Nextended/issues) diff --git a/libmentor.json b/libmentor.json new file mode 100644 index 00000000..deac4062 --- /dev/null +++ b/libmentor.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "name": "Nextended", + "repository": "https://github.com/fgilde/Nextended", + "revision": "main", + "output": ".libmentor", + "exclude": [ + "**/*.de.md", + "docs/de/**", + "**/node_modules/**" + ], + "examples": [], + "guidance": [ + "This is a source snapshot. Check the installed package version and API evidence before suggesting code." + ], + "description": "Extension packages for .NET, Blazor, EF Core and Aspire.", + "version": "10.1.51-source", + "documents": [ + "README.md", + "Nextended.*/README.md", + "docs/**/*.md" + ], + "sources": [ + "Nextended.*/**/*.cs" + ], + "packages": [ + "Nextended.Core", + "Nextended.Blazor", + "Nextended.EF", + "Nextended.Aspire" + ], + "baseUrl": "https://fgilde.github.io/Nextended/ai" +} From 45ba2b6059b81a87ec22ec1cb9b4c33584a7a7ad Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Wed, 11 Nov 2026 13:46:48 +0100 Subject: [PATCH 2/2] fix: preserve the original README encoding while repairing documentation links --- README.md | 96 +++++++++++++++++++++++++++---------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index ec4fe341..c3d728c5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +

Nextended

@@ -17,8 +17,8 @@

- ?? Documentation (English) � - ?? Dokumentation (Deutsch) + 📖 Documentation (English) · + 📖 Dokumentation (Deutsch)

@@ -33,61 +33,61 @@ | --- | --- | --- | | **Documentation portal** | [fgilde.github.io/Nextended](https://fgilde.github.io/Nextended/) | [Dokumentationsportal](docs/de/index.md) | | **Getting started** | [Installation](docs/guides/installation.md) | [Installation](docs/de/guides/installation.md) | -| **Architecture** | [Overview](docs/guides/architecture.md) | [�berblick](docs/de/guides/architecture.md) | +| **Architecture** | [Overview](docs/guides/architecture.md) | [Überblick](docs/de/guides/architecture.md) | | **Per-package guides** | [Projects](docs/projects/index.md) | [Projekte](docs/de/projects/index.md) | -| **Examples** | [Common use cases](docs/examples/common-use-cases.md) | [Typische Anwendungsf�lle](docs/de/examples/common-use-cases.md) | +| **Examples** | [Common use cases](docs/examples/common-use-cases.md) | [Typische Anwendungsfälle](docs/de/examples/common-use-cases.md) | ## Packages - + ### Core libraries | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Core](Nextended.Core/README.md)** | Foundation library - extension methods, custom types (Money, Date, BaseId, SuperType), class mapping, deep clone, encryption, hashing and the code-generation attributes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Core.svg)](https://www.nuget.org/packages/Nextended.Core/) | [Docs](https://fgilde.github.io/Nextended/projects/core) | -| **[Nextended.Cache](Nextended.Cache/README.md)** | Expression-based caching - automatic cache keys from method expressions, CacheProvider with condition-based invalidation, thread-safe AddOrGetExisting. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Cache.svg)](https://www.nuget.org/packages/Nextended.Cache/) | [Docs](https://fgilde.github.io/Nextended/projects/cache) | +| **[Nextended.Core](Nextended.Core/README.md)** | Foundation library — extension methods, custom types (Money, Date, BaseId, SuperType), class mapping, deep clone, encryption, hashing and the code-generation attributes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Core.svg)](https://www.nuget.org/packages/Nextended.Core/) | [Docs](https://fgilde.github.io/Nextended/projects/core) | +| **[Nextended.Cache](Nextended.Cache/README.md)** | Expression-based caching — automatic cache keys from method expressions, CacheProvider with condition-based invalidation, thread-safe AddOrGetExisting. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Cache.svg)](https://www.nuget.org/packages/Nextended.Cache/) | [Docs](https://fgilde.github.io/Nextended/projects/cache) | ### Data access | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.EF](Nextended.EF/README.md)** | Entity Framework Core extensions - graph loading (LoadGraphAsync, IncludeAll, MultiInclude), declarative include definitions, paging, dynamic sorting and bulk operations. | [![NuGet](https://img.shields.io/nuget/v/Nextended.EF.svg)](https://www.nuget.org/packages/Nextended.EF/) | [Docs](https://fgilde.github.io/Nextended/projects/ef) | +| **[Nextended.EF](Nextended.EF/README.md)** | Entity Framework Core extensions — graph loading (LoadGraphAsync, IncludeAll, MultiInclude), declarative include definitions, paging, dynamic sorting and bulk operations. | [![NuGet](https://img.shields.io/nuget/v/Nextended.EF.svg)](https://www.nuget.org/packages/Nextended.EF/) | [Docs](https://fgilde.github.io/Nextended/projects/ef) | ### ASP.NET Core & web | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Web](Nextended.Web/README.md)** | ASP.NET Core utilities - zero-config OData (AddODataAuto), composable IQueryable OData appliers, strongly typed controller URLs, streaming download helpers and a background executor that can replay a captured request. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Web.svg)](https://www.nuget.org/packages/Nextended.Web/) | [Docs](https://fgilde.github.io/Nextended/projects/web) | -| **[Nextended.ResponseFilters](Nextended.ResponseFilters/README.md)** | Fluent, provider-agnostic pipeline that redacts, masks, rounds, truncates, hashes, prunes and restructures response DTOs before serialization - per request, per user, per permission. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters) | -| **[Nextended.ResponseFilters.AspNetCore](Nextended.ResponseFilters.AspNetCore/README.md)** | ASP.NET Core adapter for Nextended.ResponseFilters - registers the pipeline as a global IAsyncResultFilter and replays structural edits against the serialized JSON tree. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.AspNetCore.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters.AspNetCore/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters-aspnetcore) | +| **[Nextended.Web](Nextended.Web/README.md)** | ASP.NET Core utilities — zero-config OData (AddODataAuto), composable IQueryable OData appliers, strongly typed controller URLs, streaming download helpers and a background executor that can replay a captured request. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Web.svg)](https://www.nuget.org/packages/Nextended.Web/) | [Docs](https://fgilde.github.io/Nextended/projects/web) | +| **[Nextended.ResponseFilters](Nextended.ResponseFilters/README.md)** | Fluent, provider-agnostic pipeline that redacts, masks, rounds, truncates, hashes, prunes and restructures response DTOs before serialization — per request, per user, per permission. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters) | +| **[Nextended.ResponseFilters.AspNetCore](Nextended.ResponseFilters.AspNetCore/README.md)** | ASP.NET Core adapter for Nextended.ResponseFilters — registers the pipeline as a global IAsyncResultFilter and replays structural edits against the serialized JSON tree. | [![NuGet](https://img.shields.io/nuget/v/Nextended.ResponseFilters.AspNetCore.svg)](https://www.nuget.org/packages/Nextended.ResponseFilters.AspNetCore/) | [Docs](https://fgilde.github.io/Nextended/projects/responsefilters-aspnetcore) | ### UI libraries | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Blazor](Nextended.Blazor/README.md)** | Blazor helpers - IBrowserFile extensions (bytes, data URLs, downloads), a hierarchical model for browsing inside uploaded zip/tar/rar archives, MIME-type detection and component-parameter reflection. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Blazor.svg)](https://www.nuget.org/packages/Nextended.Blazor/) | [Docs](https://fgilde.github.io/Nextended/projects/blazor) | -| **[Nextended.UI](Nextended.UI/README.md)** | WPF and Windows desktop helpers - a global input-binding manager with hold/sequence matching, DirectInput and XInput gamepad readers, key-bind capture controls, converters, behaviours, markup extensions and runtime-defined PropertyGrid types. | [![NuGet](https://img.shields.io/nuget/v/Nextended.UI.svg)](https://www.nuget.org/packages/Nextended.UI/) | [Docs](https://fgilde.github.io/Nextended/projects/ui) | +| **[Nextended.Blazor](Nextended.Blazor/README.md)** | Blazor helpers — IBrowserFile extensions (bytes, data URLs, downloads), a hierarchical model for browsing inside uploaded zip/tar/rar archives, MIME-type detection and component-parameter reflection. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Blazor.svg)](https://www.nuget.org/packages/Nextended.Blazor/) | [Docs](https://fgilde.github.io/Nextended/projects/blazor) | +| **[Nextended.UI](Nextended.UI/README.md)** | WPF and Windows desktop helpers — a global input-binding manager with hold/sequence matching, DirectInput and XInput gamepad readers, key-bind capture controls, converters, behaviours, markup extensions and runtime-defined PropertyGrid types. | [![NuGet](https://img.shields.io/nuget/v/Nextended.UI.svg)](https://www.nuget.org/packages/Nextended.UI/) | [Docs](https://fgilde.github.io/Nextended/projects/ui) | ### Code generation & tooling | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Imaging](Nextended.Imaging/README.md)** | Image processing - aspect-preserving resize, crop, colour replacement, brightness-based foreground picking, thumbnail generation, byte/data-URL conversion and MIME detection from magic bytes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Imaging.svg)](https://www.nuget.org/packages/Nextended.Imaging/) | [Docs](https://fgilde.github.io/Nextended/projects/imaging) | -| **[Nextended.CodeGen](Nextended.CodeGen/README.md)** | Roslyn source generator - DTOs and interfaces from your entities, strongly typed classes from JSON/XML, lookup tables from Excel, and documentation from source files. | [![NuGet](https://img.shields.io/nuget/v/Nextended.CodeGen.svg)](https://www.nuget.org/packages/Nextended.CodeGen/) | [Docs](https://fgilde.github.io/Nextended/projects/codegen) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/CodeGenSample) | +| **[Nextended.Imaging](Nextended.Imaging/README.md)** | Image processing — aspect-preserving resize, crop, colour replacement, brightness-based foreground picking, thumbnail generation, byte/data-URL conversion and MIME detection from magic bytes. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Imaging.svg)](https://www.nuget.org/packages/Nextended.Imaging/) | [Docs](https://fgilde.github.io/Nextended/projects/imaging) | +| **[Nextended.CodeGen](Nextended.CodeGen/README.md)** | Roslyn source generator — DTOs and interfaces from your entities, strongly typed classes from JSON/XML, lookup tables from Excel, and documentation from source files. | [![NuGet](https://img.shields.io/nuget/v/Nextended.CodeGen.svg)](https://www.nuget.org/packages/Nextended.CodeGen/) | [Docs](https://fgilde.github.io/Nextended/projects/codegen) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/CodeGenSample) | ### .NET Aspire hosting | Package | Description | NuGet | Docs | | --- | --- | --- | --- | -| **[Nextended.Aspire](Nextended.Aspire/README.md)** | Conditional AppHost builder extensions - WithReferenceIf / WaitForIf / WithExplicitStartIf, strongly typed environment variables from config objects, HTTPS dev-cert wiring, Docker guards, GitHub-source resources and npm app discovery. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.svg)](https://www.nuget.org/packages/Nextended.Aspire/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire) | -| **[Nextended.Aspire.Hosting.Supabase](Nextended.Aspire.Hosting.Supabase/README.md)** | The complete Supabase stack - Postgres, Auth (GoTrue), REST, Realtime, Storage, Studio, Kong and Edge Functions - as one composable Aspire resource. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Supabase.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Supabase/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-supabase) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Supabase.AppHost) | -| **[Nextended.Aspire.Hosting.N8n](Nextended.Aspire.Hosting.N8n/README.md)** | The n8n workflow-automation platform as an Aspire resource, with Postgres persistence, workflow import and a typed client for triggering workflows from .NET. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.N8n.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.N8n/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-n8n) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/N8n.AppHost) | -| **[Nextended.Aspire.Hosting.Grafana](Nextended.Aspire.Hosting.Grafana/README.md)** | Grafana, Prometheus, Loki, Tempo, Promtail, cAdvisor, postgres_exporter and the OpenTelemetry Collector as composable resources with auto-provisioned datasources. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Grafana.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Grafana/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-grafana) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Grafana.AppHost) | -| **[Nextended.Aspire.Hosting.WebDataStudio](Nextended.Aspire.Hosting.WebDataStudio/README.md)** | WebDataStudio - a browser database studio for PostgreSQL, MySQL, SQL Server, SQLite, Oracle, DuckDB, ClickHouse, MongoDB and Redis - wired to the databases of your stack, with accounts and roles, an optional SQL assistant, and an MCP endpoint for AI agents. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.WebDataStudio.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.WebDataStudio/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-webdatastudio) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/WebDataStudio.AppHost) | -| **[Nextended.Aspire.Hosting.AspireUI](Nextended.Aspire.Hosting.AspireUI/README.md)** | AspireUI - the visual AppHost builder - as a resource inside your own Aspire stack, with an optional pre-seeded admin user and a starter stack built from your project paths. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.AspireUI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.AspireUI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-aspireui) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AspireUI.AppHost) | -| **[Nextended.Aspire.Hosting.LocalAI](Nextended.Aspire.Hosting.LocalAI/README.md)** | Self-hosted, OpenAI-compatible multimodal AI - image generation, text-to-speech, speech-to-text and video - with gallery model management, GPU support and Open WebUI. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.LocalAI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.LocalAI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-localai) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AiStack.AppHost) | -| **[Nextended.Aspire.Hosting.Php](Nextended.Aspire.Hosting.Php/README.md)** | Run PHP endpoints inside your Aspire stack - a docroot folder or a single router script served by PHP's built-in web server, with php.ini settings as fluent options. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Php.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Php/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-php) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Php.AppHost) | -| **[Nextended.Aspire.Hosting.DbTools](Nextended.Aspire.Hosting.DbTools/README.md)** | Database tools for an Aspire app host. The first: fill a database resource from a database that already exists - schema and data - from another resource in the stack or from a server it does not model. PostgreSQL, SQL Server, MySQL/MariaDB, MongoDB and Redis, each through its own engine's dump and restore tools. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.DbTools.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.DbTools/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-dbtools) � [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/DbTools.AppHost) | +| **[Nextended.Aspire](Nextended.Aspire/README.md)** | Conditional AppHost builder extensions — WithReferenceIf / WaitForIf / WithExplicitStartIf, strongly typed environment variables from config objects, HTTPS dev-cert wiring, Docker guards, GitHub-source resources and npm app discovery. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.svg)](https://www.nuget.org/packages/Nextended.Aspire/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire) | +| **[Nextended.Aspire.Hosting.Supabase](Nextended.Aspire.Hosting.Supabase/README.md)** | The complete Supabase stack — Postgres, Auth (GoTrue), REST, Realtime, Storage, Studio, Kong and Edge Functions — as one composable Aspire resource. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Supabase.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Supabase/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-supabase) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Supabase.AppHost) | +| **[Nextended.Aspire.Hosting.N8n](Nextended.Aspire.Hosting.N8n/README.md)** | The n8n workflow-automation platform as an Aspire resource, with Postgres persistence, workflow import and a typed client for triggering workflows from .NET. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.N8n.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.N8n/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-n8n) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/N8n.AppHost) | +| **[Nextended.Aspire.Hosting.Grafana](Nextended.Aspire.Hosting.Grafana/README.md)** | Grafana, Prometheus, Loki, Tempo, Promtail, cAdvisor, postgres_exporter and the OpenTelemetry Collector as composable resources with auto-provisioned datasources. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Grafana.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Grafana/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-grafana) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Grafana.AppHost) | +| **[Nextended.Aspire.Hosting.WebDataStudio](Nextended.Aspire.Hosting.WebDataStudio/README.md)** | WebDataStudio — a browser database studio for PostgreSQL, MySQL, SQL Server, SQLite, Oracle, DuckDB, ClickHouse, MongoDB and Redis — wired to the databases of your stack, with accounts and roles, an optional SQL assistant, and an MCP endpoint for AI agents. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.WebDataStudio.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.WebDataStudio/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-webdatastudio) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/WebDataStudio.AppHost) | +| **[Nextended.Aspire.Hosting.AspireUI](Nextended.Aspire.Hosting.AspireUI/README.md)** | AspireUI — the visual AppHost builder — as a resource inside your own Aspire stack, with an optional pre-seeded admin user and a starter stack built from your project paths. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.AspireUI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.AspireUI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-aspireui) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AspireUI.AppHost) | +| **[Nextended.Aspire.Hosting.LocalAI](Nextended.Aspire.Hosting.LocalAI/README.md)** | Self-hosted, OpenAI-compatible multimodal AI — image generation, text-to-speech, speech-to-text and video — with gallery model management, GPU support and Open WebUI. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.LocalAI.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.LocalAI/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-localai) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/AiStack.AppHost) | +| **[Nextended.Aspire.Hosting.Php](Nextended.Aspire.Hosting.Php/README.md)** | Run PHP endpoints inside your Aspire stack — a docroot folder or a single router script served by PHP's built-in web server, with php.ini settings as fluent options. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.Php.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.Php/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-php) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/Php.AppHost) | +| **[Nextended.Aspire.Hosting.DbTools](Nextended.Aspire.Hosting.DbTools/README.md)** | Database tools for an Aspire app host. The first: fill a database resource from a database that already exists — schema and data — from another resource in the stack or from a server it does not model. PostgreSQL, SQL Server, MySQL/MariaDB, MongoDB and Redis, each through its own engine's dump and restore tools. | [![NuGet](https://img.shields.io/nuget/v/Nextended.Aspire.Hosting.DbTools.svg)](https://www.nuget.org/packages/Nextended.Aspire.Hosting.DbTools/) | [Docs](https://fgilde.github.io/Nextended/projects/aspire-dbtools) · [Sample](https://github.com/fgilde/Nextended/tree/main/Tests/TestProjects/DbTools.AppHost) | ## Quick start @@ -101,7 +101,7 @@ using Nextended.Core.Extensions; using Nextended.Core.Types; using Nextended.Core.DeepClone; -// Object mapping - no profiles, no configuration +// Object mapping — no profiles, no configuration var dto = user.MapTo(); var dtos = users.MapElementsTo(); @@ -125,7 +125,7 @@ Every Aspire integration and the source generator ship with a sample project you | Sample | Shows | | --- | --- | | [Supabase.AppHost](Tests/TestProjects/Supabase.AppHost) | The full Supabase stack as one Aspire resource | -| [AiStack.AppHost](Tests/TestProjects/AiStack.AppHost) | LocalAI and n8n together - self-hosted multimodal AI driven by workflows | +| [AiStack.AppHost](Tests/TestProjects/AiStack.AppHost) | LocalAI and n8n together — self-hosted multimodal AI driven by workflows | | [N8n.AppHost](Tests/TestProjects/N8n.AppHost) | n8n with Postgres persistence and workflow import | | [Grafana.AppHost](Tests/TestProjects/Grafana.AppHost) | Grafana, Prometheus, Loki, Tempo with auto-provisioned datasources | | [WebDataStudio.AppHost](Tests/TestProjects/WebDataStudio.AppHost) | One browser database studio across several databases | @@ -137,21 +137,21 @@ Every Aspire integration and the source generator ship with a sample project you ``` Nextended.sln -�� Nextended.Core/ foundation: extensions, types, mapping, facets -�� Nextended.Cache/ expression-based caching -�� Nextended.EF/ EF Core query and graph extensions -�� Nextended.Web/ ASP.NET Core + OData -�� Nextended.ResponseFilters/ response shaping pipeline (provider-agnostic) -�� Nextended.ResponseFilters.AspNetCore/ MVC adapter for the above -�� Nextended.Blazor/ Blazor helpers -�� Nextended.UI/ WPF / Windows desktop -�� Nextended.Imaging/ image processing (Windows) -�� Nextended.CodeGen/ Roslyn source generator -�� Nextended.Aspire*/ .NET Aspire hosting integrations -�� Tests/ unit tests and the runnable sample projects -�� docs/ documentation site (English), docs/de (German) -� �� data/packages.json single source of truth for every package listing -�� tools/Update-PackageDocs.ps1 regenerates the listings, README blocks and the docs icon +├─ Nextended.Core/ foundation: extensions, types, mapping, facets +├─ Nextended.Cache/ expression-based caching +├─ Nextended.EF/ EF Core query and graph extensions +├─ Nextended.Web/ ASP.NET Core + OData +├─ Nextended.ResponseFilters/ response shaping pipeline (provider-agnostic) +├─ Nextended.ResponseFilters.AspNetCore/ MVC adapter for the above +├─ Nextended.Blazor/ Blazor helpers +├─ Nextended.UI/ WPF / Windows desktop +├─ Nextended.Imaging/ image processing (Windows) +├─ Nextended.CodeGen/ Roslyn source generator +├─ Nextended.Aspire*/ .NET Aspire hosting integrations +├─ Tests/ unit tests and the runnable sample projects +├─ docs/ documentation site (English), docs/de (German) +│ └─ data/packages.json single source of truth for every package listing +└─ tools/Update-PackageDocs.ps1 regenerates the listings, README blocks and the docs icon ``` ## Contributing @@ -159,7 +159,7 @@ Nextended.sln Pull requests are welcome. Package listings, README headers/footers and the documentation-site icon are **generated**. Edit -[`docs/data/packages.json`](docs/data/packages.json) - never the generated blocks - and then run: +[`docs/data/packages.json`](docs/data/packages.json) — never the generated blocks — and then run: ```bash pwsh tools/Update-PackageDocs.ps1 @@ -176,11 +176,11 @@ generator: every NuGet package, every README and the documentation site pick up ## License -MIT - see [LICENSE](LICENSE). +MIT — see [LICENSE](LICENSE). ## Links -- ?? [Documentation](https://fgilde.github.io/Nextended/) -- ?? [NuGet packages](https://www.nuget.org/packages?q=Nextended) -- ????? [Source repository](https://github.com/fgilde/Nextended) -- ?? [Report an issue](https://github.com/fgilde/Nextended/issues) +- 🏠 [Documentation](https://fgilde.github.io/Nextended/) +- 📦 [NuGet packages](https://www.nuget.org/packages?q=Nextended) +- 🧑‍💻 [Source repository](https://github.com/fgilde/Nextended) +- 🐛 [Report an issue](https://github.com/fgilde/Nextended/issues)