use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Language { pub id: String, pub name: String, pub tagline: String, pub strengths: Vec, pub weaknesses: Vec, pub best_for: Vec, pub ecosystem: String, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Library { pub name: String, pub lang: String, pub domain: String, pub purpose: String, pub url: Option, pub note: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Stack { pub language: String, pub framework: Option, pub libraries: Vec, pub rationale: String, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Requirement { pub key: String, pub value: String, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct PlanTask { pub id: String, pub title: String, pub description: String, pub depends_on: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Milestone { pub name: String, pub goal: String, pub tasks: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ProjectPlan { pub name: String, pub description: String, pub project_type: String, pub audience: String, pub scale: String, pub requirements: Vec, pub stack: Stack, pub libraries: Vec, pub architecture: String, pub file_tree: Vec, pub milestones: Vec, pub coding_standards: Vec, pub risks: Vec, pub template: Option, pub created_at: String, #[serde(default)] pub ai_assistance: Option, #[serde(default)] pub language_guidance: Option, #[serde(default)] pub domain: String, #[serde(default)] pub domain_guidance: Option, #[serde(default)] pub pitfalls: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TemplateManifest { pub name: String, pub slug: String, pub description: String, pub category: String, pub default_language: String, pub default_stack: Vec, pub tags: Vec, }