Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
3de1b0a
Infra: Add Service Bus emulator reset script, Aspire resource refs
chullybun Sep 24, 2026
f32f574
Aspire testing infra, Redis/Service Bus emulator admin APIs, and opt-…
chullybun Sep 27, 2026
25f7a4b
Fix IReferenceDataCollection interface leaking into FusionCache gener…
chullybun Sep 27, 2026
e818b40
Add WireMock.Net-based mock host to Aspire AppHost for Linux CI cert …
chullybun Sep 27, 2026
8f78283
Move CoreEx.Aspire template to aspire dir; add MockHost + Test.Aspire
chullybun Sep 28, 2026
af3f6f6
Add SendGrid checkout-confirmation subscriber; wire Aspire MockHost f…
chullybun Sep 29, 2026
dbff5e4
Add NamedDestinationProvider and migrate Contoso samples to command q…
chullybun Sep 29, 2026
badb1e7
Template: NamedDestinationProvider, keyed subscriber and code-based S…
chullybun Sep 29, 2026
cc12b82
Add command publish/subscribe and Aspire AI skills; CI E2E; v4.1.0
chullybun Sep 29, 2026
0a054b3
CI: restart Cosmos emulator before samples; make PartitionPicker test…
chullybun Sep 29, 2026
4786b7d
Fix Aspire E2E: pin sample hosts to a single framework
chullybun Sep 30, 2026
8abd971
Fix flaky SynchronizedTimerHostedServiceBaseTests
chullybun Sep 30, 2026
0586220
CI: trust the ASP.NET Core dev certificate for the Aspire E2E step
chullybun Sep 30, 2026
9106c5b
Aspire E2E: poll WireMock admin API; template props; instruction tweaks
chullybun Oct 2, 2026
811ffdf
Docs refresh, Result<T> guard-clause guidance, CodeGenCounter robustness
chullybun Oct 2, 2026
1d17b69
Add mutable reference data support
chullybun Oct 4, 2026
7d0b041
Address PR review feedback
chullybun Oct 4, 2026
2c0d658
Add CosmosDbReferenceData, unique-key outbox support and fix EF Creat…
chullybun Oct 5, 2026
1f87119
EF update: exclude server-managed audit and tenant properties from th…
chullybun Oct 5, 2026
4b1e2fd
Cosmos change tracker, ref-data PUT endpoint and IExtensionData
chullybun Oct 6, 2026
62e5bc2
Address PR review feedback: delete ETag guard, excludeApi, post-commi…
chullybun Oct 6, 2026
9f9151f
Add Cosmos DB provisioning engine and Contoso.Customers.Database
chullybun Oct 6, 2026
a16986c
Migrate Cosmos emulator to vNext (HTTPS, host networking, /ready heal…
chullybun Oct 6, 2026
fbcdad1
Cosmos provisioning console: DbEx-style output, options, prompts, mer…
chullybun Oct 6, 2026
a3f8138
feat(template): add Azure Cosmos DB as a data-provider option
chullybun Oct 6, 2026
d97f409
fix: address PR review feedback and flaky relay test
chullybun Oct 6, 2026
0061179
Cosmos: explicit shared outbox lease container; PR review fixes
chullybun Oct 6, 2026
7f67006
test: guard Service Bus Test.Common files absent when messaging-provi…
chullybun Oct 6, 2026
6fefd05
Add Cosmos provisioning to E2E Runner and CosmosDbProvisioner.RunAndL…
chullybun Oct 7, 2026
c26a929
Bump DbEx.* to 3.3.0; improve CosmosDbConsole output
chullybun Oct 7, 2026
0eaab4c
Shopping: validate Basket customer via Customers adapter; cached resu…
chullybun Oct 8, 2026
cc10d56
E2E Runner: FAIL error hyperlinks, Customers-Update scenario, migrati…
chullybun Oct 8, 2026
7fadbdb
Shopping: add customer-scoped Basket query endpoint
chullybun Oct 8, 2026
a56fa6b
Add NonNullable attribute for OpenAPI and apply across Contoso contracts
chullybun Oct 9, 2026
a5b707a
Fix PR review findings and document mutable authorization defaults
chullybun Oct 9, 2026
0b0c0fa
Add fluent HTTP response validation and client guidance
chullybun Oct 9, 2026
69007bf
Add Customers Cosmos relay and align Aspire infrastructure support
chullybun Oct 9, 2026
3b63caa
Enable string-function filtering for customer email
chullybun Oct 9, 2026
7ca5fb7
Fix relay/hosted-service cancellation and lease handling; Cosmos rela…
chullybun Oct 10, 2026
3459d41
Align outbox partition sizing and Service Bus session routing
chullybun Oct 10, 2026
7e8f307
Fix Customers CI failures
chullybun Oct 10, 2026
bf47fd8
Fix Cosmos snapshot invalidation and isolate Service Bus cancellation…
chullybun Oct 10, 2026
9f09c7e
Harden Aspire checkout polling and move Orders development ports
chullybun Oct 10, 2026
a17caca
Replay Cosmos outbox backlog when initializing fresh leases
chullybun Oct 10, 2026
566abe4
Align release documentation and AI workflow inventories
chullybun Oct 11, 2026
027bc8d
Normalize command domains and document safe mapping rollouts
chullybun Oct 11, 2026
31ff40c
Fix nested OpenAPI nullability and Aspire health assertions
chullybun Oct 11, 2026
d14c317
Clarify mapper projection nullability guidance
chullybun Oct 11, 2026
01f32f7
Document mutable attribute schema placement
chullybun Oct 11, 2026
0d4fdc0
Fix cancellation classification and reference-data cache races
chullybun Oct 11, 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
  •  
  •  
  •  
14 changes: 14 additions & 0 deletions .claude/commands/coreex-aspire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
description: "Add or extend .NET Aspire orchestration and end-to-end tests in a CoreEx solution. USE FOR: AppHost wiring for new hosts, service-bus queue/topic topology in Test.Aspire, MockHost stubs for third-party HTTP, OnBeforeStartAsync/OnAfterStartAsync setup, E2E tests across domains. DO NOT USE FOR: non-Aspire hosts (use coreex-scaffold) or per-host integration tests (use coreex-test-api / coreex-test-subscribe / coreex-test-relay)."
allowed-tools: [Read, Glob, Grep, Edit, Write, Bash]
---

<!--
AI workflow asset — dual-audience notice:
- In the Avanade/CoreEx repository: this file is the authored source. Edit it here.
- In a consumer repository: this file was generated by `dotnet new coreex-ai` (or refreshed via
`dotnet new coreex-ai --force` / the `/coreex-docs-sync` skill). Do not hand-edit it directly —
propose the change upstream in Avanade/CoreEx instead, then refresh once it is released.
-->

Read `.github/skills/coreex-aspire/SKILL.md` and follow the instructions in that file.
14 changes: 14 additions & 0 deletions .claude/commands/coreex-command-publish-e2e.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
description: "Add the sending/publishing of a command (not an event) to another domain end-to-end: adapter, transactional call site (outbox vs direct), NamedDestinationProvider queue routing, Service Bus topology, API/Relay tests and Aspire E2E. USE FOR: a domain must instruct another domain to do something. DO NOT USE FOR: publishing an event (use coreex-app-service), receiving a command (use coreex-command-subscribe-e2e), or synchronous request/response calls (use coreex-adapter)."
allowed-tools: [Read, Glob, Grep, Edit, Write, Bash]
---

<!--
AI workflow asset — dual-audience notice:
- In the Avanade/CoreEx repository: this file is the authored source. Edit it here.
- In a consumer repository: this file was generated by `dotnet new coreex-ai` (or refreshed via
`dotnet new coreex-ai --force` / the `/coreex-docs-sync` skill). Do not hand-edit it directly —
propose the change upstream in Avanade/CoreEx instead, then refresh once it is released.
-->

Read `.github/skills/coreex-command-publish-e2e/SKILL.md` and follow the instructions in that file.
14 changes: 14 additions & 0 deletions .claude/commands/coreex-command-subscribe-e2e.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
description: "Add the receiving/handling of a command (not an event) end-to-end: contract, app service, subscriber, dedicated keyed command-queue receiver in the Subscribe host, Service Bus topology, Subscribe tests and Aspire E2E. USE FOR: this domain must act on a command addressed to it. DO NOT USE FOR: subscribing to an event (use coreex-subscriber-e2e), sending a command (use coreex-command-publish-e2e), or subscribing to another domain's command (never valid)."
allowed-tools: [Read, Glob, Grep, Edit, Write, Bash]
---

<!--
AI workflow asset — dual-audience notice:
- In the Avanade/CoreEx repository: this file is the authored source. Edit it here.
- In a consumer repository: this file was generated by `dotnet new coreex-ai` (or refreshed via
`dotnet new coreex-ai --force` / the `/coreex-docs-sync` skill). Do not hand-edit it directly —
propose the change upstream in Avanade/CoreEx instead, then refresh once it is released.
-->

Read `.github/skills/coreex-command-subscribe-e2e/SKILL.md` and follow the instructions in that file.
2 changes: 1 addition & 1 deletion .claude/commands/coreex-repository.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: "Create or modify a CoreEx Infrastructure-layer repository. USE FOR: new repository class, adding CRUD operations, adding a custom query (QueryArgsConfig<TSelf>), bidirectional mapper (BiDirectionMapper), EfDb model accessor, Result<T> pipeline variants. DO NOT USE FOR: Application-layer service logic, domain invariants, typed HTTP clients/adapters (those follow adapter conventions in the infrastructure instructions, not this skill)."
description: "Create or modify a CoreEx Infrastructure-layer repository. USE FOR: new repository class, adding CRUD operations, adding a custom query (QueryArgsConfig<TSelf>), bidirectional mapper (BiDirectionMapper), EfDb/CosmosDb model accessor, Result<T> pipeline variants. DO NOT USE FOR: Application-layer service logic, domain invariants, typed HTTP clients/adapters (those follow adapter conventions in the infrastructure instructions, not this skill)."
allowed-tools: [Read, Glob, Grep, Edit, Write, Bash]
---

Expand Down
2 changes: 1 addition & 1 deletion .claude/commands/coreex-scaffold.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: "Guide a developer through CoreEx solution shaping after bootstrap, using a short plain-English interview that turns user answers into safe dotnet new template inputs. USE FOR: bootstrap-only repos, deciding API-only vs API plus relay vs API plus subscriber, choosing SQL Server vs Postgres vs no database, choosing refdata/outbox/DDD/ROP options, installing CoreEx.Template, checking current solution shape, adding missing Api/Relay/Subscribe hosts to an existing repo, adding a .NET Aspire AppHost for local multi-host orchestration and dashboard visibility, and optionally preparing a first local runnable state with local dependency assets plus database/code-generation steps. DO NOT USE FOR: unrelated runtime debugging, bootstrap creation, or forcing root re-scaffolding over an existing solution. INVOKES: workspace inspection, ask-questions style interviews, dotnet new install/list, dry-run validation, solution wiring, optional local dependency asset creation, focused build/test validation, and either template generation or manual retrofit work depending on repo shape."
description: "Guide a developer through CoreEx solution shaping after bootstrap, using a short plain-English interview that turns user answers into safe dotnet new template inputs. USE FOR: bootstrap-only repos, deciding API-only vs API plus relay vs API plus subscriber, choosing SQL Server vs Postgres vs Cosmos vs no database, choosing refdata/outbox/DDD/ROP options, installing CoreEx.Template, checking current solution shape, adding missing Api/Relay/Subscribe hosts to an existing repo, adding a .NET Aspire AppHost for local multi-host orchestration and dashboard visibility, and optionally preparing a first local runnable state with local dependency assets plus database/code-generation steps. DO NOT USE FOR: unrelated runtime debugging, bootstrap creation, or forcing root re-scaffolding over an existing solution. INVOKES: workspace inspection, ask-questions style interviews, dotnet new install/list, dry-run validation, solution wiring, optional local dependency asset creation, focused build/test validation, and either template generation or manual retrofit work depending on repo shape."
allowed-tools: [Read, Glob, Grep, Edit, Write, Bash]
---

Expand Down
2 changes: 1 addition & 1 deletion .claude/commands/coreex-subscriber-e2e.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: "Create a complete new event or command subscriber end-to-end in a single guided workflow: event/command DTO contract (if new), subscriber handler, optional application service and repository, and integration tests. USE FOR: adding a brand-new subscriber to an existing CoreEx Subscribe host for any scenario — command handling, event-data-sync replication, or event-driven business-process choreography. DO NOT USE FOR: modifying an existing subscriber (use coreex-subscriber directly), API endpoint work (use coreex-api-e2e), or setting up the Subscribe host itself (use coreex-scaffold)."
description: "Create a complete new event subscriber end-to-end in a single guided workflow: event DTO contract (if new), subscriber handler, optional application service and repository, and integration tests. USE FOR: adding a brand-new subscriber to an existing CoreEx Subscribe host for event-data-sync replication or event-driven business-process choreography. DO NOT USE FOR: command handling (use coreex-command-subscribe-e2e), sending a command (use coreex-command-publish-e2e), modifying an existing subscriber (use coreex-subscriber directly), API endpoint work (use coreex-api-e2e), or setting up the Subscribe host itself (use coreex-scaffold)."
allowed-tools: [Read, Glob, Grep, Edit, Write, Bash]
---

Expand Down
6 changes: 3 additions & 3 deletions .github/INSTRUCTION_AUTHORING.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ for every POST") is an invariant and stays; a numbered "detect → confirm → s
procedure and moves to the skill.

**Project-wide choices live in state, not in prompts.** The solution-root `AGENTS.md` "Feature Configuration"
records `data-provider`, `rop-enabled`, `refdata-enabled`, `outbox-enabled`, and `messaging-provider`. Whether a Domain layer is present is inferred from the existence of `src/*.Domain/` (added via `dotnet new coreex-domain`). Instructions and skills must **read that recording before asking** and re-state resolved
records `data-provider` (`SqlServer` / `Postgres` / `Cosmos` / `None`), `rop-enabled`, `refdata-enabled`, `outbox-enabled`, and `messaging-provider`. Whether a Domain layer is present is inferred from the existence of `src/*.Domain/` (added via `dotnet new coreex-domain`). Instructions and skills must **read that recording before asking** and re-state resolved
values for confirmation rather than re-prompting (the global rule lives in `.github/copilot-instructions.md`).

---
Expand Down Expand Up @@ -207,9 +207,9 @@ A development-time console tool. Reads a single `ref-data.yaml` file (validated

The entry point is a one-line `Program.cs` in the `*.CodeGen` project. Templates live in `CoreEx.CodeGen/RefData/Templates/` (embedded in the NuGet package) and are the only place structural changes to the generated shape belong.

### DbEx (`*.Database` project)
### `*.Database` tooling project

A development-time migration and generation tool. Reads YAML configuration and SQL migration scripts to produce database schema, outbox infrastructure, and EF Core scaffolding.
For relational domains this is a DbEx-based migration and generation tool that reads YAML configuration and SQL migration scripts to produce database schema, outbox infrastructure, and EF Core scaffolding. For Cosmos domains it is a `CosmosDbConsole` provisioning app that declares containers and imports seed data; there are no SQL migration scripts or `dbex.yaml`.

| Output pattern | What to change instead |
|---|---|
Expand Down
35 changes: 18 additions & 17 deletions .github/agents/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ It is defined once in `coreex-expert.agent.md` and works in both tools from the

## How the agent resolves guidance

The agent relies on a local doc cache rather than making live GitHub fetches on every question. The cache is populated by `/coreex-docs-sync` and stored under `.github/docs/coreex/`.
The agent prefers the local doc cache installed by `dotnet new coreex-ai` at the pinned `CoreEx.Template` version. `/coreex-docs-sync` refreshes that cache and the entire AI asset bundle together; it does not fetch GitHub `main`.

```
Developer asks a CoreEx question
│
▼
Read .github/docs/coreex/.manifest
Read .github/docs/coreex/manifest.txt
│
┌─────┴─────┐
│ │
Expand All @@ -28,38 +28,38 @@ Developer asks a CoreEx question
│ └──► offer to run /coreex-docs-sync first
│ (never runs silently — always asks first)
│
check staleness
compare coreex-version with project package references
│
┌────┴────┐
│ │
fresh stale
│ (>30 days OR coreex-version in manifest
matches differs
│ (coreex-version in manifest
│ differs from version in project files)
│ │
│ └──► recommend running /coreex-docs-sync
│
▼
Use local cache (always preferred over live GitHub fetches)
│
├── .github/docs/coreex/*.md ← 10 architecture docs
├── .github/docs/coreex/*.md ← 12 architecture/setup docs
│
└── .github/docs/coreex/agents/*.md ← 18 per-package AI guides
│
read manifest referenced-packages
inspect project package references
to distinguish:
• package already in project → guide on current usage
• package not yet in project → recommend adopting it
```

The `referenced-packages` field in the manifest lets the agent distinguish between a package the project already uses and one it would need to add — without restricting which guides get synced.
The manifest records only `coreex-version`. Package adoption is determined from the project's package references, not a `referenced-packages` field or a sync timestamp.

---

## The local doc cache

`/coreex-docs-sync` fetches from the CoreEx GitHub repository and writes two folders:
`CoreEx.Template` packages the documentation at release time. `coreex-ai` installs it; `/coreex-docs-sync` reinstalls the bundle from the release matching the project's CoreEx NuGet version.

**`.github/docs/coreex/`** — 10 architecture docs:
**`.github/docs/coreex/`** — 12 architecture/setup docs:

| File | Content |
|------|---------|
Expand All @@ -73,17 +73,18 @@ The `referenced-packages` field in the manifest lets the agent distinguish betwe
| `testing.md` | Unit, integration, API, Subscribe, and Relay test patterns |
| `tooling.md` | CodeGen and Database project run order, generated-file ownership |
| `aspire.md` | Aspire orchestration for local distributed development and E2E testing |
| `local-dev.md` | Local infrastructure, connection strings, and startup sequences |
| `application-scaffolding-guide.md` | Choosing and composing solution/host templates |

**`.github/docs/coreex/agents/`** — 18 per-package AI usage guides: the base `CoreEx` package plus one per `src/CoreEx.*` package (including `CoreEx.Cosmos`, which is newly published as a preview-quality package — its API surface may still change without following strict semver until it stabilizes). All 18 are synced unconditionally so the agent can guide on any package — including ones the project hasn't adopted yet.
**`.github/docs/coreex/agents/`** — 18 per-package AI usage guides: the base `CoreEx` package plus one per `src/CoreEx.*` package (including `CoreEx.Cosmos`). All 18 are synced unconditionally so the agent can guide on any package — including ones the project hasn't adopted yet.

**`.github/docs/coreex/.manifest`** — records `synced` date, `coreex-version`, and `referenced-packages`.
**`.github/docs/coreex/manifest.txt`** — records `coreex-version`, stamped by the installed template release.

### Staleness triggers

| Trigger | Agent action |
|---------|-------------|
| Cache absent | Offers to run `/coreex-docs-sync` before the first GitHub fetch |
| `synced` date > 30 days | Recommends a refresh |
| `coreex-version` in manifest ≠ version in project files | Recommends a refresh |

---
Expand All @@ -95,7 +96,7 @@ An earlier design synced only the packages the project already references. This
- The agent cannot recommend adopting a package (e.g. `CoreEx.Caching.FusionCache`) if it has no knowledge of what that package offers.
- All 18 guides are small markdown files — the total download is negligible.
- Syncing all unconditionally removes the need to re-run after adding a new package.
- The `referenced-packages` manifest field preserves the "in project vs. not yet" distinction without making it a gate on what gets synced.
- Inspecting project package references preserves the "in project vs. not yet" distinction without making it a gate on which guides get installed.

---

Expand All @@ -119,10 +120,10 @@ dotnet new coreex-ai --app-folder <subfolder>
`dotnet new coreex-ai` installs everything the agent depends on:

- `.github/instructions/` — the scoped, auto-injected instruction files
- `.github/prompts/` — the `coreex-scaffold` prompt plus one prompt per per-capability (L1) skill
- `.github/skills/` — the full skill suite (`coreex-docs-sync`, `acquire-codebase-knowledge`, `coreex-scaffold`, `aspire`, and the 15 L1 skills)
- `.github/prompts/` — 22 wrappers: bootstrap, scaffold, 16 L1 skills and four L2 workflows (`coreex-docs-sync` is a direct skill, without a prompt wrapper)
- `.github/skills/` — 23 CoreEx skills: bootstrap, scaffold, docs-sync, 16 L1 skills and four L2 workflows; generic `acquire-codebase-knowledge` and `aspire` skills are framework-repository-only
- `.github/agents/coreex-expert.agent.md` — this agent
- `.claude/commands/` — the Claude Code equivalents
- `.claude/commands/` — 24 commands: one for each CoreEx skill plus expert guidance
- `.github/docs/coreex/` — the local docs cache (architecture docs + per-package guides) the expert reads first, already populated at the pinned version — no separate sync step needed on first install

Later, when the project's `CoreEx` NuGet version is bumped, re-run `/coreex-docs-sync` to refresh the whole bundle (instructions, skills, prompts, this agent, and the docs cache) to the matching `CoreEx.Template` release — the agent recommends this automatically when the cached `coreex-version` no longer matches the project (see the resolution flowchart above).
Expand Down
Loading
Loading