Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
871a452
refactor: cleaning up some very old parts of the system
kieronlanning Jun 24, 2026
f9e91ed
fix: added EF support for value objects
kieronlanning Jun 25, 2026
d14344b
fix: fixed correlation id in transactions
kieronlanning Jun 25, 2026
3d998e9
chore: moving pcs
kieronlanning Jun 25, 2026
f390f7d
fix: added IEquatible to struct valueobjects
kieronlanning Jun 26, 2026
9956fa1
fix: fixed missing ctors value objects
kieronlanning Jun 26, 2026
29247ee
fix: fixed GetOrCreate calling creator func regardless of state
kieronlanning Jun 26, 2026
41e901f
docs: added Agent review
kieronlanning Jun 26, 2026
b3652b6
docs: added some solution design guides
kieronlanning Jun 27, 2026
56fffc1
chore: refactoring
kieronlanning Jul 14, 2026
a2c597d
chore: moving pcs
kieronlanning Jul 16, 2026
11361ec
refactor: updated structure based on new sdk and now using TUnit.Mocks
kieronlanning Jul 17, 2026
d3900c7
chore: moving pcs
kieronlanning Jul 17, 2026
471251a
refactor: implementing the ZodSharp validator
kieronlanning Jul 17, 2026
85ced24
feat: added sample and working validation for all typees
kieronlanning Jul 19, 2026
e9690b6
fix: fixed nuget package referencing
kieronlanning Jul 20, 2026
3fa7edd
chore: updated report upload aggregate based on real-world issue
kieronlanning Jul 20, 2026
2f51703
fix: fixed complex scalar values queries for sql-json
kieronlanning Jul 20, 2026
f6b7792
chore: bumped version
kieronlanning Jul 20, 2026
331dd5e
chore: fixed changelog
kieronlanning Jul 20, 2026
ff8bad5
fix: method GetOrCreateAsync always called creator action/ func
kieronlanning Jul 20, 2026
589af61
fix: method GetOrCreateAsync always called creator action/ func - again
kieronlanning Jul 20, 2026
5e49e9b
fix: fixed telemetry activity source and meter names
kieronlanning Jul 20, 2026
92faeed
chore: bumped sdk
kieronlanning Jul 21, 2026
7089f1f
refactor: aspire resource kit
kieronlanning Jul 26, 2026
d82f129
chore: updated to lastest Purview Aspire Resource Kit£
kieronlanning Jul 27, 2026
e276445
fix: removed odd refefences that only fail in GH actions
kieronlanning Jul 27, 2026
71f6a95
chore: moving pcs
kieronlanning Jul 29, 2026
a7130ab
chore: updating tests
kieronlanning Jul 29, 2026
3ba29a1
chore: updating tests
kieronlanning Jul 29, 2026
6ac04cd
chore: uncommented one of the tests
kieronlanning Jul 30, 2026
2f62060
feat: indexing and transactional support complete
kieronlanning Jul 30, 2026
5690873
Add point-in-time projection support to Admin Portal
kieronlanning Jul 30, 2026
e653758
style: apply csharpier code formatting across codebase
kieronlanning Jul 30, 2026
18e0ed2
chore: add Admin.MongoDB project to solution
kieronlanning Jul 30, 2026
4bab970
fix: expose mongodb internals to admin.mongodb package
kieronlanning Jul 30, 2026
68378b6
feat: add admin site razor pages ui package
kieronlanning Jul 30, 2026
a4be67f
docs: add admin.site documentation and examples
kieronlanning Jul 30, 2026
dc7479e
docs: add admin.site integration guide
kieronlanning Jul 30, 2026
28f95d3
feat: added Admin API/ Page modules
kieronlanning Jul 30, 2026
8406b94
feat: add diagnostics and validation
kieronlanning Jul 31, 2026
8ac983f
feat: implement Postgres provider and multi-store sample app
kieronlanning Aug 1, 2026
f789dfe
fix: test were failing
kieronlanning Aug 1, 2026
d128507
fix: sample startup failed with connection string
kieronlanning Aug 1, 2026
8dc0a0b
fix: sample startup failed with connection string
kieronlanning Aug 2, 2026
3ae5fbe
refactor: renaming namespaces
kieronlanning Aug 2, 2026
1a50909
fix: sample startup failed with connection string - again
kieronlanning Aug 2, 2026
7f9cd59
chore: updated struct gen
kieronlanning Aug 2, 2026
e24db63
chore: updated project sdk with new skills function
kieronlanning Aug 2, 2026
e7343f0
chore: forcing file-case change
kieronlanning Aug 2, 2026
f7ab0d3
chore: forcing file-case change
kieronlanning Aug 2, 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
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .agents/skills/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# This directory is copied into consuming repositories by Purview.DotNetProjectSdk
# so AI agents can discover the bundled skills.
# Keep this file if you want the generated skill content to stay out of source control.
# To disable generation entirely, set <EnableEmbeddedAgentSkills>false</EnableEmbeddedAgentSkills>
# in your project or Directory.Build.props.
*
!.gitignore
36 changes: 36 additions & 0 deletions .agents/skills/changesets-prerelease/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
---
name: changesets-prerelease
description: Create and apply a prerelease bump using Changesets CLI, with the new changeset markdown summarizing the actual changes since the last shipped release.
---

