@hasna/todos 0.9.26 → 0.9.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -8305,6 +8305,12 @@ function resolveTaskListId(agent, explicit) {
8305
8305
  return process.env[key] || process.env["TODOS_TASK_LIST_ID"] || getAgentTaskListId(normalized) || "default";
8306
8306
  }
8307
8307
  function formatTask(task) {
8308
+ const id = task.short_id || task.id.slice(0, 8);
8309
+ const assigned = task.assigned_to ? ` -> ${task.assigned_to}` : "";
8310
+ const lock = task.locked_by ? ` [locked:${task.locked_by}]` : "";
8311
+ return `${id} ${task.status.padEnd(11)} ${task.priority.padEnd(8)} ${task.title}${assigned}${lock}`;
8312
+ }
8313
+ function formatTaskDetail(task) {
8308
8314
  const parts = [
8309
8315
  `ID: ${task.id}`,
8310
8316
  `Title: ${task.title}`,
@@ -8385,8 +8391,7 @@ var init_mcp = __esm(() => {
8385
8391
  if (resolved.task_list_id)
8386
8392
  resolved.task_list_id = resolveId(resolved.task_list_id, "task_lists");
8387
8393
  const task = createTask(resolved);
8388
- return { content: [{ type: "text", text: `Task created:
8389
- ${formatTask(task)}` }] };
8394
+ return { content: [{ type: "text", text: `created: ${formatTask(task)}` }] };
8390
8395
  } catch (e) {
8391
8396
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8392
8397
  }
@@ -8430,7 +8435,7 @@ ${text}` }] };
8430
8435
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8431
8436
  }
8432
8437
  });
8433
- server.tool("get_task", "Get full task details including dependencies, subtasks, and comments", {
8438
+ server.tool("get_task", "Get full task details with relations", {
8434
8439
  id: exports_external.string().describe("Task ID (full or partial)")
8435
8440
  }, async ({ id }) => {
8436
8441
  try {
@@ -8438,7 +8443,7 @@ ${text}` }] };
8438
8443
  const task = getTaskWithRelations(resolvedId);
8439
8444
  if (!task)
8440
8445
  return { content: [{ type: "text", text: `Task not found: ${id}` }], isError: true };
8441
- const parts = [formatTask(task)];
8446
+ const parts = [formatTaskDetail(task)];
8442
8447
  if (task.subtasks.length > 0) {
8443
8448
  parts.push(`
8444
8449
  Subtasks (${task.subtasks.length}):`);
@@ -8478,7 +8483,7 @@ Parent: ${task.parent.id.slice(0, 8)} | ${task.parent.title}`);
8478
8483
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8479
8484
  }
8480
8485
  });
8481
- server.tool("update_task", "Update task fields (requires version for optimistic locking)", {
8486
+ server.tool("update_task", "Update task fields. Version required for optimistic locking.", {
8482
8487
  id: exports_external.string().describe("Task ID (full or partial)"),
8483
8488
  version: exports_external.number().describe("Current version (for optimistic locking)"),
8484
8489
  title: exports_external.string().optional().describe("New title"),
@@ -8494,8 +8499,7 @@ Parent: ${task.parent.id.slice(0, 8)} | ${task.parent.title}`);
8494
8499
  try {
8495
8500
  const resolvedId = resolveId(id);
8496
8501
  const task = updateTask(resolvedId, rest);
8497
- return { content: [{ type: "text", text: `Task updated:
8498
- ${formatTask(task)}` }] };
8502
+ return { content: [{ type: "text", text: `updated: ${formatTask(task)}` }] };
8499
8503
  } catch (e) {
8500
8504
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8501
8505
  }
@@ -8516,28 +8520,26 @@ ${formatTask(task)}` }] };
8516
8520
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8517
8521
  }
8518
8522
  });
8519
- server.tool("start_task", "Claim a task, lock it, and set status to in_progress", {
8523
+ server.tool("start_task", "Claim, lock, and set task status to in_progress.", {
8520
8524
  id: exports_external.string().describe("Task ID (full or partial)"),
8521
8525
  agent_id: exports_external.string().describe("Agent claiming the task")
8522
8526
  }, async ({ id, agent_id }) => {
8523
8527
  try {
8524
8528
  const resolvedId = resolveId(id);
8525
8529
  const task = startTask(resolvedId, agent_id);
8526
- return { content: [{ type: "text", text: `Task started:
8527
- ${formatTask(task)}` }] };
8530
+ return { content: [{ type: "text", text: `started: ${formatTask(task)}` }] };
8528
8531
  } catch (e) {
8529
8532
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8530
8533
  }
8531
8534
  });
8532
- server.tool("complete_task", "Mark a task as completed and release lock", {
8535
+ server.tool("complete_task", "Mark task completed and release lock.", {
8533
8536
  id: exports_external.string().describe("Task ID (full or partial)"),
8534
8537
  agent_id: exports_external.string().optional().describe("Agent completing the task")
8535
8538
  }, async ({ id, agent_id }) => {
8536
8539
  try {
8537
8540
  const resolvedId = resolveId(id);
8538
8541
  const task = completeTask(resolvedId, agent_id);
8539
- return { content: [{ type: "text", text: `Task completed:
8540
- ${formatTask(task)}` }] };
8542
+ return { content: [{ type: "text", text: `completed: ${formatTask(task)}` }] };
8541
8543
  } catch (e) {
8542
8544
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8543
8545
  }
@@ -8569,7 +8571,7 @@ ${formatTask(task)}` }] };
8569
8571
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8570
8572
  }
8571
8573
  });
8572
- server.tool("add_dependency", "Add a dependency between tasks (task_id depends on depends_on)", {
8574
+ server.tool("add_dependency", "Add a dependency: task_id depends on depends_on.", {
8573
8575
  task_id: exports_external.string().describe("Task that depends on another"),
8574
8576
  depends_on: exports_external.string().describe("Task that must complete first")
8575
8577
  }, async ({ task_id, depends_on }) => {
@@ -8760,7 +8762,7 @@ ${text}` }] };
8760
8762
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8761
8763
  }
8762
8764
  });
8763
- server.tool("search_tasks", "Full-text search across task titles, descriptions, and tags", {
8765
+ server.tool("search_tasks", "Full-text search across task titles, descriptions, tags.", {
8764
8766
  query: exports_external.string().describe("Search query"),
8765
8767
  project_id: exports_external.string().optional().describe("Limit to project"),
8766
8768
  task_list_id: exports_external.string().optional().describe("Filter by task list")
@@ -8780,7 +8782,7 @@ ${text}` }] };
8780
8782
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8781
8783
  }
8782
8784
  });
