task: task-1753636924-a1d4c708 - created

Change-Id: Ic78528c47ae38114b9b7504f1c4a76f95e93eb13
diff --git a/server/cmd/commands/create_task.go b/server/cmd/commands/create_task.go
new file mode 100644
index 0000000..4bb57d9
--- /dev/null
+++ b/server/cmd/commands/create_task.go
@@ -0,0 +1,89 @@
+package commands
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/iomodo/staff/tm"
+	"github.com/spf13/cobra"
+)
+
+var createTaskCmd = &cobra.Command{
+	Use:   "create-task [title]",
+	Short: "Create a new task",
+	Long: `Create a new task with specified title, description, and priority.
+
+Examples:
+  staff create-task "Add user authentication"
+  staff create-task "Fix login bug" --description "Users cannot log in with Google OAuth" --priority high --assignee backend-engineer`,
+	Args: cobra.ExactArgs(1),
+	RunE: runCreateTask,
+}
+
+var (
+	taskDescription string
+	taskPriority    string
+	taskAssignee    string
+	taskDueDate     string
+)
+
+func init() {
+	createTaskCmd.Flags().StringVarP(&taskDescription, "description", "d", "", "Task description")
+	createTaskCmd.Flags().StringVarP(&taskPriority, "priority", "p", "medium", "Task priority (low, medium, high)")
+	createTaskCmd.Flags().StringVarP(&taskAssignee, "assignee", "a", "", "Agent to assign the task to")
+	createTaskCmd.Flags().StringVar(&taskDueDate, "due", "", "Due date (RFC3339 format, e.g., 2024-01-15T10:00:00Z)")
+}
+
+func runCreateTask(cmd *cobra.Command, args []string) error {
+	title := args[0]
+	
+	// Validate priority
+	priority := tm.TaskPriority(taskPriority)
+	if priority != tm.PriorityLow && priority != tm.PriorityMedium && priority != tm.PriorityHigh {
+		return fmt.Errorf("invalid priority: %s (must be low, medium, or high)", taskPriority)
+	}
+
+	// Parse due date if provided
+	var dueDate *time.Time
+	if taskDueDate != "" {
+		parsed, err := time.Parse(time.RFC3339, taskDueDate)
+		if err != nil {
+			return fmt.Errorf("invalid due date format: %s (expected RFC3339)", taskDueDate)
+		}
+		dueDate = &parsed
+	}
+
+	// Create task request
+	req := &tm.TaskCreateRequest{
+		Title:       title,
+		Description: taskDescription,
+		OwnerID:     "user", // MVP: single user
+		Priority:    priority,
+		DueDate:     dueDate,
+	}
+
+	// Create the task
+	task, err := taskManager.CreateTask(context.Background(), req)
+	if err != nil {
+		return fmt.Errorf("failed to create task: %w", err)
+	}
+
+	fmt.Printf("Task created successfully!\n")
+	fmt.Printf("ID: %s\n", task.ID)
+	fmt.Printf("Title: %s\n", task.Title)
+	fmt.Printf("Priority: %s\n", task.Priority)
+	fmt.Printf("Status: %s\n", task.Status)
+	
+	// Auto-assign if assignee is specified
+	if taskAssignee != "" {
+		task.Assignee = taskAssignee
+		if err := taskManager.UpdateTask(task); err != nil {
+			fmt.Printf("Warning: Failed to assign task to %s: %v\n", taskAssignee, err)
+		} else {
+			fmt.Printf("Assigned to: %s\n", taskAssignee)
+		}
+	}
+
+	return nil
+}
\ No newline at end of file