# Changesets Prerelease Skill

Use this skill when preparing the next prerelease version in this repository.

## Steps

1. Add a new changeset:
- `npx @changesets/cli add --empty --message "<summary>"`
- update the generated `.changeset/*.md` frontmatter with:
- `"purview-eventsourcing": patch`
- replace the placeholder body with a concise summary of the **actual user-facing changes since the last shipped release**, not just a generic "prepare prerelease" note.
- if the immediately previous prerelease number (for example `.24`) has **not** been released yet and you are preparing `.25`, the new markdown should still describe the cumulative changes that matter for the next published prerelease.
2. Bump versions/changelog:
- `npx @changesets/cli version`
3. Commit the resulting changes (`package.json`, `CHANGELOG.md`, and consumed `.changeset` files).

## Writing the new `.changeset/*.md` body

- Summarize the functional changes that should appear in the changelog for the next published prerelease.
- Prefer short release-note language such as:
- fixed SQL snapshot translation for directly mapped complex mirror properties
- clarified provider documentation for scalar value object query behavior
- aligned repo-local agent skills and instructions
- Do **not** leave the body as a procedural placeholder such as `Prepare next prerelease` unless there were truly no meaningful changes.
- If multiple unreleased prerelease bumps exist locally, write the new file so the generated changelog entry remains useful to an external consumer reading the next shipped release.

## Notes

- Repository currently runs prerelease mode with `tag: prerelease` (`.changeset/pre.json`).
- Releasing is done from `package.json` version in the `release.yml` workflow.
- In prerelease mode, `changeset version` can record a changeset in `.changeset/pre.json` even if the new file was created with placeholder/empty content first. If that happens, correct the `.md` frontmatter/body before finalizing the release notes so the next shipped prerelease entry is accurate.
108 changes: 108 additions & 0 deletions .agents/skills/tunit-test-runner/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
---
name: tunit-test-runner
description: >-
Run, filter, and select TUnit tests through `dotnet test`. Use this whenever
executing .NET tests in a project that depends on TUnit (built on
Microsoft.Testing.Platform / MTP, not VSTest), when `dotnet test --filter`
reports "Zero tests ran", or when tests must be narrowed by assembly,
namespace, class, test name, [Category], or other custom properties. Covers
the `--treenode-filter` path-based query syntax, its operators, the `--`
separator rules across SDK versions, and common 0-tests troubleshooting.
license: MIT
---

# Running TUnit tests with `dotnet test`

## The one rule that matters most

TUnit runs on **Microsoft.Testing.Platform (MTP)**, not VSTest. The reflexive
`dotnet test --filter "Category=X"` **does not work**: MTP silently rejects the
`--filter` flag, prints its own help text, and exits with `Zero tests ran`. That
looks like a passing-but-empty run or a config failure, but it is just an
unrecognised flag. **Never reach for `--filter` on a TUnit project.** Use
`--treenode-filter` instead.

| Other frameworks (VSTest) | TUnit (MTP) |
| ------------------------------------------ | ---------------------------------------------------- |
| `--filter "Category=Integration"` | `--treenode-filter "/*/*/*/*[Category=Integration]"` |
| `--filter "FullyQualifiedName~LoginTests"` | `--treenode-filter "/*/*/LoginTests/*"` |
| `--filter "Name=AcceptCookiesTest"` | `--treenode-filter "/*/*/*/AcceptCookiesTest"` |

## How to invoke it

Prefer `dotnet test` over `dotnet run`: `dotnet test` builds and runs every
targeted TFM automatically and works against a `.csproj`, `.sln`, or `.slnx`,
whereas `dotnet run` only runs a single TFM.

The catch is the `--` separator, which depends on the SDK:

```bash
# Universal form — works on every SDK. Use this by default.
dotnet test -- --treenode-filter "/*/*/LoginTests/*"

# .NET 10+ SDK only — the platform flag can be passed directly.
dotnet test --treenode-filter "/*/*/LoginTests/*"
```

Anything after `--` is passed through to the TUnit test runner rather than to
the `dotnet test` command itself. Flags from extension packages
(`--coverage`, `--report-trx`, `--results-directory`, etc.) **must** also sit
after the `--`:

```bash
dotnet test --configuration Release --no-build \
-- --treenode-filter "/*/*/*/*[Category=Unit]" --coverage --report-trx
```

> Run with no filter to execute everything: `dotnet test`.

## The `--treenode-filter` syntax

A filter is a path with four segments, optionally annotated with a property
group on any segment:

```
/<Assembly>/<Namespace>/<Class>/<TestName>[Property=Value]
```

Use `*` as a wildcard in any segment. The classic "run all tests" filter is
`/*/*/*/*` — four wildcards, one per level.

### Operators

