summaryrefslogtreecommitdiff
path: root/makima/src
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-01-25 02:55:45 +0000
committersoryu <soryu@soryu.co>2026-01-25 03:53:14 +0000
commit9dc282e4777abf41178c44f14f8be3de1c725b10 (patch)
tree2a18dcd3bfaf0bc3a2c0734209d810e28bfcf2dc /makima/src
parent34bc1296a53d264216c12cbaa74ca9d68dfe8f22 (diff)
downloadsoryu-makima/dynamic-contract-templates.tar.gz
soryu-makima/dynamic-contract-templates.zip
feat: Update create contract modal to use dynamic templatesmakima/dynamic-contract-templates
- Add ContractTypeTemplate interface and listContractTypes API function to frontend api.ts - Add GET /api/v1/contract-types backend endpoint that returns built-in contract types (simple, specification) with their phases and defaults - Update create contract modal to fetch contract types dynamically when opened, with loading state and fallback to hardcoded types on error - Dynamically render contract type selection buttons from fetched types - Update phase dropdown to use phases from selected contract type - Replace static getValidPhases/getDefaultPhase calls with dynamic data Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'makima/src')
-rw-r--r--makima/src/server/handlers/templates.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/makima/src/server/handlers/templates.rs b/makima/src/server/handlers/templates.rs
index 6d95e86..5cad44f 100644
--- a/makima/src/server/handlers/templates.rs
+++ b/makima/src/server/handlers/templates.rs
@@ -7,6 +7,76 @@ use utoipa::ToSchema;
use crate::llm::templates;
use crate::llm::templates::ContractTypeTemplate;
+// =============================================================================
+// 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<String>,
+ /// 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<ContractTypeTemplate>,
+}
+
+/// 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 {