@hasna/todos 0.13.1 → 0.13.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.
Files changed (76) hide show
  1. package/README.md +80 -15
  2. package/dist/cli/cloud-router.d.ts +78 -12
  3. package/dist/cli/cloud-router.d.ts.map +1 -1
  4. package/dist/cli/commands/config-serve-commands.d.ts.map +1 -1
  5. package/dist/cli/commands/query-commands.d.ts.map +1 -1
  6. package/dist/cli/commands/task-commands.d.ts.map +1 -1
  7. package/dist/cli/doctor-integrity.d.ts +106 -0
  8. package/dist/cli/doctor-integrity.d.ts.map +1 -0
  9. package/dist/cli/helpers.d.ts +2 -2
  10. package/dist/cli/index.js +1748 -1012
  11. package/dist/cli/stage-a.d.ts.map +1 -1
  12. package/dist/contracts.js +137 -39
  13. package/dist/db/database.d.ts.map +1 -1
  14. package/dist/db/findings.d.ts +1 -0
  15. package/dist/db/findings.d.ts.map +1 -1
  16. package/dist/db/integrity.d.ts +20 -0
  17. package/dist/db/integrity.d.ts.map +1 -0
  18. package/dist/db/task-crud.d.ts.map +1 -1
  19. package/dist/index.d.ts +5 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +592 -147
  22. package/dist/lib/context-packs.d.ts +1 -0
  23. package/dist/lib/context-packs.d.ts.map +1 -1
  24. package/dist/lib/dependency-graph.d.ts +19 -11
  25. package/dist/lib/dependency-graph.d.ts.map +1 -1
  26. package/dist/lib/doctor.d.ts +20 -0
  27. package/dist/lib/doctor.d.ts.map +1 -1
  28. package/dist/lib/integrity.d.ts +215 -0
  29. package/dist/lib/integrity.d.ts.map +1 -0
  30. package/dist/lib/native-storage-status.d.ts +2 -2
  31. package/dist/lib/native-storage-status.d.ts.map +1 -1
  32. package/dist/lib/redaction.d.ts.map +1 -1
  33. package/dist/lib/release-compatibility.d.ts.map +1 -1
  34. package/dist/lib/task-dedupe.d.ts +15 -0
  35. package/dist/lib/task-dedupe.d.ts.map +1 -1
  36. package/dist/mcp/index.d.ts.map +1 -1
  37. package/dist/mcp/index.js +544 -97
  38. package/dist/mcp.js +8 -4
  39. package/dist/registry.d.ts +1 -1
  40. package/dist/registry.d.ts.map +1 -1
  41. package/dist/registry.js +144 -39
  42. package/dist/release-provenance.json +5 -5
  43. package/dist/sdk/types.d.ts +42 -0
  44. package/dist/sdk/types.d.ts.map +1 -1
  45. package/dist/sdk/v1.generated.d.ts +1 -0
  46. package/dist/sdk/v1.generated.d.ts.map +1 -1
  47. package/dist/server/cloud.d.ts +8 -1
  48. package/dist/server/cloud.d.ts.map +1 -1
  49. package/dist/server/index.js +585 -118
  50. package/dist/server/openapi.d.ts +12 -0
  51. package/dist/server/openapi.d.ts.map +1 -1
  52. package/dist/server/port.d.ts +52 -0
  53. package/dist/server/port.d.ts.map +1 -0
  54. package/dist/server/serve.d.ts.map +1 -1
  55. package/dist/server/v1.d.ts.map +1 -1
  56. package/dist/storage/config.d.ts +23 -5
  57. package/dist/storage/config.d.ts.map +1 -1
  58. package/dist/storage/factory.d.ts +9 -3
  59. package/dist/storage/factory.d.ts.map +1 -1
  60. package/dist/storage/hybrid.d.ts +7 -0
  61. package/dist/storage/hybrid.d.ts.map +1 -1
  62. package/dist/storage/index.d.ts +3 -3
  63. package/dist/storage/index.d.ts.map +1 -1
  64. package/dist/storage/interfaces.d.ts +43 -8
  65. package/dist/storage/interfaces.d.ts.map +1 -1
  66. package/dist/storage/local-sqlite.d.ts.map +1 -1
  67. package/dist/storage/postgres-adapter.d.ts.map +1 -1
  68. package/dist/storage.d.ts +3 -3
  69. package/dist/storage.d.ts.map +1 -1
  70. package/dist/storage.js +619 -256
  71. package/dist/testing.d.ts +79 -0
  72. package/dist/testing.d.ts.map +1 -0
  73. package/dist/testing.js +107 -0
  74. package/dist/types/index.d.ts +27 -1
  75. package/dist/types/index.d.ts.map +1 -1
  76. package/package.json +8 -4
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.13.1",
44
+ version: "0.13.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",
@@ -75,6 +75,10 @@ var package_default = {
75
75
  "./storage": {
76
76
  types: "./dist/storage.d.ts",
77
77
  import: "./dist/storage.js"
78
+ },
79
+ "./testing": {
80
+ types: "./dist/testing.d.ts",
81
+ import: "./dist/testing.js"
78
82
  }
79
83
  },
