Update logging

Change-Id: I13279582aa717edad5d56323866b941db1919404
diff --git a/server/tm/git_tm/example.go b/server/tm/git_tm/example.go
index 39541fa..3c2816d 100644
--- a/server/tm/git_tm/example.go
+++ b/server/tm/git_tm/example.go
@@ -3,7 +3,8 @@
 import (
 	"context"
 	"fmt"
-	"log"
+	"log/slog"
+	"os"
 	"time"
 
 	"github.com/iomodo/staff/git"
@@ -12,11 +13,14 @@
 
 // Example demonstrates how to use the GitTaskManager
 func Example() {
+	// Create logger
+	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
+
 	// Initialize git interface
 	gitInterface := git.DefaultGit("./tasks-repo")
 
 	// Create task manager
-	taskManager := NewGitTaskManager(gitInterface, "./tasks-repo")
+	taskManager := NewGitTaskManagerWithLogger(gitInterface, "./tasks-repo", logger)
 
 	// Create a new task
 	ctx := context.Background()
@@ -32,46 +36,50 @@
 
 	task, err := taskManager.CreateTask(ctx, createReq)
 	if err != nil {
-		log.Fatalf("Failed to create task: %v", err)
+		logger.Error("Failed to create task", slog.String("error", err.Error()))
+		os.Exit(1)
 	}
 
-	fmt.Printf("Created task: %s\n", task.ID)
+	logger.Info("Created task", slog.String("id", task.ID))
 
 	// Get the task
 	retrievedTask, err := taskManager.GetTask(ctx, task.ID)
 	if err != nil {
-		log.Fatalf("Failed to get task: %v", err)
+		logger.Error("Failed to get task", slog.String("error", err.Error()))
+		os.Exit(1)
 	}
 
-	fmt.Printf("Retrieved task: %s - %s\n", retrievedTask.ID, retrievedTask.Title)
+	logger.Info("Retrieved task", slog.String("id", retrievedTask.ID), slog.String("title", retrievedTask.Title))
 
 	// Start the task
 	startedTask, err := taskManager.StartTask(ctx, task.ID)
 	if err != nil {
-		log.Fatalf("Failed to start task: %v", err)
+		logger.Error("Failed to start task", slog.String("error", err.Error()))
+		os.Exit(1)
 	}
 
-	fmt.Printf("Started task: %s (status: %s)\n", startedTask.ID, startedTask.Status)
+	logger.Info("Started task", slog.String("id", startedTask.ID), slog.String("status", string(startedTask.Status)))
 
 	// List all tasks
 	taskList, err := taskManager.ListTasks(ctx, nil, 0, 10)
 	if err != nil {
-		log.Fatalf("Failed to list tasks: %v", err)
+		logger.Error("Failed to list tasks", slog.String("error", err.Error()))
+		os.Exit(1)
 	}
 
-	fmt.Printf("Total tasks: %d\n", taskList.TotalCount)
+	logger.Info("Total tasks", slog.Int("count", taskList.TotalCount))
 	for _, t := range taskList.Tasks {
-		fmt.Printf("- %s: %s (%s)\n", t.ID, t.Title, t.Status)
+		logger.Info("Task", slog.String("id", t.ID), slog.String("title", t.Title), slog.String("status", string(t.Status)))
 	}
 
 	// Complete the task
 	completedTask, err := taskManager.CompleteTask(ctx, task.ID)
 	if err != nil {
-		log.Fatalf("Failed to complete task: %v", err)
+		logger.Error("Failed to complete task", slog.String("error", err.Error()))
+		os.Exit(1)
 	}
 
-	fmt.Printf("Completed task: %s (completed at: %s)\n",
-		completedTask.ID, completedTask.CompletedAt.Format(time.RFC3339))
+	logger.Info("Completed task", slog.String("id", completedTask.ID), slog.String("completed_at", completedTask.CompletedAt.Format(time.RFC3339)))
 }
 
 // ExampleTaskFile shows the format of a task file
diff --git a/server/tm/git_tm/git_task_manager.go b/server/tm/git_tm/git_task_manager.go
index 02d5197..6a8735e 100644
--- a/server/tm/git_tm/git_task_manager.go
+++ b/server/tm/git_tm/git_task_manager.go
@@ -3,6 +3,7 @@
 import (
 	"context"
 	"fmt"
+	"log/slog"
 	"os"
 	"path/filepath"
 	"sort"
@@ -20,14 +21,29 @@
 	git      git.GitInterface
 	repoPath string
 	tasksDir string
+	logger   *slog.Logger
 }
 
 // NewGitTaskManager creates a new GitTaskManager instance
-func NewGitTaskManager(git git.GitInterface, repoPath string) *GitTaskManager {
+func NewGitTaskManager(git git.GitInterface, repoPath string, logger *slog.Logger) *GitTaskManager {
 	return &GitTaskManager{
 		git:      git,
 		repoPath: repoPath,
 		tasksDir: filepath.Join(repoPath, "tasks"),
+		logger:   logger,
+	}
+}
+
+// NewGitTaskManagerWithLogger creates a new GitTaskManager instance with a custom logger
+func NewGitTaskManagerWithLogger(git git.GitInterface, repoPath string, logger *slog.Logger) *GitTaskManager {
+	if logger == nil {
+		logger = slog.Default()
+	}
+	return &GitTaskManager{
+		git:      git,
+		repoPath: repoPath,
+		tasksDir: filepath.Join(repoPath, "tasks"),
+		logger:   logger,
 	}
 }
 
diff --git a/server/tm/git_tm/git_task_manager_test.go b/server/tm/git_tm/git_task_manager_test.go
index cd37838..f7da286 100644
--- a/server/tm/git_tm/git_task_manager_test.go
+++ b/server/tm/git_tm/git_task_manager_test.go
@@ -2,6 +2,7 @@
 
 import (
 	"context"
+	"log/slog"
 	"os"
 	"path/filepath"
 	"testing"
@@ -41,7 +42,10 @@
 	err = gitImpl.SetUserConfig(ctx, userConfig)
 	require.NoError(t, err)
 
-	gtm := NewGitTaskManager(gitImpl, repoPath)
+	// Create logger for testing
+	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
+
+	gtm := NewGitTaskManagerWithLogger(gitImpl, repoPath, logger)
 	return gtm, gitImpl
 }
 
@@ -51,7 +55,11 @@
 	defer cleanup()
 
 	gitImpl := git.DefaultGit(tempDir)
-	gtm := NewGitTaskManager(gitImpl, tempDir)
+
+	// Create logger for testing
+	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))
+
+	gtm := NewGitTaskManagerWithLogger(gitImpl, tempDir, logger)
 
 	assert.NotNil(t, gtm)
 	assert.Equal(t, gitImpl, gtm.git)