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
}
diff --git a/server/subtasks/service_test.go b/server/subtasks/service_test.go
index 0a8e473..08dd72a 100644
--- a/server/subtasks/service_test.go
+++ b/server/subtasks/service_test.go
@@ -81,7 +81,7 @@
mockProvider := NewMockLLMProvider([]string{})
agentRoles := []string{"backend", "frontend", "qa"}
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
if service == nil {
t.Fatal("NewSubtaskService returned nil")
@@ -107,7 +107,7 @@
mockProvider := NewMockLLMProvider([]string{decisionResponse})
agentRoles := []string{"backend", "frontend", "qa"}
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
// Test the parseSubtaskDecision method directly since ShouldGenerateSubtasks is used by manager
decision, err := service.parseSubtaskDecision(decisionResponse)
@@ -166,7 +166,7 @@
mockProvider := NewMockLLMProvider([]string{jsonResponse})
agentRoles := []string{"backend", "frontend", "qa", "ceo"} // Include CEO for agent creation
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
task := &tm.Task{
ID: "test-task-123",
@@ -267,7 +267,7 @@
mockProvider := NewMockLLMProvider([]string{invalidResponse})
agentRoles := []string{"backend", "frontend"}
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
task := &tm.Task{
ID: "test-task-123",
@@ -303,7 +303,7 @@
mockProvider := NewMockLLMProvider([]string{jsonResponse})
agentRoles := []string{"backend", "frontend"}
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
task := &tm.Task{
ID: "test-task-123",
@@ -323,7 +323,7 @@
func TestGenerateSubtaskPR(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
- service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
analysis := &tm.SubtaskAnalysis{
ParentTaskID: "task-123",
@@ -357,7 +357,7 @@
func TestBuildSubtaskAnalysisPrompt(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
agentRoles := []string{"backend", "frontend", "qa"}
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
task := &tm.Task{
Title: "Build authentication system",
@@ -388,7 +388,7 @@
func TestGetSubtaskAnalysisSystemPrompt(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
agentRoles := []string{"backend", "frontend", "qa", "devops"}
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
systemPrompt := service.getSubtaskAnalysisSystemPrompt()
@@ -412,7 +412,7 @@
func TestIsValidAgentRole(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
agentRoles := []string{"backend", "frontend", "qa"}
- service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, agentRoles, nil, "example", "repo", nil, nil)
if !service.isValidAgentRole("backend") {
t.Error("'backend' should be a valid agent role")
@@ -433,7 +433,7 @@
func TestParseSubtaskAnalysis_Priority(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
- service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
tests := []struct {
input string
@@ -485,7 +485,7 @@
func TestGenerateSubtaskFile(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
- service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
subtask := tm.SubtaskProposal{
Title: "Implement API endpoints",
@@ -552,7 +552,7 @@
func TestUpdateParentTaskAsCompleted(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
- service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
// Create a temporary task file for testing
taskContent := `---
@@ -639,7 +639,7 @@
func TestClose(t *testing.T) {
mockProvider := NewMockLLMProvider([]string{})
- service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, []string{"backend"}, nil, "example", "repo", nil, nil)
err := service.Close()
if err != nil {
@@ -666,7 +666,7 @@
}`
mockProvider := NewMockLLMProvider([]string{jsonResponse})
- service := NewSubtaskService(mockProvider, nil, []string{"backend", "frontend"}, nil, "example", "repo", nil)
+ service := NewSubtaskService(mockProvider, nil, []string{"backend", "frontend"}, nil, "example", "repo", nil, nil)
task := &tm.Task{
ID: "benchmark-task",