80
84
  workspaces: [
@@ -87,13 +91,13 @@ var package_default = {
87
91
  "README.md"
88
92
  ],
89
93
  scripts: {
90
- build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
91
- "build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
94
+ build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
95
+ "build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
92
96
  migrate: "bun run src/server/index.ts migrate",
93
97
  "backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
94
98
  "generate:sdk": "bun run scripts/generate-sdk.ts",
95
99
  "build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
96
- typecheck: "tsc --noEmit",
100
+ typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
97
101
  test: "bun test",
98
102
  "test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
99
103
  "dev:cli": "bun run src/cli/index.tsx",
@@ -12,7 +12,7 @@ export interface TodosPackageSource {
12
12
  version: string;
13
13
  }
14
14
  export interface TodosPackageExportContract {
15
- subpath: "." | "./sdk" | "./mcp" | "./registry" | "./contracts" | "./storage";
15
+ subpath: "." | "./sdk" | "./mcp" | "./registry" | "./contracts" | "./storage" | "./testing";
16
16
  import: string;
17
17
  types: string;
18
18
  description: string;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,CAAC;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,YAAY,EAAE,uBAAuB,CAAC;IACtC,SAAS,EAAE,sBAAsB,CAAC;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,YAAY,EAAE,yBAAyB,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,EAAE,0BAA0B,EA2C7D,CAAC;AAUF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAc3F;AAED,eAAO,MAAM,cAAc,eAEzB,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,YAAY,EAAE,uBAAuB,CAAC;IACtC,SAAS,EAAE,sBAAsB,CAAC;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,YAAY,EAAE,yBAAyB,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,EAAE,0BAA0B,EAkD7D,CAAC;AAUF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAc3F;AAED,eAAO,MAAM,cAAc,eAEzB,CAAC"}
package/dist/registry.js CHANGED
@@ -3424,7 +3424,10 @@ var init_machines = __esm(() => {
3424
3424
  });
3425
3425
 
3426
3426
  // src/types/index.ts
3427
- var TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DISPATCH_STATUSES, DispatchNotFoundError;
3427
+ function isBlockingDependencyStatus(status) {
3428
+ return status !== "completed" && status !== "cancelled";
3429
+ }
3430
+ var TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, TaskReferenceAmbiguousError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DISPATCH_STATUSES, DispatchNotFoundError;
3428
3431
  var init_types = __esm(() => {
3429
3432
  TASK_STATUSES = [
3430
3433
  "pending",
@@ -3464,6 +3467,22 @@ var init_types = __esm(() => {
3464
3467
  this.name = "TaskNotFoundError";
3465
3468
  }
3466
3469
  };
3470
+ TaskReferenceAmbiguousError = class TaskReferenceAmbiguousError extends Error {
3471
+ reference;
3472
+ static code = "TASK_REFERENCE_AMBIGUOUS";
3473
+ candidateTaskIds;
3474
+ candidateProjectIds;
3475
+ constructor(reference, candidates) {
3476
+ const candidateTaskIds = [...new Set(candidates.map((candidate) => candidate.task_id))].sort();
3477
+ const candidateProjectIds = [...new Set(candidates.map((candidate) => candidate.project_id).filter((projectId) => typeof projectId === "string" && projectId.length > 0))].sort();
3478
+ const projectList = candidateProjectIds.length > 0 ? candidateProjectIds.join(", ") : "(unscoped)";
3479
+ super(`Task reference is ambiguous: "${reference}". Candidate project IDs: ${projectList}. ` + "Use a full task UUID.");
3480
+ this.reference = reference;
3481
+ this.name = "TaskReferenceAmbiguousError";
3482
+ this.candidateTaskIds = candidateTaskIds;
3483
+ this.candidateProjectIds = candidateProjectIds;
3484
+ }
3485
+ };
3467
3486
  ProjectNotFoundError = class ProjectNotFoundError extends Error {
3468
3487
  projectId;
3469
3488
  static code = "PROJECT_NOT_FOUND";
@@ -3755,15 +3774,18 @@ var init_identity_mapping = __esm(() => {
3755
3774
  var exports_config = {};
3756
3775
  __export(exports_config, {
3757
3776
  parseStorageMode: () => parseStorageMode,
3777
+ parseStorageBackend: () => parseStorageBackend,
3758
3778
  loadTodosStorageConfig: () => loadTodosStorageConfig,
3759
3779
  loadStorageConfig: () => loadStorageConfig,
3760
3780
  isTodosShadowEnabled: () => isTodosShadowEnabled,
3761
3781
  isTodosRemoteStorageEnabled: () => isTodosRemoteStorageEnabled,
3782
+ isTodosPostgresBackend: () => isTodosPostgresBackend,
3762
3783
  getTodosStorageShadowEnvName: () => getTodosStorageShadowEnvName,
3763
3784
  getTodosStorageMode: () => getTodosStorageMode,
3764
3785
  getTodosStorageEnvName: () => getTodosStorageEnvName,
3765
3786
  getTodosStorageDatabaseUrl: () => getTodosStorageDatabaseUrl,
3766
3787
  getTodosStorageDatabaseEnv: () => getTodosStorageDatabaseEnv,
3788
+ getTodosStorageBackend: () => getTodosStorageBackend,
3767
3789
  getStorageMode: () => getStorageMode,
3768
3790
  getStorageDatabaseUrl: () => getStorageDatabaseUrl,
3769
3791
  getStorageDatabaseEnv: () => getStorageDatabaseEnv,
@@ -3788,7 +3810,7 @@ function getCanonicalTodosRdsConfig(env = process.env) {
3788
3810
  };
3789
3811
  }
3790
3812
  function loadTodosStorageConfig(env = process.env) {
3791
- const mode = getTodosStorageMode(env);
3813
+ const mode = getTodosStorageBackend(env);
3792
3814
  const databaseUrl = getTodosStorageDatabaseUrl(env);
3793
3815
  const bucket = readStorageEnv(env, "s3Bucket").value;
3794
3816
  const prefix = readStorageEnv(env, "s3Prefix").value ?? "todos/";
@@ -3825,29 +3847,41 @@ function loadTodosStorageConfig(env = process.env) {
3825
3847
  function loadStorageConfig(env = process.env) {
3826
3848
  return loadTodosStorageConfig(env);
3827
3849
  }
3850
+ function isTodosPostgresBackend(config) {
3851
+ return config.mode === "postgres";
3852
+ }
3828
3853
  function isTodosRemoteStorageEnabled(config) {
3829
- return config.mode === "remote" || config.mode === "hybrid";
3854
+ return isTodosPostgresBackend(config);
3830
3855
  }
3831
3856
  function assertTodosRemoteStorageConfig(config) {
3832
- if (!isTodosRemoteStorageEnabled(config))
3857
+ if (!isTodosPostgresBackend(config))
3833
3858
  return;
3834
3859
  if (!config.database?.url) {
3835
3860
  throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${TODOS_STORAGE_ENV.mode}=${config.mode}`);
3836
3861
  }
3837
3862
  }
3838
- function parseStorageMode(value) {
3863
+ function parseStorageBackend(value) {
3839
3864
  const normalized = clean(value)?.toLowerCase();
3840
3865
  if (!normalized)
3841
- return "local";
3842
- if (normalized === "local" || normalized === "remote" || normalized === "hybrid")
3866
+ return "sqlite";
3867
+ if (normalized === "sqlite" || normalized === "postgres")
3843
3868
  return normalized;
3844
- throw new Error(`${TODOS_STORAGE_ENV.mode} must be local, remote, or hybrid`);
3869
+ const legacy = LEGACY_BACKEND_TOKENS[normalized];
3870
+ if (legacy)
3871
+ return legacy;
3872
+ throw new Error(`${TODOS_STORAGE_ENV.mode} must be sqlite or postgres (legacy values local and remote are accepted)`);
3873
+ }
3874
+ function parseStorageMode(value) {
3875
+ return parseStorageBackend(value);
3876
+ }
3877
+ function getTodosStorageBackend(env = process.env) {
3878
+ return parseStorageBackend(readStorageEnv(env, "mode").value);
3845
3879
  }
3846
3880
  function getTodosStorageMode(env = process.env) {
3847
- return parseStorageMode(readStorageEnv(env, "mode").value);
3881
+ return getTodosStorageBackend(env);
3848
3882
  }
3849
3883
  function getStorageMode(env = process.env) {
3850
- return getTodosStorageMode(env);
3884
+ return getTodosStorageBackend(env);
3851
3885
  }
3852
3886
  function isTodosShadowEnabled(env = process.env) {
3853
3887
  return parseBoolean(readStorageEnv(env, "shadow").value, false);
@@ -3858,8 +3892,8 @@ function getTodosStorageShadowEnvName(env = process.env) {
3858
3892
  function assertTodosShadowConfig(config, env = process.env) {
3859
3893
  if (!isTodosShadowEnabled(env))
3860
3894
  return;
3861
- if (config.mode !== "local") {
3862
- throw new Error(`${readStorageEnv(env, "shadow").name} shadow mirror requires ${TODOS_STORAGE_ENV.mode}=local (got ${config.mode})`);
3895
+ if (config.mode !== "sqlite") {
3896
+ throw new Error(`${readStorageEnv(env, "shadow").name} shadow mirror requires the sqlite backend (got ${config.mode})`);
3863
3897
  }
3864
3898
  if (!config.database?.url) {
3865
3899
  throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${readStorageEnv(env, "shadow").name} is enabled`);
@@ -3915,7 +3949,7 @@ function parsePositiveInteger(value, fallback) {
3915
3949
  }
3916
3950
  return parsed;
3917
3951
  }
3918
- var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, CANONICAL_TODOS_RDS_CLUSTER_ENV = "HASNA_TODOS_RDS_CLUSTER", CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV = "HASNA_TODOS_RDS_RUNTIME_PATH", CANONICAL_TODOS_RDS_DATABASE = "todos";
3952
+ var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, CANONICAL_TODOS_RDS_CLUSTER_ENV = "HASNA_TODOS_RDS_CLUSTER", CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV = "HASNA_TODOS_RDS_RUNTIME_PATH", CANONICAL_TODOS_RDS_DATABASE = "todos", LEGACY_BACKEND_TOKENS;
3919
3953
  var init_config = __esm(() => {
3920
3954
  TODOS_STORAGE_TABLES = [
3921
3955
  "todos_sync_records",
@@ -3956,6 +3990,14 @@ var init_config = __esm(() => {
3956
3990
  syncBatchSize: "TODOS_SYNC_BATCH_SIZE",
3957
3991
  syncDryRun: "TODOS_SYNC_DRY_RUN"
3958
3992
  };
3993
+ LEGACY_BACKEND_TOKENS = {
3994
+ local: "sqlite",
3995
+ remote: "postgres",
3996
+ postgresql: "postgres",
3997
+ hybrid: "postgres",
3998
+ self_hosted: "postgres",
3999
+ cloud: "postgres"
4000
+ };
3959
4001
  });
3960
4002
 
3961
4003
  // src/storage/shadow-outbox-schema.ts
@@ -4089,6 +4131,30 @@ function findGitRoot(startDir) {
4089
4131
  }
4090
4132
  return null;
4091
4133
  }
4134
+ function getGlobalDbPath() {
4135
+ const home = process.env["HOME"] || process.env["USERPROFILE"] || "~";
4136
+ return join(home, ".hasna", "todos", "todos.db");
4137
+ }
4138
+ function hasExplicitProjectArg(args = process.argv.slice(2)) {
4139
+ return args.some((arg) => arg === "--project" || arg.startsWith("--project="));
4140
+ }
4141
+ function getCliCommand(args = process.argv.slice(2)) {
4142
+ const globalOptionsWithValues = new Set(["--project", "--agent", "--session"]);
4143
+ for (let index = 0;index < args.length; index += 1) {
4144
+ const arg = args[index];
4145
+ if (globalOptionsWithValues.has(arg)) {
4146
+ index += 1;
4147
+ continue;
4148
+ }
4149
+ if (arg.startsWith("-"))
4150
+ continue;
4151
+ return arg;
4152
+ }
4153
+ return null;
4154
+ }
4155
+ function canCreateScopedProjectDb(args = process.argv.slice(2)) {
4156
+ return getCliCommand(args) === "project-bootstrap" && !args.some((arg) => arg === "--dry-run" || arg.startsWith("--dry-run="));
4157
+ }
4092
4158
  function getDbPath() {
4093
4159
  if (process.env["HASNA_TODOS_DB_PATH"]) {
4094
4160
  return process.env["HASNA_TODOS_DB_PATH"];
@@ -4096,18 +4162,19 @@ function getDbPath() {
4096
4162
  if (process.env["TODOS_DB_PATH"]) {
4097
4163
  return process.env["TODOS_DB_PATH"];
4098
4164
  }
4165
+ if (hasExplicitProjectArg())
4166
+ return getGlobalDbPath();
4099
4167
  const cwd = process.cwd();
4100
4168
  const nearest = findNearestProjectDb(cwd);
4101
4169
  if (nearest)
4102
4170
  return nearest;
4103
4171
  if (process.env["TODOS_DB_SCOPE"] === "project") {
4104
4172
  const gitRoot = findGitRoot(cwd);
4105
- if (gitRoot) {
4173
+ if (gitRoot && canCreateScopedProjectDb()) {
4106
4174
  return join(gitRoot, ".hasna", "todos", "todos.db");
4107
4175
  }
4108
4176
  }
4109
- const home = process.env["HOME"] || process.env["USERPROFILE"] || "~";
4110
- return join(home, ".hasna", "todos", "todos.db");
4177
+ return getGlobalDbPath();
4111
4178
  }
4112
4179
  function getDatabasePath() {
4113
4180
  return getDbPath();
@@ -4123,8 +4190,8 @@ function ensureDir(filePath) {
4123
4190
  function openDatabase(path) {
4124
4191
  ensureDir(path);
4125
4192
  const db = new Database(path);
4126
- db.run("PRAGMA journal_mode = WAL");
4127
4193
  db.run("PRAGMA busy_timeout = 5000");
4194
+ db.run("PRAGMA journal_mode = WAL");
4128
4195
  db.run("PRAGMA foreign_keys = ON");
4129
4196
  runMigrations(db);
4130
4197
  ensureAgentIdentitySchema(db);
@@ -4210,10 +4277,13 @@ function resolvePartialId(db, table, partialId) {
4210
4277
  return null;
4211
4278
  }
4212
4279
  if (table === "tasks") {
4213
- const shortIdRows = db.query("SELECT id FROM tasks WHERE short_id = ?").all(partialId);
4280
+ const shortIdRows = db.query("SELECT id, project_id FROM tasks WHERE LOWER(short_id) = LOWER(?) ORDER BY project_id, id").all(partialId);
4214
4281
  if (shortIdRows.length === 1) {
4215
4282
  return shortIdRows[0].id;
4216
4283
  }
4284
+ if (shortIdRows.length > 1) {
4285
+ throw new TaskReferenceAmbiguousError(partialId, shortIdRows.map((row) => ({ task_id: row.id, project_id: row.project_id })));
4286
+ }
4217
4287
  }
4218
4288
  if (table === "task_lists") {
4219
4289
  const slugRow = db.query("SELECT id FROM task_lists WHERE slug = ?").get(partialId);
@@ -4955,11 +5025,15 @@ function secretPatterns() {
4955
5025
  return [...customPatterns(), ...DEFAULT_SECRET_PATTERNS];
4956
5026
  }
4957
5027
  function isRedactionPlaceholderMatch(match) {
4958
- const placeholder = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
4959
5028
  const trimmed = match.trim();
4960
- return new RegExp(`^${placeholder}$`).test(trimmed) || new RegExp(`=\\s*['"]?${placeholder}['"]?$`).test(trimmed);
5029
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(trimmed) || new RegExp(`=\\s*['"]?${REDACTION_PLACEHOLDER}['"]?$`).test(trimmed);
5030
+ }
5031
+ function isRedactionPlaceholderKey(key) {
5032
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(key.trim());
4961
5033
  }
4962
5034
  function isSecretKey(key) {
5035
+ if (isRedactionPlaceholderKey(key))
5036
+ return false;
4963
5037
  if (NON_SECRET_USAGE_KEYS.has(key.toLowerCase()))
4964
5038
  return false;
4965
5039
  if (DEFAULT_SECRET_KEY_PATTERN.test(key))
@@ -5020,7 +5094,7 @@ function upsertSecretSafetyConfig(input) {
5020
5094
  saveConfig({ ...config, secret_safety: next });
5021
5095
  return next;
5022
5096
  }
5023
- var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS;
5097
+ var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS, REDACTION_PLACEHOLDER;
5024
5098
  var init_redaction = __esm(() => {
5025
5099
  init_config2();
5026
5100
  DEFAULT_SECRET_PATTERNS = [
@@ -5044,6 +5118,7 @@ var init_redaction = __esm(() => {
5044
5118
  "completion_tokens",
5045
5119
  "cost_tokens"
5046
5120
  ]);
5121
+ REDACTION_PLACEHOLDER = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
5047
5122
  });
5048
5123
 
5049
5124
  // src/lib/workspace-trust.ts
@@ -6683,7 +6758,7 @@ function scanTextForSecrets(text, options = {}) {
6683
6758
  };
6684
6759
  }
6685
6760
  function redactText(text, options = {}) {
6686
- const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER;
6761
+ const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER2;
6687
6762
  let out = text;
6688
6763
  for (const { pattern, allowlist_ok } of DEFAULT_PATTERNS) {
6689
6764
  out = out.replace(new RegExp(pattern.source, pattern.flags), (match) => {
@@ -6744,7 +6819,7 @@ function redactExportRecord(record) {
6744
6819
  function getDefaultSecretPatterns() {
6745
6820
  return DEFAULT_PATTERNS.map((p) => ({ name: p.name, source: p.pattern.source }));
6746
6821
  }
6747
- var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
6822
+ var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER2 = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
6748
6823
  var init_secret_redaction = __esm(() => {
6749
6824
  init_redaction();
6750
6825
  SECRET_REDACTION_SCHEMA = ["todos", "secret_redaction", "v1"].join(".");
@@ -8801,10 +8876,11 @@ function getTaskWithRelations(id, db) {
8801
8876
  JOIN task_dependencies td ON td.depends_on = t.id
8802
8877
  WHERE td.task_id = ?`).all(id);
8803
8878
  const dependencies = depRows.map(rowToTask);
8804
- const blockedByRows = d.query(`SELECT t.* FROM tasks t
8879
+ const blocked_by = dependencies.filter((dep) => isBlockingDependencyStatus(dep.status));
8880
+ const blocksRows = d.query(`SELECT t.* FROM tasks t
8805
8881
  JOIN task_dependencies td ON td.task_id = t.id
8806
8882
  WHERE td.depends_on = ?`).all(id);
8807
- const blocked_by = blockedByRows.map(rowToTask);
8883
+ const blocks = blocksRows.map(rowToTask);
8808
8884
  const comments = d.query("SELECT * FROM task_comments WHERE task_id = ? ORDER BY created_at").all(id);
8809
8885
  const parent = task.parent_id ? getTask(task.parent_id, d) : null;
8810
8886
  const checklist = getChecklist(id, d);
@@ -8813,6 +8889,7 @@ function getTaskWithRelations(id, db) {
8813
8889
  subtasks,
8814
8890
  dependencies,
8815
8891
  blocked_by,
8892
+ blocks,
8816
8893
  comments,
8817
8894
  parent,
8818
8895
  checklist
@@ -11823,7 +11900,7 @@ var init_tasks = __esm(() => {
11823
11900
  // package.json
11824
11901
  var package_default = {
11825
11902
  name: "@hasna/todos",
11826
- version: "0.13.1",
11903
+ version: "0.13.3",
11827
11904
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
11828
11905
  type: "module",
11829
11906
  main: "dist/index.js",
@@ -11857,6 +11934,10 @@ var package_default = {
11857
11934
  "./storage": {
11858
11935
  types: "./dist/storage.d.ts",
11859
11936
  import: "./dist/storage.js"
11937
+ },
11938
+ "./testing": {
11939
+ types: "./dist/testing.d.ts",
11940
+ import: "./dist/testing.js"
11860
11941
  }
11861
11942
  },
11862
11943
  workspaces: [
@@ -11869,13 +11950,13 @@ var package_default = {
11869
11950
  "README.md"
11870
11951
  ],
11871
11952
  scripts: {
11872
- build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
11873
- "build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
11953
+ build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
11954
+ "build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
11874
11955
  migrate: "bun run src/server/index.ts migrate",
11875
11956
  "backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
11876
11957
  "generate:sdk": "bun run scripts/generate-sdk.ts",
11877
11958
  "build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
11878
- typecheck: "tsc --noEmit",
11959
+ typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
11879
11960
  test: "bun test",
11880
11961
  "test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
11881
11962
  "dev:cli": "bun run src/cli/index.tsx",
@@ -17617,11 +17698,12 @@ var DEFAULT_LIMITS = {
17617
17698
  verification_limit: 10,
17618
17699
  run_limit: 3,
17619
17700
  dependency_limit: 12,
17620
- plan_task_limit: 20,
17701
+ plan_task_limit: 24,
17621
17702
  max_text_chars: 6000,
17622
17703
  summary_char_limit: 480,
17623
17704
  stale_after_hours: 72
17624
17705
  };
17706
+ var MAX_CONTEXT_TASKS = 24;
17625
17707
  var ALL_CONTEXT_SECTIONS = [
17626
17708
  "project",
17627
17709
  "plan",
@@ -17654,7 +17736,7 @@ function limits(input) {
17654
17736
  verification_limit: clamp(input.verification_limit, DEFAULT_LIMITS.verification_limit, 100),
17655
17737
  run_limit: clamp(input.run_limit, DEFAULT_LIMITS.run_limit, 20),
17656
17738
  dependency_limit: clamp(input.dependency_limit, DEFAULT_LIMITS.dependency_limit, 100),
17657
- plan_task_limit: clamp(input.plan_task_limit, DEFAULT_LIMITS.plan_task_limit, 100),
17739
+ plan_task_limit: clamp(input.plan_task_limit, DEFAULT_LIMITS.plan_task_limit, MAX_CONTEXT_TASKS),
17658
17740
  max_text_chars: clamp(input.max_text_chars, DEFAULT_LIMITS.max_text_chars, 50000),
17659
17741
  summary_char_limit: clamp(input.summary_char_limit, DEFAULT_LIMITS.summary_char_limit, 4000),
17660
17742
  stale_after_hours: clamp(input.stale_after_hours, DEFAULT_LIMITS.stale_after_hours, 24 * 365)
@@ -17677,6 +17759,13 @@ function taskSummary(task2) {
17677
17759
  priority: task2.priority
17678
17760
  };
17679
17761
  }
17762
+ function latestPlanTasks(planId, limit, db) {
17763
+ const rows = db.query(`SELECT * FROM tasks
17764
+ WHERE plan_id = ? AND archived_at IS NULL
17765
+ ORDER BY updated_at DESC, created_at DESC, id ASC
17766
+ LIMIT ?`).all(planId, limit);
17767
+ return rows.map(rowToTask);
17768
+ }
17680
17769
  function acceptanceCriteria(task2, maxText) {
17681
17770
  const metadata = task2.metadata || {};
17682
17771
  const raw = metadata["acceptance_criteria"] ?? metadata["acceptanceCriteria"] ?? metadata["criteria"];
@@ -17774,7 +17863,7 @@ function summarizeSection(pack, section, maxChars) {
17774
17863
  return "No plan was attached.";
17775
17864
  return summarizeStrings([
17776
17865
  `Plan ${pack.plan.name} is ${pack.plan.status}`,
17777
- `${pack.plan.tasks.length} listed plan tasks`,
17866
+ `${pack.plan.tasks.length} of ${pack.plan.total_tasks} plan tasks listed; ${pack.plan.omitted_tasks} omitted`,
17778
17867
  ...pack.plan.tasks.slice(0, 4).map((task2) => `${task2.status} ${task2.short_id || task2.id.slice(0, 8)} ${task2.title}`)
17779
17868
  ], maxChars);
17780
17869
  }
@@ -17924,7 +18013,8 @@ function createAgentContextPack(input, db) {
17924
18013
  const limit = limits(input);
17925
18014
  const project = task2.project_id ? getProject(task2.project_id, d) : null;
17926
18015
  const plan = task2.plan_id ? getPlan(task2.plan_id, d) : null;
17927
- const planTasks = task2.plan_id ? listTasks({ plan_id: task2.plan_id, limit: limit.plan_task_limit + 1 }, d) : [];
18016
+ const planTasks = task2.plan_id ? latestPlanTasks(task2.plan_id, limit.plan_task_limit, d) : [];
18017
+ const totalPlanTasks = task2.plan_id ? countTasks({ plan_id: task2.plan_id }, d) : 0;
17928
18018
  const upstream = getTaskDependencies(task2.id, d).map((dep) => taskSummary(getTask(dep.depends_on, d))).filter((item) => Boolean(item));
17929
18019
  const downstream = getTaskDependents(task2.id, d).map((dep) => taskSummary(getTask(dep.task_id, d))).filter((item) => Boolean(item));
17930
18020
  const comments = listComments(task2.id, d);
@@ -17967,6 +18057,9 @@ function createAgentContextPack(input, db) {
17967
18057
  warnings.push(`${runs.length - selectedRuns.length} older runs omitted`);
17968
18058
  if (fileMap.size > relevantFiles.length)
17969
18059
  warnings.push(`${fileMap.size - relevantFiles.length} relevant files omitted`);
18060
+ if (totalPlanTasks > planTasks.length && plan) {
18061
+ warnings.push(`${totalPlanTasks - planTasks.length} plan tasks omitted (${totalPlanTasks} total); load more on demand with "todos plans --show ${plan.id}" and inspect task details with "todos show <task-id>" or "todos context-pack <task-id>"`);
18062
+ }
17970
18063
  const contextTask = {
17971
18064
  id: task2.id,
17972
18065
  short_id: task2.short_id,
@@ -17998,8 +18091,9 @@ function createAgentContextPack(input, db) {
17998
18091
  description: truncate2(plan.description, limit.max_text_chars),
17999
18092
  status: plan.status,
18000
18093
  agent_id: plan.agent_id,
18001
- tasks: planTasks.slice(0, limit.plan_task_limit).map(taskSummary).filter((item) => Boolean(item)),
18002
- omitted_tasks: Math.max(0, planTasks.length - limit.plan_task_limit)
18094
+ tasks: planTasks.map(taskSummary).filter((item) => Boolean(item)),
18095
+ total_tasks: totalPlanTasks,
18096
+ omitted_tasks: Math.max(0, totalPlanTasks - planTasks.length)
18003
18097
  } : null,
18004
18098
  acceptance_criteria: acceptanceCriteria(task2, limit.max_text_chars),
18005
18099
  dependencies: {
@@ -18109,6 +18203,8 @@ ${pack.task.description}` : null,
18109
18203
  "## Project And Plan",
18110
18204
  pack.project ? `- Project: ${pack.project.name} (${pack.project.path})` : "- Project: none",
18111
18205
  pack.plan ? `- Plan: ${pack.plan.name} (${pack.plan.status})` : "- Plan: none",
18206
+ pack.plan ? `- Plan tasks: ${pack.plan.tasks.length} shown of ${pack.plan.total_tasks} total (${pack.plan.omitted_tasks} omitted)` : null,
18207
+ pack.plan && pack.plan.omitted_tasks > 0 ? `- Load more on demand: \`todos plans --show ${pack.plan.id}\`; inspect one task with \`todos show <task-id>\` or \`todos context-pack <task-id>\`.` : null,
18112
18208
  pack.plan && pack.plan.tasks.length > 0 ? bullet(pack.plan.tasks.map((task2) => `${task2.status} ${task2.short_id || task2.id.slice(0, 8)} ${task2.title}`)) : null,
18113
18209
  "",
18114
18210
  "## Acceptance Criteria",
@@ -19777,7 +19873,7 @@ function createReleaseCompatibilityReport(options = {}) {
19777
19873
  "todos --help",
19778
19874
  "todos-mcp --help",
19779
19875
  "todos-serve --help",
19780
- "todos doctor"
19876
+ "todos doctor --no-fail-on-findings"
19781
19877
  ],
19782
19878
  smoke_tests: [
19783
19879
  "command -v todos",
@@ -19785,7 +19881,7 @@ function createReleaseCompatibilityReport(options = {}) {
19785
19881
  "command -v todos-serve",
19786
19882
  "todos --version",
19787
19883
  "todos --help",
19788
- "todos doctor"
19884
+ "todos doctor --no-fail-on-findings"
19789
19885
  ],
19790
19886
  rollback: [
19791
19887
  "npm view @hasna/todos versions --json",
@@ -20279,12 +20375,11 @@ ${task2.description || ""}`.split(/\r?\n/);
20279
20375
  function normalizeStackLocation(value) {
20280
20376
  return value.replace(/:\d+(?::\d+)?/g, "").replace(/^file:\/\//, "").toLowerCase().trim();
20281
20377
  }
20282
- function fingerprint(task2) {
20378
+ function fingerprintContent(task2) {
20283
20379
  const body = task2.description || "";
20284
20380
  const text = `${task2.title}
20285
20381
  ${body}`;
20286
20382
  return {
20287
- task: task2,
20288
20383
  title: normalizeText(task2.title),
20289
20384
  body: normalizeText(body),
20290
20385
  text: normalizeText(text),
@@ -20293,6 +20388,9 @@ ${body}`;
20293
20388
  stackKeys: stackKeysFor(task2)
20294
20389
  };
20295
20390
  }
20391
+ function fingerprint(task2) {
20392
+ return { task: task2, ...fingerprintContent(task2) };
20393
+ }
20296
20394
  function intersects(left, right) {
20297
20395
  for (const value of left)
20298
20396
  if (right.has(value))
@@ -23479,6 +23577,13 @@ var TODOS_PACKAGE_EXPORTS = [
23479
23577
  types: "./dist/storage.d.ts",
23480
23578
  description: "Storage and service adapter contracts for local SQLite implementations.",
23481
23579
  stability: "stable"
23580
+ },
23581
+ {
23582
+ subpath: "./testing",
23583
+ import: "./dist/testing.js",
23584
+ types: "./dist/testing.d.ts",
23585
+ description: "Test-store isolation helpers that keep a consumer's test suite off a shared todos store.",
23586
+ stability: "stable"
23482
23587
  }
23483
23588
  ];
23484
23589
  function source8(version) {
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.13.1",
3
+ "packageVersion": "0.13.3",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "fe79f01296b7e9cea0ec174c7cc55ff78ef68be8",
6
- "gitTree": "bd253e7af999f588584cb3b3726584ae138570b1",
7
- "sourceTreeSha256": "bc39e6e9c94142637f88c3eb94012e8a6ff89ca5a71bec500577b74e6f9fd883",
8
- "generatedAt": "2026-07-27T09:20:29.000Z"
5
+ "gitCommit": "5ee2938484e763925ecd109c3d7ce0879c5b5079",
6
+ "gitTree": "473dc6bc3dbe3181c2770c0a8632dbc78fd1fa76",
7
+ "sourceTreeSha256": "a5cc55e3dc4e8f8e2c670110d1b93a72fa3e0cc56424a2393ffb83321bbc2871",
8
+ "generatedAt": "2026-07-30T14:34:36.000Z"
9
9
  }
@@ -148,7 +148,18 @@ export interface DoctorIssue {
148
148
  repairable?: boolean;
149
149
  }
150
150
  export interface DoctorResponse {
151
+ /**
152
+ * False when an error-severity check failed, a referential-integrity condition
153
+ * has matching rows, OR a condition could not be measured. It is NOT a
154
+ * "the request succeeded" flag.
155
+ */
151
156
  ok: boolean;
157
+ /** Status the `doctor` process RETURNS (0 clean, 1 findings, 2 incomplete). */
158
+ exit_code?: 0 | 1 | 2;
159
+ /** Status the reported rows IMPLY, ignoring `--no-fail-on-findings`. */
160
+ verdict_exit_code?: 0 | 1 | 2;
161
+ /** False when the findings gate was opted out of, making `exit_code` 0 regardless. */
162
+ fail_on_findings?: boolean;
152
163
  dry_run?: boolean;
153
164
  database_path?: string;
154
165
  migration?: {
@@ -173,6 +184,37 @@ export interface DoctorResponse {
173
184
  infos: number;
174
185
  repairable: number;
175
186
  applied: number;
187
+ integrity_findings?: number;
188
+ integrity_rows?: number;
189
+ integrity_unverified?: number;
190
+ };
191
+ /**
192
+ * Per-condition referential-integrity breakdown (`todos.integrity.v1`). A
193
+ * condition with `count: null` was NOT measured — it is never a zero.
194
+ */
195
+ integrity?: {
196
+ schema_version: string;
197
+ generated_at: string;
198
+ source: string;
199
+ conditions: Array<{
200
+ id: string;
201
+ count: number | null;
202
+ open_count: number | null;
203
+ severity: "warn" | "error" | null;
204
+ verified: boolean;
205
+ unverified_reason?: string;
206
+ message: string;
207
+ impact: string;
208
+ }>;
209
+ summary: {
210
+ ok: boolean;
211
+ findings: number;
212
+ rows: number;
213
+ errors: number;
214
+ warnings: number;
215
+ unverified: number;
216
+ complete: boolean;
217
+ };
176
218
  };
177
219
  }
178
220
  export interface SSEEvent {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":"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"}
@@ -641,6 +641,7 @@ export declare class TodosV1Client {
641
641
  "task_list_id"?: string;
642
642
  "assigned_to"?: string;
643
643
  "agent_id"?: string;
644
+ "tags"?: string;
644
645
  "limit"?: number;
645
646
  "offset"?: number;
646
647
  }, init?: RequestInit): Promise<{