@hasna/todos 0.11.93 → 0.11.95

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.
Files changed (37) hide show
  1. package/dist/cli/cloud-router.d.ts +12 -1
  2. package/dist/cli/cloud-router.d.ts.map +1 -1
  3. package/dist/cli/commands/plan-template-commands.d.ts.map +1 -1
  4. package/dist/cli/commands/task-commands.d.ts.map +1 -1
  5. package/dist/cli/index.js +885 -76
  6. package/dist/contracts.js +56 -50
  7. package/dist/db/storage-tombstones.d.ts +1 -1
  8. package/dist/db/storage-tombstones.d.ts.map +1 -1
  9. package/dist/db/templates.d.ts.map +1 -1
  10. package/dist/index.js +170 -56
  11. package/dist/lib/template-semantics.d.ts +8 -0
  12. package/dist/lib/template-semantics.d.ts.map +1 -0
  13. package/dist/mcp/index.js +605 -61
  14. package/dist/mcp/tools/task-crud.d.ts.map +1 -1
  15. package/dist/mcp/tools/task-meta-tools.d.ts.map +1 -1
  16. package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
  17. package/dist/mcp.js +1 -1
  18. package/dist/registry.js +56 -50
  19. package/dist/release-provenance.json +5 -5
  20. package/dist/sdk/index.js +35 -0
  21. package/dist/sdk/v1.generated.d.ts +105 -1
  22. package/dist/sdk/v1.generated.d.ts.map +1 -1
  23. package/dist/server/index.js +611 -67
  24. package/dist/server/openapi.d.ts +496 -0
  25. package/dist/server/openapi.d.ts.map +1 -1
  26. package/dist/server/v1.d.ts.map +1 -1
  27. package/dist/storage/interfaces.d.ts +3 -2
  28. package/dist/storage/interfaces.d.ts.map +1 -1
  29. package/dist/storage/postgres-adapter.d.ts.map +1 -1
  30. package/dist/storage/postgres-sync.d.ts +1 -1
  31. package/dist/storage/postgres-sync.d.ts.map +1 -1
  32. package/dist/storage/shadow-outbox.d.ts.map +1 -1
  33. package/dist/storage/shadow.d.ts +1 -1
  34. package/dist/storage/shadow.d.ts.map +1 -1
  35. package/dist/storage/sqlite-snapshot.d.ts.map +1 -1
  36. package/dist/storage.js +169 -55
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-sync.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres-sync.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-sync.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-outbox.d.ts","sourceRoot":"","sources":["../../src/storage/shadow-outbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shadow-outbox.d.ts","sourceRoot":"","sources":["../../src/storage/shadow-outbox.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ import type { TodosStorageAdapter, TodosStorageContext } from "./interfaces.js";
8
8
  * shadow phase (documented gap; validated data is tasks/projects/plans/agents/
9
9
  * task-lists/templates and audit history).
10
10
  */
11
- type ShadowSnapshotKey = "tasks" | "projects" | "plans" | "agents" | "taskLists" | "templates" | "auditHistory";
11
+ type ShadowSnapshotKey = "tasks" | "projects" | "plans" | "agents" | "taskLists" | "templates" | "templateTasks" | "auditHistory";
12
12
  export interface TodosShadowMirrorMetrics {
13
13
  enabled: true;
14
14
  /** Ops accepted into the mirror queue (one per successful local write). */
@@ -1 +1 @@
1
- {"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../src/storage/shadow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../src/storage/shadow.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-snapshot.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAgB7D,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,iBAAiB,CAAC;AAuDzB,wBAAgB,gCAAgC,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,oBAAoB,CAepF;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,oBAAoB,EAC9B,EAAE,CAAC,EAAE,QAAQ,GACZ,wBAAwB,CAwE1B"}
1
+ {"version":3,"file":"sqlite-snapshot.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAgB7D,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,iBAAiB,CAAC;AA4DzB,wBAAgB,gCAAgC,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,oBAAoB,CAgBpF;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,oBAAoB,EAC9B,EAAE,CAAC,EAAE,QAAQ,GACZ,wBAAwB,CAyE1B"}
package/dist/storage.js CHANGED
@@ -6483,6 +6483,50 @@ var init_recurrence = __esm(() => {
6483
6483
  };
6484
6484
  });
