summaryrefslogtreecommitdiff
path: root/internal/executor
diff options
context:
space:
mode:
Diffstat (limited to 'internal/executor')
-rw-r--r--internal/executor/claude.go3
-rw-r--r--internal/executor/claude_test.go28
2 files changed, 31 insertions, 0 deletions
diff --git a/internal/executor/claude.go b/internal/executor/claude.go
index 8486427..7b3884c 100644
--- a/internal/executor/claude.go
+++ b/internal/executor/claude.go
@@ -40,6 +40,9 @@ func (r *ClaudeRunner) Run(ctx context.Context, t *task.Task, e *storage.Executi
"CLAUDOMATOR_TASK_ID="+t.ID,
)
if t.Claude.WorkingDir != "" {
+ if _, err := os.Stat(t.Claude.WorkingDir); err != nil {
+ return fmt.Errorf("working_dir %q: %w", t.Claude.WorkingDir, err)
+ }
cmd.Dir = t.Claude.WorkingDir
}
diff --git a/internal/executor/claude_test.go b/internal/executor/claude_test.go
index fa81b09..ac6aabf 100644
--- a/internal/executor/claude_test.go
+++ b/internal/executor/claude_test.go
@@ -1,9 +1,13 @@
package executor
import (
+ "context"
+ "io"
+ "log/slog"
"strings"
"testing"
+ "github.com/thepeterstone/claudomator/internal/storage"
"github.com/thepeterstone/claudomator/internal/task"
)
@@ -166,6 +170,30 @@ func TestClaudeRunner_BuildArgs_PreambleBashNotDuplicated(t *testing.T) {
}
}
+func TestClaudeRunner_Run_InaccessibleWorkingDir_ReturnsError(t *testing.T) {
+ r := &ClaudeRunner{
+ BinaryPath: "true", // would succeed if it ran
+ Logger: slog.New(slog.NewTextHandler(io.Discard, nil)),
+ LogDir: t.TempDir(),
+ }
+ tk := &task.Task{
+ Claude: task.ClaudeConfig{
+ WorkingDir: "/nonexistent/path/does/not/exist",
+ SkipPlanning: true,
+ },
+ }
+ exec := &storage.Execution{ID: "test-exec"}
+
+ err := r.Run(context.Background(), tk, exec)
+
+ if err == nil {
+ t.Fatal("expected error for inaccessible working_dir, got nil")
+ }
+ if !strings.Contains(err.Error(), "working_dir") {
+ t.Errorf("expected 'working_dir' in error, got: %v", err)
+ }
+}
+
func TestClaudeRunner_BinaryPath_Default(t *testing.T) {
r := &ClaudeRunner{}
if r.binaryPath() != "claude" {