8783
- server.tool("sync", "Sync tasks with an agent task list (Claude uses native task list; others use JSON lists).", {
8785
+ server.tool("sync", "Sync tasks with an agent task list.", {
8784
8786
  task_list_id: exports_external.string().optional().describe("Task list ID (required for Claude)"),
8785
8787
  agent: exports_external.string().optional().describe("Agent/provider name (default: claude)"),
8786
8788
  all_agents: exports_external.boolean().optional().describe("Sync across all configured agents"),
@@ -8828,7 +8830,7 @@ ${text}` }] };
8828
8830
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8829
8831
  }
8830
8832
  });
8831
- server.tool("register_agent", "Register an agent and get a short UUID. Idempotent: same name returns existing agent.", {
8833
+ server.tool("register_agent", "Register an agent (idempotent by name).", {
8832
8834
  name: exports_external.string().describe("Agent name"),
8833
8835
  description: exports_external.string().optional().describe("Agent description")
8834
8836
  }, async ({ name, description }) => {
@@ -8988,7 +8990,7 @@ Slug: ${list.slug}`
8988
8990
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
8989
8991
  }
8990
8992
  });
8991
- server.tool("delete_task_list", "Delete a task list. Tasks in this list keep their data but lose their list association.", {
8993
+ server.tool("delete_task_list", "Delete a task list. Tasks lose association but keep data.", {
8992
8994
  id: exports_external.string().describe("Task list ID (full or partial)")
8993
8995
  }, async ({ id }) => {
8994
8996
  try {
@@ -9004,7 +9006,7 @@ Slug: ${list.slug}`
9004
9006
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9005
9007
  }
9006
9008
  });
9007
- server.tool("get_task_history", "Get change history for a task (audit log)", {
9009
+ server.tool("get_task_history", "Get audit log for a task.", {
9008
9010
  task_id: exports_external.string().describe("Task ID (full or partial)")
9009
9011
  }, async ({ task_id }) => {
9010
9012
  try {
@@ -9021,7 +9023,7 @@ ${text}` }] };
9021
9023
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9022
9024
  }
9023
9025
  });
9024
- server.tool("get_recent_activity", "Get recent task changes across all tasks (audit log)", {
9026
+ server.tool("get_recent_activity", "Get recent task changes across all tasks.", {
9025
9027
  limit: exports_external.number().optional().describe("Max entries (default 50)")
9026
9028
  }, async ({ limit }) => {
9027
9029
  try {
@@ -9037,7 +9039,7 @@ ${text}` }] };
9037
9039
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9038
9040
  }
9039
9041
  });
9040
- server.tool("create_webhook", "Register a webhook URL to receive task change notifications", {
9042
+ server.tool("create_webhook", "Register a webhook to receive task change events.", {
9041
9043
  url: exports_external.string().describe("Webhook URL"),
9042
9044
  events: exports_external.array(exports_external.string()).optional().describe("Event types to subscribe to (empty = all)"),
9043
9045
  secret: exports_external.string().optional().describe("HMAC secret for signature verification")
@@ -9075,7 +9077,7 @@ ${text}` }] };
9075
9077
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9076
9078
  }
9077
9079
  });
9078
- server.tool("create_template", "Create a reusable task template", {
9080
+ server.tool("create_template", "Create a reusable task template.", {
9079
9081
  name: exports_external.string().describe("Template name"),
9080
9082
  title_pattern: exports_external.string().describe("Title pattern for tasks created from this template"),
9081
9083
  description: exports_external.string().optional().describe("Default description"),
@@ -9106,7 +9108,7 @@ ${text}` }] };
9106
9108
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9107
9109
  }
9108
9110
  });
9109
- server.tool("create_task_from_template", "Create a task from a template with optional overrides", {
9111
+ server.tool("create_task_from_template", "Create a task from a template with optional overrides.", {
9110
9112
  template_id: exports_external.string().describe("Template ID"),
9111
9113
  title: exports_external.string().optional().describe("Override title"),
9112
9114
  description: exports_external.string().optional().describe("Override description"),
@@ -9139,7 +9141,7 @@ ${task.id.slice(0, 8)} | ${task.priority} | ${task.title}` }] };
9139
9141
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9140
9142
  }
9141
9143
  });
9142
- server.tool("approve_task", "Approve a task that requires approval before completion", {
9144
+ server.tool("approve_task", "Approve a task that requires approval.", {
9143
9145
  id: exports_external.string().describe("Task ID (full or partial)"),
9144
9146
  agent_id: exports_external.string().optional().describe("Agent approving the task")
9145
9147
  }, async ({ id, agent_id }) => {
@@ -9158,7 +9160,7 @@ ${task.id.slice(0, 8)} | ${task.priority} | ${task.title}` }] };
9158
9160
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9159
9161
  }
9160
9162
  });
9161
- server.tool("get_my_tasks", "Get your assigned tasks and stats. Auto-registers if needed.", {
9163
+ server.tool("get_my_tasks", "Get assigned tasks and stats for an agent.", {
9162
9164
  agent_name: exports_external.string().describe("Your agent name")
9163
9165
  }, async ({ agent_name }) => {
9164
9166
  try {
@@ -9191,6 +9193,79 @@ In Progress:`);
9191
9193
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
9192
9194
  }
9193
9195
  });
