import { type Static, Type } from "typebox"; import { StringEnum } from "@earendil-works/pi-ai"; import { type ToolResult } from "./ticket-helpers.js"; import { handleCreate, handleUpdate, handleShow, handleList, handleAwareness } from "./tndm-ticket-actions.js"; import { handleTaskAdd, handleTaskEdit, handleTaskRemove, handleTaskComplete, handleTaskSet, handleTaskList } from "./tndm-task-actions.js"; export const actionEnum = StringEnum([ "create", "update", "show", "list", "awareness", "task_add", "task_list", "task_complete", "task_remove", "task_edit", "task_set", ] as const); export const supi_tndm_cli_params = Type.Object({ action: actionEnum, // Common identifiers id: Type.Optional(Type.String({ description: "Ticket ID" })), // Create / Update params title: Type.Optional(Type.String({ description: "Ticket title" })), status: Type.Optional( StringEnum(["todo", "in_progress", "blocked", "done"] as const, { description: "Ticket status", }), ), priority: Type.Optional( StringEnum(["p0", "p1", "p2", "p3", "p4"] as const, { description: "Priority", }), ), type: Type.Optional( StringEnum(["task", "bug", "feature", "chore", "epic"] as const, { description: "Ticket type", }), ), tags: Type.Optional( Type.String({ description: "Comma-separated tags to replace", }), ), add_tags: Type.Optional( Type.String({ description: "Comma-separated tags to add", }), ), remove_tags: Type.Optional( Type.String({ description: "Comma-separated tags to remove", }), ), depends_on: Type.Optional( Type.String({ description: "Comma-separated dependency IDs" }), ), effort: Type.Optional( StringEnum(["xs", "s", "m", "l", "xl"] as const, { description: "Effort estimate", }), ), content: Type.Optional( Type.String({ description: "Markdown ticket content" }), ), // List params all: Type.Optional(Type.Boolean({ description: "Include done tickets" })), definition: Type.Optional( StringEnum(["ready", "questions", "unknown"] as const, { description: "Definition state filter", }), ), // Awareness params against: Type.Optional( Type.String({ description: "Git ref for awareness" }), ), // Task params task_title: Type.Optional( Type.String({ description: "Task title" }), ), task_number: Type.Optional( Type.Number({ description: "1-based task number" }), ), task_detail: Type.Optional( Type.String({ description: "Task detail markdown" }), ), task_json: Type.Optional( Type.String({ description: "JSON task array" }), ), }); /** * supi_tndm_cli — thin wrapper around the tndm CLI. * * Actions map to tndm subcommands: * create → tndm ticket create