6485
6485
 
6486
+ // src/lib/template-semantics.ts
6487
+ function resolveTemplateVariables(templateVars, provided) {
6488
+ const merged = { ...provided };
6489
+ for (const variable of templateVars) {
6490
+ if (merged[variable.name] === undefined && variable.default !== undefined) {
6491
+ merged[variable.name] = variable.default;
6492
+ }
6493
+ }
6494
+ const missing = templateVars.filter((variable) => variable.required && merged[variable.name] === undefined).map((variable) => variable.name);
6495
+ if (missing.length > 0) {
6496
+ throw new Error(`Missing required template variable(s): ${missing.join(", ")}`);
6497
+ }
6498
+ return merged;
6499
+ }
6500
+ function substituteTemplateVariables(text, variables) {
6501
+ let result = text;
6502
+ for (const [key, value] of Object.entries(variables)) {
6503
+ result = result.replace(new RegExp(`\\{${key}\\}`, "g"), value);
6504
+ }
6505
+ return result;
6506
+ }
6507
+ function evaluateTemplateCondition(condition, variables) {
6508
+ if (!condition || condition.trim() === "")
6509
+ return true;
6510
+ const trimmed = condition.trim();
6511
+ const equal = trimmed.match(/^\{([^}]+)\}\s*==\s*(.+)$/);
6512
+ if (equal)
6513
+ return (variables[equal[1]] ?? "") === equal[2].trim();
6514
+ const unequal = trimmed.match(/^\{([^}]+)\}\s*!=\s*(.+)$/);
6515
+ if (unequal)
6516
+ return (variables[unequal[1]] ?? "") !== unequal[2].trim();
6517
+ const falsy = trimmed.match(/^!\{([^}]+)\}$/);
6518
+ if (falsy) {
6519
+ const value = variables[falsy[1]];
6520
+ return !value || value === "" || value === "false";
6521
+ }
6522
+ const truthy = trimmed.match(/^\{([^}]+)\}$/);
6523
+ if (truthy) {
6524
+ const value = variables[truthy[1]];
6525
+ return !!value && value !== "" && value !== "false";
6526
+ }
6527
+ return true;
6528
+ }
6529
+
6486
6530
  // src/db/templates.ts
6487
6531
  function rowToTemplate(row) {
6488
6532
  return {
@@ -6558,6 +6602,14 @@ function deleteTemplate(id, db) {
6558
6602
  payload: template,
6559
6603
  version: template.version
6560
6604
  }, d);
6605
+ for (const task of getTemplateTasks(resolved, d)) {
6606
+ recordStorageTombstone({
6607
+ object_type: "template_tasks",
6608
+ object_id: task.id,
6609
+ payload: task,
6610
+ version: 1
6611
+ }, d);
6612
+ }
6561
6613
  return d.run("DELETE FROM task_templates WHERE id = ?", [resolved]).changes > 0;
6562
6614
  }
6563
6615
  function updateTemplate(id, updates, db) {
@@ -6689,34 +6741,7 @@ function getTemplateTasks(templateId, db) {
6689
6741
  return rows.map(rowToTemplateTask);
6690
6742
  }
6691
6743
  function evaluateCondition(condition, variables) {
6692
- if (!condition || condition.trim() === "")
6693
- return true;
6694
- const trimmed = condition.trim();
6695
- const eqMatch = trimmed.match(/^\{([^}]+)\}\s*==\s*(.+)$/);
6696
- if (eqMatch) {
6697
- const varName = eqMatch[1];
6698
- const expected = eqMatch[2].trim();
6699
- return (variables[varName] ?? "") === expected;
6700
- }
6701
- const neqMatch = trimmed.match(/^\{([^}]+)\}\s*!=\s*(.+)$/);
6702
- if (neqMatch) {
6703
- const varName = neqMatch[1];
6704
- const expected = neqMatch[2].trim();
6705
- return (variables[varName] ?? "") !== expected;
6706
- }
6707
- const falsyMatch = trimmed.match(/^!\{([^}]+)\}$/);
6708
- if (falsyMatch) {
6709
- const varName = falsyMatch[1];
6710
- const val = variables[varName];
6711
- return !val || val === "" || val === "false";
6712
- }
6713
- const truthyMatch = trimmed.match(/^\{([^}]+)\}$/);
6714
- if (truthyMatch) {
6715
- const varName = truthyMatch[1];
6716
- const val = variables[varName];
6717
- return !!val && val !== "" && val !== "false";
6718
- }
6719
- return true;
6744
+ return evaluateTemplateCondition(condition, variables);
6720
6745
  }
