Update with log/slog logging

Change-Id: Ie86d7082bb50576fdfbd898c44bd2905e389c399
diff --git a/server/subtasks/service.go b/server/subtasks/service.go
index c1a1bc9..d704a33 100644
--- a/server/subtasks/service.go
+++ b/server/subtasks/service.go
@@ -4,7 +4,7 @@
 	"context"
 	"encoding/json"
 	"fmt"
-	"log"
+	"log/slog"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -25,10 +25,14 @@
 	githubOwner    string
 	githubRepo     string
 	cloneManager   *git.CloneManager
+	logger         *slog.Logger
 }
 
 // NewSubtaskService creates a new subtask service
-func NewSubtaskService(provider llm.LLMProvider, taskManager tm.TaskManager, agentRoles []string, prProvider git.PullRequestProvider, githubOwner, githubRepo string, cloneManager *git.CloneManager) *SubtaskService {
+func NewSubtaskService(provider llm.LLMProvider, taskManager tm.TaskManager, agentRoles []string, prProvider git.PullRequestProvider, githubOwner, githubRepo string, cloneManager *git.CloneManager, logger *slog.Logger) *SubtaskService {
+	if logger == nil {
+		logger = slog.Default()
+	}
 	return &SubtaskService{
 		llmProvider:  provider,
 		taskManager:  taskManager,
@@ -37,6 +41,7 @@
 		githubOwner:  githubOwner,
 		githubRepo:   githubRepo,
 		cloneManager: cloneManager,
+		logger:       logger,
 	}
 }
 
@@ -334,7 +339,7 @@
 	
 	// Validate agent assignments and handle new agent creation
 	if err := s.validateAndHandleAgentAssignments(analysis); err != nil {
-		log.Printf("Warning during agent assignment handling: %v", err)
+		s.logger.Warn("Warning during agent assignment handling", slog.String("error", err.Error()))
 	}
 	
 	return analysis, nil
@@ -385,8 +390,10 @@
 	
 	for i := range analysis.Subtasks {
 		if !availableRoles[analysis.Subtasks[i].AssignedTo] {
-			log.Printf("Warning: Unknown agent role '%s' for subtask '%s', assigning to %s", 
-				analysis.Subtasks[i].AssignedTo, analysis.Subtasks[i].Title, defaultRole)
+			s.logger.Warn("Unknown agent role for subtask, using default", 
+				slog.String("unknown_role", analysis.Subtasks[i].AssignedTo),
+				slog.String("subtask_title", analysis.Subtasks[i].Title),
+				slog.String("assigned_role", defaultRole))
 			analysis.Subtasks[i].AssignedTo = defaultRole
 		}
 	}
@@ -421,7 +428,7 @@
 
 	// Generate branch name for subtask proposal
 	branchName := fmt.Sprintf("subtasks/%s-proposal", analysis.ParentTaskID)
-	log.Printf("Creating subtask PR with branch: %s", branchName)
+	s.logger.Info("Creating subtask PR", slog.String("branch", branchName))
 
 	// Create Git branch and commit subtask proposal
 	if err := s.createSubtaskBranch(ctx, analysis, branchName); err != nil {
@@ -442,7 +449,7 @@
 
 	// Determine base branch (try main first, fallback to master)
 	baseBranch := s.determineBaseBranch(ctx)
-	log.Printf("Using base branch: %s", baseBranch)
+	s.logger.Info("Using base branch", slog.String("base_branch", baseBranch))
 
 	// Create the pull request
 	options := git.PullRequestOptions{
@@ -454,7 +461,10 @@
 		Draft:       false,
 	}
 
-	log.Printf("Creating PR with options: title=%s, head=%s, base=%s", options.Title, options.HeadBranch, options.BaseBranch)
+	s.logger.Info("Creating PR with options",
+		slog.String("title", options.Title),
+		slog.String("head_branch", options.HeadBranch),
+		slog.String("base_branch", options.BaseBranch))
 
 	pr, err := s.prProvider.CreatePullRequest(ctx, options)
 	if err != nil {
@@ -462,7 +472,7 @@
 	}
 
 	prURL := fmt.Sprintf("https://github.com/%s/%s/pull/%d", s.githubOwner, s.githubRepo, pr.Number)
-	log.Printf("Generated subtask proposal PR: %s", prURL)
+	s.logger.Info("Generated subtask proposal PR", slog.String("pr_url", prURL))
 
 	return prURL, nil
 }
@@ -476,7 +486,7 @@
 	// Get clone path to check branches
 	clonePath, err := s.cloneManager.GetAgentClonePath("subtask-service")
 	if err != nil {
-		log.Printf("Warning: failed to get clone path for base branch detection: %v", err)
+		s.logger.Warn("Failed to get clone path for base branch detection", slog.String("error", err.Error()))
 		return "main"
 	}
 
@@ -498,7 +508,7 @@
 	}
 
 	// Default to main if neither can be detected
-	log.Printf("Warning: Could not determine base branch, defaulting to 'main'")
+	s.logger.Warn("Could not determine base branch, defaulting to 'main'")
 	return "main"
 }
 
@@ -654,7 +664,7 @@
 		}
 	}
 	
-	log.Printf("Updated parent task %s to completed status", analysis.ParentTaskID)
+	s.logger.Info("Updated parent task to completed status", slog.String("task_id", analysis.ParentTaskID))
 	return nil
 }
 
@@ -741,7 +751,7 @@
 	// Pull latest changes
 	cmd = gitCmd("pull", "origin")
 	if err := cmd.Run(); err != nil {
-		log.Printf("Warning: failed to pull latest changes: %v", err)
+		s.logger.Warn("Failed to pull latest changes", slog.String("error", err.Error()))
 	}
 
 	// Delete branch if it exists (cleanup from previous attempts)
@@ -775,7 +785,7 @@
 	// Track parent task file for staging
 	parentRelativeFile := filepath.Join("operations", "tasks", fmt.Sprintf("%s.md", analysis.ParentTaskID))
 	stagedFiles = append(stagedFiles, parentRelativeFile)
-	log.Printf("Updated parent task file: %s", parentRelativeFile)
+	s.logger.Info("Updated parent task file", slog.String("file", parentRelativeFile))
 
 	// Create a file for each subtask
 	for i, subtask := range analysis.Subtasks {
@@ -790,7 +800,7 @@
 		// Track file for staging
 		relativeFile := filepath.Join("operations", "tasks", fmt.Sprintf("%s.md", taskID))
 		stagedFiles = append(stagedFiles, relativeFile)
-		log.Printf("Created subtask file: %s", relativeFile)
+		s.logger.Info("Created subtask file", slog.String("file", relativeFile))
 	}
 
 	// Stage all subtask files
@@ -825,7 +835,7 @@
 		return fmt.Errorf("failed to push branch: %w", err)
 	}
 
-	log.Printf("Created subtask proposal branch: %s", branchName)
+	s.logger.Info("Created subtask proposal branch", slog.String("branch", branchName))
 	return nil
 }