@hasna/todos 0.11.93 → 0.11.94

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.
@@ -1 +1 @@
1
- {"version":3,"file":"task-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/task-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoDzC,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAwKD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAmyCpD"}
1
+ {"version":3,"file":"task-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/task-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoDzC,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAmOD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA02CpD"}
package/dist/cli/index.js CHANGED
@@ -2104,7 +2104,7 @@ var package_default;
2104
2104
  var init_package = __esm(() => {
2105
2105
  package_default = {
2106
2106
  name: "@hasna/todos",
2107
- version: "0.11.93",
2107
+ version: "0.11.94",
2108
2108
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
2109
2109
  type: "module",
2110
2110
  main: "dist/index.js",
@@ -15027,6 +15027,46 @@ function resolveTaskListRef(ref, projectId) {
15027
15027
  return { id: bySlug.id };
15028
15028
  return { error: `Could not resolve task list "${ref}" to a UUID${projectId ? " within the task's project" : ""}. Pass an exact task-list UUID.` };
15029
15029
  }
15030
+ async function computeCloudReparent(cloud, current, opts) {
15031
+ const targetProjectId = opts.projectRef ? await cloudResolveProjectRef(cloud, opts.projectRef) : undefined;
15032
+ const scope = targetProjectId ?? current.project_id ?? undefined;
15033
+ let taskListId;
15034
+ if (opts.listRef)
15035
+ taskListId = await cloudResolveTaskListRef(cloud, opts.listRef, scope);
15036
+ else if (opts.clearList)
15037
+ taskListId = null;
15038
+ else if (targetProjectId && targetProjectId !== current.project_id)
15039
+ taskListId = null;
15040
+ const patch = {};
15041
+ if (targetProjectId !== undefined)
15042
+ patch.project_id = targetProjectId;
15043
+ if (taskListId !== undefined)
15044
+ patch.task_list_id = taskListId;
15045
+ return patch;
15046
+ }
15047
+ function computeLocalReparent(current, opts) {
15048
+ const targetProjectId = opts.projectRef ? resolveProjectIdOrSlug(opts.projectRef) : undefined;
15049
+ const scope = targetProjectId ?? current.project_id ?? null;
15050
+ let taskListId;
15051
+ if (opts.listRef) {
15052
+ const resolved = resolveTaskListRef(opts.listRef, scope);
15053
+ if ("error" in resolved) {
15054
+ console.error(chalk2.red(resolved.error));
15055
+ process.exit(1);
15056
+ }
15057
+ taskListId = resolved.id;
15058
+ } else if (opts.clearList) {
15059
+ taskListId = null;
15060
+ } else if (targetProjectId && targetProjectId !== current.project_id) {
15061
+ taskListId = null;
15062
+ }
15063
+ const patch = {};
15064
+ if (targetProjectId !== undefined)
15065
+ patch.project_id = targetProjectId;
15066
+ if (taskListId !== undefined)
15067
+ patch.task_list_id = taskListId;
15068
+ return patch;
15069
+ }
15030
15070
  function registerTaskCommands(program2) {
15031
15071
  program2.command("add <title>").description("Create a new task").option("-d, --description <text>", "Task description").option("-p, --priority <level>", "Priority: low, medium, high, critical").option("--parent <id>", "Parent task ID").option("-t, --tags <tags>", "Comma-separated tags").option("--tag <tags>", "Comma-separated tags (alias for --tags)").option("--plan <id>", "Assign to a plan").option("--assign <agent>", "Assign to agent").option("--status <status>", "Initial status").option("--list <id>", "Task list ID").option("--task-list <id>", "Task list ID (alias for --list)").option("--estimated <minutes>", "Estimated time in minutes").option("--sla-minutes <minutes>", "SLA minutes before unfinished work is escalated").option("--sla <minutes>", "Alias for --sla-minutes").option("--approval", "Require approval before completion").option("--recurrence <rule>", "Recurrence rule, e.g. 'every day', 'every weekday', 'every 2 weeks'").option("--due <date>", "Due date (ISO string or YYYY-MM-DD)").option("--reason <text>", "Why this task exists").option("--project <id>", "Assign to project by ID or slug (overrides auto-detect)").action(async (title, opts) => {
15032
15072
  const globalOpts = program2.opts();
@@ -15731,7 +15771,7 @@ ${chalk2.cyan(sid)} ${statusColor(task2.status)} ${prioColor(task2.priority)} ${
15731
15771
  console.log(` ${chalk2.dim(h.created_at)} ${chalk2.bold(h.action)}${field}${change}${agent}`);
15732
15772
  }
15733
15773
  });
15734
- program2.command("update <id>").description("Update a task").option("--title <text>", "New title").option("-d, --description <text>", "New description").option("-s, --status <status>", "New status").option("-p, --priority <priority>", "New priority").option("--assign <agent>", "Assign to agent").option("--tags <tags>", "New tags (comma-separated)").option("--tag <tags>", "New tags (alias for --tags)").option("--list <id>", "Move to a task list (UUID authoritative; project-scoped slug accepted)").option("--task-list <id>", "Move to a task list (alias for --list)").option("--clear-list", "Detach from its task list (reset task_list_id to null)").option("--working-dir <path>", "Repair the task's working_dir to a specific path (routing metadata)").option("--clear-working-dir", "Reset the task's working_dir to null (undo path for routing repairs)").option("--plan <id>", "Move to a plan").option("--clear-plan", "Remove from its current plan").option("--estimated <minutes>", "Estimated time in minutes").option("--sla-minutes <minutes>", "SLA minutes before unfinished work is escalated").option("--sla <minutes>", "Alias for --sla-minutes").option("--due <date>", "Due date (ISO string or YYYY-MM-DD), empty to clear").option("--recurrence <rule>", "Recurrence rule, empty to clear").option("--approval", "Require approval before completion").option("--clear-approval", "Remove the approval requirement").action(async (id, opts) => {
15774
+ program2.command("update <id>").description("Update a task").option("--title <text>", "New title").option("-d, --description <text>", "New description").option("-s, --status <status>", "New status").option("-p, --priority <priority>", "New priority").option("--assign <agent>", "Assign to agent").option("--tags <tags>", "New tags (comma-separated)").option("--tag <tags>", "New tags (alias for --tags)").option("--list <id>", "Move to a task list (UUID authoritative; project-scoped slug accepted)").option("--task-list <id>", "Move to a task list (alias for --list)").option("--clear-list", "Detach from its task list (reset task_list_id to null)").option("--project <id>", "Re-parent the task to another project (by ID, slug, or path); see also `todos move`").option("--working-dir <path>", "Repair the task's working_dir to a specific path (routing metadata)").option("--clear-working-dir", "Reset the task's working_dir to null (undo path for routing repairs)").option("--plan <id>", "Move to a plan").option("--clear-plan", "Remove from its current plan").option("--estimated <minutes>", "Estimated time in minutes").option("--sla-minutes <minutes>", "SLA minutes before unfinished work is escalated").option("--sla <minutes>", "Alias for --sla-minutes").option("--due <date>", "Due date (ISO string or YYYY-MM-DD), empty to clear").option("--recurrence <rule>", "Recurrence rule, empty to clear").option("--approval", "Require approval before completion").option("--clear-approval", "Remove the approval requirement").action(async (id, opts) => {
15735
15775
  const globalOpts = program2.opts();
15736
15776
  opts.tags = opts.tags || opts.tag;
15737
15777
  opts.list = opts.list || opts.taskList;
@@ -15758,7 +15798,11 @@ ${chalk2.cyan(sid)} ${statusColor(task2.status)} ${prioColor(task2.priority)} ${
15758
15798
  const plan = opts.plan ? await cloudResolvePlan(cloud, opts.plan, current2.project_id ?? undefined) : null;
15759
15799
  if (opts.plan && !plan)
15760
15800
  throw new Error(`Plan not found: ${opts.plan}`);
15761
- const taskListId2 = opts.list ? await cloudResolveTaskListRef(cloud, opts.list, current2.project_id ?? undefined) : opts.clearList ? null : undefined;
15801
+ const reparent2 = await computeCloudReparent(cloud, current2, {
15802
+ projectRef: opts.project || globalOpts.project,
15803
+ listRef: opts.list,
15804
+ clearList: opts.clearList
15805
+ });
15762
15806
  task3 = await cloudUpdateTask(cloud, currentId, {
15763
15807
  title: opts.title,
15764
15808
  description: opts.description,
@@ -15767,7 +15811,7 @@ ${chalk2.cyan(sid)} ${statusColor(task2.status)} ${prioColor(task2.priority)} ${
15767
15811
  assigned_to: opts.assign,
15768
15812
  tags: opts.tags ? opts.tags.split(",").map((t) => t.trim()) : undefined,
15769
15813
  plan_id: plan?.id ?? (opts.clearPlan ? null : undefined),
15770
- task_list_id: taskListId2,
15814
+ ...reparent2,
15771
15815
  working_dir: opts.workingDir ? resolve9(opts.workingDir) : opts.clearWorkingDir ? null : undefined,
15772
15816
  estimated_minutes: opts.estimated !== undefined ? parseIntOption(opts.estimated, "--estimated") : undefined,
15773
15817
  sla_minutes: opts.slaMinutes !== undefined || opts.sla !== undefined ? parseIntOption(opts.slaMinutes ?? opts.sla, "--sla-minutes") : undefined,
@@ -15792,14 +15836,11 @@ ${chalk2.cyan(sid)} ${statusColor(task2.status)} ${prioColor(task2.priority)} ${
15792
15836
  console.error(chalk2.red(`Task not found: ${id}`));
15793
15837
  process.exit(1);
15794
15838
  }
15795
- const taskListId = opts.list ? (() => {
15796
- const resolved = resolveTaskListRef(opts.list, current.project_id);
15797
- if ("error" in resolved) {
15798
- console.error(chalk2.red(resolved.error));
15799
- process.exit(1);
15800
- }
15801
- return resolved.id;
15802
- })() : opts.clearList ? null : undefined;
15839
+ const reparent = computeLocalReparent(current, {
15840
+ projectRef: opts.project || globalOpts.project,
15841
+ listRef: opts.list,
15842
+ clearList: opts.clearList
15843
+ });
15803
15844
  const planId = opts.plan ? resolvePlanId(opts.plan) : opts.clearPlan ? null : undefined;
15804
15845
  let task2;
15805
15846
  try {
@@ -15812,7 +15853,7 @@ ${chalk2.cyan(sid)} ${statusColor(task2.status)} ${prioColor(task2.priority)} ${
15812
15853
  assigned_to: opts.assign,
15813
15854
  tags: opts.tags ? opts.tags.split(",").map((t) => t.trim()) : undefined,
15814
15855
  plan_id: planId,
15815
- task_list_id: taskListId,
15856
+ ...reparent,
15816
15857
  working_dir: opts.workingDir ? resolve9(opts.workingDir) : opts.clearWorkingDir ? null : undefined,
15817
15858
  estimated_minutes: opts.estimated !== undefined ? parseIntOption(opts.estimated, "--estimated") : undefined,
15818
15859
  sla_minutes: opts.slaMinutes !== undefined || opts.sla !== undefined ? parseIntOption(opts.slaMinutes ?? opts.sla, "--sla-minutes") : undefined,
@@ -15830,6 +15871,68 @@ ${chalk2.cyan(sid)} ${statusColor(task2.status)} ${prioColor(task2.priority)} ${
15830
15871
  console.log(formatTaskLine(task2));
15831
15872
  }
15832
15873
  });
15874
+ program2.command("move <id>").description("Move a task to another project and/or task list (keeps its id and history)").option("--to-project <id>", "Destination project (by ID, slug, or path)").option("--to-list <id>", "Destination task list (UUID authoritative; slug resolved in the destination project)").option("--clear-list", "Detach from its task list (reset task_list_id to null)").action(async (id, opts) => {
15875
+ const globalOpts = program2.opts();
15876
+ const projectRef = opts.toProject ?? globalOpts.project;
15877
+ const listRef = opts.toList;
15878
+ if (!projectRef && !listRef && !opts.clearList) {
15879
+ handleError(new Error("Nothing to move: pass --to-project, --to-list, or --clear-list."));
15880
+ }
15881
+ if (listRef && opts.clearList) {
15882
+ handleError(new Error("Use either --to-list or --clear-list, not both."));
15883
+ }
15884
+ const cloud = getTodosCloudClient();
15885
+ if (cloud) {
15886
+ let task3;
15887
+ try {
15888
+ const currentId = await resolveTaskIdForCommand(id, cloud);
15889
+ const current2 = await cloudGetTask(cloud, currentId);
15890
+ if (!current2)
15891
+ throw new Error(`Task not found: ${id}`);
15892
+ const reparent2 = await computeCloudReparent(cloud, current2, {
15893
+ projectRef,
15894
+ listRef,
15895
+ clearList: opts.clearList
15896
+ });
15897
+ if (reparent2.project_id === undefined && reparent2.task_list_id === undefined) {
15898
+ throw new Error("Nothing to move: the task is already in the requested project/list.");
15899
+ }
15900
+ task3 = await cloudUpdateTask(cloud, currentId, reparent2);
15901
+ } catch (e) {
15902
+ handleError(e);
15903
+ }
15904
+ if (globalOpts.json) {
15905
+ output(task3, true);
15906
+ } else {
15907
+ console.log(chalk2.green("Task moved:"));
15908
+ console.log(formatTaskLine(task3));
15909
+ }
15910
+ return;
15911
+ }
15912
+ const resolvedId = resolveTaskId(id);
15913
+ const current = getTask(resolvedId);
15914
+ if (!current) {
15915
+ console.error(chalk2.red(`Task not found: ${id}`));
15916
+ process.exit(1);
15917
+ }
15918
+ const reparent = computeLocalReparent(current, { projectRef, listRef, clearList: opts.clearList });
15919
+ if (reparent.project_id === undefined && reparent.task_list_id === undefined) {
15920
+ console.error(chalk2.red("Nothing to move: the task is already in the requested project/list."));
15921
+ process.exit(1);
15922
+ }
15923
+ let task2;
15924
+ try {
15925
+ task2 = updateTask(resolvedId, { version: current.version, ...reparent });
15926
+ } catch (e) {
15927
+ handleError(e);
15928
+ }
15929
+ if (globalOpts.json) {
15930
+ output(task2, true);
15931
+ } else {
15932
+ console.log(chalk2.green("Task moved:"));
15933
+ console.log(formatTaskLine(task2));
15934
+ }
15935
+ });
15833
15936
  program2.command("done <id>").description("Mark a task as completed").option("--attach-ids <ids>", "Comma-separated @hasna/attachments IDs to link as evidence").option("--files-changed <files>", "Comma-separated list of files changed").option("--test-results <results>", "Test results summary").option("--commit-hash <hash>", "Git commit hash").option("--notes <notes>", "Completion notes").option("--confidence <0-1>", "Agent's confidence 0.0-1.0 that the task is fully complete (default: 1.0, <0.7 flagged for review)").action(async (id, opts) => {
15834
15937
  const globalOpts = program2.opts();
15835
15938
  const attachmentIds = opts.attachIds ? opts.attachIds.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
@@ -28144,7 +28247,7 @@ async function updateTask2(id, input, store) {
28144
28247
  tags: input.tags ?? existing.tags,
28145
28248
  metadata: input.metadata ?? existing.metadata,
28146
28249
  requires_approval: input.requires_approval ?? existing.requires_approval,
28147
- task_list_id: input.task_list_id ?? existing.task_list_id
28250
+ task_list_id: input.task_list_id !== undefined ? input.task_list_id : existing.task_list_id
28148
28251
  };
28149
28252
  await store.upsert("tasks", task);
28150
28253
  return task;
@@ -29092,6 +29195,8 @@ function buildV1OpenApiDocument(version = getPackageVersion()) {
29092
29195
  status: { type: "string" },
29093
29196
  priority: { type: "string" },
29094
29197
  assigned_to: { type: "string" },
29198
+ project_id: { type: "string", nullable: true },
29199
+ task_list_id: { type: "string", nullable: true },
29095
29200
  version: { type: "number" }
29096
29201
  }
29097
29202
  },
@@ -35450,6 +35555,17 @@ ${task.description}` : null
35450
35555
  patch.estimated_minutes = estimate;
35451
35556
  if (deadline !== undefined)
35452
35557
  patch.due_at = deadline;
35558
+ if (typeof patch.project_id === "string" && patch.project_id) {
35559
+ patch.project_id = await cloudResolveProjectRef(cloud, patch.project_id);
35560
+ }
35561
+ if (typeof patch.task_list_id === "string" && patch.task_list_id) {
35562
+ let scope = typeof patch.project_id === "string" ? patch.project_id : undefined;
35563
+ if (!scope) {
35564
+ const current = await cloudGetTask(cloud, task_id2);
35565
+ scope = current?.project_id ?? undefined;
35566
+ }
35567
+ patch.task_list_id = await cloudResolveTaskListRef(cloud, patch.task_list_id, scope);
35568
+ }
35453
35569
  if (version2 !== undefined)
35454
35570
  patch.version = version2;
35455
35571
  const updated = await cloudUpdateTask(cloud, task_id2, patch);
@@ -39667,6 +39783,63 @@ function registerTaskProjectTools(server, ctx) {
39667
39783
  }
39668
39784
  });
39669
39785
  }
39786
+ if (shouldRegisterTool("move_task")) {
39787
+ server.tool("move_task", "Re-parent a task to another project and/or task list, preserving its id and history. " + "A task list is project-scoped, so moving to a new project detaches the old list unless to_list is given.", {
39788
+ task_id: exports_external.string().describe("Task ID"),
39789
+ to_project: exports_external.string().optional().describe("Destination project ID, slug, or path"),
39790
+ to_list: exports_external.string().optional().describe("Destination task list (UUID, or slug resolved in the destination project)"),
39791
+ clear_list: exports_external.boolean().optional().describe("Detach from its task list (set task_list_id to null)"),
39792
+ version: exports_external.number().optional().describe("Expected version for optimistic locking")
39793
+ }, async ({ task_id, to_project, to_list, clear_list, version }) => {
39794
+ try {
39795
+ if (!to_project && !to_list && !clear_list) {
39796
+ throw new Error("Nothing to move: pass to_project, to_list, or clear_list.");
39797
+ }
39798
+ if (to_list && clear_list) {
39799
+ throw new Error("Use either to_list or clear_list, not both.");
39800
+ }
39801
+ const cloud = getTodosCloudClient();
39802
+ if (cloud) {
39803
+ const current2 = await cloudGetTask(cloud, task_id);
39804
+ if (!current2)
39805
+ throw new Error(`Task not found: ${task_id}`);
39806
+ const targetProjectId2 = to_project ? await cloudResolveProjectRef(cloud, to_project) : undefined;
39807
+ const scope = targetProjectId2 ?? current2.project_id ?? undefined;
39808
+ const patch = {};
39809
+ if (targetProjectId2 !== undefined)
39810
+ patch.project_id = targetProjectId2;
39811
+ if (to_list)
39812
+ patch.task_list_id = await cloudResolveTaskListRef(cloud, to_list, scope);
39813
+ else if (clear_list)
39814
+ patch.task_list_id = null;
39815
+ else if (targetProjectId2 && targetProjectId2 !== current2.project_id)
39816
+ patch.task_list_id = null;
39817
+ if (version !== undefined)
39818
+ patch.version = version;
39819
+ const task2 = await cloudUpdateTask(cloud, task_id, patch);
39820
+ return { content: [{ type: "text", text: formatTask(task2) }] };
39821
+ }
39822
+ const resolvedId = resolveId(task_id);
39823
+ const current = getTask(resolvedId);
39824
+ if (!current)
39825
+ throw new Error(`Task not found: ${task_id}`);
39826
+ const targetProjectId = to_project ? resolveId(to_project, "projects") : undefined;
39827
+ const updates = {};
39828
+ if (targetProjectId !== undefined)
39829
+ updates.project_id = targetProjectId;
39830
+ if (to_list)
39831
+ updates.task_list_id = resolveId(to_list, "task_lists");
39832
+ else if (clear_list)
39833
+ updates.task_list_id = null;
39834
+ else if (targetProjectId && targetProjectId !== current.project_id)
39835
+ updates.task_list_id = null;
39836
+ const task = updateWithOptionalVersion(resolvedId, updates, version);
39837
+ return { content: [{ type: "text", text: formatTask(task) }] };
39838
+ } catch (e) {
39839
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
39840
+ }
39841
+ });
39842
+ }
39670
39843
  if (shouldRegisterTool("reschedule_task")) {
39671
39844
  server.tool("reschedule_task", "Update a task's deadline.", {
39672
39845
  task_id: exports_external.string().describe("Task ID"),
@@ -43595,6 +43768,7 @@ function registerTaskMetaTools(server, ctx) {
43595
43768
  complete_task: "complete_task \u2014 Mark task completed. Params: task_id, confidence, completed_at, version",
43596
43769
  cancel_task: "cancel_task \u2014 Cancel a task. Params: task_id, version",
43597
43770
  reassign_task: "reassign_task \u2014 Change task assignee. Params: task_id, new_assignee, version",
43771
+ move_task: "move_task \u2014 Re-parent a task to another project and/or task list (keeps its id and history). Params: task_id (required), to_project, to_list, clear_list, version",
43598
43772
  reschedule_task: "reschedule_task \u2014 Update deadline. Params: task_id, deadline, version",
43599
43773
  prioritize_task: "prioritize_task \u2014 Set priority. Params: task_id, priority, version",
43600
43774
  search_tasks: "search_tasks \u2014 Full-text search. Params: query, project_id, status, limit",
@@ -71150,6 +71324,7 @@ var REGISTERED_CANONICAL_COMMANDS = [
71150
71324
  "manual",
71151
71325
  "mcp",
71152
71326
  "mine",
71327
+ "move",
71153
71328
  "next",
71154
71329
  "notifications",
71155
71330
  "onboarding",
@@ -71285,6 +71460,7 @@ var REMOTE_COMMANDS = new Set([
71285
71460
  "lists",
71286
71461
  "lock",
71287
71462
  "log-progress",
71463
+ "move",
71288
71464
  "next",
71289
71465
  "plans",
71290
71466
  "project-rename",
package/dist/contracts.js CHANGED
@@ -10756,7 +10756,7 @@ var init_tasks = __esm(() => {
10756
10756
  // package.json
10757
10757
  var package_default = {
10758
10758
  name: "@hasna/todos",
10759
- version: "0.11.93",
10759
+ version: "0.11.94",
10760
10760
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
10761
10761
  type: "module",
10762
10762
  main: "dist/index.js",
package/dist/index.js CHANGED
@@ -10861,7 +10861,7 @@ var init_dispatches = __esm(() => {
10861
10861
  // package.json
10862
10862
  var package_default = {
10863
10863
  name: "@hasna/todos",
10864
- version: "0.11.93",
10864
+ version: "0.11.94",
10865
10865
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
10866
10866
  type: "module",
10867
10867
  main: "dist/index.js",
@@ -24746,7 +24746,7 @@ async function updateTask2(id, input, store) {
24746
24746
  tags: input.tags ?? existing.tags,
24747
24747
  metadata: input.metadata ?? existing.metadata,
24748
24748
  requires_approval: input.requires_approval ?? existing.requires_approval,
24749
- task_list_id: input.task_list_id ?? existing.task_list_id
24749
+ task_list_id: input.task_list_id !== undefined ? input.task_list_id : existing.task_list_id
24750
24750
  };
24751
24751
  await store.upsert("tasks", task2);
24752
24752
  return task2;
package/dist/mcp/index.js CHANGED
@@ -16658,6 +16658,7 @@ var init_token_utils = __esm(() => {
16658
16658
 
16659
16659
  // src/cli/cloud-router.ts
16660
16660
  import { resolveStorageClient } from "@hasna/contracts/client/storage";
16661
+ import { resolve as resolvePath } from "path";
16661
16662
  function cleanMode(value) {
16662
16663
  const normalized = value?.trim().toLowerCase();
16663
16664
  return normalized || null;
@@ -16940,6 +16941,39 @@ async function cloudListProjects(client) {
16940
16941
  const envelope = res.raw;
16941
16942
  return Array.isArray(envelope?.projects) ? envelope.projects : res.items;
16942
16943
  }
16944
+ function cloudProjectSlug(value) {
16945
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
16946
+ }
16947
+ function cloudProjectPathBasename(value) {
16948
+ return value.replace(/[\\/]+$/, "").split(/[\\/]/).pop() ?? value;
16949
+ }
16950
+ function uniqueProjectMatches(projects, predicate) {
16951
+ return [...new Map(projects.filter(predicate).map((project) => [project.id, project])).values()];
16952
+ }
16953
+ function resolveCloudProjectRef(projects, ref) {
16954
+ const input = ref.trim();
16955
+ const normalizedRef = input.toLowerCase();
16956
+ const pathLike = input.startsWith(".") || input.includes("/") || input.includes("\\");
16957
+ const normalizedPath = pathLike ? resolvePath(input) : undefined;
16958
+ const slug = cloudProjectSlug(pathLike ? cloudProjectPathBasename(input) : input);
16959
+ const matchGroups = [
16960
+ uniqueProjectMatches(projects, (project) => project.id.toLowerCase() === normalizedRef),
16961
+ uniqueProjectMatches(projects, (project) => project.path === input || normalizedPath !== undefined && resolvePath(project.path) === normalizedPath),
16962
+ uniqueProjectMatches(projects, (project) => project.name.toLowerCase() === normalizedRef),
16963
+ uniqueProjectMatches(projects, (project) => project.task_list_id === input || cloudProjectSlug(project.name) === slug || cloudProjectSlug(cloudProjectPathBasename(project.path)) === slug),
16964
+ uniqueProjectMatches(projects, (project) => project.id.toLowerCase().startsWith(normalizedRef))
16965
+ ];
16966
+ for (const matches of matchGroups) {
16967
+ if (matches.length === 1)
16968
+ return matches[0].id;
16969
+ if (matches.length > 1)
16970
+ throw new Error(`Project reference is ambiguous: "${input}"`);
16971
+ }
16972
+ throw new Error(`Project not found: "${input}"`);
16973
+ }
16974
+ async function cloudResolveProjectRef(client, ref) {
16975
+ return resolveCloudProjectRef(await cloudListProjects(client), ref);
16976
+ }
16943
16977
  async function cloudAddComment(client, taskId, input) {
16944
16978
  const raw = await client.transport.post(`/tasks/${encodeURIComponent(taskId)}/comments`, input);
16945
16979
  const comment = raw && typeof raw === "object" && "comment" in raw ? raw.comment : raw;
@@ -16984,9 +17018,46 @@ async function cloudReleaseAgent(client, idOrName, sessionId) {
16984
17018
  const env = raw ?? {};
16985
17019
  return { agent: env.agent ?? null, released: env.released !== false };
16986
17020
  }
16987
- var CLOUD_MODES, VALID_STORAGE_MODES, completionCapabilityCache;
17021
+ async function cloudListTaskLists(client, projectId) {
17022
+ const query = projectId ? { project_id: projectId } : {};
17023
+ const raw = await requiredRemoteRoute(client, "/v1/task-lists", () => client.transport.get("/task-lists", { query }));
17024
+ const envelope = raw ?? {};
17025
+ if (Array.isArray(envelope.task_lists))
17026
+ return envelope.task_lists;
17027
+ if (Array.isArray(envelope.taskLists))
17028
+ return envelope.taskLists;
17029
+ return Array.isArray(raw) ? raw : [];
17030
+ }
17031
+ async function cloudResolveTaskListRef(client, ref, projectId) {
17032
+ const input = ref.trim();
17033
+ const normalizedIdRef = input.toLowerCase();
17034
+ if (UUID_RE.test(input) && !projectId)
17035
+ return normalizedIdRef;
17036
+ const lists = await cloudListTaskLists(client, projectId);
17037
+ const exactIds = lists.filter((list) => list.id.toLowerCase() === normalizedIdRef);
17038
+ if (exactIds.length === 1)
17039
+ return exactIds[0].id;
17040
+ if (exactIds.length > 1) {
17041
+ throw new Error(`Task list reference is ambiguous: "${input}"`);
17042
+ }
17043
+ const slugs = lists.filter((list) => list.slug === input);
17044
+ if (slugs.length === 1)
17045
+ return slugs[0].id;
17046
+ if (slugs.length > 1) {
17047
+ throw new Error(`Task list reference is ambiguous: "${input}"`);
17048
+ }
17049
+ const prefixes = lists.filter((list) => list.id.toLowerCase().startsWith(normalizedIdRef));
17050
+ if (prefixes.length === 1)
17051
+ return prefixes[0].id;
17052
+ if (prefixes.length > 1) {
17053
+ throw new Error(`Task list reference is ambiguous: "${input}"`);
17054
+ }
17055
+ throw new Error(`Task list not found: "${input}"`);
17056
+ }
17057
+ var UUID_RE, CLOUD_MODES, VALID_STORAGE_MODES, completionCapabilityCache;
16988
17058
  var init_cloud_router = __esm(() => {
16989
17059
  init_redaction();
17060
+ UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
16990
17061
  CLOUD_MODES = new Set(["self_hosted", "cloud", "remote", "hybrid"]);
16991
17062
  VALID_STORAGE_MODES = new Set(["local", ...CLOUD_MODES]);
16992
17063
  completionCapabilityCache = new Map;
@@ -17273,6 +17344,17 @@ ${task.description}` : null
17273
17344
  patch.estimated_minutes = estimate;
17274
17345
  if (deadline !== undefined)
17275
17346
  patch.due_at = deadline;
17347
+ if (typeof patch.project_id === "string" && patch.project_id) {
17348
+ patch.project_id = await cloudResolveProjectRef(cloud, patch.project_id);
17349
+ }
17350
+ if (typeof patch.task_list_id === "string" && patch.task_list_id) {
17351
+ let scope = typeof patch.project_id === "string" ? patch.project_id : undefined;
17352
+ if (!scope) {
17353
+ const current = await cloudGetTask(cloud, task_id2);
17354
+ scope = current?.project_id ?? undefined;
17355
+ }
17356
+ patch.task_list_id = await cloudResolveTaskListRef(cloud, patch.task_list_id, scope);
17357
+ }
17276
17358
  if (version2 !== undefined)
17277
17359
  patch.version = version2;
17278
17360
  const updated = await cloudUpdateTask(cloud, task_id2, patch);
@@ -23286,6 +23368,63 @@ function registerTaskProjectTools(server, ctx) {
23286
23368
  }
23287
23369
  });
23288
23370
  }
23371
+ if (shouldRegisterTool("move_task")) {
23372
+ server.tool("move_task", "Re-parent a task to another project and/or task list, preserving its id and history. " + "A task list is project-scoped, so moving to a new project detaches the old list unless to_list is given.", {
23373
+ task_id: exports_external.string().describe("Task ID"),
23374
+ to_project: exports_external.string().optional().describe("Destination project ID, slug, or path"),
23375
+ to_list: exports_external.string().optional().describe("Destination task list (UUID, or slug resolved in the destination project)"),
23376
+ clear_list: exports_external.boolean().optional().describe("Detach from its task list (set task_list_id to null)"),
23377
+ version: exports_external.number().optional().describe("Expected version for optimistic locking")
23378
+ }, async ({ task_id, to_project, to_list, clear_list, version }) => {
23379
+ try {
23380
+ if (!to_project && !to_list && !clear_list) {
23381
+ throw new Error("Nothing to move: pass to_project, to_list, or clear_list.");
23382
+ }
23383
+ if (to_list && clear_list) {
23384
+ throw new Error("Use either to_list or clear_list, not both.");
23385
+ }
23386
+ const cloud = getTodosCloudClient();
23387
+ if (cloud) {
23388
+ const current2 = await cloudGetTask(cloud, task_id);
23389
+ if (!current2)
23390
+ throw new Error(`Task not found: ${task_id}`);
23391
+ const targetProjectId2 = to_project ? await cloudResolveProjectRef(cloud, to_project) : undefined;
23392
+ const scope = targetProjectId2 ?? current2.project_id ?? undefined;
23393
+ const patch = {};
23394
+ if (targetProjectId2 !== undefined)
23395
+ patch.project_id = targetProjectId2;
23396
+ if (to_list)
23397
+ patch.task_list_id = await cloudResolveTaskListRef(cloud, to_list, scope);
23398
+ else if (clear_list)
23399
+ patch.task_list_id = null;
23400
+ else if (targetProjectId2 && targetProjectId2 !== current2.project_id)
23401
+ patch.task_list_id = null;
23402
+ if (version !== undefined)
23403
+ patch.version = version;
23404
+ const task2 = await cloudUpdateTask(cloud, task_id, patch);
23405
+ return { content: [{ type: "text", text: formatTask(task2) }] };
23406
+ }
23407
+ const resolvedId = resolveId(task_id);
23408
+ const current = getTask(resolvedId);
23409
+ if (!current)
23410
+ throw new Error(`Task not found: ${task_id}`);
23411
+ const targetProjectId = to_project ? resolveId(to_project, "projects") : undefined;
23412
+ const updates = {};
23413
+ if (targetProjectId !== undefined)
23414
+ updates.project_id = targetProjectId;
23415
+ if (to_list)
23416
+ updates.task_list_id = resolveId(to_list, "task_lists");
23417
+ else if (clear_list)
23418
+ updates.task_list_id = null;
23419
+ else if (targetProjectId && targetProjectId !== current.project_id)
23420
+ updates.task_list_id = null;
23421
+ const task = updateWithOptionalVersion(resolvedId, updates, version);
23422
+ return { content: [{ type: "text", text: formatTask(task) }] };
23423
+ } catch (e) {
23424
+ return { content: [{ type: "text", text: formatError(e) }], isError: true };
23425
+ }
23426
+ });
23427
+ }
23289
23428
  if (shouldRegisterTool("reschedule_task")) {
23290
23429
  server.tool("reschedule_task", "Update a task's deadline.", {
23291
23430
  task_id: exports_external.string().describe("Task ID"),
@@ -27608,6 +27747,7 @@ function registerTaskMetaTools(server, ctx) {
27608
27747
  complete_task: "complete_task \u2014 Mark task completed. Params: task_id, confidence, completed_at, version",
27609
27748
  cancel_task: "cancel_task \u2014 Cancel a task. Params: task_id, version",
27610
27749
  reassign_task: "reassign_task \u2014 Change task assignee. Params: task_id, new_assignee, version",
27750
+ move_task: "move_task \u2014 Re-parent a task to another project and/or task list (keeps its id and history). Params: task_id (required), to_project, to_list, clear_list, version",
27611
27751
  reschedule_task: "reschedule_task \u2014 Update deadline. Params: task_id, deadline, version",
27612
27752
  prioritize_task: "prioritize_task \u2014 Set priority. Params: task_id, priority, version",
27613
27753
  search_tasks: "search_tasks \u2014 Full-text search. Params: query, project_id, status, limit",
@@ -30647,7 +30787,7 @@ var package_default;
30647
30787
  var init_package = __esm(() => {
30648
30788
  package_default = {
30649
30789
  name: "@hasna/todos",
30650
- version: "0.11.93",
30790
+ version: "0.11.94",
30651
30791
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
30652
30792
  type: "module",
30653
30793
  main: "dist/index.js",
@@ -42930,7 +43070,7 @@ async function updateTask2(id, input, store) {
42930
43070
  tags: input.tags ?? existing.tags,
42931
43071
  metadata: input.metadata ?? existing.metadata,
42932
43072
  requires_approval: input.requires_approval ?? existing.requires_approval,
42933
- task_list_id: input.task_list_id ?? existing.task_list_id
43073
+ task_list_id: input.task_list_id !== undefined ? input.task_list_id : existing.task_list_id
42934
43074
  };
42935
43075
  await store.upsert("tasks", task2);
42936
43076
  return task2;
@@ -43875,6 +44015,8 @@ function buildV1OpenApiDocument(version = getPackageVersion()) {
43875
44015
  status: { type: "string" },
43876
44016
  priority: { type: "string" },
43877
44017
  assigned_to: { type: "string" },
44018
+ project_id: { type: "string", nullable: true },
44019
+ task_list_id: { type: "string", nullable: true },
43878
44020
  version: { type: "number" }
43879
44021
  }
43880
44022
  },
@@ -1 +1 @@
1
- {"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-crud.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAajD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAqV5E"}
1
+ {"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-crud.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAejD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAkW5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-meta-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-meta-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACzC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAmO5E"}
1
+ {"version":3,"file":"task-meta-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-meta-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACzC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAoO5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAmJjD,UAAU,kBAAkB;IAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,QAo4FlF"}
1
+ {"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AA2JjD,UAAU,kBAAkB;IAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,QAy7FlF"}
package/dist/mcp.js CHANGED
@@ -41,7 +41,7 @@ var __require = import.meta.require;
41
41
  // package.json
42
42
  var package_default = {
43
43
  name: "@hasna/todos",
44
- version: "0.11.93",
44
+ version: "0.11.94",
45
45
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
46
46
  type: "module",
47
47
  main: "dist/index.js",
package/dist/registry.js CHANGED
@@ -10756,7 +10756,7 @@ var init_tasks = __esm(() => {
10756
10756
  // package.json
10757
10757
  var package_default = {
10758
10758
  name: "@hasna/todos",
10759
- version: "0.11.93",
10759
+ version: "0.11.94",
10760
10760
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
10761
10761
  type: "module",
10762
10762
  main: "dist/index.js",
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.11.93",
3
+ "packageVersion": "0.11.94",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "587429d21e17aa8aef579f268aeb21d936cbd318",
6
- "gitTree": "66ffc2eae17dcdb8234c9c4f6196eb5a944c4d7e",
7
- "sourceTreeSha256": "349ea2e0ea68b5176cfbd1b6e1c7f3f9d79706c1bf6cdd17d1436a6a622f26ed",
8
- "generatedAt": "2026-07-20T06:14:03.000Z"
5
+ "gitCommit": "a98841fdf3dcaae217b6e0a3128f85893f01fab9",
6
+ "gitTree": "6b7899a49b09bccf94a002580d408bac8194fdcd",
7
+ "sourceTreeSha256": "e00fb3da590c92f542c8c06d9fee1eb77293edaa1d17748147008863bd8a8e80",
8
+ "generatedAt": "2026-07-20T11:49:06.000Z"
9
9
  }
@@ -71,6 +71,8 @@ export interface UpdateTaskInput {
71
71
  "status"?: string;
72
72
  "priority"?: string;
73
73
  "assigned_to"?: string;
74
+ "project_id"?: string | null;
75
+ "task_list_id"?: string | null;
74
76
  "version"?: number;
75
77
  }
76
78
  export interface CompleteTaskInput {
@@ -1 +1 @@
1
- {"version":3,"file":"v1.generated.d.ts","sourceRoot":"","sources":["../../src/sdk/v1.generated.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"v1.generated.d.ts","sourceRoot":"","sources":["../../src/sdk/v1.generated.ts"],"names":[],"mappings":"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"}
@@ -70,7 +70,7 @@ var package_default;
70
70
  var init_package = __esm(() => {
71
71
  package_default = {
72
72
  name: "@hasna/todos",
73
- version: "0.11.93",
73
+ version: "0.11.94",
74
74
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
75
75
  type: "module",
76
76
  main: "dist/index.js",
@@ -1947,7 +1947,7 @@ async function updateTask(id, input, store) {
1947
1947
  tags: input.tags ?? existing.tags,
1948
1948
  metadata: input.metadata ?? existing.metadata,
1949
1949
  requires_approval: input.requires_approval ?? existing.requires_approval,
1950
- task_list_id: input.task_list_id ?? existing.task_list_id
1950
+ task_list_id: input.task_list_id !== undefined ? input.task_list_id : existing.task_list_id
1951
1951
  };
1952
1952
  await store.upsert("tasks", task);
1953
1953
  return task;
@@ -16082,6 +16082,8 @@ function buildV1OpenApiDocument(version = getPackageVersion()) {
16082
16082
  status: { type: "string" },
16083
16083
  priority: { type: "string" },
16084
16084
  assigned_to: { type: "string" },
16085
+ project_id: { type: "string", nullable: true },
16086
+ task_list_id: { type: "string", nullable: true },
16085
16087
  version: { type: "number" }
16086
16088
  }
16087
16089
  },
@@ -39120,6 +39122,7 @@ var init_token_utils = __esm(() => {
39120
39122
 
39121
39123
  // src/cli/cloud-router.ts
39122
39124
  import { resolveStorageClient } from "@hasna/contracts/client/storage";
39125
+ import { resolve as resolvePath } from "path";
39123
39126
  function cleanMode(value) {
39124
39127
  const normalized = value?.trim().toLowerCase();
39125
39128
  return normalized || null;
@@ -39402,6 +39405,39 @@ async function cloudListProjects(client) {
39402
39405
  const envelope = res.raw;
39403
39406
  return Array.isArray(envelope?.projects) ? envelope.projects : res.items;
39404
39407
  }
39408
+ function cloudProjectSlug(value) {
39409
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
39410
+ }
39411
+ function cloudProjectPathBasename(value) {
39412
+ return value.replace(/[\\/]+$/, "").split(/[\\/]/).pop() ?? value;
39413
+ }
39414
+ function uniqueProjectMatches(projects, predicate) {
39415
+ return [...new Map(projects.filter(predicate).map((project) => [project.id, project])).values()];
39416
+ }
39417
+ function resolveCloudProjectRef(projects, ref) {
39418
+ const input = ref.trim();
39419
+ const normalizedRef = input.toLowerCase();
39420
+ const pathLike = input.startsWith(".") || input.includes("/") || input.includes("\\");
39421
+ const normalizedPath = pathLike ? resolvePath(input) : undefined;
39422
+ const slug = cloudProjectSlug(pathLike ? cloudProjectPathBasename(input) : input);
39423
+ const matchGroups = [
39424
+ uniqueProjectMatches(projects, (project) => project.id.toLowerCase() === normalizedRef),
39425
+ uniqueProjectMatches(projects, (project) => project.path === input || normalizedPath !== undefined && resolvePath(project.path) === normalizedPath),
39426
+ uniqueProjectMatches(projects, (project) => project.name.toLowerCase() === normalizedRef),
39427
+ uniqueProjectMatches(projects, (project) => project.task_list_id === input || cloudProjectSlug(project.name) === slug || cloudProjectSlug(cloudProjectPathBasename(project.path)) === slug),
39428
+ uniqueProjectMatches(projects, (project) => project.id.toLowerCase().startsWith(normalizedRef))
39429
+ ];
39430
+ for (const matches of matchGroups) {
39431
+ if (matches.length === 1)
39432
+ return matches[0].id;
39433
+ if (matches.length > 1)
39434
+ throw new Error(`Project reference is ambiguous: "${input}"`);
39435
+ }
39436
+ throw new Error(`Project not found: "${input}"`);
39437
+ }
39438
+ async function cloudResolveProjectRef(client, ref) {
39439
+ return resolveCloudProjectRef(await cloudListProjects(client), ref);
39440
+ }
39405
39441
  async function cloudAddComment(client, taskId, input) {
39406
39442
  const raw = await client.transport.post(`/tasks/${encodeURIComponent(taskId)}/comments`, input);
39407
39443
  const comment = raw && typeof raw === "object" && "comment" in raw ? raw.comment : raw;
@@ -39446,9 +39482,46 @@ async function cloudReleaseAgent(client, idOrName, sessionId) {
39446
39482
  const env = raw ?? {};
39447
39483
  return { agent: env.agent ?? null, released: env.released !== false };
39448
39484
  }
39449
- var CLOUD_MODES, VALID_STORAGE_MODES, completionCapabilityCache;
39485
+ async function cloudListTaskLists(client, projectId) {
39486
+ const query = projectId ? { project_id: projectId } : {};
39487
+ const raw = await requiredRemoteRoute(client, "/v1/task-lists", () => client.transport.get("/task-lists", { query }));
39488
+ const envelope = raw ?? {};
39489
+ if (Array.isArray(envelope.task_lists))
39490
+ return envelope.task_lists;
39491
+ if (Array.isArray(envelope.taskLists))
39492
+ return envelope.taskLists;
39493
+ return Array.isArray(raw) ? raw : [];
39494
+ }
39495
+ async function cloudResolveTaskListRef(client, ref, projectId) {
39496
+ const input = ref.trim();
39497
+ const normalizedIdRef = input.toLowerCase();
39498
+ if (UUID_RE.test(input) && !projectId)
39499
+ return normalizedIdRef;
39500
+ const lists = await cloudListTaskLists(client, projectId);
39501
+ const exactIds = lists.filter((list) => list.id.toLowerCase() === normalizedIdRef);
39502
+ if (exactIds.length === 1)
39503
+ return exactIds[0].id;
39504
+ if (exactIds.length > 1) {
39505
+ throw new Error(`Task list reference is ambiguous: "${input}"`);
39506
+ }
39507
+ const slugs = lists.filter((list) => list.slug === input);
39508
+ if (slugs.length === 1)
39509
+ return slugs[0].id;
39510
+ if (slugs.length > 1) {
39511
+ throw new Error(`Task list reference is ambiguous: "${input}"`);
39512
+ }
39513
+ const prefixes = lists.filter((list) => list.id.toLowerCase().startsWith(normalizedIdRef));
39514
+ if (prefixes.length === 1)
39515
+ return prefixes[0].id;
39516
+ if (prefixes.length > 1) {
39517
+ throw new Error(`Task list reference is ambiguous: "${input}"`);
39518
+ }
39519
+ throw new Error(`Task list not found: "${input}"`);
39520
+ }
39521
+ var UUID_RE, CLOUD_MODES, VALID_STORAGE_MODES, completionCapabilityCache;
39450
39522
  var init_cloud_router = __esm(() => {
39451
39523
  init_redaction();
39524
+ UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
39452
39525
  CLOUD_MODES = new Set(["self_hosted", "cloud", "remote", "hybrid"]);
39453
39526
  VALID_STORAGE_MODES = new Set(["local", ...CLOUD_MODES]);
39454
39527
  completionCapabilityCache = new Map;
@@ -39735,6 +39808,17 @@ ${task.description}` : null
39735
39808
  patch.estimated_minutes = estimate;
39736
39809
  if (deadline !== undefined)
39737
39810
  patch.due_at = deadline;
39811
+ if (typeof patch.project_id === "string" && patch.project_id) {
39812
+ patch.project_id = await cloudResolveProjectRef(cloud, patch.project_id);
39813
+ }
39814
+ if (typeof patch.task_list_id === "string" && patch.task_list_id) {
39815
+ let scope = typeof patch.project_id === "string" ? patch.project_id : undefined;
39816
+ if (!scope) {
39817
+ const current = await cloudGetTask(cloud, task_id2);
39818
+ scope = current?.project_id ?? undefined;
39819
+ }
39820
+ patch.task_list_id = await cloudResolveTaskListRef(cloud, patch.task_list_id, scope);
39821
+ }
39738
39822
  if (version3 !== undefined)
39739
39823
  patch.version = version3;
39740
39824
  const updated = await cloudUpdateTask(cloud, task_id2, patch);
@@ -45748,6 +45832,63 @@ function registerTaskProjectTools(server, ctx) {
45748
45832
  }
45749
45833
  });
45750
45834
  }
45835
+ if (shouldRegisterTool("move_task")) {
45836
+ server.tool("move_task", "Re-parent a task to another project and/or task list, preserving its id and history. " + "A task list is project-scoped, so moving to a new project detaches the old list unless to_list is given.", {
45837
+ task_id: exports_external.string().describe("Task ID"),
45838
+ to_project: exports_external.string().optional().describe("Destination project ID, slug, or path"),
45839
+ to_list: exports_external.string().optional().describe("Destination task list (UUID, or slug resolved in the destination project)"),
45840
+ clear_list: exports_external.boolean().optional().describe("Detach from its task list (set task_list_id to null)"),
45841
+ version: exports_external.number().optional().describe("Expected version for optimistic locking")
45842
+ }, async ({ task_id, to_project, to_list, clear_list, version: version2 }) => {
45843
+ try {
45844
+ if (!to_project && !to_list && !clear_list) {
45845
+ throw new Error("Nothing to move: pass to_project, to_list, or clear_list.");
45846
+ }
45847
+ if (to_list && clear_list) {
45848
+ throw new Error("Use either to_list or clear_list, not both.");
45849
+ }
45850
+ const cloud = getTodosCloudClient();
45851
+ if (cloud) {
45852
+ const current2 = await cloudGetTask(cloud, task_id);
45853
+ if (!current2)
45854
+ throw new Error(`Task not found: ${task_id}`);
45855
+ const targetProjectId2 = to_project ? await cloudResolveProjectRef(cloud, to_project) : undefined;
45856
+ const scope = targetProjectId2 ?? current2.project_id ?? undefined;
45857
+ const patch = {};
45858
+ if (targetProjectId2 !== undefined)
45859
+ patch.project_id = targetProjectId2;
45860
+ if (to_list)
45861
+ patch.task_list_id = await cloudResolveTaskListRef(cloud, to_list, scope);
45862
+ else if (clear_list)
45863
+ patch.task_list_id = null;
45864
+ else if (targetProjectId2 && targetProjectId2 !== current2.project_id)
45865
+ patch.task_list_id = null;
45866
+ if (version2 !== undefined)
45867
+ patch.version = version2;
45868
+ const task2 = await cloudUpdateTask(cloud, task_id, patch);
45869
+ return { content: [{ type: "text", text: formatTask(task2) }] };
45870
+ }
45871
+ const resolvedId = resolveId(task_id);
45872
+ const current = getTask(resolvedId);
45873
+ if (!current)
45874
+ throw new Error(`Task not found: ${task_id}`);
45875
+ const targetProjectId = to_project ? resolveId(to_project, "projects") : undefined;
45876
+ const updates = {};
45877
+ if (targetProjectId !== undefined)
45878
+ updates.project_id = targetProjectId;
45879
+ if (to_list)
45880
+ updates.task_list_id = resolveId(to_list, "task_lists");
45881
+ else if (clear_list)
45882
+ updates.task_list_id = null;
45883
+ else if (targetProjectId && targetProjectId !== current.project_id)
45884
+ updates.task_list_id = null;
45885
+ const task = updateWithOptionalVersion(resolvedId, updates, version2);
45886
+ return { content: [{ type: "text", text: formatTask(task) }] };
45887
+ } catch (e) {
45888
+ return { content: [{ type: "text", text: formatError2(e) }], isError: true };
45889
+ }
45890
+ });
45891
+ }
45751
45892
  if (shouldRegisterTool("reschedule_task")) {
45752
45893
  server.tool("reschedule_task", "Update a task's deadline.", {
45753
45894
  task_id: exports_external.string().describe("Task ID"),
@@ -73450,6 +73591,7 @@ function registerTaskMetaTools(server, ctx) {
73450
73591
  complete_task: "complete_task \u2014 Mark task completed. Params: task_id, confidence, completed_at, version",
73451
73592
  cancel_task: "cancel_task \u2014 Cancel a task. Params: task_id, version",
73452
73593
  reassign_task: "reassign_task \u2014 Change task assignee. Params: task_id, new_assignee, version",
73594
+ move_task: "move_task \u2014 Re-parent a task to another project and/or task list (keeps its id and history). Params: task_id (required), to_project, to_list, clear_list, version",
73453
73595
  reschedule_task: "reschedule_task \u2014 Update deadline. Params: task_id, deadline, version",
73454
73596
  prioritize_task: "prioritize_task \u2014 Set priority. Params: task_id, priority, version",
73455
73597
  search_tasks: "search_tasks \u2014 Full-text search. Params: query, project_id, status, limit",
@@ -261,6 +261,14 @@ export declare function buildV1OpenApiDocument(version?: string): {
261
261
  assigned_to: {
262
262
  type: string;
263
263
  };
264
+ project_id: {
265
+ type: string;
266
+ nullable: boolean;
267
+ };
268
+ task_list_id: {
269
+ type: string;
270
+ nullable: boolean;
271
+ };
264
272
  version: {
265
273
  type: string;
266
274
  };
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAsFA,wBAAgB,sBAAsB,CAAC,OAAO,SAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+jBnE"}
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAsFA,wBAAgB,sBAAsB,CAAC,OAAO,SAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAikBnE"}
package/dist/storage.js CHANGED
@@ -13030,7 +13030,7 @@ async function updateTask2(id, input, store) {
13030
13030
  tags: input.tags ?? existing.tags,
13031
13031
  metadata: input.metadata ?? existing.metadata,
13032
13032
  requires_approval: input.requires_approval ?? existing.requires_approval,
13033
- task_list_id: input.task_list_id ?? existing.task_list_id
13033
+ task_list_id: input.task_list_id !== undefined ? input.task_list_id : existing.task_list_id
13034
13034
  };
13035
13035
  await store.upsert("tasks", task);
13036
13036
  return task;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.11.93",
3
+ "version": "0.11.94",
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",