From b58a7a92f86784620bd5eb214d7f191c6f68f4d3 Mon Sep 17 00:00:00 2001 From: soryu Date: Sun, 25 Jan 2026 02:55:45 +0000 Subject: [WIP] Heartbeat checkpoint - 2026-01-25 02:55:45 UTC --- makima/src/server/handlers/templates.rs | 70 +++++++++++++++++++++++++++++++++ makima/src/server/mod.rs | 2 + 2 files changed, 72 insertions(+) (limited to 'makima/src/server') diff --git a/makima/src/server/handlers/templates.rs b/makima/src/server/handlers/templates.rs index 868d5b4..13d491e 100644 --- a/makima/src/server/handlers/templates.rs +++ b/makima/src/server/handlers/templates.rs @@ -6,6 +6,76 @@ use utoipa::ToSchema; use crate::llm::templates; +// ============================================================================= +// Contract Type Templates +// ============================================================================= + +/// Contract type template for API response +#[derive(Debug, Serialize, ToSchema)] +#[serde(rename_all = "camelCase")] +pub struct ContractTypeTemplate { + /// Template identifier (e.g., "simple", "specification") + pub id: String, + /// Display name + pub name: String, + /// Description of the contract type workflow + pub description: String, + /// Ordered list of phases for this contract type + pub phases: Vec, + /// Default starting phase + pub default_phase: String, + /// Whether this is a built-in type (always available) + pub is_builtin: bool, +} + +/// Response for listing contract types +#[derive(Debug, Serialize, ToSchema)] +pub struct ListContractTypesResponse { + pub types: Vec, +} + +/// List available contract type templates +#[utoipa::path( + get, + path = "/api/v1/contract-types", + responses( + (status = 200, description = "Contract types retrieved successfully", body = ListContractTypesResponse) + ), + tag = "contract-types" +)] +pub async fn list_contract_types() -> impl IntoResponse { + let types = vec![ + ContractTypeTemplate { + id: "simple".to_string(), + name: "Simple".to_string(), + description: "Plan \u{2192} Execute: Simple workflow with a plan document".to_string(), + phases: vec!["plan".to_string(), "execute".to_string()], + default_phase: "plan".to_string(), + is_builtin: true, + }, + ContractTypeTemplate { + id: "specification".to_string(), + name: "Specification".to_string(), + description: "Research \u{2192} Specify \u{2192} Plan \u{2192} Execute \u{2192} Review: Full specification-driven development with TDD".to_string(), + phases: vec![ + "research".to_string(), + "specify".to_string(), + "plan".to_string(), + "execute".to_string(), + "review".to_string(), + ], + default_phase: "research".to_string(), + is_builtin: true, + }, + ]; + + ( + StatusCode::OK, + Json(ListContractTypesResponse { types }), + ) + .into_response() +} + /// Query parameters for listing templates #[derive(Debug, Deserialize, ToSchema)] pub struct ListTemplatesQuery { diff --git a/makima/src/server/mod.rs b/makima/src/server/mod.rs index de20569..b4afa78 100644 --- a/makima/src/server/mod.rs +++ b/makima/src/server/mod.rs @@ -208,6 +208,8 @@ pub fn make_router(state: SharedState) -> Router { // Template endpoints .route("/templates", get(templates::list_templates)) .route("/templates/{id}", get(templates::get_template)) + // Contract type endpoints + .route("/contract-types", get(templates::list_contract_types)) // Settings endpoints .route( "/settings/repository-history", -- cgit v1.2.3