From e959a2ed483d3f1c71d0421466b5141390aae638 Mon Sep 17 00:00:00 2001
From: VasiliyF <5789590+vfofanov@users.noreply.github.com>
Date: Sun, 4 Oct 2026 02:30:31 +0200
Subject: [PATCH] Move to DragoAnt.MSBuildKit and the shared GitHub workflows
- install DragoAnt.MSBuildKit 0.1.1 (+ PackageAsProj, EF) in
src/.toolkit, drop the copied MSBuild.Routine files
- .sln -> .slnx, test projects now build in Release; global.json at the
root with SDK 10.0.401 and Microsoft.Testing.Platform
- tests run on xUnit v3 / MTP v2 with the kit's package versions; the
SQL Server suites run only with -p:RunSqlServerTests=true
- rename DragoAnt.EntityConventions(.TriggerBased).Contacts to
...Contracts (projects, package ids, namespaces)
- packages: real descriptions, tags and package READMEs; package
validation suppressions for the EF 9 migrator constructors
- remove the unused DragoAnt.Shared copy and the excluded Types files
- ci.yml + release.yml call DragoAnt/.github dotnet-build; the old
publish workflow (no tests, dispatch input in run:) is gone
- dependabot for actions and NuGet
---
.github/dependabot.yml | 47 +++
.github/workflows/build_and_publish_nuget.yml | 47 ---
.github/workflows/ci.yml | 23 ++
.github/workflows/release.yml | 99 ++++++
CONTRIBUTING.md | 34 ++
README.md | 8 +
global.json | 10 +
.../DragoAnt.src/Directory.Secrets.props | 2 -
src/.msbuild/README.md | 127 -------
src/.msbuild/init.company.specific.props | 43 ---
src/.msbuild/init.company.specific.targets | 3 -
src/.msbuild/package.icon.png | Bin 7646 -> 0 bytes
.../checks/check.prerelease.packages.targets | 37 --
.../checks/check.restrict.packages.targets | 37 --
.../checks/check.restrict.reference.targets | 42 ---
.../checks/check.shared.properties.props | 11 -
.../checks/check.shared.properties.targets | 66 ----
src/.msbuild/shared/checks/init.checks.props | 5 -
.../shared/checks/init.checks.targets | 11 -
src/.msbuild/shared/common/ci.github.props | 12 -
src/.msbuild/shared/common/ci.gitlab.props | 10 -
.../shared/common/code.analyzer.props | 30 --
.../shared/common/code.analyzer.targets | 11 -
.../shared/common/code.coverage.targets | 6 -
src/.msbuild/shared/common/git.routine.props | 22 --
src/.msbuild/shared/common/init.common.props | 16 -
.../shared/common/init.common.targets | 7 -
src/.msbuild/shared/common/package.targets | 43 ---
.../common/private.assets.references.targets | 16 -
src/.msbuild/shared/common/product.props | 17 -
.../shared/common/secrets.directory.props | 11 -
.../shared/common/secrets.project.targets | 13 -
src/.msbuild/shared/init.props | 47 ---
src/.msbuild/shared/init.targets | 55 ---
src/.msbuild/shared/local.cs.files.targets | 27 --
.../shared/local.directory.secrets.props | 23 --
src/.msbuild/shared/local.secrets.props | 11 -
src/.msbuild/shared/local.secrets.targets | 67 ----
.../shared/project.global.usings.targets | 16 -
.../test.project.internalsVisibleTo.targets | 32 --
.../tests/tests.project.code.coverage.targets | 17 -
.../tests.project.lib.global.usings.targets | 31 --
src/.msbuild/shared/tests/tests.project.props | 18 -
.../shared/tests/tests.project.targets | 19 -
.../tests.project.xunit.v3.routine.props | 24 --
.../tests.project.xunit.v3.routine.targets | 19 -
.../shared/utils/readMetadata.targets | 60 ----
src/.msbuild/shared/version.props | 67 ----
src/.toolkit/kit.json | 6 +
src/.toolkit/kit.parts | 20 ++
.../audit/audit.autodetect-mutex.targets | 15 +
.../audit/audit.roslyn-satellites.targets | 33 ++
.../core.common.props | 32 ++
.../core.locals.props | 8 +
.../core.locals.targets | 8 +
.../DragoAnt.MSBuildKit.Core/git.root.props | 29 ++
.../git.routine.props | 12 +
.../DragoAnt.MSBuildKit.Core/init.props | 10 +
.../DragoAnt.MSBuildKit.Core/init.targets | 5 +
.../project-types.autodetect.props | 46 +++
.../tfm.routine.props | 42 +++
.../msbuild/DragoAnt.MSBuildKit.EF/init.props | 9 +
.../scripts}/add-migration.ps1 | 0
.../scripts}/apply-migrations.ps1 | 0
.../DragoAnt.MSBuildKit.EF/scripts}/init.ps1 | 0
.../scripts}/remove-migration.ps1 | 0
.../scripts}/test-migration-file.ps1 | 0
.../init.props | 3 +
.../init.targets | 3 +
.../local.compile.props} | 4 +-
.../local.compile.targets | 40 +++
.../init.props | 9 +
.../init.targets | 10 +
.../local.directory.secrets.cleanup.targets | 6 +-
.../local.directory.secrets.props | 31 ++
.../local.directory.secrets.targets | 51 +--
.../init.props | 7 +
.../init.targets | 14 +
.../local.secrets.cleanup.targets | 4 +-
.../local.secrets.props | 10 +
.../local.secrets.targets | 61 ++++
.../init.last.targets | 8 +
.../packageAsProj.targets} | 37 +-
.../audit/audit.package.targets | 128 +++++++
.../DragoAnt.MSBuildKit.Packaging/init.props | 20 ++
.../init.targets | 5 +
.../package.inspect.targets | 110 ++++++
.../package.targets | 80 +++++
.../init.last.targets} | 4 +-
.../private.assets.references.targets | 14 +
.../audit.tests.project.xunit.v3.targets | 15 +
.../implicit.package.targets | 26 ++
.../init.last.targets | 6 +
.../init.props | 12 +
.../init.targets | 7 +
.../tests.lib.project.xunit.v3.common.props | 5 +
.../tests.project.xunit.v3.common.props | 8 +
.../tests.project.xunit.v3.routine.props | 8 +
.../tests.project.xunit.v3.routine.targets | 57 +++
.../audit/audit.internalsVisibleTo.targets | 20 ++
.../audit/audit.tests.lib.project.targets | 37 ++
.../audit/audit.tests.project.targets | 82 +++++
.../implicit.package.targets | 42 +++
.../init.last.targets | 6 +
.../DragoAnt.MSBuildKit.Testing/init.props | 15 +
.../DragoAnt.MSBuildKit.Testing/init.targets | 9 +
.../test.project.internalsVisibleTo.targets | 31 ++
.../tests.lib.project.common.props | 21 ++
.../tests.project.common.props | 22 ++
.../tests.project.lib.global.usings.targets | 28 ++
.../tests.project.mtp.routine.targets | 25 ++
.../tests.project.props | 44 +++
.../tests.project.targets | 35 ++
.../init.props | 5 +
.../tfm.constants.props | 8 +-
.../ci.github.props | 27 ++
.../DragoAnt.MSBuildKit.Vcs.GitHub/init.props | 5 +
...audit.implicit.packages.duplicates.targets | 34 ++
.../audit/audit.prerelease.packages.targets | 29 ++
.../audit/audit.restrict.packages.targets | 32 ++
.../audit/audit.restrict.reference.targets | 35 ++
.../audit/audit.shared.properties.targets | 98 ++++++
.../audit/audit.version.targets | 93 +++++
.../DragoAnt.MSBuildKit/init.last.props | 11 +
.../DragoAnt.MSBuildKit/init.last.targets | 7 +
.../msbuild/DragoAnt.MSBuildKit/init.props | 17 +
.../msbuild/DragoAnt.MSBuildKit/init.targets | 16 +
.../msbuild/DragoAnt.MSBuildKit/product.props | 13 +
.../project.global.metadata.targets | 31 ++
.../project.global.usings.targets | 12 +
.../twae.shared.init.props | 8 +
.../msbuild/DragoAnt.MSBuildKit/version.props | 145 ++++++++
.../DragoAnt.MSBuildKit/version.targets | 38 ++
src/.toolkit/msbuild/init.company.props | 35 ++
src/.toolkit/msbuild/init.company.targets | 5 +
src/.toolkit/msbuild/init.props | 26 ++
src/.toolkit/msbuild/init.targets | 28 ++
src/.toolkit/res/package.icon.png | Bin 0 -> 10282 bytes
src/.toolkit/update.ps1 | 214 ++++++++++++
src/.toolkit/update.sh | 222 ++++++++++++
src/Directory.Build.props | 19 +-
src/Directory.Build.targets | 10 +-
src/Directory.Packages.props | 9 -
src/Directory.Version.props | 5 +
...DragoAnt.EntityConventions.Contacts.csproj | 8 -
.../package.readme.md | 3 -
...ragoAnt.EntityConventions.Contracts.csproj | 8 +
...yConventions.Contracts.csproj.DotSettings} | 0
.../EntityConventionsCommonDefaultsOptions.cs | 2 +-
.../EntityConventionsException.cs | 2 +-
.../ExceptionHelper.cs | 2 +-
.../IConcurrentAuditedEntityConvention.cs | 2 +-
.../ICreateAuditedEntityConvention.cs | 2 +-
.../IEntityConventionContract.cs | 2 +-
.../IWithDiscriminatorEntityConvention.cs | 2 +-
.../IWithSourceSystemIdEntityConvention.cs | 2 +-
...IWithSourceSystemIdEntityConventionGuid.cs | 2 +-
.../Options/BasePropertyOptions.cs | 2 +-
.../Options/CreateAuditedOptions.cs | 2 +-
.../Options/DiscriminatorOptions.cs | 2 +-
.../Options/SourceSystemIdOptions.cs | 2 +-
.../Options/StringPropertyOptions.cs | 2 +-
.../package.readme.md | 9 +
.../package.readme.md | 3 -
...Conventions.TriggerBased.Contracts.csproj} | 4 +-
...TriggerBased.Contracts.csproj.DotSettings} | 0
.../ISoftDeleteEntityConvention.cs | 4 +-
.../IUpdateAuditedEntityConvention.cs | 4 +-
.../package.readme.md | 9 +
...ragoAnt.EntityDefinition.AspNetCore.csproj | 2 +-
.../package.readme.md | 8 +-
...DragoAnt.EntityDefinition.Contracts.csproj | 2 +-
.../package.readme.md | 8 +-
...ition.EntityFrameworkCore.Flowchart.csproj | 2 +-
.../package.readme.md | 8 +-
...tion.EntityFrameworkCore.Relational.csproj | 2 +-
.../package.readme.md | 8 +-
...ntityDefinition.EntityFrameworkCore.csproj | 2 +-
.../package.readme.md | 8 +-
...DragoAnt.EntityDefinition.Flowchart.csproj | 14 +-
.../Types/FlowchartEntityOptions.cs | 32 --
.../Types/FlowchartGraphBuilderOptions.cs | 6 -
.../Types/FlowchartPropertyOptions.cs | 48 ---
.../package.readme.md | 8 +-
.../DragoAnt.EntityDefinition.csproj | 2 +-
.../package.readme.md | 8 +-
.../Animal.cs | 4 +-
.../Contact2.cs | 2 +-
.../Role.cs | 4 +-
.../Animal.cs | 4 +-
.../Contact2.cs | 2 +-
.../Role.cs | 4 +-
...tyFrameworkCore.DependencyInjection.csproj | 2 +-
.../package.readme.md | 10 +-
...tityConventions.DependencyInjection.csproj | 1 +
.../package.readme.md | 10 +-
...tions.SqlServer.DependencyInjection.csproj | 4 +
.../package.readme.md | 10 +-
...yConventions.TriggerBased.SqlServer.csproj | 2 +-
.../package.readme.md | 8 +-
...Core.EntityConventions.TriggerBased.csproj | 6 +-
.../ModelBuilderConventionsExtensions.cs | 4 +-
.../package.readme.md | 8 +-
.../DiscriminatorExtensions.cs | 2 +-
...tityFrameworkCore.EntityConventions.csproj | 4 +-
.../EntityConventionsBuilder.cs | 2 +-
.../EntityConventionsOptions.cs | 2 +-
.../IEntityConventionsBuilder.cs | 2 +-
.../ModelBuilderConventionsExtensions.cs | 2 +-
.../SourceSystemIdValueGenerator.cs | 2 +-
.../package.readme.md | 8 +-
...ricalMigrations.DependencyInjection.csproj | 2 +-
.../package.readme.md | 10 +-
...yFrameworkCore.HistoricalMigrations.csproj | 2 +-
.../package.readme.md | 8 +-
...rkCore.InMemory.DependencyInjection.csproj | 2 +-
.../package.readme.md | 10 +-
.../MigrationsTest.cs | 4 +-
...Core.PostgreSQL.DependencyInjection.csproj | 4 +-
.../package.readme.md | 10 +-
.../CompatibilitySuppressions.xml | 10 +
...oAnt.EntityFrameworkCore.PostgreSQL.csproj | 4 +-
.../package.readme.md | 8 +-
...oAnt.EntityFrameworkCore.Relational.csproj | 2 +-
.../package.readme.md | 8 +-
...kCore.SqlServer.DependencyInjection.csproj | 2 +-
.../package.readme.md | 10 +-
.../HistoricalMigrationsRegistrationTests.cs | 4 +-
.../MigrationsTest.cs | 4 +-
...goAnt.EntityFrameworkCore.SqlServer.csproj | 2 +-
.../package.readme.md | 8 +-
.../CompatibilitySuppressions.xml | 16 +
...ntityFrameworkCore.StaticMigrations.csproj | 2 +-
.../package.readme.md | 8 +-
...ragoAnt.EntityFrameworkCore.Testing.csproj | 2 +-
.../package.readme.md | 8 +-
src/DragoAnt.EntityFrameworkCore.sln | 324 ------------------
src/DragoAnt.EntityFrameworkCore.slnx | 66 ++++
.../DragoAnt.EntityFrameworkCore.csproj | 2 +-
.../package.readme.md | 8 +-
src/DragoAnt.Shared/DragoAnt.Shared.csproj | 12 -
.../Resources/AssemblyExtensions.cs | 56 ---
src/DragoAnt.Shared/Resources/ResFile.cs | 71 ----
src/DragoAnt.Shared/Tables/ITableWriter.cs | 8 -
.../Tables/TableWriterColumn.cs | 6 -
.../DragoAnt.StaticMigrations.csproj | 2 +-
.../package.readme.md | 8 +-
src/PackageAsProj.targets | 8 +-
src/global.json | 7 -
249 files changed, 3244 insertions(+), 1972 deletions(-)
create mode 100644 .github/dependabot.yml
delete mode 100644 .github/workflows/build_and_publish_nuget.yml
create mode 100644 .github/workflows/ci.yml
create mode 100644 .github/workflows/release.yml
create mode 100644 CONTRIBUTING.md
create mode 100644 global.json
delete mode 100644 src/.msbuild.templates/SlnSecrets/DragoAnt.src/Directory.Secrets.props
delete mode 100644 src/.msbuild/README.md
delete mode 100644 src/.msbuild/init.company.specific.props
delete mode 100644 src/.msbuild/init.company.specific.targets
delete mode 100644 src/.msbuild/package.icon.png
delete mode 100644 src/.msbuild/shared/checks/check.prerelease.packages.targets
delete mode 100644 src/.msbuild/shared/checks/check.restrict.packages.targets
delete mode 100644 src/.msbuild/shared/checks/check.restrict.reference.targets
delete mode 100644 src/.msbuild/shared/checks/check.shared.properties.props
delete mode 100644 src/.msbuild/shared/checks/check.shared.properties.targets
delete mode 100644 src/.msbuild/shared/checks/init.checks.props
delete mode 100644 src/.msbuild/shared/checks/init.checks.targets
delete mode 100644 src/.msbuild/shared/common/ci.github.props
delete mode 100644 src/.msbuild/shared/common/ci.gitlab.props
delete mode 100644 src/.msbuild/shared/common/code.analyzer.props
delete mode 100644 src/.msbuild/shared/common/code.analyzer.targets
delete mode 100644 src/.msbuild/shared/common/code.coverage.targets
delete mode 100644 src/.msbuild/shared/common/git.routine.props
delete mode 100644 src/.msbuild/shared/common/init.common.props
delete mode 100644 src/.msbuild/shared/common/init.common.targets
delete mode 100644 src/.msbuild/shared/common/package.targets
delete mode 100644 src/.msbuild/shared/common/private.assets.references.targets
delete mode 100644 src/.msbuild/shared/common/product.props
delete mode 100644 src/.msbuild/shared/common/secrets.directory.props
delete mode 100644 src/.msbuild/shared/common/secrets.project.targets
delete mode 100644 src/.msbuild/shared/init.props
delete mode 100644 src/.msbuild/shared/init.targets
delete mode 100644 src/.msbuild/shared/local.cs.files.targets
delete mode 100644 src/.msbuild/shared/local.directory.secrets.props
delete mode 100644 src/.msbuild/shared/local.secrets.props
delete mode 100644 src/.msbuild/shared/local.secrets.targets
delete mode 100644 src/.msbuild/shared/project.global.usings.targets
delete mode 100644 src/.msbuild/shared/tests/test.project.internalsVisibleTo.targets
delete mode 100644 src/.msbuild/shared/tests/tests.project.code.coverage.targets
delete mode 100644 src/.msbuild/shared/tests/tests.project.lib.global.usings.targets
delete mode 100644 src/.msbuild/shared/tests/tests.project.props
delete mode 100644 src/.msbuild/shared/tests/tests.project.targets
delete mode 100644 src/.msbuild/shared/tests/tests.project.xunit.v3.routine.props
delete mode 100644 src/.msbuild/shared/tests/tests.project.xunit.v3.routine.targets
delete mode 100644 src/.msbuild/shared/utils/readMetadata.targets
delete mode 100644 src/.msbuild/shared/version.props
create mode 100644 src/.toolkit/kit.json
create mode 100644 src/.toolkit/kit.parts
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.autodetect-mutex.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.roslyn-satellites.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.common.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.root.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.routine.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/project-types.autodetect.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/tfm.routine.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/init.props
rename src/{.msbuild/shared/scripts/ef => .toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts}/add-migration.ps1 (100%)
rename src/{.msbuild/shared/scripts/ef => .toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts}/apply-migrations.ps1 (100%)
rename src/{.msbuild/shared/scripts/ef => .toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts}/init.ps1 (100%)
rename src/{.msbuild/shared/scripts/ef => .toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts}/remove-migration.ps1 (100%)
rename src/{.msbuild/shared/scripts/ef => .toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts}/test-migration-file.ps1 (100%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.targets
rename src/{.msbuild/shared/local.cs.files.props => .toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.props} (57%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.targets
rename src/{.msbuild/shared => .toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets}/local.directory.secrets.cleanup.targets (79%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.props
rename src/{.msbuild/shared => .toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets}/local.directory.secrets.targets (53%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.targets
rename src/{.msbuild/shared => .toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets}/local.secrets.cleanup.targets (77%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/init.last.targets
rename src/{.msbuild/shared/packageAsProj.routine.targets => .toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/packageAsProj.targets} (55%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/audit/audit.package.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.inspect.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.targets
rename src/{.msbuild/shared/common/init.common.final.targets => .toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/init.last.targets} (53%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/private.assets.references.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/audit/audit.tests.project.xunit.v3.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/implicit.package.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.last.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.lib.project.xunit.v3.common.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.common.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.internalsVisibleTo.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.lib.project.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.project.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/implicit.package.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.last.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/test.project.internalsVisibleTo.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.lib.project.common.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.common.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.lib.global.usings.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.mtp.routine.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants/init.props
rename src/{.msbuild/shared/common => .toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants}/tfm.constants.props (93%)
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/ci.github.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.implicit.packages.duplicates.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.prerelease.packages.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.packages.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.reference.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.shared.properties.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.version.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/product.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.metadata.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.usings.targets
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/twae.shared.init.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.props
create mode 100644 src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.targets
create mode 100644 src/.toolkit/msbuild/init.company.props
create mode 100644 src/.toolkit/msbuild/init.company.targets
create mode 100644 src/.toolkit/msbuild/init.props
create mode 100644 src/.toolkit/msbuild/init.targets
create mode 100644 src/.toolkit/res/package.icon.png
create mode 100644 src/.toolkit/update.ps1
create mode 100644 src/.toolkit/update.sh
create mode 100644 src/Directory.Version.props
delete mode 100644 src/DragoAnt.EntityConventions.Contacts/DragoAnt.EntityConventions.Contacts.csproj
delete mode 100644 src/DragoAnt.EntityConventions.Contacts/package.readme.md
create mode 100644 src/DragoAnt.EntityConventions.Contracts/DragoAnt.EntityConventions.Contracts.csproj
rename src/{DragoAnt.EntityConventions.Contacts/DragoAnt.EntityConventions.Contacts.csproj.DotSettings => DragoAnt.EntityConventions.Contracts/DragoAnt.EntityConventions.Contracts.csproj.DotSettings} (100%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/EntityConventionsCommonDefaultsOptions.cs (93%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/EntityConventionsException.cs (91%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/ExceptionHelper.cs (88%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/IConcurrentAuditedEntityConvention.cs (82%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/ICreateAuditedEntityConvention.cs (81%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/IEntityConventionContract.cs (70%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/IWithDiscriminatorEntityConvention.cs (89%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/IWithSourceSystemIdEntityConvention.cs (87%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/IWithSourceSystemIdEntityConventionGuid.cs (86%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/Options/BasePropertyOptions.cs (91%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/Options/CreateAuditedOptions.cs (92%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/Options/DiscriminatorOptions.cs (69%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/Options/SourceSystemIdOptions.cs (91%)
rename src/{DragoAnt.EntityConventions.Contacts => DragoAnt.EntityConventions.Contracts}/Options/StringPropertyOptions.cs (92%)
create mode 100644 src/DragoAnt.EntityConventions.Contracts/package.readme.md
delete mode 100644 src/DragoAnt.EntityConventions.TriggerBased.Contacts/package.readme.md
rename src/{DragoAnt.EntityConventions.TriggerBased.Contacts/DragoAnt.EntityConventions.TriggerBased.Contacts.csproj => DragoAnt.EntityConventions.TriggerBased.Contracts/DragoAnt.EntityConventions.TriggerBased.Contracts.csproj} (54%)
rename src/{DragoAnt.EntityConventions.TriggerBased.Contacts/DragoAnt.EntityConventions.TriggerBased.Contacts.csproj.DotSettings => DragoAnt.EntityConventions.TriggerBased.Contracts/DragoAnt.EntityConventions.TriggerBased.Contracts.csproj.DotSettings} (100%)
rename src/{DragoAnt.EntityConventions.TriggerBased.Contacts => DragoAnt.EntityConventions.TriggerBased.Contracts}/ISoftDeleteEntityConvention.cs (73%)
rename src/{DragoAnt.EntityConventions.TriggerBased.Contacts => DragoAnt.EntityConventions.TriggerBased.Contracts}/IUpdateAuditedEntityConvention.cs (68%)
create mode 100644 src/DragoAnt.EntityConventions.TriggerBased.Contracts/package.readme.md
delete mode 100644 src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartEntityOptions.cs
delete mode 100644 src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartGraphBuilderOptions.cs
delete mode 100644 src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartPropertyOptions.cs
create mode 100644 src/DragoAnt.EntityFrameworkCore.PostgreSQL/CompatibilitySuppressions.xml
create mode 100644 src/DragoAnt.EntityFrameworkCore.StaticMigrations/CompatibilitySuppressions.xml
delete mode 100644 src/DragoAnt.EntityFrameworkCore.sln
create mode 100644 src/DragoAnt.EntityFrameworkCore.slnx
delete mode 100644 src/DragoAnt.Shared/DragoAnt.Shared.csproj
delete mode 100644 src/DragoAnt.Shared/Resources/AssemblyExtensions.cs
delete mode 100644 src/DragoAnt.Shared/Resources/ResFile.cs
delete mode 100644 src/DragoAnt.Shared/Tables/ITableWriter.cs
delete mode 100644 src/DragoAnt.Shared/Tables/TableWriterColumn.cs
delete mode 100644 src/global.json
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..8fc2252
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,47 @@
+version: 2
+updates:
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: weekly
+ groups:
+ actions:
+ patterns:
+ - actions/*
+ - DragoAnt/*
+ - NuGet/*
+
+ - package-ecosystem: nuget
+ directory: /src
+ schedule:
+ interval: weekly
+ groups:
+ microsoft:
+ patterns:
+ - Microsoft.*
+ - System.*
+ - Npgsql.*
+ testing:
+ patterns:
+ - xunit*
+ - Verify*
+ - FluentAssertions
+ ignore:
+ # Versions after 32.0.0 require a paid maintenance subscription.
+ - dependency-name: Verify
+ versions:
+ - '>32.0.0'
+ - dependency-name: Verify.XunitV3
+ versions:
+ - '>32.0.0'
+ # 8.x requires a commercial license.
+ - dependency-name: FluentAssertions
+ update-types:
+ - version-update:semver-major
+ # One version line per target framework (Directory.Packages.props); a major bump would break the older TFMs.
+ - dependency-name: Microsoft.*
+ update-types:
+ - version-update:semver-major
+ - dependency-name: Npgsql.*
+ update-types:
+ - version-update:semver-major
diff --git a/.github/workflows/build_and_publish_nuget.yml b/.github/workflows/build_and_publish_nuget.yml
deleted file mode 100644
index 44b0d87..0000000
--- a/.github/workflows/build_and_publish_nuget.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-# This is a basic workflow to help you get started with Actions
-
-name: Build and publish to nuget.org
-
-# Controls when the workflow will run
-on:
- release:
- types:
- - published
- # Allows you to run this workflow manually from the Actions tab
- workflow_dispatch:
- inputs:
- PATCH_NUM_SUFFIX:
- description: 'Version patch number suffix'
- required: true
- default: 'beta'
-
-env:
- PROJECT_PATH: 'src/DragoAnt.EntityFrameworkCore.sln'
- PACKAGE_OUTPUT_DIRECTORY: '${{ github.workspace }}/output'
- NUGET_SOURCE_URL: 'https://api.nuget.org/v3/index.json'
- BUILD_CONFIGURATION: Release
-
-jobs:
- build_publish_nuget:
- name: 'Build and publish nuget packages'
- runs-on: 'ubuntu-latest'
- steps:
- - name: 'Checkout'
- uses: actions/checkout@v4
-
- - name: 'Install dotnet'
- uses: actions/setup-dotnet@v4
- with:
- global-json-file: "./src/global.json"
-
- - name: 'Restore packages'
- run: dotnet restore ${{ env.PROJECT_PATH }}
-
- - name: 'Build'
- run: dotnet msbuild -t:Build '-p:Configuration=${{ env.BUILD_CONFIGURATION }};PatchNumSuffix=${{ github.event.inputs.PATCH_NUM_SUFFIX }}' ${{ env.PROJECT_PATH }}
-
- - name: 'Pack'
- run: dotnet pack ${{ env.PROJECT_PATH }} --no-restore --no-build --configuration ${{ env.BUILD_CONFIGURATION }} --output ${{ env.PACKAGE_OUTPUT_DIRECTORY }} '-p:PatchNumSuffix=${{ github.event.inputs.PATCH_NUM_SUFFIX }}'
-
- - name: 'Push packages'
- run: dotnet nuget push ${{ env.PACKAGE_OUTPUT_DIRECTORY }}/*.nupkg -k ${{ secrets.NUGET_ORG_API_KEY }} -s ${{ env.NUGET_SOURCE_URL }} --skip-duplicate
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..80b60ba
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,23 @@
+name: ci
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ci-${{ github.ref }}
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
+
+jobs:
+ build:
+ name: Build and test
+ uses: DragoAnt/.github/.github/workflows/dotnet-build.yml@c9f20c11ebd297193a910d965d33bdf37c0d6c42 # main
+ with:
+ version: 0.0.0-ci.${{ github.run_number }}
+ solution: src/DragoAnt.EntityFrameworkCore.slnx
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..eaad265
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,99 @@
+name: release
+
+on:
+ release:
+ types:
+ - published
+
+permissions:
+ contents: read
+
+concurrency:
+ group: release-${{ github.event.release.tag_name }}
+ cancel-in-progress: false
+
+jobs:
+ version:
+ name: Version from tag
+ runs-on: ubuntu-24.04
+ timeout-minutes: 5
+ outputs:
+ version: ${{ steps.version.outputs.version }}
+ steps:
+ - name: Validate tag
+ id: version
+ env:
+ TAG: ${{ github.event.release.tag_name }}
+ PRERELEASE: ${{ github.event.release.prerelease }}
+ run: |
+ version="${TAG#[vV]}"
+ ident='(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)'
+ semver="^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-$ident(\.$ident)*)?$"
+ if ! [[ "$version" =~ $semver ]]; then
+ echo "::error::release tag '$TAG' is not a SemVer version (vMAJOR.MINOR.PATCH[-prerelease], no build metadata)"
+ exit 1
+ fi
+ if [[ "$version" == 9999.* ]]; then
+ echo "::error::9999.x is the local development version and is never published"
+ exit 1
+ fi
+ if [[ "$PRERELEASE" == "true" && "$version" != *-* ]]; then
+ echo "::error::the release is marked pre-release but '$TAG' has no -suffix"
+ exit 1
+ fi
+ if [[ "$PRERELEASE" != "true" && "$version" == *-* ]]; then
+ echo "::error::'$TAG' is a pre-release version; tick 'Set as a pre-release' on the release"
+ exit 1
+ fi
+ echo "version=$version" >> "$GITHUB_OUTPUT"
+ echo "Package version: $version"
+
+ build:
+ name: Build, test, pack
+ needs: version
+ uses: DragoAnt/.github/.github/workflows/dotnet-build.yml@c9f20c11ebd297193a910d965d33bdf37c0d6c42 # main
+ with:
+ version: ${{ needs.version.outputs.version }}
+ pack: true
+ solution: src/DragoAnt.EntityFrameworkCore.slnx
+
+ publish:
+ name: Publish to nuget.org
+ needs: build
+ runs-on: ubuntu-24.04
+ timeout-minutes: 10
+ environment:
+ name: nuget
+ url: https://www.nuget.org/profiles/${{ vars.NUGET_USER || 'DragoAnt' }}
+ permissions:
+ id-token: write
+ steps:
+ - name: Download packages
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: ${{ needs.build.outputs.packages-artifact }}
+ path: packages
+
+ - name: NuGet login (Trusted Publishing)
+ id: login
+ continue-on-error: true
+ uses: NuGet/login@8d196754b4036150537f80ac539e15c2f1028841 # v1.2.0
+ with:
+ user: ${{ vars.NUGET_USER || 'DragoAnt' }}
+
+ - name: Push
+ env:
+ OIDC_KEY: ${{ steps.login.outputs.NUGET_API_KEY }}
+ FALLBACK_KEY: ${{ secrets.NUGET_ORG_API_KEY }}
+ run: |
+ if [ -n "$OIDC_KEY" ]; then
+ key="$OIDC_KEY"
+ echo "Pushing with a short-lived nuget.org Trusted Publishing key."
+ elif [ -n "$FALLBACK_KEY" ]; then
+ key="$FALLBACK_KEY"
+ echo "::warning::nuget.org Trusted Publishing login failed, falling back to the NUGET_ORG_API_KEY secret. Add a Trusted Publishing policy on nuget.org (this repository, workflow file of this workflow, environment 'nuget') and delete the secret."
+ else
+ echo "::error::nuget.org Trusted Publishing login failed and no NUGET_ORG_API_KEY secret is available. Add a Trusted Publishing policy on nuget.org for this repository, this workflow file and environment 'nuget' (or set the NUGET_USER variable if the policy owner is not 'DragoAnt')."
+ exit 1
+ fi
+ dotnet nuget push "packages/*.nupkg" --api-key "$key" --source https://api.nuget.org/v3/index.json --skip-duplicate
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..7640648
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,34 @@
+# Contributing
+
+Issues and pull requests are welcome. For anything larger than a small fix, open an issue first so the approach can be agreed before you write the code.
+
+## Build and test
+
+You need the .NET SDK pinned in [global.json](./global.json), plus the .NET 8 and .NET 9 runtimes so the tests run for every target framework. Then run the same steps as CI:
+
+```sh
+dotnet restore src/DragoAnt.EntityFrameworkCore.slnx
+dotnet build src/DragoAnt.EntityFrameworkCore.slnx -c Release --no-restore
+dotnet test --solution src/DragoAnt.EntityFrameworkCore.slnx -c Release --no-build
+```
+
+Tests use xUnit v3 on Microsoft.Testing.Platform v2, with FluentAssertions 7 and Verify snapshots. The `*.SqlServer.Tests` suites need SQL Server on `localhost,14330` and run only when you add `-p:RunSqlServerTests=true` to the build and test commands. When a snapshot changes on purpose, review the `*.received.*` file and replace the matching `*.verified.*` file with it.
+
+## Build kit
+
+The shared MSBuild settings come from [DragoAnt.MSBuildKit](https://github.com/DragoAnt/MSBuildKit), committed under `src/.toolkit/`; don't edit it by hand. Move to another kit release with its update script and commit the result:
+
+```sh
+sh src/.toolkit/update.sh --root src --version 0.2.0 # or: pwsh src/.toolkit/update.ps1 -Root src -Version 0.2.0
+```
+
+Repository settings live in `src/Directory.Build.props` (target frameworks, copyright), `src/Directory.Version.props` (the next release's `VersionPrefix`) and `src/Directory.Packages.props` (package versions the kit does not provide).
+
+## Pull requests
+
+- Branch from `master` and target `master`.
+- Add or update tests for every behavior change.
+- Keep the build warning-free: warnings are treated as errors.
+- The `ci` workflow must pass on the pull request.
+
+Releases are published to nuget.org by the maintainers from a GitHub release.
diff --git a/README.md b/README.md
index 74a66f5..8089677 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,9 @@
# EntityFramework Core extensions
+
+[](https://github.com/DragoAnt/Extensions.EntityFrameworkCore/actions/workflows/ci.yml)
+
+```sh
+dotnet add package DragoAnt.EntityFrameworkCore.StaticMigrations
+```
+
+Part of [DragoAnt](https://github.com/DragoAnt) open-source .NET libraries.
diff --git a/global.json b/global.json
new file mode 100644
index 0000000..1ce25c3
--- /dev/null
+++ b/global.json
@@ -0,0 +1,10 @@
+{
+ "sdk": {
+ "version": "10.0.401",
+ "rollForward": "latestMinor",
+ "allowPrerelease": false
+ },
+ "test": {
+ "runner": "Microsoft.Testing.Platform"
+ }
+}
diff --git a/src/.msbuild.templates/SlnSecrets/DragoAnt.src/Directory.Secrets.props b/src/.msbuild.templates/SlnSecrets/DragoAnt.src/Directory.Secrets.props
deleted file mode 100644
index 8c119d5..0000000
--- a/src/.msbuild.templates/SlnSecrets/DragoAnt.src/Directory.Secrets.props
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/.msbuild/README.md b/src/.msbuild/README.md
deleted file mode 100644
index 6ec3b76..0000000
--- a/src/.msbuild/README.md
+++ /dev/null
@@ -1,127 +0,0 @@
-# MSBuild common routine for DragoAnt repositories
-
-## Prerequisites
-
-- .NET SDK (the latest version recommended)
-- MSBuild
-- Git
-
-## Overview
-
-This repository contains common MSBuild routines and configurations used across company repositories. It provides standardized build settings, version
-management, and project configurations.
-
-_You can copy this repository and adapt for your needs._
-
-## Key Features
-
-### Company-Specific Settings
-
-- Standardized company information (ManufacturerName, FullManufacturerName)
-- Default warning configurations
-- GitLab CI integration
-- Version management strategies:
- - DateBased (default): `yyyy.M.d.$([MSBuild]::Modulo($(CIPipelineId), $(MaxBuildNumber)))`
- - SemVer: Semantic versioning with build number
- - SemVer4: Modified semantic versioning(uses CI pipeline id as build number)
- - VersionTag: Git tag-based versioning
-
-### Build Configuration
-
-- Nullable reference types enabled by default
-- Implicit usings enabled
-- Latest C# language version
-- Code style enforcement in build
-- Warning treatment as errors
-- Documentation file generation for NuGet packages
-
-### Project Structure
-
-The repository is organized into several key directories:
-
-- `shared/`: Contains common build configurations
- - `common/`: Common properties and settings
- - `tests/`: Test project configurations
- - `utils/`: Utility build scripts
- - `checks/`: Build validation checks
-
-### Key Files
-
-- `init.company.specific.props`: Company-wide property definitions
-- `init.company.specific.targets`: Company-wide target definitions
-- `shared/init.props`: Base property initialization
-- `shared/init.targets`: Base target initialization
-- `shared/version.props`: Version management configuration
-- Various local configuration files for secrets and project-specific settings
-
-## Usage
-
-1. Add submodule to your git repository. File `.gitmodules`
- ```
- [submodule ".msbuild"]
- path = .msbuild
- url = ../MSBuild.Routine.git
- branch = master
- ```
-
-2. Add `Directory.Build.props` in your solution's directory:
-
-```xml
-
-
-
-
-
- net9.0
- false
-
-
-
-
-
-
-
-```
-
-3. Add `Directory.Build.targets` in your solution's directory:
-
-```xml
-
-
-
-
-
-
-```
-
-You can change properties to enable/disable MSBuild routine functionality in `Directory.Build.props` for all sln projects or in `.csproj` file for an individual
-project.
-
-## Version Management
-
-The system supports multiple versioning strategies:
-
-- **DateBased** (default): Uses date-based versioning with build number
-- **SemVer**: Follows semantic versioning (https://semver.org/)
-- **SemVer4**: Modified semantic versioning with build number(uses CI pipeline id as build number)
-- **VersionTag**: Uses Git tags for versioning
-
-## Security
-
-The repository includes support for managing secrets and sensitive information:
-
-- Local secrets management
-- Directory-level secrets configuration
-- Secret cleanup routines
-
-## Best Practices
-
-1. Always use the company-specific settings for consistency
-2. Enable code style enforcement in builds
-3. Use the provided version management system
-4. Follow the established project structure
-5. Utilize the built-in security features for managing secrets
-
-## Questions
-
-If you have questions or suggestions, feel free to write to [Issues](https://github.com/DragoAnt/MSBuild.Routine/issues).
\ No newline at end of file
diff --git a/src/.msbuild/init.company.specific.props b/src/.msbuild/init.company.specific.props
deleted file mode 100644
index b4a3ff8..0000000
--- a/src/.msbuild/init.company.specific.props
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
- DragoAnt
- DragoAnt
- MIT
-
- https://github.com/$(GITHUB_REPOSITORY)
- True
-
- VersionTag
- $(GITHUB_REF_NAME)
-
- true
-
- $(NoWarn);CS1591;EF1001;xUnit1051
-
- enable
- enable
- True
-
- latest
- True
- true
- False
-
-
-
-
- $(MSBuildThisFileDirectory)..\
-
- False
- False
-
-
-
- $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\').TrimEnd('\').TrimEnd('//'))
- DragoAnt.$([System.IO.Path]::GetFileName('$(RepoFolder)'))
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/init.company.specific.targets b/src/.msbuild/init.company.specific.targets
deleted file mode 100644
index 4de98b5..0000000
--- a/src/.msbuild/init.company.specific.targets
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/package.icon.png b/src/.msbuild/package.icon.png
deleted file mode 100644
index ef7aedbe7dcd16b9e04ec92dbe56f135eff2ca6e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 7646
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
Vant@D@$WKHRY_B^THZYDe*l)GaNPg^
diff --git a/src/.msbuild/shared/checks/check.prerelease.packages.targets b/src/.msbuild/shared/checks/check.prerelease.packages.targets
deleted file mode 100644
index 05d634b..0000000
--- a/src/.msbuild/shared/checks/check.prerelease.packages.targets
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
- true
-
-
-
-
-
-
-
-
-
-
- MSBLC0001
- Prerelease packages found in stable branch.
- Your current branch: $(Branch)
- But following rc packages are used:
- @(PrereleaseReferences->' %(Identity) %(Version)', '%0D%0A')
- Please replace rc packages with stable ones
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/checks/check.restrict.packages.targets b/src/.msbuild/shared/checks/check.restrict.packages.targets
deleted file mode 100644
index cf3d6c8..0000000
--- a/src/.msbuild/shared/checks/check.restrict.packages.targets
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/checks/check.restrict.reference.targets b/src/.msbuild/shared/checks/check.restrict.reference.targets
deleted file mode 100644
index d0ebb78..0000000
--- a/src/.msbuild/shared/checks/check.restrict.reference.targets
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- False
- $(RestrictReferences)
- $(RestrictReferences)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/checks/check.shared.properties.props b/src/.msbuild/shared/checks/check.shared.properties.props
deleted file mode 100644
index a1dd616..0000000
--- a/src/.msbuild/shared/checks/check.shared.properties.props
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- $(TreatWarningsAsErrors)
-
-
- TargetFramework
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/checks/check.shared.properties.targets b/src/.msbuild/shared/checks/check.shared.properties.targets
deleted file mode 100644
index 8d4032d..0000000
--- a/src/.msbuild/shared/checks/check.shared.properties.targets
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- @(TargetFrameworkNodeCheckXmlResult->Count())
- @(TargetFrameworksNodeCheckXmlResult->Count())
- @(TargetFrameworksCheckXmlResult)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/checks/init.checks.props b/src/.msbuild/shared/checks/init.checks.props
deleted file mode 100644
index 7f5ed02..0000000
--- a/src/.msbuild/shared/checks/init.checks.props
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/checks/init.checks.targets b/src/.msbuild/shared/checks/init.checks.targets
deleted file mode 100644
index 5b5562e..0000000
--- a/src/.msbuild/shared/checks/init.checks.targets
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/ci.github.props b/src/.msbuild/shared/common/ci.github.props
deleted file mode 100644
index 117423f..0000000
--- a/src/.msbuild/shared/common/ci.github.props
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- False
- $(GITHUB_RUN_ID)
- $(GITHUB_REF_NAME)
- $(GITHUB_SHA)
- $(GITHUB_RUN_NUMBER)
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/ci.gitlab.props b/src/.msbuild/shared/common/ci.gitlab.props
deleted file mode 100644
index d9a67b4..0000000
--- a/src/.msbuild/shared/common/ci.gitlab.props
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- False
- $(CI_PIPELINE_ID)
- $(CI_COMMIT_REF_SLUG)
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/code.analyzer.props b/src/.msbuild/shared/common/code.analyzer.props
deleted file mode 100644
index 2b66fce..0000000
--- a/src/.msbuild/shared/common/code.analyzer.props
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
- True
- True
- True
-
- Code analyzers description
-
-
- netstandard2.0
-
- True
- disable
- True
- analyzer;roslyn;code-analysis
-
- False
- False
- True
- True
- True
-
-
-
-
-
-
-
-
diff --git a/src/.msbuild/shared/common/code.analyzer.targets b/src/.msbuild/shared/common/code.analyzer.targets
deleted file mode 100644
index aef6292..0000000
--- a/src/.msbuild/shared/common/code.analyzer.targets
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/.msbuild/shared/common/code.coverage.targets b/src/.msbuild/shared/common/code.coverage.targets
deleted file mode 100644
index 56dfb0f..0000000
--- a/src/.msbuild/shared/common/code.coverage.targets
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/git.routine.props b/src/.msbuild/shared/common/git.routine.props
deleted file mode 100644
index 4dcb9df..0000000
--- a/src/.msbuild/shared/common/git.routine.props
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- $(MSBuildProjectDirectory)
- $([System.IO.Path]::GetDirectoryName($(GitRoot)))
- $([System.IO.Path]::GetDirectoryName($(GitRoot)))
- $([System.IO.Path]::GetDirectoryName($(GitRoot)))
- $([System.IO.Path]::GetDirectoryName($(GitRoot)))
- $([System.IO.Path]::GetDirectoryName($(GitRoot)))
- $([System.IO.Path]::GetDirectoryName($(GitRoot)))
- $([System.IO.Path]::GetDirectoryName($(GitRoot)))
- $([System.IO.File]::ReadAllText('$(GitRoot)\.git\HEAD').Trim().Replace('ref: refs/heads/', ''))
-
-
-
- unknown-branch
- ^(master|release).*$
- false
- true
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/init.common.props b/src/.msbuild/shared/common/init.common.props
deleted file mode 100644
index 54f31ea..0000000
--- a/src/.msbuild/shared/common/init.common.props
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- True
-
- $(MSBuildThisFileDirectory)code.analyzer.props
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/init.common.targets b/src/.msbuild/shared/common/init.common.targets
deleted file mode 100644
index 3997470..0000000
--- a/src/.msbuild/shared/common/init.common.targets
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/package.targets b/src/.msbuild/shared/common/package.targets
deleted file mode 100644
index 8c54c56..0000000
--- a/src/.msbuild/shared/common/package.targets
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
- $(MSBuildProjectName)
- $(MSBuildProjectName)
- $(Version)
- false
-
- $(MSBuildThisFileDirectory)..\package.icon.png
- icon.png
- readme.md
-
- git
- $(RepositoryUrl)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- # $(MSBuildProjectName)
-
- $(Description)
-
-
-
-
-
-
-
-
-
diff --git a/src/.msbuild/shared/common/private.assets.references.targets b/src/.msbuild/shared/common/private.assets.references.targets
deleted file mode 100644
index 5f50276..0000000
--- a/src/.msbuild/shared/common/private.assets.references.targets
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/product.props b/src/.msbuild/shared/common/product.props
deleted file mode 100644
index b0414c7..0000000
--- a/src/.msbuild/shared/common/product.props
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- $(MSBuildProjectName)
-
-
- $([System.DateTime]::Now.Year)
-
- $(ManufacturerName)
-
- $(FullManufacturerName)
-
- © $(Year) $(FullManufacturerName) ALL RIGHTS RESERVED.
-
- $(ManufacturerName)
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/secrets.directory.props b/src/.msbuild/shared/common/secrets.directory.props
deleted file mode 100644
index b18b7c4..0000000
--- a/src/.msbuild/shared/common/secrets.directory.props
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- True
-
- $([System.Environment]::GetFolderPath(SpecialFolder.ApplicationData))\Microsoft\UserSecrets\
- $([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.microsoft/usersecrets/
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/common/secrets.project.targets b/src/.msbuild/shared/common/secrets.project.targets
deleted file mode 100644
index e945722..0000000
--- a/src/.msbuild/shared/common/secrets.project.targets
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- True
-
-
-
-
-
- $(LocalSecretsBaseDirectory)$(UserSecretsId)
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/init.props b/src/.msbuild/shared/init.props
deleted file mode 100644
index 9894b23..0000000
--- a/src/.msbuild/shared/init.props
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
- enable
- enable
- latest
- True
-
- True
-
- False
- $(MSBuildThisFileDirectory)..\..\.msbuild.templates\
-
-
-
-
-
-
-
-
- True
- True
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/init.targets b/src/.msbuild/shared/init.targets
deleted file mode 100644
index 9fbd7db..0000000
--- a/src/.msbuild/shared/init.targets
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/local.cs.files.targets b/src/.msbuild/shared/local.cs.files.targets
deleted file mode 100644
index d0536e4..0000000
--- a/src/.msbuild/shared/local.cs.files.targets
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
- %(Filename)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/local.directory.secrets.props b/src/.msbuild/shared/local.directory.secrets.props
deleted file mode 100644
index 0e0522f..0000000
--- a/src/.msbuild/shared/local.directory.secrets.props
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
- True
- False
-
-
-
- $(LocalSecretsBaseDirectory)$(SlnSecretsId)
- $(LocalSlnSecretsDir)/Directory.Secrets.props
- $(LocalSlnSecretsDir)/Directory.Secrets.targets
-
- $(SecretsTemplatesDir)SlnSecrets\$(SlnSecretsId)
- $(LocalSlnSecretsTemplateDir)/Directory.Secrets.props
- $(LocalSlnSecretsTemplateDir)/Directory.Secrets.targets
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/local.secrets.props b/src/.msbuild/shared/local.secrets.props
deleted file mode 100644
index 410d480..0000000
--- a/src/.msbuild/shared/local.secrets.props
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- $(LocalSecretsDir)/secrets.json
-
- $(SecretsTemplatesDir)\Secrets\$(UserSecretsId)
- $(LocalSecretsTemplateDir)/secrets.json
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/local.secrets.targets b/src/.msbuild/shared/local.secrets.targets
deleted file mode 100644
index 55230af..0000000
--- a/src/.msbuild/shared/local.secrets.targets
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
- false
-
- {
-}
-
-
-
-
-
-
- appsettings.UserSecrets.json
- Always
- Always
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/project.global.usings.targets b/src/.msbuild/shared/project.global.usings.targets
deleted file mode 100644
index fee0200..0000000
--- a/src/.msbuild/shared/project.global.usings.targets
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/tests/test.project.internalsVisibleTo.targets b/src/.msbuild/shared/tests/test.project.internalsVisibleTo.targets
deleted file mode 100644
index 50166f6..0000000
--- a/src/.msbuild/shared/tests/test.project.internalsVisibleTo.targets
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
- .Tests
-
-
- $(TestsDir.EndsWith('\'))
- $(TestsDir)\
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/tests/tests.project.code.coverage.targets b/src/.msbuild/shared/tests/tests.project.code.coverage.targets
deleted file mode 100644
index 8d08948..0000000
--- a/src/.msbuild/shared/tests/tests.project.code.coverage.targets
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
- True
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/tests/tests.project.lib.global.usings.targets b/src/.msbuild/shared/tests/tests.project.lib.global.usings.targets
deleted file mode 100644
index 171b0ec..0000000
--- a/src/.msbuild/shared/tests/tests.project.lib.global.usings.targets
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/tests/tests.project.props b/src/.msbuild/shared/tests/tests.project.props
deleted file mode 100644
index 82e1f9a..0000000
--- a/src/.msbuild/shared/tests/tests.project.props
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
- .Tests
- $(MSBuildProjectName.EndsWith($(TestsProjectNameEndsWith)))
-
-
-
- False
- False
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/tests/tests.project.targets b/src/.msbuild/shared/tests/tests.project.targets
deleted file mode 100644
index 445a639..0000000
--- a/src/.msbuild/shared/tests/tests.project.targets
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
- True
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/tests/tests.project.xunit.v3.routine.props b/src/.msbuild/shared/tests/tests.project.xunit.v3.routine.props
deleted file mode 100644
index 2951aab..0000000
--- a/src/.msbuild/shared/tests/tests.project.xunit.v3.routine.props
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
- Exe
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/tests/tests.project.xunit.v3.routine.targets b/src/.msbuild/shared/tests/tests.project.xunit.v3.routine.targets
deleted file mode 100644
index 4ee6d9a..0000000
--- a/src/.msbuild/shared/tests/tests.project.xunit.v3.routine.targets
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-{
- "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json"
-}
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/utils/readMetadata.targets b/src/.msbuild/shared/utils/readMetadata.targets
deleted file mode 100644
index eee1382..0000000
--- a/src/.msbuild/shared/utils/readMetadata.targets
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
- $(OutDir)
- $([System.IO.Path]::GetFullPath('$(ProjMetadataOutDir)').TrimEnd('/').Replace('\', '/'))
-
-
-
-
-
-
-
-
-
-
-
-
-
- %(PackageReference.Version)
-
-
- %(PackageReference.VersionOverride)
- true
-
-
-
-
- $(ProjMetadataOutDir)/$(MSBuildProjectName).$(TargetFramework).metadata.yml
-
- $(ManagePackageVersionsCentrally)
- false
-
- @(PackagesWithVersion->' %(Identity): %(Version)', '%0D%0A')
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.msbuild/shared/version.props b/src/.msbuild/shared/version.props
deleted file mode 100644
index b09ab0d..0000000
--- a/src/.msbuild/shared/version.props
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
- 1.0.0
-
- DateBased
- DevEnv
-
- 0
- $(CIPipelineId)
-
- $(Branch.Replace('\','-').Replace('/','-'))
-
-
-
-
-
- $([System.DateTime]::UtcNow.ToString(yyyy.M.d))
-
- 10000
- $([MSBuild]::Modulo($(BuildNumber), $(MaxBuildNumber)))
- 1
-
- $(VersionPrefix).$(BuildNumber)
- $(PreReleaseSuffix)
-
-
-
-
- $(PreReleaseSuffix)test.$(BuildNumber)
-
-
-
-
- $(VersionPrefix).$(BuildNumber)
- $(PreReleaseSuffix)
-
-
-
-
-
- $(VersionTag)
- Empty version tag
- 0
-
-
-
-
- 9999.0.0
- 0
-
-
-
-
- Invalid version
-
-
-
-
diff --git a/src/.toolkit/kit.json b/src/.toolkit/kit.json
new file mode 100644
index 0000000..9f63620
--- /dev/null
+++ b/src/.toolkit/kit.json
@@ -0,0 +1,6 @@
+{
+ "repository": "DragoAnt/MSBuildKit",
+ "version": "0.1.1",
+ "sha256": "a16b4320b85318ed187b040a6d078e80587c201e918aaadea17f1a7af759c71e",
+ "parts": ["PackageAsProj", "EF"]
+}
diff --git a/src/.toolkit/kit.parts b/src/.toolkit/kit.parts
new file mode 100644
index 0000000..180cd2b
--- /dev/null
+++ b/src/.toolkit/kit.parts
@@ -0,0 +1,20 @@
+# DragoAnt.MSBuildKit parts: [required parts...]
+# The folder of a part is msbuild/DragoAnt.MSBuildKit. ("Trunk" is msbuild/DragoAnt.MSBuildKit).
+Core default
+Trunk default
+Vcs.GitHub default
+TfmConstants default
+Packaging default
+Testing default
+Testing.XUnit.v3 default Testing
+Locals.Compile default
+Locals.DirectorySecrets default
+Locals.Secrets default
+PrivateAssets default
+Project.RoslynComponent optional
+Project.CodeAnalyzer optional Project.RoslynComponent
+Project.CodeFixer optional Project.RoslynComponent Project.CodeAnalyzer
+Project.SourceGenerator optional Project.RoslynComponent
+PackageAsProj optional
+ProjMetadata optional
+EF optional
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.autodetect-mutex.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.autodetect-mutex.targets
new file mode 100644
index 0000000..74fc36e
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.autodetect-mutex.targets
@@ -0,0 +1,15 @@
+
+
+
+
+
+ <_MSKit_AutoDetectedTypes>@(MSKit_AutoDetectedProjectType, ', ')
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.roslyn-satellites.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.roslyn-satellites.targets
new file mode 100644
index 0000000..d5b0b61
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/audit/audit.roslyn-satellites.targets
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.common.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.common.props
new file mode 100644
index 0000000..cac50d6
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.common.props
@@ -0,0 +1,32 @@
+
+
+
+ false
+
+ True
+
+
+ $(Version)
+
+ True
+
+ $(MSBuildThisFileDirectory)../../.local/
+
+ $([System.IO.Path]::GetDirectoryName('$(SlnxFilePath)').Replace('\', '/').TrimEnd('/'))/
+ $(MSBuildThisFileDirectory)../../../
+ $([System.IO.Path]::GetFullPath('$(MSKit_SlnFileDirectory)').Replace('\', '/').TrimEnd('/'))/
+
+ $([System.IO.Path]::GetFileNameWithoutExtension('$(SlnxFilePath)'))
+
+ $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../').Replace('\', '/').TrimEnd('/'))/
+ $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../../').Replace('\', '/').TrimEnd('/'))/
+
+ <_ProjectObjDir>$(BaseIntermediateOutputPath)
+ <_ProjectObjDir Condition="'$(_ProjectObjDir)'==''">obj
+ $(_ProjectObjDir)
+ $([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)/$(_ProjectObjDir)'))
+ $([System.IO.Path]::GetFullPath('$(MSKit_ProjectObjDir)').TrimEnd('/').Replace('\', '/'))
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.props
new file mode 100644
index 0000000..162da03
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.props
@@ -0,0 +1,8 @@
+
+
+
+ $([System.Environment]::GetFolderPath(SpecialFolder.ApplicationData))\Microsoft\UserSecrets\
+ $([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.microsoft/usersecrets/
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.targets
new file mode 100644
index 0000000..fcae3d7
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/core.locals.targets
@@ -0,0 +1,8 @@
+
+
+
+
+ $(MSKit_LocalSecretsBaseDirectory)$(UserSecretsId)
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.root.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.root.props
new file mode 100644
index 0000000..74b018a
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.root.props
@@ -0,0 +1,29 @@
+
+
+
+
+ $(GITHUB_HEAD_REF)
+
+
+ $(GITHUB_REF_NAME)
+
+
+
+ $([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildProjectDirectory)', '.git'))
+ $([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildProjectDirectory)', '.git/HEAD'))
+
+
+
+ <_MSKit_GitHeadFile Condition="Exists('$(MSKit_GitRoot)/.git/HEAD')">$(MSKit_GitRoot)/.git/HEAD
+
+ <_MSKit_GitDirPointer Condition="'$(_MSKit_GitHeadFile)'=='' AND Exists('$(MSKit_GitRoot)/.git')">$([System.IO.File]::ReadAllText('$(MSKit_GitRoot)/.git').Trim().Replace('gitdir: ', ''))
+ <_MSKit_GitDirPointer Condition="'$(_MSKit_GitDirPointer)'!='' AND !$([System.IO.Path]::IsPathRooted('$(_MSKit_GitDirPointer)'))">$(MSKit_GitRoot)/$(_MSKit_GitDirPointer)
+ <_MSKit_GitHeadFile Condition="'$(_MSKit_GitDirPointer)'!='' AND Exists('$(_MSKit_GitDirPointer)/HEAD')">$(_MSKit_GitDirPointer)/HEAD
+
+
+
+ $([System.IO.File]::ReadAllText('$(_MSKit_GitHeadFile)').Trim().Replace('ref: refs/heads/', ''))
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.routine.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.routine.props
new file mode 100644
index 0000000..2993abe
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/git.routine.props
@@ -0,0 +1,12 @@
+
+
+
+ $(GITHUB_REF_NAME)
+ unknown-branch
+
+ ^(main|master|release/.+)$
+ false
+ true
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.props
new file mode 100644
index 0000000..edfb4ee
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.props
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.targets
new file mode 100644
index 0000000..2869ae6
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/init.targets
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/project-types.autodetect.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/project-types.autodetect.props
new file mode 100644
index 0000000..b6ae321
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/project-types.autodetect.props
@@ -0,0 +1,46 @@
+
+
+
+
+ (?<!^DragoAnt\.MSBuildKit\.Project)\.Analyzers$
+ (?<!^DragoAnt\.MSBuildKit\.Project)\.CodeFixes$
+ (?<!^DragoAnt\.MSBuildKit\.Project)\.SourceGenerator$
+
+
+
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_CodeAnalyzerProjectNameRegex)))
+ True
+
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_CodeFixerProjectNameRegex)))
+ True
+
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_SourceGeneratorProjectNameRegex)))
+ true
+
+
+
+
+ <_MSKit_CodeAnalyzerProjectNameRegex_Shared>$(MSKit_CodeAnalyzerProjectNameRegex)
+ <_MSKit_CodeFixerProjectNameRegex_Shared>$(MSKit_CodeFixerProjectNameRegex)
+ <_MSKit_SourceGeneratorProjectNameRegex_Shared>$(MSKit_SourceGeneratorProjectNameRegex)
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/tfm.routine.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/tfm.routine.props
new file mode 100644
index 0000000..0239a0f
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Core/tfm.routine.props
@@ -0,0 +1,42 @@
+
+
+
+
+ <_MSKit_DbpFilePath>$([MSBuild]::GetPathOfFileAbove('Directory.Build.props'))
+ <_MSKit_DbpText Condition="'$(_MSKit_DbpFilePath)' != '' AND Exists('$(_MSKit_DbpFilePath)')">$([System.IO.File]::ReadAllText('$(_MSKit_DbpFilePath)'))
+
+ <_MSKit_DbpHasTargetFramework Condition="'$(_MSKit_DbpText)' != '' AND ($(_MSKit_DbpText.Contains('<TargetFramework>')) OR $(_MSKit_DbpText.Contains('<TargetFramework ')))">True
+ <_MSKit_DbpHasTargetFrameworks Condition="'$(_MSKit_DbpText)' != '' AND ($(_MSKit_DbpText.Contains('<TargetFrameworks>')) OR $(_MSKit_DbpText.Contains('<TargetFrameworks ')))">True
+
+ $([System.Text.RegularExpressions.Regex]::Match($(_MSKit_DbpText), '<TargetFramework[^>/]*>([^<]*)</TargetFramework>').Groups[1].Value)
+ $([System.Text.RegularExpressions.Regex]::Match($(_MSKit_DbpText), '<TargetFrameworks[^>/]*>([^<]*)</TargetFrameworks>').Groups[1].Value)
+
+
+
+
+ <_MSKit_GuardXmlPeekRoutine Condition="'$(MSKit_GuardXmlPeekRoutine)'!='False'">True
+ <_MSKit_CsprojText Condition="'$(_MSKit_GuardXmlPeekRoutine)'=='True' AND '$(_MSKit_CsprojText)'==''">$([System.IO.File]::ReadAllText('$(MSBuildProjectFullPath)'))
+ <_MSKit_RoutineHasTargetFramework Condition="'$(_MSKit_GuardXmlPeekRoutine)'!='True'">True
+ <_MSKit_RoutineHasTargetFramework Condition="'$(_MSKit_GuardXmlPeekRoutine)'=='True' AND ($(_MSKit_CsprojText.Contains('<TargetFramework>')) OR $(_MSKit_CsprojText.Contains('<TargetFramework ')))">True
+ <_MSKit_RoutineHasTargetFrameworks Condition="'$(_MSKit_GuardXmlPeekRoutine)'!='True'">True
+ <_MSKit_RoutineHasTargetFrameworks Condition="'$(_MSKit_GuardXmlPeekRoutine)'=='True' AND ($(_MSKit_CsprojText.Contains('<TargetFrameworks>')) OR $(_MSKit_CsprojText.Contains('<TargetFrameworks ')))">True
+
+
+
+ $([System.Text.RegularExpressions.Regex]::Match($(_MSKit_CsprojText), '<TargetFramework[^>/]*>([^<]*)</TargetFramework>').Groups[1].Value)
+ $([System.Text.RegularExpressions.Regex]::Match($(_MSKit_CsprojText), '<TargetFrameworks[^>/]*>([^<]*)</TargetFrameworks>').Groups[1].Value)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/init.props
new file mode 100644
index 0000000..5bc2ad5
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/init.props
@@ -0,0 +1,9 @@
+
+
+
+
+ $(MSBuildThisFileDirectory)scripts/
+
+
+
diff --git a/src/.msbuild/shared/scripts/ef/add-migration.ps1 b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/add-migration.ps1
similarity index 100%
rename from src/.msbuild/shared/scripts/ef/add-migration.ps1
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/add-migration.ps1
diff --git a/src/.msbuild/shared/scripts/ef/apply-migrations.ps1 b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/apply-migrations.ps1
similarity index 100%
rename from src/.msbuild/shared/scripts/ef/apply-migrations.ps1
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/apply-migrations.ps1
diff --git a/src/.msbuild/shared/scripts/ef/init.ps1 b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/init.ps1
similarity index 100%
rename from src/.msbuild/shared/scripts/ef/init.ps1
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/init.ps1
diff --git a/src/.msbuild/shared/scripts/ef/remove-migration.ps1 b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/remove-migration.ps1
similarity index 100%
rename from src/.msbuild/shared/scripts/ef/remove-migration.ps1
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/remove-migration.ps1
diff --git a/src/.msbuild/shared/scripts/ef/test-migration-file.ps1 b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/test-migration-file.ps1
similarity index 100%
rename from src/.msbuild/shared/scripts/ef/test-migration-file.ps1
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.EF/scripts/test-migration-file.ps1
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.props
new file mode 100644
index 0000000..47e2180
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.props
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.targets
new file mode 100644
index 0000000..3c6b4c8
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/init.targets
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/.msbuild/shared/local.cs.files.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.props
similarity index 57%
rename from src/.msbuild/shared/local.cs.files.props
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.props
index 430f81c..b068b85 100644
--- a/src/.msbuild/shared/local.cs.files.props
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.props
@@ -1,7 +1,7 @@
- $(SecretsTemplatesDir)LocalCompile/
+ $(MSKit_Templates)LocalCompile/
-
\ No newline at end of file
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.targets
new file mode 100644
index 0000000..77eb087
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Compile/local.compile.targets
@@ -0,0 +1,40 @@
+
+
+
+ <_LocalCompileNamespace>$(RootNamespace)
+ <_LocalCompileNamespace Condition="'$(_LocalCompileNamespace)'==''">$(MSBuildProjectName)
+
+
+
+
+
+
+
+
+
+
+
+
+ %(Filename)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.props
new file mode 100644
index 0000000..effb46d
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.props
@@ -0,0 +1,9 @@
+
+
+
+ True
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.targets
new file mode 100644
index 0000000..d2456b2
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/init.targets
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/.msbuild/shared/local.directory.secrets.cleanup.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.cleanup.targets
similarity index 79%
rename from src/.msbuild/shared/local.directory.secrets.cleanup.targets
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.cleanup.targets
index 8716bc3..eb8172a 100644
--- a/src/.msbuild/shared/local.directory.secrets.cleanup.targets
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.cleanup.targets
@@ -1,8 +1,5 @@
-
-
-
@@ -11,7 +8,6 @@
-
@@ -20,4 +16,4 @@
-
\ No newline at end of file
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.props
new file mode 100644
index 0000000..8dec6d3
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.props
@@ -0,0 +1,31 @@
+
+
+
+ $(MSKit_SlnFileName)
+
+ False
+
+
+
+
+ $(MSKit_LocalSecretsBaseDirectory)$(MSKit_SlnSecretsId)
+ $(LocalSlnSecretsDir)/Directory.Secrets.props
+
+ $(MSKit_Templates)
+ $(LocalSlnSecretsTemplateDir)/Directory.Secrets.props
+
+
+
+
+
+
+ False
+
+
+
+ $(LocalSlnSecretsDir)/Directory.Secrets.targets
+
+ $(LocalSlnSecretsTemplateDir)/Directory.Secrets.targets
+
+
+
diff --git a/src/.msbuild/shared/local.directory.secrets.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.targets
similarity index 53%
rename from src/.msbuild/shared/local.directory.secrets.targets
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.targets
index bf41b54..71e24f6 100644
--- a/src/.msbuild/shared/local.directory.secrets.targets
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.DirectorySecrets/local.directory.secrets.targets
@@ -1,9 +1,8 @@
-
+
-
-
Directory.Secrets.props
@@ -21,72 +20,54 @@
-
-
-
-
-
+ File="$(LocalSlnSecretsTemplateProps)"
+ Overwrite="true"
+ Lines="$(LocalSlnSecretsEmptyTemplateNewBody)" />
-
-
-
-
+ File="$(LocalSlnSecretsTemplateTargets)"
+ Overwrite="true"
+ Lines="$(LocalSlnSecretsEmptyTemplateNewBody)" />
-
-
-
-
-
-
-
+
-
-
-
-
-
+
-
+ File="$(LocalSlnSecretsTargets)"
+ Overwrite="true"
+ Condition="!Exists('$(LocalSlnSecretsTargets)')" Lines="$(LocalSlnSecretsEmptyTemplateNewBody)" />
-
\ No newline at end of file
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.props
new file mode 100644
index 0000000..b796e6c
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.props
@@ -0,0 +1,7 @@
+
+
+
+ True
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.targets
new file mode 100644
index 0000000..ce7b418
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/init.targets
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.msbuild/shared/local.secrets.cleanup.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.cleanup.targets
similarity index 77%
rename from src/.msbuild/shared/local.secrets.cleanup.targets
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.cleanup.targets
index 6ea8f92..ed00d8e 100644
--- a/src/.msbuild/shared/local.secrets.cleanup.targets
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.cleanup.targets
@@ -1,12 +1,10 @@
-
-
-
\ No newline at end of file
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.props
new file mode 100644
index 0000000..0de50b5
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.props
@@ -0,0 +1,10 @@
+
+
+
+ $(LocalSecretsDir)/secrets.json
+
+ $(MSKit_Templates)
+ $(LocalSecretsTemplateDir)/$(UserSecretsId).secrets.json
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.targets
new file mode 100644
index 0000000..dcce4ad
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Locals.Secrets/local.secrets.targets
@@ -0,0 +1,61 @@
+
+
+
+ appsettings
+
+ false
+
+ {
+}
+
+
+
+
+
+
+ $(UserSecretsLinkNamePrefix).UserSecrets.json
+
+ Always
+
+ Always
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/init.last.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/init.last.targets
new file mode 100644
index 0000000..876d52b
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/init.last.targets
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/src/.msbuild/shared/packageAsProj.routine.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/packageAsProj.targets
similarity index 55%
rename from src/.msbuild/shared/packageAsProj.routine.targets
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/packageAsProj.targets
index 75a8387..03588d0 100644
--- a/src/.msbuild/shared/packageAsProj.routine.targets
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PackageAsProj/packageAsProj.targets
@@ -1,14 +1,14 @@
-
-
+
-
-
+
+
-
@@ -19,19 +19,11 @@
-
-
- ================================================================================
- = ATTENTION: Packages attached as ProjectReference instead of PackageReference =
- ================================================================================
- Packages: @(PackageAsProj_ProjectReference)
-
-
-
-
-
-
+
+
@@ -41,9 +33,10 @@
-
-
-
\ No newline at end of file
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/audit/audit.package.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/audit/audit.package.targets
new file mode 100644
index 0000000..06657dc
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/audit/audit.package.targets
@@ -0,0 +1,128 @@
+
+
+
+
+
+ True
+ 30
+ ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$
+ 128
+
+ api.codacy.com;api.codeclimate.com;api.dependabot.com;api.reuse.software;api.travis-ci.com;app.codacy.com;app.deepsource.com;avatars.githubusercontent.com;badgen.net;badges.gitter.im;camo.githubusercontent.com;caniuse.bitsofco.de;cdn.jsdelivr.net;cdn.syncfusion.com;ci.appveyor.com;circleci.com;cloudback.it;codecov.io;codefactor.io;coveralls.io;dev.azure.com;devpod.sh;flat.badgen.net;gitlab.com;i.imgur.com;img.shields.io;infragistics.com;isitmaintained.com;media.githubusercontent.com;opencollective.com;raw.github.com;raw.githubusercontent.com;snyk.io;sonarcloud.io;travis-ci.com;travis-ci.org;user-images.githubusercontent.com
+ <_MSKit_PkgRules>https://learn.microsoft.com/nuget/create-packages/package-authoring-best-practices
+ <_MSKit_PkgReadmeRules>https://learn.microsoft.com/nuget/nuget-org/package-readme-on-nuget-org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_MSKit_Description>$(PackageDescription)
+ <_MSKit_Description Condition="'$(_MSKit_Description)'==''">$(Description)
+ <_MSKit_Description>$(_MSKit_Description.Trim())
+ <_MSKit_DescriptionIsPlaceholder Condition="'$(_MSKit_Description)'=='' OR '$(_MSKit_Description)'=='Package Description' OR '$(_MSKit_Description)'=='$(PackageId)' OR '$(_MSKit_Description)'=='$(MSBuildProjectName)'">True
+ <_MSKit_PkgVersion>$(PackageVersion)
+ <_MSKit_PkgVersion Condition="'$(_MSKit_PkgVersion)'==''">$(Version)
+ <_MSKit_RepoUrlFinal>$(RepositoryUrl)
+ <_MSKit_RepoUrlFinal Condition="'$(_MSKit_RepoUrlFinal)'==''">$(PrivateRepositoryUrl)
+ <_MSKit_LicenseIsOpen Condition="'$(PackageLicenseExpression)'!=''">True
+
+
+
+ <_MSKit_PkgFinding Include="MSKIT_PKG001" Condition="'$(_MSKit_DescriptionIsPlaceholder)'=='True'"
+ Text="Package '$(PackageId)' has no real Description ('$(_MSKit_Description)'). nuget.org search shows it first: say what the package does and what sets it apart, in one or two sentences."
+ Rule="$(_MSKit_PkgRules)#description" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG002" Condition="'$(_MSKit_DescriptionIsPlaceholder)'!='True' AND $(_MSKit_Description.Length) < $(MSKit_PackageDescriptionMinLength)"
+ Text="Package '$(PackageId)' Description is $(_MSKit_Description.Length) characters ('$(_MSKit_Description)'); write at least $(MSKit_PackageDescriptionMinLength): what it does and for whom (MSKit_PackageDescriptionMinLength sets the bar)."
+ Rule="$(_MSKit_PkgRules)#description" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG003" Condition="'$(PackageReadmeFile)'==''"
+ Text="Package '$(PackageId)' ships no README. Add package.readme.md next to the csproj: what it is, how to start, a short example, where to give feedback."
+ Rule="$(_MSKit_PkgRules)#readme" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG004" Condition="'$(PackageTags)'==''"
+ Text="Package '$(PackageId)' has no PackageTags. Add a few search terms that are not already in the package id."
+ Rule="$(_MSKit_PkgRules)#tags" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG005" Condition="'$(PackageIcon)'==''"
+ Text="Package '$(PackageId)' has no icon. Set PackageIconPath to a 128x128 PNG (the company layer of the kit sets one for every package)."
+ Rule="$(_MSKit_PkgRules)#icon" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG006" Condition="'$(PackageLicenseExpression)'=='' AND '$(PackageLicenseFile)'==''"
+ Text="Package '$(PackageId)' has no licence. Without one nobody may use it. Set PackageLicenseExpression to an SPDX id (for example MIT)."
+ Rule="$(_MSKit_PkgRules)#licensing" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG007" Condition="'$(PackageLicenseUrl)'!=''"
+ Text="Package '$(PackageId)' uses the deprecated PackageLicenseUrl. Replace it with PackageLicenseExpression (an SPDX id) or PackageLicenseFile."
+ Rule="$(_MSKit_PkgRules)#licensing" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG008" Condition="'$(PackageIconUrl)'!=''"
+ Text="Package '$(PackageId)' uses the deprecated PackageIconUrl. Pack the image and point PackageIcon (or the kit's PackageIconPath) at it."
+ Rule="$(_MSKit_PkgRules)#icon" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG009" Condition="'$(_MSKit_RelativeImages)'!=''"
+ Text="The package README of '$(PackageId)' has relative images, which nuget.org does not render: $(_MSKit_RelativeImages). Use absolute https URLs from an allowed host."
+ Rule="$(_MSKit_PkgReadmeRules)#allowed-domains-for-images-and-badges" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG010" Condition="'$(_MSKit_HtmlTags)'!=''"
+ Text="The package README of '$(PackageId)' contains HTML, which nuget.org does not render: $(_MSKit_HtmlTags). Use Markdown instead."
+ Rule="$(_MSKit_PkgReadmeRules)#supported-markdown-features" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG011" Condition="'$(_MSKit_Alerts)'!=''"
+ Text="The package README of '$(PackageId)' uses GitHub alert blocks, which nuget.org shows as plain quotes: $(_MSKit_Alerts). Use a bold lead-in such as **Note:** instead."
+ Rule="$(_MSKit_PkgReadmeRules)#supported-markdown-features" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG012" Condition="'$(_MSKit_DisallowedImages)'!=''"
+ Text="The package README of '$(PackageId)' loads images from hosts nuget.org blocks: $(_MSKit_DisallowedImages). Host them on an allowed domain (img.shields.io, raw.githubusercontent.com, ...)."
+ Rule="$(_MSKit_PkgReadmeRules)#allowed-domains-for-images-and-badges" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG013" Condition="'$(_MSKit_PkgVersion)'!='' AND !$([System.Text.RegularExpressions.Regex]::IsMatch('$(_MSKit_PkgVersion)', '$(MSKit_SemVerRegex)'))"
+ Text="Package '$(PackageId)' version '$(_MSKit_PkgVersion)' is not SemVer 2.0 (MAJOR.MINOR.PATCH[-prerelease][+metadata])."
+ Rule="$(_MSKit_PkgRules)#package-version" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG014" Condition="'$(_MSKit_RepoUrlFinal)'=='' OR '$(PackageProjectUrl)'==''"
+ Text="Package '$(PackageId)' has no repository or project URL. Set RepositoryUrl, or build from a git clone whose origin remote Source Link can read."
+ Rule="$(_MSKit_PkgRules)#repository-type-and-url" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG015" Condition="'$(MSKit_PackageIconSourcePath)'!='' AND Exists('$(MSKit_PackageIconSourcePath)') AND ('$(_MSKit_IconIsPng)'!='True' OR '$(_MSKit_IconWidth)'!='$(MSKit_PackageIconSize)' OR '$(_MSKit_IconHeight)'!='$(MSKit_PackageIconSize)')"
+ Text="Package '$(PackageId)' icon is not a $(MSKit_PackageIconSize)x$(MSKit_PackageIconSize) PNG (PNG: $(_MSKit_IconIsPng), size: $(_MSKit_IconWidth)x$(_MSKit_IconHeight))."
+ Rule="$(_MSKit_PkgRules)#icon" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG016" Condition="'$(PackageReleaseNotes)'==''"
+ Text="Package '$(PackageId)' has no PackageReleaseNotes. Set them, or a link to the changelog (on GitHub the kit links the releases page by default)."
+ Rule="$(_MSKit_PkgRules)#release-notes" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG017" Condition="'$(_MSKit_RelativeLinks)'!=''"
+ Text="The package README of '$(PackageId)' has relative links, which break on nuget.org: $(_MSKit_RelativeLinks). Use absolute URLs."
+ Rule="$(_MSKit_PkgReadmeRules)" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG018" Condition="'$(_MSKit_LicenseIsOpen)'=='True' AND $(Copyright.ToLowerInvariant().Contains('all rights reserved'))"
+ Text="Package '$(PackageId)' is licensed '$(PackageLicenseExpression)' but its Copyright says 'all rights reserved' ('$(Copyright)'). Use 'Copyright (c) YEAR OWNER'."
+ Rule="$(_MSKit_PkgRules)#copyright" />
+ <_MSKit_PkgFinding Include="MSKIT_PKG019" Condition="'$(_MSKit_HasMermaid)'=='True'"
+ Text="The package README of '$(PackageId)' contains a Mermaid diagram, which nuget.org shows as code. Link to the diagram on GitHub instead."
+ Rule="$(_MSKit_PkgReadmeRules)#supported-markdown-features" />
+
+
+
+ <_MSKit_PkgSkip Include="$(MSKit_SkipPackageChecks)" />
+ <_MSKit_PkgSkip Include="$(NoWarn)" />
+ <_MSKit_PkgFinding Remove="@(_MSKit_PkgSkip)" />
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.props
new file mode 100644
index 0000000..4d34098
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.props
@@ -0,0 +1,20 @@
+
+
+
+
+
+ true
+ true
+ true
+
+ True
+
+ true
+
+ true
+ all
+ low
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.targets
new file mode 100644
index 0000000..1d52011
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/init.targets
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.inspect.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.inspect.targets
new file mode 100644
index 0000000..4133174
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.inspect.targets
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ();
+var disallowedImages = new List();
+var relativeLinks = new List();
+var htmlTags = new List();
+var alerts = new List();
+
+if (!string.IsNullOrEmpty(ReadmePath) && File.Exists(ReadmePath))
+{
+ var text = File.ReadAllText(ReadmePath);
+ HasMermaid = Regex.IsMatch(text, @"^\s*(```|~~~)\s*mermaid\b", RegexOptions.Multiline | RegexOptions.IgnoreCase);
+
+ var prose = Regex.Replace(text, @"^\s*(```|~~~)[\s\S]*?^\s*\1\s*$", "", RegexOptions.Multiline);
+ prose = Regex.Replace(prose, @"`[^`\r\n]*`", "");
+
+ var hosts = (AllowedImageHosts ?? "").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
+ .Select(h => h.Trim().ToLowerInvariant()).Where(h => h.Length > 0).ToList();
+
+ var images = new List();
+ foreach (Match m in Regex.Matches(prose, @"!\[[^\]]*\]\(\s*([^)\s>]+)"))
+ images.Add(m.Groups[1].Value);
+ foreach (Match m in Regex.Matches(prose, @"
]*\bsrc\s*=\s*[""']([^""']+)[""']", RegexOptions.IgnoreCase))
+ images.Add(m.Groups[1].Value);
+
+ foreach (var url in images.Distinct())
+ {
+ Uri uri;
+ if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || (uri.Scheme != "https" && uri.Scheme != "http"))
+ {
+ relativeImages.Add(url);
+ continue;
+ }
+ var host = uri.Host.ToLowerInvariant();
+ var allowed = hosts.Contains(host)
+ || (host == "github.com" && Regex.IsMatch(uri.AbsolutePath, @"^/[^/]+/[^/]+/(actions/)?workflows/[^/]+/badge\.svg$", RegexOptions.IgnoreCase));
+ if (!allowed)
+ disallowedImages.Add(url);
+ }
+
+ foreach (Match m in Regex.Matches(prose, @"(?]+)"))
+ {
+ var target = m.Groups[1].Value;
+ if (target.StartsWith("#") || Regex.IsMatch(target, @"^[A-Za-z][A-Za-z0-9+.-]*:"))
+ continue;
+ relativeLinks.Add(target);
+ }
+
+ foreach (Match m in Regex.Matches(prose, @"?([A-Za-z][A-Za-z0-9-]*)(\s[^<>]*)?/?>"))
+ {
+ if (m.Value.Contains("://") || m.Value.Contains("@"))
+ continue;
+ htmlTags.Add("<" + m.Groups[1].Value.ToLowerInvariant() + ">");
+ }
+
+ foreach (Match m in Regex.Matches(prose, @"^\s*>\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]", RegexOptions.Multiline | RegexOptions.IgnoreCase))
+ alerts.Add("[!" + m.Groups[1].Value.ToUpperInvariant() + "]");
+}
+
+if (!string.IsNullOrEmpty(IconPath) && File.Exists(IconPath))
+{
+ var header = new byte[24];
+ using (var stream = File.OpenRead(IconPath))
+ {
+ var read = stream.Read(header, 0, header.Length);
+ IconIsPng = read == 24 && header[0] == 0x89 && header[1] == 0x50 && header[2] == 0x4E && header[3] == 0x47;
+ }
+ if (IconIsPng)
+ {
+ IconWidth = (header[16] << 24) | (header[17] << 16) | (header[18] << 8) | header[19];
+ IconHeight = (header[20] << 24) | (header[21] << 16) | (header[22] << 8) | header[23];
+ }
+}
+
+RelativeImages = string.Join(", ", relativeImages.Distinct());
+DisallowedImages = string.Join(", ", disallowedImages.Distinct());
+RelativeLinks = string.Join(", ", relativeLinks.Distinct());
+HtmlTags = string.Join(", ", htmlTags.Distinct());
+Alerts = string.Join(", ", alerts.Distinct());
+]]>
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.targets
new file mode 100644
index 0000000..05add92
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Packaging/package.targets
@@ -0,0 +1,80 @@
+
+
+
+
+
+ $(MSBuildProjectName)
+ false
+ git
+ $(RepositoryUrl)
+
+
+ true
+ false
+ snupkg
+
+
+ true
+ $(MSKit_PackageValidationBaselineVersion)
+
+
+
+
+ $(MSBuildProjectDirectory)/package.readme.md
+ $(MSBuildProjectDirectory)/README.md
+ readme.md
+ <_MSKit_PacksReadme Condition="'$(PackageReadmeFile)'!=''">True
+
+
+ $(MSBuildProjectDirectory)/$(PackageReadmeFile)
+
+
+
+
+ icon.png
+ <_MSKit_PacksIcon>True
+
+
+ $(PackageIconPath)
+ $(MSBuildProjectDirectory)/$(PackageIcon)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_MSKit_ResolvePackageUrlsDependsOn Condition="'$(SourceControlInformationFeatureSupported)'=='true'">InitializeSourceControlInformation
+
+
+
+ <_MSKit_RepoUrl>$(RepositoryUrl)
+ <_MSKit_RepoUrl Condition="'$(_MSKit_RepoUrl)'==''">$(PrivateRepositoryUrl)
+ <_MSKit_RepoUrl Condition="$(_MSKit_RepoUrl.EndsWith('.git'))">$(_MSKit_RepoUrl.Substring(0, $([MSBuild]::Subtract($(_MSKit_RepoUrl.Length), 4))))
+ $(_MSKit_RepoUrl)
+
+ <_MSKit_IsGitHubUrl Condition="$(PackageProjectUrl.StartsWith('https://github.com/'))">True
+ $(PackageProjectUrl)/releases/tag/$(MSKit_ReleaseTagRaw)
+ $(PackageProjectUrl)/releases
+
+
+
+
+
+
diff --git a/src/.msbuild/shared/common/init.common.final.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/init.last.targets
similarity index 53%
rename from src/.msbuild/shared/common/init.common.final.targets
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/init.last.targets
index 12e2242..2d938a6 100644
--- a/src/.msbuild/shared/common/init.common.final.targets
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/init.last.targets
@@ -1,7 +1,5 @@
-
-
-
\ No newline at end of file
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/private.assets.references.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/private.assets.references.targets
new file mode 100644
index 0000000..9226ef2
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.PrivateAssets/private.assets.references.targets
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/audit/audit.tests.project.xunit.v3.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/audit/audit.tests.project.xunit.v3.targets
new file mode 100644
index 0000000..febe8d5
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/audit/audit.tests.project.xunit.v3.targets
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/implicit.package.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/implicit.package.targets
new file mode 100644
index 0000000..29bd17d
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/implicit.package.targets
@@ -0,0 +1,26 @@
+
+
+
+ 4.0.1
+ $(MSKit_PackageVersion_XunitV3)
+ $(MSKit_PackageVersion_XunitV3)
+ 4.0.0
+
+
+
+
+
+
+
+
+
+
+
+ $(MSKit_PackageVersion_XunitV3)
+ $(MSKit_PackageVersion_XunitV3)
+ $(MSKit_PackageVersion_XunitV3Assert)
+ $(MSKit_PackageVersion_XunitV3ExtensibilityCore)
+ $(MSKit_PackageVersion_XunitRunnerVisualStudio)
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.last.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.last.targets
new file mode 100644
index 0000000..ea85fe1
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.last.targets
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.props
new file mode 100644
index 0000000..86ddd60
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.props
@@ -0,0 +1,12 @@
+
+
+
+ true
+ <_MSKit_TestingFramework_xunit_v3_CommonPropsPath>$(MSBuildThisFileDirectory)tests.project.xunit.v3.common.props
+ <_MSKit_TestingFramework_xunit_v3_LibCommonPropsPath>$(MSBuildThisFileDirectory)tests.lib.project.xunit.v3.common.props
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.targets
new file mode 100644
index 0000000..d12608e
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/init.targets
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.lib.project.xunit.v3.common.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.lib.project.xunit.v3.common.props
new file mode 100644
index 0000000..962eec1
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.lib.project.xunit.v3.common.props
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.common.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.common.props
new file mode 100644
index 0000000..7fa68e2
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.common.props
@@ -0,0 +1,8 @@
+
+
+
+
+ true
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.props
new file mode 100644
index 0000000..08b3e1f
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.props
@@ -0,0 +1,8 @@
+
+
+
+
+ true
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.targets
new file mode 100644
index 0000000..095e1fc
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing.XUnit.v3/tests.project.xunit.v3.routine.targets
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Exe
+ xunit.runner.json
+
+
+
+
+
+
+
+
+
+
+{
+ "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json"
+}
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.internalsVisibleTo.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.internalsVisibleTo.targets
new file mode 100644
index 0000000..8de8fe0
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.internalsVisibleTo.targets
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.lib.project.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.lib.project.targets
new file mode 100644
index 0000000..11cb07e
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.lib.project.targets
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.project.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.project.targets
new file mode 100644
index 0000000..8075de2
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/audit/audit.tests.project.targets
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_MSKit_CsprojText013>$([System.IO.File]::ReadAllText('$(MSBuildProjectFullPath)'))
+ <_MSKit_CsprojText013>$([System.Text.RegularExpressions.Regex]::Replace($(_MSKit_CsprojText013), '<!--[\s\S]*?-->', ''))
+ <_MSKit_HasDirectIsTestsProject>$([System.Text.RegularExpressions.Regex]::IsMatch($(_MSKit_CsprojText013), '<IsTestsProject\s*>'))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/implicit.package.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/implicit.package.targets
new file mode 100644
index 0000000..68fa036
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/implicit.package.targets
@@ -0,0 +1,42 @@
+
+
+
+
+ [7.2.2]
+ 4.3.0
+ 9.6.0
+ 6.2.0
+ 1.0.17
+ 18.10.1
+ 2.4.1
+ 18.11.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(MSKit_PackageVersion_FluentAssertions)
+ $(MSKit_PackageVersion_Shouldly)
+ $(MSKit_PackageVersion_AwesomeAssertions)
+ $(MSKit_PackageVersion_NSubstitute)
+ $(MSKit_PackageVersion_NSubstituteAnalyzersCSharp)
+ $(MSKit_PackageVersion_MicrosoftNetTestSdk)
+ $(MSKit_PackageVersion_MicrosoftTestingExtensionsTrxReport)
+ $(MSKit_PackageVersion_MicrosoftTestingExtensionsCodeCoverage)
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.last.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.last.targets
new file mode 100644
index 0000000..ea85fe1
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.last.targets
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.props
new file mode 100644
index 0000000..73ea576
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.props
@@ -0,0 +1,15 @@
+
+
+
+
+ $(MSBuildThisFileDirectory)tests.project.common.props
+ $(MSBuildThisFileDirectory)tests.lib.project.common.props
+ AwesomeAssertions
+ NSubstitute
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.targets
new file mode 100644
index 0000000..958c8f9
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/init.targets
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/test.project.internalsVisibleTo.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/test.project.internalsVisibleTo.targets
new file mode 100644
index 0000000..d651dd7
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/test.project.internalsVisibleTo.targets
@@ -0,0 +1,31 @@
+
+
+
+
+ $(MSKit_SlnFileDirectory)
+ $(MSKit_GitRoot)/
+
+
+ $(MSKit_TestsDir)/
+
+
+
+ <_AllCsprojsUnderTestsDir Include="$(MSKit_TestsDir)**/*.csproj" Exclude="$(MSKit_TestsDir)**/bin/**;$(MSKit_TestsDir)**/obj/**;$(MSKit_TestsDir)**/node_modules/**" />
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.lib.project.common.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.lib.project.common.props
new file mode 100644
index 0000000..9685d6b
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.lib.project.common.props
@@ -0,0 +1,21 @@
+
+
+
+
+ <_MSKit_TestingFrameworkAtLibCommonPropsImport>$(MSKit_TestingFramework)
+ <_MSKit_TestsLibProjectCommonPropsImported>True
+ True
+
+
+
+
+
+ $(_MSKit_TestingFramework_xunit_v3_LibCommonPropsPath)
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.common.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.common.props
new file mode 100644
index 0000000..72b358c
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.common.props
@@ -0,0 +1,22 @@
+
+
+
+
+ <_MSKit_TestingFrameworkAtCommonPropsImport>$(MSKit_TestingFramework)
+ <_MSKit_TestsProjectCommonPropsImported>True
+ True
+ True
+
+
+
+
+
+ $(_MSKit_TestingFramework_xunit_v3_CommonPropsPath)
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.lib.global.usings.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.lib.global.usings.targets
new file mode 100644
index 0000000..3c3053d
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.lib.global.usings.targets
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.mtp.routine.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.mtp.routine.targets
new file mode 100644
index 0000000..253fb90
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.mtp.routine.targets
@@ -0,0 +1,25 @@
+
+
+
+ testconfig.json
+
+
+
+
+
+
+
+
+
+
+{
+ "diagnosticMessages": false
+}
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.props
new file mode 100644
index 0000000..fce3b86
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.props
@@ -0,0 +1,44 @@
+
+
+
+
+
+ \.(Tests(\.Integration|\.Unit)?|IntegrationTests|UnitTests)$
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_TestsProjectNameRegex)))
+ True
+
+
+ \.(TestsSuite|TestsFixtures|Fixtures)$
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectName), $(MSKit_TestsLibProjectNameRegex)))
+ True
+
+ <_MSKit_TestsProjectNameRegex_Shared>$(MSKit_TestsProjectNameRegex)
+ <_MSKit_TestsLibProjectNameRegex_Shared>$(MSKit_TestsLibProjectNameRegex)
+
+
+
+
+
+
+
+
+
+ Exe
+ True
+
+ --ignore-exit-code 8
+
+
+
+ <_MSKit_TestsProjectPropsImported>True
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.targets
new file mode 100644
index 0000000..1bd4bba
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Testing/tests.project.targets
@@ -0,0 +1,35 @@
+
+
+
+
+ False
+ Library
+
+
+
+ False
+ False
+
+
+
+ True
+
+ True
+
+
+
+ True
+
+
+
+ True
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants/init.props
new file mode 100644
index 0000000..0f2d9a1
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants/init.props
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/.msbuild/shared/common/tfm.constants.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants/tfm.constants.props
similarity index 93%
rename from src/.msbuild/shared/common/tfm.constants.props
rename to src/.toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants/tfm.constants.props
index 296c68e..fca8585 100644
--- a/src/.msbuild/shared/common/tfm.constants.props
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.TfmConstants/tfm.constants.props
@@ -36,9 +36,9 @@
9
10
11
- 12
- 13
- 14
+ 12
+ 13
+ 14
-
\ No newline at end of file
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/ci.github.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/ci.github.props
new file mode 100644
index 0000000..30decc3
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/ci.github.props
@@ -0,0 +1,27 @@
+
+
+
+
+ True
+ False
+
+ $(GITHUB_RUN_ID)
+
+ $(GITHUB_RUN_NUMBER)
+ $(GITHUB_SHA)
+
+ True
+ $(GITHUB_REF_NAME)
+ $([System.Text.RegularExpressions.Regex]::Replace('$(MSKit_ReleaseTagRaw)', '^[vV]', ''))
+
+ $([System.Text.RegularExpressions.Regex]::Match('$(GITHUB_REF)', 'refs/pull/(\d+)/').Groups[1].Value)
+ $([System.Text.RegularExpressions.Regex]::Match('$(GITHUB_REF_NAME)', '^\d+').Value)
+
+ $(GITHUB_SERVER_URL)/$(GITHUB_REPOSITORY)
+ https://github.com/$(GITHUB_REPOSITORY)
+
+ GitHub
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/init.props
new file mode 100644
index 0000000..48bdbb4
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit.Vcs.GitHub/init.props
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.implicit.packages.duplicates.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.implicit.packages.duplicates.targets
new file mode 100644
index 0000000..b03a750
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.implicit.packages.duplicates.targets
@@ -0,0 +1,34 @@
+
+
+
+
+
+ False
+
+
+
+
+ <_MSKit_ConsumerIdentities Include="%(PackageVersion.Identity)"
+ Condition="'%(PackageVersion.ControlledBy)'==''" />
+
+
+ <_MSKit_ConsumerIdsStr>;@(_MSKit_ConsumerIdentities, ';');
+
+
+ <_MSKit_DuplicateReport Include="@(PackageVersion)"
+ Condition="'%(PackageVersion.ControlledBy)'!=''
+ AND $(_MSKit_ConsumerIdsStr.Contains(';%(PackageVersion.Identity);'))" />
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.prerelease.packages.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.prerelease.packages.targets
new file mode 100644
index 0000000..534e94f
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.prerelease.packages.targets
@@ -0,0 +1,29 @@
+
+
+
+
+
+ true
+
+
+
+
+ <_MSKit_PackagesWithVersion Include="@(PackageReference)" Condition="'%(PackageReference.Version)' != ''" />
+ <_MSKit_PackagesWithVersion Include="@(PackageVersion)" Condition="'%(PackageVersion.Version)' != ''" />
+ <_MSKit_PrereleaseReferences Include="@(_MSKit_PackagesWithVersion)"
+ Condition="$([System.String]::Copy('%(_MSKit_PackagesWithVersion.Identity)').StartsWith('$(MSKit_PrereleasePackagePrefix)')) AND $([System.String]::Copy('%(_MSKit_PackagesWithVersion.Version)').Contains('-'))" />
+
+
+ <_MSKit_PrereleaseText>Prerelease $(MSKit_PrereleasePackagePrefix)* packages referenced on stable branch '$(MSKit_Branch)':%0A@(_MSKit_PrereleaseReferences->' %(Identity) %(Version)', '%0A')%0AFix: replace them with stable versions in Directory.Packages.props or the csproj.
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.packages.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.packages.targets
new file mode 100644
index 0000000..4fba85c
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.packages.targets
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.reference.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.reference.targets
new file mode 100644
index 0000000..6e84fa3
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.restrict.reference.targets
@@ -0,0 +1,35 @@
+
+
+
+
+
+ False
+ $(MSKit_RestrictReferences)
+ $(MSKit_RestrictReferences)
+
+
+
+
+
+
+
+
+
+
+
+ <_MSKit_PackageReferenceNotAllowListed Include="@(PackageReference)"
+ Condition=" '%(PackageReference.Allowed)'!='True' AND '@(PackageReference)'!='' AND '%(Identity)'!=''" />
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.shared.properties.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.shared.properties.targets
new file mode 100644
index 0000000..eeda662
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.shared.properties.targets
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+ <_MSKit_GuardXmlPeek Condition="'$(MSKit_GuardXmlPeekAudit)'!='False'">True
+ <_MSKit_SPC_CsprojText Condition="'$(_MSKit_GuardXmlPeek)'=='True'">$([System.IO.File]::ReadAllText('$(MSBuildProjectFullPath)'))
+ <_MSKit_HasTargetFramework Condition="'$(_MSKit_GuardXmlPeek)'!='True'">True
+ <_MSKit_HasTargetFramework Condition="'$(_MSKit_GuardXmlPeek)'=='True' AND ($(_MSKit_SPC_CsprojText.Contains('<TargetFramework>')) OR $(_MSKit_SPC_CsprojText.Contains('<TargetFramework ')))">True
+ <_MSKit_HasTargetFrameworks Condition="'$(_MSKit_GuardXmlPeek)'!='True'">True
+ <_MSKit_HasTargetFrameworks Condition="'$(_MSKit_GuardXmlPeek)'=='True' AND ($(_MSKit_SPC_CsprojText.Contains('<TargetFrameworks>')) OR $(_MSKit_SPC_CsprojText.Contains('<TargetFrameworks ')))">True
+
+
+
+
+
+
+
+
+
+ <_MSKit_TF_ProjNodeCount>@(_MSKit_TF_NodeCheckXmlResult->Count())
+ <_MSKit_TFs_ProjNodeCount>@(_MSKit_TFs_NodeCheckXmlResult->Count())
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.version.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.version.targets
new file mode 100644
index 0000000..aaea8ee
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/audit/audit.version.targets
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+ <_MSKit_GuardXmlPeek Condition="'$(MSKit_GuardXmlPeekAudit)'!='False'">True
+ <_MSKit_RMV_CsprojText Condition="'$(_MSKit_GuardXmlPeek)'=='True'">$([System.IO.File]::ReadAllText('$(MSBuildProjectFullPath)'))
+ <_MSKit_HasVersion Condition="'$(_MSKit_GuardXmlPeek)'!='True'">True
+ <_MSKit_HasVersion Condition="'$(_MSKit_GuardXmlPeek)'=='True' AND ($(_MSKit_RMV_CsprojText.Contains('<Version>')) OR $(_MSKit_RMV_CsprojText.Contains('<Version ')))">True
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_MSKit_ValidPlaceholders>prefix;buildNumber;pipelineId;branchSlug;branchTicket;branchAspectSuffix;buildDateUtcDash;buildDateUtcDot;versionTag;releaseTag;prNumber;commitShaShort
+ <_MSKit_PlaceholderHelp>
+Valid placeholders:
+ {prefix} - $(VersionPrefix), declared in Directory.Version.props
+ {buildNumber} - CI run number (GITHUB_RUN_NUMBER); DateBased caps it at 65535
+ {pipelineId} - CI run id (GITHUB_RUN_ID)
+ {releaseTag} - the release tag with a leading v removed (tag builds only)
+ {prNumber} - the pull request number (pull request builds only)
+ {branchSlug} - the branch name with every character outside [0-9A-Za-z-] replaced by '-'
+ {branchTicket} - the first [A-Za-z]+-[0-9]+ match in {branchSlug}, else {branchSlug}
+ {branchAspectSuffix} - the part of {branchSlug} from its first '--' to the end, else empty
+ {buildDateUtcDash} - UTC build time as yyyyMMdd-HHmmss
+ {buildDateUtcDot} - UTC build time as yyyy.M.d
+ {versionTag} - $(VersionTag)
+ {commitShaShort} - the first 8 characters of the commit SHA
+
+ <_MSKit_AllTemplates>$(MSKit_VersionTemplate)|$(MSKit_StableVersionTemplate)|$(MSKit_ReleaseVersionTemplate)|$(MSKit_PullRequestVersionTemplate)
+ <_MSKit_TplHasTokens>false
+ <_MSKit_TplHasTokens Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(_MSKit_AllTemplates)', '\{[A-Za-z][A-Za-z0-9]*\}'))">true
+ <_MSKit_TplNames Condition="'$(_MSKit_TplHasTokens)'=='true'">$([System.Text.RegularExpressions.Regex]::Replace('$(_MSKit_AllTemplates)', '[^{}]*\{([A-Za-z][A-Za-z0-9]*)\}[^{}]*', '$1;').TrimEnd(';'))
+
+
+
+ <_MSKit_ValidPlaceholder Include="$(_MSKit_ValidPlaceholders.Split(';'))" />
+ <_MSKit_TplNameItem Include="$(_MSKit_TplNames.Split(';'))" Condition="'$(_MSKit_TplNames)'!=''" />
+ <_MSKit_UnknownPlaceholder Include="@(_MSKit_TplNameItem)" Exclude="@(_MSKit_ValidPlaceholder)" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_MSKit_ReleaseTagCore>$([System.Text.RegularExpressions.Regex]::Match('$(MSKit_ReleaseTag)', '^\d+\.\d+\.\d+').Value)
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.props
new file mode 100644
index 0000000..5787c55
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.props
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.targets
new file mode 100644
index 0000000..d4f4b5e
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.last.targets
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.props
new file mode 100644
index 0000000..ef44584
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.props
@@ -0,0 +1,17 @@
+
+
+
+ enable
+ enable
+ latest
+ True
+ False
+ True
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.targets
new file mode 100644
index 0000000..8f6c1b4
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/init.targets
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/product.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/product.props
new file mode 100644
index 0000000..85cd674
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/product.props
@@ -0,0 +1,13 @@
+
+
+
+ $(MSBuildProjectName)
+ $([System.DateTime]::UtcNow.Year)
+ $(ManufacturerName)
+ $(FullManufacturerName)
+
+ Copyright (c) $(Year) $(FullManufacturerName)
+ $(ManufacturerName)
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.metadata.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.metadata.targets
new file mode 100644
index 0000000..9b34627
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.metadata.targets
@@ -0,0 +1,31 @@
+
+
+
+
+
+ all
+ all
+
+
+ all
+ all
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.usings.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.usings.targets
new file mode 100644
index 0000000..8e42751
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/project.global.usings.targets
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/twae.shared.init.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/twae.shared.init.props
new file mode 100644
index 0000000..ffddb18
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/twae.shared.init.props
@@ -0,0 +1,8 @@
+
+
+
+
+ $(TreatWarningsAsErrors)
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.props b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.props
new file mode 100644
index 0000000..6e356cf
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.props
@@ -0,0 +1,145 @@
+
+
+
+
+
+ $(VersionPrefix)
+
+ SemVer
+ DevEnv
+
+ 0
+ 0
+
+ ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$
+ false
+ true
+
+
+
+
+ $([System.Environment]::GetEnvironmentVariable('MSKit_BuildDateTimeUtc'))
+
+
+ <_MSKit_Ph_buildDateUtcDash>$([System.DateTime]::Parse('$(MSKit_BuildDateTimeUtc)').ToUniversalTime().ToString(yyyyMMdd-HHmmss))
+ <_MSKit_Ph_buildDateUtcDot>$([System.DateTime]::Parse('$(MSKit_BuildDateTimeUtc)').ToUniversalTime().ToString(yyyy.M.d))
+
+
+ <_MSKit_Ph_buildDateUtcDash>$([System.DateTime]::UtcNow.ToString(yyyyMMdd-HHmmss))
+ <_MSKit_Ph_buildDateUtcDot>$([System.DateTime]::UtcNow.ToString(yyyy.M.d))
+
+
+
+
+
+ 0.0.0
+ {releaseTag}
+ {prefix}-pr.{prNumber}.{buildNumber}
+ {prefix}-ci.{buildNumber}
+ {prefix}-ci.{buildNumber}
+
+
+
+
+ 1.0.0
+ {prefix}-{buildDateUtcDash}-{branchTicket}{branchAspectSuffix}
+ {prefix}
+
+
+
+
+ 1.0.0
+ {prefix}.{buildNumber}-{buildDateUtcDash}-{branchTicket}{branchAspectSuffix}
+ {prefix}.{buildNumber}
+
+
+
+
+ $(_MSKit_Ph_buildDateUtcDot)
+ $([MSBuild]::Modulo($(MSKit_CIPipelineId), 65535))
+ 1
+ {buildDateUtcDot}.{buildNumber}-{branchTicket}{branchAspectSuffix}
+ {buildDateUtcDot}.{buildNumber}
+
+
+
+
+ {versionTag}
+ {versionTag}
+
+
+
+
+ 9999.0.0
+
+
+ 9999.0.0
+ 9999.0.0
+
+
+
+
+
+
+
+
+
+
+
+ <_MSKit_Ph_prefix>$(VersionPrefix)
+ <_MSKit_Ph_versionTag>$(VersionTag)
+ <_MSKit_Ph_releaseTag Condition="'$(MSKit_IsReleaseTagValid)'=='true'">$(MSKit_ReleaseTag)
+
+ <_MSKit_Ph_releaseTag Condition="'$(MSKit_IsReleaseTagValid)'!='true'">0.0.0-invalid-release-tag
+ <_MSKit_Ph_prNumber>$(MSKit_PullRequestNumber)
+ <_MSKit_Ph_buildNumber>$(MSKit_BuildNumber)
+ <_MSKit_Ph_pipelineId>$(MSKit_CIPipelineId)
+ <_MSKit_Ph_branchSlug>$([System.Text.RegularExpressions.Regex]::Replace('$(MSKit_Branch)', '[^0-9A-Za-z-]', '-'))
+
+ <_MSKit_BranchTicketMatch>$([System.Text.RegularExpressions.Regex]::Match($(_MSKit_Ph_branchSlug), '[A-Za-z]+-\d+').Value)
+ <_MSKit_Ph_branchTicket Condition="'$(_MSKit_BranchTicketMatch)'!=''">$(_MSKit_BranchTicketMatch)
+ <_MSKit_Ph_branchTicket Condition="'$(_MSKit_BranchTicketMatch)'==''">$(_MSKit_Ph_branchSlug)
+
+ <_MSKit_BranchAspectIdx>$(_MSKit_Ph_branchSlug.IndexOf('--'))
+ <_MSKit_Ph_branchAspectSuffix Condition="'$(_MSKit_BranchAspectIdx)'!='-1'">$(_MSKit_Ph_branchSlug.Substring($(_MSKit_BranchAspectIdx)))
+
+ <_MSKit_Ph_commitShaShort Condition="$(MSKit_CommitSha.Length) >= 8">$(MSKit_CommitSha.Substring(0, 8))
+
+
+
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_IsStableBranch)'=='true'">$(MSKit_StableVersionTemplate)
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_IsStableBranch)'!='true'">$(MSKit_VersionTemplate)
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_PullRequestNumber)'!='' AND '$(MSKit_PullRequestVersionTemplate)'!=''">$(MSKit_PullRequestVersionTemplate)
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_IsReleaseTag)'=='True' AND '$(MSKit_ReleaseVersionTemplate)'!=''">$(MSKit_ReleaseVersionTemplate)
+
+ <_MSKit_Rendered>$(_MSKit_EffectiveTemplate)
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{prefix}', '$(_MSKit_Ph_prefix)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{buildNumber}', '$(_MSKit_Ph_buildNumber)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{pipelineId}', '$(_MSKit_Ph_pipelineId)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{branchSlug}', '$(_MSKit_Ph_branchSlug)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{branchTicket}', '$(_MSKit_Ph_branchTicket)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{branchAspectSuffix}', '$(_MSKit_Ph_branchAspectSuffix)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{buildDateUtcDash}', '$(_MSKit_Ph_buildDateUtcDash)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{buildDateUtcDot}', '$(_MSKit_Ph_buildDateUtcDot)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{versionTag}', '$(_MSKit_Ph_versionTag)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{releaseTag}', '$(_MSKit_Ph_releaseTag)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{prNumber}', '$(_MSKit_Ph_prNumber)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{commitShaShort}', '$(_MSKit_Ph_commitShaShort)'))
+
+ <_MSKit_RenderHasUnknown>false
+ <_MSKit_RenderHasUnknown Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(_MSKit_Rendered)', '\{[A-Za-z][A-Za-z0-9]*\}'))">true
+
+ $(_MSKit_Rendered)
+
+ unknown placeholder: $(_MSKit_Rendered)
+
+
+
diff --git a/src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.targets b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.targets
new file mode 100644
index 0000000..8b72fe8
--- /dev/null
+++ b/src/.toolkit/msbuild/DragoAnt.MSBuildKit/version.targets
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ <_MSKit_Ph_prefix>$(VersionPrefix)
+
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_IsStableBranch)'=='true'">$(MSKit_StableVersionTemplate)
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_IsStableBranch)'!='true'">$(MSKit_VersionTemplate)
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_PullRequestNumber)'!='' AND '$(MSKit_PullRequestVersionTemplate)'!=''">$(MSKit_PullRequestVersionTemplate)
+ <_MSKit_EffectiveTemplate Condition="'$(MSKit_IsReleaseTag)'=='True' AND '$(MSKit_ReleaseVersionTemplate)'!=''">$(MSKit_ReleaseVersionTemplate)
+
+ <_MSKit_Rendered>$(_MSKit_EffectiveTemplate)
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{prefix}', '$(_MSKit_Ph_prefix)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{buildNumber}', '$(_MSKit_Ph_buildNumber)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{pipelineId}', '$(_MSKit_Ph_pipelineId)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{branchSlug}', '$(_MSKit_Ph_branchSlug)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{branchTicket}', '$(_MSKit_Ph_branchTicket)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{branchAspectSuffix}', '$(_MSKit_Ph_branchAspectSuffix)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{buildDateUtcDash}', '$(_MSKit_Ph_buildDateUtcDash)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{buildDateUtcDot}', '$(_MSKit_Ph_buildDateUtcDot)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{versionTag}', '$(_MSKit_Ph_versionTag)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{releaseTag}', '$(_MSKit_Ph_releaseTag)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{prNumber}', '$(_MSKit_Ph_prNumber)'))
+ <_MSKit_Rendered>$(_MSKit_Rendered.Replace('{commitShaShort}', '$(_MSKit_Ph_commitShaShort)'))
+
+ $(_MSKit_Rendered)
+ $(_MSKit_Rendered)
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/init.company.props b/src/.toolkit/msbuild/init.company.props
new file mode 100644
index 0000000..587098c
--- /dev/null
+++ b/src/.toolkit/msbuild/init.company.props
@@ -0,0 +1,35 @@
+
+
+
+
+ DragoAnt
+ DragoAnt
+
+ MIT
+ $(MSBuildThisFileDirectory)../res/package.icon.png
+ DragoAnt.
+
+ ^(main|release/.+)$
+ ReleaseTag
+
+
+ True
+
+ True
+
+ CS1591;xUnit1051;$(NoWarn)
+
+ $(WarningsNotAsErrors);NU1901;NU1902;NU1903;NU1904
+
+ xunit.v3
+ AwesomeAssertions
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/init.company.targets b/src/.toolkit/msbuild/init.company.targets
new file mode 100644
index 0000000..45bff74
--- /dev/null
+++ b/src/.toolkit/msbuild/init.company.targets
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/init.props b/src/.toolkit/msbuild/init.props
new file mode 100644
index 0000000..580345c
--- /dev/null
+++ b/src/.toolkit/msbuild/init.props
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/msbuild/init.targets b/src/.toolkit/msbuild/init.targets
new file mode 100644
index 0000000..0385214
--- /dev/null
+++ b/src/.toolkit/msbuild/init.targets
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/.toolkit/res/package.icon.png b/src/.toolkit/res/package.icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e890a2973d5ebd15b6604fcb3f48cba42a2d0c15
GIT binary patch
literal 10282
zcmW-nbyU>N+s41Uz|ydUbT@*8bT27OOZk9wF5O78NJw`qAuXkXl!U|*qI84gQi4cJ
ziPX#Q{bOd%oHKRqGjq;;&Gm`X(|JZrKt})o05M!$MgO5i{;%Lc9_l`M>*0q6;Qnf8?K^g7+`Vm7QZ#=
z=i)bWjMR<{244AeyfNM(FSA6&9s#xI;V@9i6)}o|+Gq3XKUF0oV=bl3s*X*~9a(C^
z-LVDqCerbQuyt*D(bR9l^dD@Zthx$od8LU1X|0*Fn)&RoB
zJg#~8-LM!D*RS-|Llh@r1zJg@a?G&m2qq4BUW^!&v}bv}b1YASB+}r8AkD54azmo)
zy0@++-wC|K16tkN;*GTK*f>YJ8@Gj}{!pcjUwCrQX}onqF%4D-;{=kZuD{A#scYuB_rcPb$wS}7f^{%W7_ywd>`
z);ID|-R^y%Qz`)wtT#!*%|%YG8mr!wnDFm;?~8$0hN<%DU#vjTKV>Dopkkc_b
z2kp=<@68&=Zf$@xw|tTbE^OR%BVPQmdJhIxRY>A
zN~WI&ATxl-r%k@O1QjkRT@JI0N!#BCF{535+#|J^VSRqzod%FKUIApCw87
z(Tj>nV8X^#?^){xv%lyqzru@{VgL$My4HsH+f@0QoaYxpPWw_yiGiLu^X^>BO9s(k
zQby{79|7_YXgZd0>O_kA6#vsaz=FP1#QDT6Tp_{L6&@J8~JYjd?Rq;Zr
zUk(DvcuhhG^<)6`jom)O#=C*2Q}LUyR&3143|}>CEIX=e?1BNPEd`6+pqu++qk%Je
z$=>}R;r$F+>Xg8brqCnS6I!5e;NzE36n=(wQswVqKT*)5OX?{ypdd;E7mrl-29^8e
zSW}o#z1tZp|8LS31@iBo{8@6F?BL=W6*5G0;yz!wCcxuVT6M}-mmr0fBEklXQT!!B
z;E49mr0nEz{}!c$S+hN5gHDM7G=j+%+b-U@*NFW97&`Gyr$EB6mRW;Naul?t=MTF(ef;7sf{*~)WrvgoJ~#R8ttU(+Pe39$Mh
zubD&oWzWxiwy&sVP;&?EsM@-7vAVNEk44|#?xrnAHZ}8An@56HHvn$NM6s7<_bBNj
zYyxaH!gMVUB0B4Mv+xAuIMdNjrD_s@gQ$Z2=ewg?maJauGH&&@fZGbo+x6w1O~-zR
zj5Dc_KOb&VYTlS=TOwR)TcsV-_Z+&UD+B*dnmP=R-C8?=IYY2-;vQi>N~9=UC8{uP
zLG^8uZQ#`qK)+e&Zcb(>&)7{SA3p7vU(|9S{!OPSC+_~>2XEsZ`Z)+DR7nEo95LXM
zDgx=HvJEhx^{$t<@FoEHvC0x0?Z|A6!N7R2cRWC={2;@=bacThZf)vEp%>i)92^!x
zGMCKfy7F3%8%Dpan?_me$-mt;gceonRp%ie^Wu5KsmT|6BPD{lX~q((+wHjQ+g-ic0E2Mbo;f$;u8vhent=bR9x9W&44<=%(?
zQ>8hm7&6iiU+!4Rg{P9Cw?=bBO;&c@rU~2im$$~F0=SyadFCT
zhpX32&mWGl*a!s)A`J9M_7ANj!guV}id9u_5)+Oqiy
z=94&S;*mS{%Jf;V3KalnOQvwd@g4K|o5&SVZ7VUUbKz6Ytw8~xb^7=@y3D@TRD|Zt
zk0dS-ay&-kt2oC&T-9*cXg=>R&4wlQ$^B(^GVchnhdp`S`0Uq0i3{ne&2_E52GgGl
z$wtINi#N&kGmv^)?&gV+kWsbRt4aMDFzkKMSB+J!vDFWO2`cTW(x~K_B`t#JR>*U#
z1zE%H)szv7ofp^N&kuagWDl2`>|bW=hSwfD(u01LHUG}V(d@b?B7{y*o_7B=4STb{
zqe+_i7+@)^aNGMVGYpSa8_szu#{ef)t2#D5NY4X}Xk2N`MomT>M&_2B##$)PG9gH6
zBc~;H`*cT2C>(F{0E3A}4BFR);34Gl13SVk7@uxh$&e2VXM0T6l)2LRWNA=m+6<7_
z3bl-{X8M3pOoI}>+R_dm>q2?a+cj%<(Vrdr`Lkgnud`o2mOn$JA5U|QX(o`^j)2f&
z?<52@nc(Ln4DxDIjn8zR*C%LwmBDu!5brx{rf<>M(cPpH%+)YrlK85z90Z>y)nXJ1
zu$$e~i38yhMDbL4@wyG(ldYz{tJlA8qy9I~KpW
zu6E61I&F1>TFX`GInp?EGqT-A{Uow4cBsI9I3i30>IkIOB)TVRT0i6;X2c{zD9Z)>
zE7~&5_JaAu2?Rs?)cb=BtRj?Aq<|%A
zpu90V6*B&zjUX=XGpB&m>$E2p`!q8|fZ^dApZE-ojmnqfVHGCtFB;X_jGPA+DyPgVW2OSo)G8c!59T|7zlXa@}>NAczrhlS@pzqKH913~YOFbktE
z`v$&;SUm=crhBxs{}2HM2`gVo!v8GTJik(ZBe0BQ69Z{6NQH5v;H%C)6EViymc2Uj
z>79_nO^Fs0KqWVQxq_N~tHjsI;}zLPC9eeKP9EuyL#zA#?Y@4;QVxyp7FHs&z?v
zR#Zo=J9nb>HiHxZVlYcJpL^`?1?pmUsF}?=Z~Jyhq3$VhUdI|~(LTNpd##AmKkhpl
zo$^gWmEToU{^E{z0EiDK7(F^aw*ycOAVvLg)U9%JdXiSS)SU90Jq)WS0TFuyva~P
znFG;qjKR9%2@=cif~O~h3nd2va_CQI{iP-HKc(R302Je3^YH0|?H*@cbyCGXEsXQV
z-v;%8_G~5-fouPHro8ODJ(|1a7sqHH_>fY?Z6LzhHgKn}X6N6b%C*@qXxLc`6M_wX
zQs~)Tf+GK#6RPC7+VsVn`W1>72slI4@oocPjesUCek&l
z4n#8bVwbD&$Loden~^Xz9Q0ZX295#N)~iwLqhM^uVbN|@xpMtMEcDD4igf*~o>gW0
zy^p!K0=Mw4-A>S1;BZKbdj@iC>nI#0m|aKi6vbNecHhSqo|qt%bxRbJQn+?Ww(r=@
z4;0&ZEcT13M~geJN`E*L%s5{t{kf6InZvos#1OgIeG#MIu(C|5;4a>MZ*Av&O&azR
zmP?nEzpQJz(6F86b}|9}d|{gyilOrl1khbHQ*Q{qiI8j`OL5y>cPW?hK7R3@tf~CB
z+GD@JM7IzU>har=@WfnM+s_CdH4fi4$@f&sTto=bsainOmn8I
z^V(=-rhow0S}us!MB98GmA6F;z+_3!E@X}fm0J$FGOvdIKIA4Rk;*NBB}U5&T{u0*
zE*|_(k{HKDgDfC~>XHJfWp7N1r}4g}e%!7Ie`;yy?d`ys9mVx)^)xBreRhhvib|i0
zDGzZl1SrqM$?cijF_4W|$Zt71#X_ROH)e8c35D7mzPZbdG7p$7uWaH@zsIl)E~hb1
zFd$DE#FUXpIo$C3Y1CchYPKy_1lL?Y4M;@iceT%bR+7;4P|QLhfIQ}VS=gK2`0RWs
z@x@>z1)g_UI1B6Z@+D$GU0Mp;|GsoKUk;0vL6c5BzsZ$dr?`^>G3PJxBd!MJcWB=jG^k
z*~yifqYFc&)4@Ms3Oe~zm*Y}IA26S`i<*%TH
zqSz2cmT)c_xQOPRjg2#?(O=<2A;HnrjfOy#7~sl``+7n+<54%#lEC+)zlVLbt^dkL
zzsH6;C)M%%2~|m5>K1uiG4V_Pyo{YYX!VAO=J50TJUXh;%rB`|f2X6#*(yHo5aan8
z8CLla>-okp6oG=yxqs*F?KDDlWa81pC3~u-hcO#N2!sgcgvl)&uSkVvw28lAC7`;B9ZzIF9
zXufc)Ur(#CKTMh*zheAykr@kyGb@}Zg9ym`JWwd+IS;BQ5t%Bbj}78|*iec9dA%I>!oS+KK6DMYIN18_Dsw
zGOz$>yEV2cFo@nVtTKC29tU@t8Zhp)Hr<(bU*7ikfbZyjQg@tG5hBW6J}OiO2Gs4p
z>3nI^m$ANJA~6HNll$!vZY_26ygkPRS?{mJOkimrCD7PKnD&3IjKJQ?8Vo6UHB
zu5dDsApBC+ZF)D31pA?7?rWBboA?ZR{savHkQ-X|OY@I1PH0rVCMLtRmemG8^6&4C
zv=QF^E`nDU-SwFiq%T8#&*(Q)?Y&b9Ds$I
zTm(Rx?a#C)E!hG6OF+b&Q$c(8JzoM#YR@9p)_;&Iz4N>ryZchs0a9CGe2%21gl9QL
zWN|D~Q1n+Fn}OcILj-;gtG;!?d6A3PAjvOrcKe&kFzS!uu4i91ZYl8BFhZ|JPHqId
zG{_@P0ta7UqG!Y&2?JJtD4Oa2x>06mWgl9;_?g-hA-nM^`{fc)jPG+=7aR?;5LfFB
zK=hW=hJ7q|Gr#$mR0MtEXh(2@%E%zEQ_t6Oo~iYC5X+A@8KS*R
zuEuwv6kf`Q^WdX|yjolYkZ958Y3b8r
zjf&^}PK|bELYCiH7f(^+9*gZR-MNx(75p$>^KE$$@lL7mz6%xrh@F?|-hP#+)fP@H
zjM6K88w;S5PJ}AMZmL;y#Wezs>ypSP0ERvSCUb=xYydYU?ze5K1qi5a{h8cQ`gl@u
z+4kpe;&eZDCG1WV``j&2ME#Z{CscZGP--JMkhp*csDj$
z6w;nnWzIx}%MB;^tM~fD&^ldOxylM2L?Y~tGh8YD{+kYpZF8fI#dPNQx!!%yh|H00
z5{x4rdP41`b8Oc=!X;ab2fqS-H5Gwf-!Z>vt8SR%dA~LcQSm?3B
z`k|A64Getm=p4DdqdanZm38`_2b!?RMq&@s8Q=o}=uI);zwXM<&?Sv+e$84ix%1H0
zHZPkh2Mt3~i#)-lzX64uY<_Uy_XemJ6;+p+fNM
zEHxlcay>ZAvD^9|HI1OTmO32~hkw|oAZ=dG##02Vg=Wr^B1~KJ(R=-rYU@bNRTBWu
znq(0V`1B*HnL>YNC|d%KfS{XNBCaW
zYm_qHkPT__j%@jD#nfeNrjw0o(|lp%_TJIlAjwah1kBni@3)sf7rY!6o*^AMsY!hT
z=ALhI4=T~3lutC2C9=Hj>5>^9b>e3zq)!<7P|M$`xE$hQ8&X#;c~wx}wLXN(dV
z2xw|p&OP|A;GG#0N#^+7KA|FC#voxnil`EQ!ta$<@_b+*O5=i*o;P2dgJYd`&p1{Dm^{F`sIXCrUoz-w$+~r{Wt>=@aD3ymZA>j^R1(&L&
zW);-?D{L?=hj-fL3+7-j|AapbNarN3brv{)sL#b2YRa
zkF+IlgzGM5_m4hAVQ_=2SAT?eoh=JCG&{nZ7wz&?UXa$^Km|ZfikeI;{BF8e7a1d=
zh#7r`g&;v!gIHWmi$Kb9A0aWCNbHy%8e-x|vM|tE*ZEjOP89~G)%#3eNJ%Is5X`UM
zOg@q=trp>eWx+>9Nd{O+2j4C%eJTlxQ^oK8WG-a>7WT69>AGmz0Nr|zx)?yHoiPoh
z{u8i&Z0N5&+D>-q$$s5BQyL2Z5w6!VdfGP8*_=aZ2oT3W^<9R>bfF=J7i(A39RuUM
zp<;m7czu?Nivgn4@Gd;+D`G)w;{S1-p5G~RFn>%g5|3QWz+Zox(Up|N3??-wVWnVI?GX#jVXUhFSAzsfI)wo(M}>bVVlPO9+%
zWTJN1W#q0tW7D@Pl`@EFsj(d9x9yk_bFVhdYqFh2_q1OT$H{()MNjUAMhaTK%j*3U
z?hcG#M)53Rj?*91Ha#ySyim7%)oD<@PEJ9j{G;^lZ!RJHLO_iV
zVK(+hAPKNy+eyQIZC&DwGs5VQ-Vtf>qA?5KQGjDNJ=^fO^U=FnD@SN2n=S}eB^ELg
z>~P)HR|*onrv8o%d!|z;CfF1x1y|yI7q=55tR=);QsnSk6`=q;yTWZ+jjvBefl?#dsnkb@hkTFzZxw
zU`HfhM&0u6E47x*Q1SN1rR!1JOGOzy=80fu`jtiEmx8c#
zQzM7)*1N$o2EcGjuLMB$yywL$$7w3RQXg%HH^fgu$0KSglm^D^I4ZyAQ?wzx)u)?;
zRD*X~74l#dG6YOGT$oNNyUcwx8<|AOE?Ms1(vD%6JZzJ%24%?#FM6AK#mQI~Ryq(-
zs~$ubE=q^yM+*+6(Y}R}F<_{6orRN@2PjppsQgXfJu}wIC!8m1A~-ep0Z=xqN=u-3
zcWu_YCUnI!))8H;JjL??VI4!scNOA)QF>G;7hPj!ri0Vh=5g>(8+^eF#@267oX@t1
z4Q7xFU2Qs=>ML3XOX}c~9ItOVy=AS2GURaN9n!L#XP1;^oc;46{lo2h|3CMH0vbR7
z=nX#=o=7^Y!!()S-Se>>zl%C=%!9-Wmf{q~S`eaTjln&xezmC#vLW$eXckZ3{PdM`^JcGN*
zP6tkq$aFC!YGTa8MaA10r6nR4dqagL1%Nz?;|O5;{#=4IhRW)IX^OsDu=sPHM0zg*
zrJAGn7NV_^$I~z&RPFzg&vVgZT3f9jJ+&+f>{ydjnK`@Az)D1Zd@NhU2aha$$#77ymzKi;
z(h2c?;lhRhK&M!QyEqRRa7j~ttAeW7``ZT(6LOdK#`}sA)q?7)`rswb?@WEtN)U!}
zVd+hJmf%j|ABmwJHLm~A-Xe#U^_cJ_tQ{MC{^us2|D#QJnLnuMI;_uct=Aq#009>JN*7KX%MOXy7Ucr4)
zKv;}|9$~heutg;2EyQ%LtC=lOi|1=mj*WHH+EThlC0G-uK65Mu#S_i#mw6LloTpTf
zxJh>gfi&KWPue9=;rWTBX2{|KQFcUh!gDD$97U?7?+$CNp57i17&N*o*I(v6p8EtX
zhJ|dKF*Gq;g(S!w1pf+sNM|)VUS-|rzsgDZ!31IFq8g~Xb4rME4Zw^Is=eM5cXbF`
zY*01^)f3P|JATH9Ad`tPm2?`G)xPclb3f`TZ76al0qQ?G3(FcK)=%7BCd|G9><@fybC
z1D+pH1t|`K$Aa<2jYcBwMC6W$Z+GnQUfvx#aBLhz1v!{|yhdl@y_Mq^W_a|UCwvR-
z*BJ!KZ&ipE002F>pbQAz`0yJ~AM$bl%N;%5h25v7E2JxTT98OT_zdd0W9Y+EkWp}X
zq=q0`JaZe(WcZ2=Ow2Bv4n3wZpMZtSCFg2H_-+u<@>0~0S_gNcz-Z-N%JV&<$xroF
z!+)}B{<&;hBxB%-v@!L+lpCWnoer>xOo5cJ>5Iu)R{TN^DQ`6wzAXAqKAJBhG
zIhI+{k<+{+Su^A5-rltn8q<0sKrxdbuQ3czVh%flcgJr?=oj(3*m$3nG#eM^A&;cO
zw<`&?YeT|?>3aRa@i3B{7yWY9bS5w$E^;sXNfdx{OROTih4Z5dJYY2@x~HBLWiJr_vJ7LxN&02sa1-AOuiD7
z{*sZ-uD|PAO#A!CS)niv;7k|yGvY^Ak{MFO(7HHN_hs`Q+hcNGTW?X3s^W=WGNLv6
z$tb<`s&+)|b<^&QIe^zG?5U!1sV3sd^d*z*{{8)?nHx4~xs+(Q@bux&7o+V(;g8&)
z8V=B;-U`NoA_t(jhWHKfqkxV5Xw9LnDt)dPqo?X7-oirPQWb3nUvVVj
z3UQbaWnA;GH7WrGew;m~mm{U@bIfQV7mU9KlYYUl3h`i!PpUxl2$uL=9bz!xn};fURK6kq>1{i#Qb?1
zYF1TVBBVJm@t}LUQY$jvMqv#lv`&@>{Eh0$oCm$8>M8)#eYjw7MOZ%7h}&%KDJMP?
z44Lu0Voa8Zd?OJr^X!Y|yTDp%dS^D8E-CYsUZ6)0*57Mrw1@bv_cRcJ
zg9fvx*S*@C)V(m1zJ4Rzc}+@{WL-oN`{2q!FRj+z4I2t&)y#R0o??MVKrX+m8^qNh
zY=%4}v)2alRNGPPpux1p*68w}woS>+as{9W0%e(8ukyfyvI?oFHSbAe^9)nfSY>Vi
z$W~Gw9UXfS#jR<0vd~pThZXGgW0ki8<|mQ;`&t@J`UE}u4VMc1T)3&kv{C|9H6(AW
zME%1TM*_+FHn)sIZ>nQ&2n!#bLfzFwjQ}W#Fs&VtiBb%~9C;%JkOu=}OTM{TsSftY
zUAAJBFM(zZ=?7%#vjI!5;$i~2aNjGij(9@?xs#Mav
z(_;D9cwQH(BcLXBeCCr6pwS$rA4kXouC%ps!EPY^<|JS{#b(w&o&Z=9P
zngkeVN@bP`R3nfU;?(ycPn^(^>`0`BeoE16B~#?c6aW=-m^35=;$-`~RE*(+IZ<^7
z8|CF*lj+6BJXc+~^GDBCtkPcf39{!`dN8^7PkEEP?&$LgjK$
zC<_uTjDk`%rpItDV-cy_bSc4ei6oWW=u={7uwHK8Jm3NR^6-hbx2o-1AocYdDx28)4)Iw|~z@W|gfvEQ+
zBoqxDC)aiNT>!!GSy+0661C~{&bLnd8ga@o{&cJW^7d;H^1oK4XCh-3-;ynpR&=ozzIfbnsqk-a0?%CX7NK!929doROk8Lg&4e($4H>)t#PbuX*0Wwqd
zxe5m>c+YcpOx17St_)o=UbuDEW<3j@#+@bkOMz6QH*=aQmLCTv7v4hRDy;ZS7cqEZ
zyXTc}jvvf(%~KvsT3O{@PD|j7(}W=%Y{9uGsnqq+I0^*mo(=xob}w_i&`~_h1n5jX
zu`1q>$V|7PASw?H{kfO~2GGSL+aimw`9CKz_XZIh9^uEWy7>rw=W#`h0Be=U3U$P<
zNFUL`zEw2Cco=Nv(SNsF#vPMH*0Kb#WFQC^wO;~uLs#m%^^T#B1}zp24*-qbDR+Ai
zKE2oXUvez3(Uy9+6vY78?SAgi^1v00&Huudf0U_+r22J>`Euf0~>U
zr1UGB{gH~S@gX31-ZgWON_)WbQCDB$`hmJ(m(cRJA8lI-rwV%GIWJ_{I_#NsvlO;Hl(SP-@Tr4+#S(c}&^TW;sL1Dif8va>BFJM>4w+gN!)w
mSy}+G*O27aX5b*>J*l_<-Raq1l_w8;9{^X?QK?n3di{Saaw#VO
literal 0
HcmV?d00001
diff --git a/src/.toolkit/update.ps1 b/src/.toolkit/update.ps1
new file mode 100644
index 0000000..d5fdfea
--- /dev/null
+++ b/src/.toolkit/update.ps1
@@ -0,0 +1,214 @@
+#!/usr/bin/env pwsh
+<#
+.SYNOPSIS
+Installs or updates DragoAnt.MSBuildKit in a repository's .toolkit/ folder.
+
+.DESCRIPTION
+Downloads a release zip of the kit from GitHub, checks its SHA-256 against the published
+checksum (and against .toolkit/kit.json when the version is unchanged), and rewrites
+.toolkit/msbuild/ with the default parts plus the optional parts you selected.
+
+.EXAMPLE
+pwsh .toolkit/update.ps1 # update to the version in kit.json, else the latest
+pwsh .toolkit/update.ps1 -Version 0.2.0 -DryRun # show what 0.2.0 would change
+pwsh .toolkit/update.ps1 -Add PackageAsProj # install an optional part
+#>
+[CmdletBinding()]
+param(
+ # Kit version to install; default: the version in .toolkit/kit.json, else the latest release.
+ [string] $Version,
+ # Optional parts to install, e.g. PackageAsProj, EF, Project.SourceGenerator.
+ [string[]] $Add = @(),
+ # Optional parts to uninstall.
+ [string[]] $Remove = @(),
+ # Show what would change and change nothing.
+ [switch] $DryRun,
+ # Install from a local kit build (a folder containing .toolkit/ or a release zip).
+ [string] $Source,
+ # Expected SHA-256 of the release zip (or of a -Source zip).
+ [string] $Sha256,
+ # GitHub repository to download releases from.
+ [string] $Repo = 'DragoAnt/MSBuildKit',
+ # Repository root; default: the current folder.
+ [string] $Root
+)
+
+Set-StrictMode -Version Latest
+$ErrorActionPreference = 'Stop'
+
+function Say([string] $text) { Write-Host "update: $text" }
+function Fail([string] $text) { throw "update: error: $text" }
+
+if (-not $Root) { $Root = (Get-Location).Path }
+$Root = (Resolve-Path $Root).Path
+$toolkit = Join-Path $Root '.toolkit'
+$kitJsonPath = Join-Path $toolkit 'kit.json'
+$kitJson = if (Test-Path $kitJsonPath) { Get-Content -Raw $kitJsonPath | ConvertFrom-Json } else { $null }
+function KitJsonValue([string] $name) {
+ if ($null -ne $kitJson -and $kitJson.PSObject.Properties.Name -contains $name) { return $kitJson.$name }
+ return $null
+}
+
+if ($Version) { $Version = $Version -replace '^[vV]', '' }
+if ($Sha256) { $Sha256 = $Sha256.ToLowerInvariant() }
+$recordedRepo = KitJsonValue 'repository'
+if ($recordedRepo -and $Repo -eq 'DragoAnt/MSBuildKit') { $Repo = $recordedRepo }
+
+$work = Join-Path ([System.IO.Path]::GetTempPath()) ("msbuildkit-" + [guid]::NewGuid().ToString('N'))
+New-Item -ItemType Directory -Path $work | Out-Null
+try {
+ $actualSha = ''
+ $kitDir = $null
+ if ($Source) {
+ if (Test-Path $Source -PathType Container) {
+ if (-not (Test-Path (Join-Path $Source '.toolkit/msbuild/init.props'))) { Fail "'$Source' is not a kit build: no .toolkit/msbuild/init.props" }
+ $kitDir = (Resolve-Path $Source).Path
+ }
+ elseif (Test-Path $Source -PathType Leaf) {
+ $actualSha = (Get-FileHash -Algorithm SHA256 $Source).Hash.ToLowerInvariant()
+ if ($Sha256 -and $actualSha -ne $Sha256) { Fail "SHA-256 mismatch for '$Source': expected $Sha256, got $actualSha" }
+ $kitDir = Join-Path $work 'kit'
+ Expand-Archive -Path $Source -DestinationPath $kitDir
+ }
+ else { Fail "-Source '$Source' does not exist" }
+ if (-not $Version) {
+ $versionFile = Join-Path $kitDir '.toolkit/kit.version'
+ $Version = if (Test-Path $versionFile) { (Get-Content $versionFile -TotalCount 1).Trim() } else { '0.0.0-local' }
+ }
+ }
+ else {
+ if (-not $Version) { $Version = KitJsonValue 'version' }
+ if (-not $Version) {
+ $latest = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest" -Headers @{ 'User-Agent' = 'msbuildkit-update' }
+ $Version = ($latest.tag_name -replace '^[vV]', '')
+ if (-not $Version) { Fail "no release found in $Repo" }
+ }
+ $zipName = "msbuildkit-$Version.zip"
+ $base = "https://github.com/$Repo/releases/download/v$Version"
+ $zipPath = Join-Path $work $zipName
+ Say "downloading $base/$zipName"
+ Invoke-WebRequest -Uri "$base/$zipName" -OutFile $zipPath
+ Invoke-WebRequest -Uri "$base/$zipName.sha256" -OutFile "$zipPath.sha256"
+ $published = ((Get-Content "$zipPath.sha256" -TotalCount 1) -split '\s+')[0].ToLowerInvariant()
+ $actualSha = (Get-FileHash -Algorithm SHA256 $zipPath).Hash.ToLowerInvariant()
+ if ($actualSha -ne $published) { Fail "SHA-256 mismatch for ${zipName}: published $published, downloaded $actualSha" }
+ $pinned = KitJsonValue 'sha256'
+ if (-not $Sha256 -and (KitJsonValue 'version') -eq $Version -and $pinned) { $Sha256 = $pinned.ToLowerInvariant() }
+ if ($Sha256 -and $actualSha -ne $Sha256) { Fail "SHA-256 mismatch for ${zipName}: expected $Sha256 (kit.json or -Sha256), got $actualSha" }
+ $kitDir = Join-Path $work 'kit'
+ Expand-Archive -Path $zipPath -DestinationPath $kitDir
+ }
+
+ $newToolkit = Join-Path $kitDir '.toolkit'
+ if (-not (Test-Path (Join-Path $newToolkit 'msbuild/init.props'))) { Fail 'the kit build has no .toolkit/msbuild/init.props' }
+ $partsPath = Join-Path $newToolkit 'kit.parts'
+ if (-not (Test-Path $partsPath)) { Fail 'the kit build has no .toolkit/kit.parts' }
+ if ((Test-Path $toolkit) -and (Resolve-Path $newToolkit).Path -eq (Resolve-Path $toolkit).Path) {
+ Fail 'the target .toolkit is the kit source itself; run from the repository you want to update, or pass -Root'
+ }
+ $parts = [ordered]@{}
+ foreach ($line in Get-Content $partsPath) {
+ $line = $line.Trim()
+ if (-not $line -or $line.StartsWith('#')) { continue }
+ $fields = $line -split '\s+'
+ $parts[$fields[0]] = [pscustomobject]@{ Kind = $fields[1]; Requires = @($fields | Select-Object -Skip 2) }
+ }
+ function PartDir([string] $name) { if ($name -eq 'Trunk') { 'DragoAnt.MSBuildKit' } else { "DragoAnt.MSBuildKit.$name" } }
+
+ $optional = [System.Collections.Generic.List[string]]::new()
+ $recordedParts = @(KitJsonValue 'parts' | Where-Object { $_ })
+ foreach ($p in @($recordedParts) + @($Add)) {
+ if (-not $parts.Contains($p)) { Fail "unknown part '$p'; known parts: $($parts.Keys -join ' ')" }
+ if ($parts[$p].Kind -eq 'optional' -and -not $optional.Contains($p)) { $optional.Add($p) }
+ }
+ foreach ($p in $Remove) {
+ if (-not $parts.Contains($p)) { Fail "unknown part '$p'" }
+ if ($parts[$p].Kind -ne 'optional') { Fail "'$p' is a default part and cannot be removed" }
+ [void]$optional.Remove($p)
+ }
+
+ $selected = [System.Collections.Generic.List[string]]::new()
+ foreach ($name in $parts.Keys) { if ($parts[$name].Kind -eq 'default') { $selected.Add($name) } }
+ $pending = [System.Collections.Generic.Queue[string]]::new([string[]]$optional)
+ while ($pending.Count -gt 0) {
+ $p = $pending.Dequeue()
+ if ($selected.Contains($p)) { continue }
+ $selected.Add($p)
+ foreach ($d in $parts[$p].Requires) { $pending.Enqueue($d) }
+ }
+ $recorded = @($parts.Keys | Where-Object { $selected.Contains($_) -and $parts[$_].Kind -eq 'optional' })
+
+ $stage = Join-Path $work 'stage/msbuild'
+ New-Item -ItemType Directory -Path $stage -Force | Out-Null
+ Get-ChildItem -File (Join-Path $newToolkit 'msbuild') | Copy-Item -Destination $stage
+ foreach ($p in $selected) {
+ $d = PartDir $p
+ $from = Join-Path $newToolkit "msbuild/$d"
+ if (-not (Test-Path $from)) { Fail "the kit build has no part folder msbuild/$d" }
+ Copy-Item -Recurse $from (Join-Path $stage $d)
+ }
+
+ $oldVersion = KitJsonValue 'version'
+ Say "kit $Repo $(if ($oldVersion) { $oldVersion } else { 'none' }) -> $Version$(if ($actualSha) { " (sha256 $actualSha)" })"
+ Say "parts: $($selected -join ' ')"
+
+ $currentMsbuild = Join-Path $toolkit 'msbuild'
+ function RelativeFiles([string] $dir) {
+ if (-not (Test-Path $dir)) { return @() }
+ $full = (Resolve-Path $dir).Path
+ @(Get-ChildItem -Recurse -File $full | ForEach-Object { $_.FullName.Substring($full.Length + 1).Replace('\', '/') } | Sort-Object)
+ }
+ $old = RelativeFiles $currentMsbuild
+ $new = RelativeFiles $stage
+ $changes = 0
+ foreach ($f in $new) {
+ if ($old -notcontains $f) { Say " add .toolkit/msbuild/$f"; $changes++ }
+ elseif ((Get-FileHash (Join-Path $currentMsbuild $f)).Hash -ne (Get-FileHash (Join-Path $stage $f)).Hash) { Say " change .toolkit/msbuild/$f"; $changes++ }
+ }
+ foreach ($f in $old) { if ($new -notcontains $f) { Say " remove .toolkit/msbuild/$f"; $changes++ } }
+
+ $dbp = Join-Path $Root 'Directory.Build.props'
+ $dbt = Join-Path $Root 'Directory.Build.targets'
+ if ($DryRun) {
+ Say "$changes file(s) under .toolkit/msbuild would change"
+ if (-not (Test-Path $dbp)) { Say ' would create Directory.Build.props' }
+ if (-not (Test-Path $dbt)) { Say ' would create Directory.Build.targets' }
+ Say 'dry run: nothing changed'
+ return
+ }
+
+ New-Item -ItemType Directory -Path $toolkit -Force | Out-Null
+ if (Test-Path $currentMsbuild) { Remove-Item -Recurse -Force $currentMsbuild }
+ Copy-Item -Recurse $stage $currentMsbuild
+ $res = Join-Path $newToolkit 'res'
+ if (Test-Path $res) { New-Item -ItemType Directory -Path (Join-Path $toolkit 'res') -Force | Out-Null; Copy-Item -Recurse -Force (Join-Path $res '*') (Join-Path $toolkit 'res') }
+ foreach ($f in 'update.sh', 'update.ps1', 'kit.parts') {
+ $from = Join-Path $newToolkit $f
+ if (Test-Path $from) { Copy-Item -Force $from (Join-Path $toolkit $f) }
+ }
+ Remove-Item -Force -ErrorAction SilentlyContinue (Join-Path $toolkit 'kit.version')
+
+ $partsJson = ($recorded | ForEach-Object { "`"$_`"" }) -join ', '
+ $json = "{`n `"repository`": `"$Repo`",`n `"version`": `"$Version`",`n `"sha256`": `"$actualSha`",`n `"parts`": [$partsJson]`n}`n"
+ [System.IO.File]::WriteAllText($kitJsonPath, $json)
+ Say "$changes file(s) under .toolkit/msbuild changed"
+
+ if (-not (Test-Path $dbp)) {
+ [System.IO.File]::WriteAllText($dbp, "`n`n `n`n`n")
+ Say 'created Directory.Build.props'
+ }
+ elseif ((Get-Content -Raw $dbp) -notmatch '\.toolkit[/\\]msbuild[/\\]init\.props') {
+ Say 'add to Directory.Build.props: '
+ }
+ if (-not (Test-Path $dbt)) {
+ [System.IO.File]::WriteAllText($dbt, "`n`n `n`n`n")
+ Say 'created Directory.Build.targets'
+ }
+ elseif ((Get-Content -Raw $dbt) -notmatch '\.toolkit[/\\]msbuild[/\\]init\.targets') {
+ Say 'add to Directory.Build.targets: '
+ }
+ Say "done: DragoAnt.MSBuildKit $Version installed in $toolkit"
+}
+finally {
+ Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $work
+}
diff --git a/src/.toolkit/update.sh b/src/.toolkit/update.sh
new file mode 100644
index 0000000..9cec564
--- /dev/null
+++ b/src/.toolkit/update.sh
@@ -0,0 +1,222 @@
+#!/bin/sh
+# Installs or updates DragoAnt.MSBuildKit in a repository's .toolkit/ folder.
+# Usage: sh .toolkit/update.sh [--version X.Y.Z] [--add PART] [--remove PART] [--dry-run]
+# [--source DIR|ZIP] [--sha256 HEX] [--repo OWNER/NAME] [--root DIR]
+set -eu
+
+repo="DragoAnt/MSBuildKit"
+version=""
+source=""
+expected_sha=""
+root=""
+dry_run=0
+add_parts=""
+remove_parts=""
+
+usage() {
+ sed -n '2,4p' "$0" | sed 's/^# \{0,1\}//'
+ cat <<'EOF'
+
+ --version X.Y.Z kit version to install (default: the version in .toolkit/kit.json, else the latest release)
+ --add PART install an optional part (repeatable), e.g. --add PackageAsProj
+ --remove PART uninstall an optional part (repeatable)
+ --dry-run show what would change and change nothing
+ --source DIR|ZIP install from a local kit build instead of a GitHub release
+ --sha256 HEX expected SHA-256 of the release zip (or of a --source zip)
+ --repo OWNER/NAME GitHub repository to download releases from (default: DragoAnt/MSBuildKit)
+ --root DIR repository root (default: the current folder)
+EOF
+}
+
+fail() { echo "update: error: $*" >&2; exit 1; }
+say() { echo "update: $*"; }
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ --version) [ $# -ge 2 ] || fail "--version needs a value"; version="${2#v}"; shift 2 ;;
+ --source) [ $# -ge 2 ] || fail "--source needs a value"; source="$2"; shift 2 ;;
+ --sha256) [ $# -ge 2 ] || fail "--sha256 needs a value"; expected_sha=$(printf '%s' "$2" | tr 'A-F' 'a-f'); shift 2 ;;
+ --repo) [ $# -ge 2 ] || fail "--repo needs a value"; repo="$2"; shift 2 ;;
+ --root) [ $# -ge 2 ] || fail "--root needs a value"; root="$2"; shift 2 ;;
+ --add) [ $# -ge 2 ] || fail "--add needs a value"; add_parts="$add_parts $2"; shift 2 ;;
+ --remove) [ $# -ge 2 ] || fail "--remove needs a value"; remove_parts="$remove_parts $2"; shift 2 ;;
+ --dry-run) dry_run=1; shift ;;
+ -h|--help) usage; exit 0 ;;
+ *) fail "unknown argument '$1' (see --help)" ;;
+ esac
+done
+
+[ -n "$root" ] || root=$(pwd)
+[ -d "$root" ] || fail "root '$root' is not a directory"
+toolkit="$root/.toolkit"
+kit_json="$toolkit/kit.json"
+
+json_value() { [ -f "$kit_json" ] && sed -n "s/.*\"$1\"[[:space:]]*:[[:space:]]*\"\([^\"]*\)\".*/\1/p" "$kit_json" | head -n 1 || true; }
+json_parts() { [ -f "$kit_json" ] && sed -n 's/.*"parts"[[:space:]]*:[[:space:]]*\[\(.*\)\].*/\1/p' "$kit_json" | tr -d '" ' | tr ',' ' ' || true; }
+
+sha256_of() {
+ if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | cut -d' ' -f1
+ elif command -v shasum >/dev/null 2>&1; then shasum -a 256 "$1" | cut -d' ' -f1
+ else fail "neither sha256sum nor shasum is available"; fi
+}
+
+download() {
+ if command -v curl >/dev/null 2>&1; then curl -fsSL --retry 3 -o "$2" "$1"
+ elif command -v wget >/dev/null 2>&1; then wget -q -O "$2" "$1"
+ else fail "neither curl nor wget is available"; fi
+}
+
+extract_zip() {
+ if command -v unzip >/dev/null 2>&1; then unzip -q -o "$1" -d "$2"
+ else tar -xf "$1" -C "$2" || fail "cannot extract '$1': install unzip"; fi
+}
+
+work=$(mktemp -d)
+trap 'rm -rf "$work"' EXIT INT TERM
+kit_dir=""
+actual_sha=""
+
+[ -n "$repo" ] || fail "--repo is empty"
+recorded_repo=$(json_value repository)
+if [ -n "$recorded_repo" ] && [ "$repo" = "DragoAnt/MSBuildKit" ]; then repo="$recorded_repo"; fi
+
+if [ -n "$source" ]; then
+ if [ -d "$source" ]; then
+ [ -f "$source/.toolkit/msbuild/init.props" ] || fail "'$source' is not a kit build: no .toolkit/msbuild/init.props"
+ kit_dir="$source"
+ elif [ -f "$source" ]; then
+ actual_sha=$(sha256_of "$source")
+ if [ -n "$expected_sha" ] && [ "$actual_sha" != "$expected_sha" ]; then
+ fail "SHA-256 mismatch for '$source': expected $expected_sha, got $actual_sha"
+ fi
+ mkdir -p "$work/kit"; extract_zip "$source" "$work/kit"; kit_dir="$work/kit"
+ else
+ fail "--source '$source' does not exist"
+ fi
+ [ -n "$version" ] || version=$(sed -n '1p' "$kit_dir/.toolkit/kit.version" 2>/dev/null || true)
+ [ -n "$version" ] || version="0.0.0-local"
+else
+ [ -n "$version" ] || version=$(json_value version)
+ if [ -z "$version" ]; then
+ download "https://api.github.com/repos/$repo/releases/latest" "$work/latest.json" || fail "cannot query the latest release of $repo"
+ tag=$(sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$work/latest.json" | head -n 1)
+ [ -n "$tag" ] || fail "no release found in $repo"
+ version="${tag#v}"
+ fi
+ zip_name="msbuildkit-$version.zip"
+ base="https://github.com/$repo/releases/download/v$version"
+ say "downloading $base/$zip_name"
+ download "$base/$zip_name" "$work/$zip_name" || fail "cannot download $base/$zip_name"
+ download "$base/$zip_name.sha256" "$work/$zip_name.sha256" || fail "cannot download $base/$zip_name.sha256"
+ published_sha=$(cut -d' ' -f1 "$work/$zip_name.sha256" | tr 'A-F' 'a-f')
+ actual_sha=$(sha256_of "$work/$zip_name")
+ [ "$actual_sha" = "$published_sha" ] || fail "SHA-256 mismatch for $zip_name: published $published_sha, downloaded $actual_sha"
+ pinned_sha=$(json_value sha256)
+ if [ -z "$expected_sha" ] && [ "$(json_value version)" = "$version" ] && [ -n "$pinned_sha" ]; then expected_sha="$pinned_sha"; fi
+ if [ -n "$expected_sha" ] && [ "$actual_sha" != "$expected_sha" ]; then
+ fail "SHA-256 mismatch for $zip_name: expected $expected_sha (kit.json or --sha256), got $actual_sha"
+ fi
+ mkdir -p "$work/kit"; extract_zip "$work/$zip_name" "$work/kit"; kit_dir="$work/kit"
+fi
+
+new_toolkit="$kit_dir/.toolkit"
+[ -f "$new_toolkit/msbuild/init.props" ] || fail "the kit build has no .toolkit/msbuild/init.props"
+[ -f "$new_toolkit/kit.parts" ] || fail "the kit build has no .toolkit/kit.parts"
+if [ -d "$toolkit" ] && [ "$(cd "$new_toolkit" && pwd -P)" = "$(cd "$toolkit" && pwd -P)" ]; then fail "the target .toolkit is the kit source itself; run from the repository you want to update, or pass --root"; fi
+parts_file="$work/kit.parts"
+tr -d '\r' < "$new_toolkit/kit.parts" | grep -v '^[[:space:]]*#' | grep -v '^[[:space:]]*$' > "$parts_file"
+
+part_kind() { awk -v p="$1" '$1==p {print $2}' "$parts_file"; }
+part_deps() { awk -v p="$1" '$1==p {for (i=3;i<=NF;i++) print $i}' "$parts_file"; }
+part_dir() { if [ "$1" = "Trunk" ]; then echo "DragoAnt.MSBuildKit"; else echo "DragoAnt.MSBuildKit.$1"; fi; }
+
+optional=""
+for p in $(json_parts) $add_parts; do
+ kind=$(part_kind "$p")
+ [ -n "$kind" ] || fail "unknown part '$p'; known parts: $(awk '{print $1}' "$parts_file" | tr '\n' ' ')"
+ case " $optional " in *" $p "*) ;; *) if [ "$kind" = optional ]; then optional="$optional $p"; fi ;; esac
+done
+for p in $remove_parts; do
+ kind=$(part_kind "$p")
+ [ -n "$kind" ] || fail "unknown part '$p'"
+ [ "$kind" = optional ] || fail "'$p' is a default part and cannot be removed"
+ optional=$(echo " $optional " | sed "s/ $p / /g")
+done
+
+selected=$(awk '$2=="default" {print $1}' "$parts_file")
+pending="$optional"
+while [ -n "$(echo $pending)" ]; do
+ next=""
+ for p in $pending; do
+ case " $(echo $selected) " in *" $p "*) continue ;; esac
+ selected="$selected $p"
+ for d in $(part_deps "$p"); do next="$next $d"; done
+ done
+ pending="$next"
+done
+recorded=""
+for p in $selected; do if [ "$(part_kind "$p")" = optional ]; then recorded="$recorded $p"; fi; done
+recorded=$(echo $recorded)
+
+stage="$work/stage"
+mkdir -p "$stage/msbuild"
+for f in "$new_toolkit"/msbuild/*; do [ -f "$f" ] && cp "$f" "$stage/msbuild/"; done
+for p in $selected; do
+ d=$(part_dir "$p")
+ [ -d "$new_toolkit/msbuild/$d" ] || fail "the kit build has no part folder msbuild/$d"
+ cp -R "$new_toolkit/msbuild/$d" "$stage/msbuild/$d"
+done
+
+old_version=$(json_value version)
+say "kit $repo ${old_version:-none} -> $version${actual_sha:+ (sha256 $actual_sha)}"
+say "parts: $(echo $selected)"
+changes=0
+if [ -d "$toolkit/msbuild" ]; then
+ (cd "$toolkit/msbuild" && find . -type f | sort) > "$work/old.lst"
+else
+ : > "$work/old.lst"
+fi
+(cd "$stage/msbuild" && find . -type f | sort) > "$work/new.lst"
+for f in $(comm -13 "$work/old.lst" "$work/new.lst"); do say " add .toolkit/msbuild/${f#./}"; changes=$((changes+1)); done
+for f in $(comm -23 "$work/old.lst" "$work/new.lst"); do say " remove .toolkit/msbuild/${f#./}"; changes=$((changes+1)); done
+for f in $(comm -12 "$work/old.lst" "$work/new.lst"); do
+ cmp -s "$toolkit/msbuild/$f" "$stage/msbuild/$f" || { say " change .toolkit/msbuild/${f#./}"; changes=$((changes+1)); }
+done
+
+dbp="$root/Directory.Build.props"
+dbt="$root/Directory.Build.targets"
+
+if [ "$dry_run" -eq 1 ]; then
+ say "$changes file(s) under .toolkit/msbuild would change"
+ [ -f "$dbp" ] || say " would create Directory.Build.props"
+ [ -f "$dbt" ] || say " would create Directory.Build.targets"
+ say "dry run: nothing changed"
+ exit 0
+fi
+
+mkdir -p "$toolkit"
+rm -rf "$toolkit/msbuild"
+cp -R "$stage/msbuild" "$toolkit/msbuild"
+if [ -d "$new_toolkit/res" ]; then mkdir -p "$toolkit/res"; cp -R "$new_toolkit/res/." "$toolkit/res/"; fi
+for f in update.sh update.ps1 kit.parts; do [ -f "$new_toolkit/$f" ] && cp "$new_toolkit/$f" "$toolkit/$f"; done
+rm -f "$toolkit/kit.version"
+say "$changes file(s) under .toolkit/msbuild changed"
+
+parts_json=""
+for p in $recorded; do parts_json="$parts_json${parts_json:+, }\"$p\""; done
+printf '{\n "repository": "%s",\n "version": "%s",\n "sha256": "%s",\n "parts": [%s]\n}\n' \
+ "$repo" "$version" "$actual_sha" "$parts_json" > "$kit_json"
+
+if [ ! -f "$dbp" ]; then
+ printf '\n\n \n\n\n' > "$dbp"
+ say "created Directory.Build.props"
+elif ! grep -q '\.toolkit[/\\]msbuild[/\\]init\.props' "$dbp"; then
+ say "add to Directory.Build.props: "
+fi
+if [ ! -f "$dbt" ]; then
+ printf '\n\n \n\n\n' > "$dbt"
+ say "created Directory.Build.targets"
+elif ! grep -q '\.toolkit[/\\]msbuild[/\\]init\.targets' "$dbt"; then
+ say "add to Directory.Build.targets: "
+fi
+say "done: DragoAnt.MSBuildKit $version installed in $toolkit"
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 20b7fb9..2f280a9 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,18 +1,27 @@
- TargetFrameworks
net7.0;net8.0;net9.0
- $(NoWarn);CS1591;EF1001;xUnit1051
+ Copyright (c) 2025 DragoAnt
-
+ $(NoWarn);EF1001
+ enable
+ enable
+ latest
+ True
+
+
true
$(NoWarn);NETSDK1138
+
+ efcore;entity-framework-core;migrations;database
+
+ FluentAssertions
-
+
net8.0;net9.0
-
\ No newline at end of file
+
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index e42cfff..4308a67 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -1,5 +1,11 @@
-
+
-
\ No newline at end of file
+
+
+ false
+ false
+
+
+
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index e1a7314..d234a44 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -1,7 +1,5 @@
-
-
true
false
@@ -63,17 +61,10 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Directory.Version.props b/src/Directory.Version.props
new file mode 100644
index 0000000..fa3ef2b
--- /dev/null
+++ b/src/Directory.Version.props
@@ -0,0 +1,5 @@
+
+
+ 9.0.1
+
+
diff --git a/src/DragoAnt.EntityConventions.Contacts/DragoAnt.EntityConventions.Contacts.csproj b/src/DragoAnt.EntityConventions.Contacts/DragoAnt.EntityConventions.Contacts.csproj
deleted file mode 100644
index 7aac3c7..0000000
--- a/src/DragoAnt.EntityConventions.Contacts/DragoAnt.EntityConventions.Contacts.csproj
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
- Entity conventions contracts for map enities with commom functionality
- enable
-
-
-
diff --git a/src/DragoAnt.EntityConventions.Contacts/package.readme.md b/src/DragoAnt.EntityConventions.Contacts/package.readme.md
deleted file mode 100644
index b250892..0000000
--- a/src/DragoAnt.EntityConventions.Contacts/package.readme.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# DragoAnt.EntityConventions.Contacts
-
- Entity conventions contracts for map enities with commom functionality
diff --git a/src/DragoAnt.EntityConventions.Contracts/DragoAnt.EntityConventions.Contracts.csproj b/src/DragoAnt.EntityConventions.Contracts/DragoAnt.EntityConventions.Contracts.csproj
new file mode 100644
index 0000000..dc5000f
--- /dev/null
+++ b/src/DragoAnt.EntityConventions.Contracts/DragoAnt.EntityConventions.Contracts.csproj
@@ -0,0 +1,8 @@
+
+
+
+ Marker interfaces and options for entity conventions such as create/concurrency auditing, discriminators and source-system ids.
+ enable
+
+
+
diff --git a/src/DragoAnt.EntityConventions.Contacts/DragoAnt.EntityConventions.Contacts.csproj.DotSettings b/src/DragoAnt.EntityConventions.Contracts/DragoAnt.EntityConventions.Contracts.csproj.DotSettings
similarity index 100%
rename from src/DragoAnt.EntityConventions.Contacts/DragoAnt.EntityConventions.Contacts.csproj.DotSettings
rename to src/DragoAnt.EntityConventions.Contracts/DragoAnt.EntityConventions.Contracts.csproj.DotSettings
diff --git a/src/DragoAnt.EntityConventions.Contacts/EntityConventionsCommonDefaultsOptions.cs b/src/DragoAnt.EntityConventions.Contracts/EntityConventionsCommonDefaultsOptions.cs
similarity index 93%
rename from src/DragoAnt.EntityConventions.Contacts/EntityConventionsCommonDefaultsOptions.cs
rename to src/DragoAnt.EntityConventions.Contracts/EntityConventionsCommonDefaultsOptions.cs
index f16e0fd..e7f8498 100644
--- a/src/DragoAnt.EntityConventions.Contacts/EntityConventionsCommonDefaultsOptions.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/EntityConventionsCommonDefaultsOptions.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
public sealed class EntityConventionsCommonDefaultsOptions
{
diff --git a/src/DragoAnt.EntityConventions.Contacts/EntityConventionsException.cs b/src/DragoAnt.EntityConventions.Contracts/EntityConventionsException.cs
similarity index 91%
rename from src/DragoAnt.EntityConventions.Contacts/EntityConventionsException.cs
rename to src/DragoAnt.EntityConventions.Contracts/EntityConventionsException.cs
index c36608e..ebaac8f 100644
--- a/src/DragoAnt.EntityConventions.Contacts/EntityConventionsException.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/EntityConventionsException.cs
@@ -1,6 +1,6 @@
using System.Runtime.Serialization;
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
[Serializable]
public class EntityConventionsException : Exception
diff --git a/src/DragoAnt.EntityConventions.Contacts/ExceptionHelper.cs b/src/DragoAnt.EntityConventions.Contracts/ExceptionHelper.cs
similarity index 88%
rename from src/DragoAnt.EntityConventions.Contacts/ExceptionHelper.cs
rename to src/DragoAnt.EntityConventions.Contracts/ExceptionHelper.cs
index 3ce0604..8a905f9 100644
--- a/src/DragoAnt.EntityConventions.Contacts/ExceptionHelper.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/ExceptionHelper.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
public static class ExceptionHelper
{
diff --git a/src/DragoAnt.EntityConventions.Contacts/IConcurrentAuditedEntityConvention.cs b/src/DragoAnt.EntityConventions.Contracts/IConcurrentAuditedEntityConvention.cs
similarity index 82%
rename from src/DragoAnt.EntityConventions.Contacts/IConcurrentAuditedEntityConvention.cs
rename to src/DragoAnt.EntityConventions.Contracts/IConcurrentAuditedEntityConvention.cs
index 167aff3..243f05c 100644
--- a/src/DragoAnt.EntityConventions.Contacts/IConcurrentAuditedEntityConvention.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/IConcurrentAuditedEntityConvention.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
///
/// Entity with concurrent row version property
diff --git a/src/DragoAnt.EntityConventions.Contacts/ICreateAuditedEntityConvention.cs b/src/DragoAnt.EntityConventions.Contracts/ICreateAuditedEntityConvention.cs
similarity index 81%
rename from src/DragoAnt.EntityConventions.Contacts/ICreateAuditedEntityConvention.cs
rename to src/DragoAnt.EntityConventions.Contracts/ICreateAuditedEntityConvention.cs
index 2337c24..0a72318 100644
--- a/src/DragoAnt.EntityConventions.Contacts/ICreateAuditedEntityConvention.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/ICreateAuditedEntityConvention.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
///
/// Entity with creation audited property Created
diff --git a/src/DragoAnt.EntityConventions.Contacts/IEntityConventionContract.cs b/src/DragoAnt.EntityConventions.Contracts/IEntityConventionContract.cs
similarity index 70%
rename from src/DragoAnt.EntityConventions.Contacts/IEntityConventionContract.cs
rename to src/DragoAnt.EntityConventions.Contracts/IEntityConventionContract.cs
index bce9901..541af8a 100644
--- a/src/DragoAnt.EntityConventions.Contacts/IEntityConventionContract.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/IEntityConventionContract.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
///
/// Entity convention base interface
diff --git a/src/DragoAnt.EntityConventions.Contacts/IWithDiscriminatorEntityConvention.cs b/src/DragoAnt.EntityConventions.Contracts/IWithDiscriminatorEntityConvention.cs
similarity index 89%
rename from src/DragoAnt.EntityConventions.Contacts/IWithDiscriminatorEntityConvention.cs
rename to src/DragoAnt.EntityConventions.Contracts/IWithDiscriminatorEntityConvention.cs
index d8722d7..64b5b54 100644
--- a/src/DragoAnt.EntityConventions.Contacts/IWithDiscriminatorEntityConvention.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/IWithDiscriminatorEntityConvention.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
///
/// Entity with discriminator for inheritance
diff --git a/src/DragoAnt.EntityConventions.Contacts/IWithSourceSystemIdEntityConvention.cs b/src/DragoAnt.EntityConventions.Contracts/IWithSourceSystemIdEntityConvention.cs
similarity index 87%
rename from src/DragoAnt.EntityConventions.Contacts/IWithSourceSystemIdEntityConvention.cs
rename to src/DragoAnt.EntityConventions.Contracts/IWithSourceSystemIdEntityConvention.cs
index 41963ca..9e65b5c 100644
--- a/src/DragoAnt.EntityConventions.Contacts/IWithSourceSystemIdEntityConvention.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/IWithSourceSystemIdEntityConvention.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
///
/// Entity with source system id property
diff --git a/src/DragoAnt.EntityConventions.Contacts/IWithSourceSystemIdEntityConventionGuid.cs b/src/DragoAnt.EntityConventions.Contracts/IWithSourceSystemIdEntityConventionGuid.cs
similarity index 86%
rename from src/DragoAnt.EntityConventions.Contacts/IWithSourceSystemIdEntityConventionGuid.cs
rename to src/DragoAnt.EntityConventions.Contracts/IWithSourceSystemIdEntityConventionGuid.cs
index 20fc283..cd9d1dc 100644
--- a/src/DragoAnt.EntityConventions.Contacts/IWithSourceSystemIdEntityConventionGuid.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/IWithSourceSystemIdEntityConventionGuid.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
///
/// Entity with creation audited property Created
diff --git a/src/DragoAnt.EntityConventions.Contacts/Options/BasePropertyOptions.cs b/src/DragoAnt.EntityConventions.Contracts/Options/BasePropertyOptions.cs
similarity index 91%
rename from src/DragoAnt.EntityConventions.Contacts/Options/BasePropertyOptions.cs
rename to src/DragoAnt.EntityConventions.Contracts/Options/BasePropertyOptions.cs
index b52539a..df9d216 100644
--- a/src/DragoAnt.EntityConventions.Contacts/Options/BasePropertyOptions.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/Options/BasePropertyOptions.cs
@@ -1,6 +1,6 @@
using System.ComponentModel;
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
public abstract class BasePropertyOptions : Attribute
{
diff --git a/src/DragoAnt.EntityConventions.Contacts/Options/CreateAuditedOptions.cs b/src/DragoAnt.EntityConventions.Contracts/Options/CreateAuditedOptions.cs
similarity index 92%
rename from src/DragoAnt.EntityConventions.Contacts/Options/CreateAuditedOptions.cs
rename to src/DragoAnt.EntityConventions.Contracts/Options/CreateAuditedOptions.cs
index 90e0430..aa36d10 100644
--- a/src/DragoAnt.EntityConventions.Contacts/Options/CreateAuditedOptions.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/Options/CreateAuditedOptions.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
[AttributeUsage(AttributeTargets.Class)]
public sealed class CreateAuditedOptions : BasePropertyOptions
diff --git a/src/DragoAnt.EntityConventions.Contacts/Options/DiscriminatorOptions.cs b/src/DragoAnt.EntityConventions.Contracts/Options/DiscriminatorOptions.cs
similarity index 69%
rename from src/DragoAnt.EntityConventions.Contacts/Options/DiscriminatorOptions.cs
rename to src/DragoAnt.EntityConventions.Contracts/Options/DiscriminatorOptions.cs
index efc1b01..4c23ec2 100644
--- a/src/DragoAnt.EntityConventions.Contacts/Options/DiscriminatorOptions.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/Options/DiscriminatorOptions.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
[AttributeUsage(AttributeTargets.Class)]
public sealed class DiscriminatorOptions : StringPropertyOptions
diff --git a/src/DragoAnt.EntityConventions.Contacts/Options/SourceSystemIdOptions.cs b/src/DragoAnt.EntityConventions.Contracts/Options/SourceSystemIdOptions.cs
similarity index 91%
rename from src/DragoAnt.EntityConventions.Contacts/Options/SourceSystemIdOptions.cs
rename to src/DragoAnt.EntityConventions.Contracts/Options/SourceSystemIdOptions.cs
index aab4d19..095ff48 100644
--- a/src/DragoAnt.EntityConventions.Contacts/Options/SourceSystemIdOptions.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/Options/SourceSystemIdOptions.cs
@@ -1,4 +1,4 @@
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
[AttributeUsage(AttributeTargets.Class)]
public sealed class SourceSystemIdOptions : StringPropertyOptions
diff --git a/src/DragoAnt.EntityConventions.Contacts/Options/StringPropertyOptions.cs b/src/DragoAnt.EntityConventions.Contracts/Options/StringPropertyOptions.cs
similarity index 92%
rename from src/DragoAnt.EntityConventions.Contacts/Options/StringPropertyOptions.cs
rename to src/DragoAnt.EntityConventions.Contracts/Options/StringPropertyOptions.cs
index cab212d..629b900 100644
--- a/src/DragoAnt.EntityConventions.Contacts/Options/StringPropertyOptions.cs
+++ b/src/DragoAnt.EntityConventions.Contracts/Options/StringPropertyOptions.cs
@@ -1,6 +1,6 @@
using System.ComponentModel;
-namespace DragoAnt.EntityConventions.Contacts;
+namespace DragoAnt.EntityConventions.Contracts;
public abstract class StringPropertyOptions : BasePropertyOptions
{
diff --git a/src/DragoAnt.EntityConventions.Contracts/package.readme.md b/src/DragoAnt.EntityConventions.Contracts/package.readme.md
new file mode 100644
index 0000000..4000480
--- /dev/null
+++ b/src/DragoAnt.EntityConventions.Contracts/package.readme.md
@@ -0,0 +1,9 @@
+# DragoAnt.EntityConventions.Contracts
+
+Marker interfaces and options for entity conventions such as create/concurrency auditing, discriminators and source-system ids.
+
+```sh
+dotnet add package DragoAnt.EntityConventions.Contracts
+```
+
+Source, issues and releases: https://github.com/DragoAnt/Extensions.EntityFrameworkCore
diff --git a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/package.readme.md b/src/DragoAnt.EntityConventions.TriggerBased.Contacts/package.readme.md
deleted file mode 100644
index 3af94ef..0000000
--- a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/package.readme.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# DragoAnt.EntityConventions.TriggerBased.Contacts
-
- Entity conventions contracts for map enities with commom functionality
diff --git a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/DragoAnt.EntityConventions.TriggerBased.Contacts.csproj b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/DragoAnt.EntityConventions.TriggerBased.Contracts.csproj
similarity index 54%
rename from src/DragoAnt.EntityConventions.TriggerBased.Contacts/DragoAnt.EntityConventions.TriggerBased.Contacts.csproj
rename to src/DragoAnt.EntityConventions.TriggerBased.Contracts/DragoAnt.EntityConventions.TriggerBased.Contracts.csproj
index 563d1db..809f8b8 100644
--- a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/DragoAnt.EntityConventions.TriggerBased.Contacts.csproj
+++ b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/DragoAnt.EntityConventions.TriggerBased.Contracts.csproj
@@ -1,12 +1,12 @@
- Entity conventions contracts for map enities with commom functionality
+ Marker interfaces for trigger-based entity conventions: soft delete and update auditing.
enable
-
+
diff --git a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/DragoAnt.EntityConventions.TriggerBased.Contacts.csproj.DotSettings b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/DragoAnt.EntityConventions.TriggerBased.Contracts.csproj.DotSettings
similarity index 100%
rename from src/DragoAnt.EntityConventions.TriggerBased.Contacts/DragoAnt.EntityConventions.TriggerBased.Contacts.csproj.DotSettings
rename to src/DragoAnt.EntityConventions.TriggerBased.Contracts/DragoAnt.EntityConventions.TriggerBased.Contracts.csproj.DotSettings
diff --git a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/ISoftDeleteEntityConvention.cs b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/ISoftDeleteEntityConvention.cs
similarity index 73%
rename from src/DragoAnt.EntityConventions.TriggerBased.Contacts/ISoftDeleteEntityConvention.cs
rename to src/DragoAnt.EntityConventions.TriggerBased.Contracts/ISoftDeleteEntityConvention.cs
index 1e5f66d..d2871c1 100644
--- a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/ISoftDeleteEntityConvention.cs
+++ b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/ISoftDeleteEntityConvention.cs
@@ -1,6 +1,6 @@
-using DragoAnt.EntityConventions.Contacts;
+using DragoAnt.EntityConventions.Contracts;
-namespace DragoAnt.EntityConventions.TriggerBased.Contacts;
+namespace DragoAnt.EntityConventions.TriggerBased.Contracts;
///
/// Entity with creation audited property Modified
diff --git a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/IUpdateAuditedEntityConvention.cs b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/IUpdateAuditedEntityConvention.cs
similarity index 68%
rename from src/DragoAnt.EntityConventions.TriggerBased.Contacts/IUpdateAuditedEntityConvention.cs
rename to src/DragoAnt.EntityConventions.TriggerBased.Contracts/IUpdateAuditedEntityConvention.cs
index 55c4a25..9521c54 100644
--- a/src/DragoAnt.EntityConventions.TriggerBased.Contacts/IUpdateAuditedEntityConvention.cs
+++ b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/IUpdateAuditedEntityConvention.cs
@@ -1,6 +1,6 @@
-using DragoAnt.EntityConventions.Contacts;
+using DragoAnt.EntityConventions.Contracts;
-namespace DragoAnt.EntityConventions.TriggerBased.Contacts;
+namespace DragoAnt.EntityConventions.TriggerBased.Contracts;
///
/// Entity with creation audited property Modified
diff --git a/src/DragoAnt.EntityConventions.TriggerBased.Contracts/package.readme.md b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/package.readme.md
new file mode 100644
index 0000000..21ec60b
--- /dev/null
+++ b/src/DragoAnt.EntityConventions.TriggerBased.Contracts/package.readme.md
@@ -0,0 +1,9 @@
+# DragoAnt.EntityConventions.TriggerBased.Contracts
+
+Marker interfaces for trigger-based entity conventions: soft delete and update auditing.
+
+```sh
+dotnet add package DragoAnt.EntityConventions.TriggerBased.Contracts
+```
+
+Source, issues and releases: https://github.com/DragoAnt/Extensions.EntityFrameworkCore
diff --git a/src/DragoAnt.EntityDefinition.AspNetCore/DragoAnt.EntityDefinition.AspNetCore.csproj b/src/DragoAnt.EntityDefinition.AspNetCore/DragoAnt.EntityDefinition.AspNetCore.csproj
index 10929f7..9952c04 100644
--- a/src/DragoAnt.EntityDefinition.AspNetCore/DragoAnt.EntityDefinition.AspNetCore.csproj
+++ b/src/DragoAnt.EntityDefinition.AspNetCore/DragoAnt.EntityDefinition.AspNetCore.csproj
@@ -1,7 +1,7 @@
- Definitions AspNet Core extensions
+ ASP.NET Core middleware that serves the entity definitions of an Entity Framework Core model as CSV.
enable
diff --git a/src/DragoAnt.EntityDefinition.AspNetCore/package.readme.md b/src/DragoAnt.EntityDefinition.AspNetCore/package.readme.md
index 5207031..16b07b3 100644
--- a/src/DragoAnt.EntityDefinition.AspNetCore/package.readme.md
+++ b/src/DragoAnt.EntityDefinition.AspNetCore/package.readme.md
@@ -1,3 +1,9 @@
# DragoAnt.EntityDefinition.AspNetCore
- Definitions AspNet Core extensions
+ASP.NET Core middleware that serves the entity definitions of an Entity Framework Core model as CSV.
+
+```sh
+dotnet add package DragoAnt.EntityDefinition.AspNetCore
+```
+
+Source, issues and releases: https://github.com/DragoAnt/Extensions.EntityFrameworkCore
diff --git a/src/DragoAnt.EntityDefinition.Contracts/DragoAnt.EntityDefinition.Contracts.csproj b/src/DragoAnt.EntityDefinition.Contracts/DragoAnt.EntityDefinition.Contracts.csproj
index 11f247b..145b2eb 100644
--- a/src/DragoAnt.EntityDefinition.Contracts/DragoAnt.EntityDefinition.Contracts.csproj
+++ b/src/DragoAnt.EntityDefinition.Contracts/DragoAnt.EntityDefinition.Contracts.csproj
@@ -1,7 +1,7 @@
- Definitions contracts
+ Attributes and builders for describing entities and their properties in an entity definition map.
enable
diff --git a/src/DragoAnt.EntityDefinition.Contracts/package.readme.md b/src/DragoAnt.EntityDefinition.Contracts/package.readme.md
index c65f6d7..4a06deb 100644
--- a/src/DragoAnt.EntityDefinition.Contracts/package.readme.md
+++ b/src/DragoAnt.EntityDefinition.Contracts/package.readme.md
@@ -1,3 +1,9 @@
# DragoAnt.EntityDefinition.Contracts
- Definitions contracts
+Attributes and builders for describing entities and their properties in an entity definition map.
+
+```sh
+dotnet add package DragoAnt.EntityDefinition.Contracts
+```
+
+Source, issues and releases: https://github.com/DragoAnt/Extensions.EntityFrameworkCore
diff --git a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart.csproj b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart.csproj
index 8775a12..874d0c5 100644
--- a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart.csproj
+++ b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart.csproj
@@ -1,7 +1,7 @@
- Definitions Marmaid Flowchart. Entity Framework implementation
+ Render the entity definitions of an Entity Framework Core model as a Mermaid flowchart.
enable
diff --git a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/package.readme.md b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/package.readme.md
index c6c2204..36e645d 100644
--- a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/package.readme.md
+++ b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart/package.readme.md
@@ -1,3 +1,9 @@
# DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart
- Definitions Marmaid Flowchart. Entity Framework implementation
+Render the entity definitions of an Entity Framework Core model as a Mermaid flowchart.
+
+```sh
+dotnet add package DragoAnt.EntityDefinition.EntityFrameworkCore.Flowchart
+```
+
+Source, issues and releases: https://github.com/DragoAnt/Extensions.EntityFrameworkCore
diff --git a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational.csproj b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational.csproj
index b20c187..8d26ae7 100644
--- a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational.csproj
+++ b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational.csproj
@@ -1,7 +1,7 @@
- Definitions Entity Framework Core Relational implementation
+ Relational definitions (tables, columns, keys) for entity definitions built from an Entity Framework Core model.
enable
diff --git a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/package.readme.md b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/package.readme.md
index 97c17a6..d188055 100644
--- a/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/package.readme.md
+++ b/src/DragoAnt.EntityDefinition.EntityFrameworkCore.Relational/package.readme.md
@@ -1,3 +1,9 @@
# DragoAnt.EntityDefinition.EntityFrameworkCore.Relational
- Definitions Entity Framework Core Relational implementation
+Relational definitions (tables, columns, keys) for entity definitions built from an Entity Framework Core model.
+
+```sh
+dotnet add package DragoAnt.EntityDefinition.EntityFrameworkCore.Relational
+```
+
+Source, issues and releases: https://github.com/DragoAnt/Extensions.EntityFrameworkCore
diff --git a/src/DragoAnt.EntityDefinition.EntityFrameworkCore/DragoAnt.EntityDefinition.EntityFrameworkCore.csproj b/src/DragoAnt.EntityDefinition.EntityFrameworkCore/DragoAnt.EntityDefinition.EntityFrameworkCore.csproj
index 99f3406..ca2e36b 100644
--- a/src/DragoAnt.EntityDefinition.EntityFrameworkCore/DragoAnt.EntityDefinition.EntityFrameworkCore.csproj
+++ b/src/DragoAnt.EntityDefinition.EntityFrameworkCore/DragoAnt.EntityDefinition.EntityFrameworkCore.csproj
@@ -1,7 +1,7 @@
- Definitions Entity Framework Core implementation
+ Build entity definitions from an Entity Framework Core model and its CLR types.
enable
diff --git a/src/DragoAnt.EntityDefinition.EntityFrameworkCore/package.readme.md b/src/DragoAnt.EntityDefinition.EntityFrameworkCore/package.readme.md
index 7202ea7..9911321 100644
--- a/src/DragoAnt.EntityDefinition.EntityFrameworkCore/package.readme.md
+++ b/src/DragoAnt.EntityDefinition.EntityFrameworkCore/package.readme.md
@@ -1,3 +1,9 @@
# DragoAnt.EntityDefinition.EntityFrameworkCore
- Definitions Entity Framework Core implementation
+Build entity definitions from an Entity Framework Core model and its CLR types.
+
+```sh
+dotnet add package DragoAnt.EntityDefinition.EntityFrameworkCore
+```
+
+Source, issues and releases: https://github.com/DragoAnt/Extensions.EntityFrameworkCore
diff --git a/src/DragoAnt.EntityDefinition.Flowchart/DragoAnt.EntityDefinition.Flowchart.csproj b/src/DragoAnt.EntityDefinition.Flowchart/DragoAnt.EntityDefinition.Flowchart.csproj
index 2e8d823..0cd08cb 100644
--- a/src/DragoAnt.EntityDefinition.Flowchart/DragoAnt.EntityDefinition.Flowchart.csproj
+++ b/src/DragoAnt.EntityDefinition.Flowchart/DragoAnt.EntityDefinition.Flowchart.csproj
@@ -1,7 +1,7 @@
- Definitions Marmaid Flowchart
+ Render entity definitions as a Mermaid flowchart diagram of entities, properties and relations.
enable
@@ -15,16 +15,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartEntityOptions.cs b/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartEntityOptions.cs
deleted file mode 100644
index 64d38bb..0000000
--- a/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartEntityOptions.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-using Stenn.EntityDefinition.Contracts;
-using Stenn.EntityDefinition.Contracts.Definitions;
-
-namespace Stenn.EntityDefinition.Flowchart.Types
-{
- //TODO: Implement it for graph based on clr type system
-
- public sealed class FlowchartEntityOptions :FlowchartEntityOptionsBase, IFlowchartEntityOptions
- {
- ///
- DefinitionInfo IFlowchartEntityOptions.Id => Id;
-
- ///
- DefinitionInfo IFlowchartEntityOptions.Caption => Caption;
-
- ///
- DefinitionInfo IFlowchartEntityOptions.Type => Type;
-
- ///
- DefinitionInfo IFlowchartEntityOptions.BaseType => BaseType;
-
- ///
- DefinitionInfo IFlowchartEntityOptions.IsAbstract => IsAbstract;
-
- public Definition Id { get; set; } = EFCommonDefinitions.Entities.Name;
- public Definition Caption { get; set; } = EFCommonDefinitions.Entities.Name;
- public Definition Type { get; set; } = EFCommonDefinitions.Entities.EntityType;
- public Definition BaseType { get; set; } = EFCommonDefinitions.Entities.BaseEntityType;
- public Definition IsAbstract { get; set; } = EFCommonDefinitions.Entities.IsAbstract;
- }
-}
\ No newline at end of file
diff --git a/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartGraphBuilderOptions.cs b/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartGraphBuilderOptions.cs
deleted file mode 100644
index f910d8b..0000000
--- a/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartGraphBuilderOptions.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace Stenn.EntityDefinition.Flowchart.Types
-{
- public sealed class FlowchartGraphBuilderOptions : FlowchartGraphBuilderBaseOptions
- {
- }
-}
\ No newline at end of file
diff --git a/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartPropertyOptions.cs b/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartPropertyOptions.cs
deleted file mode 100644
index 06cbd2f..0000000
--- a/src/DragoAnt.EntityDefinition.Flowchart/Types/FlowchartPropertyOptions.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System;
-using Stenn.EntityDefinition.Contracts;
-using Stenn.EntityDefinition.Contracts.Definitions;
-
-namespace Stenn.EntityDefinition.Flowchart.Types
-{
- //TODO: Implement it for graph based on clr type system
-
- public sealed class FlowchartPropertyOptions : FlowchartPropertyOptionsBase, IFlowchartPropertyOptions
- {
- ///
- DefinitionInfo