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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -418,8 +418,8 @@ applyTo: '**/*'
- **Communication Rules:**
- All communication must go through Contract interfaces and proxy implementations
- Use fastest appropriate protocol: in-process DI → gRPC → HTTP/2 → message queues
- Prevent direct sibling communication; use message bus or mediator patterns
- Implement circuit breakers and retry policies in all external communications
- Prevent direct sibling communication; Use parent component; If manager use message bus;
- Implement circuit breakers and retry policies in all communications
- **Composition over Inheritance:** Compose behaviors to keep components focused and testable

### Cross-Cutting Concerns
Expand Down Expand Up @@ -462,7 +462,8 @@ applyTo: '**/*'
- **Production:** Live production environment
- **Configuration Management:** Use environment-specific `AppSettings.json` files:
- `AppSettings.json` (base configuration)
- `AppSettings.Development.json` (development overrides)
- `AppSettings.Local.json` (local environment)
- `AppSettings.Development.json` (development environment)
- `AppSettings.Testing.json` (testing environment)
- `AppSettings.Staging.json` (staging environment)
- `AppSettings.Production.json` (production environment)
Expand Down
16 changes: 10 additions & 6 deletions .github/csharp.instructions.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
---
---
# 🔧 Copilot Instruction Metadata
version: 1.0.0
schema: 1
Expand Down Expand Up @@ -36,10 +36,10 @@ Applies to `.cs`, `.razor`, `.csproj`, and `.sln` files.
- Address nullable reference warnings (CS8602) with proper null checks.

## Project Structure
- **Central Package Management**: Currently disabled (`ManagePackageVersionsCentrally=false`).
- **Central Package Management**: Currently enabled (`ManagePackageVersionsCentrally=true`).
- **Solution structure**: Standard .sln file excludes WinUI packaging project (.wapproj).
- **Dependencies**: `Directory.Build.props` defines common properties and version variables.
- **Package versions**: Orleans 9.2.1, Aspire 9.5.2, MSTest 4.0.1, FluentAssertions 8.8.0.
- **Package versions**: Orleans (latest), Aspire (latest), MSTest (latest), FluentAssertions (latest).

## Extension Methods Pattern
- Create static extension classes in dedicated `Model.Extensions/` project.
Expand All @@ -49,14 +49,18 @@ Applies to `.cs`, `.razor`, `.csproj`, and `.sln` files.
- Extension methods enable testability without modifying core models.

## Testing
- Use MSTest 4.0.1 for all unit and integration tests.
- Use MSTest (latest) for all unit and integration tests.
- Use `[TestMethod]` with `[DataRow(...)]` for data-driven tests.
- Use FluentAssertions 8.8.0 for readable assertions.
- Use FluentAssertions (latest) for readable assertions.
- Use `[TestInitialize]` and `[TestCleanup]` for setup/teardown.
- Follow Arrange-Act-Assert structure.
- Organize tests with `#region` blocks for logical grouping.
- Multi-target tests: Ensure coverage on both net8.0 and net10.0.

## 📝 Changelog
### 1.0.0 (2025-10-03)
- Added metadata header (initial versioning schema).
- Added metadata header (initial versioning schema).

### 1.1.0 (2025-10-10)
- Established C#/.NET coding standards and best practices.
- Improved project structure and organization.
6 changes: 3 additions & 3 deletions .nuget/NuGet/NuGet.config
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />

<!-- GitHub Packages feed -->
<add key="github" value="https://nuget.pkg.github.com/OWNER/index.json" />
<!--<add key="github" value="https://nuget.pkg.github.com/OWNER/index.json" />-->
</packageSources>

<packageSourceCredentials>
<!--<packageSourceCredentials>
<github>
<add key="Username" value="OWNER" />
<add key="ClearTextPassword" value="YOUR_GITHUB_PAT" />
</github>
</packageSourceCredentials>
</packageSourceCredentials>-->
</configuration>
10 changes: 3 additions & 7 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<!-- <TargetFrameworks>net8.0;net10.0</TargetFrameworks> -->
<TargetFramework>net8.0</TargetFramework>
<OutputType>Library</OutputType>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
Expand All @@ -13,8 +13,8 @@

<!-- NuGet Package Settings -->
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>Ivan Jones</Authors>
<Company>Visionary Coder LLC</Company>
<Authors>Visionary Coder</Authors>
<Company>Visionary Coder</Company>
<Copyright>Copyright © $([System.DateTime]::Now.Year)</Copyright>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
Expand Down Expand Up @@ -60,8 +60,4 @@
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Nerdbank.GitVersioning" PrivateAssets="all" />
</ItemGroup>

