summaryrefslogtreecommitdiff
path: root/makima/src/bin/makima.rs
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-01-21 23:50:23 +0000
committersoryu <soryu@soryu.co>2026-01-21 23:50:23 +0000
commit7c5ff74616d23a4e35fb7f84d5292fd90e6cd7a8 (patch)
treed496267b1c18e15a1c8413f32abdbb5be2b9d618 /makima/src/bin/makima.rs
parent9e286c146e29e714b3b209b4d948d75cce179b05 (diff)
downloadsoryu-makima/task-task-dc119baa-dc119baa.tar.gz
soryu-makima/task-task-dc119baa-dc119baa.zip
Add dependency checking on daemon startupmakima/task-task-dc119baa-dc119baa
- Create setup module with check_dependencies() to verify Claude Code, git, and npm are installed - Add colored status output showing version info for each dependency - If Claude Code is missing and npm is available, offer to install it - Show OS-specific installation instructions for missing dependencies - Add --skip-setup-check flag to DaemonArgs for CI/CD environments - Check runs as step [0/5] before configuration loading Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'makima/src/bin/makima.rs')
-rw-r--r--makima/src/bin/makima.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/makima/src/bin/makima.rs b/makima/src/bin/makima.rs
index 67eefc6..3be6003 100644
--- a/makima/src/bin/makima.rs
+++ b/makima/src/bin/makima.rs
@@ -12,6 +12,7 @@ use makima::daemon::tui::{self, Action, App, ListItem, ViewType, TuiWsClient, Ws
use makima::daemon::config::{DaemonConfig, RepoEntry};
use makima::daemon::db::LocalDb;
use makima::daemon::error::DaemonError;
+use makima::daemon::setup;
use makima::daemon::task::{TaskConfig, TaskManager};
use makima::daemon::ws::{DaemonCommand, WsClient};
use tokio::process::Command;
@@ -72,6 +73,54 @@ async fn run_daemon(
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
eprintln!("=== Makima Daemon Starting ===");
+ // Check dependencies unless skipped
+ if !args.skip_setup_check {
+ eprintln!("[0/5] Checking dependencies...");
+ let dep_result = setup::check_dependencies().await;
+ setup::print_dependency_summary(&dep_result);
+
+ // Check for missing critical dependencies
+ if !dep_result.claude.installed {
+ let os = setup::OperatingSystem::detect();
+
+ // If npm is available, offer to install Claude Code
+ if dep_result.npm_available() {
+ eprintln!();
+ if setup::read_yes_no("Would you like to install Claude Code now?") {
+ match setup::install_claude_with_npm().await {
+ Ok(()) => {
+ eprintln!();
+ // Re-check to verify installation
+ let recheck = setup::check_dependencies().await;
+ if !recheck.claude.installed {
+ eprintln!("\x1b[31mClaude Code installation could not be verified.\x1b[0m");
+ eprintln!("Please try installing manually and restart the daemon.");
+ std::process::exit(1);
+ }
+ }
+ Err(e) => {
+ eprintln!("\x1b[31mFailed to install Claude Code: {}\x1b[0m", e);
+ setup::print_claude_install_instructions(os, true);
+ std::process::exit(1);
+ }
+ }
+ } else {
+ setup::print_claude_install_instructions(os, true);
+ std::process::exit(1);
+ }
+ } else {
+ setup::print_claude_install_instructions(os, false);
+ std::process::exit(1);
+ }
+ }
+
+ if !dep_result.git.installed {
+ let os = setup::OperatingSystem::detect();
+ setup::print_git_install_instructions(os);
+ std::process::exit(1);
+ }
+ }
+
// Build a temporary CLI struct for config loading
let cli = makima::daemon::cli::daemon::DaemonArgs {
config: args.config,
@@ -82,6 +131,7 @@ async fn run_daemon(
max_tasks: args.max_tasks,
log_level: args.log_level,
bubblewrap: args.bubblewrap,
+ skip_setup_check: args.skip_setup_check,
};
// Load configuration with CLI overrides