@hasna/todos 0.11.41 → 0.11.42

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":"token-utils.d.ts","sourceRoot":"","sources":["../../src/mcp/token-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3C,eAAO,MAAM,cAAc,aAoBzB,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA+O7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAMhE,CAAC;AAgBF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,YAAY,qBAA+B,EAC3C,UAAU,qBAAmC,GAC5C,OAAO,CAqCT;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,SAAM,GAAG,MAAM,GAAG,IAAI,CAK5F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,SAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB1F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCtF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAexD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAMD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,UAA4B,GAAG,OAAO,CA0BvH;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAY5D"}
1
+ {"version":3,"file":"token-utils.d.ts","sourceRoot":"","sources":["../../src/mcp/token-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3C,eAAO,MAAM,cAAc,aAoBzB,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAmP7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAMhE,CAAC;AAgBF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,YAAY,qBAA+B,EAC3C,UAAU,qBAAmC,GAC5C,OAAO,CAqCT;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,SAAM,GAAG,MAAM,GAAG,IAAI,CAK5F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,SAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB1F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCtF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAexD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAMD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,UAA4B,GAAG,OAAO,CA0BvH;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAY5D"}
@@ -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,QAuK5E"}
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,QA2K5E"}
@@ -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;AAsEjD,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,QAkyDlF"}
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;AAsEjD,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,QAg4DlF"}
package/dist/mcp.js CHANGED
@@ -118,6 +118,10 @@ var MCP_TOOL_GROUPS = {
118
118
  "request_task_review",
119
119
  "reschedule_task",
120
120
  "search_tasks",
121
+ "save_search_view",
122
+ "list_search_views",
123
+ "run_search_view",
124
+ "delete_search_view",
121
125
  "standup",
122
126
  "set_task_contract",
123
127
  "task_context",
package/dist/registry.js CHANGED
@@ -979,6 +979,19 @@ var init_migrations = __esm(() => {
979
979
  );
980
980
  CREATE INDEX IF NOT EXISTS idx_handoff_acks_agent ON handoff_acknowledgements(agent_id, acknowledged_at);
981
981
  INSERT OR IGNORE INTO _migrations (id) VALUES (54);
982
+ `,
983
+ `
984
+ CREATE TABLE IF NOT EXISTS saved_search_views (
985
+ id TEXT PRIMARY KEY,
986
+ name TEXT NOT NULL UNIQUE,
987
+ description TEXT,
988
+ scope TEXT NOT NULL DEFAULT 'tasks' CHECK(scope IN ('all', 'tasks', 'projects', 'plans', 'runs', 'comments')),
989
+ filters TEXT NOT NULL DEFAULT '{}',
990
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
991
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
992
+ );
993
+ CREATE INDEX IF NOT EXISTS idx_saved_search_views_scope ON saved_search_views(scope);
994
+ INSERT OR IGNORE INTO _migrations (id) VALUES (55);
982
995
  `
983
996
  ];
984
997
  });
@@ -1155,6 +1168,17 @@ function ensureSchema(db) {
1155
1168
  PRIMARY KEY (handoff_id, agent_id)
1156
1169
  )`);
1157
1170
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_handoff_acks_agent ON handoff_acknowledgements(agent_id, acknowledged_at)");
1171
+ ensureTable("saved_search_views", `
1172
+ CREATE TABLE saved_search_views (
1173
+ id TEXT PRIMARY KEY,
1174
+ name TEXT NOT NULL UNIQUE,
1175
+ description TEXT,
1176
+ scope TEXT NOT NULL DEFAULT 'tasks' CHECK(scope IN ('all', 'tasks', 'projects', 'plans', 'runs', 'comments')),
1177
+ filters TEXT NOT NULL DEFAULT '{}',
1178
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
1179
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
1180
+ )`);
1181
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_saved_search_views_scope ON saved_search_views(scope)");
1158
1182
  ensureTable("task_relationships", `
1159
1183
  CREATE TABLE task_relationships (
1160
1184
  id TEXT PRIMARY KEY,
@@ -2608,6 +2632,39 @@ var TODOS_JSON_CONTRACTS = [
2608
2632
  created: field("object", "Flags and source types created by this bootstrap run.")
2609
2633
  },
2610
2634
  optional: {}
2635
+ }),
2636
+ contract({
2637
+ id: "saved_search_view",
2638
+ name: "Saved Search View",
2639
+ description: "Local saved search view for repeatable task, project, plan, run, comment, or cross-entity searches.",
2640
+ surfaces: ["cli", "mcp", "sdk"],
2641
+ stability: "stable",
2642
+ required: {
2643
+ id: idField,
2644
+ name: field("string", "Human-readable unique view name."),
2645
+ description: field(["string", "null"], "Optional view description.", true),
2646
+ scope: field("string", "Search scope: all, tasks, projects, plans, runs, or comments."),
2647
+ filters: field("object", "Saved local filter object."),
2648
+ created_at: isoDateField,
2649
+ updated_at: isoDateField
2650
+ },
2651
+ optional: {}
2652
+ }),
2653
+ contract({
2654
+ id: "saved_search_run_result",
2655
+ name: "Saved Search Run Result",
2656
+ description: "Stable JSON envelope returned when running a saved search view or cross-entity search.",
2657
+ surfaces: ["cli", "mcp", "sdk"],
2658
+ stability: "stable",
2659
+ required: {
2660
+ scope: field("string", "Search scope used for the run."),
2661
+ filters: field("object", "Applied local filters."),
2662
+ count: field("integer", "Number of returned result records."),
2663
+ results: field("array", "Result records with entity_type and entity.")
2664
+ },
2665
+ optional: {
2666
+ view: field("object", "Saved view metadata when the run came from a named view.")
2667
+ }
2611
2668
  })
2612
2669
  ];
2613
2670
  function expectedTypes(contract2) {
@@ -6142,7 +6199,8 @@ var dataKeys = [
6142
6199
  "task_files",
6143
6200
  "task_commits",
6144
6201
  "task_git_refs",
6145
- "task_verifications"
6202
+ "task_verifications",
6203
+ "saved_views"
6146
6204
  ];
6147
6205
  var insertColumns = {
6148
6206
  projects: ["id", "name", "path", "description", "task_list_id", "task_prefix", "task_counter", "created_at", "updated_at", "machine_id", "synced_at"],
@@ -6214,7 +6272,8 @@ var insertColumns = {
6214
6272
  task_files: ["id", "task_id", "path", "status", "agent_id", "note", "created_at", "updated_at", "machine_id"],
6215
6273
  task_commits: ["id", "task_id", "sha", "message", "author", "files_changed", "committed_at", "created_at"],
6216
6274
  task_git_refs: ["id", "task_id", "ref_type", "name", "url", "provider", "metadata", "created_at", "updated_at"],
6217
- task_verifications: ["id", "task_id", "command", "status", "output_summary", "artifact_path", "agent_id", "run_at", "created_at"]
6275
+ task_verifications: ["id", "task_id", "command", "status", "output_summary", "artifact_path", "agent_id", "run_at", "created_at"],
6276
+ saved_views: ["id", "name", "description", "scope", "filters", "created_at", "updated_at"]
6218
6277
  };
6219
6278
  var tableByKey = {
6220
6279
  projects: "projects",
@@ -6230,9 +6289,10 @@ var tableByKey = {
6230
6289
  task_files: "task_files",
6231
6290
  task_commits: "task_commits",
6232
6291
  task_git_refs: "task_git_refs",
6233
- task_verifications: "task_verifications"
6292
+ task_verifications: "task_verifications",
6293
+ saved_views: "saved_search_views"
6234
6294
  };
6235
- var jsonColumns = new Set(["metadata", "tags", "data", "files_changed"]);
6295
+ var jsonColumns = new Set(["metadata", "tags", "data", "files_changed", "filters"]);
6236
6296
  function packageSource(version) {
6237
6297
  return {
6238
6298
  packageName: "@hasna/todos",
@@ -6305,6 +6365,9 @@ function rowToRunEvent(row) {
6305
6365
  function rowToCommit(row) {
6306
6366
  return { ...row, files_changed: row.files_changed ? parseJsonArray(row.files_changed) : null };
6307
6367
  }
6368
+ function rowToSavedView(row) {
6369
+ return { ...row, filters: parseJsonObject(row.filters) };
6370
+ }
6308
6371
  function bridgeStats(data) {
6309
6372
  return Object.fromEntries(dataKeys.map((key) => [key, data[key].length]));
6310
6373
  }
@@ -6328,7 +6391,8 @@ function createLocalBridgeBundle(options = {}, db) {
6328
6391
  task_files: queryByTaskIds(d, "SELECT * FROM task_files WHERE task_id IN (__TASK_IDS__) ORDER BY path, id", taskIds),
6329
6392
  task_commits: queryByTaskIds(d, "SELECT * FROM task_commits WHERE task_id IN (__TASK_IDS__) ORDER BY created_at, id", taskIds).map(rowToCommit),
6330
6393
  task_git_refs: queryByTaskIds(d, "SELECT * FROM task_git_refs WHERE task_id IN (__TASK_IDS__) ORDER BY created_at, id", taskIds).map(rowWithMetadata),
6331
- task_verifications: queryByTaskIds(d, "SELECT * FROM task_verifications WHERE task_id IN (__TASK_IDS__) ORDER BY run_at, id", taskIds)
6394
+ task_verifications: queryByTaskIds(d, "SELECT * FROM task_verifications WHERE task_id IN (__TASK_IDS__) ORDER BY run_at, id", taskIds),
6395
+ saved_views: (options.project_id ? d.query("SELECT * FROM saved_search_views WHERE json_extract(filters, '$.project_id') = ? ORDER BY name").all(options.project_id) : d.query("SELECT * FROM saved_search_views ORDER BY name").all()).map(rowToSavedView)
6332
6396
  };
6333
6397
  const artifactContents = data.run_artifacts.map((artifact) => exportStoredArtifactContent({
6334
6398
  id: artifact.id,
@@ -6367,6 +6431,8 @@ function validateLocalBridgeBundle(value) {
6367
6431
  issues.push("data must be an object");
6368
6432
  } else {
6369
6433
  for (const key of dataKeys) {
6434
+ if (key === "saved_views" && data[key] === undefined)
6435
+ continue;
6370
6436
  if (!Array.isArray(data[key]))
6371
6437
  issues.push(`data.${key} must be an array`);
6372
6438
  }
@@ -6539,7 +6605,8 @@ function importLocalBridgeBundle(bundle, options = {}, db) {
6539
6605
  const conflictStrategy = options.conflictStrategy ?? "skip";
6540
6606
  const data = {
6541
6607
  ...bundle.data,
6542
- tasks: sortedTasks(bundle.data.tasks)
6608
+ tasks: sortedTasks(bundle.data.tasks),
6609
+ saved_views: bundle.data.saved_views ?? []
6543
6610
  };
6544
6611
  for (const key of dataKeys) {
6545
6612
  for (const row of data[key]) {
@@ -7150,6 +7217,10 @@ var MCP_TOOL_GROUPS = {
7150
7217
  "request_task_review",
7151
7218
  "reschedule_task",
7152
7219
  "search_tasks",
7220
+ "save_search_view",
7221
+ "list_search_views",
7222
+ "run_search_view",
7223
+ "delete_search_view",
7153
7224
  "standup",
7154
7225
  "set_task_contract",
7155
7226
  "task_context",
@@ -8109,6 +8180,10 @@ var TODOS_CLI_MCP_PARITY = [
8109
8180
  domain: "search",
8110
8181
  cliCommands: [
8111
8182
  "todos search",
8183
+ "todos views save",
8184
+ "todos views list",
8185
+ "todos views run",
8186
+ "todos views delete",
8112
8187
  "todos status",
8113
8188
  "todos recap",
8114
8189
  "todos standup",
@@ -8120,6 +8195,10 @@ var TODOS_CLI_MCP_PARITY = [
8120
8195
  ],
8121
8196
  mcpTools: [
8122
8197
  "search_tasks",
8198
+ "save_search_view",
8199
+ "list_search_views",
8200
+ "run_search_view",
8201
+ "delete_search_view",
8123
8202
  "get_status",
8124
8203
  "standup",
8125
8204
  "get_task_stats",
@@ -8128,7 +8207,7 @@ var TODOS_CLI_MCP_PARITY = [
8128
8207
  "get_task_graph",
8129
8208
  "get_recent_activity"
8130
8209
  ],
8131
- jsonContracts: ["task", "status_summary", "audit_history", "structured_error", "api_error"],
8210
+ jsonContracts: ["task", "saved_search_view", "saved_search_run_result", "status_summary", "audit_history", "structured_error", "api_error"],
8132
8211
  errorContracts: ["structured_error", "api_error"],
8133
8212
  status: "matched",
8134
8213
  example: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.11.41",
3
+ "packageVersion": "0.11.42",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "fa44a9b7ebd4433c7339db812167d92ea4454950",
6
- "generatedAt": "2026-05-21T14:23:39.688Z"
5
+ "gitCommit": "80151f0cff758e8a3e1e8587a2702576823fe3e7",
6
+ "generatedAt": "2026-05-21T14:47:00.129Z"
7
7
  }
@@ -981,6 +981,19 @@ var init_migrations = __esm(() => {
981
981
  );
982
982
  CREATE INDEX IF NOT EXISTS idx_handoff_acks_agent ON handoff_acknowledgements(agent_id, acknowledged_at);
983
983
  INSERT OR IGNORE INTO _migrations (id) VALUES (54);
984
+ `,
985
+ `
986
+ CREATE TABLE IF NOT EXISTS saved_search_views (
987
+ id TEXT PRIMARY KEY,
988
+ name TEXT NOT NULL UNIQUE,
989
+ description TEXT,
990
+ scope TEXT NOT NULL DEFAULT 'tasks' CHECK(scope IN ('all', 'tasks', 'projects', 'plans', 'runs', 'comments')),
991
+ filters TEXT NOT NULL DEFAULT '{}',
992
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
993
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
994
+ );
995
+ CREATE INDEX IF NOT EXISTS idx_saved_search_views_scope ON saved_search_views(scope);
996
+ INSERT OR IGNORE INTO _migrations (id) VALUES (55);
984
997
  `
985
998
  ];
986
999
  });