| Operator | Meaning | Example |
| -------- | --------------------------------------------- | -------------------------------------- |
| `*` | Wildcard within a segment | `/*/*/LoginTests*/*` |
| `=` | Property equals (exact) | `/*/*/*/*[Category=Unit]` |
| `!=` | Property not equal (exclude) | `/*/*/*/*[Category!=Slow]` |
| `&` | AND — within one segment / property group | `/**[(Category=Unit)&(Priority=High)]` |
| `\|` | OR — within one segment / property group | `/*/*/(LoginTests)\|(SignupTests)/*` |
| `**` | Match any path depth (must be at the **end**) | `/MyAssembly/**` |

### Two grammar rules that are easy to get wrong

1. **`&` and `|` operate _inside a single segment or property group_, and each
side must be wrapped in parentheses.** They do not join two complete paths.
2. **Only one property group `[...]` is allowed per path segment.** Combine
conditions _inside_ the single bracket — do not chain brackets.
3. **`**` must terminate the path.** `/MyAssembly/**` is valid; `/**/Class/*`
is not.

## Troubleshooting: "Zero tests ran" / 0 tests discovered

Check, in order:

1. **`--filter` was used instead of `--treenode-filter`.** This is the most common cause.
2. **`Microsoft.NET.Test.Sdk` is still referenced.** It conflicts with the TUnit MTP platform.
3. **TUnit package missing.** Ensure `<PackageReference Include="TUnit" Version="*" />`.
4. **Missing `[Test]` attribute** or unsupported method shape.
5. **Wrong `OutputType`.** A `hostfxr.dll could not be found` error means the project needs `<OutputType>Exe</OutputType>`.
6. **Bad filter shape.** Remember the path has exactly four segments.

## References

- TUnit — Test Filters: https://tunit.dev/docs/execution/test-filters/
- TUnit — Troubleshooting & FAQ: https://tunit.dev/docs/troubleshooting/
- TUnit — CI/CD pipelines: https://tunit.dev/docs/examples/tunit-ci-pipeline/
- TUnit — Explicit tests: https://tunit.dev/docs/writing-tests/explicit/
- MTP graph-query filtering spec: https://github.com/microsoft/testfx/blob/main/docs/mstest-runner-graphqueryfiltering/graph-query-filtering.md
5 changes: 5 additions & 0 deletions .changeset/bumpy-crabs-double.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

fixed GetOrCreateAsync always calling creator func/ action
5 changes: 5 additions & 0 deletions .changeset/bumpy-symbols-learn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

fixed GetOrCreate that called created func regardless of state
5 changes: 5 additions & 0 deletions .changeset/chubby-suns-fry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

added EF support for complex value objects
5 changes: 5 additions & 0 deletions .changeset/fuzzy-adults-battle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

fixed the valueobject EF ctor generation not covering all valueobject types
5 changes: 5 additions & 0 deletions .changeset/major-flies-repeat.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

fixed another GetOrCreateAsync issue calling creator action/ func on non-new aggregates
9 changes: 9 additions & 0 deletions .changeset/pre.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,29 @@
"purview-eventsourcing": "2.0.0-prerelease.0"
},
"changesets": [
"bumpy-crabs-double",
"bumpy-symbols-learn",
"chubby-suns-fry",
"clean-papayas-hang",
"curvy-bushes-strive",
"eager-bikes-hope",
"early-dryers-slide",
"eight-walls-report",
"famous-rice-enter",
"fuzzy-adults-battle",
"large-ideas-vanish",
"little-moose-buy",
"major-flies-repeat",
"new-grapes-drive",
"pink-parks-brush",
"shy-fans-show",
"slick-hotels-float",
"tasty-moose-tickle",
"three-ends-nail",
"two-moose-hug",
"two-wasps-yell",
"violet-files-turn",
"wacky-eagles-punch",
"wild-trees-shout",
"witty-chefs-find"
]
Expand Down
5 changes: 5 additions & 0 deletions .changeset/slick-hotels-float.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

added an inmemory event and snapshot store for testing
5 changes: 5 additions & 0 deletions .changeset/three-ends-nail.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

fix: added telemetry activity source and meter names
7 changes: 7 additions & 0 deletions .changeset/violet-files-turn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"purview-eventsourcing": patch
---

- fixed SQL snapshot support for directly mapped complex mirror properties, including deep query translation over `ParserReportSummary` members
- clarified SQL snapshot/query documentation for provider-converted scalar value objects vs directly mapped complex mirrors
- aligned repo-local agent instructions and skills under `.agents/skills`
5 changes: 5 additions & 0 deletions .changeset/wacky-eagles-punch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"purview-eventsourcing": patch
---

added IEquatible for value object structs
4 changes: 2 additions & 2 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Follow `AGENTS.md`.

Prefer repository-local guidance from:

- `.github/skills/`
- `.agents/skills/`
- `src/skills/`
- `.agents/skills/` (workflow/tooling skills)
- `.agents/agents/`
- `.agents/instructions/`
23 changes: 0 additions & 23 deletions .github/skills/changesets-prerelease/SKILL.md

This file was deleted.

Loading