9196
+ server.tool("search_tools", "List tool names matching a query.", { query: exports_external.string().optional().describe("Keyword to filter tools") }, async ({ query }) => {
9197
+ const all = [
9198
+ "create_task",
9199
+ "list_tasks",
9200
+ "get_task",
9201
+ "update_task",
9202
+ "delete_task",
9203
+ "start_task",
9204
+ "complete_task",
9205
+ "lock_task",
9206
+ "unlock_task",
9207
+ "approve_task",
9208
+ "add_dependency",
9209
+ "remove_dependency",
9210
+ "add_comment",
9211
+ "create_project",
9212
+ "list_projects",
9213
+ "create_plan",
9214
+ "list_plans",
9215
+ "get_plan",
9216
+ "update_plan",
9217
+ "delete_plan",
9218
+ "register_agent",
9219
+ "list_agents",
9220
+ "get_agent",
9221
+ "get_my_tasks",
9222
+ "create_task_list",
9223
+ "list_task_lists",
9224
+ "get_task_list",
9225
+ "update_task_list",
9226
+ "delete_task_list",
9227
+ "search_tasks",
9228
+ "sync",
9229
+ "get_task_history",
9230
+ "get_recent_activity",
9231
+ "create_webhook",
9232
+ "list_webhooks",
9233
+ "delete_webhook",
9234
+ "create_template",
9235
+ "list_templates",
9236
+ "create_task_from_template",
9237
+ "delete_template",
9238
+ "search_tools",
9239
+ "describe_tools"
9240
+ ];
9241
+ const q = query?.toLowerCase();
9242
+ const matches = q ? all.filter((n) => n.includes(q)) : all;
9243
+ return { content: [{ type: "text", text: matches.join(", ") }] };
9244
+ });
9245
+ server.tool("describe_tools", "Get descriptions for specific tools by name.", { names: exports_external.array(exports_external.string()).describe("Tool names from search_tools") }, async ({ names }) => {
9246
+ const descriptions = {
9247
+ create_task: "Create a task. Params: title(req), description, priority, project_id, plan_id, tags, assigned_to, estimated_minutes, requires_approval",
9248
+ list_tasks: "List tasks. Params: status, priority, project_id, plan_id, assigned_to, tags, limit",
9249
+ get_task: "Get full task details. Params: id",
9250
+ update_task: "Update task fields. Params: id, version(req), title, description, status, priority, tags, assigned_to, due_at",
9251
+ delete_task: "Delete a task. Params: id",
9252
+ start_task: "Claim, lock, and start a task. Params: id",
9253
+ complete_task: "Mark task completed. Params: id, agent_id",
9254
+ approve_task: "Approve task requiring approval. Params: id, agent_id",
9255
+ create_plan: "Create a plan. Params: name, description, project_id, task_list_id, agent_id, status",
9256
+ list_plans: "List plans. Params: project_id",
9257
+ get_plan: "Get plan with tasks. Params: id",
9258
+ search_tasks: "Full-text search tasks. Params: query, project_id, task_list_id",
9259
+ get_my_tasks: "Get your tasks and stats. Params: agent_name",
9260
+ get_task_history: "Get task audit log. Params: task_id",
9261
+ get_recent_activity: "Recent changes across all tasks. Params: limit",
9262
+ create_template: "Create task template. Params: name, title_pattern, description, priority, tags",
9263
+ create_task_from_template: "Create task from template. Params: template_id, title, priority, assigned_to"
9264
+ };
9265
+ const result = names.map((n) => `${n}: ${descriptions[n] || "See tool schema"}`).join(`
9266
+ `);
9267
+ return { content: [{ type: "text", text: result }] };
9268
+ });
9194
9269
  server.resource("tasks", "todos://tasks", { description: "All active tasks", mimeType: "application/json" }, async () => {
9195
9270
  const tasks = listTasks({ status: ["pending", "in_progress"] });
9196
9271
  return { contents: [{ uri: "todos://tasks", text: JSON.stringify(tasks, null, 2), mimeType: "application/json" }] };
@@ -9259,8 +9334,8 @@ function serveStaticFile(filePath) {
9259
9334
  headers: { "Content-Type": contentType }
9260
9335
  });
9261
9336
  }
