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