CODEX_ADK/BACKEND/CLAUDE.md
jean-philippe 3fae2fcbe1 Initial commit: CODEX_ADK (Svrnty Console) MVP v1.0.0
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>
2025-10-26 18:32:38 -04:00

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.