Add task manager interface

Change-Id: I7a2f4b20907ba4bb12c900688aef059789884c1d
diff --git a/server/tm/README.md b/server/tm/README.md
new file mode 100644
index 0000000..6b6e62d
--- /dev/null
+++ b/server/tm/README.md
@@ -0,0 +1,76 @@
+# Task Management (tm) Package
+
+The `tm` package provides a comprehensive task management system with support for task dependencies, ownership, and various task states.
+
+## Overview
+
+This package defines interfaces and types for managing tasks in a system where:
+- Each task has a single owner
+- Tasks can be in various states (todo, in progress, completed, etc.)
+- Tasks have priorities and due dates
+
+## Core Components
+
+### Types (`types.go`)
+
+- **Task**: The main task entity with all task properties
+- **TaskStatus**: Enum for task states (pending, in progress, completed, etc.)
+- **TaskPriority**: Enum for task priorities (low, medium, high, urgent)
+- **Owner**: Represents a task owner
+
+- **TaskFilter**: For filtering task queries
+- **Request/Response types**: For API operations
+
+### Interfaces (`interface.go`)
+
+#### TaskManager
+The main interface for task management operations:
+- CRUD operations for tasks
+- Task status management (start, complete)
+- Task queries and filtering
+- Task archiving
+
+### Errors (`errors.go`)
+
+Comprehensive error definitions:
+- Common task management errors
+- Task-specific errors with context
+
+## Key Features
+
+### Task States
+- **To Do**: Task is created but not started
+- **In Progress**: Task is currently being worked on
+- **Completed**: Task is finished
+- **Archived**: Task is archived (soft delete)
+
+### Task Priorities
+- **Low**: Low priority tasks
+- **Medium**: Normal priority tasks
+- **High**: High priority tasks
+
+### Filtering and Queries
+- Filter by owner, status, priority
+- Filter by date ranges
+- Pagination support
+
+## Usage Example
+
+```go
+// Create a task manager implementation
+var taskManager tm.TaskManager
+
+// Create a new task
+task, err := taskManager.CreateTask(ctx, &tm.TaskCreateRequest{
+    Title:       "Implement user authentication",
+    Description: "Add login and registration functionality",
+    OwnerID:     "user123",
+    Priority:    tm.PriorityHigh,
+})
+
+// Start a task
+task, err = taskManager.StartTask(ctx, "task1")
+
+// Complete a task
+task, err = taskManager.CompleteTask(ctx, "task1")
+```
diff --git a/server/tm/errors.go b/server/tm/errors.go
new file mode 100644
index 0000000..55dd037
--- /dev/null
+++ b/server/tm/errors.go
@@ -0,0 +1,47 @@
+package tm
+
+import (
+	"errors"
+	"fmt"
+)
+
+// Common task management errors
+var (
+	ErrTaskNotFound         = errors.New("task not found")
+	ErrOwnerNotFound        = errors.New("owner not found")
+	ErrInvalidTaskStatus    = errors.New("invalid task status")
+	ErrInvalidTaskPriority  = errors.New("invalid task priority")
+	ErrTaskAlreadyCompleted = errors.New("task is already completed")
+	ErrTaskAlreadyArchived  = errors.New("task is already archived")
+	ErrTaskNotStarted       = errors.New("task is not started")
+	ErrTaskNotInProgress    = errors.New("task is not in progress")
+	ErrInvalidOwner         = errors.New("invalid owner")
+	ErrInvalidTaskData      = errors.New("invalid task data")
+)
+
+// TaskError represents a task-specific error with additional context
+type TaskError struct {
+	TaskID string
+	Op     string
+	Err    error
+}
+
+func (e *TaskError) Error() string {
+	if e.TaskID != "" {
+		return fmt.Sprintf("task %s: %s: %v", e.TaskID, e.Op, e.Err)
+	}
+	return fmt.Sprintf("%s: %v", e.Op, e.Err)
+}
+
+func (e *TaskError) Unwrap() error {
+	return e.Err
+}
+
+// NewTaskError creates a new TaskError
+func NewTaskError(taskID, op string, err error) *TaskError {
+	return &TaskError{
+		TaskID: taskID,
+		Op:     op,
+		Err:    err,
+	}
+}
diff --git a/server/tm/interface.go b/server/tm/interface.go
new file mode 100644
index 0000000..93b0f29
--- /dev/null
+++ b/server/tm/interface.go
@@ -0,0 +1,24 @@
+package tm
+
+import (
+	"context"
+)
+
+// TaskManager defines the interface for task management operations
+type TaskManager interface {
+	// Task operations
+	CreateTask(ctx context.Context, req *TaskCreateRequest) (*Task, error)
+	GetTask(ctx context.Context, id string) (*Task, error)
+	UpdateTask(ctx context.Context, id string, req *TaskUpdateRequest) (*Task, error)
+	ArchiveTask(ctx context.Context, id string) error
+	ListTasks(ctx context.Context, filter *TaskFilter, page, pageSize int) (*TaskList, error)
+
+	// Task status operations
+	StartTask(ctx context.Context, id string) (*Task, error)
+	CompleteTask(ctx context.Context, id string) (*Task, error)
+
+	// Task queries
+	GetTasksByOwner(ctx context.Context, ownerID string, page, pageSize int) (*TaskList, error)
+	GetTasksByStatus(ctx context.Context, status TaskStatus, page, pageSize int) (*TaskList, error)
+	GetTasksByPriority(ctx context.Context, priority TaskPriority, page, pageSize int) (*TaskList, error)
+}
diff --git a/server/tm/types.go b/server/tm/types.go
new file mode 100644
index 0000000..781d63d
--- /dev/null
+++ b/server/tm/types.go
@@ -0,0 +1,84 @@
+package tm
+
+import (
+	"time"
+)
+
+// TaskStatus represents the current status of a task
+type TaskStatus string
+
+const (
+	StatusToDo       TaskStatus = "todo"
+	StatusInProgress TaskStatus = "in_progress"
+	StatusCompleted  TaskStatus = "completed"
+	StatusArchived   TaskStatus = "archived"
+)
+
+// TaskPriority represents the priority level of a task
+type TaskPriority string
+
+const (
+	PriorityLow    TaskPriority = "low"
+	PriorityMedium TaskPriority = "medium"
+	PriorityHigh   TaskPriority = "high"
+)
+
+// Owner represents a task owner
+type Owner struct {
+	ID   string `json:"id"`
+	Name string `json:"name"`
+}
+
+// Task represents a single task in the system
+type Task struct {
+	ID          string       `json:"id"`
+	Title       string       `json:"title"`
+	Description string       `json:"description"`
+	Owner       Owner        `json:"owner"`
+	Status      TaskStatus   `json:"status"`
+	Priority    TaskPriority `json:"priority"`
+	CreatedAt   time.Time    `json:"created_at"`
+	UpdatedAt   time.Time    `json:"updated_at"`
+	DueDate     *time.Time   `json:"due_date,omitempty"`
+	CompletedAt *time.Time   `json:"completed_at,omitempty"`
+	ArchivedAt  *time.Time   `json:"archived_at,omitempty"`
+}
+
+// TaskFilter represents filters for querying tasks
+type TaskFilter struct {
+	OwnerID       *string       `json:"owner_id,omitempty"`
+	Status        *TaskStatus   `json:"status,omitempty"`
+	Priority      *TaskPriority `json:"priority,omitempty"`
+	DueBefore     *time.Time    `json:"due_before,omitempty"`
+	DueAfter      *time.Time    `json:"due_after,omitempty"`
+	CreatedAfter  *time.Time    `json:"created_after,omitempty"`
+	CreatedBefore *time.Time    `json:"created_before,omitempty"`
+}
+
+// TaskCreateRequest represents the data needed to create a new task
+type TaskCreateRequest struct {
+	Title       string       `json:"title" validate:"required"`
+	Description string       `json:"description"`
+	OwnerID     string       `json:"owner_id" validate:"required"`
+	Priority    TaskPriority `json:"priority"`
+	DueDate     *time.Time   `json:"due_date,omitempty"`
+}
+
+// TaskUpdateRequest represents the data needed to update an existing task
+type TaskUpdateRequest struct {
+	Title       *string       `json:"title,omitempty"`
+	Description *string       `json:"description,omitempty"`
+	OwnerID     *string       `json:"owner_id,omitempty"`
+	Status      *TaskStatus   `json:"status,omitempty"`
+	Priority    *TaskPriority `json:"priority,omitempty"`
+	DueDate     *time.Time    `json:"due_date,omitempty"`
+}
+
+// TaskList represents a paginated list of tasks
+type TaskList struct {
+	Tasks      []*Task `json:"tasks"`
+	TotalCount int     `json:"total_count"`
+	Page       int     `json:"page"`
+	PageSize   int     `json:"page_size"`
+	HasMore    bool    `json:"has_more"`
+}