task: task-1753636924-a1d4c708 - created

Change-Id: Ic78528c47ae38114b9b7504f1c4a76f95e93eb13
diff --git a/server/tm/git_tm/git_task_manager.go b/server/tm/git_tm/git_task_manager.go
index edfb476..b1aa39c 100644
--- a/server/tm/git_tm/git_task_manager.go
+++ b/server/tm/git_tm/git_task_manager.go
@@ -118,6 +118,7 @@
 		"description": task.Description,
 		"owner_id":    task.Owner.ID,
 		"owner_name":  task.Owner.Name,
+		"assignee":    task.Assignee,
 		"status":      task.Status,
 		"priority":    task.Priority,
 		"created_at":  task.CreatedAt.Format(time.RFC3339),
@@ -188,6 +189,9 @@
 	if ownerName, ok := frontmatter["owner_name"].(string); ok {
 		task.Owner.Name = ownerName
 	}
+	if assignee, ok := frontmatter["assignee"].(string); ok {
+		task.Assignee = assignee
+	}
 	if status, ok := frontmatter["status"].(string); ok {
 		task.Status = tm.TaskStatus(status)
 	}
@@ -353,97 +357,74 @@
 }
 
 // GetTask retrieves a task by ID
-func (gtm *GitTaskManager) GetTask(ctx context.Context, id string) (*tm.Task, error) {
+func (gtm *GitTaskManager) GetTask(id string) (*tm.Task, error) {
 	return gtm.readTaskFile(id)
 }
 
 // UpdateTask updates an existing task
-func (gtm *GitTaskManager) UpdateTask(ctx context.Context, id string, req *tm.TaskUpdateRequest) (*tm.Task, error) {
-	// Read existing task
-	task, err := gtm.readTaskFile(id)
+func (gtm *GitTaskManager) UpdateTask(task *tm.Task) error {
+	// Set update time
+	task.UpdatedAt = time.Now()
+	
+	// Write task to file
+	return gtm.writeTaskFile(task)
+}
+
+// readAllTasks reads all task files from disk
+func (gtm *GitTaskManager) readAllTasks() ([]*tm.Task, error) {
+	taskFiles, err := gtm.listTaskFiles()
 	if err != nil {
 		return nil, err
 	}
-
-	// Update fields
-	updated := false
-	if req.Title != nil {
-		task.Title = *req.Title
-		updated = true
-	}
-	if req.Description != nil {
-		task.Description = *req.Description
-		updated = true
-	}
-	if req.OwnerID != nil {
-		task.Owner.ID = *req.OwnerID
-		// Get owner name from user service
-		if ownerName, err := gtm.userService.GetUserName(*req.OwnerID); err == nil {
-			task.Owner.Name = ownerName
-		} else {
-			gtm.logger.Warn("Failed to get owner name, using ID", slog.String("ownerID", *req.OwnerID), slog.String("error", err.Error()))
-			task.Owner.Name = *req.OwnerID
-		}
-		updated = true
-	}
-	if req.Status != nil {
-		task.Status = *req.Status
-		updated = true
-	}
-	if req.Priority != nil {
-		task.Priority = *req.Priority
-		updated = true
-	}
-	if req.DueDate != nil {
-		task.DueDate = req.DueDate
-		updated = true
-	}
-
-	if !updated {
-		return task, nil
-	}
-
-	// Update timestamps
-	task.UpdatedAt = time.Now()
-
-	// Handle status-specific timestamps
-	if req.Status != nil {
-		switch *req.Status {
-		case tm.StatusCompleted:
-			if task.CompletedAt == nil {
-				now := time.Now()
-				task.CompletedAt = &now
+	
+	var tasks []*tm.Task
+	for _, taskFile := range taskFiles {
+		// Extract task ID from filename (task-{id}.md)
+		filename := filepath.Base(taskFile)
+		if strings.HasPrefix(filename, "task-") && strings.HasSuffix(filename, ".md") {
+			taskID := strings.TrimSuffix(strings.TrimPrefix(filename, "task-"), ".md")
+			task, err := gtm.readTaskFile(taskID)
+			if err != nil {
+				gtm.logger.Warn("Failed to read task file", slog.String("file", taskFile), slog.String("error", err.Error()))
+				continue
 			}
-		case tm.StatusArchived:
-			if task.ArchivedAt == nil {
-				now := time.Now()
-				task.ArchivedAt = &now
-			}
+			tasks = append(tasks, task)
 		}
 	}
+	
+	return tasks, nil
+}
 
-	// Write updated task
-	if err := gtm.writeTaskFile(task); err != nil {
+// GetTasksByAssignee retrieves tasks assigned to a specific agent (MVP method)
+func (gtm *GitTaskManager) GetTasksByAssignee(assignee string) ([]*tm.Task, error) {
+	// Read all tasks and filter by assignee
+	tasks, err := gtm.readAllTasks()
+	if err != nil {
 		return nil, err
 	}
-
-	// Commit to git
-	if err := gtm.commitTaskChange(id, "updated", task.Owner); err != nil {
-		return nil, err
+	
+	var assignedTasks []*tm.Task
+	for _, task := range tasks {
+		if task.Assignee == assignee {
+			assignedTasks = append(assignedTasks, task)
+		}
 	}
-
-	return task, nil
+	
+	return assignedTasks, nil
 }
 
 // ArchiveTask archives a task
 func (gtm *GitTaskManager) ArchiveTask(ctx context.Context, id string) error {
-	status := tm.StatusArchived
-	req := &tm.TaskUpdateRequest{
-		Status: &status,
+	task, err := gtm.GetTask(id)
+	if err != nil {
+		return err
 	}
-
-	_, err := gtm.UpdateTask(ctx, id, req)
-	return err
+	
+	task.Status = tm.StatusArchived
+	now := time.Now()
+	task.ArchivedAt = &now
+	
+	return gtm.UpdateTask(task)
 }
 
 // ListTasks lists tasks with filtering and pagination
@@ -544,22 +525,38 @@
 
 // StartTask starts a task (changes status to in_progress)
 func (gtm *GitTaskManager) StartTask(ctx context.Context, id string) (*tm.Task, error) {
-	status := tm.StatusInProgress
-	req := &tm.TaskUpdateRequest{
-		Status: &status,
+	task, err := gtm.GetTask(id)
+	if err != nil {
+		return nil, err
 	}
-
-	return gtm.UpdateTask(ctx, id, req)
+	
+	task.Status = tm.StatusInProgress
+	
+	err = gtm.UpdateTask(task)
+	if err != nil {
+		return nil, err
+	}
+	
+	return task, nil
 }
 
 // CompleteTask completes a task (changes status to completed)
 func (gtm *GitTaskManager) CompleteTask(ctx context.Context, id string) (*tm.Task, error) {
-	status := tm.StatusCompleted
-	req := &tm.TaskUpdateRequest{
-		Status: &status,
+	task, err := gtm.GetTask(id)
+	if err != nil {
+		return nil, err
 	}
-
-	return gtm.UpdateTask(ctx, id, req)
+	
+	task.Status = tm.StatusCompleted
+	now := time.Now()
+	task.CompletedAt = &now
+	
+	err = gtm.UpdateTask(task)
+	if err != nil {
+		return nil, err
+	}
+	
+	return task, nil
 }
 
 // GetTasksByOwner gets tasks for a specific owner