@hasna/todos 0.13.1 → 0.13.2

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/contracts.js CHANGED
@@ -3424,6 +3424,9 @@ var init_machines = __esm(() => {
3424
3424
  });
3425
3425
 
3426
3426
  // src/types/index.ts
3427
+ function isBlockingDependencyStatus(status) {
3428
+ return status !== "completed" && status !== "cancelled";
3429
+ }
3427
3430
  var TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DISPATCH_STATUSES, DispatchNotFoundError;
3428
3431
  var init_types = __esm(() => {
3429
3432
  TASK_STATUSES = [
@@ -4123,8 +4126,8 @@ function ensureDir(filePath) {
4123
4126
  function openDatabase(path) {
4124
4127
  ensureDir(path);
4125
4128
  const db = new Database(path);
4126
- db.run("PRAGMA journal_mode = WAL");
4127
4129
  db.run("PRAGMA busy_timeout = 5000");
4130
+ db.run("PRAGMA journal_mode = WAL");
4128
4131
  db.run("PRAGMA foreign_keys = ON");
4129
4132
  runMigrations(db);
4130
4133
  ensureAgentIdentitySchema(db);
@@ -4955,11 +4958,15 @@ function secretPatterns() {
4955
4958
  return [...customPatterns(), ...DEFAULT_SECRET_PATTERNS];
4956
4959
  }
4957
4960
  function isRedactionPlaceholderMatch(match) {
4958
- const placeholder = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
4959
4961
  const trimmed = match.trim();
4960
- return new RegExp(`^${placeholder}$`).test(trimmed) || new RegExp(`=\\s*['"]?${placeholder}['"]?$`).test(trimmed);
4962
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(trimmed) || new RegExp(`=\\s*['"]?${REDACTION_PLACEHOLDER}['"]?$`).test(trimmed);
4963
+ }
4964
+ function isRedactionPlaceholderKey(key) {
4965
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(key.trim());
4961
4966
  }
4962
4967
  function isSecretKey(key) {
4968
+ if (isRedactionPlaceholderKey(key))
4969
+ return false;
4963
4970
  if (NON_SECRET_USAGE_KEYS.has(key.toLowerCase()))
4964
4971
  return false;
4965
4972
  if (DEFAULT_SECRET_KEY_PATTERN.test(key))
@@ -5020,7 +5027,7 @@ function upsertSecretSafetyConfig(input) {
5020
5027
  saveConfig({ ...config, secret_safety: next });
5021
5028
  return next;
5022
5029
  }
5023
- var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS;
5030
+ var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS, REDACTION_PLACEHOLDER;
5024
5031
  var init_redaction = __esm(() => {
5025
5032
  init_config2();
5026
5033
  DEFAULT_SECRET_PATTERNS = [
@@ -5044,6 +5051,7 @@ var init_redaction = __esm(() => {
5044
5051
  "completion_tokens",
5045
5052
  "cost_tokens"
5046
5053
  ]);
5054
+ REDACTION_PLACEHOLDER = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
5047
5055
  });
5048
5056
 
5049
5057
  // src/lib/workspace-trust.ts
@@ -6683,7 +6691,7 @@ function scanTextForSecrets(text, options = {}) {
6683
6691
  };
6684
6692
  }
6685
6693
  function redactText(text, options = {}) {
6686
- const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER;
6694
+ const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER2;
6687
6695
  let out = text;
6688
6696
  for (const { pattern, allowlist_ok } of DEFAULT_PATTERNS) {
6689
6697
  out = out.replace(new RegExp(pattern.source, pattern.flags), (match) => {
@@ -6744,7 +6752,7 @@ function redactExportRecord(record) {
6744
6752
  function getDefaultSecretPatterns() {
6745
6753
  return DEFAULT_PATTERNS.map((p) => ({ name: p.name, source: p.pattern.source }));
6746
6754
  }
6747
- var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
6755
+ var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER2 = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
6748
6756
  var init_secret_redaction = __esm(() => {
6749
6757
  init_redaction();
6750
6758
  SECRET_REDACTION_SCHEMA = ["todos", "secret_redaction", "v1"].join(".");
@@ -8801,10 +8809,11 @@ function getTaskWithRelations(id, db) {
8801
8809
  JOIN task_dependencies td ON td.depends_on = t.id
8802
8810
  WHERE td.task_id = ?`).all(id);
8803
8811
  const dependencies = depRows.map(rowToTask);
8804
- const blockedByRows = d.query(`SELECT t.* FROM tasks t
8812
+ const blocked_by = dependencies.filter((dep) => isBlockingDependencyStatus(dep.status));
8813
+ const blocksRows = d.query(`SELECT t.* FROM tasks t
8805
8814
  JOIN task_dependencies td ON td.task_id = t.id
8806
8815
  WHERE td.depends_on = ?`).all(id);
8807
- const blocked_by = blockedByRows.map(rowToTask);
8816
+ const blocks = blocksRows.map(rowToTask);
8808
8817
  const comments = d.query("SELECT * FROM task_comments WHERE task_id = ? ORDER BY created_at").all(id);
8809
8818
  const parent = task.parent_id ? getTask(task.parent_id, d) : null;
8810
8819
  const checklist = getChecklist(id, d);
@@ -8813,6 +8822,7 @@ function getTaskWithRelations(id, db) {
8813
8822
  subtasks,
8814
8823
  dependencies,
8815
8824
  blocked_by,
8825
+ blocks,
8816
8826
  comments,
8817
8827
  parent,
8818
8828
  checklist
@@ -11823,7 +11833,7 @@ var init_tasks = __esm(() => {
11823
11833
  // package.json
11824
11834
  var package_default = {
11825
11835
  name: "@hasna/todos",
11826
- version: "0.13.1",
11836
+ version: "0.13.2",
11827
11837
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
11828
11838
  type: "module",
11829
11839
  main: "dist/index.js",
@@ -11875,7 +11885,7 @@ var package_default = {
11875
11885
  "backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
11876
11886
  "generate:sdk": "bun run scripts/generate-sdk.ts",
11877
11887
  "build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
11878
- typecheck: "tsc --noEmit",
11888
+ typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
11879
11889
  test: "bun test",
11880
11890
  "test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
11881
11891
  "dev:cli": "bun run src/cli/index.tsx",
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA2DtC,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAsDD,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAarD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAQpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,SAAa,GAAG,OAAO,CAKlF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAa,GAAG,MAAM,CAG3D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGpD;AAQD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsE9F"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA2DtC,wBAAgB,eAAe,IAAI,MAAM,CAExC;AA2DD,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAarD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAQpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,SAAa,GAAG,OAAO,CAKlF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAa,GAAG,MAAM,CAG3D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGpD;AAQD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsE9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../src/db/task-crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EACf,IAAI,EACJ,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,mBAAmB,CAAC;AAiB3B,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAS5C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAMjF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGlF;AAwCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAkFtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAK9D;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,iBAAiB,GAAG,IAAI,CAqD1B;AAED,wBAAgB,SAAS,CAAC,MAAM,GAAE,UAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAwIxE;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,GAAG,IAAI,CAKb;AAcD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,EACnC,EAAE,CAAC,EAAE,QAAQ,GACZ,6BAA6B,CAmD/B;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAwGnG;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CA2ON;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAY7D"}
1
+ {"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../src/db/task-crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EACf,IAAI,EACJ,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,mBAAmB,CAAC;AAkB3B,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAS5C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAMjF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGlF;AAwCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAkFtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAK9D;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,iBAAiB,GAAG,IAAI,CA4D1B;AAED,wBAAgB,SAAS,CAAC,MAAM,GAAE,UAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAwIxE;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,GAAG,IAAI,CAKb;AAcD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,EACnC,EAAE,CAAC,EAAE,QAAQ,GACZ,6BAA6B,CAmD/B;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAwGnG;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CA2ON;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAY7D"}
package/dist/index.js CHANGED
@@ -3424,6 +3424,9 @@ var init_machines = __esm(() => {
3424
3424
  });
3425
3425
 
3426
3426
  // src/types/index.ts
3427
+ function isBlockingDependencyStatus(status) {
3428
+ return status !== "completed" && status !== "cancelled";
3429
+ }
3427
3430
  var TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DISPATCH_STATUSES, DispatchNotFoundError;
3428
3431
  var init_types = __esm(() => {
3429
3432
  TASK_STATUSES = [
@@ -4123,8 +4126,8 @@ function ensureDir(filePath) {
4123
4126
  function openDatabase(path) {
4124
4127
  ensureDir(path);
4125
4128
  const db = new Database(path);
4126
- db.run("PRAGMA journal_mode = WAL");
4127
4129
  db.run("PRAGMA busy_timeout = 5000");
4130
+ db.run("PRAGMA journal_mode = WAL");
4128
4131
  db.run("PRAGMA foreign_keys = ON");
4129
4132
  runMigrations(db);
4130
4133
  ensureAgentIdentitySchema(db);
@@ -4955,11 +4958,15 @@ function secretPatterns() {
4955
4958
  return [...customPatterns(), ...DEFAULT_SECRET_PATTERNS];
4956
4959
  }
4957
4960
  function isRedactionPlaceholderMatch(match) {
4958
- const placeholder = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
4959
4961
  const trimmed = match.trim();
4960
- return new RegExp(`^${placeholder}$`).test(trimmed) || new RegExp(`=\\s*['"]?${placeholder}['"]?$`).test(trimmed);
4962
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(trimmed) || new RegExp(`=\\s*['"]?${REDACTION_PLACEHOLDER}['"]?$`).test(trimmed);
4963
+ }
4964
+ function isRedactionPlaceholderKey(key) {
4965
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(key.trim());
4961
4966
  }
4962
4967
  function isSecretKey(key) {
4968
+ if (isRedactionPlaceholderKey(key))
4969
+ return false;
4963
4970
  if (NON_SECRET_USAGE_KEYS.has(key.toLowerCase()))
4964
4971
  return false;
4965
4972
  if (DEFAULT_SECRET_KEY_PATTERN.test(key))
@@ -5020,7 +5027,7 @@ function upsertSecretSafetyConfig(input) {
5020
5027
  saveConfig({ ...config, secret_safety: next });
5021
5028
  return next;
5022
5029
  }
5023
- var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS;
5030
+ var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS, REDACTION_PLACEHOLDER;
5024
5031
  var init_redaction = __esm(() => {
5025
5032
  init_config2();
5026
5033
  DEFAULT_SECRET_PATTERNS = [
@@ -5044,6 +5051,7 @@ var init_redaction = __esm(() => {
5044
5051
  "completion_tokens",
5045
5052
  "cost_tokens"
5046
5053
  ]);
5054
+ REDACTION_PLACEHOLDER = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
5047
5055
  });
5048
5056
 
5049
5057
  // src/lib/workspace-trust.ts
@@ -6683,7 +6691,7 @@ function scanTextForSecrets(text, options = {}) {
6683
6691
  };
6684
6692
  }
6685
6693
  function redactText(text, options = {}) {
6686
- const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER;
6694
+ const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER2;
6687
6695
  let out = text;
6688
6696
  for (const { pattern, allowlist_ok } of DEFAULT_PATTERNS) {
6689
6697
  out = out.replace(new RegExp(pattern.source, pattern.flags), (match) => {
@@ -6744,7 +6752,7 @@ function redactExportRecord(record) {
6744
6752
  function getDefaultSecretPatterns() {
6745
6753
  return DEFAULT_PATTERNS.map((p) => ({ name: p.name, source: p.pattern.source }));
6746
6754
  }
6747
- var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
6755
+ var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER2 = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
6748
6756
  var init_secret_redaction = __esm(() => {
6749
6757
  init_redaction();
6750
6758
  SECRET_REDACTION_SCHEMA = ["todos", "secret_redaction", "v1"].join(".");
@@ -8801,10 +8809,11 @@ function getTaskWithRelations(id, db) {
8801
8809
  JOIN task_dependencies td ON td.depends_on = t.id
8802
8810
  WHERE td.task_id = ?`).all(id);
8803
8811
  const dependencies = depRows.map(rowToTask);
8804
- const blockedByRows = d.query(`SELECT t.* FROM tasks t
8812
+ const blocked_by = dependencies.filter((dep) => isBlockingDependencyStatus(dep.status));
8813
+ const blocksRows = d.query(`SELECT t.* FROM tasks t
8805
8814
  JOIN task_dependencies td ON td.task_id = t.id
8806
8815
  WHERE td.depends_on = ?`).all(id);
8807
- const blocked_by = blockedByRows.map(rowToTask);
8816
+ const blocks = blocksRows.map(rowToTask);
8808
8817
  const comments = d.query("SELECT * FROM task_comments WHERE task_id = ? ORDER BY created_at").all(id);
8809
8818
  const parent = task.parent_id ? getTask(task.parent_id, d) : null;
8810
8819
  const checklist = getChecklist(id, d);
@@ -8813,6 +8822,7 @@ function getTaskWithRelations(id, db) {
8813
8822
  subtasks,
8814
8823
  dependencies,
8815
8824
  blocked_by,
8825
+ blocks,
8816
8826
  comments,
8817
8827
  parent,
8818
8828
  checklist
@@ -11936,7 +11946,7 @@ var init_dispatches = __esm(() => {
11936
11946
  // package.json
11937
11947
  var package_default = {
11938
11948
  name: "@hasna/todos",
11939
- version: "0.13.1",
11949
+ version: "0.13.2",
11940
11950
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
11941
11951
  type: "module",
11942
11952
  main: "dist/index.js",
@@ -11988,7 +11998,7 @@ var package_default = {
11988
11998
  "backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
11989
11999
  "generate:sdk": "bun run scripts/generate-sdk.ts",
11990
12000
  "build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
11991
- typecheck: "tsc --noEmit",
12001
+ typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
11992
12002
  test: "bun test",
11993
12003
  "test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
11994
12004
  "dev:cli": "bun run src/cli/index.tsx",
@@ -26352,9 +26362,11 @@ async function removeDependency2(taskId, dependsOn, store) {
26352
26362
  }
26353
26363
  async function listDependencies(taskId, store) {
26354
26364
  const edges = await store.list("dependencies");
26365
+ const incoming = edges.filter((edge) => edge.depends_on === taskId).map((edge) => ({ task_id: edge.task_id, depends_on: edge.depends_on }));
26355
26366
  return {
26356
26367
  dependencies: edges.filter((edge) => edge.task_id === taskId).map((edge) => ({ task_id: edge.task_id, depends_on: edge.depends_on })),
26357
- blocked_by: edges.filter((edge) => edge.depends_on === taskId).map((edge) => ({ task_id: edge.task_id, depends_on: edge.depends_on }))
26368
+ blocks: incoming,
26369
+ blocked_by: incoming
26358
26370
  };
26359
26371
  }
26360
26372
  async function addVerification(input, store, context) {
@@ -41733,6 +41745,8 @@ init_database();
41733
41745
  init_tasks();
41734
41746
  init_task_graph();
41735
41747
  init_task_lifecycle();
41748
+ init_types();
41749
+ init_types();
41736
41750
  var DEPENDENCY_GRAPH_SCHEMA = "todos.dependency_graph.v1";
41737
41751
  var TASK_DEPENDENCY_EDGES_SCHEMA = "todos.task_dependency_edges.v1";
41738
41752
  var PROJECT_DEPENDENCY_GRAPH_SCHEMA = "todos.project_dependency_graph.v1";
@@ -41988,13 +42002,14 @@ function getBlockers(taskId, db) {
41988
42002
  missing_dependencies: missing
41989
42003
  };
41990
42004
  }
41991
- function buildTaskDependencyEdges(task2, dependencies, blocked_by) {
42005
+ function buildTaskDependencyEdges(task2, dependencies, blocks) {
41992
42006
  return {
41993
42007
  schema_version: TASK_DEPENDENCY_EDGES_SCHEMA,
41994
42008
  task_id: task2.id,
41995
42009
  short_id: task2.short_id,
41996
42010
  dependencies: dependencies.map(toNode),
41997
- blocked_by: blocked_by.map(toNode)
42011
+ blocked_by: dependencies.filter((dep) => isBlockingDependencyStatus(dep.status)).map(toNode),
42012
+ blocks: blocks.map(toNode)
41998
42013
  };
41999
42014
  }
42000
42015
  function getTaskDependencyEdges(taskId, db) {
@@ -42003,8 +42018,8 @@ function getTaskDependencyEdges(taskId, db) {
42003
42018
  if (!task2)
42004
42019
  return null;
42005
42020
  const dependencies = getTaskDependencies(taskId, d).map((edge) => getTask(edge.depends_on, d)).filter((t) => Boolean(t));
42006
- const blocked_by = getTaskDependents(taskId, d).map((edge) => getTask(edge.task_id, d)).filter((t) => Boolean(t));
42007
- return buildTaskDependencyEdges(task2, dependencies, blocked_by);
42021
+ const blocks = getTaskDependents(taskId, d).map((edge) => getTask(edge.task_id, d)).filter((t) => Boolean(t));
42022
+ return buildTaskDependencyEdges(task2, dependencies, blocks);
42008
42023
  }
42009
42024
  function buildProjectDependencyGraph(projectId, tasks, edges, generatedAt = new Date().toISOString()) {
42010
42025
  const nodeIds = new Set(tasks.map((t) => t.id));
@@ -53261,7 +53276,7 @@ export {
53261
53276
  REMINDER_STATUSES,
53262
53277
  RELEASE_CHECK_SCHEMA,
53263
53278
  RELATIONSHIP_TYPES,
53264
- REDACTION_PLACEHOLDER,
53279
+ REDACTION_PLACEHOLDER2 as REDACTION_PLACEHOLDER,
53265
53280
  ProjectNotFoundError,
53266
53281
  PreWriteSecretError,
53267
53282
  PrGroupLedgerError,
@@ -32,15 +32,19 @@ export interface DependencyEdge {
32
32
  * scheduler can honor ordering without a second lookup and without scraping
33
33
  * human output.
34
34
  *
35
- * IMPORTANTfield orientation (kept identical to `getTaskWithRelations` and
36
- * the human `Depends on:` / `Blocks:` output):
35
+ * Field orientation every name means exactly what it says (regression
36
+ * 4599ef37: `blocked_by` used to carry the DEPENDENTS, so schedulers consuming
37
+ * it by name gated the wrong side and deadlocked the upstream task of every
38
+ * chain):
37
39
  * - `dependencies` = this task's PREREQUISITES (upstream). This task depends
38
- * on them; they must complete first. These are its blockers.
39
- * - `blocked_by` = this task's DEPENDENTS (downstream). They depend on this
40
- * task; this task blocks THEM. (The name reads backwards versus its
41
- * contents a dependent is a task this one "blocks" so consume by
42
- * meaning, not by name.)
43
- * A scheduler gating "is this runnable" cares about `dependencies`.
40
+ * on them; they must complete first.
41
+ * - `blocked_by` = the subset of `dependencies` that is still incomplete —
42
+ * the tasks blocking this one RIGHT NOW. Empty means dispatchable. A
43
+ * completed or cancelled prerequisite no longer blocks (same rule as
44
+ * `getBlockedTasks`/`getBlockingDeps`).
45
+ * - `blocks` = this task's DEPENDENTS (downstream). They depend on this
46
+ * task; this task blocks THEM. Matches the human `Blocks:` output.
47
+ * A scheduler gating "is this runnable" cares about `blocked_by`.
44
48
  */
45
49
  export interface TaskDependencyEdges {
46
50
  schema_version: typeof TASK_DEPENDENCY_EDGES_SCHEMA;
@@ -53,6 +57,7 @@ export interface TaskDependencyEdges {
53
57
  short_id: string | null;
54
58
  dependencies: DependencyNode[];
55
59
  blocked_by: DependencyNode[];
60
+ blocks: DependencyNode[];
56
61
  }
57
62
  /**
58
63
  * The full dependency graph for a project in one read: every in-scope task as a
@@ -139,16 +144,19 @@ export declare function getUnlockImpact(taskId: string, db?: Database): UnlockIm
139
144
  export declare function analyzeDependencyGraph(filter?: GraphFilter, db?: Database): DependencyGraphAnalysis;
140
145
  export declare function getDependents(taskId: string, db?: Database): DependencyNode[];
141
146
  export declare function getBlockers(taskId: string, db?: Database): BlockedTaskReport | null;
147
+ export { isBlockingDependencyStatus } from "../types/index.js";
142
148
  /**
143
149
  * Assemble a {@link TaskDependencyEdges} payload from already-resolved task
144
150
  * rows. Pure (no DB access) so both the local reader below and the cloud CLI
145
151
  * path — which hydrates remote edges via `cloudGetTaskRelations` — emit the
146
- * identical versioned shape.
152
+ * identical versioned shape. `blocked_by` is derived here from the incomplete
153
+ * prerequisites so no caller can reintroduce the inverted orientation
154
+ * (regression 4599ef37).
147
155
  */
148
156
  export declare function buildTaskDependencyEdges(task: {
149
157
  id: string;
150
158
  short_id: string | null;
151
- }, dependencies: Task[], blocked_by: Task[]): TaskDependencyEdges;
159
+ }, dependencies: Task[], blocks: Task[]): TaskDependencyEdges;
152
160
  /**
153
161
  * Read a single task's direct dependency edges as a machine-readable,
154
162
  * versioned payload (`todos deps <id> --json`). Returns `null` when the task
@@ -1 +1 @@
1
- {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../src/lib/dependency-graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../src/lib/dependency-graph.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../src/lib/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAkED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUxD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAe1C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAOjE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAQtF"}
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../src/lib/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AA6FD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUxD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAe1C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAOjE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAQtF"}
package/dist/mcp/index.js CHANGED
@@ -41,6 +41,9 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
41
41
  var __require = import.meta.require;
42
42
 
43
43
  // src/types/index.ts
44
+ function isBlockingDependencyStatus(status) {
45
+ return status !== "completed" && status !== "cancelled";
46
+ }
44
47
  var TASK_STATUSES, VersionConflictError, TaskNotFoundError, ProjectNotFoundError, ResourceConflictError, PlanNotFoundError, LockError, AgentNotFoundError, IdentityAliasAmbiguousError, IdentityIdImmutableError, TaskListNotFoundError, DependencyCycleError, CompletionGuardError, DispatchNotFoundError;
45
48
  var init_types = __esm(() => {
46
49
  TASK_STATUSES = [
@@ -4131,8 +4134,8 @@ function ensureDir(filePath) {
4131
4134
  function openDatabase(path) {
4132
4135
  ensureDir(path);
4133
4136
  const db = new Database(path);
4134
- db.run("PRAGMA journal_mode = WAL");
4135
4137
  db.run("PRAGMA busy_timeout = 5000");
4138
+ db.run("PRAGMA journal_mode = WAL");
4136
4139
  db.run("PRAGMA foreign_keys = ON");
4137
4140
  runMigrations(db);
4138
4141
  ensureAgentIdentitySchema(db);
@@ -9107,11 +9110,15 @@ function secretPatterns() {
9107
9110
  return [...customPatterns(), ...DEFAULT_SECRET_PATTERNS];
9108
9111
  }
9109
9112
  function isRedactionPlaceholderMatch(match) {
9110
- const placeholder = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
9111
9113
  const trimmed = match.trim();
9112
- return new RegExp(`^${placeholder}$`).test(trimmed) || new RegExp(`=\\s*['"]?${placeholder}['"]?$`).test(trimmed);
9114
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(trimmed) || new RegExp(`=\\s*['"]?${REDACTION_PLACEHOLDER}['"]?$`).test(trimmed);
9115
+ }
9116
+ function isRedactionPlaceholderKey(key) {
9117
+ return new RegExp(`^${REDACTION_PLACEHOLDER}$`).test(key.trim());
9113
9118
  }
9114
9119
  function isSecretKey(key) {
9120
+ if (isRedactionPlaceholderKey(key))
9121
+ return false;
9115
9122
  if (NON_SECRET_USAGE_KEYS.has(key.toLowerCase()))
9116
9123
  return false;
9117
9124
  if (DEFAULT_SECRET_KEY_PATTERN.test(key))
@@ -9169,7 +9176,7 @@ function upsertSecretSafetyConfig(input) {
9169
9176
  saveConfig({ ...config, secret_safety: next });
9170
9177
  return next;
9171
9178
  }
9172
- var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS;
9179
+ var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS, REDACTION_PLACEHOLDER;
9173
9180
  var init_redaction = __esm(() => {
9174
9181
  init_config2();
9175
9182
  DEFAULT_SECRET_PATTERNS = [
@@ -9193,6 +9200,7 @@ var init_redaction = __esm(() => {
9193
9200
  "completion_tokens",
9194
9201
  "cost_tokens"
9195
9202
  ]);
9203
+ REDACTION_PLACEHOLDER = String.raw`\[REDACTED(?:_[A-Z_]+)?\]`;
9196
9204
  });
9197
9205
 
9198
9206
  // src/lib/secret-redaction.ts
@@ -9228,7 +9236,7 @@ function scanTextForSecrets(text, options = {}) {
9228
9236
  };
9229
9237
  }
9230
9238
  function redactText(text, options = {}) {
9231
- const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER;
9239
+ const placeholder = options.placeholder ?? REDACTION_PLACEHOLDER2;
9232
9240
  let out = text;
9233
9241
  for (const { pattern, allowlist_ok } of DEFAULT_PATTERNS) {
9234
9242
  out = out.replace(new RegExp(pattern.source, pattern.flags), (match) => {
@@ -9255,7 +9263,7 @@ function redactExportRecord(record) {
9255
9263
  }
9256
9264
  return base;
9257
9265
  }
9258
- var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
9266
+ var SECRET_REDACTION_SCHEMA, REDACTION_PLACEHOLDER2 = "[REDACTED]", DEFAULT_PATTERNS, DEFAULT_ALLOWLIST, customRedactors;
9259
9267
  var init_secret_redaction = __esm(() => {
9260
9268
  init_redaction();
9261
9269
  SECRET_REDACTION_SCHEMA = ["todos", "secret_redaction", "v1"].join(".");
@@ -13420,10 +13428,11 @@ function getTaskWithRelations(id, db) {
13420
13428
  JOIN task_dependencies td ON td.depends_on = t.id
13421
13429
  WHERE td.task_id = ?`).all(id);
13422
13430
  const dependencies = depRows.map(rowToTask);
13423
- const blockedByRows = d.query(`SELECT t.* FROM tasks t
13431
+ const blocked_by = dependencies.filter((dep) => isBlockingDependencyStatus(dep.status));
13432
+ const blocksRows = d.query(`SELECT t.* FROM tasks t
13424
13433
  JOIN task_dependencies td ON td.task_id = t.id
13425
13434
  WHERE td.depends_on = ?`).all(id);
13426
- const blocked_by = blockedByRows.map(rowToTask);
13435
+ const blocks = blocksRows.map(rowToTask);
13427
13436
  const comments = d.query("SELECT * FROM task_comments WHERE task_id = ? ORDER BY created_at").all(id);
13428
13437
  const parent = task.parent_id ? getTask(task.parent_id, d) : null;
13429
13438
  const checklist = getChecklist(id, d);
@@ -13432,6 +13441,7 @@ function getTaskWithRelations(id, db) {
13432
13441
  subtasks,
13433
13442
  dependencies,
13434
13443
  blocked_by,
13444
+ blocks,
13435
13445
  comments,
13436
13446
  parent,
13437
13447
  checklist
@@ -20421,6 +20431,7 @@ async function cloudResolveTaskListRef(client, ref, projectId) {
20421
20431
  }
20422
20432
  var UUID_RE, CLOUD_MODES, VALID_STORAGE_MODES, completionCapabilityCache;
20423
20433
  var init_cloud_router = __esm(() => {
20434
+ init_types();
20424
20435
  init_redaction();
20425
20436
  init_http_client();
20426
20437
  UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -34187,7 +34198,7 @@ var package_default;
34187
34198
  var init_package = __esm(() => {
34188
34199
  package_default = {
34189
34200
  name: "@hasna/todos",
34190
- version: "0.13.1",
34201
+ version: "0.13.2",
34191
34202
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
34192
34203
  type: "module",
34193
34204
  main: "dist/index.js",
@@ -34239,7 +34250,7 @@ var init_package = __esm(() => {
34239
34250
  "backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
34240
34251
  "generate:sdk": "bun run scripts/generate-sdk.ts",
34241
34252
  "build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
34242
- typecheck: "tsc --noEmit",
34253
+ typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
34243
34254
  test: "bun test",
34244
34255
  "test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
34245
34256
  "dev:cli": "bun run src/cli/index.tsx",
@@ -45832,9 +45843,11 @@ async function removeDependency2(taskId, dependsOn, store) {
45832
45843
  }
45833
45844
  async function listDependencies(taskId, store) {
45834
45845
  const edges = await store.list("dependencies");
45846
+ const incoming = edges.filter((edge) => edge.depends_on === taskId).map((edge) => ({ task_id: edge.task_id, depends_on: edge.depends_on }));
45835
45847
  return {
45836
45848
  dependencies: edges.filter((edge) => edge.task_id === taskId).map((edge) => ({ task_id: edge.task_id, depends_on: edge.depends_on })),
45837
- blocked_by: edges.filter((edge) => edge.depends_on === taskId).map((edge) => ({ task_id: edge.task_id, depends_on: edge.depends_on }))
45849
+ blocks: incoming,
45850
+ blocked_by: incoming
45838
45851
  };
45839
45852
  }
45840
45853
  async function addVerification(input, store, context) {
@@ -51489,7 +51502,7 @@ Dashboard not found at: ${dashboardDir}`);
51489
51502
  const path = url.pathname;
51490
51503
  const method = req.method;
51491
51504
  const reqOrigin = req.headers.get("origin") || undefined;
51492
- const corsHeaders = reqOrigin && (reqOrigin === `http://localhost:${port}` || reqOrigin === "http://localhost:0") ? {
51505
+ const corsHeaders = reqOrigin && reqOrigin === `http://localhost:${ctx.port}` ? {
51493
51506
  "Access-Control-Allow-Origin": reqOrigin,
51494
51507
  "Access-Control-Allow-Methods": "GET, POST, PATCH, DELETE, OPTIONS",
51495
51508
  "Access-Control-Allow-Headers": "Content-Type, X-API-Key, Authorization",
@@ -51777,7 +51790,9 @@ Dashboard not found at: ${dashboardDir}`);
51777
51790
  };
51778
51791
  process.on("SIGINT", shutdown);
51779
51792
  process.on("SIGTERM", shutdown);
51780
- const serverUrl = `http://localhost:${port}`;
51793
+ const boundPort = server.port ?? port;
51794
+ ctx.port = boundPort;
51795
+ const serverUrl = `http://localhost:${boundPort}`;
51781
51796
  console.log(`Todos Dashboard running at ${serverUrl}`);
51782
51797
  if (shouldOpen) {
51783
51798
  try {
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.2",
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",
@@ -93,7 +93,7 @@ var package_default = {
93
93
  "backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
94
94
  "generate:sdk": "bun run scripts/generate-sdk.ts",
95
95
  "build:dashboard": "cd dashboard && bun install --frozen-lockfile && bun run build",
96
- typecheck: "tsc --noEmit",
96
+ typecheck: "tsc --noEmit -p tsconfig.typecheck.json",
97
97
  test: "bun test",
98
98
  "test:no-cloud": "bun test src/no-cloud-boundary.test.ts src/local-first.test.ts src/lib/public-release-gate.test.ts",
99
99
  "dev:cli": "bun run src/cli/index.tsx",