9262
- function taskToSummary(task) {
9263
- return {
9337
+ function taskToSummary(task, fields) {
9338
+ const full = {
9264
9339
  id: task.id,
9265
9340
  short_id: task.short_id,
9266
9341
  title: task.title,
@@ -9280,6 +9355,9 @@ function taskToSummary(task) {
9280
9355
  completed_at: task.completed_at,
9281
9356
  due_at: task.due_at
9282
9357
  };
9358
+ if (!fields || fields.length === 0)
9359
+ return full;
9360
+ return Object.fromEntries(fields.map((f) => [f, full[f] ?? null]));
9283
9361
  }
9284
9362
  async function startServer(port, options) {
9285
9363
  const shouldOpen = options?.open ?? true;
@@ -9362,12 +9440,14 @@ Dashboard not found at: ${dashboardDir}`);
9362
9440
  const status = url.searchParams.get("status") || undefined;
9363
9441
  const projectId = url.searchParams.get("project_id") || undefined;
9364
9442
  const limitParam = url.searchParams.get("limit");
9443
+ const fieldsParam = url.searchParams.get("fields");
9444
+ const fields = fieldsParam ? fieldsParam.split(",").map((f) => f.trim()).filter(Boolean) : undefined;
9365
9445
  const tasks = listTasks({
9366
9446
  status,
9367
9447
  project_id: projectId,
9368
9448
  limit: limitParam ? parseInt(limitParam, 10) : undefined
9369
9449
  });
9370
- return json(tasks.map(taskToSummary), 200, port);
9450
+ return json(tasks.map((t) => taskToSummary(t, fields)), 200, port);
9371
9451
  }
9372
9452
  if (path === "/api/tasks" && method === "POST") {
9373
9453
  try {
@@ -9391,7 +9471,7 @@ Dashboard not found at: ${dashboardDir}`);
9391
9471
  const status = url.searchParams.get("status") || undefined;
9392
9472
  const projectId = url.searchParams.get("project_id") || undefined;
9393
9473
  const tasks = listTasks({ status, project_id: projectId, limit: 1e4 });
9394
- const summaries = tasks.map(taskToSummary);
9474
+ const summaries = tasks.map((t) => taskToSummary(t));
9395
9475
  if (format === "csv") {
9396
9476
  const headers = ["id", "short_id", "title", "status", "priority", "project_id", "assigned_to", "agent_id", "created_at", "updated_at", "completed_at", "due_at"];
9397
9477
  const rows = summaries.map((t) => headers.map((h) => {
@@ -9517,8 +9597,8 @@ Dashboard not found at: ${dashboardDir}`);
9517
9597
  const completed = allTasks.filter((t) => t.status === "completed");
9518
9598
  return json({
9519
9599
  agent,
9520
- pending_tasks: pending.map(taskToSummary),
9521
- in_progress_tasks: inProgress.map(taskToSummary),
9600
+ pending_tasks: pending.map((t) => taskToSummary(t)),
9601
+ in_progress_tasks: inProgress.map((t) => taskToSummary(t)),
9522
9602
  stats: {
9523
9603
  total: allTasks.length,
9524
9604
  pending: pending.length,
@@ -9535,7 +9615,7 @@ Dashboard not found at: ${dashboardDir}`);
9535
9615
  const queue = pending.filter((t) => t.assigned_to === agentId || t.agent_id === agentId || !t.assigned_to && !t.locked_by);
9536
9616
  const order = { critical: 0, high: 1, medium: 2, low: 3 };
9537
9617
  queue.sort((a, b) => (order[a.priority] ?? 4) - (order[b.priority] ?? 4) || new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
9538
- return json(queue.map(taskToSummary), 200, port);
9618
+ return json(queue.map((t) => taskToSummary(t)), 200, port);
9539
9619
  }
9540
9620
  if (path === "/api/tasks/claim" && method === "POST") {
9541
9621
  try {
@@ -9751,7 +9831,7 @@ Dashboard not found at: ${dashboardDir}`);
9751
9831
  if (!plan)
9752
9832
  return json({ error: "Plan not found" }, 404, port);
9753
9833
  const tasks = listTasks({ plan_id: id });
9754
- return json({ ...plan, tasks: tasks.map(taskToSummary) }, 200, port);
9834
+ return json({ ...plan, tasks: tasks.map((t) => taskToSummary(t)) }, 200, port);
9755
9835
  }
9756
9836
  if (method === "PATCH") {
9757
9837
  try {
@@ -11043,7 +11123,7 @@ program2.command("add <title>").description("Create a new task").option("-d, --d
11043
11123
  console.log(formatTaskLine(task));
11044
11124
  }
11045
11125
  });
11046
- program2.command("list").description("List tasks").option("-s, --status <status>", "Filter by status").option("-p, --priority <priority>", "Filter by priority").option("--assigned <agent>", "Filter by assigned agent").option("--tags <tags>", "Filter by tags (comma-separated)").option("--tag <tags>", "Filter by tags (alias for --tags)").option("-a, --all", "Show all tasks (including completed/cancelled)").option("--list <id>", "Filter by task list ID").option("--task-list <id>", "Filter by task list ID (alias for --list)").option("--project-name <name>", "Filter by project name").option("--agent-name <name>", "Filter by agent name/assigned").option("--sort <field>", "Sort by: updated, created, priority, status").action((opts) => {
11126
+ program2.command("list").description("List tasks").option("-s, --status <status>", "Filter by status").option("-p, --priority <priority>", "Filter by priority").option("--assigned <agent>", "Filter by assigned agent").option("--tags <tags>", "Filter by tags (comma-separated)").option("--tag <tags>", "Filter by tags (alias for --tags)").option("-a, --all", "Show all tasks (including completed/cancelled)").option("--list <id>", "Filter by task list ID").option("--task-list <id>", "Filter by task list ID (alias for --list)").option("--project-name <name>", "Filter by project name").option("--agent-name <name>", "Filter by agent name/assigned").option("--sort <field>", "Sort by: updated, created, priority, status").option("--format <fmt>", "Output format: table (default), compact, csv, json").action((opts) => {
11047
11127
  const globalOpts = program2.opts();
11048
11128
  opts.tags = opts.tags || opts.tag;
11049
11129
  opts.list = opts.list || opts.taskList;
@@ -11099,12 +11179,40 @@ program2.command("list").description("List tasks").option("-s, --status <status>
11099
11179
  return 0;
11100
11180
  });
11101
11181
  }
11102
- if (globalOpts.json) {
11182
+ const fmt = opts.format || (globalOpts.json ? "json" : "table");
11183
+ if (fmt === "json") {
11103
11184
  output(tasks, true);
11104
11185
  return;
11105
11186
  }
11106
11187
  if (tasks.length === 0) {
11107
- console.log(chalk.dim("No tasks found."));
11188
+ if (fmt === "compact" || fmt === "csv")
11189
+ process.stdout.write("");
11190
+ else
11191
+ console.log(chalk.dim("No tasks found."));
11192
+ return;
11193
+ }
11194
+ if (fmt === "csv") {
11195
+ const headers = "id,short_id,title,status,priority,assigned_to,updated_at";
11196
+ const rows = tasks.map((t) => [
11197
+ t.id,
11198
+ t.short_id || "",
11199
+ t.title.replace(/,/g, ";"),
11200
+ t.status,
11201
+ t.priority,
11202
+ t.assigned_to || "",
11203
+ t.updated_at
11204
+ ].join(","));
11205
+ console.log([headers, ...rows].join(`
11206
+ `));
11207
+ return;
11208
+ }
11209
+ if (fmt === "compact") {
11210
+ for (const t of tasks) {
11211
+ const id = t.short_id || t.id.slice(0, 8);
11212
+ const assigned = t.assigned_to ? ` ${t.assigned_to}` : "";
11213
+ process.stdout.write(`${id} ${t.status} ${t.priority} ${t.title}${assigned}
11214
+ `);
11215
+ }
11108
11216
  return;
11109
11217
  }
11110
11218
  console.log(chalk.bold(`${tasks.length} task(s):
package/dist/mcp/index.js CHANGED
@@ -6129,22 +6129,22 @@ function formatTaskDetail(task) {
6129
6129
  `);
6130
6130
  }
6131
6131
  server.tool("create_task", "Create a new task", {
6132
- title: exports_external.string().describe("Task title"),
6133
- description: exports_external.string().optional().describe("Task description"),
6134
- project_id: exports_external.string().optional().describe("Project ID"),
6135
- parent_id: exports_external.string().optional().describe("Parent task ID (for subtasks)"),
6136
- priority: exports_external.enum(["low", "medium", "high", "critical"]).optional().describe("Task priority"),
6137
- status: exports_external.enum(["pending", "in_progress", "completed", "failed", "cancelled"]).optional().describe("Initial status"),
6138
- agent_id: exports_external.string().optional().describe("Creator agent ID"),
6139
- assigned_to: exports_external.string().optional().describe("Assigned agent ID"),
6140
- session_id: exports_external.string().optional().describe("Session ID"),
6141
- working_dir: exports_external.string().optional().describe("Working directory context"),
6142
- plan_id: exports_external.string().optional().describe("Plan ID to assign task to"),
6143
- task_list_id: exports_external.string().optional().describe("Task list ID to assign task to"),
6144
- tags: exports_external.array(exports_external.string()).optional().describe("Task tags"),
6145
- metadata: exports_external.record(exports_external.unknown()).optional().describe("Arbitrary metadata"),
6146
- estimated_minutes: exports_external.number().optional().describe("Estimated time in minutes"),
6147
- requires_approval: exports_external.boolean().optional().describe("Require approval before completion")
6132
+ title: exports_external.string(),
6133
+ description: exports_external.string().optional(),
6134
+ project_id: exports_external.string().optional(),
6135
+ parent_id: exports_external.string().optional(),
6136
+ priority: exports_external.enum(["low", "medium", "high", "critical"]).optional(),
6137
+ status: exports_external.enum(["pending", "in_progress", "completed", "failed", "cancelled"]).optional(),
6138
+ agent_id: exports_external.string().optional(),
6139
+ assigned_to: exports_external.string().optional(),
6140
+ session_id: exports_external.string().optional(),
6141
+ working_dir: exports_external.string().optional(),
6142
+ plan_id: exports_external.string().optional(),
6143
+ task_list_id: exports_external.string().optional(),
6144
+ tags: exports_external.array(exports_external.string()).optional(),
6145
+ metadata: exports_external.record(exports_external.unknown()).optional(),
6146
+ estimated_minutes: exports_external.number().optional(),
6147
+ requires_approval: exports_external.boolean().optional()
6148
6148
  }, async (params) => {
6149
6149
  try {
6150
6150
  const resolved = { ...params };
@@ -6163,19 +6163,19 @@ server.tool("create_task", "Create a new task", {
6163
6163
  }
6164
6164
  });
6165
6165
  server.tool("list_tasks", "List tasks with optional filters", {
6166
- project_id: exports_external.string().optional().describe("Filter by project"),
6166
+ project_id: exports_external.string().optional(),
6167
6167
  status: exports_external.union([
6168
6168
  exports_external.enum(["pending", "in_progress", "completed", "failed", "cancelled"]),
6169
6169
  exports_external.array(exports_external.enum(["pending", "in_progress", "completed", "failed", "cancelled"]))
6170
- ]).optional().describe("Filter by status"),
6170
+ ]).optional(),
6171
6171
  priority: exports_external.union([
6172
6172
  exports_external.enum(["low", "medium", "high", "critical"]),
6173
6173
  exports_external.array(exports_external.enum(["low", "medium", "high", "critical"]))
6174
- ]).optional().describe("Filter by priority"),
6175
- assigned_to: exports_external.string().optional().describe("Filter by assigned agent"),
6176
- tags: exports_external.array(exports_external.string()).optional().describe("Filter by tags (any match)"),
6177
- plan_id: exports_external.string().optional().describe("Filter by plan"),
6178
- task_list_id: exports_external.string().optional().describe("Filter by task list")
6174
+ ]).optional(),
6175
+ assigned_to: exports_external.string().optional(),
6176
+ tags: exports_external.array(exports_external.string()).optional(),
6177
+ plan_id: exports_external.string().optional(),
6178
+ task_list_id: exports_external.string().optional()
6179
6179
  }, async (params) => {
6180
6180
  try {
6181
6181
  const resolved = { ...params };
@@ -6202,7 +6202,7 @@ ${text}` }] };
6202
6202
  }
6203
6203
  });
6204
6204
  server.tool("get_task", "Get full task details with relations", {
6205
- id: exports_external.string().describe("Task ID (full or partial)")
6205
+ id: exports_external.string()
6206
6206
  }, async ({ id }) => {
6207
6207
  try {
6208
6208
  const resolvedId = resolveId(id);
@@ -6250,17 +6250,17 @@ Parent: ${task.parent.id.slice(0, 8)} | ${task.parent.title}`);
6250
6250
  }
6251
6251
  });
6252
6252
  server.tool("update_task", "Update task fields. Version required for optimistic locking.", {
6253
- id: exports_external.string().describe("Task ID (full or partial)"),
6254
- version: exports_external.number().describe("Current version (for optimistic locking)"),
6255
- title: exports_external.string().optional().describe("New title"),
6256
- description: exports_external.string().optional().describe("New description"),
6257
- status: exports_external.enum(["pending", "in_progress", "completed", "failed", "cancelled"]).optional().describe("New status"),
6258
- priority: exports_external.enum(["low", "medium", "high", "critical"]).optional().describe("New priority"),
6259
- assigned_to: exports_external.string().optional().describe("Assign to agent"),
6260
- tags: exports_external.array(exports_external.string()).optional().describe("New tags"),
6261
- metadata: exports_external.record(exports_external.unknown()).optional().describe("New metadata"),
6262
- plan_id: exports_external.string().optional().describe("Plan ID to assign task to"),
6263
- task_list_id: exports_external.string().optional().describe("Task list ID")
6253
+ id: exports_external.string(),
6254
+ version: exports_external.number(),
6255
+ title: exports_external.string().optional(),
6256
+ description: exports_external.string().optional(),
6257
+ status: exports_external.enum(["pending", "in_progress", "completed", "failed", "cancelled"]).optional(),
6258
+ priority: exports_external.enum(["low", "medium", "high", "critical"]).optional(),
6259
+ assigned_to: exports_external.string().optional(),
6260
+ tags: exports_external.array(exports_external.string()).optional(),
6261
+ metadata: exports_external.record(exports_external.unknown()).optional(),
6262
+ plan_id: exports_external.string().optional(),
6263
+ task_list_id: exports_external.string().optional()
6264
6264
  }, async ({ id, ...rest }) => {
6265
6265
  try {
6266
6266
  const resolvedId = resolveId(id);
@@ -6271,7 +6271,7 @@ server.tool("update_task", "Update task fields. Version required for optimistic
6271
6271
  }
6272
6272
  });
6273
6273
  server.tool("delete_task", "Delete a task permanently", {
6274
- id: exports_external.string().describe("Task ID (full or partial)")
6274
+ id: exports_external.string()
6275
6275
  }, async ({ id }) => {
6276
6276
  try {
6277
6277
  const resolvedId = resolveId(id);
@@ -6287,8 +6287,8 @@ server.tool("delete_task", "Delete a task permanently", {
6287
6287
  }
6288
6288
  });
6289
6289
  server.tool("start_task", "Claim, lock, and set task status to in_progress.", {
6290
- id: exports_external.string().describe("Task ID (full or partial)"),
6291
- agent_id: exports_external.string().describe("Agent claiming the task")
6290
+ id: exports_external.string(),
6291
+ agent_id: exports_external.string()
6292
6292
  }, async ({ id, agent_id }) => {
6293
6293
  try {
6294
6294
  const resolvedId = resolveId(id);
@@ -6299,8 +6299,8 @@ server.tool("start_task", "Claim, lock, and set task status to in_progress.", {
6299
6299
  }
6300
6300
  });
6301
6301
  server.tool("complete_task", "Mark task completed and release lock.", {
6302
- id: exports_external.string().describe("Task ID (full or partial)"),
6303
- agent_id: exports_external.string().optional().describe("Agent completing the task")
6302
+ id: exports_external.string(),
6303
+ agent_id: exports_external.string().optional()
6304
6304
  }, async ({ id, agent_id }) => {
6305
6305
  try {
6306
6306
  const resolvedId = resolveId(id);
@@ -6311,8 +6311,8 @@ server.tool("complete_task", "Mark task completed and release lock.", {
6311
6311
  }
6312
6312
  });
6313
6313
  server.tool("lock_task", "Acquire exclusive lock on a task", {
6314
- id: exports_external.string().describe("Task ID (full or partial)"),
6315
- agent_id: exports_external.string().describe("Agent acquiring lock")
6314
+ id: exports_external.string(),
6315
+ agent_id: exports_external.string()
6316
6316
  }, async ({ id, agent_id }) => {
6317
6317
  try {
6318
6318
  const resolvedId = resolveId(id);
@@ -6326,8 +6326,8 @@ server.tool("lock_task", "Acquire exclusive lock on a task", {
6326
6326
  }
6327
6327
  });
6328
6328
  server.tool("unlock_task", "Release exclusive lock on a task", {
6329
- id: exports_external.string().describe("Task ID (full or partial)"),
6330
- agent_id: exports_external.string().optional().describe("Agent releasing lock (omit to force)")
6329
+ id: exports_external.string(),
6330
+ agent_id: exports_external.string().optional()
6331
6331
  }, async ({ id, agent_id }) => {
6332
6332
  try {
6333
6333
  const resolvedId = resolveId(id);
@@ -6338,8 +6338,8 @@ server.tool("unlock_task", "Release exclusive lock on a task", {
6338
6338
  }
6339
6339
  });
6340
6340
  server.tool("add_dependency", "Add a dependency: task_id depends on depends_on.", {
6341
- task_id: exports_external.string().describe("Task that depends on another"),
6342
- depends_on: exports_external.string().describe("Task that must complete first")
6341
+ task_id: exports_external.string(),
6342
+ depends_on: exports_external.string()
6343
6343
  }, async ({ task_id, depends_on }) => {
6344
6344
  try {
6345
6345
  const resolvedTaskId = resolveId(task_id);
@@ -6351,8 +6351,8 @@ server.tool("add_dependency", "Add a dependency: task_id depends on depends_on."
6351
6351
  }
6352
6352
  });
6353
6353
  server.tool("remove_dependency", "Remove a dependency between tasks", {
6354
- task_id: exports_external.string().describe("Task ID"),
6355
- depends_on: exports_external.string().describe("Dependency to remove")
6354
+ task_id: exports_external.string(),
6355
+ depends_on: exports_external.string()
6356
6356
  }, async ({ task_id, depends_on }) => {
6357
6357
  try {
6358
6358
  const resolvedTaskId = resolveId(task_id);
@@ -6369,10 +6369,10 @@ server.tool("remove_dependency", "Remove a dependency between tasks", {
6369
6369
  }
6370
6370
  });
6371
6371
  server.tool("add_comment", "Add a comment/note to a task", {
6372
- task_id: exports_external.string().describe("Task ID (full or partial)"),
6373
- content: exports_external.string().describe("Comment content"),
6374
- agent_id: exports_external.string().optional().describe("Agent adding comment"),
6375
- session_id: exports_external.string().optional().describe("Session ID")
6372
+ task_id: exports_external.string(),
6373
+ content: exports_external.string(),
6374
+ agent_id: exports_external.string().optional(),
6375
+ session_id: exports_external.string().optional()
6376
6376
  }, async ({ task_id, ...rest }) => {
6377
6377
  try {
6378
6378
  const resolvedId = resolveId(task_id);
@@ -6400,10 +6400,10 @@ ${text}` }] };
6400
6400
  }
6401
6401
  });