6721
6746
  function exportTemplate(id, db) {
6722
6747
  const d = db || getDatabase();
@@ -6789,29 +6814,10 @@ function listTemplateVersions(id, db) {
6789
6814
  return d.query("SELECT * FROM template_versions WHERE template_id = ? ORDER BY version DESC").all(resolved);
6790
6815
  }
6791
6816
  function resolveVariables(templateVars, provided) {
6792
- const merged = { ...provided };
6793
- for (const v of templateVars) {
6794
- if (merged[v.name] === undefined && v.default !== undefined) {
6795
- merged[v.name] = v.default;
6796
- }
6797
- }
6798
- const missing = [];
6799
- for (const v of templateVars) {
6800
- if (v.required && merged[v.name] === undefined) {
6801
- missing.push(v.name);
6802
- }
6803
- }
6804
- if (missing.length > 0) {
6805
- throw new Error(`Missing required template variable(s): ${missing.join(", ")}`);
6806
- }
6807
- return merged;
6817
+ return resolveTemplateVariables(templateVars, provided);
6808
6818
  }
6809
6819
  function substituteVars(text, variables) {
6810
- let result = text;
6811
- for (const [key, val] of Object.entries(variables)) {
6812
- result = result.replace(new RegExp(`\\{${key}\\}`, "g"), val);
6813
- }
6814
- return result;
6820
+ return substituteTemplateVariables(text, variables);
6815
6821
  }
6816
6822
  function tasksFromTemplate(templateId, projectId, variables, taskListId, db, _visitedTemplateIds) {
6817
6823
  const d = db || getDatabase();
@@ -11499,6 +11505,21 @@ var TEMPLATE_COLUMNS = [
11499
11505
  "machine_id",
11500
11506
  "synced_at"
11501
11507
  ];
11508
+ var TEMPLATE_TASK_COLUMNS = [
11509
+ "id",
11510
+ "template_id",
11511
+ "position",
11512
+ "title_pattern",
11513
+ "description",
11514
+ "priority",
11515
+ "tags",
11516
+ "task_type",
11517
+ "condition",
11518
+ "include_template_id",
11519
+ "depends_on_positions",
11520
+ "metadata",
11521
+ "created_at"
11522
+ ];
11502
11523
  var TASK_COLUMNS = [
11503
11524
  "id",
11504
11525
  "short_id",
@@ -11567,7 +11588,7 @@ var AUDIT_COLUMNS = [
11567
11588
  "created_at",
11568
11589
  "machine_id"
11569
11590
  ];
11570
- var JSON_COLUMNS = new Set(["tags", "metadata", "permissions", "capabilities", "variables"]);
11591
+ var JSON_COLUMNS = new Set(["tags", "metadata", "permissions", "capabilities", "variables", "depends_on_positions"]);
11571
11592
  var BOOLEAN_COLUMNS = new Set(["requires_approval"]);
11572
11593
  function exportSqliteTodosStorageSnapshot(db) {
11573
11594
  const d = db ?? getDatabase();
@@ -11581,6 +11602,7 @@ function exportSqliteTodosStorageSnapshot(db) {
11581
11602
  agents: listAgents({ include_archived: true }, d),
11582
11603
  taskLists: listTaskLists(undefined, d),
11583
11604
  templates: listTemplates(d),
11605
+ templateTasks: listTemplates(d).flatMap((template) => getTemplateTasks(template.id, d)),
11584
11606
  auditHistory: getRecentActivity(Number.MAX_SAFE_INTEGER, d),
11585
11607
  tombstones: listStorageTombstones(d)
11586
11608
  };
@@ -11630,6 +11652,7 @@ function importSqliteTodosStorageSnapshot(snapshot, db) {
11630
11652
  applyRows("task_lists", "task_lists", TASK_LIST_COLUMNS, snapshot.taskLists, "updated_at");
11631
11653
  applyRows("plans", "plans", PLAN_COLUMNS, snapshot.plans, "updated_at");
11632
11654
  applyRows("templates", "task_templates", TEMPLATE_COLUMNS, snapshot.templates);
11655
+ applyRows("template_tasks", "template_tasks", TEMPLATE_TASK_COLUMNS, snapshot.templateTasks ?? []);
11633
11656
  applyRows("tasks", "tasks", TASK_COLUMNS, sortedTasks(snapshot.tasks), "updated_at", (row, changed) => {
11634
11657
  if (changed && Array.isArray(row["tags"]) && typeof row["id"] === "string") {
11635
11658
  replaceTaskTags(row["id"], row["tags"].filter((tag) => typeof tag === "string"), d);
@@ -11734,6 +11757,8 @@ function tableForTombstone(objectType) {
11734
11757
  return "task_lists";
11735
11758
  if (objectType === "templates")
11736
11759
  return "task_templates";
11760
+ if (objectType === "template_tasks")
11761
+ return "template_tasks";
11737
11762
  return "task_history";
11738
11763
  }
11739
11764
  function listRows(db, table, columns) {
@@ -12152,6 +12177,7 @@ function snapshotEntries(snapshot) {
12152
12177
  ...snapshot.agents.map((payload) => entry("agents", payload, snapshot.exportedAt)),
12153
12178
  ...snapshot.taskLists.map((payload) => entry("task_lists", payload, snapshot.exportedAt)),
12154
12179
  ...snapshot.templates.map((payload) => entry("templates", payload, snapshot.exportedAt)),
12180
+ ...(snapshot.templateTasks ?? []).map((payload) => entry("template_tasks", payload, snapshot.exportedAt)),
12155
12181
  ...snapshot.auditHistory.map((payload) => entry("audit_history", payload, snapshot.exportedAt)),
12156
12182
  ...(snapshot.tombstones ?? []).map((tombstone) => ({
12157
12183
  type: tombstone.object_type,
@@ -12203,6 +12229,7 @@ function rowsToSnapshot(rows) {
12203
12229
  agents: [],
12204
12230
  taskLists: [],
12205
12231
  templates: [],
12232
+ templateTasks: [],
12206
12233
  auditHistory: [],
12207
12234
  tombstones: []
12208
12235
  };
@@ -12237,6 +12264,8 @@ function rowsToSnapshot(rows) {
12237
12264
  snapshot.taskLists.push(payload);
12238
12265
  else if (row.object_type === "templates")
12239
12266
  snapshot.templates.push(payload);
12267
+ else if (row.object_type === "template_tasks")
12268
+ snapshot.templateTasks.push(payload);
12240
12269
  else if (row.object_type === "audit_history")
12241
12270
  snapshot.auditHistory.push(payload);
12242
12271
  }
@@ -12399,10 +12428,13 @@ function createPostgresTodosStorageAdapter(options) {
12399
12428
  get: (id) => store.get("templates", id),
12400
12429
  list: async () => (await store.list("templates")).sort((a, b) => a.name.localeCompare(b.name)),
12401
12430
  update: (id, input) => updateTemplate2(id, input, store),
12402
- delete: (id, context) => store.delete("templates", id, context),
12431
+ delete: (id, context) => deleteTemplate2(id, store, context),
12403
12432
  getWithTasks: async (id) => {
12404
12433
  const template = await store.get("templates", id);
12405
- return template ? { ...template, tasks: [] } : null;
12434
+ if (!template)
12435
+ return null;
12436
+ const tasks = (await store.list("template_tasks")).filter((task) => task.template_id === id).sort((left, right) => left.position - right.position || left.id.localeCompare(right.id));
12437
+ return { ...template, tasks };
12406
12438
  }
12407
12439
  },
12408
12440
  audit: {
@@ -12690,6 +12722,57 @@ class PostgresJsonRecordStore {
12690
12722
  }
12691
12723
  return value;
12692
12724
  }
12725
+ async createTemplateWithTasks(template, tasks, context = {}) {
12726
+ await this.ensureSchema();
12727
+ const records = [
12728
+ { object_type: "templates", object_id: template.id, payload: template, updated_at: template.created_at, version: template.version },
12729
+ ...tasks.map((task) => ({ object_type: "template_tasks", object_id: task.id, payload: task, updated_at: task.created_at, version: 1 }))
12730
+ ];
12731
+ const result = await this.options.client.query(`/* todos:create-template-with-tasks-atomic */ WITH input AS (
12732
+ SELECT value->>'object_type' AS object_type,
12733
+ value->>'object_id' AS object_id,
12734
+ value->'payload' AS payload,
12735
+ value->>'updated_at' AS updated_at,
12736
+ COALESCE((value->>'version')::integer, 1) AS version
12737
+ FROM jsonb_array_elements($2::jsonb) AS value
12738
+ ) INSERT INTO ${this.tableName} (
12739
+ service, object_type, object_id, payload, updated_at,
12740
+ deleted_at, source_machine_id, version
12741
+ ) SELECT $1, object_type, object_id, payload, updated_at::timestamptz,
12742
+ NULL, $3, version
12743
+ FROM input
12744
+ ON CONFLICT (service, object_type, object_id) DO UPDATE SET
12745
+ payload = EXCLUDED.payload,
12746
+ updated_at = EXCLUDED.updated_at,
12747
+ deleted_at = NULL,
12748
+ source_machine_id = EXCLUDED.source_machine_id,
12749
+ version = EXCLUDED.version
12750
+ WHERE ${this.tableName}.updated_at IS NULL
12751
+ OR ${this.tableName}.updated_at < EXCLUDED.updated_at
12752
+ OR (${this.tableName}.updated_at = EXCLUDED.updated_at
12753
+ AND COALESCE(${this.tableName}.version, 0) <= COALESCE(EXCLUDED.version, 0))
12754
+ RETURNING object_type, object_id`, [this.service, jsonbParam(records), this.machineId(context)]);
12755
+ if (result.rows.length !== records.length) {
12756
+ throw new Error("Template checklist write was rejected before completion; no partial template was committed");
12757
+ }
12758
+ }
12759
+ async deleteTemplateWithTasks(id, context = {}) {
12760
+ await this.ensureSchema();
12761
+ const timestamp = new Date().toISOString();
12762
+ const result = await this.options.client.query(`/* todos:delete-template-with-tasks-atomic */ WITH target AS (
12763
+ SELECT 1 FROM ${this.tableName}
12764
+ WHERE service = $1 AND object_type = 'templates' AND object_id = $2 AND deleted_at IS NULL
12765
+ ) UPDATE ${this.tableName} AS record SET
12766
+ deleted_at = $3::timestamptz,
12767
+ updated_at = $3::timestamptz,
12768
+ source_machine_id = COALESCE($4, record.source_machine_id),
12769
+ version = COALESCE(record.version, 0) + 1
12770
+ WHERE record.service = $1 AND record.deleted_at IS NULL AND EXISTS (SELECT 1 FROM target)
12771
+ AND (record.object_type = 'templates' AND record.object_id = $2
12772
+ OR record.object_type = 'template_tasks' AND record.payload->>'template_id' = $2)
12773
+ RETURNING record.object_type`, [this.service, id, timestamp, this.machineId(context)]);
12774
+ return result.rows.some((row) => row.object_type === "templates");
12775
+ }
12693
12776
  async completeTask(id, agentId, options) {
12694
12777
  await this.ensureSchema();
12695
12778
  const operationTimestamp = new Date().toISOString();
@@ -13030,7 +13113,7 @@ async function updateTask2(id, input, store) {
13030
13113
  tags: input.tags ?? existing.tags,
13031
13114
  metadata: input.metadata ?? existing.metadata,
13032
13115
  requires_approval: input.requires_approval ?? existing.requires_approval,
13033
- task_list_id: input.task_list_id ?? existing.task_list_id
13116
+ task_list_id: input.task_list_id !== undefined ? input.task_list_id : existing.task_list_id
13034
13117
  };
13035
13118
  await store.upsert("tasks", task);
13036
13119
  return task;
@@ -13454,7 +13537,7 @@ async function updateTaskList2(id, input, store) {
13454
13537
  }
13455
13538
  async function createTemplate2(input, store, context) {
13456
13539
  const timestamp = new Date().toISOString();
13457
- return store.upsert("templates", {
13540
+ const template = {
13458
13541
  id: randomUUID3(),
13459
13542
  name: input.name,
13460
13543
  title_pattern: input.title_pattern,
@@ -13469,7 +13552,30 @@ async function createTemplate2(input, store, context) {
13469
13552
  created_at: timestamp,
13470
13553
  machine_id: store.machineId(context),
13471
13554
  synced_at: null
13472
- }, context);
13555
+ };
13556
+ const tasks = buildTemplateTasks(template.id, input.tasks ?? [], timestamp);
13557
+ await store.createTemplateWithTasks(template, tasks, context);
13558
+ return template;
13559
+ }
13560
+ function buildTemplateTasks(templateId, inputs, timestamp) {
13561
+ return inputs.map((input, position) => ({
13562
+ id: randomUUID3(),
13563
+ template_id: templateId,
13564
+ position,
13565
+ title_pattern: input.title_pattern,
13566
+ description: input.description ?? null,
13567
+ priority: input.priority ?? "medium",
13568
+ tags: input.tags ?? [],
13569
+ task_type: input.task_type ?? null,
13570
+ condition: input.condition ?? null,
13571
+ include_template_id: input.include_template_id ?? null,
13572
+ depends_on_positions: input.depends_on ?? [],
13573
+ metadata: input.metadata ?? {},
13574
+ created_at: timestamp
13575
+ }));
13576
+ }
13577
+ async function deleteTemplate2(id, store, context) {
13578
+ return store.deleteTemplateWithTasks(id, context);
13473
13579
  }
13474
13580
  async function updateTemplate2(id, input, store) {
13475
13581
  const template = await store.get("templates", id);
@@ -13525,6 +13631,7 @@ async function exportSnapshot(store) {
13525
13631
  agents: await store.list("agents"),
13526
13632
  taskLists: await store.list("task_lists"),
13527
13633
  templates: await store.list("templates"),
13634
+ templateTasks: await store.list("template_tasks"),
13528
13635
  auditHistory: await store.list("audit_history"),
13529
13636
  tombstones: await store.listTombstones()
13530
13637
  };
@@ -13549,6 +13656,7 @@ async function importSnapshot(snapshot, store, context) {
13549
13656
  ...snapshot.agents.map((row) => ["agents", row]),
13550
13657
  ...snapshot.taskLists.map((row) => ["task_lists", row]),
13551
13658
  ...snapshot.templates.map((row) => ["templates", row]),
13659
+ ...(snapshot.templateTasks ?? []).map((row) => ["template_tasks", row]),
13552
13660
  ...snapshot.auditHistory.map((row) => ["audit_history", row])
13553
13661
  ];
13554
13662
  for (const [type, row] of entries) {
@@ -13694,6 +13802,7 @@ var SNAPSHOT_TO_OBJECT_TYPE = {
13694
13802
  agents: "agents",
13695
13803
  taskLists: "task_lists",
13696
13804
  templates: "templates",
13805
+ templateTasks: "template_tasks",
13697
13806
  auditHistory: "audit_history"
13698
13807
  };
13699
13808
 
@@ -13885,6 +13994,7 @@ function emptySnapshot() {
13885
13994
  agents: [],
13886
13995
  taskLists: [],
13887
13996
  templates: [],
13997
+ templateTasks: [],
13888
13998
  auditHistory: [],
13889
13999
  tombstones: []
13890
14000
  };
@@ -14341,6 +14451,9 @@ class TodosShadowOutbox {
14341
14451
  case "templates":
14342
14452
  snapshot.templates.push(record);
14343
14453
  break;
14454
+ case "template_tasks":
14455
+ snapshot.templateTasks.push(record);
14456
+ break;
14344
14457
  case "audit_history":
14345
14458
  snapshot.auditHistory.push(record);
14346
14459
  break;
@@ -14407,6 +14520,7 @@ function emptySnapshot2() {
14407
14520
  agents: [],
14408
14521
  taskLists: [],
14409
14522
  templates: [],
14523
+ templateTasks: [],
14410
14524
  auditHistory: [],
14411
14525
  tombstones: []
14412
14526
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.11.93",
3
+ "version": "0.11.95",
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",