@@ -1157,6 +1170,17 @@ function ensureSchema(db) {
1157
1170
  PRIMARY KEY (handoff_id, agent_id)
1158
1171
  )`);
1159
1172
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_handoff_acks_agent ON handoff_acknowledgements(agent_id, acknowledged_at)");
1173
+ ensureTable("saved_search_views", `
1174
+ CREATE TABLE saved_search_views (
1175
+ id TEXT PRIMARY KEY,
1176
+ name TEXT NOT NULL UNIQUE,
1177
+ description TEXT,
1178
+ scope TEXT NOT NULL DEFAULT 'tasks' CHECK(scope IN ('all', 'tasks', 'projects', 'plans', 'runs', 'comments')),
1179
+ filters TEXT NOT NULL DEFAULT '{}',
1180
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
1181
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
1182
+ )`);
1183
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_saved_search_views_scope ON saved_search_views(scope)");
1160
1184
  ensureTable("task_relationships", `
1161
1185
  CREATE TABLE task_relationships (
1162
1186
  id TEXT PRIMARY KEY,
package/dist/storage.js CHANGED
@@ -1109,6 +1109,19 @@ var init_migrations = __esm(() => {
1109
1109
  );
1110
1110
  CREATE INDEX IF NOT EXISTS idx_handoff_acks_agent ON handoff_acknowledgements(agent_id, acknowledged_at);
1111
1111
  INSERT OR IGNORE INTO _migrations (id) VALUES (54);
1112
+ `,
1113
+ `
1114
+ CREATE TABLE IF NOT EXISTS saved_search_views (
1115
+ id TEXT PRIMARY KEY,
1116
+ name TEXT NOT NULL UNIQUE,
1117
+ description TEXT,
1118
+ scope TEXT NOT NULL DEFAULT 'tasks' CHECK(scope IN ('all', 'tasks', 'projects', 'plans', 'runs', 'comments')),
1119
+ filters TEXT NOT NULL DEFAULT '{}',
1120
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
1121
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
1122
+ );
1123
+ CREATE INDEX IF NOT EXISTS idx_saved_search_views_scope ON saved_search_views(scope);
1124
+ INSERT OR IGNORE INTO _migrations (id) VALUES (55);
1112
1125
  `
1113
1126
  ];
1114
1127
  });
@@ -1285,6 +1298,17 @@ function ensureSchema(db) {
1285
1298
  PRIMARY KEY (handoff_id, agent_id)
1286
1299
  )`);
1287
1300
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_handoff_acks_agent ON handoff_acknowledgements(agent_id, acknowledged_at)");
1301
+ ensureTable("saved_search_views", `
1302
+ CREATE TABLE saved_search_views (
1303
+ id TEXT PRIMARY KEY,
1304
+ name TEXT NOT NULL UNIQUE,
1305
+ description TEXT,
1306
+ scope TEXT NOT NULL DEFAULT 'tasks' CHECK(scope IN ('all', 'tasks', 'projects', 'plans', 'runs', 'comments')),
1307
+ filters TEXT NOT NULL DEFAULT '{}',
1308
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
1309
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
1310
+ )`);
1311
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_saved_search_views_scope ON saved_search_views(scope)");
1288
1312
  ensureTable("task_relationships", `
1289
1313
  CREATE TABLE task_relationships (
1290
1314
  id TEXT PRIMARY KEY,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.11.41",
3
+ "version": "0.11.42",
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",