6402
6402
  server.tool("create_project", "Register a new project", {
6403
- name: exports_external.string().describe("Project name"),
6404
- path: exports_external.string().describe("Absolute path to project"),
6405
- description: exports_external.string().optional().describe("Project description"),
6406
- task_list_id: exports_external.string().optional().describe("Custom task list ID for Claude Code sync (defaults to todos-<slugified-name>)")
6403
+ name: exports_external.string(),
6404
+ path: exports_external.string(),
6405
+ description: exports_external.string().optional(),
6406
+ task_list_id: exports_external.string().optional()
6407
6407
  }, async (params) => {
6408
6408
  try {
6409
6409
  const project = createProject(params);
@@ -6419,12 +6419,12 @@ server.tool("create_project", "Register a new project", {
6419
6419
  }
6420
6420
  });
6421
6421
  server.tool("create_plan", "Create a new plan", {
6422
- name: exports_external.string().describe("Plan name"),
6423
- project_id: exports_external.string().optional().describe("Project ID"),
6424
- description: exports_external.string().optional().describe("Plan description"),
6425
- status: exports_external.enum(["active", "completed", "archived"]).optional().describe("Plan status"),
6426
- task_list_id: exports_external.string().optional().describe("Task list ID"),
6427
- agent_id: exports_external.string().optional().describe("Owner agent ID")
6422
+ name: exports_external.string(),
6423
+ project_id: exports_external.string().optional(),
6424
+ description: exports_external.string().optional(),
6425
+ status: exports_external.enum(["active", "completed", "archived"]).optional(),
6426
+ task_list_id: exports_external.string().optional(),
6427
+ agent_id: exports_external.string().optional()
6428
6428
  }, async (params) => {
6429
6429
  try {
6430
6430
  const resolved = { ...params };
@@ -6444,7 +6444,7 @@ server.tool("create_plan", "Create a new plan", {
6444
6444
  }
6445
6445
  });
6446
6446
  server.tool("list_plans", "List plans with optional project filter", {
6447
- project_id: exports_external.string().optional().describe("Filter by project")
6447
+ project_id: exports_external.string().optional()
6448
6448
  }, async ({ project_id }) => {
6449
6449
  try {
6450
6450
  const resolvedProjectId = project_id ? resolveId(project_id, "projects") : undefined;
@@ -6464,7 +6464,7 @@ ${text}` }] };
6464
6464
  }
6465
6465
  });
6466
6466
  server.tool("get_plan", "Get plan details", {
6467
- id: exports_external.string().describe("Plan ID (full or partial)")
6467
+ id: exports_external.string()
6468
6468
  }, async ({ id }) => {
6469
6469
  try {
6470
6470
  const resolvedId = resolveId(id, "plans");
@@ -6489,12 +6489,12 @@ server.tool("get_plan", "Get plan details", {
6489
6489
  }
6490
6490
  });
6491
6491
  server.tool("update_plan", "Update a plan", {
6492
- id: exports_external.string().describe("Plan ID (full or partial)"),
6493
- name: exports_external.string().optional().describe("New name"),
6494
- description: exports_external.string().optional().describe("New description"),
6495
- status: exports_external.enum(["active", "completed", "archived"]).optional().describe("New status"),
6496
- task_list_id: exports_external.string().optional().describe("Task list ID"),
6497
- agent_id: exports_external.string().optional().describe("Owner agent ID")
6492
+ id: exports_external.string(),
6493
+ name: exports_external.string().optional(),
6494
+ description: exports_external.string().optional(),
6495
+ status: exports_external.enum(["active", "completed", "archived"]).optional(),
6496
+ task_list_id: exports_external.string().optional(),
6497
+ agent_id: exports_external.string().optional()
6498
6498
  }, async ({ id, ...rest }) => {
6499
6499
  try {
6500
6500
  const resolvedId = resolveId(id, "plans");
@@ -6513,7 +6513,7 @@ server.tool("update_plan", "Update a plan", {
6513
6513
  }
6514
6514
  });
6515
6515
  server.tool("delete_plan", "Delete a plan", {
6516
- id: exports_external.string().describe("Plan ID (full or partial)")
6516
+ id: exports_external.string()
6517
6517
  }, async ({ id }) => {
6518
6518
  try {
6519
6519
  const resolvedId = resolveId(id, "plans");
@@ -6529,9 +6529,9 @@ server.tool("delete_plan", "Delete a plan", {
6529
6529
  }
6530
6530
  });
6531
6531
  server.tool("search_tasks", "Full-text search across task titles, descriptions, tags.", {
6532
- query: exports_external.string().describe("Search query"),
6533
- project_id: exports_external.string().optional().describe("Limit to project"),
6534
- task_list_id: exports_external.string().optional().describe("Filter by task list")
6532
+ query: exports_external.string(),
6533
+ project_id: exports_external.string().optional(),
6534
+ task_list_id: exports_external.string().optional()
6535
6535
  }, async ({ query, project_id, task_list_id }) => {
6536
6536
  try {
6537
6537
  const resolvedProjectId = project_id ? resolveId(project_id, "projects") : undefined;
@@ -6549,12 +6549,12 @@ ${text}` }] };
6549
6549
  }
6550
6550
  });
6551
6551
  server.tool("sync", "Sync tasks with an agent task list.", {
6552
- task_list_id: exports_external.string().optional().describe("Task list ID (required for Claude)"),
6553
- agent: exports_external.string().optional().describe("Agent/provider name (default: claude)"),
6554
- all_agents: exports_external.boolean().optional().describe("Sync across all configured agents"),
6555
- project_id: exports_external.string().optional().describe("Project ID \u2014 its task_list_id will be used for Claude if task_list_id is not provided"),
6556
- direction: exports_external.enum(["push", "pull", "both"]).optional().describe("Sync direction: push (SQLite->agent), pull (agent->SQLite), or both (default)"),
6557
- prefer: exports_external.enum(["local", "remote"]).optional().describe("Conflict strategy")
6552
+ task_list_id: exports_external.string().optional(),
6553
+ agent: exports_external.string().optional(),
6554
+ all_agents: exports_external.boolean().optional(),
6555
+ project_id: exports_external.string().optional(),
6556
+ direction: exports_external.enum(["push", "pull", "both"]).optional(),
6557
+ prefer: exports_external.enum(["local", "remote"]).optional()
6558
6558
  }, async ({ task_list_id, agent, all_agents, project_id, direction, prefer }) => {
6559
6559
  try {
6560
6560
  const resolvedProjectId = project_id ? resolveId(project_id, "projects") : undefined;
@@ -6597,8 +6597,8 @@ server.tool("sync", "Sync tasks with an agent task list.", {
6597
6597
  }
6598
6598
  });
6599
6599
  server.tool("register_agent", "Register an agent (idempotent by name).", {
6600
- name: exports_external.string().describe("Agent name"),
6601
- description: exports_external.string().optional().describe("Agent description")
6600
+ name: exports_external.string(),
6601
+ description: exports_external.string().optional()
6602
6602
  }, async ({ name, description }) => {
6603
6603
  try {
6604
6604
  const agent = registerAgent({ name, description });
@@ -6634,8 +6634,8 @@ ${text}` }] };
6634
6634
  }
6635
6635
  });
6636
6636
  server.tool("get_agent", "Get agent details by ID or name", {
6637
- id: exports_external.string().optional().describe("Agent ID"),
6638
- name: exports_external.string().optional().describe("Agent name")
6637
+ id: exports_external.string().optional(),
6638
+ name: exports_external.string().optional()
6639
6639
  }, async ({ id, name }) => {
6640
6640
  try {
6641
6641
  if (!id && !name) {
@@ -6662,10 +6662,10 @@ server.tool("get_agent", "Get agent details by ID or name", {
6662
6662
  }
6663
6663
  });
6664
6664
  server.tool("create_task_list", "Create a new task list", {
6665
- name: exports_external.string().describe("Task list name"),
6666
- slug: exports_external.string().optional().describe("URL-friendly slug (auto-generated from name if omitted)"),
6667
- project_id: exports_external.string().optional().describe("Project ID to associate with"),
6668
- description: exports_external.string().optional().describe("Task list description")
6665
+ name: exports_external.string(),
6666
+ slug: exports_external.string().optional(),
6667
+ project_id: exports_external.string().optional(),
6668
+ description: exports_external.string().optional()
6669
6669
  }, async (params) => {
6670
6670
  try {
6671
6671
  const resolved = { ...params };
@@ -6688,7 +6688,7 @@ Description: ${list.description}` : ""}`
6688
6688
  }
6689
6689
  });
6690
6690
  server.tool("list_task_lists", "List task lists, optionally filtered by project", {
6691
- project_id: exports_external.string().optional().describe("Filter by project")
6691
+ project_id: exports_external.string().optional()
6692
6692
  }, async ({ project_id }) => {
6693
6693
  try {
6694
6694
  const resolvedProjectId = project_id ? resolveId(project_id, "projects") : undefined;
@@ -6708,7 +6708,7 @@ ${text}` }] };
6708
6708
  }
6709
6709
  });
