@hasna/todos 0.15.1 → 0.15.3

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":"agent-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoDzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACxE,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,SAAS,EAAE,MAAM,GAChB,CAAC,EAAE,CAML;AAYD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAuiBrD"}
1
+ {"version":3,"file":"agent-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoDzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACxE,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,SAAS,EAAE,MAAM,GAChB,CAAC,EAAE,CAML;AAYD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAqjBrD"}
@@ -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;AAgEzC,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAmUD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAmxDpD"}
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;AAgEzC,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAmUD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAkzDpD"}
package/dist/cli/index.js CHANGED
@@ -2123,7 +2123,7 @@ var package_default;
2123
2123
  var init_package = __esm(() => {
2124
2124
  package_default = {
2125
2125
  name: "@hasna/todos",
2126
- version: "0.15.1",
2126
+ version: "0.15.3",
2127
2127
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
2128
2128
  type: "module",
2129
2129
  main: "dist/index.js",
@@ -20683,12 +20683,14 @@ function registerTaskCommands(program2) {
20683
20683
  const globalOpts = program2.opts();
20684
20684
  opts.tags = opts.tags || opts.tag;
20685
20685
  opts.list = opts.list || opts.taskList;
20686
- const creator = resolveCreatorIdentity(opts.createdBy || globalOpts.agent);
20687
20686
  const router = resolveWritableIdentity(opts.createdBy || globalOpts.agent);
20688
20687
  const requestedAssign = opts.assign ? await resolveValidatedAssignee(opts.assign, Boolean(opts.assignSeat), (v) => `--assign ${v} --assign-seat`) : undefined;
20689
20688
  const assignee = requestedAssign || (opts.unassigned ? undefined : router.agent_id || undefined);
20690
- if (!assignee && !opts.unassigned) {
20689
+ const ownerless = !assignee && !opts.unassigned;
20690
+ if (ownerless) {
20691
20691
  console.error(chalk3.yellow("Warning: task is ownerless and unattributable \u2014 export TODOS_AGENT_ID=<name> for this session, or pass --agent/--assign <agent> or --unassigned."));
20692
+ } else if (!router.agent_id) {
20693
+ console.error(chalk3.yellow("Warning: task is unattributable \u2014 created_by will be recorded as null. Export TODOS_AGENT_ID=<name> for this session, or pass --agent <agent>, to record who filed it."));
20692
20694
  }
20693
20695
  const cloud = getTodosCloudClient();
20694
20696
  if (cloud) {
@@ -20716,7 +20718,7 @@ function registerTaskCommands(program2) {
20716
20718
  status: parseStatus(opts.status),
20717
20719
  task_list_id: cloudTaskListId,
20718
20720
  agent_id: globalOpts.agent || router.agent_id || undefined,
20719
- created_by: creator.agent_id || undefined,
20721
+ created_by: router.agent_id || undefined,
20720
20722
  session_id: globalOpts.session,
20721
20723
  project_id: cloudProjectId,
20722
20724
  working_dir: process.cwd(),
@@ -20764,7 +20766,7 @@ function registerTaskCommands(program2) {
20764
20766
  status: parseStatus(opts.status),
20765
20767
  task_list_id: taskListId,
20766
20768
  agent_id: globalOpts.agent || router.agent_id || undefined,
20767
- created_by: creator.agent_id || undefined,
20769
+ created_by: router.agent_id || undefined,
20768
20770
  session_id: globalOpts.session,
20769
20771
  project_id: projectId,
20770
20772
  working_dir: process.cwd(),
@@ -27725,7 +27727,10 @@ Or pass --force to take over the machine-wide identity.`));
27725
27727
  console.log(` ${chalk6.dim("ID:")} ${result.id}`);
27726
27728
  console.log(` ${chalk6.dim("Name:")} ${result.name}`);
27727
27729
  console.log(`
27728
- ${chalk6.dim("Identity saved \u2014 later commands attribute to this agent automatically.")}`);
27730
+ ${chalk6.dim("Identity saved for diagnostics and --inbox \u2014 it is not attribution.")}
27731
+ ${chalk6.dim("For per-session attribution, set a per-process identity \u2014 it outranks this file and cannot collide with another session on the same machine:")}
27732
+ ${chalk6.dim(`export TODOS_AGENT_ID=${result.name}`)}
27733
+ ${chalk6.dim(`Or pass --agent ${result.name} on each command.`)}`);
27729
27734
  }
27730
27735
  } catch (e) {
27731
27736
  handleError(e);
@@ -44037,7 +44042,7 @@ function registerTaskCrudTools(server, ctx) {
44037
44042
  project_id: exports_external.string().optional().describe("Project ID"),
44038
44043
  task_list_id: exports_external.string().optional().describe("Task list ID"),
44039
44044
  assigned_to: exports_external.string().optional().describe("Agent ID or name to assign to"),
44040
- created_by: exports_external.string().optional().describe("Agent who FILED this task. Defaults to the ambient agent identity (todos init / TODOS_AGENT_ID)."),
44045
+ created_by: exports_external.string().optional().describe("Agent who FILED this task. Defaults to the PROCESS-BOUND ambient identity (--agent / TODOS_AGENT_ID) if set; the machine-shared identity `todos init` persists to disk is never used here, because it names the station, not the caller."),
44041
44046
  unassigned: exports_external.boolean().optional().describe("Deliberately file with no assignee. Without it, the task defaults to the filer."),
44042
44047
  allow_seat: exports_external.boolean().optional().describe("Allow assigned_to to name a durable seat. A seat queue has no session watching it, so this must be deliberate."),
44043
44048
  depends_on: exports_external.array(exports_external.string()).optional().describe("Array of task IDs this task depends on"),
@@ -44052,14 +44057,13 @@ function registerTaskCrudTools(server, ctx) {
44052
44057
  try {
44053
44058
  const { depends_on, assigned_to, project_id, task_list_id, tags, estimate, confidence, retry_count, deadline, created_by, unassigned, allow_seat, ...rest } = params;
44054
44059
  const requestedAssignee = assigned_to ? await validateMcpAssignee(assigned_to, Boolean(allow_seat)) : undefined;
44055
- const creator = resolveCreatorIdentity(created_by);
44056
44060
  const router = resolveWritableIdentity(created_by);
44057
44061
  const assignee = requestedAssignee || (unassigned ? undefined : router.agent_id || undefined);
44058
44062
  const cloud = getTodosCloudClient();
44059
44063
  if (cloud) {
44060
44064
  const payload = { ...rest };
44061
- if (creator.agent_id)
44062
- payload.created_by = creator.agent_id;
44065
+ if (router.agent_id)
44066
+ payload.created_by = router.agent_id;
44063
44067
  if (router.agent_id)
44064
44068
  payload.agent_id = payload.agent_id ?? router.agent_id;
44065
44069
  if (assignee)
@@ -44085,8 +44089,8 @@ function registerTaskCrudTools(server, ctx) {
44085
44089
  return { content: [{ type: "text", text: mutationTaskResponse(created) }] };
44086
44090
  }
44087
44091
  const resolved = { ...rest };
44088
- if (creator.agent_id)
44089
- resolved.created_by = creator.agent_id;
44092
+ if (router.agent_id)
44093
+ resolved.created_by = router.agent_id;
44090
44094
  if (router.agent_id)
44091
44095
  resolved.agent_id = resolved.agent_id ?? router.agent_id;
44092
44096
  if (assignee)
package/dist/contracts.js CHANGED
@@ -12032,7 +12032,7 @@ var init_tasks = __esm(() => {
12032
12032
  // package.json
12033
12033
  var package_default = {
12034
12034
  name: "@hasna/todos",
12035
- version: "0.15.1",
12035
+ version: "0.15.3",
12036
12036
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12037
12037
  type: "module",
12038
12038
  main: "dist/index.js",
package/dist/index.js CHANGED
@@ -12145,7 +12145,7 @@ var init_dispatches = __esm(() => {
12145
12145
  // package.json
12146
12146
  var package_default = {
12147
12147
  name: "@hasna/todos",
12148
- version: "0.15.1",
12148
+ version: "0.15.3",
12149
12149
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12150
12150
  type: "module",
12151
12151
  main: "dist/index.js",
package/dist/mcp/index.js CHANGED
@@ -20867,7 +20867,7 @@ function registerTaskCrudTools(server, ctx) {
20867
20867
  project_id: exports_external.string().optional().describe("Project ID"),
20868
20868
  task_list_id: exports_external.string().optional().describe("Task list ID"),
20869
20869
  assigned_to: exports_external.string().optional().describe("Agent ID or name to assign to"),
20870
- created_by: exports_external.string().optional().describe("Agent who FILED this task. Defaults to the ambient agent identity (todos init / TODOS_AGENT_ID)."),
20870
+ created_by: exports_external.string().optional().describe("Agent who FILED this task. Defaults to the PROCESS-BOUND ambient identity (--agent / TODOS_AGENT_ID) if set; the machine-shared identity `todos init` persists to disk is never used here, because it names the station, not the caller."),
20871
20871
  unassigned: exports_external.boolean().optional().describe("Deliberately file with no assignee. Without it, the task defaults to the filer."),
20872
20872
  allow_seat: exports_external.boolean().optional().describe("Allow assigned_to to name a durable seat. A seat queue has no session watching it, so this must be deliberate."),
20873
20873
  depends_on: exports_external.array(exports_external.string()).optional().describe("Array of task IDs this task depends on"),
@@ -20882,14 +20882,13 @@ function registerTaskCrudTools(server, ctx) {
20882
20882
  try {
20883
20883
  const { depends_on, assigned_to, project_id, task_list_id, tags, estimate, confidence, retry_count, deadline, created_by, unassigned, allow_seat, ...rest } = params;
20884
20884
  const requestedAssignee = assigned_to ? await validateMcpAssignee(assigned_to, Boolean(allow_seat)) : undefined;
20885
- const creator = resolveCreatorIdentity(created_by);
20886
20885
  const router = resolveWritableIdentity(created_by);
20887
20886
  const assignee = requestedAssignee || (unassigned ? undefined : router.agent_id || undefined);
20888
20887
  const cloud = getTodosCloudClient();
20889
20888
  if (cloud) {
20890
20889
  const payload = { ...rest };
20891
- if (creator.agent_id)
20892
- payload.created_by = creator.agent_id;
20890
+ if (router.agent_id)
20891
+ payload.created_by = router.agent_id;
20893
20892
  if (router.agent_id)
20894
20893
  payload.agent_id = payload.agent_id ?? router.agent_id;
20895
20894
  if (assignee)
@@ -20915,8 +20914,8 @@ function registerTaskCrudTools(server, ctx) {
20915
20914
  return { content: [{ type: "text", text: mutationTaskResponse(created) }] };
20916
20915
  }
20917
20916
  const resolved = { ...rest };
20918
- if (creator.agent_id)
20919
- resolved.created_by = creator.agent_id;
20917
+ if (router.agent_id)
20918
+ resolved.created_by = router.agent_id;
20920
20919
  if (router.agent_id)
20921
20920
  resolved.agent_id = resolved.agent_id ?? router.agent_id;
20922
20921
  if (assignee)
@@ -34915,7 +34914,7 @@ var package_default;
34915
34914
  var init_package = __esm(() => {
34916
34915
  package_default = {
34917
34916
  name: "@hasna/todos",
34918
- version: "0.15.1",
34917
+ version: "0.15.3",
34919
34918
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
34920
34919
  type: "module",
34921
34920
  main: "dist/index.js",
@@ -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;AAoBjD,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;IAC1F,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AAuBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAoY5E"}
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;AAoBjD,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;IAC1F,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AAuBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QA2Y5E"}
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.15.1",
44
+ version: "0.15.3",
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
@@ -12032,7 +12032,7 @@ var init_tasks = __esm(() => {
12032
12032
  // package.json
12033
12033
  var package_default = {
12034
12034
  name: "@hasna/todos",
12035
- version: "0.15.1",
12035
+ version: "0.15.3",
12036
12036
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12037
12037
  type: "module",
12038
12038
  main: "dist/index.js",
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.15.1",
3
+ "packageVersion": "0.15.3",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "f62a9681a546c432583e5393670e4596b913e4f2",
6
- "gitTree": "0337b5c4f304074196541df984c30443e0459ae6",
7
- "sourceTreeSha256": "d293f3d60bdc62d1b2d616b674146a99cae188828ac07a1ba303fc58e3d8341c",
8
- "generatedAt": "2026-08-03T16:59:17.000Z"
5
+ "gitCommit": "b38b1f9f2711efe98320a6ebe94dcb60224199af",
6
+ "gitTree": "9f53dd1b7ffc53305f9f9fbb7cdead93d658d047",
7
+ "sourceTreeSha256": "aa33d622c8c734b4d098f265cffcaaec409615ae8ee8c396413226ca51964b59",
8
+ "generatedAt": "2026-08-04T04:18:09.000Z"
9
9
  }
@@ -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.15.1",
73
+ version: "0.15.3",
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",
@@ -58727,7 +58727,7 @@ function registerTaskCrudTools(server, ctx) {
58727
58727
  project_id: exports_external.string().optional().describe("Project ID"),
58728
58728
  task_list_id: exports_external.string().optional().describe("Task list ID"),
58729
58729
  assigned_to: exports_external.string().optional().describe("Agent ID or name to assign to"),
58730
- created_by: exports_external.string().optional().describe("Agent who FILED this task. Defaults to the ambient agent identity (todos init / TODOS_AGENT_ID)."),
58730
+ created_by: exports_external.string().optional().describe("Agent who FILED this task. Defaults to the PROCESS-BOUND ambient identity (--agent / TODOS_AGENT_ID) if set; the machine-shared identity `todos init` persists to disk is never used here, because it names the station, not the caller."),
58731
58731
  unassigned: exports_external.boolean().optional().describe("Deliberately file with no assignee. Without it, the task defaults to the filer."),
58732
58732
  allow_seat: exports_external.boolean().optional().describe("Allow assigned_to to name a durable seat. A seat queue has no session watching it, so this must be deliberate."),
58733
58733
  depends_on: exports_external.array(exports_external.string()).optional().describe("Array of task IDs this task depends on"),
@@ -58742,14 +58742,13 @@ function registerTaskCrudTools(server, ctx) {
58742
58742
  try {
58743
58743
  const { depends_on, assigned_to, project_id, task_list_id, tags, estimate, confidence, retry_count, deadline, created_by, unassigned, allow_seat, ...rest } = params;
58744
58744
  const requestedAssignee = assigned_to ? await validateMcpAssignee(assigned_to, Boolean(allow_seat)) : undefined;
58745
- const creator = resolveCreatorIdentity(created_by);
58746
58745
  const router = resolveWritableIdentity(created_by);
58747
58746
  const assignee = requestedAssignee || (unassigned ? undefined : router.agent_id || undefined);
58748
58747
  const cloud = getTodosCloudClient();
58749
58748
  if (cloud) {
58750
58749
  const payload = { ...rest };
58751
- if (creator.agent_id)
58752
- payload.created_by = creator.agent_id;
58750
+ if (router.agent_id)
58751
+ payload.created_by = router.agent_id;
58753
58752
  if (router.agent_id)
58754
58753
  payload.agent_id = payload.agent_id ?? router.agent_id;
58755
58754
  if (assignee)
@@ -58775,8 +58774,8 @@ function registerTaskCrudTools(server, ctx) {
58775
58774
  return { content: [{ type: "text", text: mutationTaskResponse(created) }] };
58776
58775
  }
58777
58776
  const resolved = { ...rest };
58778
- if (creator.agent_id)
58779
- resolved.created_by = creator.agent_id;
58777
+ if (router.agent_id)
58778
+ resolved.created_by = router.agent_id;
58780
58779
  if (router.agent_id)
58781
58780
  resolved.agent_id = resolved.agent_id ?? router.agent_id;
58782
58781
  if (assignee)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.15.1",
3
+ "version": "0.15.3",
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",