Add task manager interface

Change-Id: I7a2f4b20907ba4bb12c900688aef059789884c1d
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,
+	}
+}