</Project>
12 changes: 0 additions & 12 deletions Directory.Build.targets
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,4 @@
<Copy SourceFiles="@(GeneratedPackages)" DestinationFolder="$(MSBuildProjectDirectory)\.nupkgs\" SkipUnchangedFiles="true" />
<Copy SourceFiles="@(GeneratedSymbols)" DestinationFolder="$(MSBuildProjectDirectory)\.nupkgs\" SkipUnchangedFiles="true" />
</Target>

<!-- Test Project Package References -->
<ItemGroup Condition="'$(IsTestProject)' == 'true'">
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="MSTest.TestFramework" />
<PackageReference Include="MSTest.TestAdapter" />
<PackageReference Include="MSTest.Analyzers" />
<PackageReference Include="FluentAssertions" />
<PackageReference Include="Moq" />
<PackageReference Include="coverlet.collector" />
<PackageReference Include="coverlet.msbuild" />
</ItemGroup>
</Project>
67 changes: 35 additions & 32 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,43 @@
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<!-- Core Framework Dependencies -->
<PackageVersion Include="Azure.Identity" Version="1.15.0" />
<PackageVersion Include="Azure.Security.KeyVault.Secrets" Version="4.7.0" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.25.0" />
<PackageVersion Include="FluentFTP" Version="53.0.2" />
<PackageVersion Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.3.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.10" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.FileExtensions" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="8.3.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.9" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.14.0" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.14.0" />
<PackageVersion Include="NJsonSchema" Version="11.5.1" />
<PackageVersion Include="Polly" Version="8.6.4" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.14.0" />

