@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 +19 -6
- package/dist/contracts.js +19 -6
- package/dist/index.js +19 -6
- package/dist/mcp/index.js +19 -6
- package/dist/registry.js +19 -6
- package/dist/release-provenance.json +3 -3
- package/dist/server/index.js +19 -6
- package/dist/storage.js +19 -6
- package/package.json +2 -2
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.
|
|
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
|
|
6289
|
-
return matchField(
|
|
6301
|
+
const actualValues = getFieldValues(input, path);
|
|
6302
|
+
return matchField(actualValues, expected, path);
|
|
6290
6303
|
});
|
|
6291
6304
|
}
|
|
6292
|
-
function matchField(
|
|
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.
|
|
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
|
|
7005
|
-
return matchField(
|
|
7017
|
+
const actualValues = getFieldValues(input, path);
|
|
7018
|
+
return matchField(actualValues, expected, path);
|
|
7006
7019
|
});
|
|
7007
7020
|
}
|
|
7008
|
-
function matchField(
|
|
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.
|
|
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
|
|
7110
|
-
return matchField(
|
|
7122
|
+
const actualValues = getFieldValues(input, path);
|
|
7123
|
+
return matchField(actualValues, expected, path);
|
|
7111
7124
|
});
|
|
7112
7125
|
}
|
|
7113
|
-
function matchField(
|
|
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.
|
|
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
|
|
8788
|
-
return matchField(
|
|
8800
|
+
const actualValues = getFieldValues(input, path);
|
|
8801
|
+
return matchField(actualValues, expected, path);
|
|
8789
8802
|
});
|
|
8790
8803
|
}
|
|
8791
|
-
function matchField(
|
|
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.
|
|
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
|
|
7005
|
-
return matchField(
|
|
7017
|
+
const actualValues = getFieldValues(input, path);
|
|
7018
|
+
return matchField(actualValues, expected, path);
|
|
7006
7019
|
});
|
|
7007
7020
|
}
|
|
7008
|
-
function matchField(
|
|
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.
|
|
3
|
+
"packageVersion": "0.11.61",
|
|
4
4
|
"repository": "https://github.com/hasna/todos.git",
|
|
5
|
-
"gitCommit": "
|
|
6
|
-
"generatedAt": "2026-06-
|
|
5
|
+
"gitCommit": "7dced09f93029fe58db334ff712e10094beefae2",
|
|
6
|
+
"generatedAt": "2026-06-27T14:41:53.504Z"
|
|
7
7
|
}
|
package/dist/server/index.js
CHANGED
|
@@ -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.
|
|
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
|
|
4149
|
-
return matchField(
|
|
4161
|
+
const actualValues = getFieldValues(input, path);
|
|
4162
|
+
return matchField(actualValues, expected, path);
|
|
4150
4163
|
});
|
|
4151
4164
|
}
|
|
4152
|
-
function matchField(
|
|
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.
|
|
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
|
|
4553
|
-
return matchField(
|
|
4565
|
+
const actualValues = getFieldValues(input, path);
|
|
4566
|
+
return matchField(actualValues, expected, path);
|
|
4554
4567
|
});
|
|
4555
4568
|
}
|
|
4556
|
-
function matchField(
|
|
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.
|
|
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.
|
|
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",
|