@hasna/todos 0.11.60 → 0.11.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -6239,7 +6239,7 @@ var init_event_hooks = __esm(() => {
6239
6239
  VALID_TARGETS = new Set(["stdout", "file", "socket", "script"]);
6240
6240
  });
6241
6241
 
6242
- // node_modules/.bun/@hasna+events@0.1.10/node_modules/@hasna/events/dist/index.js
6242
+ // node_modules/.bun/@hasna+events@0.1.11/node_modules/@hasna/events/dist/index.js
6243
6243
  import { chmod, mkdir, readFile, rename, writeFile } from "fs/promises";
6244
6244
  import { existsSync as existsSync6 } from "fs";
6245
6245
  import { homedir } from "os";
@@ -6256,6 +6256,19 @@ function getPathValue(input, path) {
6256
6256
  return;
6257
6257
  }, input);
6258
6258
  }
6259
+ function getFieldValues(input, path) {
6260
+ const values = [];
6261
+ const push = (value) => {
6262
+ if (!values.some((item) => Object.is(item, value)))
6263
+ values.push(value);
6264
+ };
6265
+ if (path.includes(".") && path in input)
6266
+ push(input[path]);
6267
+ const nestedValue = getPathValue(input, path);
6268
+ if (nestedValue !== undefined || !path.includes("."))
6269
+ push(nestedValue);
6270
+ return values;
6271
+ }
6259
6272
  function wildcardToRegExp(pattern, options = {}) {
6260
6273
  let body = "";
6261
6274
  for (let index = 0;index < pattern.length; index += 1) {
@@ -6285,15 +6298,15 @@ function matchRecord(input, matcher) {
6285
6298
  if (!matcher)
6286
6299
  return true;
6287
6300
  return Object.entries(matcher).every(([path, expected]) => {
6288
- const actual = getPathValue(input, path);
6289
- return matchField(actual, expected, path);
6301
+ const actualValues = getFieldValues(input, path);
6302
+ return matchField(actualValues, expected, path);
6290
6303
  });
6291
6304
  }
6292
- function matchField(actual, expected, path) {
6305
+ function matchField(actualValues, expected, path) {
6293
6306
  if (isNegativeMatcher(expected)) {
6294
- return !matchPositiveField(actual, expected.not, path);
6307
+ return !actualValues.some((actual) => matchPositiveField(actual, expected.not, path));
6295
6308
  }
6296
- return matchPositiveField(actual, expected, path);
6309
+ return actualValues.some((actual) => matchPositiveField(actual, expected, path));
6297
6310
  }
6298
6311
  function matchPositiveField(actual, expected, path) {
6299
6312
  if (typeof expected === "string" || Array.isArray(expected)) {
package/dist/contracts.js CHANGED
@@ -6955,7 +6955,7 @@ async function testLocalEventHook(name, input) {
6955
6955
  return emitLocalEventHooks({ ...input, hooks: [hook] });
6956
6956
  }
6957
6957
 
6958
- // node_modules/.bun/@hasna+events@0.1.10/node_modules/@hasna/events/dist/index.js
6958
+ // node_modules/.bun/@hasna+events@0.1.11/node_modules/@hasna/events/dist/index.js
6959
6959
  import { chmod, mkdir, readFile, rename, writeFile } from "fs/promises";
6960
6960
  import { existsSync as existsSync6 } from "fs";
6961
6961
  import { homedir } from "os";
@@ -6972,6 +6972,19 @@ function getPathValue(input, path) {
6972
6972
  return;
6973
6973
  }, input);
6974
6974
  }
6975
+ function getFieldValues(input, path) {
6976
+ const values = [];
6977
+ const push = (value) => {
6978
+ if (!values.some((item) => Object.is(item, value)))
6979
+ values.push(value);
6980
+ };
6981
+ if (path.includes(".") && path in input)
6982
+ push(input[path]);
6983
+ const nestedValue = getPathValue(input, path);
6984
+ if (nestedValue !== undefined || !path.includes("."))
6985
+ push(nestedValue);
6986
+ return values;
6987
+ }
6975
6988
  function wildcardToRegExp(pattern, options = {}) {
6976
6989
  let body = "";
6977
6990
  for (let index = 0;index < pattern.length; index += 1) {
@@ -7001,15 +7014,15 @@ function matchRecord(input, matcher) {
7001
7014
  if (!matcher)
7002
7015
  return true;
7003
7016
  return Object.entries(matcher).every(([path, expected]) => {
7004
- const actual = getPathValue(input, path);
7005
- return matchField(actual, expected, path);
7017
+ const actualValues = getFieldValues(input, path);
7018
+ return matchField(actualValues, expected, path);
7006
7019
  });
7007
7020
  }
7008
- function matchField(actual, expected, path) {
7021
+ function matchField(actualValues, expected, path) {
7009
7022
  if (isNegativeMatcher(expected)) {
7010
- return !matchPositiveField(actual, expected.not, path);
7023
+ return !actualValues.some((actual) => matchPositiveField(actual, expected.not, path));
7011
7024
  }
7012
- return matchPositiveField(actual, expected, path);
7025
+ return actualValues.some((actual) => matchPositiveField(actual, expected, path));
7013
7026
  }
7014
7027
  function matchPositiveField(actual, expected, path) {
7015
7028
  if (typeof expected === "string" || Array.isArray(expected)) {
package/dist/index.js CHANGED
@@ -7060,7 +7060,7 @@ async function testLocalEventHook(name, input) {
7060
7060
  return emitLocalEventHooks({ ...input, hooks: [hook] });
7061
7061
  }
7062
7062
 
7063
- // node_modules/.bun/@hasna+events@0.1.10/node_modules/@hasna/events/dist/index.js
7063
+ // node_modules/.bun/@hasna+events@0.1.11/node_modules/@hasna/events/dist/index.js
7064
7064
  import { chmod, mkdir, readFile, rename, writeFile } from "fs/promises";
7065
7065
  import { existsSync as existsSync6 } from "fs";
7066
7066
  import { homedir } from "os";
@@ -7077,6 +7077,19 @@ function getPathValue(input, path) {
7077
7077
  return;
7078
7078
  }, input);
7079
7079
  }
7080
+ function getFieldValues(input, path) {
7081
+ const values = [];
7082
+ const push = (value) => {
7083
+ if (!values.some((item) => Object.is(item, value)))
7084
+ values.push(value);
7085
+ };
7086
+ if (path.includes(".") && path in input)
7087
+ push(input[path]);
7088
+ const nestedValue = getPathValue(input, path);
7089
+ if (nestedValue !== undefined || !path.includes("."))
7090
+ push(nestedValue);
7091
+ return values;
7092
+ }
7080
7093
  function wildcardToRegExp(pattern, options = {}) {
7081
7094
  let body = "";
7082
7095
  for (let index = 0;index < pattern.length; index += 1) {
@@ -7106,15 +7119,15 @@ function matchRecord(input, matcher) {
7106
7119
  if (!matcher)
7107
7120
  return true;
7108
7121
  return Object.entries(matcher).every(([path, expected]) => {
7109
- const actual = getPathValue(input, path);
7110
- return matchField(actual, expected, path);
7122
+ const actualValues = getFieldValues(input, path);
7123
+ return matchField(actualValues, expected, path);
7111
7124
  });
7112
7125
  }
7113
- function matchField(actual, expected, path) {
7126
+ function matchField(actualValues, expected, path) {
7114
7127
  if (isNegativeMatcher(expected)) {
7115
- return !matchPositiveField(actual, expected.not, path);
7128
+ return !actualValues.some((actual) => matchPositiveField(actual, expected.not, path));
7116
7129
  }
7117
- return matchPositiveField(actual, expected, path);
7130
+ return actualValues.some((actual) => matchPositiveField(actual, expected, path));
7118
7131
  }
7119
7132
  function matchPositiveField(actual, expected, path) {
7120
7133
  if (typeof expected === "string" || Array.isArray(expected)) {
package/dist/mcp/index.js CHANGED
@@ -8738,7 +8738,7 @@ var init_event_hooks = __esm(() => {
8738
8738
  VALID_TARGETS = new Set(["stdout", "file", "socket", "script"]);
8739
8739
  });
8740
8740
 
8741
- // node_modules/.bun/@hasna+events@0.1.10/node_modules/@hasna/events/dist/index.js
8741
+ // node_modules/.bun/@hasna+events@0.1.11/node_modules/@hasna/events/dist/index.js
8742
8742
  import { chmod, mkdir, readFile, rename, writeFile } from "fs/promises";
8743
8743
  import { existsSync as existsSync5 } from "fs";
8744
8744
  import { homedir } from "os";
@@ -8755,6 +8755,19 @@ function getPathValue(input, path) {
8755
8755
  return;
8756
8756
  }, input);
8757
8757
  }
8758
+ function getFieldValues(input, path) {
8759
+ const values = [];
8760
+ const push = (value) => {
8761
+ if (!values.some((item) => Object.is(item, value)))
8762
+ values.push(value);
8763
+ };
8764
+ if (path.includes(".") && path in input)
8765
+ push(input[path]);
8766
+ const nestedValue = getPathValue(input, path);
8767
+ if (nestedValue !== undefined || !path.includes("."))
8768
+ push(nestedValue);
8769
+ return values;
8770
+ }
8758
8771
  function wildcardToRegExp(pattern, options = {}) {
8759
8772
  let body = "";
8760
8773
  for (let index = 0;index < pattern.length; index += 1) {
@@ -8784,15 +8797,15 @@ function matchRecord(input, matcher) {
8784
8797
  if (!matcher)
8785
8798
  return true;
8786
8799
  return Object.entries(matcher).every(([path, expected]) => {
8787
- const actual = getPathValue(input, path);
8788
- return matchField(actual, expected, path);
8800
+ const actualValues = getFieldValues(input, path);
8801
+ return matchField(actualValues, expected, path);
8789
8802
  });
8790
8803
  }
8791
- function matchField(actual, expected, path) {
8804
+ function matchField(actualValues, expected, path) {
8792
8805
  if (isNegativeMatcher(expected)) {
8793
- return !matchPositiveField(actual, expected.not, path);
8806
+ return !actualValues.some((actual) => matchPositiveField(actual, expected.not, path));
8794
8807
  }
8795
- return matchPositiveField(actual, expected, path);
8808
+ return actualValues.some((actual) => matchPositiveField(actual, expected, path));
8796
8809
  }
8797
8810
  function matchPositiveField(actual, expected, path) {
8798
8811
  if (typeof expected === "string" || Array.isArray(expected)) {
package/dist/registry.js CHANGED
@@ -6955,7 +6955,7 @@ async function testLocalEventHook(name, input) {
6955
6955
  return emitLocalEventHooks({ ...input, hooks: [hook] });
6956
6956
  }
6957
6957
 
6958
- // node_modules/.bun/@hasna+events@0.1.10/node_modules/@hasna/events/dist/index.js
6958
+ // node_modules/.bun/@hasna+events@0.1.11/node_modules/@hasna/events/dist/index.js
6959
6959
  import { chmod, mkdir, readFile, rename, writeFile } from "fs/promises";
6960
6960
  import { existsSync as existsSync6 } from "fs";
6961
6961
  import { homedir } from "os";
@@ -6972,6 +6972,19 @@ function getPathValue(input, path) {
6972
6972
  return;
6973
6973
  }, input);
6974
6974
  }
6975
+ function getFieldValues(input, path) {
6976
+ const values = [];
6977
+ const push = (value) => {
6978
+ if (!values.some((item) => Object.is(item, value)))
6979
+ values.push(value);
6980
+ };
6981
+ if (path.includes(".") && path in input)
6982
+ push(input[path]);
6983
+ const nestedValue = getPathValue(input, path);
6984
+ if (nestedValue !== undefined || !path.includes("."))
6985
+ push(nestedValue);
6986
+ return values;
6987
+ }
6975
6988
  function wildcardToRegExp(pattern, options = {}) {
6976
6989
  let body = "";
6977
6990
  for (let index = 0;index < pattern.length; index += 1) {
@@ -7001,15 +7014,15 @@ function matchRecord(input, matcher) {
7001
7014
  if (!matcher)
7002
7015
  return true;
7003
7016
  return Object.entries(matcher).every(([path, expected]) => {
7004
- const actual = getPathValue(input, path);
7005
- return matchField(actual, expected, path);
7017
+ const actualValues = getFieldValues(input, path);
7018
+ return matchField(actualValues, expected, path);
7006
7019
  });
7007
7020
  }
7008
- function matchField(actual, expected, path) {
7021
+ function matchField(actualValues, expected, path) {
7009
7022
  if (isNegativeMatcher(expected)) {
7010
- return !matchPositiveField(actual, expected.not, path);
7023
+ return !actualValues.some((actual) => matchPositiveField(actual, expected.not, path));
7011
7024
  }
7012
- return matchPositiveField(actual, expected, path);
7025
+ return actualValues.some((actual) => matchPositiveField(actual, expected, path));
7013
7026
  }
7014
7027
  function matchPositiveField(actual, expected, path) {
7015
7028
  if (typeof expected === "string" || Array.isArray(expected)) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.11.60",
3
+ "packageVersion": "0.11.61",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "ab13bc3c275c0fd348e6ff5a2a1a6109002baf04",
6
- "generatedAt": "2026-06-27T12:02:52.731Z"
5
+ "gitCommit": "7dced09f93029fe58db334ff712e10094beefae2",
6
+ "generatedAt": "2026-06-27T14:41:53.504Z"
7
7
  }
@@ -4099,7 +4099,7 @@ var init_event_hooks = __esm(() => {
4099
4099
  VALID_TARGETS = new Set(["stdout", "file", "socket", "script"]);
4100
4100
  });
4101
4101
 
4102
- // node_modules/.bun/@hasna+events@0.1.10/node_modules/@hasna/events/dist/index.js
4102
+ // node_modules/.bun/@hasna+events@0.1.11/node_modules/@hasna/events/dist/index.js
4103
4103
  import { chmod, mkdir, readFile, rename, writeFile } from "fs/promises";
4104
4104
  import { existsSync as existsSync6 } from "fs";
4105
4105
  import { homedir } from "os";
@@ -4116,6 +4116,19 @@ function getPathValue(input, path) {
4116
4116
  return;
4117
4117
  }, input);
4118
4118
  }
4119
+ function getFieldValues(input, path) {
4120
+ const values = [];
4121
+ const push = (value) => {
4122
+ if (!values.some((item) => Object.is(item, value)))
4123
+ values.push(value);
4124
+ };
4125
+ if (path.includes(".") && path in input)
4126
+ push(input[path]);
4127
+ const nestedValue = getPathValue(input, path);
4128
+ if (nestedValue !== undefined || !path.includes("."))
4129
+ push(nestedValue);
4130
+ return values;
4131
+ }
4119
4132
  function wildcardToRegExp(pattern, options = {}) {
4120
4133
  let body = "";
4121
4134
  for (let index = 0;index < pattern.length; index += 1) {
@@ -4145,15 +4158,15 @@ function matchRecord(input, matcher) {
4145
4158
  if (!matcher)
4146
4159
  return true;
4147
4160
  return Object.entries(matcher).every(([path, expected]) => {
4148
- const actual = getPathValue(input, path);
4149
- return matchField(actual, expected, path);
4161
+ const actualValues = getFieldValues(input, path);
4162
+ return matchField(actualValues, expected, path);
4150
4163
  });
4151
4164
  }
4152
- function matchField(actual, expected, path) {
4165
+ function matchField(actualValues, expected, path) {
4153
4166
  if (isNegativeMatcher(expected)) {
4154
- return !matchPositiveField(actual, expected.not, path);
4167
+ return !actualValues.some((actual) => matchPositiveField(actual, expected.not, path));
4155
4168
  }
4156
- return matchPositiveField(actual, expected, path);
4169
+ return actualValues.some((actual) => matchPositiveField(actual, expected, path));
4157
4170
  }
4158
4171
  function matchPositiveField(actual, expected, path) {
4159
4172
  if (typeof expected === "string" || Array.isArray(expected)) {
package/dist/storage.js CHANGED
@@ -4503,7 +4503,7 @@ async function testLocalEventHook(name, input) {
4503
4503
  return emitLocalEventHooks({ ...input, hooks: [hook] });
4504
4504
  }
4505
4505
 
4506
- // node_modules/.bun/@hasna+events@0.1.10/node_modules/@hasna/events/dist/index.js
4506
+ // node_modules/.bun/@hasna+events@0.1.11/node_modules/@hasna/events/dist/index.js
4507
4507
  import { chmod, mkdir, readFile, rename, writeFile } from "fs/promises";
4508
4508
  import { existsSync as existsSync5 } from "fs";
4509
4509
  import { homedir } from "os";
@@ -4520,6 +4520,19 @@ function getPathValue(input, path) {
4520
4520
  return;
4521
4521
  }, input);
4522
4522
  }
4523
+ function getFieldValues(input, path) {
4524
+ const values = [];
4525
+ const push = (value) => {
4526
+ if (!values.some((item) => Object.is(item, value)))
4527
+ values.push(value);
4528
+ };
4529
+ if (path.includes(".") && path in input)
4530
+ push(input[path]);
4531
+ const nestedValue = getPathValue(input, path);
4532
+ if (nestedValue !== undefined || !path.includes("."))
4533
+ push(nestedValue);
4534
+ return values;
4535
+ }
4523
4536
  function wildcardToRegExp(pattern, options = {}) {
4524
4537
  let body = "";
4525
4538
  for (let index = 0;index < pattern.length; index += 1) {
@@ -4549,15 +4562,15 @@ function matchRecord(input, matcher) {
4549
4562
  if (!matcher)
4550
4563
  return true;
4551
4564
  return Object.entries(matcher).every(([path, expected]) => {
4552
- const actual = getPathValue(input, path);
4553
- return matchField(actual, expected, path);
4565
+ const actualValues = getFieldValues(input, path);
4566
+ return matchField(actualValues, expected, path);
4554
4567
  });
4555
4568
  }
4556
- function matchField(actual, expected, path) {
4569
+ function matchField(actualValues, expected, path) {
4557
4570
  if (isNegativeMatcher(expected)) {
4558
- return !matchPositiveField(actual, expected.not, path);
4571
+ return !actualValues.some((actual) => matchPositiveField(actual, expected.not, path));
4559
4572
  }
4560
- return matchPositiveField(actual, expected, path);
4573
+ return actualValues.some((actual) => matchPositiveField(actual, expected, path));
4561
4574
  }
4562
4575
  function matchPositiveField(actual, expected, path) {
4563
4576
  if (typeof expected === "string" || Array.isArray(expected)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.11.60",
3
+ "version": "0.11.61",
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",
@@ -89,7 +89,7 @@
89
89
  "author": "Andrei Hasna <andrei@hasna.com>",
90
90
  "license": "Apache-2.0",
91
91
  "dependencies": {
92
- "@hasna/events": "^0.1.10",
92
+ "@hasna/events": "^0.1.11",
93
93
  "@modelcontextprotocol/sdk": "^1.12.1",
94
94
  "chalk": "^5.4.1",
95
95
  "commander": "^13.1.0",