Claude WIP

This commit is contained in:
Louis Knight-Webb
2025-06-16 20:06:15 -04:00
parent a0378da1e3
commit 18db6be0f2
5 changed files with 90 additions and 10 deletions

View File

@@ -5,7 +5,7 @@ use tokio::io::{AsyncBufReadExt, BufReader};
use ts_rs::TS;
use uuid::Uuid;
use crate::executors::EchoExecutor;
use crate::executors::{EchoExecutor, ClaudeExecutor};
#[derive(Debug)]
pub enum ExecutorError {
@@ -124,6 +124,7 @@ pub trait Executor: Send + Sync {
#[ts(export)]
pub enum ExecutorConfig {
Echo,
Claude,
// Future executors can be added here
// Shell { command: String },
// Docker { image: String, command: String },
@@ -133,12 +134,14 @@ impl ExecutorConfig {
pub fn create_executor(&self) -> Box<dyn Executor> {
match self {
ExecutorConfig::Echo => Box::new(EchoExecutor),
ExecutorConfig::Claude => Box::new(ClaudeExecutor),
}
}
pub fn executor_type(&self) -> &'static str {
match self {
ExecutorConfig::Echo => "echo",
ExecutorConfig::Claude => "claude",
}
}
}

View File

@@ -0,0 +1,56 @@
use async_trait::async_trait;
use tokio::process::{Child, Command};
use uuid::Uuid;
use crate::executor::{Executor, ExecutorError};
use crate::models::task::Task;
/// An executor that uses Claude CLI to process tasks
pub struct ClaudeExecutor;
#[async_trait]
impl Executor for ClaudeExecutor {
fn executor_type(&self) -> &'static str {
"claude"
}
async fn spawn(
&self,
pool: &sqlx::PgPool,
task_id: Uuid,
worktree_path: &str,
) -> Result<Child, ExecutorError> {
// Get the task to fetch its description
let task = Task::find_by_id(pool, task_id)
.await?
.ok_or(ExecutorError::TaskNotFound)?;
let prompt = format!(
"Task: {}\n\nDescription: {}\n\nWorking directory: {}",
task.title,
task.description
.as_deref()
.unwrap_or("No description provided"),
worktree_path
);
// Use Claude CLI to process the task
let child = Command::new("claude")
.kill_on_drop(true)
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.current_dir(worktree_path)
// .arg("--no-color")
// .arg("--")
// .arg(&prompt)
.arg("--help")
.spawn()
.map_err(ExecutorError::SpawnFailed)?;
Ok(child)
}
fn description(&self) -> &'static str {
"Executes tasks using Claude CLI for AI-powered code assistance"
}
}

View File

@@ -1,3 +1,5 @@
pub mod echo;
pub mod claude;
pub use echo::EchoExecutor;
pub use claude::ClaudeExecutor;