From 9dbc2c3199047609a9f8496fec07ecdb10aee73d Mon Sep 17 00:00:00 2001 From: soryu Date: Sun, 18 Jan 2026 18:55:04 +0000 Subject: Add pushed heartbeats and multi-question select --- makima/src/daemon/task/manager.rs | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'makima/src/daemon/task') diff --git a/makima/src/daemon/task/manager.rs b/makima/src/daemon/task/manager.rs index c3ccfa4..029d026 100644 --- a/makima/src/daemon/task/manager.rs +++ b/makima/src/daemon/task/manager.rs @@ -3665,10 +3665,11 @@ impl TaskManagerInner { _ = heartbeat_interval.tick(), if heartbeat_enabled => { // Create periodic heartbeat commit to preserve work-in-progress match self.create_heartbeat_commit(task_id, &working_dir).await { - Ok(sha) => { + Ok((sha, pushed)) => { + let status = if pushed { "pushed" } else { "local only" }; let msg = DaemonMessage::task_output( task_id, - format!("[Heartbeat] Created WIP checkpoint: {}\n", &sha[..8]), + format!("[Heartbeat] WIP checkpoint {} ({})\n", &sha[..8], status), false, ); let _ = ws_tx.send(msg).await; @@ -4151,12 +4152,12 @@ impl TaskManagerInner { } /// Create a heartbeat commit with all uncommitted changes (WIP checkpoint). - /// Returns the commit SHA on success, or an error message if nothing to commit. + /// Returns (commit SHA, push succeeded) on success, or an error message if nothing to commit. async fn create_heartbeat_commit( &self, task_id: Uuid, worktree_path: &std::path::Path, - ) -> Result { + ) -> Result<(String, bool), String> { // 1. Check for uncommitted changes using git status --porcelain let status_output = tokio::process::Command::new("git") .current_dir(worktree_path) @@ -4220,7 +4221,30 @@ impl TaskManagerInner { let sha = String::from_utf8_lossy(&sha_output.stdout).trim().to_string(); tracing::info!(task_id = %task_id, sha = %sha, "Created heartbeat commit"); - Ok(sha) + // 5. Push to remote (best effort - don't fail if push fails) + let push_output = tokio::process::Command::new("git") + .current_dir(worktree_path) + .args(["push"]) + .output() + .await; + + let pushed = match push_output { + Ok(output) if output.status.success() => { + tracing::info!(task_id = %task_id, sha = %sha, "Pushed heartbeat commit to remote"); + true + } + Ok(output) => { + let stderr = String::from_utf8_lossy(&output.stderr); + tracing::warn!(task_id = %task_id, sha = %sha, error = %stderr, "Failed to push heartbeat commit (commit saved locally)"); + false + } + Err(e) => { + tracing::warn!(task_id = %task_id, sha = %sha, error = %e, "Failed to run git push (commit saved locally)"); + false + } + }; + + Ok((sha, pushed)) } } -- cgit v1.2.3