UNPKG

mcp-think-tank

Version:

Structured thinking and knowledge management tool for Model Context Protocol

82 lines (81 loc) 2.82 kB
import { randomUUID } from 'crypto'; import { z } from 'zod'; /** * Task schema definition */ export const taskSchema = z.object({ id: z.string().uuid(), description: z.string().min(3, "Description must be at least 3 characters"), status: z.enum(['todo', 'in-progress', 'blocked', 'done']).default('todo'), priority: z.enum(['low', 'medium', 'high']).default('medium'), created: z.string().datetime(), updated: z.string().datetime(), due: z.string().datetime().optional(), tags: z.array(z.string()).default([]), dependsOn: z.array(z.string().uuid()).default([]) }); /** * New task schema (subset of fields required for creation) */ export const newTaskSchema = z.object({ description: z.string().min(3, "Description must be at least 3 characters"), status: z.enum(['todo', 'in-progress', 'blocked', 'done']).optional(), priority: z.enum(['low', 'medium', 'high']).optional(), due: z.string().datetime().optional(), tags: z.array(z.string()).optional(), dependsOn: z.array(z.string().uuid()).optional() }); /** * Task update schema (all fields optional) */ export const taskUpdateSchema = z.object({ id: z.string().uuid(), description: z.string().min(3, "Description must be at least 3 characters").optional(), status: z.enum(['todo', 'in-progress', 'blocked', 'done']).optional(), priority: z.enum(['low', 'medium', 'high']).optional(), due: z.string().datetime().optional(), tags: z.array(z.string()).optional(), dependsOn: z.array(z.string().uuid()).optional() }); /** * Create a new task from partial input * * @param taskInput Partial task data * @returns Valid, complete task */ export function createTask(taskInput) { const now = new Date().toISOString(); // Parse and validate the input const validatedInput = newTaskSchema.parse(taskInput); // Create fully-formed task with defaults const task = { id: randomUUID(), description: validatedInput.description, status: validatedInput.status || 'todo', priority: validatedInput.priority || 'medium', created: now, updated: now, due: validatedInput.due, tags: validatedInput.tags || [], dependsOn: validatedInput.dependsOn || [] }; return task; } /** * Update an existing task with partial data * * @param existingTask Current task data * @param taskUpdate Partial updates to apply * @returns Updated task */ export function updateTask(existingTask, taskUpdate) { // Parse and validate the update const validatedUpdate = taskUpdateSchema.omit({ id: true }).parse(taskUpdate); // Create updated task const updatedTask = { ...existingTask, ...validatedUpdate, updated: new Date().toISOString() }; return updatedTask; }