6710
6710
  server.tool("get_task_list", "Get task list details", {
6711
- id: exports_external.string().describe("Task list ID (full or partial)")
6711
+ id: exports_external.string()
6712
6712
  }, async ({ id }) => {
6713
6713
  try {
6714
6714
  const resolvedId = resolveId(id, "task_lists");
@@ -6736,9 +6736,9 @@ server.tool("get_task_list", "Get task list details", {
6736
6736
  }
6737
6737
  });
6738
6738
  server.tool("update_task_list", "Update a task list", {
6739
- id: exports_external.string().describe("Task list ID (full or partial)"),
6740
- name: exports_external.string().optional().describe("New name"),
6741
- description: exports_external.string().optional().describe("New description")
6739
+ id: exports_external.string(),
6740
+ name: exports_external.string().optional(),
6741
+ description: exports_external.string().optional()
6742
6742
  }, async ({ id, ...rest }) => {
6743
6743
  try {
6744
6744
  const resolvedId = resolveId(id, "task_lists");
@@ -6757,7 +6757,7 @@ Slug: ${list.slug}`
6757
6757
  }
6758
6758
  });
6759
6759
  server.tool("delete_task_list", "Delete a task list. Tasks lose association but keep data.", {
6760
- id: exports_external.string().describe("Task list ID (full or partial)")
6760
+ id: exports_external.string()
6761
6761
  }, async ({ id }) => {
6762
6762
  try {
6763
6763
  const resolvedId = resolveId(id, "task_lists");
@@ -6773,7 +6773,7 @@ server.tool("delete_task_list", "Delete a task list. Tasks lose association but
6773
6773
  }
6774
6774
  });
6775
6775
  server.tool("get_task_history", "Get audit log for a task.", {
6776
- task_id: exports_external.string().describe("Task ID (full or partial)")
6776
+ task_id: exports_external.string()
6777
6777
  }, async ({ task_id }) => {
6778
6778
  try {
6779
6779
  const resolvedId = resolveId(task_id);
@@ -6790,7 +6790,7 @@ ${text}` }] };
6790
6790
  }
6791
6791
  });
