@hasna/todos 0.11.51 → 0.11.52

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
@@ -25086,6 +25086,21 @@ var init_task_crud2 = __esm(() => {
25086
25086
  init_token_utils();
25087
25087
  });
25088
25088
 
25089
+ // src/db/labels.ts
25090
+ function rowToLabel(row) {
25091
+ return { ...row };
25092
+ }
25093
+ function listLabels(projectId, db) {
25094
+ const d = db || getDatabase();
25095
+ if (projectId) {
25096
+ return d.query("SELECT * FROM labels WHERE project_id IS NULL OR project_id = ? ORDER BY name").all(projectId).map(rowToLabel);
25097
+ }
25098
+ return d.query("SELECT * FROM labels ORDER BY name").all().map(rowToLabel);
25099
+ }
25100
+ var init_labels = __esm(() => {
25101
+ init_database();
25102
+ });
25103
+
25089
25104
  // src/lib/mention-resolver.ts
25090
25105
  var exports_mention_resolver = {};
25091
25106
  __export(exports_mention_resolver, {
@@ -29187,6 +29202,7 @@ function registerTaskProjectTools(server, ctx) {
29187
29202
  if (shouldRegisterTool("create_project")) {
29188
29203
  server.tool("create_project", "Create a new project.", {
29189
29204
  name: exports_external.string().describe("Project name"),
29205
+ path: exports_external.string().describe("Unique filesystem path for the project"),
29190
29206
  description: exports_external.string().optional(),
29191
29207
  status: exports_external.enum(["active", "completed", "on_hold", "archived"]).optional(),
29192
29208
  short_id: exports_external.string().nullable().optional().describe("Short ID (auto-generated if omitted)"),
@@ -29206,7 +29222,11 @@ function registerTaskProjectTools(server, ctx) {
29206
29222
  limit: exports_external.number().optional()
29207
29223
  }, async ({ status, limit }) => {
29208
29224
  try {
29209
- const projects = listProjects({ status, limit });
29225
+ let projects = listProjects();
29226
+ if (status)
29227
+ projects = projects.filter((p) => p.status === status);
29228
+ if (limit)
29229
+ projects = projects.slice(0, limit);
29210
29230
  if (projects.length === 0)
29211
29231
  return { content: [{ type: "text", text: "No projects found." }] };
29212
29232
  const lines = projects.map((p) => `[${p.status}] ${p.short_id || p.id.slice(0, 8)} ${p.name}`);
@@ -29836,12 +29856,12 @@ Tasks:` : null,
29836
29856
  });
29837
29857
  }
29838
29858
  if (shouldRegisterTool("list_tags")) {
29839
- server.tool("list_tags", "List all tags.", async () => {
29859
+ server.tool("list_tags", "List all distinct task tags in use, with task counts.", async () => {
29840
29860
  try {
29841
- const tags = listTags();
29842
- if (tags.length === 0)
29861
+ const rows = getDatabase().query("SELECT tag, COUNT(*) AS count FROM task_tags GROUP BY tag ORDER BY tag").all();
29862
+ if (rows.length === 0)
29843
29863
  return { content: [{ type: "text", text: "No tags found." }] };
29844
- const lines = tags.map((t) => `${t.color ? "[" + t.color + "] " : ""}${t.name}`);
29864
+ const lines = rows.map((r) => `${r.tag} (${r.count})`);
29845
29865
  return { content: [{ type: "text", text: lines.join(`
29846
29866
  `) }] };
29847
29867
  } catch (e) {
@@ -30410,6 +30430,8 @@ var init_task_project_tools = __esm(() => {
30410
30430
  init_comments();
30411
30431
  init_task_runs();
30412
30432
  init_project_bootstrap();
30433
+ init_database();
30434
+ init_labels();
30413
30435
  init_redaction();
30414
30436
  init_retention_cleanup();
30415
30437
  init_mention_resolver();
@@ -42860,8 +42882,17 @@ function buildServer() {
42860
42882
  version: getMcpVersion()
42861
42883
  });
42862
42884
  installMcpTokenDiagnostics(server);
42885
+ const registeredToolNames = new Set;
42886
+ const shouldRegisterToolOnce = (name) => {
42887
+ if (!shouldRegisterTool(name))
42888
+ return false;
42889
+ if (registeredToolNames.has(name))
42890
+ return false;
42891
+ registeredToolNames.add(name);
42892
+ return true;
42893
+ };
42863
42894
  const toolContext = {
42864
- shouldRegisterTool,
42895
+ shouldRegisterTool: shouldRegisterToolOnce,
42865
42896
  resolveId,
42866
42897
  formatError,
42867
42898
  formatTask,
@@ -42881,8 +42912,8 @@ function buildServer() {
42881
42912
  registerTemplateTools(server, toolContext);
42882
42913
  registerEnvironmentSnapshotTools(server, toolContext);
42883
42914
  registerWorkflowPrompts(server);
42884
- registerMachineTools(server, { shouldRegisterTool, formatError });
42885
- registerDispatchTools(server, { shouldRegisterTool, resolveId, formatError });
42915
+ registerMachineTools(server, { shouldRegisterTool: shouldRegisterToolOnce, formatError });
42916
+ registerDispatchTools(server, { shouldRegisterTool: shouldRegisterToolOnce, resolveId, formatError });
42886
42917
  return server;
42887
42918
  }
42888
42919
  async function main() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+EpE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAO9E;AA8GD,wBAAgB,WAAW,cAuC1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+EpE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAO9E;AA8GD,wBAAgB,WAAW,cAsD1B"}
package/dist/mcp/index.js CHANGED
@@ -14442,6 +14442,21 @@ var init_project_bootstrap = __esm(() => {
14442
14442
  init_task_lists();
14443
14443
  });
14444
14444
 
14445
+ // src/db/labels.ts
14446
+ function rowToLabel(row) {
14447
+ return { ...row };
14448
+ }
14449
+ function listLabels(projectId, db) {
14450
+ const d = db || getDatabase();
14451
+ if (projectId) {
14452
+ return d.query("SELECT * FROM labels WHERE project_id IS NULL OR project_id = ? ORDER BY name").all(projectId).map(rowToLabel);
14453
+ }
14454
+ return d.query("SELECT * FROM labels ORDER BY name").all().map(rowToLabel);
14455
+ }
14456
+ var init_labels = __esm(() => {
14457
+ init_database();
14458
+ });
14459
+
14445
14460
  // src/lib/retention-cleanup.ts
14446
14461
  import { existsSync as existsSync7, unlinkSync } from "fs";
14447
14462
  function normalizeScopes(scopes) {
@@ -20147,6 +20162,7 @@ function registerTaskProjectTools(server, ctx) {
20147
20162
  if (shouldRegisterTool("create_project")) {
20148
20163
  server.tool("create_project", "Create a new project.", {
20149
20164
  name: exports_external.string().describe("Project name"),
20165
+ path: exports_external.string().describe("Unique filesystem path for the project"),
20150
20166
  description: exports_external.string().optional(),
20151
20167
  status: exports_external.enum(["active", "completed", "on_hold", "archived"]).optional(),
20152
20168
  short_id: exports_external.string().nullable().optional().describe("Short ID (auto-generated if omitted)"),
@@ -20166,7 +20182,11 @@ function registerTaskProjectTools(server, ctx) {
20166
20182
  limit: exports_external.number().optional()
20167
20183
  }, async ({ status, limit }) => {
20168
20184
  try {
20169
- const projects = listProjects({ status, limit });
20185
+ let projects = listProjects();
20186
+ if (status)
20187
+ projects = projects.filter((p) => p.status === status);
20188
+ if (limit)
20189
+ projects = projects.slice(0, limit);
20170
20190
  if (projects.length === 0)
20171
20191
  return { content: [{ type: "text", text: "No projects found." }] };
20172
20192
  const lines = projects.map((p) => `[${p.status}] ${p.short_id || p.id.slice(0, 8)} ${p.name}`);
@@ -20796,12 +20816,12 @@ Tasks:` : null,
20796
20816
  });
20797
20817
  }
20798
20818
  if (shouldRegisterTool("list_tags")) {
20799
- server.tool("list_tags", "List all tags.", async () => {
20819
+ server.tool("list_tags", "List all distinct task tags in use, with task counts.", async () => {
20800
20820
  try {
20801
- const tags = listTags();
20802
- if (tags.length === 0)
20821
+ const rows = getDatabase().query("SELECT tag, COUNT(*) AS count FROM task_tags GROUP BY tag ORDER BY tag").all();
20822
+ if (rows.length === 0)
20803
20823
  return { content: [{ type: "text", text: "No tags found." }] };
20804
- const lines = tags.map((t) => `${t.color ? "[" + t.color + "] " : ""}${t.name}`);
20824
+ const lines = rows.map((r) => `${r.tag} (${r.count})`);
20805
20825
  return { content: [{ type: "text", text: lines.join(`
20806
20826
  `) }] };
20807
20827
  } catch (e) {
@@ -21370,6 +21390,8 @@ var init_task_project_tools = __esm(() => {
21370
21390
  init_comments();
21371
21391
  init_task_runs();
21372
21392
  init_project_bootstrap();
21393
+ init_database();
21394
+ init_labels();
21373
21395
  init_redaction();
21374
21396
  init_retention_cleanup();
21375
21397
  init_mention_resolver();
@@ -37312,8 +37334,17 @@ function buildServer() {
37312
37334
  version: getMcpVersion()
37313
37335
  });
37314
37336
  installMcpTokenDiagnostics(server);
37337
+ const registeredToolNames = new Set;
37338
+ const shouldRegisterToolOnce = (name) => {
37339
+ if (!shouldRegisterTool(name))
37340
+ return false;
37341
+ if (registeredToolNames.has(name))
37342
+ return false;
37343
+ registeredToolNames.add(name);
37344
+ return true;
37345
+ };
37315
37346
  const toolContext = {
37316
- shouldRegisterTool,
37347
+ shouldRegisterTool: shouldRegisterToolOnce,
37317
37348
  resolveId,
37318
37349
  formatError,
37319
37350
  formatTask,
@@ -37333,8 +37364,8 @@ function buildServer() {
37333
37364
  registerTemplateTools(server, toolContext);
37334
37365
  registerEnvironmentSnapshotTools(server, toolContext);
37335
37366
  registerWorkflowPrompts(server);
37336
- registerMachineTools(server, { shouldRegisterTool, formatError });
37337
- registerDispatchTools(server, { shouldRegisterTool, resolveId, formatError });
37367
+ registerMachineTools(server, { shouldRegisterTool: shouldRegisterToolOnce, formatError });
37368
+ registerDispatchTools(server, { shouldRegisterTool: shouldRegisterToolOnce, resolveId, formatError });
37338
37369
  return server;
37339
37370
  }
37340
37371
  async function main() {
@@ -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;AAkIjD,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,QA41FlF"}
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;AAoIjD,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,QAi2FlF"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-trust.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/workspace-trust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,KAAK,OAAO,GAAG;IACb,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,OAAO,GAAG,IAAI,CAqDjH"}
1
+ {"version":3,"file":"workspace-trust.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/workspace-trust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,KAAK,OAAO,GAAG;IACb,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,OAAO,GAAG,IAAI,CA0DjH"}
@@ -32089,6 +32089,21 @@ var init_project_bootstrap = __esm(() => {
32089
32089
  init_task_lists();
32090
32090
  });
32091
32091
 
32092
+ // src/db/labels.ts
32093
+ function rowToLabel(row) {
32094
+ return { ...row };
32095
+ }
32096
+ function listLabels(projectId, db) {
32097
+ const d = db || getDatabase();
32098
+ if (projectId) {
32099
+ return d.query("SELECT * FROM labels WHERE project_id IS NULL OR project_id = ? ORDER BY name").all(projectId).map(rowToLabel);
32100
+ }
32101
+ return d.query("SELECT * FROM labels ORDER BY name").all().map(rowToLabel);
32102
+ }
32103
+ var init_labels = __esm(() => {
32104
+ init_database();
32105
+ });
32106
+
32092
32107
  // src/lib/retention-cleanup.ts
32093
32108
  import { existsSync as existsSync9, unlinkSync } from "fs";
32094
32109
  function normalizeScopes(scopes) {
@@ -37794,6 +37809,7 @@ function registerTaskProjectTools(server, ctx) {
37794
37809
  if (shouldRegisterTool("create_project")) {
37795
37810
  server.tool("create_project", "Create a new project.", {
37796
37811
  name: exports_external.string().describe("Project name"),
37812
+ path: exports_external.string().describe("Unique filesystem path for the project"),
37797
37813
  description: exports_external.string().optional(),
37798
37814
  status: exports_external.enum(["active", "completed", "on_hold", "archived"]).optional(),
37799
37815
  short_id: exports_external.string().nullable().optional().describe("Short ID (auto-generated if omitted)"),
@@ -37813,7 +37829,11 @@ function registerTaskProjectTools(server, ctx) {
37813
37829
  limit: exports_external.number().optional()
37814
37830
  }, async ({ status, limit }) => {
37815
37831
  try {
37816
- const projects = listProjects({ status, limit });
37832
+ let projects = listProjects();
37833
+ if (status)
37834
+ projects = projects.filter((p) => p.status === status);
37835
+ if (limit)
37836
+ projects = projects.slice(0, limit);
37817
37837
  if (projects.length === 0)
37818
37838
  return { content: [{ type: "text", text: "No projects found." }] };
37819
37839
  const lines = projects.map((p) => `[${p.status}] ${p.short_id || p.id.slice(0, 8)} ${p.name}`);
@@ -38443,12 +38463,12 @@ Tasks:` : null,
38443
38463
  });
38444
38464
  }
38445
38465
  if (shouldRegisterTool("list_tags")) {
38446
- server.tool("list_tags", "List all tags.", async () => {
38466
+ server.tool("list_tags", "List all distinct task tags in use, with task counts.", async () => {
38447
38467
  try {
38448
- const tags = listTags();
38449
- if (tags.length === 0)
38468
+ const rows = getDatabase().query("SELECT tag, COUNT(*) AS count FROM task_tags GROUP BY tag ORDER BY tag").all();
38469
+ if (rows.length === 0)
38450
38470
  return { content: [{ type: "text", text: "No tags found." }] };
38451
- const lines = tags.map((t) => `${t.color ? "[" + t.color + "] " : ""}${t.name}`);
38471
+ const lines = rows.map((r) => `${r.tag} (${r.count})`);
38452
38472
  return { content: [{ type: "text", text: lines.join(`
38453
38473
  `) }] };
38454
38474
  } catch (e) {
@@ -39017,6 +39037,8 @@ var init_task_project_tools = __esm(() => {
39017
39037
  init_comments();
39018
39038
  init_task_runs();
39019
39039
  init_project_bootstrap();
39040
+ init_database();
39041
+ init_labels();
39020
39042
  init_redaction();
39021
39043
  init_retention_cleanup();
39022
39044
  init_mention_resolver();
@@ -76858,8 +76880,17 @@ function buildServer() {
76858
76880
  version: getMcpVersion()
76859
76881
  });
76860
76882
  installMcpTokenDiagnostics(server);
76883
+ const registeredToolNames = new Set;
76884
+ const shouldRegisterToolOnce = (name) => {
76885
+ if (!shouldRegisterTool(name))
76886
+ return false;
76887
+ if (registeredToolNames.has(name))
76888
+ return false;
76889
+ registeredToolNames.add(name);
76890
+ return true;
76891
+ };
76861
76892
  const toolContext = {
76862
- shouldRegisterTool,
76893
+ shouldRegisterTool: shouldRegisterToolOnce,
76863
76894
  resolveId,
76864
76895
  formatError: formatError2,
76865
76896
  formatTask,
@@ -76879,8 +76910,8 @@ function buildServer() {
76879
76910
  registerTemplateTools(server, toolContext);
76880
76911
  registerEnvironmentSnapshotTools(server, toolContext);
76881
76912
  registerWorkflowPrompts(server);
76882
- registerMachineTools(server, { shouldRegisterTool, formatError: formatError2 });
76883
- registerDispatchTools(server, { shouldRegisterTool, resolveId, formatError: formatError2 });
76913
+ registerMachineTools(server, { shouldRegisterTool: shouldRegisterToolOnce, formatError: formatError2 });
76914
+ registerDispatchTools(server, { shouldRegisterTool: shouldRegisterToolOnce, resolveId, formatError: formatError2 });
76884
76915
  return server;
76885
76916
  }
76886
76917
  async function main() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.11.51",
3
+ "version": "0.11.52",
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",