This is the initial commit for the CODEX_ADK project, a full-stack AI agent management platform featuring: BACKEND (ASP.NET Core 8.0): - CQRS architecture with 6 commands and 7 queries - 16 API endpoints (all working and tested) - PostgreSQL database with 5 entities - AES-256 encryption for API keys - FluentValidation on all commands - Rate limiting and CORS configured - OpenAPI/Swagger documentation - Docker Compose setup (PostgreSQL + Ollama) FRONTEND (Flutter 3.x): - Dark theme with Svrnty branding - Collapsible sidebar navigation - CQRS API client with Result<T> error handling - Type-safe endpoints from OpenAPI schema - Multi-platform support (Web, iOS, Android, macOS, Linux, Windows) DOCUMENTATION: - Comprehensive API reference - Architecture documentation - Development guidelines for Claude Code - API integration guides - context-claude.md project overview Status: Backend ready (Grade A-), Frontend integration pending 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
291 lines
8.6 KiB
Markdown
291 lines
8.6 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Project Overview
|
|
|
|
Codex is a CQRS-based ASP.NET Core 8.0 Web API using the OpenHarbor.CQRS framework with a modular architecture powered by PoweredSoft modules.
|
|
|
|
## .NET Version Policy
|
|
|
|
**IMPORTANT**: This project uses .NET 8.0 LTS and should NOT be upgraded to .NET 9 or later versions without explicit approval. All projects must target `net8.0`.
|
|
|
|
## Docker Setup (Recommended)
|
|
|
|
This project uses Docker containers for PostgreSQL and Ollama:
|
|
|
|
```bash
|
|
# Start all services (PostgreSQL + Ollama)
|
|
docker-compose up -d
|
|
|
|
# Verify containers are running
|
|
docker ps
|
|
|
|
# Apply database migrations
|
|
dotnet ef database update --project Codex.Dal --connection "Host=localhost;Database=codex;Username=postgres;Password=postgres"
|
|
|
|
# Stop services
|
|
docker-compose down
|
|
|
|
# Reset database (CAUTION: deletes all data)
|
|
docker-compose down -v
|
|
docker-compose up -d
|
|
dotnet ef database update --project Codex.Dal --connection "Host=localhost;Database=codex;Username=postgres;Password=postgres"
|
|
```
|
|
|
|
**Services**:
|
|
- **PostgreSQL**: localhost:5432 (codex/postgres/postgres)
|
|
- **Ollama**: localhost:11434
|
|
|
|
**Important**: If you have a local PostgreSQL running on port 5432, stop it first:
|
|
```bash
|
|
brew services stop postgresql@14 # or your PostgreSQL version
|
|
```
|
|
|
|
### Ollama Model Management
|
|
|
|
```bash
|
|
# Pull a lightweight model for testing (1.6GB)
|
|
docker exec codex-ollama ollama pull phi
|
|
|
|
# List downloaded models
|
|
docker exec codex-ollama ollama list
|
|
|
|
# Test Ollama is working
|
|
curl http://localhost:11434/api/tags
|
|
```
|
|
|
|
## Building and Running
|
|
|
|
```bash
|
|
# Build the solution
|
|
dotnet build
|
|
|
|
# Run the API
|
|
dotnet run --project Codex.Api/Codex.Api.csproj
|
|
|
|
# Run tests (when test projects are added)
|
|
dotnet test
|
|
```
|
|
|
|
The API runs on:
|
|
- HTTP: http://localhost:5246
|
|
- HTTPS: https://localhost:7108
|
|
- Swagger UI (Development only): http://localhost:5246/swagger
|
|
|
|
## Architecture
|
|
|
|
### CQRS Pattern
|
|
This application strictly follows the Command Query Responsibility Segregation (CQRS) pattern:
|
|
|
|
- **Commands**: Handle write operations (create, update, delete). Execute business logic and persist data.
|
|
- **Queries**: Handle read operations. Always use `.AsNoTracking()` for read-only operations.
|
|
|
|
### Module System
|
|
The application uses PoweredSoft's module system (`IModule`) to organize features. Each module registers its services in the `ConfigureServices` method.
|
|
|
|
**Module Registration Flow**:
|
|
1. Create feature-specific modules (CommandsModule, QueriesModule, DalModule)
|
|
2. Register all modules in `AppModule`
|
|
3. Register `AppModule` in `Program.cs` via `services.AddModule<AppModule>()`
|
|
|
|
### Project Structure
|
|
- **Codex.Api**: API layer with controllers, Program.cs, and AppModule
|
|
- **Codex.CQRS**: Commands, queries, and business logic
|
|
- **Codex.Dal**: Data access layer with DbContext, entities, and query provider infrastructure
|
|
|
|
## Commands
|
|
|
|
Commands perform write operations and follow a strict 3-part structure:
|
|
|
|
**1. Command Definition** (record)
|
|
```csharp
|
|
public record MyCommand
|
|
{
|
|
// Properties
|
|
}
|
|
```
|
|
|
|
**2. Handler Implementation** (implements `ICommandHandler<TCommand>`)
|
|
```csharp
|
|
public class MyCommandHandler(DbContext dbContext) : ICommandHandler<MyCommand>
|
|
{
|
|
public async Task HandleAsync(MyCommand command, CancellationToken cancellationToken = default)
|
|
{
|
|
// Business logic
|
|
}
|
|
}
|
|
```
|
|
|
|
**3. Validation** (extends `AbstractValidator<TCommand>`)
|
|
```csharp
|
|
public class MyCommandValidator : AbstractValidator<MyCommand>
|
|
{
|
|
public MyCommandValidator()
|
|
{
|
|
// FluentValidation rules
|
|
}
|
|
}
|
|
```
|
|
|
|
**Registration**: All three components go in a single file and are registered together:
|
|
```csharp
|
|
services.AddCommand<MyCommand, MyCommandHandler, MyCommandValidator>();
|
|
```
|
|
|
|
## Queries
|
|
|
|
### Single Value Queries
|
|
Return a specific value (e.g., health check, lookup):
|
|
|
|
```csharp
|
|
public record MyQuery { }
|
|
|
|
public class MyQueryHandler : IQueryHandler<MyQuery, TResult>
|
|
{
|
|
public Task<TResult> HandleAsync(MyQuery query, CancellationToken cancellationToken = default)
|
|
{
|
|
// Return single value
|
|
}
|
|
}
|
|
|
|
// Registration
|
|
services.AddQuery<MyQuery, TResult, MyQueryHandler>();
|
|
```
|
|
|
|
### Paginated Queries
|
|
Return queryable lists with automatic filtering, sorting, pagination, and aggregates:
|
|
|
|
```csharp
|
|
// 1. Define the item structure
|
|
public record MyQueryItem
|
|
{
|
|
// Properties for each list item
|
|
}
|
|
|
|
// 2. Implement IQueryableProviderOverride<T>
|
|
public class MyQueryableProvider(DbContext dbContext) : IQueryableProviderOverride<MyQueryItem>
|
|
{
|
|
public Task<IQueryable<MyQueryItem>> GetQueryableAsync(object query, CancellationToken cancellationToken = default)
|
|
{
|
|
var result = dbContext.MyTable
|
|
.AsNoTracking() // ALWAYS use AsNoTracking for queries
|
|
.Select(x => new MyQueryItem { /* mapping */ });
|
|
|
|
return Task.FromResult(result);
|
|
}
|
|
}
|
|
|
|
// Registration
|
|
services.AddDynamicQuery<MyQueryItem>()
|
|
.AddQueryableProviderOverride<MyQueryItem, MyQueryableProvider>();
|
|
```
|
|
|
|
**IMPORTANT**: Paginated queries return `IQueryable<T>`. The framework handles actual query execution, pagination, filtering, and sorting.
|
|
|
|
## Data Access Layer Setup
|
|
|
|
The DAL requires specific infrastructure files for the CQRS query system to work properly:
|
|
|
|
### Required Files
|
|
|
|
1. **IQueryableProviderOverride.cs**: Interface for custom query providers
|
|
2. **ServiceCollectionExtensions.cs**: Extension to register query provider overrides
|
|
3. **DefaultQueryableProvider.cs**: Default provider that checks for overrides
|
|
4. **InMemoryQueryableHandlerService.cs**: Handler for in-memory queryables
|
|
5. **DalModule.cs**: Module to register DAL services
|
|
|
|
All code examples for these files are in `.context/dal-context.md`.
|
|
|
|
### DbContext
|
|
Create your DbContext with EF Core and use migrations for schema management:
|
|
```bash
|
|
# Add a new migration
|
|
dotnet ef migrations add <MigrationName> --project Codex.Dal
|
|
|
|
# Update database
|
|
dotnet ef database update --project Codex.Dal
|
|
```
|
|
|
|
### OpenAPI Documentation Export
|
|
After adding or modifying commands/queries with XML documentation:
|
|
```bash
|
|
# Build and export OpenAPI specification
|
|
dotnet build
|
|
./export-openapi.sh
|
|
|
|
# This generates docs/openapi.json for frontend integration
|
|
```
|
|
|
|
## API Configuration (Program.cs)
|
|
|
|
Required service registrations:
|
|
```csharp
|
|
// PoweredSoft & CQRS
|
|
builder.Services.AddPoweredSoftDataServices();
|
|
builder.Services.AddPoweredSoftEntityFrameworkCoreDataServices();
|
|
builder.Services.AddPoweredSoftDynamicQuery();
|
|
builder.Services.AddDefaultCommandDiscovery();
|
|
builder.Services.AddDefaultQueryDiscovery();
|
|
|
|
// Validation
|
|
builder.Services.AddFluentValidation();
|
|
|
|
// Module registration
|
|
builder.Services.AddModule<AppModule>();
|
|
|
|
// Controllers with OpenHarbor CQRS integration
|
|
var mvcBuilder = builder.Services
|
|
.AddControllers()
|
|
.AddJsonOptions(jsonOptions =>
|
|
{
|
|
jsonOptions.JsonSerializerOptions.Converters.Insert(0, new JsonStringEnumConverter());
|
|
});
|
|
|
|
mvcBuilder.AddOpenHarborCommands();
|
|
mvcBuilder.AddOpenHarborQueries()
|
|
.AddOpenHarborDynamicQueries();
|
|
```
|
|
|
|
**Note**: Controllers (not minimal APIs) are required for OpenHarbor CQRS integration.
|
|
|
|
## Key Dependencies
|
|
|
|
- **OpenHarbor.CQRS**: CQRS framework core
|
|
- **OpenHarbor.CQRS.AspNetCore.Mvc**: MVC integration for commands/queries
|
|
- **OpenHarbor.CQRS.DynamicQuery.AspNetCore**: Dynamic query support
|
|
- **OpenHarbor.CQRS.FluentValidation**: FluentValidation integration
|
|
- **PoweredSoft.Module.Abstractions**: Module system
|
|
- **PoweredSoft.Data.EntityFrameworkCore**: Data access abstractions
|
|
- **PoweredSoft.DynamicQuery**: Dynamic query engine
|
|
- **FluentValidation.AspNetCore**: Validation
|
|
|
|
## Development Guidelines
|
|
|
|
1. **Query Performance**: Always use `.AsNoTracking()` for read-only queries
|
|
2. **File Organization**: Place command/handler/validator in the same file
|
|
3. **Validation**: All commands must have validators (even if empty)
|
|
4. **Modules**: Group related commands/queries into feature modules
|
|
5. **XML Documentation**: Add XML comments to all commands/queries for OpenAPI generation
|
|
6. **OpenAPI Export**: Run `./export-openapi.sh` after API changes to update frontend specs
|
|
7. **CORS**: Configure allowed origins in appsettings for different environments
|
|
8. **HTTPS**: Only enforced in non-development environments
|
|
|
|
# 🔒 MANDATORY CODING STANDARDS
|
|
|
|
## Strict Typing - NO EXCEPTIONS
|
|
|
|
See [.claude-docs/strict-typing.md](.claude-docs/strict-typing.md) for complete typing requirements.
|
|
|
|
---
|
|
|
|
## 🗣️ Response Protocol
|
|
|
|
See [.claude-docs/response-protocol.md](.claude-docs/response-protocol.md) for complete protocol details.
|
|
|
|
---
|
|
|
|
## 📡 Frontend Integration
|
|
|
|
See [.claude-docs/frontend-api-integration.md](.claude-docs/frontend-api-integration.md) for complete API integration specifications for frontend teams.
|