6792
6792
  server.tool("get_recent_activity", "Get recent task changes across all tasks.", {
6793
- limit: exports_external.number().optional().describe("Max entries (default 50)")
6793
+ limit: exports_external.number().optional()
6794
6794
  }, async ({ limit }) => {
6795
6795
  try {
6796
6796
  const { getRecentActivity: getRecentActivity2 } = await Promise.resolve().then(() => (init_audit(), exports_audit));
@@ -6806,9 +6806,9 @@ ${text}` }] };
6806
6806
  }
6807
6807
  });
6808
6808
  server.tool("create_webhook", "Register a webhook to receive task change events.", {
6809
- url: exports_external.string().describe("Webhook URL"),
6810
- events: exports_external.array(exports_external.string()).optional().describe("Event types to subscribe to (empty = all)"),
6811
- secret: exports_external.string().optional().describe("HMAC secret for signature verification")
6809
+ url: exports_external.string(),
6810
+ events: exports_external.array(exports_external.string()).optional(),
6811
+ secret: exports_external.string().optional()
6812
6812
  }, async (params) => {
6813
6813
  try {
6814
6814
  const { createWebhook: createWebhook2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
@@ -6833,7 +6833,7 @@ ${text}` }] };
6833
6833
  }
6834
6834
  });
6835
6835
  server.tool("delete_webhook", "Delete a webhook", {
6836
- id: exports_external.string().describe("Webhook ID")
6836
+ id: exports_external.string()
6837
6837
  }, async ({ id }) => {
6838
6838
  try {
6839
6839
  const { deleteWebhook: deleteWebhook2 } = await Promise.resolve().then(() => (init_webhooks(), exports_webhooks));
@@ -6844,13 +6844,13 @@ server.tool("delete_webhook", "Delete a webhook", {
6844
6844
  }
6845
6845
  });
6846
6846
  server.tool("create_template", "Create a reusable task template.", {
6847
- name: exports_external.string().describe("Template name"),
6848
- title_pattern: exports_external.string().describe("Title pattern for tasks created from this template"),
6849
- description: exports_external.string().optional().describe("Default description"),
6850
- priority: exports_external.enum(["low", "medium", "high", "critical"]).optional().describe("Default priority"),
6851
- tags: exports_external.array(exports_external.string()).optional().describe("Default tags"),
6852
- project_id: exports_external.string().optional().describe("Default project"),
6853
- plan_id: exports_external.string().optional().describe("Default plan")
6847
+ name: exports_external.string(),
6848
+ title_pattern: exports_external.string(),
6849
+ description: exports_external.string().optional(),
6850
+ priority: exports_external.enum(["low", "medium", "high", "critical"]).optional(),
6851
+ tags: exports_external.array(exports_external.string()).optional(),
6852
+ project_id: exports_external.string().optional(),
6853
+ plan_id: exports_external.string().optional()
6854
6854
  }, async (params) => {
6855
6855
  try {
6856
6856
  const { createTemplate: createTemplate2 } = await Promise.resolve().then(() => (init_templates(), exports_templates));
@@ -6875,12 +6875,12 @@ ${text}` }] };
6875
6875
  }
6876
6876
  });
6877
6877
  server.tool("create_task_from_template", "Create a task from a template with optional overrides.", {
6878
- template_id: exports_external.string().describe("Template ID"),
6879
- title: exports_external.string().optional().describe("Override title"),
6880
- description: exports_external.string().optional().describe("Override description"),
6881
- priority: exports_external.enum(["low", "medium", "high", "critical"]).optional().describe("Override priority"),
6882
- assigned_to: exports_external.string().optional().describe("Assign to agent"),
6883
- project_id: exports_external.string().optional().describe("Override project")
6878
+ template_id: exports_external.string(),
6879
+ title: exports_external.string().optional(),
6880
+ description: exports_external.string().optional(),
6881
+ priority: exports_external.enum(["low", "medium", "high", "critical"]).optional(),
6882
+ assigned_to: exports_external.string().optional(),
6883
+ project_id: exports_external.string().optional()
6884
6884
  }, async (params) => {
6885
6885
  try {
6886
6886
  const { taskFromTemplate: taskFromTemplate2 } = await Promise.resolve().then(() => (init_templates(), exports_templates));
@@ -6898,7 +6898,7 @@ ${task.id.slice(0, 8)} | ${task.priority} | ${task.title}` }] };
6898
6898
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
6899
6899
  }
6900
6900
  });
