syntaxis/docs/core/architecture.md
Jesús Pérez 9cef9b8d57 refactor: consolidate configuration directories
Merge _configs/ into config/ for single configuration directory.
Update all path references.

Changes:
- Move _configs/* to config/
- Update .gitignore for new patterns
- No code references to _configs/ found

Impact: -1 root directory (layout_conventions.md compliance)
2025-12-26 18:36:23 +00:00

347 lines
9.9 KiB
Markdown

# Syntaxis - Architecture Guide
Detailed technical architecture and implementation guide for the Syntaxis system, including comprehensive task management and feature implementation.
---
## 📐 System Architecture
```
┌─────────────────────────────────────────────────────────────┐
│ User Interfaces │
├──────────────────────────┬──────────────────────────────────┤
│ Terminal UI (TUI) │ Web Dashboard (React/Vue) │
│ - ratatui 0.25 │ - Responsive design │
│ - crossterm 0.27 │ - Advanced filtering │
│ - Vim-style keys │ - Mouse & keyboard │
└──────────────────────────┴──────────────────────────────────┘
│ │
└──────────────┬───────────────┘
┌─────────────────▼────────────────────┐
│ REST API Server (Axum) │
│ - syntaxis-api │
│ - Authentication & validation │
│ - Rate limiting & metrics │
└─────────────────┬────────────────────┘
┌─────────────────▼────────────────────┐
│ Application Core │
│ - syntaxis-core │
│ - Phase, Tool, Checklist mgmt │
│ - Project state management │
└─────────────────┬────────────────────┘
┌─────────────────▼────────────────────┐
│ Data Layer │
│ - SQLite/PostgreSQL/SurrealDB │
│ - Configuration files (TOML) │
└──────────────────────────────────────┘
```
---
## 🗂️ Crate Organization
### Core Components
#### `syntaxis-core` - Domain Logic
The heart of the system, containing all business logic:
**Modules:**
- **`phase.rs`**: Phase management (creation, transitions, validation)
- **`tool.rs`**: Tool management (enable/disable, dependencies)
- **`checklist.rs`**: Checklist tracking (per-phase progress)
- **`config.rs`**: Configuration management (TOML parsing)
- **`error.rs`**: Error handling with custom error types
**Responsibilities:**
- State management
- Validation rules
- Business logic enforcement
#### `syntaxis-api` - REST API Server
HTTP interface for all clients (TUI, Dashboard):
**Modules:**
- **`handlers.rs`**: Endpoint handlers for projects, tasks, checklists
- **`models.rs`**: API request/response models (DTOs)
- **`middleware.rs`**: CORS, logging, rate limiting
- **`db.rs`**: Database connection and queries
**Endpoints:**
```
GET /api/projects # List all projects
GET /api/projects/:id # Get project details
POST /api/projects # Create project
GET /api/projects/:id/status # Get project status
GET /api/projects/:id/security # Security assessment
GET /api/projects/:id/checklists# Get tasks/checklists
POST /api/projects/:id/checklists# Create task
```
#### `syntaxis-tui` - Terminal Interface
Ratatui-based TUI for command-line users:
**Modules:**
- **`app.rs`**: Application state machine
- **`ui.rs`**: Rendering functions
- **`events.rs`**: Keyboard/terminal events
- **`api.rs`**: HTTP client to REST API
- **`types.rs`**: Data models (DTOs, enums)
- **`main.rs`**: Event loop and initialization
#### `syntaxis-dashboard` - Web Interface
Web-based dashboard for team collaboration:
**Modules:**
- **`components/`**: React/Vue components
- **`filters.rs`**: Filtering engine
- **`types.rs`**: Shared data models
- **`api.rs`**: HTTP client
---
## 🎯 Task Management Implementation
### Data Models
#### Priority and Type Enums
**File**: `crates/syntaxis-tui/src/types.rs`
```rust
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskPriority {
Critical, // 🔴 - Exit code: 0
High, // 🟠 - Exit code: 1
Medium, // 🟡 - Exit code: 2 (default)
Low, // 🟢 - Exit code: 3
}
impl Default for TaskPriority {
fn default() -> Self {
Self::Medium
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskType {
Feature, // ⭐
BugFix, // 🐛
Documentation, // 📚
Testing, // ✔
Deployment, // 🚀
Maintenance, // 🔧
}
impl Default for TaskType {
fn default() -> Self {
Self::Feature
}
}
```
#### Extended ChecklistItemDto
```rust
pub struct ChecklistItemDto {
pub id: String,
pub task_id: String,
pub description: String,
pub completed: bool,
pub completed_at: Option<String>,
pub created_at: String,
#[serde(default)]
pub priority: TaskPriority, // NEW - with default
#[serde(default, rename = "type")]
pub task_type: TaskType, // NEW - with default
}
```
**Backward Compatibility**: Both `priority` and `task_type` use `#[serde(default)]` to maintain compatibility with older API versions that don't return these fields.
### Sort Options Implementation
**File**: `crates/syntaxis-tui/src/app.rs`
```rust
pub(crate) enum TaskSortOption {
CreatedNewest, // By creation date, descending
CreatedOldest, // By creation date, ascending
PriorityHighest, // NEW: Critical → High → Medium → Low
PriorityLowest, // NEW: Low → Medium → High → Critical
CompletedFirst, // Completed first, then pending
PendingFirst, // Pending first, then completed
}
impl TaskSortOption {
pub(crate) fn all() -> Vec<Self> {
vec![
Self::CreatedNewest,
Self::CreatedOldest,
Self::PriorityHighest,
Self::PriorityLowest,
Self::CompletedFirst,
Self::PendingFirst,
]
}
pub(crate) fn label(&self) -> &str {
match self {
Self::CreatedNewest => "Newest First",
Self::CreatedOldest => "Oldest First",
Self::PriorityHighest => "Highest Priority",
Self::PriorityLowest => "Lowest Priority",
Self::CompletedFirst => "Completed First",
Self::PendingFirst => "Pending First",
}
}
}
```
### Statistics Calculation
**File**: `crates/syntaxis-tui/src/app.rs`
```rust
impl App {
pub(crate) fn calculate_statistics(&self) -> (usize, usize, usize, f64) {
let total = self.tasks.len();
let completed = self.tasks.iter()
.filter(|t| t.completed)
.count();
let pending = total - completed;
let completion_percentage = if total > 0 {
(completed as f64 / total as f64) * 100.0
} else {
0.0
};
(total, completed, pending, completion_percentage)
}
}
```
---
## 🔄 Design Patterns
### State Separation (R-STATE-SEPARATION)
Application state is separated from rendering:
```
App State (app.rs)
Filtered & Sorted Tasks (in-memory)
Rendering Functions (ui.rs)
Terminal Output
```
### Enum-Based Filtering (Type-Safe)
Instead of string comparisons, use Rust enums:
```rust
// ❌ NOT idiomatic
if task.priority == "high" { ... }
// ✅ Type-safe with Rust enums
match task.priority {
TaskPriority::High => { ... }
_ => { ... }
}
```
### Default Trait Implementation
New fields have sensible defaults for backward compatibility:
```rust
impl Default for TaskPriority {
fn default() -> Self {
Self::Medium // Reasonable default
}
}
```
---
## 🧪 Testing Strategy
### Test Coverage
All critical paths are tested comprehensively with unit tests across TUI and dashboard components.
### Unit Test Examples
```rust
#[test]
fn test_sort_by_priority_highest() {
// Verify priority sorting order
}
#[test]
fn test_statistics_calculation() {
// Verify statistics math
}
```
---
## 🔐 Error Handling
All errors handled with `Result<T, E>` and `?` operator:
```rust
// ✅ Idiomatic Rust
let task = self.tasks.first().ok_or(AppError::NoTasks)?;
```
---
## 📦 Key Dependencies
| Dependency | Version | Purpose |
|------------|---------|---------|
| **ratatui** | 0.25 | Terminal UI framework |
| **crossterm** | 0.27 | Cross-platform terminal |
| **tokio** | 1.x | Async runtime |
| **serde** | 1.0 | Serialization |
| **thiserror** | 2.0 | Error handling |
---
## 🚀 Performance
- **Sorting**: O(n log n) in-place with Rust's native `sort_by()`
- **Filtering**: O(n) single pass through tasks
- **UI Rendering**: Only changed areas redrawn (dirty flag optimization)
- **Memory**: Tasks stored in-memory as Vec for fast access
---
## 🔄 Backward Compatibility
All new fields use `#[serde(default)]` to maintain compatibility with older API versions:
```json
// Old API response (still works with new code)
{
"id": "task_1",
"description": "Do something",
"completed": false,
"created_at": "2025-11-14"
// priority & task_type missing → use defaults
}
```
---
**Status**: Production Ready ✅