<!-- Test Framework Dependencies -->
<PackageVersion Include="Azure.Core" Version="1.50.0" />
<PackageVersion Include="Azure.Data.Tables" Version="12.11.0" />
<PackageVersion Include="Azure.Identity" Version="1.17.0" />
<PackageVersion Include="Azure.Security.KeyVault.Secrets" Version="4.8.0" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.26.0" />
<PackageVersion Include="Azure.Storage.Queues" Version="12.24.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="coverlet.msbuild" Version="6.0.4" />
<PackageVersion Include="FluentAssertions" Version="8.8.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.8" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="FluentFTP" Version="53.0.2" />
<PackageVersion Include="FluentValidation" Version="12.1.0" />
<PackageVersion Include="Google.Protobuf" Version="3.33.1" />
<PackageVersion Include="Grpc.Net.Client" Version="2.71.0" />
<PackageVersion Include="Grpc.Net.ClientFactory" Version="2.32.0" />
<PackageVersion Include="Grpc.Tools" Version="2.32.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Abstractions" Version="8.0.22" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.22" />
<PackageVersion Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
<PackageVersion Include="Microsoft.OpenApi" Version="3.0.0" />
<PackageVersion Include="Moq" Version="4.20.72" />
<PackageVersion Include="MSTest.Analyzers" Version="3.10.2" />
<PackageVersion Include="MSTest.TestAdapter" Version="3.10.2" />
<PackageVersion Include="MSTest.TestFramework" Version="3.10.2" />
<PackageVersion Include="MSTest.Analyzers" Version="4.0.2" />
<PackageVersion Include="MSTest.TestAdapter" Version="4.0.2" />
<PackageVersion Include="MSTest.TestFramework" Version="4.0.2" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Polly.Caching.Memory" Version="3.0.2" />
<PackageVersion Include="Polly.Caching.MemoryCache" Version="1.1.0" />
<PackageVersion Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" />
<PackageVersion Include="Polly.Core" Version="8.6.4" />
<PackageVersion Include="Polly.Extensions" Version="8.6.4" />
<PackageVersion Include="Polly.RateLimiting" Version="8.6.4" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.14.0" />
<PackageVersion Include="System.Text.Json" Version="10.0.0" />
</ItemGroup>
</Project>
</Project>
83 changes: 39 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
[![NuGet](https://img.shields.io/nuget/v/VisionaryCoder.Framework.Core.svg)](https://www.nuget.org/packages/VisionaryCoder.Framework.Core)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

A modular, enterprise-grade framework starting with a single foundational library (`VisionaryCoder.Framework`) and accompanying test project. The repository emphasizes **clean, reproducible, and automated development** with .NET 8 (ready for forward compatibility to .NET 10). Future packages will evolve incrementally via ADRs.
A modular, enterprise-grade framework starting from a single foundational library. This repository contains the source, documentation, samples and tests for the VisionaryCoder Framework ecosystem.

---

## 🚀 Quickstart

```bash
# Clone
git clone https://github.com/visionarycoder/vc.git
cd vc
git clone https://github.com/visionarycoder/Framework.git
cd Framework

# Restore
dotnet restore VisionaryCoder.Framework.sln
Expand All @@ -25,64 +25,59 @@ dotnet test VisionaryCoder.Framework.sln --configuration Release

---

## 📦 Current Solution Contents
## 📦 Solution Overview

| Project | Type | Description |
|---------|------|-------------|
| `VisionaryCoder.Framework` | Library | Core framework primitives (configuration, results, options, providers, proxy abstractions). |
| `VisionaryCoder.Framework.Tests` | Test Project | Unit tests validating core behaviors (results, request/correlation IDs, options). |
This repository currently contains a single main library that aggregates foundational capabilities. The intent is to progressively decompose this monolith into smaller packages (see ADRs and roadmap in `docs/`), and this README serves as the top-level index linking to module-level READMEs and developer guidance to make that process easier.

Planned future packages (tracked via ADRs) will be introduced gradually rather than pre-listed. See ADR index for roadmap context.
### Projects

## 🗃️ Repository Structure (High-Level)
- `src/VisionaryCoder.Framework` — Core library and shared utilities (see `src/VisionaryCoder.Framework/README.md`)
- `tests/VisionaryCoder.Framework.Tests` — Unit tests validating framework behaviors

```text
/.copilot # Modular AI assistant instruction set (base + C# + patterns + standards)
/docs # Documentation (ADRs, best-practices capsules, diagrams, reviews, onboarding)
/src/VisionaryCoder.Framework # Core library source
/tests/VisionaryCoder.Framework.Tests # Unit tests
/.github # Global Copilot instructions & workflows
```
### Module READMEs (entry points)

---
- Core project README: `src/VisionaryCoder.Framework/README.md`
- Filtering subsystem: `src/VisionaryCoder.Framework/Filtering/README.md`
- Querying serialization & helpers: `src/VisionaryCoder.Framework/Querying/README.md`
- Documentation and architecture decisions: `docs/` (ADRs, best-practices, diagrams)

## 🏗️ Architecture Overview
Use these module READMEs as the canonical documentation when splitting the project into multiple packages.

The framework follows **Volatility-Based Decomposition (VBD)** principles. While the current library aggregates foundational concerns, future decomposition will create distinct Manager, Engine, and Accessor component packages as volatility boundaries emerge.
## 🗃️ Repository Structure (High-Level)

Core library already enforces:
```text
/.copilot
/docs
/src/VisionaryCoder.Framework
├─ Filtering/
├─ Querying/
└─ VisionaryCoder.Framework.csproj
/tests/VisionaryCoder.Framework.Tests
/.github
```

- Contract-first abstractions for providers & proxies
- Structured result + request/correlation context handling
- Dependency injection integration & options binding
- Early extensibility points for caching, security, querying
## 📚 Documentation & Roadmap

---
- Architectural Decision Records (ADRs): `docs/adr/index.md`
- Design diagrams and best-practice capsules: `docs/*`
- Roadmap notes: `docs/reviews/*`

## 📚 Documentation & Guidance
## 🧭 How to subdivide this repo (next steps)

- **ADRs**: `docs/adr/index.md` (recent: ADR-0004 modular Copilot instructions)
- **Best Practices Capsules**: `docs/best-practices/*/readme.md` (architecture, security, observability, etc.)
- **Copilot Instructions**: `.github/copilot-instructions.md` (enterprise baseline) and `.copilot/copilot-instructions.md` (modular hub)
- **Design Patterns Guidance**: `.copilot/design-patterns.instructions.md`
- **C# Generation Heuristics**: `.copilot/csharp.instructions.md`
- **Repository Standards**: `.copilot/repo-standards.md`
If you plan to split this repository into multiple packages, follow these high-level steps:

## 🤝 Contributing
1. Identify volatility boundaries using VBD (Volatility-Based Decomposition). Good candidates: Filtering, Querying/Serialization, Execution Strategies, POCO helpers, EFCore adapters.
2. Create new projects under `src/` for each package and move code with one-class-per-file, preserving namespaces (e.g., `VisionaryCoder.Framework.Filtering.Abstractions`).
3. Keep `IFilterExecutionStrategy` and other small provider-agnostic interfaces in their own `*.Abstractions` package to avoid circular references.
4. Introduce `VisionaryCoder.Framework.*.csproj` projects with clear dependencies and update solution file.
5. Add module README files (use those in this repo as templates) and ADRs to justify the split.

Contributions are welcome—please open an issue or ADR proposal before large architectural changes. Align new code with:
## 🤝 Contributing

1. Naming & layering rules (see global Copilot instructions)
2. Volatility boundaries (introduce new packages only when volatility justifies extraction)
3. Modular instruction consistency (update domain index + ADR when extending guidance)
Contributions are welcome. Please open an issue or ADR proposal for large architectural changes. Keep PRs focused and update module READMEs when moving code.

---

## 📄 License
This document is the canonical solution-level index. See module READMEs for implementation details and examples.

MIT License – see [LICENSE](LICENSE).

Copyright (c) 2025 VisionaryCoder

---
Last synchronized with solution structure: 2025-11-14
Loading
Loading