6901
- server.tool("delete_template", "Delete a task template", { id: exports_external.string().describe("Template ID") }, async ({ id }) => {
6901
+ server.tool("delete_template", "Delete a task template", { id: exports_external.string() }, async ({ id }) => {
6902
6902
  try {
6903
6903
  const { deleteTemplate: deleteTemplate2 } = await Promise.resolve().then(() => (init_templates(), exports_templates));
6904
6904
  const deleted = deleteTemplate2(id);
@@ -6908,8 +6908,8 @@ server.tool("delete_template", "Delete a task template", { id: exports_external.
6908
6908
  }
6909
6909
  });
6910
6910
  server.tool("approve_task", "Approve a task that requires approval.", {
6911
- id: exports_external.string().describe("Task ID (full or partial)"),
6912
- agent_id: exports_external.string().optional().describe("Agent approving the task")
6911
+ id: exports_external.string(),
6912
+ agent_id: exports_external.string().optional()
6913
6913
  }, async ({ id, agent_id }) => {
6914
6914
  try {
6915
6915
  const resolvedId = resolveId(id);
@@ -6927,7 +6927,7 @@ server.tool("approve_task", "Approve a task that requires approval.", {
6927
6927
  }
6928
6928
  });
6929
6929
  server.tool("get_my_tasks", "Get assigned tasks and stats for an agent.", {
6930
- agent_name: exports_external.string().describe("Your agent name")
6930
+ agent_name: exports_external.string()
6931
6931
  }, async ({ agent_name }) => {
6932
6932
  try {
6933
6933
  const agent = registerAgent({ name: agent_name });
@@ -6959,7 +6959,7 @@ In Progress:`);
6959
6959
  return { content: [{ type: "text", text: formatError(e) }], isError: true };
6960
6960
  }
6961
6961
  });
6962
- server.tool("search_tools", "List tool names matching a query.", { query: exports_external.string().optional().describe("Keyword to filter tools") }, async ({ query }) => {
6962
+ server.tool("search_tools", "List tool names matching a query.", { query: exports_external.string().optional() }, async ({ query }) => {
6963
6963
  const all = [
6964
6964
  "create_task",
6965
6965
  "list_tasks",
@@ -7008,7 +7008,7 @@ server.tool("search_tools", "List tool names matching a query.", { query: export
7008
7008
  const matches = q ? all.filter((n) => n.includes(q)) : all;
7009
7009
  return { content: [{ type: "text", text: matches.join(", ") }] };
7010
7010
  });
7011
- server.tool("describe_tools", "Get descriptions for specific tools by name.", { names: exports_external.array(exports_external.string()).describe("Tool names from search_tools") }, async ({ names }) => {
7011
+ server.tool("describe_tools", "Get descriptions for specific tools by name.", { names: exports_external.array(exports_external.string()) }, async ({ names }) => {
7012
7012
  const descriptions = {
7013
7013
  create_task: "Create a task. Params: title(req), description, priority, project_id, plan_id, tags, assigned_to, estimated_minutes, requires_approval",
7014
7014
  list_tasks: "List tasks. Params: status, priority, project_id, plan_id, assigned_to, tags, limit",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.9.26",
3
+ "version": "0.9.28",
4
4
  "description": "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",