From 3ea2c72e2c50c0d73614d9ac82f41508b6ab1ce4 Mon Sep 17 00:00:00 2001 From: soryu Date: Sat, 31 Jan 2026 22:17:09 +0000 Subject: Add auto_merge_local option for local-only contracts (#50) When local_only=true on a contract, all completion actions are skipped. This adds a new option auto_merge_local that, when enabled along with local_only, will automatically merge completed task changes to the master/main branch locally (without pushing or creating PRs). Changes: - Add auto_merge_local column to contracts table (migration) - Add auto_merge_local field to Contract model and summary - Update CreateContractRequest and UpdateContractRequest structs - Update contract repository create/update functions - Add auto_merge_local to WebSocket protocol StartTask command - Pass auto_merge_local through spawn_task and run_task functions - Modify task manager completion logic: if local_only=true AND auto_merge_local=true, execute 'merge' completion action locally - Update all server handlers to retrieve and pass auto_merge_local - Add TypeScript types to frontend components Co-authored-by: Claude Opus 4.5 --- makima/src/server/handlers/contract_chat.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'makima/src/server/handlers/contract_chat.rs') diff --git a/makima/src/server/handlers/contract_chat.rs b/makima/src/server/handlers/contract_chat.rs index a066595..b5255f5 100644 --- a/makima/src/server/handlers/contract_chat.rs +++ b/makima/src/server/handlers/contract_chat.rs @@ -1571,14 +1571,14 @@ async fn handle_contract_request( } }; - // Get local_only from contract if task has one - let local_only = if let Some(contract_id) = task.contract_id { + // Get local_only and auto_merge_local from contract if task has one + let (local_only, auto_merge_local) = if let Some(contract_id) = task.contract_id { match repository::get_contract_for_owner(pool, contract_id, owner_id).await { - Ok(Some(contract)) => contract.local_only, - _ => false, + Ok(Some(contract)) => (contract.local_only, contract.auto_merge_local), + _ => (false, false), } } else { - false + (false, false) }; // Send SpawnTask command to daemon @@ -1604,6 +1604,7 @@ async fn handle_contract_request( patch_data: None, patch_base_sha: None, local_only, + auto_merge_local, supervisor_worktree_task_id: None, // Not spawned by supervisor }; @@ -2593,6 +2594,7 @@ async fn handle_contract_request( autonomous_loop: None, phase_guard: None, local_only: None, + auto_merge_local: None, red_team_enabled: None, red_team_prompt: None, template_id: None, -- cgit v1.2.3