@hasna/skills 0.7.3 → 0.8.0
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/README.md +48 -18
- package/bin/index.js +1271 -2090
- package/bin/mcp.js +1135 -1955
- package/bin/migrate.js +22 -60
- package/bin/server.js +73576 -20339
- package/bin/worker.js +65159 -19251
- package/dist/admin-contract.js +8 -8
- package/dist/index.js +489 -1184
- package/dist/lib/config.d.ts +3 -23
- package/dist/lib/installer.d.ts +1 -1
- package/dist/lib/portable-skills.d.ts +1 -1
- package/dist/lib/registry-data/index.d.ts +1 -0
- package/dist/lib/registry-types.d.ts +2 -1
- package/dist/lib/registry.d.ts +2 -12
- package/dist/lib/release-dependencies.d.ts +3 -0
- package/dist/lib/skill-aliases.d.ts +2 -3
- package/dist/mcp/mcp-test-client.d.ts +2 -2
- package/dist/sdk/executor.d.ts +5 -5
- package/dist/sdk/index.js +89739 -40379
- package/dist/sdk/registry.d.ts +3 -3
- package/dist/server/config.d.ts +1 -2
- package/dist/server/handlers.d.ts +5 -2
- package/dist/server/registry.d.ts +6 -3
- package/dist/server/skills-api.d.ts +6 -38
- package/dist/storage.js +5 -42
- package/package.json +3 -2
- package/dist/lib/registry-data/business-marketing.d.ts +0 -2
- package/dist/lib/registry-data/communication.d.ts +0 -2
- package/dist/lib/registry-data/content-generation.d.ts +0 -2
- package/dist/lib/registry-data/data-analysis.d.ts +0 -2
- package/dist/lib/registry-data/design-branding.d.ts +0 -2
- package/dist/lib/registry-data/development-tools.d.ts +0 -2
- package/dist/lib/registry-data/education-learning.d.ts +0 -2
- package/dist/lib/registry-data/event-management.d.ts +0 -2
- package/dist/lib/registry-data/finance-compliance.d.ts +0 -2
- package/dist/lib/registry-data/health-wellness.d.ts +0 -2
- package/dist/lib/registry-data/media-processing.d.ts +0 -2
- package/dist/lib/registry-data/productivity-organization.d.ts +0 -2
- package/dist/lib/registry-data/project-management.d.ts +0 -2
- package/dist/lib/registry-data/research-writing.d.ts +0 -2
- package/dist/lib/registry-data/science-academic.d.ts +0 -2
- package/dist/lib/registry-data/travel-lifestyle.d.ts +0 -2
- package/dist/lib/registry-data/web-browser.d.ts +0 -2
- package/dist/server/seed-bundled.d.ts +0 -20
package/dist/index.js
CHANGED
|
@@ -46,7 +46,7 @@ var __export = (target, all) => {
|
|
|
46
46
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
47
47
|
var __require = import.meta.require;
|
|
48
48
|
|
|
49
|
-
//
|
|
49
|
+
// node_modules/yaml/dist/nodes/identity.js
|
|
50
50
|
var require_identity = __commonJS((exports) => {
|
|
51
51
|
var ALIAS = Symbol.for("yaml.alias");
|
|
52
52
|
var DOC = Symbol.for("yaml.document");
|
|
@@ -100,7 +100,7 @@ var require_identity = __commonJS((exports) => {
|
|
|
100
100
|
exports.isSeq = isSeq;
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
-
//
|
|
103
|
+
// node_modules/yaml/dist/visit.js
|
|
104
104
|
var require_visit = __commonJS((exports) => {
|
|
105
105
|
var identity = require_identity();
|
|
106
106
|
var BREAK = Symbol("break visit");
|
|
@@ -255,7 +255,7 @@ var require_visit = __commonJS((exports) => {
|
|
|
255
255
|
exports.visitAsync = visitAsync;
|
|
256
256
|
});
|
|
257
257
|
|
|
258
|
-
//
|
|
258
|
+
// node_modules/yaml/dist/doc/directives.js
|
|
259
259
|
var require_directives = __commonJS((exports) => {
|
|
260
260
|
var identity = require_identity();
|
|
261
261
|
var visit = require_visit();
|
|
@@ -407,7 +407,7 @@ var require_directives = __commonJS((exports) => {
|
|
|
407
407
|
exports.Directives = Directives;
|
|
408
408
|
});
|
|
409
409
|
|
|
410
|
-
//
|
|
410
|
+
// node_modules/yaml/dist/doc/anchors.js
|
|
411
411
|
var require_anchors = __commonJS((exports) => {
|
|
412
412
|
var identity = require_identity();
|
|
413
413
|
var visit = require_visit();
|
|
@@ -469,7 +469,7 @@ var require_anchors = __commonJS((exports) => {
|
|
|
469
469
|
exports.findNewAnchor = findNewAnchor;
|
|
470
470
|
});
|
|
471
471
|
|
|
472
|
-
//
|
|
472
|
+
// node_modules/yaml/dist/doc/applyReviver.js
|
|
473
473
|
var require_applyReviver = __commonJS((exports) => {
|
|
474
474
|
function applyReviver(reviver, obj, key, val) {
|
|
475
475
|
if (val && typeof val === "object") {
|
|
@@ -516,7 +516,7 @@ var require_applyReviver = __commonJS((exports) => {
|
|
|
516
516
|
exports.applyReviver = applyReviver;
|
|
517
517
|
});
|
|
518
518
|
|
|
519
|
-
//
|
|
519
|
+
// node_modules/yaml/dist/nodes/toJS.js
|
|
520
520
|
var require_toJS = __commonJS((exports) => {
|
|
521
521
|
var identity = require_identity();
|
|
522
522
|
function toJS(value, arg, ctx) {
|
|
@@ -543,7 +543,7 @@ var require_toJS = __commonJS((exports) => {
|
|
|
543
543
|
exports.toJS = toJS;
|
|
544
544
|
});
|
|
545
545
|
|
|
546
|
-
//
|
|
546
|
+
// node_modules/yaml/dist/nodes/Node.js
|
|
547
547
|
var require_Node = __commonJS((exports) => {
|
|
548
548
|
var applyReviver = require_applyReviver();
|
|
549
549
|
var identity = require_identity();
|
|
@@ -580,7 +580,7 @@ var require_Node = __commonJS((exports) => {
|
|
|
580
580
|
exports.NodeBase = NodeBase;
|
|
581
581
|
});
|
|
582
582
|
|
|
583
|
-
//
|
|
583
|
+
// node_modules/yaml/dist/nodes/Alias.js
|
|
584
584
|
var require_Alias = __commonJS((exports) => {
|
|
585
585
|
var anchors = require_anchors();
|
|
586
586
|
var visit = require_visit();
|
|
@@ -690,7 +690,7 @@ var require_Alias = __commonJS((exports) => {
|
|
|
690
690
|
exports.Alias = Alias;
|
|
691
691
|
});
|
|
692
692
|
|
|
693
|
-
//
|
|
693
|
+
// node_modules/yaml/dist/nodes/Scalar.js
|
|
694
694
|
var require_Scalar = __commonJS((exports) => {
|
|
695
695
|
var identity = require_identity();
|
|
696
696
|
var Node = require_Node();
|
|
@@ -718,7 +718,7 @@ var require_Scalar = __commonJS((exports) => {
|
|
|
718
718
|
exports.isScalarValue = isScalarValue;
|
|
719
719
|
});
|
|
720
720
|
|
|
721
|
-
//
|
|
721
|
+
// node_modules/yaml/dist/doc/createNode.js
|
|
722
722
|
var require_createNode = __commonJS((exports) => {
|
|
723
723
|
var Alias = require_Alias();
|
|
724
724
|
var identity = require_identity();
|
|
@@ -790,7 +790,7 @@ var require_createNode = __commonJS((exports) => {
|
|
|
790
790
|
exports.createNode = createNode;
|
|
791
791
|
});
|
|
792
792
|
|
|
793
|
-
//
|
|
793
|
+
// node_modules/yaml/dist/nodes/Collection.js
|
|
794
794
|
var require_Collection = __commonJS((exports) => {
|
|
795
795
|
var createNode = require_createNode();
|
|
796
796
|
var identity = require_identity();
|
|
@@ -905,7 +905,7 @@ var require_Collection = __commonJS((exports) => {
|
|
|
905
905
|
exports.isEmptyPath = isEmptyPath;
|
|
906
906
|
});
|
|
907
907
|
|
|
908
|
-
//
|
|
908
|
+
// node_modules/yaml/dist/stringify/stringifyComment.js
|
|
909
909
|
var require_stringifyComment = __commonJS((exports) => {
|
|
910
910
|
var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#");
|
|
911
911
|
function indentComment(comment, indent) {
|
|
@@ -922,7 +922,7 @@ var require_stringifyComment = __commonJS((exports) => {
|
|
|
922
922
|
exports.stringifyComment = stringifyComment;
|
|
923
923
|
});
|
|
924
924
|
|
|
925
|
-
//
|
|
925
|
+
// node_modules/yaml/dist/stringify/foldFlowLines.js
|
|
926
926
|
var require_foldFlowLines = __commonJS((exports) => {
|
|
927
927
|
var FOLD_FLOW = "flow";
|
|
928
928
|
var FOLD_BLOCK = "block";
|
|
@@ -1059,7 +1059,7 @@ ${indent}${text2.slice(fold + 1, end2)}`;
|
|
|
1059
1059
|
exports.foldFlowLines = foldFlowLines;
|
|
1060
1060
|
});
|
|
1061
1061
|
|
|
1062
|
-
//
|
|
1062
|
+
// node_modules/yaml/dist/stringify/stringifyString.js
|
|
1063
1063
|
var require_stringifyString = __commonJS((exports) => {
|
|
1064
1064
|
var Scalar = require_Scalar();
|
|
1065
1065
|
var foldFlowLines = require_foldFlowLines();
|
|
@@ -1357,7 +1357,7 @@ ${indent}`);
|
|
|
1357
1357
|
exports.stringifyString = stringifyString;
|
|
1358
1358
|
});
|
|
1359
1359
|
|
|
1360
|
-
//
|
|
1360
|
+
// node_modules/yaml/dist/stringify/stringify.js
|
|
1361
1361
|
var require_stringify = __commonJS((exports) => {
|
|
1362
1362
|
var anchors = require_anchors();
|
|
1363
1363
|
var identity = require_identity();
|
|
@@ -1478,7 +1478,7 @@ ${ctx.indent}${str}`;
|
|
|
1478
1478
|
exports.stringify = stringify;
|
|
1479
1479
|
});
|
|
1480
1480
|
|
|
1481
|
-
//
|
|
1481
|
+
// node_modules/yaml/dist/stringify/stringifyPair.js
|
|
1482
1482
|
var require_stringifyPair = __commonJS((exports) => {
|
|
1483
1483
|
var identity = require_identity();
|
|
1484
1484
|
var Scalar = require_Scalar();
|
|
@@ -1614,7 +1614,7 @@ ${ctx.indent}`;
|
|
|
1614
1614
|
exports.stringifyPair = stringifyPair;
|
|
1615
1615
|
});
|
|
1616
1616
|
|
|
1617
|
-
//
|
|
1617
|
+
// node_modules/yaml/dist/log.js
|
|
1618
1618
|
var require_log = __commonJS((exports) => {
|
|
1619
1619
|
var node_process = __require("process");
|
|
1620
1620
|
function debug(logLevel, ...messages) {
|
|
@@ -1633,7 +1633,7 @@ var require_log = __commonJS((exports) => {
|
|
|
1633
1633
|
exports.warn = warn;
|
|
1634
1634
|
});
|
|
1635
1635
|
|
|
1636
|
-
//
|
|
1636
|
+
// node_modules/yaml/dist/schema/yaml-1.1/merge.js
|
|
1637
1637
|
var require_merge = __commonJS((exports) => {
|
|
1638
1638
|
var identity = require_identity();
|
|
1639
1639
|
var Scalar = require_Scalar();
|
|
@@ -1690,7 +1690,7 @@ var require_merge = __commonJS((exports) => {
|
|
|
1690
1690
|
exports.merge = merge;
|
|
1691
1691
|
});
|
|
1692
1692
|
|
|
1693
|
-
//
|
|
1693
|
+
// node_modules/yaml/dist/nodes/addPairToJSMap.js
|
|
1694
1694
|
var require_addPairToJSMap = __commonJS((exports) => {
|
|
1695
1695
|
var log = require_log();
|
|
1696
1696
|
var merge = require_merge();
|
|
@@ -1751,7 +1751,7 @@ var require_addPairToJSMap = __commonJS((exports) => {
|
|
|
1751
1751
|
exports.addPairToJSMap = addPairToJSMap;
|
|
1752
1752
|
});
|
|
1753
1753
|
|
|
1754
|
-
//
|
|
1754
|
+
// node_modules/yaml/dist/nodes/Pair.js
|
|
1755
1755
|
var require_Pair = __commonJS((exports) => {
|
|
1756
1756
|
var createNode = require_createNode();
|
|
1757
1757
|
var stringifyPair = require_stringifyPair();
|
|
@@ -1789,7 +1789,7 @@ var require_Pair = __commonJS((exports) => {
|
|
|
1789
1789
|
exports.createPair = createPair;
|
|
1790
1790
|
});
|
|
1791
1791
|
|
|
1792
|
-
//
|
|
1792
|
+
// node_modules/yaml/dist/stringify/stringifyCollection.js
|
|
1793
1793
|
var require_stringifyCollection = __commonJS((exports) => {
|
|
1794
1794
|
var identity = require_identity();
|
|
1795
1795
|
var stringify = require_stringify();
|
|
@@ -1941,7 +1941,7 @@ ${indent}${end}`;
|
|
|
1941
1941
|
exports.stringifyCollection = stringifyCollection;
|
|
1942
1942
|
});
|
|
1943
1943
|
|
|
1944
|
-
//
|
|
1944
|
+
// node_modules/yaml/dist/nodes/YAMLMap.js
|
|
1945
1945
|
var require_YAMLMap = __commonJS((exports) => {
|
|
1946
1946
|
var stringifyCollection = require_stringifyCollection();
|
|
1947
1947
|
var addPairToJSMap = require_addPairToJSMap();
|
|
@@ -2068,7 +2068,7 @@ var require_YAMLMap = __commonJS((exports) => {
|
|
|
2068
2068
|
exports.findPair = findPair;
|
|
2069
2069
|
});
|
|
2070
2070
|
|
|
2071
|
-
//
|
|
2071
|
+
// node_modules/yaml/dist/schema/common/map.js
|
|
2072
2072
|
var require_map = __commonJS((exports) => {
|
|
2073
2073
|
var identity = require_identity();
|
|
2074
2074
|
var YAMLMap = require_YAMLMap();
|
|
@@ -2087,7 +2087,7 @@ var require_map = __commonJS((exports) => {
|
|
|
2087
2087
|
exports.map = map;
|
|
2088
2088
|
});
|
|
2089
2089
|
|
|
2090
|
-
//
|
|
2090
|
+
// node_modules/yaml/dist/nodes/YAMLSeq.js
|
|
2091
2091
|
var require_YAMLSeq = __commonJS((exports) => {
|
|
2092
2092
|
var createNode = require_createNode();
|
|
2093
2093
|
var stringifyCollection = require_stringifyCollection();
|
|
@@ -2180,7 +2180,7 @@ var require_YAMLSeq = __commonJS((exports) => {
|
|
|
2180
2180
|
exports.YAMLSeq = YAMLSeq;
|
|
2181
2181
|
});
|
|
2182
2182
|
|
|
2183
|
-
//
|
|
2183
|
+
// node_modules/yaml/dist/schema/common/seq.js
|
|
2184
2184
|
var require_seq = __commonJS((exports) => {
|
|
2185
2185
|
var identity = require_identity();
|
|
2186
2186
|
var YAMLSeq = require_YAMLSeq();
|
|
@@ -2199,7 +2199,7 @@ var require_seq = __commonJS((exports) => {
|
|
|
2199
2199
|
exports.seq = seq;
|
|
2200
2200
|
});
|
|
2201
2201
|
|
|
2202
|
-
//
|
|
2202
|
+
// node_modules/yaml/dist/schema/common/string.js
|
|
2203
2203
|
var require_string = __commonJS((exports) => {
|
|
2204
2204
|
var stringifyString = require_stringifyString();
|
|
2205
2205
|
var string = {
|
|
@@ -2215,7 +2215,7 @@ var require_string = __commonJS((exports) => {
|
|
|
2215
2215
|
exports.string = string;
|
|
2216
2216
|
});
|
|
2217
2217
|
|
|
2218
|
-
//
|
|
2218
|
+
// node_modules/yaml/dist/schema/common/null.js
|
|
2219
2219
|
var require_null = __commonJS((exports) => {
|
|
2220
2220
|
var Scalar = require_Scalar();
|
|
2221
2221
|
var nullTag = {
|
|
@@ -2230,7 +2230,7 @@ var require_null = __commonJS((exports) => {
|
|
|
2230
2230
|
exports.nullTag = nullTag;
|
|
2231
2231
|
});
|
|
2232
2232
|
|
|
2233
|
-
//
|
|
2233
|
+
// node_modules/yaml/dist/schema/core/bool.js
|
|
2234
2234
|
var require_bool = __commonJS((exports) => {
|
|
2235
2235
|
var Scalar = require_Scalar();
|
|
2236
2236
|
var boolTag = {
|
|
@@ -2251,7 +2251,7 @@ var require_bool = __commonJS((exports) => {
|
|
|
2251
2251
|
exports.boolTag = boolTag;
|
|
2252
2252
|
});
|
|
2253
2253
|
|
|
2254
|
-
//
|
|
2254
|
+
// node_modules/yaml/dist/stringify/stringifyNumber.js
|
|
2255
2255
|
var require_stringifyNumber = __commonJS((exports) => {
|
|
2256
2256
|
function stringifyNumber({ format, minFractionDigits, tag, value }) {
|
|
2257
2257
|
if (typeof value === "bigint")
|
|
@@ -2275,7 +2275,7 @@ var require_stringifyNumber = __commonJS((exports) => {
|
|
|
2275
2275
|
exports.stringifyNumber = stringifyNumber;
|
|
2276
2276
|
});
|
|
2277
2277
|
|
|
2278
|
-
//
|
|
2278
|
+
// node_modules/yaml/dist/schema/core/float.js
|
|
2279
2279
|
var require_float = __commonJS((exports) => {
|
|
2280
2280
|
var Scalar = require_Scalar();
|
|
2281
2281
|
var stringifyNumber = require_stringifyNumber();
|
|
@@ -2318,7 +2318,7 @@ var require_float = __commonJS((exports) => {
|
|
|
2318
2318
|
exports.floatNaN = floatNaN;
|
|
2319
2319
|
});
|
|
2320
2320
|
|
|
2321
|
-
//
|
|
2321
|
+
// node_modules/yaml/dist/schema/core/int.js
|
|
2322
2322
|
var require_int = __commonJS((exports) => {
|
|
2323
2323
|
var stringifyNumber = require_stringifyNumber();
|
|
2324
2324
|
var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
@@ -2360,7 +2360,7 @@ var require_int = __commonJS((exports) => {
|
|
|
2360
2360
|
exports.intOct = intOct;
|
|
2361
2361
|
});
|
|
2362
2362
|
|
|
2363
|
-
//
|
|
2363
|
+
// node_modules/yaml/dist/schema/core/schema.js
|
|
2364
2364
|
var require_schema = __commonJS((exports) => {
|
|
2365
2365
|
var map = require_map();
|
|
2366
2366
|
var _null = require_null();
|
|
@@ -2385,7 +2385,7 @@ var require_schema = __commonJS((exports) => {
|
|
|
2385
2385
|
exports.schema = schema;
|
|
2386
2386
|
});
|
|
2387
2387
|
|
|
2388
|
-
//
|
|
2388
|
+
// node_modules/yaml/dist/schema/json/schema.js
|
|
2389
2389
|
var require_schema2 = __commonJS((exports) => {
|
|
2390
2390
|
var Scalar = require_Scalar();
|
|
2391
2391
|
var map = require_map();
|
|
@@ -2449,7 +2449,7 @@ var require_schema2 = __commonJS((exports) => {
|
|
|
2449
2449
|
exports.schema = schema;
|
|
2450
2450
|
});
|
|
2451
2451
|
|
|
2452
|
-
//
|
|
2452
|
+
// node_modules/yaml/dist/schema/yaml-1.1/binary.js
|
|
2453
2453
|
var require_binary = __commonJS((exports) => {
|
|
2454
2454
|
var node_buffer = __require("buffer");
|
|
2455
2455
|
var Scalar = require_Scalar();
|
|
@@ -2504,7 +2504,7 @@ var require_binary = __commonJS((exports) => {
|
|
|
2504
2504
|
exports.binary = binary;
|
|
2505
2505
|
});
|
|
2506
2506
|
|
|
2507
|
-
//
|
|
2507
|
+
// node_modules/yaml/dist/schema/yaml-1.1/pairs.js
|
|
2508
2508
|
var require_pairs = __commonJS((exports) => {
|
|
2509
2509
|
var identity = require_identity();
|
|
2510
2510
|
var Pair = require_Pair();
|
|
@@ -2579,7 +2579,7 @@ ${cn.comment}` : item.comment;
|
|
|
2579
2579
|
exports.resolvePairs = resolvePairs;
|
|
2580
2580
|
});
|
|
2581
2581
|
|
|
2582
|
-
//
|
|
2582
|
+
// node_modules/yaml/dist/schema/yaml-1.1/omap.js
|
|
2583
2583
|
var require_omap = __commonJS((exports) => {
|
|
2584
2584
|
var identity = require_identity();
|
|
2585
2585
|
var toJS = require_toJS();
|
|
@@ -2651,7 +2651,7 @@ var require_omap = __commonJS((exports) => {
|
|
|
2651
2651
|
exports.omap = omap;
|
|
2652
2652
|
});
|
|
2653
2653
|
|
|
2654
|
-
//
|
|
2654
|
+
// node_modules/yaml/dist/schema/yaml-1.1/bool.js
|
|
2655
2655
|
var require_bool2 = __commonJS((exports) => {
|
|
2656
2656
|
var Scalar = require_Scalar();
|
|
2657
2657
|
function boolStringify({ value, source }, ctx) {
|
|
@@ -2680,7 +2680,7 @@ var require_bool2 = __commonJS((exports) => {
|
|
|
2680
2680
|
exports.trueTag = trueTag;
|
|
2681
2681
|
});
|
|
2682
2682
|
|
|
2683
|
-
//
|
|
2683
|
+
// node_modules/yaml/dist/schema/yaml-1.1/float.js
|
|
2684
2684
|
var require_float2 = __commonJS((exports) => {
|
|
2685
2685
|
var Scalar = require_Scalar();
|
|
2686
2686
|
var stringifyNumber = require_stringifyNumber();
|
|
@@ -2726,7 +2726,7 @@ var require_float2 = __commonJS((exports) => {
|
|
|
2726
2726
|
exports.floatNaN = floatNaN;
|
|
2727
2727
|
});
|
|
2728
2728
|
|
|
2729
|
-
//
|
|
2729
|
+
// node_modules/yaml/dist/schema/yaml-1.1/int.js
|
|
2730
2730
|
var require_int2 = __commonJS((exports) => {
|
|
2731
2731
|
var stringifyNumber = require_stringifyNumber();
|
|
2732
2732
|
var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
@@ -2802,7 +2802,7 @@ var require_int2 = __commonJS((exports) => {
|
|
|
2802
2802
|
exports.intOct = intOct;
|
|
2803
2803
|
});
|
|
2804
2804
|
|
|
2805
|
-
//
|
|
2805
|
+
// node_modules/yaml/dist/schema/yaml-1.1/set.js
|
|
2806
2806
|
var require_set = __commonJS((exports) => {
|
|
2807
2807
|
var identity = require_identity();
|
|
2808
2808
|
var Pair = require_Pair();
|
|
@@ -2885,7 +2885,7 @@ var require_set = __commonJS((exports) => {
|
|
|
2885
2885
|
exports.set = set;
|
|
2886
2886
|
});
|
|
2887
2887
|
|
|
2888
|
-
//
|
|
2888
|
+
// node_modules/yaml/dist/schema/yaml-1.1/timestamp.js
|
|
2889
2889
|
var require_timestamp = __commonJS((exports) => {
|
|
2890
2890
|
var stringifyNumber = require_stringifyNumber();
|
|
2891
2891
|
function parseSexagesimal(str, asBigInt) {
|
|
@@ -2967,7 +2967,7 @@ var require_timestamp = __commonJS((exports) => {
|
|
|
2967
2967
|
exports.timestamp = timestamp;
|
|
2968
2968
|
});
|
|
2969
2969
|
|
|
2970
|
-
//
|
|
2970
|
+
// node_modules/yaml/dist/schema/yaml-1.1/schema.js
|
|
2971
2971
|
var require_schema3 = __commonJS((exports) => {
|
|
2972
2972
|
var map = require_map();
|
|
2973
2973
|
var _null = require_null();
|
|
@@ -3008,7 +3008,7 @@ var require_schema3 = __commonJS((exports) => {
|
|
|
3008
3008
|
exports.schema = schema;
|
|
3009
3009
|
});
|
|
3010
3010
|
|
|
3011
|
-
//
|
|
3011
|
+
// node_modules/yaml/dist/schema/tags.js
|
|
3012
3012
|
var require_tags = __commonJS((exports) => {
|
|
3013
3013
|
var map = require_map();
|
|
3014
3014
|
var _null = require_null();
|
|
@@ -3099,7 +3099,7 @@ var require_tags = __commonJS((exports) => {
|
|
|
3099
3099
|
exports.getTags = getTags;
|
|
3100
3100
|
});
|
|
3101
3101
|
|
|
3102
|
-
//
|
|
3102
|
+
// node_modules/yaml/dist/schema/Schema.js
|
|
3103
3103
|
var require_Schema = __commonJS((exports) => {
|
|
3104
3104
|
var identity = require_identity();
|
|
3105
3105
|
var map = require_map();
|
|
@@ -3129,7 +3129,7 @@ var require_Schema = __commonJS((exports) => {
|
|
|
3129
3129
|
exports.Schema = Schema;
|
|
3130
3130
|
});
|
|
3131
3131
|
|
|
3132
|
-
//
|
|
3132
|
+
// node_modules/yaml/dist/stringify/stringifyDocument.js
|
|
3133
3133
|
var require_stringifyDocument = __commonJS((exports) => {
|
|
3134
3134
|
var identity = require_identity();
|
|
3135
3135
|
var stringify = require_stringify();
|
|
@@ -3209,7 +3209,7 @@ var require_stringifyDocument = __commonJS((exports) => {
|
|
|
3209
3209
|
exports.stringifyDocument = stringifyDocument;
|
|
3210
3210
|
});
|
|
3211
3211
|
|
|
3212
|
-
//
|
|
3212
|
+
// node_modules/yaml/dist/doc/Document.js
|
|
3213
3213
|
var require_Document = __commonJS((exports) => {
|
|
3214
3214
|
var Alias = require_Alias();
|
|
3215
3215
|
var Collection = require_Collection();
|
|
@@ -3444,7 +3444,7 @@ var require_Document = __commonJS((exports) => {
|
|
|
3444
3444
|
exports.Document = Document;
|
|
3445
3445
|
});
|
|
3446
3446
|
|
|
3447
|
-
//
|
|
3447
|
+
// node_modules/yaml/dist/errors.js
|
|
3448
3448
|
var require_errors = __commonJS((exports) => {
|
|
3449
3449
|
class YAMLError extends Error {
|
|
3450
3450
|
constructor(name, pos, code, message) {
|
|
@@ -3509,7 +3509,7 @@ ${pointer}
|
|
|
3509
3509
|
exports.prettifyError = prettifyError;
|
|
3510
3510
|
});
|
|
3511
3511
|
|
|
3512
|
-
//
|
|
3512
|
+
// node_modules/yaml/dist/compose/resolve-props.js
|
|
3513
3513
|
var require_resolve_props = __commonJS((exports) => {
|
|
3514
3514
|
function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {
|
|
3515
3515
|
let spaceBefore = false;
|
|
@@ -3639,7 +3639,7 @@ var require_resolve_props = __commonJS((exports) => {
|
|
|
3639
3639
|
exports.resolveProps = resolveProps;
|
|
3640
3640
|
});
|
|
3641
3641
|
|
|
3642
|
-
//
|
|
3642
|
+
// node_modules/yaml/dist/compose/util-contains-newline.js
|
|
3643
3643
|
var require_util_contains_newline = __commonJS((exports) => {
|
|
3644
3644
|
function containsNewline(key) {
|
|
3645
3645
|
if (!key)
|
|
@@ -3679,7 +3679,7 @@ var require_util_contains_newline = __commonJS((exports) => {
|
|
|
3679
3679
|
exports.containsNewline = containsNewline;
|
|
3680
3680
|
});
|
|
3681
3681
|
|
|
3682
|
-
//
|
|
3682
|
+
// node_modules/yaml/dist/compose/util-flow-indent-check.js
|
|
3683
3683
|
var require_util_flow_indent_check = __commonJS((exports) => {
|
|
3684
3684
|
var utilContainsNewline = require_util_contains_newline();
|
|
3685
3685
|
function flowIndentCheck(indent, fc, onError) {
|
|
@@ -3694,7 +3694,7 @@ var require_util_flow_indent_check = __commonJS((exports) => {
|
|
|
3694
3694
|
exports.flowIndentCheck = flowIndentCheck;
|
|
3695
3695
|
});
|
|
3696
3696
|
|
|
3697
|
-
//
|
|
3697
|
+
// node_modules/yaml/dist/compose/util-map-includes.js
|
|
3698
3698
|
var require_util_map_includes = __commonJS((exports) => {
|
|
3699
3699
|
var identity = require_identity();
|
|
3700
3700
|
function mapIncludes(ctx, items, search) {
|
|
@@ -3707,7 +3707,7 @@ var require_util_map_includes = __commonJS((exports) => {
|
|
|
3707
3707
|
exports.mapIncludes = mapIncludes;
|
|
3708
3708
|
});
|
|
3709
3709
|
|
|
3710
|
-
//
|
|
3710
|
+
// node_modules/yaml/dist/compose/resolve-block-map.js
|
|
3711
3711
|
var require_resolve_block_map = __commonJS((exports) => {
|
|
3712
3712
|
var Pair = require_Pair();
|
|
3713
3713
|
var YAMLMap = require_YAMLMap();
|
|
@@ -3814,7 +3814,7 @@ var require_resolve_block_map = __commonJS((exports) => {
|
|
|
3814
3814
|
exports.resolveBlockMap = resolveBlockMap;
|
|
3815
3815
|
});
|
|
3816
3816
|
|
|
3817
|
-
//
|
|
3817
|
+
// node_modules/yaml/dist/compose/resolve-block-seq.js
|
|
3818
3818
|
var require_resolve_block_seq = __commonJS((exports) => {
|
|
3819
3819
|
var YAMLSeq = require_YAMLSeq();
|
|
3820
3820
|
var resolveProps = require_resolve_props();
|
|
@@ -3862,7 +3862,7 @@ var require_resolve_block_seq = __commonJS((exports) => {
|
|
|
3862
3862
|
exports.resolveBlockSeq = resolveBlockSeq;
|
|
3863
3863
|
});
|
|
3864
3864
|
|
|
3865
|
-
//
|
|
3865
|
+
// node_modules/yaml/dist/compose/resolve-end.js
|
|
3866
3866
|
var require_resolve_end = __commonJS((exports) => {
|
|
3867
3867
|
function resolveEnd(end, offset, reqSpace, onError) {
|
|
3868
3868
|
let comment = "";
|
|
@@ -3902,7 +3902,7 @@ var require_resolve_end = __commonJS((exports) => {
|
|
|
3902
3902
|
exports.resolveEnd = resolveEnd;
|
|
3903
3903
|
});
|
|
3904
3904
|
|
|
3905
|
-
//
|
|
3905
|
+
// node_modules/yaml/dist/compose/resolve-flow-collection.js
|
|
3906
3906
|
var require_resolve_flow_collection = __commonJS((exports) => {
|
|
3907
3907
|
var identity = require_identity();
|
|
3908
3908
|
var Pair = require_Pair();
|
|
@@ -4093,7 +4093,7 @@ var require_resolve_flow_collection = __commonJS((exports) => {
|
|
|
4093
4093
|
exports.resolveFlowCollection = resolveFlowCollection;
|
|
4094
4094
|
});
|
|
4095
4095
|
|
|
4096
|
-
//
|
|
4096
|
+
// node_modules/yaml/dist/compose/compose-collection.js
|
|
4097
4097
|
var require_compose_collection = __commonJS((exports) => {
|
|
4098
4098
|
var identity = require_identity();
|
|
4099
4099
|
var Scalar = require_Scalar();
|
|
@@ -4155,7 +4155,7 @@ var require_compose_collection = __commonJS((exports) => {
|
|
|
4155
4155
|
exports.composeCollection = composeCollection;
|
|
4156
4156
|
});
|
|
4157
4157
|
|
|
4158
|
-
//
|
|
4158
|
+
// node_modules/yaml/dist/compose/resolve-block-scalar.js
|
|
4159
4159
|
var require_resolve_block_scalar = __commonJS((exports) => {
|
|
4160
4160
|
var Scalar = require_Scalar();
|
|
4161
4161
|
function resolveBlockScalar(ctx, scalar, onError) {
|
|
@@ -4348,7 +4348,7 @@ var require_resolve_block_scalar = __commonJS((exports) => {
|
|
|
4348
4348
|
exports.resolveBlockScalar = resolveBlockScalar;
|
|
4349
4349
|
});
|
|
4350
4350
|
|
|
4351
|
-
//
|
|
4351
|
+
// node_modules/yaml/dist/compose/resolve-flow-scalar.js
|
|
4352
4352
|
var require_resolve_flow_scalar = __commonJS((exports) => {
|
|
4353
4353
|
var Scalar = require_Scalar();
|
|
4354
4354
|
var resolveEnd = require_resolve_end();
|
|
@@ -4565,7 +4565,7 @@ var require_resolve_flow_scalar = __commonJS((exports) => {
|
|
|
4565
4565
|
exports.resolveFlowScalar = resolveFlowScalar;
|
|
4566
4566
|
});
|
|
4567
4567
|
|
|
4568
|
-
//
|
|
4568
|
+
// node_modules/yaml/dist/compose/compose-scalar.js
|
|
4569
4569
|
var require_compose_scalar = __commonJS((exports) => {
|
|
4570
4570
|
var identity = require_identity();
|
|
4571
4571
|
var Scalar = require_Scalar();
|
|
@@ -4643,7 +4643,7 @@ var require_compose_scalar = __commonJS((exports) => {
|
|
|
4643
4643
|
exports.composeScalar = composeScalar;
|
|
4644
4644
|
});
|
|
4645
4645
|
|
|
4646
|
-
//
|
|
4646
|
+
// node_modules/yaml/dist/compose/util-empty-scalar-position.js
|
|
4647
4647
|
var require_util_empty_scalar_position = __commonJS((exports) => {
|
|
4648
4648
|
function emptyScalarPosition(offset, before, pos) {
|
|
4649
4649
|
if (before) {
|
|
@@ -4670,7 +4670,7 @@ var require_util_empty_scalar_position = __commonJS((exports) => {
|
|
|
4670
4670
|
exports.emptyScalarPosition = emptyScalarPosition;
|
|
4671
4671
|
});
|
|
4672
4672
|
|
|
4673
|
-
//
|
|
4673
|
+
// node_modules/yaml/dist/compose/compose-node.js
|
|
4674
4674
|
var require_compose_node = __commonJS((exports) => {
|
|
4675
4675
|
var Alias = require_Alias();
|
|
4676
4676
|
var identity = require_identity();
|
|
@@ -4773,7 +4773,7 @@ var require_compose_node = __commonJS((exports) => {
|
|
|
4773
4773
|
exports.composeNode = composeNode;
|
|
4774
4774
|
});
|
|
4775
4775
|
|
|
4776
|
-
//
|
|
4776
|
+
// node_modules/yaml/dist/compose/compose-doc.js
|
|
4777
4777
|
var require_compose_doc = __commonJS((exports) => {
|
|
4778
4778
|
var Document = require_Document();
|
|
4779
4779
|
var composeNode = require_compose_node();
|
|
@@ -4813,7 +4813,7 @@ var require_compose_doc = __commonJS((exports) => {
|
|
|
4813
4813
|
exports.composeDoc = composeDoc;
|
|
4814
4814
|
});
|
|
4815
4815
|
|
|
4816
|
-
//
|
|
4816
|
+
// node_modules/yaml/dist/compose/composer.js
|
|
4817
4817
|
var require_composer = __commonJS((exports) => {
|
|
4818
4818
|
var node_process = __require("process");
|
|
4819
4819
|
var directives = require_directives();
|
|
@@ -5004,7 +5004,7 @@ ${end.comment}` : end.comment;
|
|
|
5004
5004
|
exports.Composer = Composer;
|
|
5005
5005
|
});
|
|
5006
5006
|
|
|
5007
|
-
//
|
|
5007
|
+
// node_modules/yaml/dist/parse/cst-scalar.js
|
|
5008
5008
|
var require_cst_scalar = __commonJS((exports) => {
|
|
5009
5009
|
var resolveBlockScalar = require_resolve_block_scalar();
|
|
5010
5010
|
var resolveFlowScalar = require_resolve_flow_scalar();
|
|
@@ -5194,7 +5194,7 @@ var require_cst_scalar = __commonJS((exports) => {
|
|
|
5194
5194
|
exports.setScalarValue = setScalarValue;
|
|
5195
5195
|
});
|
|
5196
5196
|
|
|
5197
|
-
//
|
|
5197
|
+
// node_modules/yaml/dist/parse/cst-stringify.js
|
|
5198
5198
|
var require_cst_stringify = __commonJS((exports) => {
|
|
5199
5199
|
var stringify = (cst) => ("type" in cst) ? stringifyToken(cst) : stringifyItem(cst);
|
|
5200
5200
|
function stringifyToken(token) {
|
|
@@ -5252,7 +5252,7 @@ var require_cst_stringify = __commonJS((exports) => {
|
|
|
5252
5252
|
exports.stringify = stringify;
|
|
5253
5253
|
});
|
|
5254
5254
|
|
|
5255
|
-
//
|
|
5255
|
+
// node_modules/yaml/dist/parse/cst-visit.js
|
|
5256
5256
|
var require_cst_visit = __commonJS((exports) => {
|
|
5257
5257
|
var BREAK = Symbol("break visit");
|
|
5258
5258
|
var SKIP = Symbol("skip children");
|
|
@@ -5311,7 +5311,7 @@ var require_cst_visit = __commonJS((exports) => {
|
|
|
5311
5311
|
exports.visit = visit;
|
|
5312
5312
|
});
|
|
5313
5313
|
|
|
5314
|
-
//
|
|
5314
|
+
// node_modules/yaml/dist/parse/cst.js
|
|
5315
5315
|
var require_cst = __commonJS((exports) => {
|
|
5316
5316
|
var cstScalar = require_cst_scalar();
|
|
5317
5317
|
var cstStringify = require_cst_stringify();
|
|
@@ -5412,7 +5412,7 @@ var require_cst = __commonJS((exports) => {
|
|
|
5412
5412
|
exports.tokenType = tokenType;
|
|
5413
5413
|
});
|
|
5414
5414
|
|
|
5415
|
-
//
|
|
5415
|
+
// node_modules/yaml/dist/parse/lexer.js
|
|
5416
5416
|
var require_lexer = __commonJS((exports) => {
|
|
5417
5417
|
var cst = require_cst();
|
|
5418
5418
|
function isEmpty(ch) {
|
|
@@ -6009,7 +6009,7 @@ var require_lexer = __commonJS((exports) => {
|
|
|
6009
6009
|
exports.Lexer = Lexer;
|
|
6010
6010
|
});
|
|
6011
6011
|
|
|
6012
|
-
//
|
|
6012
|
+
// node_modules/yaml/dist/parse/line-counter.js
|
|
6013
6013
|
var require_line_counter = __commonJS((exports) => {
|
|
6014
6014
|
class LineCounter {
|
|
6015
6015
|
constructor() {
|
|
@@ -6037,7 +6037,7 @@ var require_line_counter = __commonJS((exports) => {
|
|
|
6037
6037
|
exports.LineCounter = LineCounter;
|
|
6038
6038
|
});
|
|
6039
6039
|
|
|
6040
|
-
//
|
|
6040
|
+
// node_modules/yaml/dist/parse/parser.js
|
|
6041
6041
|
var require_parser = __commonJS((exports) => {
|
|
6042
6042
|
var node_process = __require("process");
|
|
6043
6043
|
var cst = require_cst();
|
|
@@ -6893,7 +6893,7 @@ var require_parser = __commonJS((exports) => {
|
|
|
6893
6893
|
exports.Parser = Parser;
|
|
6894
6894
|
});
|
|
6895
6895
|
|
|
6896
|
-
//
|
|
6896
|
+
// node_modules/yaml/dist/public-api.js
|
|
6897
6897
|
var require_public_api = __commonJS((exports) => {
|
|
6898
6898
|
var composer = require_composer();
|
|
6899
6899
|
var Document = require_Document();
|
|
@@ -6988,11 +6988,11 @@ var require_public_api = __commonJS((exports) => {
|
|
|
6988
6988
|
});
|
|
6989
6989
|
|
|
6990
6990
|
// src/lib/registry.ts
|
|
6991
|
-
import { existsSync as existsSync8, readFileSync as readFileSync6, readdirSync as
|
|
6991
|
+
import { existsSync as existsSync8, readFileSync as readFileSync6, readdirSync as readdirSync5 } from "fs";
|
|
6992
6992
|
import { join as join8 } from "path";
|
|
6993
6993
|
|
|
6994
6994
|
// src/lib/config.ts
|
|
6995
|
-
import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync
|
|
6995
|
+
import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
6996
6996
|
import { join as join2, dirname } from "path";
|
|
6997
6997
|
|
|
6998
6998
|
// src/lib/retired-settings.ts
|
|
@@ -7104,12 +7104,6 @@ function exactDataRoot() {
|
|
|
7104
7104
|
}
|
|
7105
7105
|
return;
|
|
7106
7106
|
}
|
|
7107
|
-
function hasExactOverride(env = process.env) {
|
|
7108
|
-
return Boolean(env[DATA_DIR_ENV]?.trim()) || Boolean(env[HASNA_SKILLS_HOME_ENV]?.trim()) || Boolean(env[SKILLS_HOME_ENV]?.trim());
|
|
7109
|
-
}
|
|
7110
|
-
function hasOperatorOverride(env = process.env) {
|
|
7111
|
-
return hasExactOverride(env) || Boolean(env.HASNA_DATA_HOME?.trim());
|
|
7112
|
-
}
|
|
7113
7107
|
function getDataRoot() {
|
|
7114
7108
|
const exact = exactDataRoot();
|
|
7115
7109
|
if (exact)
|
|
@@ -7143,24 +7137,6 @@ function validKeys() {
|
|
|
7143
7137
|
function allowedValues(key) {
|
|
7144
7138
|
return ENUM_KEYS[key];
|
|
7145
7139
|
}
|
|
7146
|
-
function mergeDirectoryContents(sourceDir, targetDir) {
|
|
7147
|
-
if (!existsSync2(sourceDir))
|
|
7148
|
-
return;
|
|
7149
|
-
mkdirSync(targetDir, { recursive: true });
|
|
7150
|
-
for (const entry of readdirSync(sourceDir)) {
|
|
7151
|
-
const sourcePath = join2(sourceDir, entry);
|
|
7152
|
-
const targetPath = join2(targetDir, entry);
|
|
7153
|
-
try {
|
|
7154
|
-
const sourceStat = statSync(sourcePath);
|
|
7155
|
-
if (sourceStat.isDirectory()) {
|
|
7156
|
-
mergeDirectoryContents(sourcePath, targetPath);
|
|
7157
|
-
continue;
|
|
7158
|
-
}
|
|
7159
|
-
if (!existsSync2(targetPath))
|
|
7160
|
-
copyFileSync(sourcePath, targetPath);
|
|
7161
|
-
} catch {}
|
|
7162
|
-
}
|
|
7163
|
-
}
|
|
7164
7140
|
function normalizeConfigValue(key, value) {
|
|
7165
7141
|
if (typeof value !== "string")
|
|
7166
7142
|
return;
|
|
@@ -7182,19 +7158,6 @@ function getDataDir() {
|
|
|
7182
7158
|
try {
|
|
7183
7159
|
mkdirSync(root, { recursive: true });
|
|
7184
7160
|
} catch {}
|
|
7185
|
-
if (hasOperatorOverride())
|
|
7186
|
-
return root;
|
|
7187
|
-
const home = effectiveHome();
|
|
7188
|
-
const oldDir = join2(home, ".skills");
|
|
7189
|
-
const oldConfigFile = join2(home, ".skillsrc");
|
|
7190
|
-
try {
|
|
7191
|
-
mergeDirectoryContents(oldDir, root);
|
|
7192
|
-
} catch {}
|
|
7193
|
-
if (existsSync2(oldConfigFile) && !existsSync2(join2(root, "config.json"))) {
|
|
7194
|
-
try {
|
|
7195
|
-
copyFileSync(oldConfigFile, join2(root, "config.json"));
|
|
7196
|
-
} catch {}
|
|
7197
|
-
}
|
|
7198
7161
|
return root;
|
|
7199
7162
|
}
|
|
7200
7163
|
function getDataDirReadOnly() {
|
|
@@ -7289,730 +7252,23 @@ function unsetConfig(key, scope = "project") {
|
|
|
7289
7252
|
|
|
7290
7253
|
// src/lib/portable-skills.ts
|
|
7291
7254
|
import {
|
|
7292
|
-
cpSync as cpSync2,
|
|
7293
7255
|
existsSync as existsSync7,
|
|
7294
7256
|
mkdirSync as mkdirSync3,
|
|
7295
7257
|
mkdtempSync,
|
|
7296
|
-
readdirSync as
|
|
7258
|
+
readdirSync as readdirSync4,
|
|
7297
7259
|
realpathSync as realpathSync2,
|
|
7298
7260
|
renameSync,
|
|
7299
7261
|
rmSync,
|
|
7300
|
-
statSync as
|
|
7262
|
+
statSync as statSync5,
|
|
7301
7263
|
writeFileSync as writeFileSync3
|
|
7302
7264
|
} from "fs";
|
|
7303
7265
|
import { basename as basename2, dirname as dirname3, isAbsolute as isAbsolute2, join as join7, normalize as normalize2, relative as relative2, resolve as resolve2, sep as sep2 } from "path";
|
|
7304
7266
|
|
|
7305
|
-
// src/lib/registry-data/development-tools.ts
|
|
7306
|
-
var DEVELOPMENT_TOOLS_SKILLS = [
|
|
7307
|
-
{
|
|
7308
|
-
name: "repo-onboarding-report",
|
|
7309
|
-
displayName: "Repo Onboarding Report",
|
|
7310
|
-
description: "Generate repository onboarding packages with architecture maps, setup guides, risk registers, and first-week plans",
|
|
7311
|
-
category: "Development Tools",
|
|
7312
|
-
kind: "instruction",
|
|
7313
|
-
tags: ["repository", "onboarding", "architecture", "developer-tools"]
|
|
7314
|
-
},
|
|
7315
|
-
{
|
|
7316
|
-
name: "security-audit-report",
|
|
7317
|
-
displayName: "Security Audit Report",
|
|
7318
|
-
description: "Generate application security hardening reports covering auth, secrets, headers, webhooks, RLS, permissions, dependencies, and prioritized fixes",
|
|
7319
|
-
category: "Development Tools",
|
|
7320
|
-
kind: "instruction",
|
|
7321
|
-
tags: ["security", "audit", "hardening", "rls", "webhooks"]
|
|
7322
|
-
},
|
|
7323
|
-
{
|
|
7324
|
-
name: "performance-audit-report",
|
|
7325
|
-
displayName: "Performance Audit Report",
|
|
7326
|
-
description: "Generate performance audit reports with metrics, findings, budgets, remediation plans, and manifest artifacts",
|
|
7327
|
-
category: "Development Tools",
|
|
7328
|
-
kind: "instruction",
|
|
7329
|
-
tags: ["performance", "audit", "latency", "budget", "web"]
|
|
7330
|
-
},
|
|
7331
|
-
{
|
|
7332
|
-
name: "migration-plan-pack",
|
|
7333
|
-
displayName: "Migration Plan Pack",
|
|
7334
|
-
description: "Generate migration plans for frameworks, libraries, databases, infrastructure, and architecture upgrades with risk matrix, checklist, rollout, and test strategy artifacts",
|
|
7335
|
-
category: "Development Tools",
|
|
7336
|
-
kind: "instruction",
|
|
7337
|
-
tags: ["migration", "upgrade", "planning", "frameworks", "databases"]
|
|
7338
|
-
},
|
|
7339
|
-
{
|
|
7340
|
-
name: "test-suite-generator",
|
|
7341
|
-
displayName: "Test Suite Generator",
|
|
7342
|
-
description: "Generate runnable API, unit, and browser test suite packages with coverage notes",
|
|
7343
|
-
category: "Development Tools",
|
|
7344
|
-
kind: "instruction",
|
|
7345
|
-
tags: ["testing", "qa", "api-tests", "browser-tests", "coverage"]
|
|
7346
|
-
},
|
|
7347
|
-
{
|
|
7348
|
-
name: "api-test-suite",
|
|
7349
|
-
displayName: "API Test Suite",
|
|
7350
|
-
description: "Generate and run API test suites with comprehensive endpoint coverage",
|
|
7351
|
-
category: "Development Tools",
|
|
7352
|
-
tags: ["api", "testing", "automation", "qa"]
|
|
7353
|
-
},
|
|
7354
|
-
{
|
|
7355
|
-
name: "api-docs-portal",
|
|
7356
|
-
displayName: "API Docs Portal",
|
|
7357
|
-
description: "Generate static API documentation portals from OpenAPI specs, route lists, and endpoint examples",
|
|
7358
|
-
category: "Development Tools",
|
|
7359
|
-
tags: ["api", "documentation", "openapi", "portal"]
|
|
7360
|
-
},
|
|
7361
|
-
{
|
|
7362
|
-
name: "codefix",
|
|
7363
|
-
displayName: "Code Fix",
|
|
7364
|
-
description: "Code quality CLI for auto-linting, formatting, fixing, and style enforcement",
|
|
7365
|
-
category: "Development Tools",
|
|
7366
|
-
tags: ["code", "linting", "formatting", "quality"]
|
|
7367
|
-
},
|
|
7368
|
-
{
|
|
7369
|
-
name: "commitpush",
|
|
7370
|
-
displayName: "Commit Push",
|
|
7371
|
-
description: "Create logical commits from repo changes and push directly to the main branch",
|
|
7372
|
-
category: "Development Tools",
|
|
7373
|
-
tags: ["git", "commit", "push", "automation"]
|
|
7374
|
-
},
|
|
7375
|
-
{
|
|
7376
|
-
name: "commitpushpr",
|
|
7377
|
-
displayName: "Commit Push PR",
|
|
7378
|
-
description: "Create logical commits, push a feature branch, and open a GitHub pull request",
|
|
7379
|
-
category: "Development Tools",
|
|
7380
|
-
dependencies: ["commitpush"],
|
|
7381
|
-
tags: ["git", "commit", "pull-request", "github", "automation"]
|
|
7382
|
-
},
|
|
7383
|
-
{
|
|
7384
|
-
name: "database-explorer",
|
|
7385
|
-
displayName: "Database Explorer",
|
|
7386
|
-
description: "Explore and query databases with an interactive interface",
|
|
7387
|
-
category: "Development Tools",
|
|
7388
|
-
tags: ["database", "explorer", "sql", "query"]
|
|
7389
|
-
},
|
|
7390
|
-
{
|
|
7391
|
-
name: "diff-viewer",
|
|
7392
|
-
displayName: "Diff Viewer",
|
|
7393
|
-
description: "View and analyze file differences with visual diff representation",
|
|
7394
|
-
category: "Development Tools",
|
|
7395
|
-
tags: ["diff", "comparison", "files", "code-review"]
|
|
7396
|
-
},
|
|
7397
|
-
{
|
|
7398
|
-
name: "generate-api-client",
|
|
7399
|
-
displayName: "Generate API Client",
|
|
7400
|
-
description: "Generate API client libraries from OpenAPI specs and documentation",
|
|
7401
|
-
category: "Development Tools",
|
|
7402
|
-
tags: ["api", "client", "code-generation", "openapi"]
|
|
7403
|
-
},
|
|
7404
|
-
{
|
|
7405
|
-
name: "generate-dockerfile",
|
|
7406
|
-
displayName: "Generate Dockerfile",
|
|
7407
|
-
description: "Generate optimized Dockerfiles for containerized applications",
|
|
7408
|
-
category: "Development Tools",
|
|
7409
|
-
tags: ["docker", "dockerfile", "containers", "devops"]
|
|
7410
|
-
},
|
|
7411
|
-
{
|
|
7412
|
-
name: "generate-env",
|
|
7413
|
-
displayName: "Generate Env",
|
|
7414
|
-
description: "Generate environment variable files from templates and configurations",
|
|
7415
|
-
category: "Development Tools",
|
|
7416
|
-
tags: ["env", "environment", "configuration", "dotenv"]
|
|
7417
|
-
},
|
|
7418
|
-
{
|
|
7419
|
-
name: "generate-sitemap",
|
|
7420
|
-
displayName: "Generate Sitemap",
|
|
7421
|
-
description: "Generate XML sitemaps for websites and web applications",
|
|
7422
|
-
category: "Development Tools",
|
|
7423
|
-
tags: ["sitemap", "seo", "xml", "web"]
|
|
7424
|
-
},
|
|
7425
|
-
{
|
|
7426
|
-
name: "hook",
|
|
7427
|
-
displayName: "Hook",
|
|
7428
|
-
description: "Claude Code hook creation skill - generates standardized hook scaffolds",
|
|
7429
|
-
category: "Development Tools",
|
|
7430
|
-
tags: ["hooks", "scaffold", "claude-code", "automation"]
|
|
7431
|
-
},
|
|
7432
|
-
{
|
|
7433
|
-
name: "http-server",
|
|
7434
|
-
displayName: "HTTP Server",
|
|
7435
|
-
description: "Spin up local HTTP servers for development and testing",
|
|
7436
|
-
category: "Development Tools",
|
|
7437
|
-
tags: ["http", "server", "development", "local"]
|
|
7438
|
-
},
|
|
7439
|
-
{
|
|
7440
|
-
name: "lorem-generator",
|
|
7441
|
-
displayName: "Lorem Generator",
|
|
7442
|
-
description: "Generate placeholder text in various styles and lengths",
|
|
7443
|
-
category: "Development Tools",
|
|
7444
|
-
tags: ["lorem", "placeholder", "text", "mockup"]
|
|
7445
|
-
},
|
|
7446
|
-
{
|
|
7447
|
-
name: "managemcp",
|
|
7448
|
-
displayName: "Manage MCP",
|
|
7449
|
-
description: "Manage MCP servers with install, configure, and lifecycle operations",
|
|
7450
|
-
category: "Development Tools",
|
|
7451
|
-
tags: ["mcp", "management", "servers", "configuration"]
|
|
7452
|
-
},
|
|
7453
|
-
{
|
|
7454
|
-
name: "markdown-validator",
|
|
7455
|
-
displayName: "Markdown Validator",
|
|
7456
|
-
description: "Validate markdown files for syntax, links, and formatting issues",
|
|
7457
|
-
category: "Development Tools",
|
|
7458
|
-
tags: ["markdown", "validation", "linting", "formatting"]
|
|
7459
|
-
},
|
|
7460
|
-
{
|
|
7461
|
-
name: "monitor",
|
|
7462
|
-
displayName: "Monitor",
|
|
7463
|
-
description: "Operate the monitor MCP for machine health, processes, cron jobs, and cleanup workflows",
|
|
7464
|
-
category: "Development Tools",
|
|
7465
|
-
tags: ["monitoring", "mcp", "processes", "operations"]
|
|
7466
|
-
},
|
|
7467
|
-
{
|
|
7468
|
-
name: "regex-tester",
|
|
7469
|
-
displayName: "Regex Tester",
|
|
7470
|
-
description: "Test and validate regular expressions with sample inputs",
|
|
7471
|
-
category: "Development Tools",
|
|
7472
|
-
tags: ["regex", "testing", "validation", "patterns"]
|
|
7473
|
-
},
|
|
7474
|
-
{
|
|
7475
|
-
name: "scancommitpr",
|
|
7476
|
-
displayName: "Scan Commit PR",
|
|
7477
|
-
description: "Scan repo changes, group into logical commits, push, and optionally create a PR",
|
|
7478
|
-
category: "Development Tools",
|
|
7479
|
-
dependencies: ["scancommitpush"],
|
|
7480
|
-
tags: ["git", "commit", "push", "pull-request", "automation"]
|
|
7481
|
-
},
|
|
7482
|
-
{
|
|
7483
|
-
name: "scancommitpush",
|
|
7484
|
-
displayName: "Scan Commit Push",
|
|
7485
|
-
description: "Scan repo changes, group into logical commits with conventional messages, and push to GitHub",
|
|
7486
|
-
category: "Development Tools",
|
|
7487
|
-
tags: ["git", "commit", "push", "automation"]
|
|
7488
|
-
},
|
|
7489
|
-
{
|
|
7490
|
-
name: "security-audit",
|
|
7491
|
-
displayName: "Security Audit",
|
|
7492
|
-
description: "Perform security audits on codebases and infrastructure configurations",
|
|
7493
|
-
category: "Development Tools",
|
|
7494
|
-
tags: ["security", "audit", "vulnerabilities", "scanning"]
|
|
7495
|
-
},
|
|
7496
|
-
{
|
|
7497
|
-
name: "tmux-session",
|
|
7498
|
-
displayName: "Tmux Session",
|
|
7499
|
-
description: "Create and manage grouped tmux sessions with workspace-aware naming and window layout guidance",
|
|
7500
|
-
category: "Development Tools",
|
|
7501
|
-
tags: ["tmux", "terminal", "sessions", "workspace"]
|
|
7502
|
-
},
|
|
7503
|
-
{
|
|
7504
|
-
name: "validate-config",
|
|
7505
|
-
displayName: "Validate Config",
|
|
7506
|
-
description: "Validate configuration files for syntax and schema compliance",
|
|
7507
|
-
category: "Development Tools",
|
|
7508
|
-
tags: ["config", "validation", "schema", "linting"]
|
|
7509
|
-
},
|
|
7510
|
-
{
|
|
7511
|
-
name: "oss-app-two-backend-storage",
|
|
7512
|
-
displayName: "OSS App Two-Backend Storage",
|
|
7513
|
-
description: "Recipe for the Hasna two-backend storage contract: client transport + HTTP store, server PG/SQLite backend, pg-migrations + apply script, fail-closed URL-without-key, bun bins, contract manifest, Dockerfile",
|
|
7514
|
-
category: "Development Tools",
|
|
7515
|
-
tags: ["storage", "backend", "postgresql", "sqlite", "two-backend", "oss-app"],
|
|
7516
|
-
kind: "instruction"
|
|
7517
|
-
}
|
|
7518
|
-
];
|
|
7519
|
-
|
|
7520
|
-
// src/lib/registry-data/business-marketing.ts
|
|
7521
|
-
var BUSINESS_MARKETING_SKILLS = [
|
|
7522
|
-
{
|
|
7523
|
-
name: "customer-feedback-report",
|
|
7524
|
-
displayName: "Customer Feedback Report",
|
|
7525
|
-
description: "Generate customer feedback reports with clusters, sentiment, root causes, roadmap recommendations, evidence, and PDF/Markdown artifacts",
|
|
7526
|
-
category: "Business & Marketing",
|
|
7527
|
-
kind: "instruction",
|
|
7528
|
-
tags: ["feedback", "customer", "sentiment", "roadmap", "report"]
|
|
7529
|
-
},
|
|
7530
|
-
{
|
|
7531
|
-
name: "pitch-deck",
|
|
7532
|
-
displayName: "Pitch Deck",
|
|
7533
|
-
description: "Generate investor and sales deck packages with slides, speaker notes, design direction, PDF, and PPTX artifacts",
|
|
7534
|
-
category: "Business & Marketing",
|
|
7535
|
-
kind: "instruction",
|
|
7536
|
-
dependencies: ["market-research-report"],
|
|
7537
|
-
tags: ["deck", "presentation", "investor", "sales", "pptx"]
|
|
7538
|
-
},
|
|
7539
|
-
{
|
|
7540
|
-
name: "proposal-pack",
|
|
7541
|
-
displayName: "Proposal Pack",
|
|
7542
|
-
description: "Generate client proposal packages with proposal, statement of work, pricing, timeline, assumptions, cover email, and PDF/Markdown artifacts",
|
|
7543
|
-
category: "Business & Marketing",
|
|
7544
|
-
kind: "instruction",
|
|
7545
|
-
tags: ["proposal", "sow", "sales", "pricing", "timeline"]
|
|
7546
|
-
},
|
|
7547
|
-
{
|
|
7548
|
-
name: "seo-content-pack",
|
|
7549
|
-
displayName: "SEO Content Pack",
|
|
7550
|
-
description: "Generate SEO content packages with topic clusters, articles, metadata, internal links, FAQs, and publishing cadence",
|
|
7551
|
-
category: "Business & Marketing",
|
|
7552
|
-
kind: "instruction",
|
|
7553
|
-
tags: ["seo", "content", "articles", "metadata"]
|
|
7554
|
-
},
|
|
7555
|
-
{
|
|
7556
|
-
name: "landing-page-pack",
|
|
7557
|
-
displayName: "Landing Page Pack",
|
|
7558
|
-
description: "Generate landing page packages with conversion copy, wireframes, CTA maps, experiments, preview HTML, and implementation notes",
|
|
7559
|
-
category: "Business & Marketing",
|
|
7560
|
-
kind: "instruction",
|
|
7561
|
-
tags: ["landing-page", "sales", "copywriting", "conversion"]
|
|
7562
|
-
},
|
|
7563
|
-
{
|
|
7564
|
-
name: "ad-creative-pack",
|
|
7565
|
-
displayName: "Ad Creative Pack",
|
|
7566
|
-
description: "Generate paid ad packages with platform copy, creative concepts, image prompts, audience angles, and test matrices",
|
|
7567
|
-
category: "Business & Marketing",
|
|
7568
|
-
kind: "instruction",
|
|
7569
|
-
tags: ["ads", "creative", "marketing", "copywriting"]
|
|
7570
|
-
},
|
|
7571
|
-
{
|
|
7572
|
-
name: "email-sequence",
|
|
7573
|
-
displayName: "Email Sequence",
|
|
7574
|
-
description: "Generate email campaign packages with subject lines, preview text, body copy, segmentation notes, CTA variants, HTML emails, and send plans",
|
|
7575
|
-
category: "Business & Marketing",
|
|
7576
|
-
kind: "instruction",
|
|
7577
|
-
tags: ["email", "marketing", "campaign", "copywriting"]
|
|
7578
|
-
},
|
|
7579
|
-
{
|
|
7580
|
-
name: "social-content-calendar",
|
|
7581
|
-
displayName: "Social Content Calendar",
|
|
7582
|
-
description: "Generate social content calendars with daily posts, channel strategy, asset briefs, hooks, publishing schedules, and repurposing maps",
|
|
7583
|
-
category: "Business & Marketing",
|
|
7584
|
-
kind: "instruction",
|
|
7585
|
-
tags: ["social", "content", "calendar", "marketing"]
|
|
7586
|
-
},
|
|
7587
|
-
{
|
|
7588
|
-
name: "one-page-website",
|
|
7589
|
-
displayName: "One Page Website",
|
|
7590
|
-
description: "Generate static one-page website bundles with HTML, CSS, JavaScript, copy, section maps, deploy notes, and manifest",
|
|
7591
|
-
category: "Business & Marketing",
|
|
7592
|
-
tags: ["website", "landing-page", "static-site", "html"]
|
|
7593
|
-
}
|
|
7594
|
-
];
|
|
7595
|
-
|
|
7596
|
-
// src/lib/registry-data/productivity-organization.ts
|
|
7597
|
-
var PRODUCTIVITY_ORGANIZATION_SKILLS = [
|
|
7598
|
-
{
|
|
7599
|
-
name: "meeting-pack",
|
|
7600
|
-
displayName: "Meeting Pack",
|
|
7601
|
-
description: "Generate meeting artifact packages with summaries, decisions, action items, follow-up email, timeline, project export, and manifest",
|
|
7602
|
-
category: "Productivity & Organization",
|
|
7603
|
-
kind: "instruction",
|
|
7604
|
-
tags: ["meeting", "summary", "action-items", "decisions"]
|
|
7605
|
-
},
|
|
7606
|
-
{
|
|
7607
|
-
name: "file-organizer",
|
|
7608
|
-
displayName: "File Organizer",
|
|
7609
|
-
description: "Organize files into structured directories based on type, date, or content",
|
|
7610
|
-
category: "Productivity & Organization",
|
|
7611
|
-
tags: ["files", "organization", "sorting", "cleanup"]
|
|
7612
|
-
},
|
|
7613
|
-
{
|
|
7614
|
-
name: "folder-tree",
|
|
7615
|
-
displayName: "Folder Tree",
|
|
7616
|
-
description: "Generate and display folder tree structures for documentation",
|
|
7617
|
-
category: "Productivity & Organization",
|
|
7618
|
-
tags: ["folder", "tree", "structure", "visualization"]
|
|
7619
|
-
},
|
|
7620
|
-
{
|
|
7621
|
-
name: "form-filler",
|
|
7622
|
-
displayName: "Form Filler",
|
|
7623
|
-
description: "Automatically fill out web forms and document templates",
|
|
7624
|
-
category: "Productivity & Organization",
|
|
7625
|
-
tags: ["forms", "automation", "filling", "data-entry"]
|
|
7626
|
-
},
|
|
7627
|
-
{
|
|
7628
|
-
name: "merge-pdfs",
|
|
7629
|
-
displayName: "Merge PDFs",
|
|
7630
|
-
description: "Merge multiple PDF files into a single document",
|
|
7631
|
-
category: "Productivity & Organization",
|
|
7632
|
-
tags: ["pdf", "merge", "documents", "combining"]
|
|
7633
|
-
},
|
|
7634
|
-
{
|
|
7635
|
-
name: "split-pdf",
|
|
7636
|
-
displayName: "Split PDF",
|
|
7637
|
-
description: "Split PDF documents into separate pages or sections",
|
|
7638
|
-
category: "Productivity & Organization",
|
|
7639
|
-
tags: ["pdf", "split", "documents", "pages"]
|
|
7640
|
-
}
|
|
7641
|
-
];
|
|
7642
|
-
|
|
7643
|
-
// src/lib/registry-data/project-management.ts
|
|
7644
|
-
var PROJECT_MANAGEMENT_SKILLS = [
|
|
7645
|
-
{
|
|
7646
|
-
name: "businessactivity",
|
|
7647
|
-
displayName: "Business Activity",
|
|
7648
|
-
description: "Business activity, workflow, and ownership management service",
|
|
7649
|
-
category: "Project Management",
|
|
7650
|
-
tags: ["business", "workflow", "activities", "management"]
|
|
7651
|
-
},
|
|
7652
|
-
{
|
|
7653
|
-
name: "implementation",
|
|
7654
|
-
displayName: "Implementation",
|
|
7655
|
-
description: "Create .implementation scaffold for project development tracking",
|
|
7656
|
-
category: "Project Management",
|
|
7657
|
-
tags: ["implementation", "tracking", "scaffold", "project"]
|
|
7658
|
-
},
|
|
7659
|
-
{
|
|
7660
|
-
name: "implementation-plan",
|
|
7661
|
-
displayName: "Implementation Plan",
|
|
7662
|
-
description: "Generate detailed implementation plans with phases and milestones",
|
|
7663
|
-
category: "Project Management",
|
|
7664
|
-
tags: ["implementation", "planning", "milestones", "phases"]
|
|
7665
|
-
},
|
|
7666
|
-
{
|
|
7667
|
-
name: "implementation-todo",
|
|
7668
|
-
displayName: "Implementation Todo",
|
|
7669
|
-
description: "Manage implementation task lists and todo items",
|
|
7670
|
-
category: "Project Management",
|
|
7671
|
-
tags: ["implementation", "todo", "tasks", "tracking"]
|
|
7672
|
-
},
|
|
7673
|
-
{
|
|
7674
|
-
name: "todos-plan",
|
|
7675
|
-
displayName: "Todos Plan",
|
|
7676
|
-
description: "Author, sync, route, and verify Todos plans using Todos CLI plan IDs as source of truth",
|
|
7677
|
-
category: "Project Management",
|
|
7678
|
-
tags: ["todos", "plans", "tasks", "verification", "workflow"]
|
|
7679
|
-
}
|
|
7680
|
-
];
|
|
7681
|
-
|
|
7682
|
-
// src/lib/registry-data/content-generation.ts
|
|
7683
|
-
var CONTENT_GENERATION_SKILLS = [
|
|
7684
|
-
{
|
|
7685
|
-
name: "pdf-generate",
|
|
7686
|
-
displayName: "PDF Generate",
|
|
7687
|
-
description: "Generate PDF documents with rich formatting and layouts",
|
|
7688
|
-
category: "Content Generation",
|
|
7689
|
-
tags: ["pdf", "document", "generation", "formatting"]
|
|
7690
|
-
},
|
|
7691
|
-
{
|
|
7692
|
-
name: "slide-deck-generator",
|
|
7693
|
-
displayName: "Slide Deck Generator",
|
|
7694
|
-
description: "Generate slide decks from briefs, docs, or outlines with PDF, PPTX, speaker notes, and structured slide metadata",
|
|
7695
|
-
category: "Content Generation",
|
|
7696
|
-
tags: ["presentation", "slides", "deck", "documents"]
|
|
7697
|
-
},
|
|
7698
|
-
{
|
|
7699
|
-
name: "generate-qrcode",
|
|
7700
|
-
displayName: "Generate QR Code",
|
|
7701
|
-
description: "Generate QR codes with custom styling and embedded data",
|
|
7702
|
-
category: "Content Generation",
|
|
7703
|
-
tags: ["qrcode", "generation", "encoding", "visual"]
|
|
7704
|
-
},
|
|
7705
|
-
{
|
|
7706
|
-
name: "generate-resume",
|
|
7707
|
-
displayName: "Generate Resume",
|
|
7708
|
-
description: "Generate professional resumes with formatting and content optimization",
|
|
7709
|
-
category: "Content Generation",
|
|
7710
|
-
tags: ["resume", "cv", "career", "generation"]
|
|
7711
|
-
}
|
|
7712
|
-
];
|
|
7713
|
-
|
|
7714
|
-
// src/lib/registry-data/finance-compliance.ts
|
|
7715
|
-
var FINANCE_COMPLIANCE_SKILLS = [
|
|
7716
|
-
{
|
|
7717
|
-
name: "contract-review-report",
|
|
7718
|
-
displayName: "Contract Review Report",
|
|
7719
|
-
description: "Generate contract review reports with risk register, clause summary, redline suggestions, negotiation email, and manifest artifacts",
|
|
7720
|
-
category: "Finance & Compliance",
|
|
7721
|
-
kind: "instruction",
|
|
7722
|
-
tags: ["contract", "legal", "review", "risk"]
|
|
7723
|
-
},
|
|
7724
|
-
{
|
|
7725
|
-
name: "invoice",
|
|
7726
|
-
displayName: "Invoice",
|
|
7727
|
-
description: "Generate professional invoices with company management and PDF export",
|
|
7728
|
-
category: "Finance & Compliance",
|
|
7729
|
-
tags: ["invoice", "billing", "pdf", "finance"]
|
|
7730
|
-
},
|
|
7731
|
-
{
|
|
7732
|
-
name: "invoice-reconciliation",
|
|
7733
|
-
displayName: "Invoice Reconciliation",
|
|
7734
|
-
description: "Generate invoice reconciliation reports with matched payments, discrepancies, anomaly notes, summaries, and manifest artifacts",
|
|
7735
|
-
category: "Finance & Compliance",
|
|
7736
|
-
tags: ["invoice", "payments", "reconciliation", "finance"]
|
|
7737
|
-
}
|
|
7738
|
-
];
|
|
7739
|
-
|
|
7740
|
-
// src/lib/registry-data/data-analysis.ts
|
|
7741
|
-
var DATA_ANALYSIS_SKILLS = [
|
|
7742
|
-
{
|
|
7743
|
-
name: "analyze-data",
|
|
7744
|
-
displayName: "Analyze Data",
|
|
7745
|
-
description: "Data science insights for CSV and JSON datasets with statistical analysis",
|
|
7746
|
-
category: "Data & Analysis",
|
|
7747
|
-
tags: ["data", "analysis", "csv", "json", "statistics"]
|
|
7748
|
-
},
|
|
7749
|
-
{
|
|
7750
|
-
name: "dashboard-builder",
|
|
7751
|
-
displayName: "Dashboard Builder",
|
|
7752
|
-
description: "Build data dashboards with charts, metrics, and visualizations",
|
|
7753
|
-
category: "Data & Analysis",
|
|
7754
|
-
tags: ["dashboard", "visualization", "charts", "metrics"]
|
|
7755
|
-
},
|
|
7756
|
-
{
|
|
7757
|
-
name: "data-anonymizer",
|
|
7758
|
-
displayName: "Data Anonymizer",
|
|
7759
|
-
description: "Anonymize sensitive data in datasets for privacy compliance",
|
|
7760
|
-
category: "Data & Analysis",
|
|
7761
|
-
tags: ["anonymization", "privacy", "data", "compliance"]
|
|
7762
|
-
},
|
|
7763
|
-
{
|
|
7764
|
-
name: "generate-chart",
|
|
7765
|
-
displayName: "Generate Chart",
|
|
7766
|
-
description: "Generate data charts and visualizations from datasets",
|
|
7767
|
-
category: "Data & Analysis",
|
|
7768
|
-
tags: ["charts", "visualization", "data", "graphs"]
|
|
7769
|
-
},
|
|
7770
|
-
{
|
|
7771
|
-
name: "read-csv",
|
|
7772
|
-
displayName: "Read CSV",
|
|
7773
|
-
description: "Parse CSV files into structured JSON with delimiter and encoding detection",
|
|
7774
|
-
category: "Data & Analysis",
|
|
7775
|
-
tags: ["csv", "parsing", "tabular", "data"]
|
|
7776
|
-
},
|
|
7777
|
-
{
|
|
7778
|
-
name: "read-excel",
|
|
7779
|
-
displayName: "Read Excel",
|
|
7780
|
-
description: "Parse XLS and XLSX workbooks into structured JSON with sheet and formatted cell metadata",
|
|
7781
|
-
category: "Data & Analysis",
|
|
7782
|
-
tags: ["excel", "spreadsheet", "xlsx", "data"]
|
|
7783
|
-
},
|
|
7784
|
-
{
|
|
7785
|
-
name: "pdf-to-markdown",
|
|
7786
|
-
displayName: "PDF to Markdown",
|
|
7787
|
-
description: "Convert PDFs into clean markdown with remote extraction and structure cleanup",
|
|
7788
|
-
category: "Data & Analysis",
|
|
7789
|
-
tags: ["pdf", "markdown", "conversion"]
|
|
7790
|
-
},
|
|
7791
|
-
{
|
|
7792
|
-
name: "pdf-to-dataset",
|
|
7793
|
-
displayName: "PDF to Dataset",
|
|
7794
|
-
description: "Extract PDF tables, forms, invoices, and semi-structured content into CSV and JSON datasets",
|
|
7795
|
-
category: "Data & Analysis",
|
|
7796
|
-
tags: ["pdf", "dataset", "csv", "json", "extraction"]
|
|
7797
|
-
},
|
|
7798
|
-
{
|
|
7799
|
-
name: "doc-read",
|
|
7800
|
-
displayName: "Doc Read",
|
|
7801
|
-
description: "Read and extract text from DOCX files with section parsing and metadata extraction",
|
|
7802
|
-
category: "Data & Analysis",
|
|
7803
|
-
tags: ["docx", "reader", "extraction", "word"]
|
|
7804
|
-
}
|
|
7805
|
-
];
|
|
7806
|
-
|
|
7807
|
-
// src/lib/registry-data/media-processing.ts
|
|
7808
|
-
var MEDIA_PROCESSING_SKILLS = [
|
|
7809
|
-
{
|
|
7810
|
-
name: "video-highlight-pack",
|
|
7811
|
-
displayName: "Video Highlight Pack",
|
|
7812
|
-
description: "Generate video highlight packages with clip plans, captions, thumbnail briefs, chapter markers, social posts, and edit decisions",
|
|
7813
|
-
category: "Media Processing",
|
|
7814
|
-
kind: "instruction",
|
|
7815
|
-
tags: ["video", "highlights", "clips", "captions"]
|
|
7816
|
-
},
|
|
7817
|
-
{
|
|
7818
|
-
name: "compress-video",
|
|
7819
|
-
displayName: "Compress Video",
|
|
7820
|
-
description: "Compress video files while preserving visual quality using ffmpeg",
|
|
7821
|
-
category: "Media Processing",
|
|
7822
|
-
tags: ["video", "compression", "ffmpeg", "optimization"]
|
|
7823
|
-
},
|
|
7824
|
-
{
|
|
7825
|
-
name: "audio-extract",
|
|
7826
|
-
displayName: "Audio Extract",
|
|
7827
|
-
description: "Extract audio tracks from video files with multiple format support",
|
|
7828
|
-
category: "Media Processing",
|
|
7829
|
-
tags: ["audio", "extraction", "video", "conversion"]
|
|
7830
|
-
},
|
|
7831
|
-
{
|
|
7832
|
-
name: "extract-frames",
|
|
7833
|
-
displayName: "Extract Frames",
|
|
7834
|
-
description: "Extract frames from video files at specified intervals or timestamps",
|
|
7835
|
-
category: "Media Processing",
|
|
7836
|
-
tags: ["frames", "video", "extraction", "images"]
|
|
7837
|
-
},
|
|
7838
|
-
{
|
|
7839
|
-
name: "gif-maker",
|
|
7840
|
-
displayName: "GIF Maker",
|
|
7841
|
-
description: "Create animated GIFs from images, videos, or screen recordings",
|
|
7842
|
-
category: "Media Processing",
|
|
7843
|
-
tags: ["gif", "animation", "images", "video"]
|
|
7844
|
-
},
|
|
7845
|
-
{
|
|
7846
|
-
name: "video-downloader",
|
|
7847
|
-
displayName: "Video Downloader",
|
|
7848
|
-
description: "Download videos from various online platforms and services",
|
|
7849
|
-
category: "Media Processing",
|
|
7850
|
-
tags: ["video", "download", "platforms", "media"]
|
|
7851
|
-
},
|
|
7852
|
-
{
|
|
7853
|
-
name: "watermark",
|
|
7854
|
-
displayName: "Watermark",
|
|
7855
|
-
description: "Add watermarks to images and documents for copyright protection",
|
|
7856
|
-
category: "Media Processing",
|
|
7857
|
-
tags: ["watermark", "protection", "copyright", "images"]
|
|
7858
|
-
}
|
|
7859
|
-
];
|
|
7860
|
-
|
|
7861
|
-
// src/lib/registry-data/design-branding.ts
|
|
7862
|
-
var DESIGN_BRANDING_SKILLS = [
|
|
7863
|
-
{
|
|
7864
|
-
name: "brand-kit",
|
|
7865
|
-
displayName: "Brand Kit",
|
|
7866
|
-
description: "Generate brand kits with logo usage, palette, typography, brand voice, sample applications, Markdown guide, PDF guide, and SVG assets",
|
|
7867
|
-
category: "Design & Branding",
|
|
7868
|
-
kind: "instruction",
|
|
7869
|
-
tags: ["brand", "design", "palette", "typography"]
|
|
7870
|
-
},
|
|
7871
|
-
{
|
|
7872
|
-
name: "brand-assets",
|
|
7873
|
-
displayName: "Brand Assets",
|
|
7874
|
-
description: "Fetch official brand assets from a website or brand name with logos, PNG sizes, palette, typography, source metadata, and manifests",
|
|
7875
|
-
category: "Design & Branding",
|
|
7876
|
-
tags: ["brand", "logo", "assets", "palette", "typography"]
|
|
7877
|
-
},
|
|
7878
|
-
{
|
|
7879
|
-
name: "logo-design",
|
|
7880
|
-
displayName: "Logo Design",
|
|
7881
|
-
description: "Generate multi-variant logo packages with transparent PNGs, vector-style SVGs, usage notes, and manifests",
|
|
7882
|
-
category: "Design & Branding",
|
|
7883
|
-
tags: ["logo", "design", "branding", "identity"]
|
|
7884
|
-
},
|
|
7885
|
-
{
|
|
7886
|
-
name: "generate-favicon",
|
|
7887
|
-
displayName: "Generate Favicon",
|
|
7888
|
-
description: "Generate favicons in multiple sizes and formats for websites",
|
|
7889
|
-
category: "Design & Branding",
|
|
7890
|
-
tags: ["favicon", "icon", "design", "web"]
|
|
7891
|
-
},
|
|
7892
|
-
{
|
|
7893
|
-
name: "product-mockup",
|
|
7894
|
-
displayName: "Product Mockup",
|
|
7895
|
-
description: "Generate product mockup packages with visual variants, prompts, usage notes, and asset metadata",
|
|
7896
|
-
category: "Design & Branding",
|
|
7897
|
-
tags: ["product", "mockup", "visualization", "marketing"]
|
|
7898
|
-
},
|
|
7899
|
-
{
|
|
7900
|
-
name: "siteanalyze",
|
|
7901
|
-
displayName: "Site Analyze",
|
|
7902
|
-
description: "Analyze any website's design system \u2014 detects shadcn/ui, Tailwind, extracts colors, typography, and components via Playwright + Claude Vision.",
|
|
7903
|
-
category: "Design & Branding",
|
|
7904
|
-
tags: ["design", "shadcn", "tailwind", "colors", "typography", "playwright", "analysis", "styles"]
|
|
7905
|
-
}
|
|
7906
|
-
];
|
|
7907
|
-
|
|
7908
|
-
// src/lib/registry-data/web-browser.ts
|
|
7909
|
-
var WEB_BROWSER_SKILLS = [
|
|
7910
|
-
{
|
|
7911
|
-
name: "domainpurchase",
|
|
7912
|
-
displayName: "Domain Purchase",
|
|
7913
|
-
description: "Purchase and manage domains via registrar connectors",
|
|
7914
|
-
category: "Web & Browser",
|
|
7915
|
-
tags: ["domain", "purchase", "registrar", "management"]
|
|
7916
|
-
}
|
|
7917
|
-
];
|
|
7918
|
-
|
|
7919
|
-
// src/lib/registry-data/research-writing.ts
|
|
7920
|
-
var RESEARCH_WRITING_SKILLS = [
|
|
7921
|
-
{
|
|
7922
|
-
name: "blog-article",
|
|
7923
|
-
displayName: "Blog Article",
|
|
7924
|
-
description: "Create SEO-optimized blog article artifact packages",
|
|
7925
|
-
category: "Research & Writing",
|
|
7926
|
-
kind: "instruction",
|
|
7927
|
-
tags: ["blog", "article", "writing", "seo"]
|
|
7928
|
-
},
|
|
7929
|
-
{
|
|
7930
|
-
name: "market-research-report",
|
|
7931
|
-
displayName: "Market Research Report",
|
|
7932
|
-
description: "Generate market research packages with competitor tables, positioning, pricing notes, source notes, and PDF/Markdown artifacts",
|
|
7933
|
-
category: "Research & Writing",
|
|
7934
|
-
kind: "instruction",
|
|
7935
|
-
tags: ["market-research", "competitors", "positioning", "pricing", "report"]
|
|
7936
|
-
}
|
|
7937
|
-
];
|
|
7938
|
-
|
|
7939
|
-
// src/lib/registry-data/science-academic.ts
|
|
7940
|
-
var SCIENCE_ACADEMIC_SKILLS = [
|
|
7941
|
-
{
|
|
7942
|
-
name: "bio-sequence-tool",
|
|
7943
|
-
displayName: "Bio Sequence Tool",
|
|
7944
|
-
description: "Analyze and manipulate biological sequences including DNA, RNA, and protein data",
|
|
7945
|
-
category: "Science & Academic",
|
|
7946
|
-
tags: ["biology", "dna", "sequence", "bioinformatics"]
|
|
7947
|
-
},
|
|
7948
|
-
{
|
|
7949
|
-
name: "experiment-power-calculator",
|
|
7950
|
-
displayName: "Experiment Power Calculator",
|
|
7951
|
-
description: "Calculate statistical power and sample size for experiments",
|
|
7952
|
-
category: "Science & Academic",
|
|
7953
|
-
tags: ["experiment", "statistics", "power-analysis", "sample-size"]
|
|
7954
|
-
},
|
|
7955
|
-
{
|
|
7956
|
-
name: "latex-table-generator",
|
|
7957
|
-
displayName: "LaTeX Table Generator",
|
|
7958
|
-
description: "Generate formatted LaTeX tables from data for academic papers",
|
|
7959
|
-
category: "Science & Academic",
|
|
7960
|
-
tags: ["latex", "tables", "academic", "formatting"]
|
|
7961
|
-
},
|
|
7962
|
-
{
|
|
7963
|
-
name: "scientific-figure-check",
|
|
7964
|
-
displayName: "Scientific Figure Check",
|
|
7965
|
-
description: "Validate scientific figures for accuracy, formatting, and publication standards",
|
|
7966
|
-
category: "Science & Academic",
|
|
7967
|
-
tags: ["scientific", "figures", "validation", "publishing"]
|
|
7968
|
-
},
|
|
7969
|
-
{
|
|
7970
|
-
name: "statistical-test-selector",
|
|
7971
|
-
displayName: "Statistical Test Selector",
|
|
7972
|
-
description: "Recommend appropriate statistical tests based on data and research questions",
|
|
7973
|
-
category: "Science & Academic",
|
|
7974
|
-
tags: ["statistics", "test-selection", "research", "analysis"]
|
|
7975
|
-
}
|
|
7976
|
-
];
|
|
7977
|
-
|
|
7978
|
-
// src/lib/registry-data/education-learning.ts
|
|
7979
|
-
var EDUCATION_LEARNING_SKILLS = [];
|
|
7980
|
-
|
|
7981
|
-
// src/lib/registry-data/communication.ts
|
|
7982
|
-
var COMMUNICATION_SKILLS = [];
|
|
7983
|
-
|
|
7984
|
-
// src/lib/registry-data/health-wellness.ts
|
|
7985
|
-
var HEALTH_WELLNESS_SKILLS = [];
|
|
7986
|
-
|
|
7987
|
-
// src/lib/registry-data/travel-lifestyle.ts
|
|
7988
|
-
var TRAVEL_LIFESTYLE_SKILLS = [];
|
|
7989
|
-
|
|
7990
|
-
// src/lib/registry-data/event-management.ts
|
|
7991
|
-
var EVENT_MANAGEMENT_SKILLS = [];
|
|
7992
|
-
|
|
7993
7267
|
// src/lib/registry-data/index.ts
|
|
7994
|
-
var SKILLS = [
|
|
7995
|
-
...DEVELOPMENT_TOOLS_SKILLS,
|
|
7996
|
-
...BUSINESS_MARKETING_SKILLS,
|
|
7997
|
-
...PRODUCTIVITY_ORGANIZATION_SKILLS,
|
|
7998
|
-
...PROJECT_MANAGEMENT_SKILLS,
|
|
7999
|
-
...CONTENT_GENERATION_SKILLS,
|
|
8000
|
-
...FINANCE_COMPLIANCE_SKILLS,
|
|
8001
|
-
...DATA_ANALYSIS_SKILLS,
|
|
8002
|
-
...MEDIA_PROCESSING_SKILLS,
|
|
8003
|
-
...DESIGN_BRANDING_SKILLS,
|
|
8004
|
-
...WEB_BROWSER_SKILLS,
|
|
8005
|
-
...RESEARCH_WRITING_SKILLS,
|
|
8006
|
-
...SCIENCE_ACADEMIC_SKILLS,
|
|
8007
|
-
...EDUCATION_LEARNING_SKILLS,
|
|
8008
|
-
...COMMUNICATION_SKILLS,
|
|
8009
|
-
...HEALTH_WELLNESS_SKILLS,
|
|
8010
|
-
...TRAVEL_LIFESTYLE_SKILLS,
|
|
8011
|
-
...EVENT_MANAGEMENT_SKILLS
|
|
8012
|
-
];
|
|
7268
|
+
var SKILLS = [];
|
|
8013
7269
|
|
|
8014
7270
|
// src/lib/hosted-skill-set.ts
|
|
8015
|
-
import { existsSync as existsSync3, readFileSync as readFileSync2, readdirSync
|
|
7271
|
+
import { existsSync as existsSync3, readFileSync as readFileSync2, readdirSync, statSync } from "fs";
|
|
8016
7272
|
import { join as join3 } from "path";
|
|
8017
7273
|
var HOSTED_RUNTIMES = new Set(["hosted"]);
|
|
8018
7274
|
var HOSTED_SOURCES = new Set(["remote", "private-hosted"]);
|
|
@@ -8051,7 +7307,7 @@ var BRACE_SOURCE_EXCLUSION = new RegExp(`^!skills/\\{(${SLUG}(?:,${SLUG})+)\\}/s
|
|
|
8051
7307
|
var SINGLE_SOURCE_EXCLUSION = new RegExp(`^!skills/(${SLUG})/src$`);
|
|
8052
7308
|
|
|
8053
7309
|
// src/lib/skill-validation.ts
|
|
8054
|
-
import { existsSync as existsSync4, lstatSync, readFileSync as readFileSync3, readdirSync as
|
|
7310
|
+
import { existsSync as existsSync4, lstatSync, readFileSync as readFileSync3, readdirSync as readdirSync2, statSync as statSync2 } from "fs";
|
|
8055
7311
|
import { isAbsolute, join as join4, normalize } from "path";
|
|
8056
7312
|
var VALID_SKILL_KINDS = ["executable", "instruction"];
|
|
8057
7313
|
var DOC_FILES = ["SKILL.md", "README.md", "CLAUDE.md"];
|
|
@@ -8214,7 +7470,7 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
|
|
|
8214
7470
|
if (!VALID_BIN_COMMAND.test(bareName)) {
|
|
8215
7471
|
add(issues, "skill.name_invalid", `Skill name '${bareName}' must use lowercase letters, numbers, dots, underscores, or hyphens`);
|
|
8216
7472
|
}
|
|
8217
|
-
for (const entry of
|
|
7473
|
+
for (const entry of readdirSync2(skillPath).sort()) {
|
|
8218
7474
|
const entryPath = join4(skillPath, entry);
|
|
8219
7475
|
if (RESERVED_SKILL_ENTRIES.has(entry)) {
|
|
8220
7476
|
add(issues, "skill.reserved_file", `Reserved file '${entry}' is not allowed in skill packages`);
|
|
@@ -8339,7 +7595,7 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
|
|
|
8339
7595
|
const targetPath = join4(skillPath, target);
|
|
8340
7596
|
if (!existsSync4(targetPath)) {
|
|
8341
7597
|
add(warnings, "package.bin_target_missing", `package.json bin '${command}' target '${target}' is not present before build`);
|
|
8342
|
-
} else if (
|
|
7598
|
+
} else if (statSync2(targetPath).isDirectory()) {
|
|
8343
7599
|
add(issues, "package.bin_target_directory", `package.json bin '${command}' target '${target}' must point to a file, not a directory`);
|
|
8344
7600
|
}
|
|
8345
7601
|
}
|
|
@@ -8365,7 +7621,7 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
|
|
|
8365
7621
|
add(issues, "skill.src_index_missing", "Missing src/index.ts or src/index.js");
|
|
8366
7622
|
} else {
|
|
8367
7623
|
const indexPath = existsSync4(join4(srcDir, "index.ts")) ? join4(srcDir, "index.ts") : join4(srcDir, "index.js");
|
|
8368
|
-
const size =
|
|
7624
|
+
const size = statSync2(indexPath).size;
|
|
8369
7625
|
if (size < 50)
|
|
8370
7626
|
add(warnings, "skill.src_index_minimal", `Source entry point is very small (${size}B)`);
|
|
8371
7627
|
}
|
|
@@ -8388,9 +7644,9 @@ function validateRegistryConsistency(registry, skillsDir) {
|
|
|
8388
7644
|
seen.add(name);
|
|
8389
7645
|
return false;
|
|
8390
7646
|
})));
|
|
8391
|
-
const skillDirs = existsSync4(skillsDir) ?
|
|
7647
|
+
const skillDirs = existsSync4(skillsDir) ? readdirSync2(skillsDir).filter((entry) => {
|
|
8392
7648
|
const fullPath = join4(skillsDir, entry);
|
|
8393
|
-
return !entry.startsWith(".") && entry !== "_common" &&
|
|
7649
|
+
return !entry.startsWith(".") && entry !== "_common" && statSync2(fullPath).isDirectory();
|
|
8394
7650
|
}) : [];
|
|
8395
7651
|
const directoryNames = new Set(skillDirs);
|
|
8396
7652
|
const registryNameSet = new Set(registryNames);
|
|
@@ -8406,7 +7662,7 @@ function validateRegistryConsistency(registry, skillsDir) {
|
|
|
8406
7662
|
|
|
8407
7663
|
// src/lib/skill-hash.ts
|
|
8408
7664
|
import { createHash } from "crypto";
|
|
8409
|
-
import { existsSync as existsSync5, readdirSync as
|
|
7665
|
+
import { existsSync as existsSync5, readdirSync as readdirSync3, readFileSync as readFileSync4, statSync as statSync3 } from "fs";
|
|
8410
7666
|
import { join as join5, sep } from "path";
|
|
8411
7667
|
|
|
8412
7668
|
// src/lib/skill-entry-path.ts
|
|
@@ -8506,7 +7762,7 @@ function collectBundleFiles(skillPath) {
|
|
|
8506
7762
|
const absolute = join5(skillPath, entry);
|
|
8507
7763
|
if (!existsSync5(absolute))
|
|
8508
7764
|
continue;
|
|
8509
|
-
if (
|
|
7765
|
+
if (statSync3(absolute).isDirectory())
|
|
8510
7766
|
collectDirectory(files, absolute, entry);
|
|
8511
7767
|
else
|
|
8512
7768
|
collectFile(files, absolute, entry);
|
|
@@ -8514,14 +7770,14 @@ function collectBundleFiles(skillPath) {
|
|
|
8514
7770
|
return files.sort((a, b) => a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0);
|
|
8515
7771
|
}
|
|
8516
7772
|
function collectDirectory(files, dir, rel) {
|
|
8517
|
-
for (const entry of
|
|
7773
|
+
for (const entry of readdirSync3(dir).sort()) {
|
|
8518
7774
|
if (entry.startsWith("."))
|
|
8519
7775
|
continue;
|
|
8520
7776
|
const absolute = join5(dir, entry);
|
|
8521
7777
|
const childRel = `${rel}/${entry}`;
|
|
8522
7778
|
let stats;
|
|
8523
7779
|
try {
|
|
8524
|
-
stats =
|
|
7780
|
+
stats = statSync3(absolute);
|
|
8525
7781
|
} catch {
|
|
8526
7782
|
continue;
|
|
8527
7783
|
}
|
|
@@ -9595,7 +8851,6 @@ function escapeJsString(value) {
|
|
|
9595
8851
|
return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\r?\n/g, " ");
|
|
9596
8852
|
}
|
|
9597
8853
|
// src/lib/portable-skills.ts
|
|
9598
|
-
var LEGACY_CUSTOM_DIRNAME = "custom";
|
|
9599
8854
|
function getPortableSkillsRoot(options = {}) {
|
|
9600
8855
|
return resolvePortableSkillsRoot(options, true);
|
|
9601
8856
|
}
|
|
@@ -9607,60 +8862,8 @@ function resolvePortableSkillsRoot(options, migrate) {
|
|
|
9607
8862
|
if (isOwnerLayoutMigrated(appDir) && safeIsDirectory(cache))
|
|
9608
8863
|
return cache;
|
|
9609
8864
|
const installed = join7(appDir, INSTALLED_SKILLS_DIRNAME);
|
|
9610
|
-
if (migrate)
|
|
9611
|
-
migrateLegacySkillLayout(appDir, installed);
|
|
9612
8865
|
return installed;
|
|
9613
8866
|
}
|
|
9614
|
-
function looksLikeSkillDirectory(path) {
|
|
9615
|
-
if (!safeIsDirectory(path))
|
|
9616
|
-
return false;
|
|
9617
|
-
return existsSync7(join7(path, "SKILL.md")) || existsSync7(join7(path, "skill.json")) || existsSync7(join7(path, "package.json"));
|
|
9618
|
-
}
|
|
9619
|
-
function migrateLegacySkillLayout(appDir, installed) {
|
|
9620
|
-
if (!safeIsDirectory(appDir))
|
|
9621
|
-
return;
|
|
9622
|
-
const candidates = [];
|
|
9623
|
-
try {
|
|
9624
|
-
for (const entry of readdirSync5(appDir)) {
|
|
9625
|
-
if (entry.startsWith(".") || entry === INSTALLED_SKILLS_DIRNAME)
|
|
9626
|
-
continue;
|
|
9627
|
-
const path = join7(appDir, entry);
|
|
9628
|
-
if (entry === LEGACY_CUSTOM_DIRNAME) {
|
|
9629
|
-
if (!safeIsDirectory(path))
|
|
9630
|
-
continue;
|
|
9631
|
-
try {
|
|
9632
|
-
for (const nested of readdirSync5(path)) {
|
|
9633
|
-
if (nested.startsWith("."))
|
|
9634
|
-
continue;
|
|
9635
|
-
const nestedPath = join7(path, nested);
|
|
9636
|
-
if (looksLikeSkillDirectory(nestedPath))
|
|
9637
|
-
candidates.push({ from: nestedPath, name: nested });
|
|
9638
|
-
}
|
|
9639
|
-
} catch {}
|
|
9640
|
-
continue;
|
|
9641
|
-
}
|
|
9642
|
-
if (looksLikeSkillDirectory(path))
|
|
9643
|
-
candidates.push({ from: path, name: entry });
|
|
9644
|
-
}
|
|
9645
|
-
} catch {
|
|
9646
|
-
return;
|
|
9647
|
-
}
|
|
9648
|
-
for (const { from, name } of candidates) {
|
|
9649
|
-
const target = join7(installed, name);
|
|
9650
|
-
if (existsSync7(target))
|
|
9651
|
-
continue;
|
|
9652
|
-
const staging = join7(installed, `.migrating-${name}-${process.pid}`);
|
|
9653
|
-
try {
|
|
9654
|
-
rmSync(staging, { recursive: true, force: true });
|
|
9655
|
-
cpSync2(from, staging, { recursive: true, errorOnExist: false });
|
|
9656
|
-
renameSync(staging, target);
|
|
9657
|
-
} catch {
|
|
9658
|
-
try {
|
|
9659
|
-
rmSync(staging, { recursive: true, force: true });
|
|
9660
|
-
} catch {}
|
|
9661
|
-
}
|
|
9662
|
-
}
|
|
9663
|
-
}
|
|
9664
8867
|
function getPortableSkillPath(name, options = {}) {
|
|
9665
8868
|
return join7(getPortableSkillsRoot(options), normalizePortableSkillName(name));
|
|
9666
8869
|
}
|
|
@@ -9672,7 +8875,7 @@ function findPortableSkill(name, options = {}) {
|
|
|
9672
8875
|
return null;
|
|
9673
8876
|
}
|
|
9674
8877
|
const path = getPortableSkillPath(normalized, options);
|
|
9675
|
-
if (!existsSync7(path) || !
|
|
8878
|
+
if (!existsSync7(path) || !statSync5(path).isDirectory())
|
|
9676
8879
|
return null;
|
|
9677
8880
|
try {
|
|
9678
8881
|
return summarizePortableSkill(path, normalized);
|
|
@@ -9685,7 +8888,7 @@ function listPortableSkills(options = {}) {
|
|
|
9685
8888
|
if (!safeIsDirectory(root))
|
|
9686
8889
|
return [];
|
|
9687
8890
|
const skills = [];
|
|
9688
|
-
for (const entry of
|
|
8891
|
+
for (const entry of readdirSync4(root).sort()) {
|
|
9689
8892
|
if (entry.startsWith("."))
|
|
9690
8893
|
continue;
|
|
9691
8894
|
const path = join7(root, entry);
|
|
@@ -9741,7 +8944,7 @@ function scaffoldPortableSkill(name, options = {}) {
|
|
|
9741
8944
|
}
|
|
9742
8945
|
function portPortableSkillDirectory(sourceDir, options = {}) {
|
|
9743
8946
|
const absoluteSource = normalize2(sourceDir);
|
|
9744
|
-
if (!existsSync7(absoluteSource) || !
|
|
8947
|
+
if (!existsSync7(absoluteSource) || !statSync5(absoluteSource).isDirectory()) {
|
|
9745
8948
|
throw new Error(`Import directory not found: ${sourceDir}`);
|
|
9746
8949
|
}
|
|
9747
8950
|
const continueOnError = options.continueOnError ?? true;
|
|
@@ -9753,7 +8956,7 @@ function portPortableSkillDirectory(sourceDir, options = {}) {
|
|
|
9753
8956
|
};
|
|
9754
8957
|
const imported = [];
|
|
9755
8958
|
const skipped = [];
|
|
9756
|
-
const entries =
|
|
8959
|
+
const entries = readdirSync4(absoluteSource, { withFileTypes: true }).map((entry) => entry.name).filter((entryName) => !entryName.startsWith(".")).sort();
|
|
9757
8960
|
for (const entryName of entries) {
|
|
9758
8961
|
const childPath = join7(absoluteSource, entryName);
|
|
9759
8962
|
if (!safeIsDirectory(childPath))
|
|
@@ -9808,7 +9011,7 @@ function assertDisjointImportPaths(source, destination) {
|
|
|
9808
9011
|
}
|
|
9809
9012
|
function portPortableSkill(sourcePath, options = {}) {
|
|
9810
9013
|
const absoluteSource = normalize2(sourcePath);
|
|
9811
|
-
if (!existsSync7(absoluteSource) || !
|
|
9014
|
+
if (!existsSync7(absoluteSource) || !statSync5(absoluteSource).isDirectory()) {
|
|
9812
9015
|
throw new Error(`Skill source directory not found: ${sourcePath}`);
|
|
9813
9016
|
}
|
|
9814
9017
|
const inferred = readPortableSkillManifestForImport(absoluteSource);
|
|
@@ -9972,7 +9175,7 @@ function validatePortableSkillDirectory(name, skillPath) {
|
|
|
9972
9175
|
const entryPath = join7(skillPath, command.entry);
|
|
9973
9176
|
if (!existsSync7(entryPath))
|
|
9974
9177
|
add3(issues, "portable.command_entry_missing", `Command '${command.name}' entry '${command.entry}' is missing`);
|
|
9975
|
-
else if (
|
|
9178
|
+
else if (statSync5(entryPath).isDirectory())
|
|
9976
9179
|
add3(issues, "portable.command_entry_directory", `Command '${command.name}' entry '${command.entry}' must be a file`);
|
|
9977
9180
|
}
|
|
9978
9181
|
}
|
|
@@ -10062,7 +9265,7 @@ function summarizePortableSkill(skillPath, fallbackName) {
|
|
|
10062
9265
|
}
|
|
10063
9266
|
function safeIsDirectory(path) {
|
|
10064
9267
|
try {
|
|
10065
|
-
return
|
|
9268
|
+
return statSync5(path).isDirectory();
|
|
10066
9269
|
} catch {
|
|
10067
9270
|
return false;
|
|
10068
9271
|
}
|
|
@@ -10128,9 +9331,7 @@ function mergeSkillRegistryLists(...groups) {
|
|
|
10128
9331
|
}
|
|
10129
9332
|
|
|
10130
9333
|
// src/lib/skill-aliases.ts
|
|
10131
|
-
var SKILL_ALIASES = {
|
|
10132
|
-
"create-blog-article": "blog-article"
|
|
10133
|
-
};
|
|
9334
|
+
var SKILL_ALIASES = {};
|
|
10134
9335
|
function normalizeSkillSlug(name) {
|
|
10135
9336
|
return name.trim();
|
|
10136
9337
|
}
|
|
@@ -10159,16 +9360,7 @@ var CATEGORIES = [
|
|
|
10159
9360
|
"Travel & Lifestyle",
|
|
10160
9361
|
"Event Management"
|
|
10161
9362
|
];
|
|
10162
|
-
var BASIC_SKILL_NAMES = [
|
|
10163
|
-
"blog-article",
|
|
10164
|
-
"ad-creative-pack",
|
|
10165
|
-
"email-sequence",
|
|
10166
|
-
"seo-content-pack",
|
|
10167
|
-
"social-content-calendar",
|
|
10168
|
-
"pitch-deck",
|
|
10169
|
-
"proposal-pack",
|
|
10170
|
-
"market-research-report"
|
|
10171
|
-
];
|
|
9363
|
+
var BASIC_SKILL_NAMES = [];
|
|
10172
9364
|
|
|
10173
9365
|
// src/lib/search.ts
|
|
10174
9366
|
function editDistance(a, b) {
|
|
@@ -10295,7 +9487,7 @@ function discoverSkillsInDir(dir, source = "custom") {
|
|
|
10295
9487
|
return [];
|
|
10296
9488
|
const result = [];
|
|
10297
9489
|
try {
|
|
10298
|
-
const entries =
|
|
9490
|
+
const entries = readdirSync5(dir, { withFileTypes: true });
|
|
10299
9491
|
for (const entry of entries) {
|
|
10300
9492
|
if (!entry.isDirectory())
|
|
10301
9493
|
continue;
|
|
@@ -10331,7 +9523,7 @@ function findExtensionSkillPath(name) {
|
|
|
10331
9523
|
if (!config.extensionsDir || !existsSync8(config.extensionsDir))
|
|
10332
9524
|
return null;
|
|
10333
9525
|
try {
|
|
10334
|
-
const entries =
|
|
9526
|
+
const entries = readdirSync5(config.extensionsDir, { withFileTypes: true });
|
|
10335
9527
|
for (const entry of entries) {
|
|
10336
9528
|
if (!entry.isDirectory())
|
|
10337
9529
|
continue;
|
|
@@ -10357,11 +9549,7 @@ var registryCacheTime = 0;
|
|
|
10357
9549
|
var registryCacheKey = null;
|
|
10358
9550
|
var REGISTRY_CACHE_TTL = 5000;
|
|
10359
9551
|
function registryRootKey() {
|
|
10360
|
-
return JSON.stringify([
|
|
10361
|
-
process.env[DATA_DIR_ENV] ?? "",
|
|
10362
|
-
process.env["HOME"] ?? "",
|
|
10363
|
-
process.env["USERPROFILE"] ?? ""
|
|
10364
|
-
]);
|
|
9552
|
+
return JSON.stringify([getDataDirReadOnly(), process.cwd()]);
|
|
10365
9553
|
}
|
|
10366
9554
|
function loadRegistry(cwd) {
|
|
10367
9555
|
const now = Date.now();
|
|
@@ -10369,22 +9557,16 @@ function loadRegistry(cwd) {
|
|
|
10369
9557
|
if (registryCache && registryCacheKey === rootKey && now - registryCacheTime < REGISTRY_CACHE_TTL) {
|
|
10370
9558
|
return registryCache;
|
|
10371
9559
|
}
|
|
10372
|
-
const dataDir2 = getDataDir();
|
|
10373
9560
|
const config = loadConfig();
|
|
10374
|
-
const official = SKILLS.map((s) => ({ ...s, source: "official" }));
|
|
10375
9561
|
const extensions = config.extensionsDir ? discoverSkillsInDir(config.extensionsDir, "extension") : [];
|
|
10376
|
-
const
|
|
10377
|
-
|
|
10378
|
-
const globalCustom = mergeCustomSkills([...legacyCustom, ...portableCustom]);
|
|
10379
|
-
registryCache = mergeSkillRegistryLists(official, extensions, globalCustom);
|
|
9562
|
+
const owned = listPortableSkillMetas();
|
|
9563
|
+
registryCache = mergeSkillRegistryLists(extensions, owned);
|
|
10380
9564
|
registryCacheTime = now;
|
|
10381
9565
|
registryCacheKey = rootKey;
|
|
10382
9566
|
return registryCache;
|
|
10383
9567
|
}
|
|
10384
9568
|
function loadBasicRegistry(cwd) {
|
|
10385
|
-
|
|
10386
|
-
const byName = new Map(registry.map((skill) => [skill.name, skill]));
|
|
10387
|
-
return BASIC_SKILL_NAMES.map((name) => byName.get(name)).filter((skill) => skill !== undefined);
|
|
9569
|
+
return loadRegistry(cwd);
|
|
10388
9570
|
}
|
|
10389
9571
|
function loadRegistryProfile(profile = "basic", cwd) {
|
|
10390
9572
|
return profile === "all" ? loadRegistry(cwd) : loadBasicRegistry(cwd);
|
|
@@ -10402,12 +9584,6 @@ function getSkill(name) {
|
|
|
10402
9584
|
const slug = normalizeSkillSlug(name);
|
|
10403
9585
|
return registry.find((s) => s.name === slug) ?? registry.find((s) => s.name === resolveSkillAlias(slug));
|
|
10404
9586
|
}
|
|
10405
|
-
function mergeCustomSkills(skills) {
|
|
10406
|
-
const byName = new Map;
|
|
10407
|
-
for (const skill of skills)
|
|
10408
|
-
byName.set(skill.name, skill);
|
|
10409
|
-
return Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name));
|
|
10410
|
-
}
|
|
10411
9587
|
function getSkillsByTag(tag) {
|
|
10412
9588
|
const needle = tag.toLowerCase();
|
|
10413
9589
|
return loadRegistry().filter((s) => s.tags.some((t) => t.toLowerCase().includes(needle)));
|
|
@@ -10422,22 +9598,21 @@ function getAllTags() {
|
|
|
10422
9598
|
}
|
|
10423
9599
|
// src/lib/installer.ts
|
|
10424
9600
|
import { existsSync as existsSync13, readFileSync as readFileSync14, rmSync as rmSync3 } from "fs";
|
|
10425
|
-
import {
|
|
9601
|
+
import { join as join20 } from "path";
|
|
10426
9602
|
import { homedir as homedir4 } from "os";
|
|
10427
|
-
import { fileURLToPath } from "url";
|
|
10428
9603
|
|
|
10429
9604
|
// src/lib/agent-sync.ts
|
|
10430
9605
|
import {
|
|
10431
|
-
cpSync as
|
|
9606
|
+
cpSync as cpSync2,
|
|
10432
9607
|
existsSync as existsSync11,
|
|
10433
9608
|
lstatSync as lstatSync12,
|
|
10434
9609
|
mkdirSync as mkdirSync6,
|
|
10435
9610
|
mkdtempSync as mkdtempSync2,
|
|
10436
9611
|
readFileSync as readFileSync12,
|
|
10437
|
-
readdirSync as
|
|
9612
|
+
readdirSync as readdirSync10,
|
|
10438
9613
|
renameSync as renameSync4,
|
|
10439
9614
|
rmSync as rmSync2,
|
|
10440
|
-
statSync as
|
|
9615
|
+
statSync as statSync8,
|
|
10441
9616
|
writeFileSync as writeFileSync6
|
|
10442
9617
|
} from "fs";
|
|
10443
9618
|
import { homedir as homedir3 } from "os";
|
|
@@ -10445,7 +9620,7 @@ import { basename as basename3, dirname as dirname11, join as join18 } from "pat
|
|
|
10445
9620
|
|
|
10446
9621
|
// src/lib/agent-integration.ts
|
|
10447
9622
|
import { createHash as createHash9, randomUUID as randomUUID2 } from "crypto";
|
|
10448
|
-
import { existsSync as existsSync10, lstatSync as lstatSync11, statSync as
|
|
9623
|
+
import { existsSync as existsSync10, lstatSync as lstatSync11, statSync as statSync7, mkdirSync as mkdirSync5, readFileSync as readFileSync11, readdirSync as readdirSync9, opendirSync as opendirSync3, readlinkSync as readlinkSync2, realpathSync as realpathSync4, renameSync as renameSync3, rmdirSync, writeFileSync as writeFileSync5, unlinkSync as unlinkSync2, chmodSync, openSync as openSync4, closeSync as closeSync4, fsyncSync, fstatSync as fstatSync4, readSync as readSync4, constants as constants4, linkSync } from "fs";
|
|
10449
9624
|
import { dirname as dirname10, join as join17, resolve as resolve9, relative as relative4, isAbsolute as isAbsolute8, sep as sep5 } from "path";
|
|
10450
9625
|
import { homedir as homedir2 } from "os";
|
|
10451
9626
|
|
|
@@ -10460,7 +9635,7 @@ import { dirname as dirname4, join as join10, parse, resolve as resolve3 } from
|
|
|
10460
9635
|
|
|
10461
9636
|
// src/lib/skill-bundle.ts
|
|
10462
9637
|
import { createHash as createHash2 } from "crypto";
|
|
10463
|
-
import { readFileSync as readFileSync7, readdirSync as
|
|
9638
|
+
import { readFileSync as readFileSync7, readdirSync as readdirSync6, statSync as statSync6 } from "fs";
|
|
10464
9639
|
import { join as join9, relative as relative3 } from "path";
|
|
10465
9640
|
import { createGunzip } from "zlib";
|
|
10466
9641
|
var BLOCK = 512;
|
|
@@ -10622,7 +9797,7 @@ function collectSkillBundleEntries(dir) {
|
|
|
10622
9797
|
return entries.sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
|
|
10623
9798
|
}
|
|
10624
9799
|
function walk(root, current, out) {
|
|
10625
|
-
for (const entry of
|
|
9800
|
+
for (const entry of readdirSync6(current, { withFileTypes: true })) {
|
|
10626
9801
|
const absolute = join9(current, entry.name);
|
|
10627
9802
|
const rel = relative3(root, absolute).split("\\").join("/");
|
|
10628
9803
|
const isRootLevel = !rel.includes("/");
|
|
@@ -10644,7 +9819,7 @@ function walk(root, current, out) {
|
|
|
10644
9819
|
continue;
|
|
10645
9820
|
if (isCredentialFile(entry.name))
|
|
10646
9821
|
continue;
|
|
10647
|
-
const stats =
|
|
9822
|
+
const stats = statSync6(absolute);
|
|
10648
9823
|
out.push({
|
|
10649
9824
|
path: rel,
|
|
10650
9825
|
bytes: ownBytes(readFileSync7(absolute)),
|
|
@@ -11501,7 +10676,7 @@ function requiresCliSkillLoading(dataDir2 = getDataDirReadOnly()) {
|
|
|
11501
10676
|
|
|
11502
10677
|
// src/lib/agent-bridge.ts
|
|
11503
10678
|
import { createHash as createHash4 } from "crypto";
|
|
11504
|
-
import { lstatSync as lstatSync5, readFileSync as readFileSync8, readdirSync as
|
|
10679
|
+
import { lstatSync as lstatSync5, readFileSync as readFileSync8, readdirSync as readdirSync7 } from "fs";
|
|
11505
10680
|
import { join as join12 } from "path";
|
|
11506
10681
|
var CLI_BRIDGE_NAME = "skills-cli";
|
|
11507
10682
|
var CLI_BRIDGE_VERSION = 1;
|
|
@@ -11531,7 +10706,7 @@ function isOwnedCliBridge(path, expectedPaths) {
|
|
|
11531
10706
|
try {
|
|
11532
10707
|
if (!lstatSync5(path).isDirectory())
|
|
11533
10708
|
return false;
|
|
11534
|
-
if (JSON.stringify(
|
|
10709
|
+
if (JSON.stringify(readdirSync7(path).sort()) !== JSON.stringify(Object.keys(CLI_BRIDGE_FILES).sort()))
|
|
11535
10710
|
return false;
|
|
11536
10711
|
return Object.entries(CLI_BRIDGE_FILES).every(([name, content]) => {
|
|
11537
10712
|
const file = join12(path, name), stat = lstatSync5(file);
|
|
@@ -11544,10 +10719,10 @@ function isOwnedCliBridge(path, expectedPaths) {
|
|
|
11544
10719
|
|
|
11545
10720
|
// src/lib/agent-discovery.ts
|
|
11546
10721
|
import { createHash as createHash8 } from "crypto";
|
|
11547
|
-
import { lstatSync as lstatSync10, readFileSync as readFileSync10, readdirSync as
|
|
10722
|
+
import { lstatSync as lstatSync10, readFileSync as readFileSync10, readdirSync as readdirSync8, realpathSync as realpathSync3 } from "fs";
|
|
11548
10723
|
import { dirname as dirname9, isAbsolute as isAbsolute7, join as join16, resolve as resolve8, sep as sep4 } from "path";
|
|
11549
10724
|
|
|
11550
|
-
//
|
|
10725
|
+
// node_modules/yaml/dist/index.js
|
|
11551
10726
|
var composer = require_composer();
|
|
11552
10727
|
var Document = require_Document();
|
|
11553
10728
|
var Schema = require_Schema();
|
|
@@ -12156,7 +11331,7 @@ function resolveAgentDiscovery(options) {
|
|
|
12156
11331
|
safe3(builtinRoot);
|
|
12157
11332
|
if (!lstatSync10(builtinRoot, { throwIfNoEntry: false })?.isDirectory())
|
|
12158
11333
|
unresolved("installed Gemini builtin root is missing");
|
|
12159
|
-
for (const name of
|
|
11334
|
+
for (const name of readdirSync8(builtinRoot).sort()) {
|
|
12160
11335
|
const text2 = witness(join16(builtinRoot, name, "SKILL.md"));
|
|
12161
11336
|
const match = text2?.match(/^---\r?\n[\s\S]*?^name:\s*([a-z0-9][a-z0-9-]*)\s*$/m);
|
|
12162
11337
|
if (!match?.[1] || builtinNames.includes(match[1]))
|
|
@@ -12192,7 +11367,7 @@ function resolveAgentDiscovery(options) {
|
|
|
12192
11367
|
unresolved("plugin hooks require a separate no-skill-injection review");
|
|
12193
11368
|
const commands = join16(root, "commands");
|
|
12194
11369
|
safe3(commands);
|
|
12195
|
-
if (agent === "claude" && (manifest.commands !== undefined || lstatSync10(commands, { throwIfNoEntry: false })?.isDirectory() &&
|
|
11370
|
+
if (agent === "claude" && (manifest.commands !== undefined || lstatSync10(commands, { throwIfNoEntry: false })?.isDirectory() && readdirSync8(commands).length))
|
|
12196
11371
|
unresolved("legacy command discovery requires retirement or a dedicated format adapter");
|
|
12197
11372
|
const rootSkill = witness(join16(root, "SKILL.md"));
|
|
12198
11373
|
if (rootSkill !== null)
|
|
@@ -12214,7 +11389,7 @@ function resolveAgentDiscovery(options) {
|
|
|
12214
11389
|
const installed = registrations === null ? {} : parseConfig(registrations, join16(home, ".claude/plugins/installed_plugins.json")).plugins;
|
|
12215
11390
|
const commands = canonical2(join16(home, ".claude/commands"));
|
|
12216
11391
|
safe3(commands);
|
|
12217
|
-
if (lstatSync10(commands, { throwIfNoEntry: false })?.isDirectory() &&
|
|
11392
|
+
if (lstatSync10(commands, { throwIfNoEntry: false })?.isDirectory() && readdirSync8(commands).length)
|
|
12218
11393
|
unresolved("legacy home command discovery requires a dedicated format adapter");
|
|
12219
11394
|
for (const [id, enabled] of Object.entries(config.enabledPlugins ?? {})) {
|
|
12220
11395
|
if (enabled === false)
|
|
@@ -12256,7 +11431,7 @@ function resolveAgentDiscovery(options) {
|
|
|
12256
11431
|
}
|
|
12257
11432
|
const localPlugins = join16(home, ".config/opencode/plugins");
|
|
12258
11433
|
safe3(localPlugins);
|
|
12259
|
-
if (lstatSync10(localPlugins, { throwIfNoEntry: false }) &&
|
|
11434
|
+
if (lstatSync10(localPlugins, { throwIfNoEntry: false }) && readdirSync8(localPlugins).some((name) => name !== "skills-cli.js"))
|
|
12260
11435
|
unresolved("additional local plugin hooks require review");
|
|
12261
11436
|
} else if (agent === "hermes") {
|
|
12262
11437
|
for (const directory of [join16(home, ".hermes/plugins"), join16(home, ".hermes/hermes-agent")]) {
|
|
@@ -12272,7 +11447,7 @@ function resolveAgentDiscovery(options) {
|
|
|
12272
11447
|
const directory = join16(home, ".gemini/extensions");
|
|
12273
11448
|
safe3(directory);
|
|
12274
11449
|
if (lstatSync10(directory, { throwIfNoEntry: false }))
|
|
12275
|
-
for (const name of
|
|
11450
|
+
for (const name of readdirSync8(directory)) {
|
|
12276
11451
|
const root = join16(directory, name);
|
|
12277
11452
|
safe3(root);
|
|
12278
11453
|
if (!lstatSync10(root)?.isDirectory())
|
|
@@ -12456,7 +11631,7 @@ function treeHash(root) {
|
|
|
12456
11631
|
const rel = relative4(root, path);
|
|
12457
11632
|
if (stat.isDirectory()) {
|
|
12458
11633
|
hash2.update(`d\x00${rel}\x00`);
|
|
12459
|
-
for (const name of
|
|
11634
|
+
for (const name of readdirSync9(path).sort())
|
|
12460
11635
|
visit2(join17(path, name));
|
|
12461
11636
|
return;
|
|
12462
11637
|
}
|
|
@@ -12554,7 +11729,7 @@ function inventoryNativeSkills(home = homedir2(), options = {}) {
|
|
|
12554
11729
|
continue;
|
|
12555
11730
|
const child = join17(path, name);
|
|
12556
11731
|
if (isVendor && lstatSync11(child, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
12557
|
-
const target =
|
|
11732
|
+
const target = statSync7(child, { throwIfNoEntry: false });
|
|
12558
11733
|
if (target?.isFile() || pluginCache && target?.isDirectory() && emptySiblingCacheAlias(child, path)) {
|
|
12559
11734
|
scan.entries++;
|
|
12560
11735
|
continue;
|
|
@@ -13154,7 +12329,7 @@ function packageSourceRoots(source) {
|
|
|
13154
12329
|
function containsSkillDirectories(path) {
|
|
13155
12330
|
let entries;
|
|
13156
12331
|
try {
|
|
13157
|
-
entries =
|
|
12332
|
+
entries = readdirSync10(path);
|
|
13158
12333
|
} catch {
|
|
13159
12334
|
return false;
|
|
13160
12335
|
}
|
|
@@ -13167,7 +12342,7 @@ function containsSkillDirectories(path) {
|
|
|
13167
12342
|
}
|
|
13168
12343
|
function isDirectory(path) {
|
|
13169
12344
|
try {
|
|
13170
|
-
return
|
|
12345
|
+
return statSync8(path).isDirectory();
|
|
13171
12346
|
} catch {
|
|
13172
12347
|
return false;
|
|
13173
12348
|
}
|
|
@@ -13304,7 +12479,7 @@ function writeManagedSkillDir(dir, skillMd, options) {
|
|
|
13304
12479
|
let preserveTransaction = false;
|
|
13305
12480
|
try {
|
|
13306
12481
|
if (options.resourceDir) {
|
|
13307
|
-
|
|
12482
|
+
cpSync2(options.resourceDir, candidateDir, { recursive: true, force: true });
|
|
13308
12483
|
} else {
|
|
13309
12484
|
mkdirSync6(candidateDir, { recursive: true });
|
|
13310
12485
|
}
|
|
@@ -13521,30 +12696,15 @@ function isPinSource(value) {
|
|
|
13521
12696
|
}
|
|
13522
12697
|
|
|
13523
12698
|
// src/lib/installer.ts
|
|
13524
|
-
var __dirname2 = dirname12(fileURLToPath(import.meta.url));
|
|
13525
|
-
function findSkillsDir() {
|
|
13526
|
-
let dir = __dirname2;
|
|
13527
|
-
for (let i = 0;i < 5; i++) {
|
|
13528
|
-
const candidate = join20(dir, "skills");
|
|
13529
|
-
if (existsSync13(candidate) && !dir.includes(".skills"))
|
|
13530
|
-
return candidate;
|
|
13531
|
-
dir = dirname12(dir);
|
|
13532
|
-
}
|
|
13533
|
-
return join20(__dirname2, "..", "skills");
|
|
13534
|
-
}
|
|
13535
|
-
var SKILLS_DIR = findSkillsDir();
|
|
13536
12699
|
function getSkillPath(name) {
|
|
13537
12700
|
const skillName = normalizeSkillName(getCanonicalSkillName(name));
|
|
13538
12701
|
const portable = findPortableSkill(skillName);
|
|
13539
12702
|
if (portable)
|
|
13540
12703
|
return portable.path;
|
|
13541
|
-
const legacyCustomPath = join20(getDataDir(), "custom", skillName);
|
|
13542
|
-
if (existsSync13(legacyCustomPath))
|
|
13543
|
-
return legacyCustomPath;
|
|
13544
12704
|
const extensionPath = findExtensionSkillPath(skillName);
|
|
13545
12705
|
if (extensionPath)
|
|
13546
12706
|
return extensionPath;
|
|
13547
|
-
return join20(
|
|
12707
|
+
return join20(getPortableSkillsRoot(), skillName);
|
|
13548
12708
|
}
|
|
13549
12709
|
function getCanonicalSkillName(name) {
|
|
13550
12710
|
return getSkill(name)?.name ?? resolveSkillAlias(normalizeSkillSlug(name));
|
|
@@ -13798,7 +12958,7 @@ function loadProjectConfigCompat(targetDir) {
|
|
|
13798
12958
|
}
|
|
13799
12959
|
// src/lib/run-state.ts
|
|
13800
12960
|
import { createHash as createHash10, randomBytes } from "crypto";
|
|
13801
|
-
import { existsSync as existsSync14, mkdirSync as mkdirSync8, readFileSync as readFileSync15, readdirSync as
|
|
12961
|
+
import { existsSync as existsSync14, mkdirSync as mkdirSync8, readFileSync as readFileSync15, readdirSync as readdirSync11, statSync as statSync9, writeFileSync as writeFileSync8 } from "fs";
|
|
13802
12962
|
import { extname, join as join21, relative as relative5 } from "path";
|
|
13803
12963
|
function createSkillRun(params, targetDir = process.cwd()) {
|
|
13804
12964
|
const now = new Date;
|
|
@@ -13878,11 +13038,11 @@ function listSkillRuns(targetDir = process.cwd(), limit = 50) {
|
|
|
13878
13038
|
if (!existsSync14(runsRoot))
|
|
13879
13039
|
return [];
|
|
13880
13040
|
const records = [];
|
|
13881
|
-
for (const day of
|
|
13041
|
+
for (const day of readdirSync11(runsRoot).sort().reverse()) {
|
|
13882
13042
|
const dayDir = join21(runsRoot, day);
|
|
13883
|
-
if (!
|
|
13043
|
+
if (!statSync9(dayDir).isDirectory())
|
|
13884
13044
|
continue;
|
|
13885
|
-
for (const runId of
|
|
13045
|
+
for (const runId of readdirSync11(dayDir).sort().reverse()) {
|
|
13886
13046
|
const record2 = readRunRecord(join21(dayDir, runId));
|
|
13887
13047
|
if (record2)
|
|
13888
13048
|
records.push(record2);
|
|
@@ -13896,7 +13056,7 @@ function findSkillRun(runId, targetDir = process.cwd()) {
|
|
|
13896
13056
|
const runsRoot = join21(getProjectStateDir(targetDir), "runs");
|
|
13897
13057
|
if (!existsSync14(runsRoot))
|
|
13898
13058
|
return null;
|
|
13899
|
-
for (const day of
|
|
13059
|
+
for (const day of readdirSync11(runsRoot)) {
|
|
13900
13060
|
const record2 = readRunRecord(join21(runsRoot, day, runId));
|
|
13901
13061
|
if (record2)
|
|
13902
13062
|
return record2;
|
|
@@ -13919,7 +13079,7 @@ function collectRunArtifacts(context) {
|
|
|
13919
13079
|
return [];
|
|
13920
13080
|
const artifacts = [];
|
|
13921
13081
|
for (const path of walkFiles(context.exportDir)) {
|
|
13922
|
-
const stat =
|
|
13082
|
+
const stat = statSync9(path);
|
|
13923
13083
|
const bytes = readFileSync15(path);
|
|
13924
13084
|
artifacts.push({
|
|
13925
13085
|
path: toProjectRelative(context.targetDir, path),
|
|
@@ -13942,9 +13102,9 @@ function readRunRecord(runDir) {
|
|
|
13942
13102
|
}
|
|
13943
13103
|
function walkFiles(dir) {
|
|
13944
13104
|
const files = [];
|
|
13945
|
-
for (const entry of
|
|
13105
|
+
for (const entry of readdirSync11(dir)) {
|
|
13946
13106
|
const full = join21(dir, entry);
|
|
13947
|
-
if (
|
|
13107
|
+
if (statSync9(full).isDirectory())
|
|
13948
13108
|
files.push(...walkFiles(full));
|
|
13949
13109
|
else
|
|
13950
13110
|
files.push(full);
|
|
@@ -13989,7 +13149,7 @@ function mimeForPath(path) {
|
|
|
13989
13149
|
}
|
|
13990
13150
|
}
|
|
13991
13151
|
// src/lib/dependency-preparation.ts
|
|
13992
|
-
import { constants as constants5, closeSync as closeSync5, fstatSync as fstatSync5, lstatSync as lstatSync13, mkdirSync as mkdirSync9, openSync as openSync5, readFileSync as readFileSync16, readdirSync as
|
|
13152
|
+
import { constants as constants5, closeSync as closeSync5, fstatSync as fstatSync5, lstatSync as lstatSync13, mkdirSync as mkdirSync9, openSync as openSync5, readFileSync as readFileSync16, readdirSync as readdirSync12, rmdirSync as rmdirSync2, unlinkSync as unlinkSync3, ftruncateSync, writeSync } from "fs";
|
|
13993
13153
|
import { join as join22 } from "path";
|
|
13994
13154
|
|
|
13995
13155
|
// src/lib/preparation-process.ts
|
|
@@ -14059,7 +13219,7 @@ function claimPreparation(skillPath) {
|
|
|
14059
13219
|
if (!lstatSync13(marker).isDirectory() || lstatSync13(marker).isSymbolicLink())
|
|
14060
13220
|
return;
|
|
14061
13221
|
if (!created) {
|
|
14062
|
-
if (
|
|
13222
|
+
if (readdirSync12(marker).some((name) => name !== "state.json"))
|
|
14063
13223
|
return;
|
|
14064
13224
|
if (!lstatSync13(state).isFile() || lstatSync13(state).isSymbolicLink() || lstatSync13(state).size > 1024)
|
|
14065
13225
|
return;
|
|
@@ -14507,7 +13667,7 @@ function readIfExists(path) {
|
|
|
14507
13667
|
} catch {}
|
|
14508
13668
|
return null;
|
|
14509
13669
|
}
|
|
14510
|
-
//
|
|
13670
|
+
// node_modules/zod/v4/classic/external.js
|
|
14511
13671
|
var exports_external = {};
|
|
14512
13672
|
__export(exports_external, {
|
|
14513
13673
|
xor: () => xor,
|
|
@@ -14764,7 +13924,7 @@ __export(exports_external, {
|
|
|
14764
13924
|
$brand: () => $brand
|
|
14765
13925
|
});
|
|
14766
13926
|
|
|
14767
|
-
//
|
|
13927
|
+
// node_modules/zod/v4/core/index.js
|
|
14768
13928
|
var exports_core2 = {};
|
|
14769
13929
|
__export(exports_core2, {
|
|
14770
13930
|
version: () => version,
|
|
@@ -15071,7 +14231,7 @@ __export(exports_core2, {
|
|
|
15071
14231
|
$ZodAny: () => $ZodAny
|
|
15072
14232
|
});
|
|
15073
14233
|
|
|
15074
|
-
//
|
|
14234
|
+
// node_modules/zod/v4/core/util.js
|
|
15075
14235
|
var exports_util = {};
|
|
15076
14236
|
__export(exports_util, {
|
|
15077
14237
|
unwrapMessage: () => unwrapMessage,
|
|
@@ -15904,7 +15064,7 @@ function constantCatch(value) {
|
|
|
15904
15064
|
return fn;
|
|
15905
15065
|
}
|
|
15906
15066
|
|
|
15907
|
-
//
|
|
15067
|
+
// node_modules/zod/v4/core/core.js
|
|
15908
15068
|
var _a;
|
|
15909
15069
|
var NEVER = /* @__PURE__ */ Object.freeze({
|
|
15910
15070
|
status: "aborted"
|
|
@@ -16028,7 +15188,7 @@ function config(newConfig) {
|
|
|
16028
15188
|
Object.assign(globalConfig, newConfig);
|
|
16029
15189
|
return globalConfig;
|
|
16030
15190
|
}
|
|
16031
|
-
//
|
|
15191
|
+
// node_modules/zod/v4/core/errors.js
|
|
16032
15192
|
function _getMessage() {
|
|
16033
15193
|
const internals = this._zod;
|
|
16034
15194
|
internals.message ?? (internals.message = JSON.stringify(internals.def, jsonStringifyReplacer, 2));
|
|
@@ -16225,7 +15385,7 @@ function prettifyError(error) {
|
|
|
16225
15385
|
`);
|
|
16226
15386
|
}
|
|
16227
15387
|
|
|
16228
|
-
//
|
|
15388
|
+
// node_modules/zod/v4/core/parse.js
|
|
16229
15389
|
function finalizeParams(callee, params) {
|
|
16230
15390
|
return { callee: params?.callee ?? callee, Err: params?.Err };
|
|
16231
15391
|
}
|
|
@@ -16367,7 +15527,7 @@ var _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {
|
|
|
16367
15527
|
return _safeParseAsync(_Err)(schema, value, _ctx);
|
|
16368
15528
|
};
|
|
16369
15529
|
var safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync($ZodRealError);
|
|
16370
|
-
//
|
|
15530
|
+
// node_modules/zod/v4/core/regexes.js
|
|
16371
15531
|
var exports_regexes = {};
|
|
16372
15532
|
__export(exports_regexes, {
|
|
16373
15533
|
xid: () => xid,
|
|
@@ -16533,7 +15693,7 @@ var sha512_hex = /^[0-9a-fA-F]{128}$/;
|
|
|
16533
15693
|
var sha512_base64 = /* @__PURE__ */ fixedBase64(86, "==");
|
|
16534
15694
|
var sha512_base64url = /* @__PURE__ */ fixedBase64url(86);
|
|
16535
15695
|
|
|
16536
|
-
//
|
|
15696
|
+
// node_modules/zod/v4/core/checks.js
|
|
16537
15697
|
var $ZodCheck = /* @__PURE__ */ $constructor("$ZodCheck", (inst, def) => {
|
|
16538
15698
|
var _a2;
|
|
16539
15699
|
inst._zod ?? (inst._zod = {});
|
|
@@ -17073,7 +16233,7 @@ var $ZodCheckOverwrite = /* @__PURE__ */ $constructor("$ZodCheckOverwrite", (ins
|
|
|
17073
16233
|
};
|
|
17074
16234
|
});
|
|
17075
16235
|
|
|
17076
|
-
//
|
|
16236
|
+
// node_modules/zod/v4/core/doc.js
|
|
17077
16237
|
class Doc {
|
|
17078
16238
|
constructor(args = [], closed = {}) {
|
|
17079
16239
|
this.content = [];
|
|
@@ -17112,14 +16272,14 @@ ${content.join(`
|
|
|
17112
16272
|
}
|
|
17113
16273
|
}
|
|
17114
16274
|
|
|
17115
|
-
//
|
|
16275
|
+
// node_modules/zod/v4/core/versions.js
|
|
17116
16276
|
var version = {
|
|
17117
16277
|
major: 4,
|
|
17118
16278
|
minor: 5,
|
|
17119
16279
|
patch: 4
|
|
17120
16280
|
};
|
|
17121
16281
|
|
|
17122
|
-
//
|
|
16282
|
+
// node_modules/zod/v4/core/schemas.js
|
|
17123
16283
|
var $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => {
|
|
17124
16284
|
var _a2;
|
|
17125
16285
|
inst ?? (inst = {});
|
|
@@ -19371,7 +18531,7 @@ function handleRefineResult(result, payload, input, inst) {
|
|
|
19371
18531
|
payload.issues.push(issue(_iss));
|
|
19372
18532
|
}
|
|
19373
18533
|
}
|
|
19374
|
-
//
|
|
18534
|
+
// node_modules/zod/v4/core/memoizer.js
|
|
19375
18535
|
class $ZodCyclicError extends Error {
|
|
19376
18536
|
constructor() {
|
|
19377
18537
|
super(`Cannot parse a reference cycle that closes through a transform`);
|
|
@@ -19607,7 +18767,7 @@ function isBackEdge(ctx, value) {
|
|
|
19607
18767
|
const backEdges = ctx[STATE]?.backEdges;
|
|
19608
18768
|
return backEdges !== undefined && value !== null && typeof value === "object" && backEdges.has(value);
|
|
19609
18769
|
}
|
|
19610
|
-
//
|
|
18770
|
+
// node_modules/zod/v4/locales/index.js
|
|
19611
18771
|
var exports_locales = {};
|
|
19612
18772
|
__export(exports_locales, {
|
|
19613
18773
|
zhTW: () => zh_TW_default,
|
|
@@ -19674,7 +18834,7 @@ __export(exports_locales, {
|
|
|
19674
18834
|
ar: () => ar_default
|
|
19675
18835
|
});
|
|
19676
18836
|
|
|
19677
|
-
//
|
|
18837
|
+
// node_modules/zod/v4/locales/ar.js
|
|
19678
18838
|
var error = () => {
|
|
19679
18839
|
const Sizable = {
|
|
19680
18840
|
string: { unit: "\u062D\u0631\u0641", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" },
|
|
@@ -19783,7 +18943,7 @@ function ar_default() {
|
|
|
19783
18943
|
localeError: error()
|
|
19784
18944
|
};
|
|
19785
18945
|
}
|
|
19786
|
-
//
|
|
18946
|
+
// node_modules/zod/v4/locales/az.js
|
|
19787
18947
|
var error2 = () => {
|
|
19788
18948
|
const Sizable = {
|
|
19789
18949
|
string: { unit: "simvol", verb: "olmal\u0131d\u0131r" },
|
|
@@ -19891,7 +19051,7 @@ function az_default() {
|
|
|
19891
19051
|
localeError: error2()
|
|
19892
19052
|
};
|
|
19893
19053
|
}
|
|
19894
|
-
//
|
|
19054
|
+
// node_modules/zod/v4/locales/be.js
|
|
19895
19055
|
function getBelarusianPlural(count, one, few, many) {
|
|
19896
19056
|
const absCount = Math.abs(count);
|
|
19897
19057
|
const lastDigit = absCount % 10;
|
|
@@ -20057,7 +19217,7 @@ function be_default() {
|
|
|
20057
19217
|
localeError: error3()
|
|
20058
19218
|
};
|
|
20059
19219
|
}
|
|
20060
|
-
//
|
|
19220
|
+
// node_modules/zod/v4/locales/bg.js
|
|
20061
19221
|
var error4 = () => {
|
|
20062
19222
|
const Sizable = {
|
|
20063
19223
|
string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0430", verb: "\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430" },
|
|
@@ -20180,7 +19340,7 @@ function bg_default() {
|
|
|
20180
19340
|
localeError: error4()
|
|
20181
19341
|
};
|
|
20182
19342
|
}
|
|
20183
|
-
//
|
|
19343
|
+
// node_modules/zod/v4/locales/bn.js
|
|
20184
19344
|
var error5 = () => {
|
|
20185
19345
|
const Sizable = {
|
|
20186
19346
|
string: { unit: "\u0985\u0995\u09CD\u09B7\u09B0", verb: "\u09A5\u09BE\u0995\u09A4\u09C7 \u09B9\u09AC\u09C7" },
|
|
@@ -20291,7 +19451,7 @@ function bn_default() {
|
|
|
20291
19451
|
localeError: error5()
|
|
20292
19452
|
};
|
|
20293
19453
|
}
|
|
20294
|
-
//
|
|
19454
|
+
// node_modules/zod/v4/locales/ca.js
|
|
20295
19455
|
var error6 = () => {
|
|
20296
19456
|
const Sizable = {
|
|
20297
19457
|
string: { unit: "car\xE0cters", verb: "contenir" },
|
|
@@ -20401,7 +19561,7 @@ function ca_default() {
|
|
|
20401
19561
|
localeError: error6()
|
|
20402
19562
|
};
|
|
20403
19563
|
}
|
|
20404
|
-
//
|
|
19564
|
+
// node_modules/zod/v4/locales/ckb.js
|
|
20405
19565
|
var error7 = () => {
|
|
20406
19566
|
const Sizable = {
|
|
20407
19567
|
string: { unit: "\u067E\u06CC\u062A", verb: "\u0628\u06CE\u062A" },
|
|
@@ -20531,7 +19691,7 @@ function ckb_default() {
|
|
|
20531
19691
|
localeError: error7()
|
|
20532
19692
|
};
|
|
20533
19693
|
}
|
|
20534
|
-
//
|
|
19694
|
+
// node_modules/zod/v4/locales/cs.js
|
|
20535
19695
|
var error8 = () => {
|
|
20536
19696
|
const Sizable = {
|
|
20537
19697
|
string: { unit: "znak\u016F", verb: "m\xEDt" },
|
|
@@ -20645,7 +19805,7 @@ function cs_default() {
|
|
|
20645
19805
|
localeError: error8()
|
|
20646
19806
|
};
|
|
20647
19807
|
}
|
|
20648
|
-
//
|
|
19808
|
+
// node_modules/zod/v4/locales/da.js
|
|
20649
19809
|
var error9 = () => {
|
|
20650
19810
|
const Sizable = {
|
|
20651
19811
|
string: { unit: "tegn", verb: "havde" },
|
|
@@ -20763,7 +19923,7 @@ function da_default() {
|
|
|
20763
19923
|
localeError: error9()
|
|
20764
19924
|
};
|
|
20765
19925
|
}
|
|
20766
|
-
//
|
|
19926
|
+
// node_modules/zod/v4/locales/de.js
|
|
20767
19927
|
var error10 = () => {
|
|
20768
19928
|
const Sizable = {
|
|
20769
19929
|
string: { unit: "Zeichen", verb: "zu haben" },
|
|
@@ -20874,7 +20034,7 @@ function de_default() {
|
|
|
20874
20034
|
localeError: error10()
|
|
20875
20035
|
};
|
|
20876
20036
|
}
|
|
20877
|
-
//
|
|
20037
|
+
// node_modules/zod/v4/locales/el.js
|
|
20878
20038
|
var error11 = () => {
|
|
20879
20039
|
const Sizable = {
|
|
20880
20040
|
string: { unit: "\u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2", verb: "\u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9" },
|
|
@@ -20984,7 +20144,7 @@ function el_default() {
|
|
|
20984
20144
|
localeError: error11()
|
|
20985
20145
|
};
|
|
20986
20146
|
}
|
|
20987
|
-
//
|
|
20147
|
+
// node_modules/zod/v4/locales/en.js
|
|
20988
20148
|
var error12 = () => {
|
|
20989
20149
|
const Sizable = {
|
|
20990
20150
|
string: { unit: "characters", verb: "to have" },
|
|
@@ -21104,7 +20264,7 @@ function en_default() {
|
|
|
21104
20264
|
localeError: error12()
|
|
21105
20265
|
};
|
|
21106
20266
|
}
|
|
21107
|
-
//
|
|
20267
|
+
// node_modules/zod/v4/locales/eo.js
|
|
21108
20268
|
var error13 = () => {
|
|
21109
20269
|
const Sizable = {
|
|
21110
20270
|
string: { unit: "karaktrojn", verb: "havi" },
|
|
@@ -21216,7 +20376,7 @@ function eo_default() {
|
|
|
21216
20376
|
localeError: error13()
|
|
21217
20377
|
};
|
|
21218
20378
|
}
|
|
21219
|
-
//
|
|
20379
|
+
// node_modules/zod/v4/locales/es.js
|
|
21220
20380
|
var error14 = () => {
|
|
21221
20381
|
const Sizable = {
|
|
21222
20382
|
string: { unit: "caracteres", verb: "tener" },
|
|
@@ -21350,7 +20510,7 @@ function es_default() {
|
|
|
21350
20510
|
localeError: error14()
|
|
21351
20511
|
};
|
|
21352
20512
|
}
|
|
21353
|
-
//
|
|
20513
|
+
// node_modules/zod/v4/locales/fa.js
|
|
21354
20514
|
var error15 = () => {
|
|
21355
20515
|
const Sizable = {
|
|
21356
20516
|
string: { unit: "\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" },
|
|
@@ -21467,7 +20627,7 @@ function fa_default() {
|
|
|
21467
20627
|
localeError: error15()
|
|
21468
20628
|
};
|
|
21469
20629
|
}
|
|
21470
|
-
//
|
|
20630
|
+
// node_modules/zod/v4/locales/fi.js
|
|
21471
20631
|
var error16 = () => {
|
|
21472
20632
|
const Sizable = {
|
|
21473
20633
|
string: { unit: "merkki\xE4", subject: "merkkijonon" },
|
|
@@ -21582,7 +20742,7 @@ function fi_default() {
|
|
|
21582
20742
|
localeError: error16()
|
|
21583
20743
|
};
|
|
21584
20744
|
}
|
|
21585
|
-
//
|
|
20745
|
+
// node_modules/zod/v4/locales/fr.js
|
|
21586
20746
|
var error17 = () => {
|
|
21587
20747
|
const Sizable = {
|
|
21588
20748
|
string: { unit: "caract\xE8res", verb: "avoir" },
|
|
@@ -21709,7 +20869,7 @@ function fr_default() {
|
|
|
21709
20869
|
localeError: error17()
|
|
21710
20870
|
};
|
|
21711
20871
|
}
|
|
21712
|
-
//
|
|
20872
|
+
// node_modules/zod/v4/locales/fr-CA.js
|
|
21713
20873
|
var error18 = () => {
|
|
21714
20874
|
const Sizable = {
|
|
21715
20875
|
string: { unit: "caract\xE8res", verb: "avoir" },
|
|
@@ -21819,7 +20979,7 @@ function fr_CA_default() {
|
|
|
21819
20979
|
localeError: error18()
|
|
21820
20980
|
};
|
|
21821
20981
|
}
|
|
21822
|
-
//
|
|
20982
|
+
// node_modules/zod/v4/locales/gu.js
|
|
21823
20983
|
var error19 = () => {
|
|
21824
20984
|
const Sizable = {
|
|
21825
20985
|
string: { unit: "\u0A85\u0A95\u0ACD\u0AB7\u0AB0", verb: "\u0AB9\u0ACB\u0AB5\u0ABE \u0A9C\u0ACB\u0A88\u0A8F" },
|
|
@@ -21930,7 +21090,7 @@ function gu_default() {
|
|
|
21930
21090
|
localeError: error19()
|
|
21931
21091
|
};
|
|
21932
21092
|
}
|
|
21933
|
-
//
|
|
21093
|
+
// node_modules/zod/v4/locales/he.js
|
|
21934
21094
|
var error20 = () => {
|
|
21935
21095
|
const TypeNames = {
|
|
21936
21096
|
string: { label: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA", gender: "f" },
|
|
@@ -22128,7 +21288,7 @@ function he_default() {
|
|
|
22128
21288
|
localeError: error20()
|
|
22129
21289
|
};
|
|
22130
21290
|
}
|
|
22131
|
-
//
|
|
21291
|
+
// node_modules/zod/v4/locales/hi.js
|
|
22132
21292
|
var error21 = () => {
|
|
22133
21293
|
const Sizable = {
|
|
22134
21294
|
string: { unit: "\u0905\u0915\u094D\u0937\u0930", verb: "\u0930\u0916\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F" },
|
|
@@ -22237,7 +21397,7 @@ function hi_default() {
|
|
|
22237
21397
|
localeError: error21()
|
|
22238
21398
|
};
|
|
22239
21399
|
}
|
|
22240
|
-
//
|
|
21400
|
+
// node_modules/zod/v4/locales/hr.js
|
|
22241
21401
|
var error22 = () => {
|
|
22242
21402
|
const Sizable = {
|
|
22243
21403
|
string: { unit: "znakova", verb: "imati" },
|
|
@@ -22361,7 +21521,7 @@ function hr_default() {
|
|
|
22361
21521
|
localeError: error22()
|
|
22362
21522
|
};
|
|
22363
21523
|
}
|
|
22364
|
-
//
|
|
21524
|
+
// node_modules/zod/v4/locales/hu.js
|
|
22365
21525
|
var error23 = () => {
|
|
22366
21526
|
const Sizable = {
|
|
22367
21527
|
string: { unit: "karakter", verb: "legyen" },
|
|
@@ -22472,7 +21632,7 @@ function hu_default() {
|
|
|
22472
21632
|
localeError: error23()
|
|
22473
21633
|
};
|
|
22474
21634
|
}
|
|
22475
|
-
//
|
|
21635
|
+
// node_modules/zod/v4/locales/hy.js
|
|
22476
21636
|
function getArmenianPlural(count, one, many) {
|
|
22477
21637
|
return Math.abs(count) === 1 ? one : many;
|
|
22478
21638
|
}
|
|
@@ -22628,7 +21788,7 @@ function hy_default() {
|
|
|
22628
21788
|
localeError: error24()
|
|
22629
21789
|
};
|
|
22630
21790
|
}
|
|
22631
|
-
//
|
|
21791
|
+
// node_modules/zod/v4/locales/id.js
|
|
22632
21792
|
var error25 = () => {
|
|
22633
21793
|
const Sizable = {
|
|
22634
21794
|
string: { unit: "karakter", verb: "memiliki" },
|
|
@@ -22737,7 +21897,7 @@ function id_default() {
|
|
|
22737
21897
|
localeError: error25()
|
|
22738
21898
|
};
|
|
22739
21899
|
}
|
|
22740
|
-
//
|
|
21900
|
+
// node_modules/zod/v4/locales/is.js
|
|
22741
21901
|
var error26 = () => {
|
|
22742
21902
|
const Sizable = {
|
|
22743
21903
|
string: { unit: "stafi", verb: "a\xF0 hafa" },
|
|
@@ -22849,7 +22009,7 @@ function is_default() {
|
|
|
22849
22009
|
localeError: error26()
|
|
22850
22010
|
};
|
|
22851
22011
|
}
|
|
22852
|
-
//
|
|
22012
|
+
// node_modules/zod/v4/locales/it.js
|
|
22853
22013
|
var error27 = () => {
|
|
22854
22014
|
const Sizable = {
|
|
22855
22015
|
string: { unit: "caratteri", verb: "avere" },
|
|
@@ -22960,7 +22120,7 @@ function it_default() {
|
|
|
22960
22120
|
localeError: error27()
|
|
22961
22121
|
};
|
|
22962
22122
|
}
|
|
22963
|
-
//
|
|
22123
|
+
// node_modules/zod/v4/locales/ja.js
|
|
22964
22124
|
var error28 = () => {
|
|
22965
22125
|
const Sizable = {
|
|
22966
22126
|
string: { unit: "\u6587\u5B57", verb: "\u3067\u3042\u308B" },
|
|
@@ -23070,7 +22230,7 @@ function ja_default() {
|
|
|
23070
22230
|
localeError: error28()
|
|
23071
22231
|
};
|
|
23072
22232
|
}
|
|
23073
|
-
//
|
|
22233
|
+
// node_modules/zod/v4/locales/ka.js
|
|
23074
22234
|
var error29 = () => {
|
|
23075
22235
|
const Sizable = {
|
|
23076
22236
|
string: { unit: "\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD", verb: "\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1" },
|
|
@@ -23185,7 +22345,7 @@ function ka_default() {
|
|
|
23185
22345
|
localeError: error29()
|
|
23186
22346
|
};
|
|
23187
22347
|
}
|
|
23188
|
-
//
|
|
22348
|
+
// node_modules/zod/v4/locales/km.js
|
|
23189
22349
|
var error30 = () => {
|
|
23190
22350
|
const Sizable = {
|
|
23191
22351
|
string: { unit: "\u178F\u17BD\u17A2\u1780\u17D2\u179F\u179A", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" },
|
|
@@ -23299,11 +22459,11 @@ function km_default() {
|
|
|
23299
22459
|
};
|
|
23300
22460
|
}
|
|
23301
22461
|
|
|
23302
|
-
//
|
|
22462
|
+
// node_modules/zod/v4/locales/kh.js
|
|
23303
22463
|
function kh_default() {
|
|
23304
22464
|
return km_default();
|
|
23305
22465
|
}
|
|
23306
|
-
//
|
|
22466
|
+
// node_modules/zod/v4/locales/kn.js
|
|
23307
22467
|
var error31 = () => {
|
|
23308
22468
|
const Sizable = {
|
|
23309
22469
|
string: { unit: "\u0C85\u0C95\u0CCD\u0CB7\u0CB0\u0C97\u0CB3\u0CC1", verb: "\u0CB9\u0CCA\u0C82\u0CA6\u0CB2\u0CC1" },
|
|
@@ -23414,7 +22574,7 @@ function kn_default() {
|
|
|
23414
22574
|
localeError: error31()
|
|
23415
22575
|
};
|
|
23416
22576
|
}
|
|
23417
|
-
//
|
|
22577
|
+
// node_modules/zod/v4/locales/ko.js
|
|
23418
22578
|
var error32 = () => {
|
|
23419
22579
|
const Sizable = {
|
|
23420
22580
|
string: { unit: "\uBB38\uC790", verb: "to have" },
|
|
@@ -23528,7 +22688,7 @@ function ko_default() {
|
|
|
23528
22688
|
localeError: error32()
|
|
23529
22689
|
};
|
|
23530
22690
|
}
|
|
23531
|
-
//
|
|
22691
|
+
// node_modules/zod/v4/locales/lt.js
|
|
23532
22692
|
var capitalizeFirstCharacter = (text2) => {
|
|
23533
22693
|
return text2.charAt(0).toUpperCase() + text2.slice(1);
|
|
23534
22694
|
};
|
|
@@ -23733,7 +22893,7 @@ function lt_default() {
|
|
|
23733
22893
|
localeError: error33()
|
|
23734
22894
|
};
|
|
23735
22895
|
}
|
|
23736
|
-
//
|
|
22896
|
+
// node_modules/zod/v4/locales/mk.js
|
|
23737
22897
|
var error34 = () => {
|
|
23738
22898
|
const Sizable = {
|
|
23739
22899
|
string: { unit: "\u0437\u043D\u0430\u0446\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" },
|
|
@@ -23845,7 +23005,7 @@ function mk_default() {
|
|
|
23845
23005
|
localeError: error34()
|
|
23846
23006
|
};
|
|
23847
23007
|
}
|
|
23848
|
-
//
|
|
23008
|
+
// node_modules/zod/v4/locales/ms.js
|
|
23849
23009
|
var error35 = () => {
|
|
23850
23010
|
const Sizable = {
|
|
23851
23011
|
string: { unit: "aksara", verb: "mempunyai" },
|
|
@@ -23955,7 +23115,7 @@ function ms_default() {
|
|
|
23955
23115
|
localeError: error35()
|
|
23956
23116
|
};
|
|
23957
23117
|
}
|
|
23958
|
-
//
|
|
23118
|
+
// node_modules/zod/v4/locales/ne.js
|
|
23959
23119
|
var error36 = () => {
|
|
23960
23120
|
const Sizable = {
|
|
23961
23121
|
string: { unit: "\u0905\u0915\u094D\u0937\u0930", verb: "\u0939\u0941\u0928\u0941\u092A\u0930\u094D\u091B" },
|
|
@@ -24064,7 +23224,7 @@ function ne_default() {
|
|
|
24064
23224
|
localeError: error36()
|
|
24065
23225
|
};
|
|
24066
23226
|
}
|
|
24067
|
-
//
|
|
23227
|
+
// node_modules/zod/v4/locales/nl.js
|
|
24068
23228
|
var error37 = () => {
|
|
24069
23229
|
const Sizable = {
|
|
24070
23230
|
string: { unit: "tekens", verb: "heeft" },
|
|
@@ -24177,7 +23337,7 @@ function nl_default() {
|
|
|
24177
23337
|
localeError: error37()
|
|
24178
23338
|
};
|
|
24179
23339
|
}
|
|
24180
|
-
//
|
|
23340
|
+
// node_modules/zod/v4/locales/nn.js
|
|
24181
23341
|
var error38 = () => {
|
|
24182
23342
|
const Sizable = {
|
|
24183
23343
|
string: { unit: "teikn", verb: "\xE5 ha" },
|
|
@@ -24288,7 +23448,7 @@ function nn_default() {
|
|
|
24288
23448
|
localeError: error38()
|
|
24289
23449
|
};
|
|
24290
23450
|
}
|
|
24291
|
-
//
|
|
23451
|
+
// node_modules/zod/v4/locales/no.js
|
|
24292
23452
|
var error39 = () => {
|
|
24293
23453
|
const Sizable = {
|
|
24294
23454
|
string: { unit: "tegn", verb: "\xE5 ha" },
|
|
@@ -24399,7 +23559,7 @@ function no_default() {
|
|
|
24399
23559
|
localeError: error39()
|
|
24400
23560
|
};
|
|
24401
23561
|
}
|
|
24402
|
-
//
|
|
23562
|
+
// node_modules/zod/v4/locales/ota.js
|
|
24403
23563
|
var error40 = () => {
|
|
24404
23564
|
const Sizable = {
|
|
24405
23565
|
string: { unit: "harf", verb: "olmal\u0131d\u0131r" },
|
|
@@ -24511,7 +23671,7 @@ function ota_default() {
|
|
|
24511
23671
|
localeError: error40()
|
|
24512
23672
|
};
|
|
24513
23673
|
}
|
|
24514
|
-
//
|
|
23674
|
+
// node_modules/zod/v4/locales/ps.js
|
|
24515
23675
|
var error41 = () => {
|
|
24516
23676
|
const Sizable = {
|
|
24517
23677
|
string: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" },
|
|
@@ -24628,7 +23788,7 @@ function ps_default() {
|
|
|
24628
23788
|
localeError: error41()
|
|
24629
23789
|
};
|
|
24630
23790
|
}
|
|
24631
|
-
//
|
|
23791
|
+
// node_modules/zod/v4/locales/pl.js
|
|
24632
23792
|
var error42 = () => {
|
|
24633
23793
|
const Sizable = {
|
|
24634
23794
|
string: { unit: "znak\xF3w", verb: "mie\u0107" },
|
|
@@ -24740,7 +23900,7 @@ function pl_default() {
|
|
|
24740
23900
|
localeError: error42()
|
|
24741
23901
|
};
|
|
24742
23902
|
}
|
|
24743
|
-
//
|
|
23903
|
+
// node_modules/zod/v4/locales/pt.js
|
|
24744
23904
|
var error43 = () => {
|
|
24745
23905
|
const Sizable = {
|
|
24746
23906
|
string: { unit: "caracteres" },
|
|
@@ -24880,7 +24040,7 @@ function pt_default() {
|
|
|
24880
24040
|
localeError: error43()
|
|
24881
24041
|
};
|
|
24882
24042
|
}
|
|
24883
|
-
//
|
|
24043
|
+
// node_modules/zod/v4/locales/pt-BR.js
|
|
24884
24044
|
var error44 = () => {
|
|
24885
24045
|
const Sizable = {
|
|
24886
24046
|
string: { unit: "caracteres" },
|
|
@@ -25021,7 +24181,7 @@ function pt_BR_default() {
|
|
|
25021
24181
|
localeError: error44()
|
|
25022
24182
|
};
|
|
25023
24183
|
}
|
|
25024
|
-
//
|
|
24184
|
+
// node_modules/zod/v4/locales/ro.js
|
|
25025
24185
|
var error45 = () => {
|
|
25026
24186
|
const Sizable = {
|
|
25027
24187
|
string: { unit: "caractere", verb: "s\u0103 aib\u0103" },
|
|
@@ -25141,7 +24301,7 @@ function ro_default() {
|
|
|
25141
24301
|
localeError: error45()
|
|
25142
24302
|
};
|
|
25143
24303
|
}
|
|
25144
|
-
//
|
|
24304
|
+
// node_modules/zod/v4/locales/ru.js
|
|
25145
24305
|
function getRussianPlural(count, one, few, many) {
|
|
25146
24306
|
const absCount = Math.abs(count);
|
|
25147
24307
|
const lastDigit = absCount % 10;
|
|
@@ -25307,7 +24467,7 @@ function ru_default() {
|
|
|
25307
24467
|
localeError: error46()
|
|
25308
24468
|
};
|
|
25309
24469
|
}
|
|
25310
|
-
//
|
|
24470
|
+
// node_modules/zod/v4/locales/sk.js
|
|
25311
24471
|
var error47 = () => {
|
|
25312
24472
|
const Sizable = {
|
|
25313
24473
|
string: { unit: "znakov", verb: "ma\u0165" },
|
|
@@ -25421,7 +24581,7 @@ function sk_default() {
|
|
|
25421
24581
|
localeError: error47()
|
|
25422
24582
|
};
|
|
25423
24583
|
}
|
|
25424
|
-
//
|
|
24584
|
+
// node_modules/zod/v4/locales/sl.js
|
|
25425
24585
|
var error48 = () => {
|
|
25426
24586
|
const Sizable = {
|
|
25427
24587
|
string: { unit: "znakov", verb: "imeti" },
|
|
@@ -25533,7 +24693,7 @@ function sl_default() {
|
|
|
25533
24693
|
localeError: error48()
|
|
25534
24694
|
};
|
|
25535
24695
|
}
|
|
25536
|
-
//
|
|
24696
|
+
// node_modules/zod/v4/locales/sv.js
|
|
25537
24697
|
var error49 = () => {
|
|
25538
24698
|
const Sizable = {
|
|
25539
24699
|
string: { unit: "tecken", verb: "att ha" },
|
|
@@ -25646,7 +24806,7 @@ function sv_default() {
|
|
|
25646
24806
|
localeError: error49()
|
|
25647
24807
|
};
|
|
25648
24808
|
}
|
|
25649
|
-
//
|
|
24809
|
+
// node_modules/zod/v4/locales/ta.js
|
|
25650
24810
|
var error50 = () => {
|
|
25651
24811
|
const Sizable = {
|
|
25652
24812
|
string: { unit: "\u0B8E\u0BB4\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BCD\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" },
|
|
@@ -25759,7 +24919,7 @@ function ta_default() {
|
|
|
25759
24919
|
localeError: error50()
|
|
25760
24920
|
};
|
|
25761
24921
|
}
|
|
25762
|
-
//
|
|
24922
|
+
// node_modules/zod/v4/locales/th.js
|
|
25763
24923
|
var error51 = () => {
|
|
25764
24924
|
const Sizable = {
|
|
25765
24925
|
string: { unit: "\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" },
|
|
@@ -25872,7 +25032,7 @@ function th_default() {
|
|
|
25872
25032
|
localeError: error51()
|
|
25873
25033
|
};
|
|
25874
25034
|
}
|
|
25875
|
-
//
|
|
25035
|
+
// node_modules/zod/v4/locales/tk.js
|
|
25876
25036
|
var error52 = () => {
|
|
25877
25037
|
const Sizable = {
|
|
25878
25038
|
string: { unit: "simwol", verb: "bolmaly" },
|
|
@@ -25977,7 +25137,7 @@ function tk_default() {
|
|
|
25977
25137
|
localeError: error52()
|
|
25978
25138
|
};
|
|
25979
25139
|
}
|
|
25980
|
-
//
|
|
25140
|
+
// node_modules/zod/v4/locales/tr.js
|
|
25981
25141
|
var error53 = () => {
|
|
25982
25142
|
const Sizable = {
|
|
25983
25143
|
string: { unit: "karakter", verb: "olmal\u0131" },
|
|
@@ -26085,7 +25245,7 @@ function tr_default() {
|
|
|
26085
25245
|
localeError: error53()
|
|
26086
25246
|
};
|
|
26087
25247
|
}
|
|
26088
|
-
//
|
|
25248
|
+
// node_modules/zod/v4/locales/uk.js
|
|
26089
25249
|
var error54 = () => {
|
|
26090
25250
|
const Sizable = {
|
|
26091
25251
|
string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" },
|
|
@@ -26197,11 +25357,11 @@ function uk_default() {
|
|
|
26197
25357
|
};
|
|
26198
25358
|
}
|
|
26199
25359
|
|
|
26200
|
-
//
|
|
25360
|
+
// node_modules/zod/v4/locales/ua.js
|
|
26201
25361
|
function ua_default() {
|
|
26202
25362
|
return uk_default();
|
|
26203
25363
|
}
|
|
26204
|
-
//
|
|
25364
|
+
// node_modules/zod/v4/locales/ur.js
|
|
26205
25365
|
var error55 = () => {
|
|
26206
25366
|
const Sizable = {
|
|
26207
25367
|
string: { unit: "\u062D\u0631\u0648\u0641", verb: "\u06C1\u0648\u0646\u0627" },
|
|
@@ -26314,7 +25474,7 @@ function ur_default() {
|
|
|
26314
25474
|
localeError: error55()
|
|
26315
25475
|
};
|
|
26316
25476
|
}
|
|
26317
|
-
//
|
|
25477
|
+
// node_modules/zod/v4/locales/uz.js
|
|
26318
25478
|
var error56 = () => {
|
|
26319
25479
|
const Sizable = {
|
|
26320
25480
|
string: { unit: "belgi", verb: "bo\u2018lishi kerak" },
|
|
@@ -26425,7 +25585,7 @@ function uz_default() {
|
|
|
26425
25585
|
localeError: error56()
|
|
26426
25586
|
};
|
|
26427
25587
|
}
|
|
26428
|
-
//
|
|
25588
|
+
// node_modules/zod/v4/locales/vi.js
|
|
26429
25589
|
var error57 = () => {
|
|
26430
25590
|
const Sizable = {
|
|
26431
25591
|
string: { unit: "k\xFD t\u1EF1", verb: "c\xF3" },
|
|
@@ -26536,7 +25696,7 @@ function vi_default() {
|
|
|
26536
25696
|
localeError: error57()
|
|
26537
25697
|
};
|
|
26538
25698
|
}
|
|
26539
|
-
//
|
|
25699
|
+
// node_modules/zod/v4/locales/zh-CN.js
|
|
26540
25700
|
var error58 = () => {
|
|
26541
25701
|
const Sizable = {
|
|
26542
25702
|
string: { unit: "\u5B57\u7B26", verb: "\u5305\u542B" },
|
|
@@ -26648,7 +25808,7 @@ function zh_CN_default() {
|
|
|
26648
25808
|
localeError: error58()
|
|
26649
25809
|
};
|
|
26650
25810
|
}
|
|
26651
|
-
//
|
|
25811
|
+
// node_modules/zod/v4/locales/zh-TW.js
|
|
26652
25812
|
var error59 = () => {
|
|
26653
25813
|
const Sizable = {
|
|
26654
25814
|
string: { unit: "\u5B57\u5143", verb: "\u64C1\u6709" },
|
|
@@ -26758,7 +25918,7 @@ function zh_TW_default() {
|
|
|
26758
25918
|
localeError: error59()
|
|
26759
25919
|
};
|
|
26760
25920
|
}
|
|
26761
|
-
//
|
|
25921
|
+
// node_modules/zod/v4/locales/yo.js
|
|
26762
25922
|
var error60 = () => {
|
|
26763
25923
|
const Sizable = {
|
|
26764
25924
|
string: { unit: "\xE0mi", verb: "n\xED" },
|
|
@@ -26868,7 +26028,7 @@ function yo_default() {
|
|
|
26868
26028
|
localeError: error60()
|
|
26869
26029
|
};
|
|
26870
26030
|
}
|
|
26871
|
-
//
|
|
26031
|
+
// node_modules/zod/v4/core/registries.js
|
|
26872
26032
|
var _a2;
|
|
26873
26033
|
var $output = /* @__PURE__ */ Symbol("ZodOutput");
|
|
26874
26034
|
var $input = /* @__PURE__ */ Symbol("ZodInput");
|
|
@@ -26918,7 +26078,7 @@ function registry() {
|
|
|
26918
26078
|
}
|
|
26919
26079
|
(_a2 = globalThis).__zod_globalRegistry ?? (_a2.__zod_globalRegistry = registry());
|
|
26920
26080
|
var globalRegistry = globalThis.__zod_globalRegistry;
|
|
26921
|
-
//
|
|
26081
|
+
// node_modules/zod/v4/core/compile.js
|
|
26922
26082
|
var INVALID = Symbol.for("zod.compile.invalid");
|
|
26923
26083
|
var FALLBACK_FLAG = Symbol.for("zod.compile.fallback");
|
|
26924
26084
|
|
|
@@ -28457,7 +27617,7 @@ function generateTransformCheck(doc, ctx, schema, accessor) {
|
|
|
28457
27617
|
}
|
|
28458
27618
|
return accessor;
|
|
28459
27619
|
}
|
|
28460
|
-
//
|
|
27620
|
+
// node_modules/zod/v4/core/api.js
|
|
28461
27621
|
function _string(Class2, params) {
|
|
28462
27622
|
return new Class2({
|
|
28463
27623
|
type: "string",
|
|
@@ -29392,7 +28552,7 @@ function _stringFormat(Class2, format, fnOrRegex, _params = {}) {
|
|
|
29392
28552
|
const inst = new Class2(def);
|
|
29393
28553
|
return inst;
|
|
29394
28554
|
}
|
|
29395
|
-
//
|
|
28555
|
+
// node_modules/zod/v4/core/to-json-schema.js
|
|
29396
28556
|
function assignProps(target, ...sources) {
|
|
29397
28557
|
for (const source of sources) {
|
|
29398
28558
|
for (const key of Reflect.ownKeys(source)) {
|
|
@@ -29916,7 +29076,7 @@ var createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) =
|
|
|
29916
29076
|
extractDefs(ctx, schema);
|
|
29917
29077
|
return finalize(ctx, schema);
|
|
29918
29078
|
};
|
|
29919
|
-
//
|
|
29079
|
+
// node_modules/zod/v4/core/json-schema-processors.js
|
|
29920
29080
|
var formatMap = {
|
|
29921
29081
|
guid: "uuid",
|
|
29922
29082
|
url: "uri",
|
|
@@ -30569,7 +29729,7 @@ function toJSONSchema(input, params) {
|
|
|
30569
29729
|
extractDefs(ctx, input);
|
|
30570
29730
|
return finalize(ctx, input);
|
|
30571
29731
|
}
|
|
30572
|
-
//
|
|
29732
|
+
// node_modules/zod/v4/core/json-schema-generator.js
|
|
30573
29733
|
class JSONSchemaGenerator {
|
|
30574
29734
|
get metadataRegistry() {
|
|
30575
29735
|
return this.ctx.metadataRegistry;
|
|
@@ -30630,9 +29790,9 @@ class JSONSchemaGenerator {
|
|
|
30630
29790
|
return plainResult;
|
|
30631
29791
|
}
|
|
30632
29792
|
}
|
|
30633
|
-
//
|
|
29793
|
+
// node_modules/zod/v4/core/json-schema.js
|
|
30634
29794
|
var exports_json_schema = {};
|
|
30635
|
-
//
|
|
29795
|
+
// node_modules/zod/v4/classic/schemas.js
|
|
30636
29796
|
var exports_schemas2 = {};
|
|
30637
29797
|
__export(exports_schemas2, {
|
|
30638
29798
|
xor: () => xor,
|
|
@@ -30809,7 +29969,7 @@ __export(exports_schemas2, {
|
|
|
30809
29969
|
ZodAny: () => ZodAny
|
|
30810
29970
|
});
|
|
30811
29971
|
|
|
30812
|
-
//
|
|
29972
|
+
// node_modules/zod/v4/classic/checks.js
|
|
30813
29973
|
var exports_checks2 = {};
|
|
30814
29974
|
__export(exports_checks2, {
|
|
30815
29975
|
uppercase: () => _uppercase,
|
|
@@ -30844,7 +30004,7 @@ __export(exports_checks2, {
|
|
|
30844
30004
|
endsWith: () => _endsWith
|
|
30845
30005
|
});
|
|
30846
30006
|
|
|
30847
|
-
//
|
|
30007
|
+
// node_modules/zod/v4/classic/errors.js
|
|
30848
30008
|
var _installedErrorProtos = /* @__PURE__ */ new WeakSet([Object.prototype, Error.prototype]);
|
|
30849
30009
|
function _lazyMethod(proto, key, make) {
|
|
30850
30010
|
Object.defineProperty(proto, key, {
|
|
@@ -30890,7 +30050,7 @@ var ZodRealError = /* @__PURE__ */ $constructor("ZodError", initializer2, undefi
|
|
|
30890
30050
|
Parent: Error
|
|
30891
30051
|
});
|
|
30892
30052
|
|
|
30893
|
-
//
|
|
30053
|
+
// node_modules/zod/v4/classic/parse.js
|
|
30894
30054
|
var parse5 = /* @__PURE__ */ _parse(ZodRealError);
|
|
30895
30055
|
var parseAsync2 = /* @__PURE__ */ _parseAsync(ZodRealError);
|
|
30896
30056
|
var safeParse2 = /* @__PURE__ */ _safeParse(ZodRealError);
|
|
@@ -30904,7 +30064,7 @@ var safeDecode2 = /* @__PURE__ */ _safeDecode(ZodRealError);
|
|
|
30904
30064
|
var safeEncodeAsync2 = /* @__PURE__ */ _safeEncodeAsync(ZodRealError);
|
|
30905
30065
|
var safeDecodeAsync2 = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
|
|
30906
30066
|
|
|
30907
|
-
//
|
|
30067
|
+
// node_modules/zod/v4/classic/schemas.js
|
|
30908
30068
|
function _ensureDefaultLocale() {
|
|
30909
30069
|
if (!globalConfig.localeError)
|
|
30910
30070
|
config(en_default());
|
|
@@ -32308,7 +31468,7 @@ function preprocess(fn, schema) {
|
|
|
32308
31468
|
out: schema
|
|
32309
31469
|
});
|
|
32310
31470
|
}
|
|
32311
|
-
//
|
|
31471
|
+
// node_modules/zod/v4/classic/compat.js
|
|
32312
31472
|
var ZodIssueCode = {
|
|
32313
31473
|
invalid_type: "invalid_type",
|
|
32314
31474
|
too_big: "too_big",
|
|
@@ -32332,7 +31492,7 @@ function getErrorMap() {
|
|
|
32332
31492
|
}
|
|
32333
31493
|
var ZodFirstPartyTypeKind;
|
|
32334
31494
|
(function(ZodFirstPartyTypeKind2) {})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));
|
|
32335
|
-
//
|
|
31495
|
+
// node_modules/zod/v4/classic/iso.js
|
|
32336
31496
|
var exports_iso = {};
|
|
32337
31497
|
__export(exports_iso, {
|
|
32338
31498
|
time: () => time2,
|
|
@@ -32357,7 +31517,7 @@ function duration2(params) {
|
|
|
32357
31517
|
return _isoDuration(ZodISODuration, params);
|
|
32358
31518
|
}
|
|
32359
31519
|
|
|
32360
|
-
//
|
|
31520
|
+
// node_modules/zod/v4/classic/from-json-schema.js
|
|
32361
31521
|
var z = {
|
|
32362
31522
|
...exports_schemas2,
|
|
32363
31523
|
...exports_checks2,
|
|
@@ -32884,7 +32044,7 @@ function fromJSONSchema(schema, params) {
|
|
|
32884
32044
|
};
|
|
32885
32045
|
return convertSchema(normalized, ctx);
|
|
32886
32046
|
}
|
|
32887
|
-
//
|
|
32047
|
+
// node_modules/zod/v4/core/visit.js
|
|
32888
32048
|
var RESOLVING = Symbol("z.visit/resolving");
|
|
32889
32049
|
function visit2(schema, fnOrHandlers) {
|
|
32890
32050
|
const fn = typeof fnOrHandlers === "function" ? fnOrHandlers : (node2, rewritten) => {
|
|
@@ -33036,7 +32196,7 @@ function visit2(schema, fnOrHandlers) {
|
|
|
33036
32196
|
return run(schema);
|
|
33037
32197
|
}
|
|
33038
32198
|
|
|
33039
|
-
//
|
|
32199
|
+
// node_modules/zod/v4/classic/deep-partial.js
|
|
33040
32200
|
function deepPartial(schema) {
|
|
33041
32201
|
return visit2(schema, {
|
|
33042
32202
|
object: (s) => s.partial(),
|
|
@@ -33046,7 +32206,7 @@ function deepPartial(schema) {
|
|
|
33046
32206
|
}
|
|
33047
32207
|
});
|
|
33048
32208
|
}
|
|
33049
|
-
//
|
|
32209
|
+
// node_modules/zod/v4/classic/in-out.js
|
|
33050
32210
|
function withChecks(side, checks2) {
|
|
33051
32211
|
if (!checks2?.length)
|
|
33052
32212
|
return side;
|
|
@@ -33072,7 +32232,7 @@ function output(schema) {
|
|
|
33072
32232
|
prefault: (s, rewritten) => rewritten ? s._zod.def.innerType : s
|
|
33073
32233
|
});
|
|
33074
32234
|
}
|
|
33075
|
-
//
|
|
32235
|
+
// node_modules/zod/v4/classic/coerce.js
|
|
33076
32236
|
var exports_coerce = {};
|
|
33077
32237
|
__export(exports_coerce, {
|
|
33078
32238
|
string: () => string3,
|
|
@@ -33096,14 +32256,19 @@ function bigint3(params) {
|
|
|
33096
32256
|
function date4(params) {
|
|
33097
32257
|
return _coercedDate(ZodDate, params);
|
|
33098
32258
|
}
|
|
33099
|
-
//
|
|
32259
|
+
// node_modules/@hasna/contracts/dist/client/transport.js
|
|
33100
32260
|
import { isIP } from "net";
|
|
33101
32261
|
import { spawnSync } from "child_process";
|
|
33102
|
-
import { closeSync as
|
|
33103
|
-
import { O_NOFOLLOW, O_NONBLOCK, O_RDONLY } from "constants";
|
|
33104
|
-
import { createRequire } from "module";
|
|
32262
|
+
import { closeSync as closeSync22, fstatSync as fstatSync22, openSync as openSync22, readFileSync as readFileSync22 } from "fs";
|
|
32263
|
+
import { O_NOFOLLOW as O_NOFOLLOW2, O_NONBLOCK as O_NONBLOCK2, O_RDONLY as O_RDONLY2 } from "constants";
|
|
33105
32264
|
import { hostname as osHostname } from "os";
|
|
33106
32265
|
import { isAbsolute as isAbsolute9, join as join24 } from "path";
|
|
32266
|
+
import { createRequire } from "module";
|
|
32267
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
32268
|
+
import { closeSync as closeSync6, fstatSync as fstatSync6, lstatSync as lstatSync14, openSync as openSync6, readFileSync as readFileSync18, realpathSync as realpathSync5, statSync as statSync10 } from "fs";
|
|
32269
|
+
import { O_NOFOLLOW, O_NONBLOCK, O_RDONLY } from "constants";
|
|
32270
|
+
import { basename as basename4, dirname as dirname12, join as join25, relative as relative6, sep as sep6 } from "path";
|
|
32271
|
+
import { fileURLToPath, pathToFileURL } from "url";
|
|
33107
32272
|
function envToken(name) {
|
|
33108
32273
|
return name.toUpperCase().replace(/-/g, "_");
|
|
33109
32274
|
}
|
|
@@ -33121,6 +32286,114 @@ var CREDENTIAL_PROFILE_ENV_KEY = "HASNA_PROFILE";
|
|
|
33121
32286
|
function credentialPointerEnvKey(name) {
|
|
33122
32287
|
return `HASNA_${envToken(name)}_API_KEY_REF`;
|
|
33123
32288
|
}
|
|
32289
|
+
function e(e2, n, r) {
|
|
32290
|
+
throw new Error(r ? `No known conditions for "${n}" specifier in "${e2}" package` : `Missing "${n}" specifier in "${e2}" package`);
|
|
32291
|
+
}
|
|
32292
|
+
function n(n2, i, o, f) {
|
|
32293
|
+
let s, u, l = r(n2, o), c = function(e2) {
|
|
32294
|
+
let n3 = new Set(["default", ...e2.conditions || []]);
|
|
32295
|
+
return e2.unsafe || n3.add(e2.require ? "require" : "import"), e2.unsafe || n3.add(e2.browser ? "browser" : "node"), n3;
|
|
32296
|
+
}(f || {}), a = i[l];
|
|
32297
|
+
if (a === undefined) {
|
|
32298
|
+
let e2, n3, r, t;
|
|
32299
|
+
for (t in i)
|
|
32300
|
+
n3 && t.length < n3.length || (t[t.length - 1] === "/" && l.startsWith(t) ? (u = l.substring(t.length), n3 = t) : t.length > 1 && (r = t.indexOf("*", 1), ~r && (e2 = RegExp("^" + t.substring(0, r) + "(.*)" + t.substring(1 + r) + "$").exec(l), e2 && e2[1] && (u = e2[1], n3 = t))));
|
|
32301
|
+
a = i[n3];
|
|
32302
|
+
}
|
|
32303
|
+
return a || e(n2, l), s = t(a, c), s || e(n2, l, 1), u && function(e2, n3) {
|
|
32304
|
+
let r, t = 0, i2 = e2.length, o2 = /[*]/g, f2 = /[/]$/;
|
|
32305
|
+
for (;t < i2; t++)
|
|
32306
|
+
e2[t] = o2.test(r = e2[t]) ? r.replace(o2, n3) : f2.test(r) ? r + n3 : r;
|
|
32307
|
+
}(s, u), s;
|
|
32308
|
+
}
|
|
32309
|
+
function r(e2, n2, r2) {
|
|
32310
|
+
if (e2 === n2 || n2 === ".")
|
|
32311
|
+
return ".";
|
|
32312
|
+
let t = e2 + "/", i = t.length, o = n2.slice(0, i) === t, f = o ? n2.slice(i) : n2;
|
|
32313
|
+
return f[0] === "#" ? f : o || !r2 ? f.slice(0, 2) === "./" ? f : "./" + f : f;
|
|
32314
|
+
}
|
|
32315
|
+
function t(e2, n2, r2) {
|
|
32316
|
+
if (e2) {
|
|
32317
|
+
if (typeof e2 == "string")
|
|
32318
|
+
return r2 && r2.add(e2), [e2];
|
|
32319
|
+
let i, o;
|
|
32320
|
+
if (Array.isArray(e2)) {
|
|
32321
|
+
for (o = r2 || new Set, i = 0;i < e2.length; i++)
|
|
32322
|
+
t(e2[i], n2, o);
|
|
32323
|
+
if (!r2 && o.size)
|
|
32324
|
+
return [...o];
|
|
32325
|
+
} else
|
|
32326
|
+
for (i in e2)
|
|
32327
|
+
if (n2.has(i))
|
|
32328
|
+
return t(e2[i], n2, r2);
|
|
32329
|
+
}
|
|
32330
|
+
}
|
|
32331
|
+
function o(e2, r2, t2) {
|
|
32332
|
+
let i, o2 = e2.exports;
|
|
32333
|
+
if (o2) {
|
|
32334
|
+
if (typeof o2 == "string")
|
|
32335
|
+
o2 = { ".": o2 };
|
|
32336
|
+
else
|
|
32337
|
+
for (i in o2) {
|
|
32338
|
+
i[0] !== "." && (o2 = { ".": o2 });
|
|
32339
|
+
break;
|
|
32340
|
+
}
|
|
32341
|
+
return n(e2.name, o2, r2 || ".", t2);
|
|
32342
|
+
}
|
|
32343
|
+
}
|
|
32344
|
+
var PACKAGE = "@hasna/secrets";
|
|
32345
|
+
var MAX_PACKAGE_BYTES = 1024 * 1024;
|
|
32346
|
+
function entryPoint(directory) {
|
|
32347
|
+
const root = realpathSync5(directory);
|
|
32348
|
+
const fd = openSync6(join25(root, "package.json"), O_RDONLY | O_NOFOLLOW | O_NONBLOCK);
|
|
32349
|
+
let pkg;
|
|
32350
|
+
try {
|
|
32351
|
+
const stat = fstatSync6(fd);
|
|
32352
|
+
if (!stat.isFile() || stat.size > MAX_PACKAGE_BYTES)
|
|
32353
|
+
throw new Error("Invalid Secrets package metadata");
|
|
32354
|
+
pkg = JSON.parse(readFileSync18(fd, "utf8"));
|
|
32355
|
+
} finally {
|
|
32356
|
+
closeSync6(fd);
|
|
32357
|
+
}
|
|
32358
|
+
if (!pkg || typeof pkg !== "object" || !("name" in pkg) || pkg.name !== PACKAGE) {
|
|
32359
|
+
throw new Error("Invalid Secrets package identity");
|
|
32360
|
+
}
|
|
32361
|
+
const target = o(pkg, ".")?.[0];
|
|
32362
|
+
if (typeof target !== "string" || !target.startsWith("./"))
|
|
32363
|
+
throw new Error("Missing Secrets import export");
|
|
32364
|
+
const parts = target.slice(2).split("/");
|
|
32365
|
+
if (/[\\%?#\0]/.test(target) || parts.some((part) => !part || part === "." || part === ".." || part === "node_modules")) {
|
|
32366
|
+
throw new Error("Invalid Secrets import export");
|
|
32367
|
+
}
|
|
32368
|
+
const file2 = realpathSync5(join25(root, ...parts));
|
|
32369
|
+
const within = relative6(root, file2);
|
|
32370
|
+
if (!within || within === ".." || within.startsWith(`..${sep6}`) || !statSync10(file2).isFile()) {
|
|
32371
|
+
throw new Error("Secrets import export escapes its package or is not a file");
|
|
32372
|
+
}
|
|
32373
|
+
return pathToFileURL(file2).href;
|
|
32374
|
+
}
|
|
32375
|
+
function resolveInstalledSecrets(parentUrl) {
|
|
32376
|
+
let directory = dirname12(fileURLToPath(parentUrl));
|
|
32377
|
+
for (;; ) {
|
|
32378
|
+
if (basename4(directory) !== "node_modules") {
|
|
32379
|
+
const candidate = join25(directory, "node_modules", PACKAGE);
|
|
32380
|
+
let absent = false;
|
|
32381
|
+
try {
|
|
32382
|
+
lstatSync14(candidate);
|
|
32383
|
+
} catch (error61) {
|
|
32384
|
+
if (error61.code !== "ENOENT")
|
|
32385
|
+
throw error61;
|
|
32386
|
+
absent = true;
|
|
32387
|
+
}
|
|
32388
|
+
if (!absent)
|
|
32389
|
+
return entryPoint(candidate);
|
|
32390
|
+
}
|
|
32391
|
+
const parent = dirname12(directory);
|
|
32392
|
+
if (parent === directory)
|
|
32393
|
+
throw new Error("Secrets SDK is not installed for this consumer");
|
|
32394
|
+
directory = parent;
|
|
32395
|
+
}
|
|
32396
|
+
}
|
|
33124
32397
|
|
|
33125
32398
|
class CredentialResolutionError extends Error {
|
|
33126
32399
|
appName;
|
|
@@ -33239,7 +32512,7 @@ function readAppConfigFile(path) {
|
|
|
33239
32512
|
};
|
|
33240
32513
|
let fd = -1;
|
|
33241
32514
|
try {
|
|
33242
|
-
fd =
|
|
32515
|
+
fd = openSync22(path, O_RDONLY2 | O_NOFOLLOW2 | O_NONBLOCK2);
|
|
33243
32516
|
} catch (error61) {
|
|
33244
32517
|
const code = error61.code;
|
|
33245
32518
|
if (code === "ENOENT" || code === "ENOTDIR")
|
|
@@ -33249,7 +32522,7 @@ function readAppConfigFile(path) {
|
|
|
33249
32522
|
unsafe(`the path could not be opened (${code ?? "unknown error"})`);
|
|
33250
32523
|
}
|
|
33251
32524
|
try {
|
|
33252
|
-
const before =
|
|
32525
|
+
const before = fstatSync22(fd);
|
|
33253
32526
|
if (!before.isFile())
|
|
33254
32527
|
unsafe("the path is not a regular file");
|
|
33255
32528
|
if (!configFileModeAllowed(before.mode)) {
|
|
@@ -33260,31 +32533,39 @@ function readAppConfigFile(path) {
|
|
|
33260
32533
|
unsafe("the file is not owned by the current user");
|
|
33261
32534
|
if (before.size > MAX_CREDENTIAL_FILE_BYTES)
|
|
33262
32535
|
unsafe("the file exceeds the size limit");
|
|
33263
|
-
const bytes =
|
|
33264
|
-
const after =
|
|
32536
|
+
const bytes = readFileSync22(fd);
|
|
32537
|
+
const after = fstatSync22(fd);
|
|
33265
32538
|
if (!configFileReadsCoherent(before, after)) {
|
|
33266
32539
|
unsafe("the file changed while being read");
|
|
33267
32540
|
}
|
|
33268
32541
|
return parseEnvFile(bytes.toString("utf8"));
|
|
33269
32542
|
} finally {
|
|
33270
32543
|
if (fd !== -1)
|
|
33271
|
-
|
|
32544
|
+
closeSync22(fd);
|
|
33272
32545
|
}
|
|
33273
32546
|
}
|
|
33274
|
-
function readCredentialFile(path, apiKeyKeys) {
|
|
32547
|
+
function readCredentialFile(path, apiKeyKeys, pointerKey) {
|
|
33275
32548
|
const parsed = readAppConfigFile(path);
|
|
33276
32549
|
if (!parsed)
|
|
33277
32550
|
return null;
|
|
33278
|
-
for (const key of apiKeyKeys) {
|
|
32551
|
+
for (const key of [...apiKeyKeys, pointerKey]) {
|
|
33279
32552
|
if (parsed.unusable.has(key)) {
|
|
33280
32553
|
throw new CredentialFileUnsafeError(path, `${key} is declared but blank or malformed`);
|
|
33281
32554
|
}
|
|
33282
32555
|
}
|
|
33283
32556
|
const values = apiKeyKeys.map((key) => parsed.values.get(key)?.trim()).filter((value) => Boolean(value));
|
|
32557
|
+
const pointer = parsed.values.get(pointerKey)?.trim();
|
|
32558
|
+
if (pointer !== undefined) {
|
|
32559
|
+
if (!VAULT_POINTER_SHAPE.test(pointer))
|
|
32560
|
+
throw new CredentialFileUnsafeError(path, `${pointerKey} must name a vault item`);
|
|
32561
|
+
if (values.length)
|
|
32562
|
+
throw new CredentialFileUnsafeError(path, "a credential file cannot select both a literal key and a vault reference");
|
|
32563
|
+
return { apiKey: "", pointerVaultKey: pointer };
|
|
32564
|
+
}
|
|
33284
32565
|
if (new Set(values).size > 1) {
|
|
33285
32566
|
throw new CredentialFileUnsafeError(path, "credential aliases disagree");
|
|
33286
32567
|
}
|
|
33287
|
-
return values[0]
|
|
32568
|
+
return values[0] === undefined ? null : { apiKey: values[0] };
|
|
33288
32569
|
}
|
|
33289
32570
|
var CREDENTIAL_SHAPED_KEY = /(?:^|_)(?:API_KEY|KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL|AUTH)(?:_|$)/;
|
|
33290
32571
|
function appConfigDiskValue(name, env, keys) {
|
|
@@ -33545,12 +32826,13 @@ function resolveCredential(name, env, options = {}) {
|
|
|
33545
32826
|
}
|
|
33546
32827
|
const paths = profileDiskSources(name, env, profile);
|
|
33547
32828
|
for (const path of paths) {
|
|
33548
|
-
const value = readCredentialFile(path, apiKeyKeys);
|
|
32829
|
+
const value = readCredentialFile(path, apiKeyKeys, pointerKeyName);
|
|
33549
32830
|
if (value) {
|
|
33550
|
-
|
|
32831
|
+
if (!value.pointerVaultKey)
|
|
32832
|
+
assertUsableCredential(name, path, value.apiKey);
|
|
33551
32833
|
return sealCredential({
|
|
33552
|
-
|
|
33553
|
-
tier: "profile",
|
|
32834
|
+
...value,
|
|
32835
|
+
tier: value.pointerVaultKey ? "pointer" : "profile",
|
|
33554
32836
|
source: path,
|
|
33555
32837
|
deliberate: true,
|
|
33556
32838
|
diskCandidates: paths,
|
|
@@ -33558,7 +32840,7 @@ function resolveCredential(name, env, options = {}) {
|
|
|
33558
32840
|
});
|
|
33559
32841
|
}
|
|
33560
32842
|
}
|
|
33561
|
-
throw new CredentialResolutionError(name, `Profile '${profile}' (from ${profileSource}) has no ${apiKeyKeys[0]} for '${name}'. ` + `Looked in: ${paths.join(", ") || "<no HOME in this environment>"}. ` + `A profile names WHICH identity to use, so it is never resolved around \u2014 ` + `create the profile's credential file or unset ${CREDENTIAL_PROFILE_ENV_KEY}.`, paths);
|
|
32843
|
+
throw new CredentialResolutionError(name, `Profile '${profile}' (from ${profileSource}) has no ${apiKeyKeys[0]} or ${pointerKeyName} for '${name}'. ` + `Looked in: ${paths.join(", ") || "<no HOME in this environment>"}. ` + `A profile names WHICH identity to use, so it is never resolved around \u2014 ` + `create the profile's credential file or unset ${CREDENTIAL_PROFILE_ENV_KEY}.`, paths);
|
|
33562
32844
|
}
|
|
33563
32845
|
const definedEnvEntries = apiKeyKeys.filter((key) => Object.prototype.hasOwnProperty.call(env, key) && env[key] !== undefined).map((key) => ({ key, value: String(env[key]).trim() }));
|
|
33564
32846
|
const blankEnv = definedEnvEntries.find((entry) => entry.value.length === 0);
|
|
@@ -33583,17 +32865,27 @@ function resolveCredential(name, env, options = {}) {
|
|
|
33583
32865
|
});
|
|
33584
32866
|
}
|
|
33585
32867
|
const diskSourceList = credentialDiskSourceList(name, env, null);
|
|
33586
|
-
const diskHits = diskSourceList.map((src) => ({ src, value: readCredentialFile(src.path, apiKeyKeys) })).filter((hit) => hit.value !== null);
|
|
32868
|
+
const diskHits = diskSourceList.map((src) => ({ src, value: readCredentialFile(src.path, apiKeyKeys, pointerKeyName) })).filter((hit) => hit.value !== null);
|
|
33587
32869
|
if (diskHits.length > 0) {
|
|
33588
32870
|
const winner = diskHits[0];
|
|
33589
|
-
|
|
32871
|
+
if (winner.value.pointerVaultKey) {
|
|
32872
|
+
return sealCredential({
|
|
32873
|
+
...winner.value,
|
|
32874
|
+
tier: "pointer",
|
|
32875
|
+
source: winner.src.path,
|
|
32876
|
+
deliberate: false,
|
|
32877
|
+
diskCandidates: diskPaths,
|
|
32878
|
+
warning: null
|
|
32879
|
+
});
|
|
32880
|
+
}
|
|
32881
|
+
assertUsableCredential(name, winner.src.path, winner.value.apiKey);
|
|
33590
32882
|
const divergentSources = [
|
|
33591
|
-
...diskHits.slice(1).filter((hit) => hit.value !== winner.value).map((hit) => hit.src.path),
|
|
33592
|
-
...envHit && envHit.value !== winner.value ? [envHit.key] : []
|
|
32883
|
+
...diskHits.slice(1).filter((hit) => hit.value.apiKey !== winner.value.apiKey || hit.value.pointerVaultKey !== winner.value.pointerVaultKey).map((hit) => hit.src.path),
|
|
32884
|
+
...envHit && envHit.value !== winner.value.apiKey ? [envHit.key] : []
|
|
33593
32885
|
];
|
|
33594
32886
|
const warning = divergentSources.length > 0 ? `Credential sources disagree for '${name}': ${winner.src.path} and ` + `${divergentSources.join(", ")} hold different keys. ${winner.src.path} wins, because a file on ` + `disk is re-read on every call while an environment variable is a snapshot. Reconcile them \u2014 ` + `a rotation that updated only one leaves the other to fail 401 wherever it is loaded first.` : null;
|
|
33595
32887
|
return sealCredential({
|
|
33596
|
-
apiKey: winner.value,
|
|
32888
|
+
apiKey: winner.value.apiKey,
|
|
33597
32889
|
tier: winner.src.tier,
|
|
33598
32890
|
source: winner.src.path,
|
|
33599
32891
|
deliberate: false,
|
|
@@ -33614,23 +32906,31 @@ function resolveCredential(name, env, options = {}) {
|
|
|
33614
32906
|
}
|
|
33615
32907
|
return null;
|
|
33616
32908
|
}
|
|
33617
|
-
var SECRETS_PACKAGE_SPECIFIER = "@hasna/" + "secrets";
|
|
33618
32909
|
var requireSecretsSdk = createRequire(import.meta.url);
|
|
33619
32910
|
async function completePointerCredential(name, pointerResolution, env = process.env) {
|
|
32911
|
+
const secretsEnv = snapshotClientEnvironment("secrets", env);
|
|
33620
32912
|
const vaultKey = pointerResolution.pointerVaultKey;
|
|
33621
32913
|
const pointerEnvKey = pointerResolution.source;
|
|
33622
32914
|
if (!vaultKey) {
|
|
33623
32915
|
throw new CredentialResolutionError(name, `Pointer resolution from ${pointerEnvKey} carries no vault item key; this is a defect in the resolver.`, [pointerEnvKey]);
|
|
33624
32916
|
}
|
|
32917
|
+
if (name === "secrets") {
|
|
32918
|
+
throw new CredentialResolutionError(name, "The Secrets bootstrap credential cannot reference the same hosted vault; configure an independent bootstrap provider.", [pointerEnvKey]);
|
|
32919
|
+
}
|
|
33625
32920
|
let secretsSdk;
|
|
33626
32921
|
try {
|
|
33627
|
-
|
|
32922
|
+
const sdkUrl = resolveInstalledSecrets(import.meta.url);
|
|
32923
|
+
secretsSdk = requireSecretsSdk(fileURLToPath2(sdkUrl));
|
|
33628
32924
|
} catch {
|
|
33629
32925
|
throw new CredentialResolutionError(name, `${pointerEnvKey} names vault item '${vaultKey}', but the secrets SDK (@hasna/secrets) is not installed ` + `in this process. A vault pointer is TERMINAL: install @hasna/secrets to resolve it, or unset ${pointerEnvKey}.`, [pointerEnvKey]);
|
|
33630
32926
|
}
|
|
33631
32927
|
let client;
|
|
33632
32928
|
try {
|
|
33633
|
-
|
|
32929
|
+
const bootstrap = resolveCredential("secrets", secretsEnv);
|
|
32930
|
+
if (!bootstrap || bootstrap.tier === "pointer") {
|
|
32931
|
+
throw new CredentialResolutionError("secrets", "The Secrets vault requires an independent, non-reference bootstrap credential.", bootstrap ? [bootstrap.source] : []);
|
|
32932
|
+
}
|
|
32933
|
+
client = secretsSdk.createSecretsClientFromEnv(secretsEnv);
|
|
33634
32934
|
} catch {
|
|
33635
32935
|
throw new CredentialResolutionError(name, `${pointerEnvKey} names vault item '${vaultKey}', but the secrets client could not be configured from this ` + `environment (the secrets service URL and key env are missing or invalid). A vault pointer is TERMINAL and ` + `never falls through to a literal or disk credential.`, [pointerEnvKey]);
|
|
33636
32936
|
}
|
|
@@ -33649,7 +32949,7 @@ async function completePointerCredential(name, pointerResolution, env = process.
|
|
|
33649
32949
|
apiKey: value,
|
|
33650
32950
|
tier: "pointer",
|
|
33651
32951
|
source: `${pointerEnvKey} -> vault:${vaultKey}`,
|
|
33652
|
-
deliberate:
|
|
32952
|
+
deliberate: pointerResolution.deliberate,
|
|
33653
32953
|
diskCandidates: pointerResolution.diskCandidates,
|
|
33654
32954
|
warning: null
|
|
33655
32955
|
});
|
|
@@ -33783,7 +33083,7 @@ var AUTHORITY_OVERRIDE_HEADERS = new Set([
|
|
|
33783
33083
|
]);
|
|
33784
33084
|
|
|
33785
33085
|
// src/lib/instance-credentials.ts
|
|
33786
|
-
import { closeSync as closeSync7, constants as constants6, fstatSync as fstatSync7, lstatSync as
|
|
33086
|
+
import { closeSync as closeSync7, constants as constants6, fstatSync as fstatSync7, lstatSync as lstatSync15, openSync as openSync7, readSync as readSync5 } from "fs";
|
|
33787
33087
|
var SKILLS_BOUND_API_URL = "HASNA_SKILLS_BOUND_API_URL";
|
|
33788
33088
|
function selectedSkillsProfile(env, explicit) {
|
|
33789
33089
|
const selected = explicit ?? env.HASNA_PROFILE;
|
|
@@ -33799,7 +33099,7 @@ function skillsProfileCredentialFiles(env, explicit) {
|
|
|
33799
33099
|
}
|
|
33800
33100
|
function fileIdentity(file2) {
|
|
33801
33101
|
try {
|
|
33802
|
-
return
|
|
33102
|
+
return lstatSync15(file2);
|
|
33803
33103
|
} catch (error61) {
|
|
33804
33104
|
if (["ENOENT", "ENOTDIR"].includes(error61.code ?? ""))
|
|
33805
33105
|
return null;
|
|
@@ -33997,7 +33297,7 @@ function noticeLocalSkillsMode(write = (line) => console.error(line)) {
|
|
|
33997
33297
|
if (localNoticePrinted)
|
|
33998
33298
|
return;
|
|
33999
33299
|
localNoticePrinted = true;
|
|
34000
|
-
write(`skills: local mode (${SKILLS_LOCAL_OPT_IN_ENV_KEYS[0]}=1) \u2014 running on this machine against the
|
|
33300
|
+
write(`skills: local mode (${SKILLS_LOCAL_OPT_IN_ENV_KEYS[0]}=1) \u2014 running on this machine against the Skills-owned local cache.`);
|
|
34001
33301
|
}
|
|
34002
33302
|
function resolveSkillsFleet(env = process.env, options = {}) {
|
|
34003
33303
|
try {
|
|
@@ -34071,7 +33371,7 @@ function credentialLocations(env) {
|
|
|
34071
33371
|
}
|
|
34072
33372
|
function assertCredentialInstance(credential, apiOrigin, env, options) {
|
|
34073
33373
|
let bound;
|
|
34074
|
-
if (credential.tier === "disk" || credential.tier === "profile") {
|
|
33374
|
+
if (credential.tier === "disk" || credential.tier === "profile" || credential.tier === "pointer" && credential.diskCandidates.includes(credential.source)) {
|
|
34075
33375
|
const metadata = readSkillsInstanceMetadata(credential.source);
|
|
34076
33376
|
bound = metadata.binding ?? metadata.apiUrl ?? defaultFleetGatewayBaseUrl(SKILLS_APP);
|
|
34077
33377
|
} else if (credential.tier === "keychain") {
|
|
@@ -34086,6 +33386,7 @@ async function resolveSkillsApiKey(env = process.env, options = {}) {
|
|
|
34086
33386
|
}
|
|
34087
33387
|
async function resolveSkillsConnection(env = process.env, options = {}) {
|
|
34088
33388
|
const snapshotEnv = snapshotSkillsEnvironment(env);
|
|
33389
|
+
const assertFilesUnchanged = selectsSkillsLocalMode(snapshotEnv) ? () => {} : captureSkillsCredentialFiles(skillsProfileCredentialFiles(snapshotEnv, options.credentials?.profile));
|
|
34089
33390
|
const fleet = resolveSkillsFleet(snapshotEnv, snapshotSkillsOptions(env, options));
|
|
34090
33391
|
if (fleet.mode === "local" && env === process.env)
|
|
34091
33392
|
noticeLocalSkillsMode();
|
|
@@ -34099,7 +33400,7 @@ async function resolveSkillsConnection(env = process.env, options = {}) {
|
|
|
34099
33400
|
}
|
|
34100
33401
|
let completed;
|
|
34101
33402
|
try {
|
|
34102
|
-
completed = await completePointerCredential(SKILLS_APP, pointer,
|
|
33403
|
+
completed = await completePointerCredential(SKILLS_APP, pointer, env);
|
|
34103
33404
|
} catch (error61) {
|
|
34104
33405
|
const translated = asSkillsFleetCredentialError(error61);
|
|
34105
33406
|
if (translated)
|
|
@@ -34109,6 +33410,7 @@ async function resolveSkillsConnection(env = process.env, options = {}) {
|
|
|
34109
33410
|
if (!completed.apiKey?.trim()) {
|
|
34110
33411
|
throw new SkillsFleetCredentialError(`${credentialPointerEnvKey(SKILLS_APP)} names a vault item that produced an empty Skills API key \u2014 ` + `refusing to send an unauthenticated request.`);
|
|
34111
33412
|
}
|
|
33413
|
+
assertFilesUnchanged();
|
|
34112
33414
|
return { ...fleet, apiKey: completed.apiKey, apiKeyPointer: null };
|
|
34113
33415
|
}
|
|
34114
33416
|
async function requireSkillsApiKey(action = "This command", env = process.env, options = {}) {
|
|
@@ -35069,7 +34371,7 @@ function parseInvitationResult(action, value, input2, organizationId) {
|
|
|
35069
34371
|
if (value.organizationId !== organizationId || !Array.isArray(value.invitations) || value.invitations.length > 50 || value.nextCursor !== null && !uuid3(value.nextCursor))
|
|
35070
34372
|
return invalid();
|
|
35071
34373
|
const invitations = value.invitations.map((v) => projection(v, organizationId));
|
|
35072
|
-
if (invitations.some((v,
|
|
34374
|
+
if (invitations.some((v, n2) => v.id <= String(n2 ? invitations[n2 - 1].id : request.after ?? "")) || value.nextCursor !== null && (invitations.length !== 50 || value.nextCursor !== invitations.at(-1)?.id))
|
|
35073
34375
|
return invalid();
|
|
35074
34376
|
return { organizationId, invitations, nextCursor: value.nextCursor };
|
|
35075
34377
|
}
|
|
@@ -35344,7 +34646,9 @@ function parseWorkspaceLeaveResult(value, membershipId, organizationId) {
|
|
|
35344
34646
|
throw new RemoteWorkspaceLeaveUnconfirmedError;
|
|
35345
34647
|
return { membershipId, organizationId, removed: true, signInRequired: true };
|
|
35346
34648
|
}
|
|
34649
|
+
|
|
35347
34650
|
// src/lib/auth-store.ts
|
|
34651
|
+
var SKILLS_API_KEY_REF = credentialPointerEnvKey("skills");
|
|
35348
34652
|
function getApiUrl(action, env = process.env, options = {}) {
|
|
35349
34653
|
return requireSkillsApiOrigin(action, env, options);
|
|
35350
34654
|
}
|
|
@@ -36408,9 +35712,9 @@ async function createRemoteSkillsClient(env = process.env) {
|
|
|
36408
35712
|
}
|
|
36409
35713
|
// src/lib/scheduler.ts
|
|
36410
35714
|
import { existsSync as existsSync16, readFileSync as readFileSync19, writeFileSync as writeFileSync9, mkdirSync as mkdirSync10 } from "fs";
|
|
36411
|
-
import { join as
|
|
35715
|
+
import { join as join27 } from "path";
|
|
36412
35716
|
function getSchedulesPath(targetDir = process.cwd()) {
|
|
36413
|
-
return
|
|
35717
|
+
return join27(targetDir, ".skills", "schedules.json");
|
|
36414
35718
|
}
|
|
36415
35719
|
function loadSchedules(targetDir = process.cwd()) {
|
|
36416
35720
|
const path = getSchedulesPath(targetDir);
|
|
@@ -36423,7 +35727,7 @@ function loadSchedules(targetDir = process.cwd()) {
|
|
|
36423
35727
|
}
|
|
36424
35728
|
function saveSchedules(data, targetDir = process.cwd()) {
|
|
36425
35729
|
const path = getSchedulesPath(targetDir);
|
|
36426
|
-
const dir =
|
|
35730
|
+
const dir = join27(targetDir, ".skills");
|
|
36427
35731
|
if (!existsSync16(dir))
|
|
36428
35732
|
mkdirSync10(dir, { recursive: true });
|
|
36429
35733
|
writeFileSync9(path, JSON.stringify(data, null, 2));
|
|
@@ -36456,11 +35760,11 @@ function validateCronField(expr, min, max, label) {
|
|
|
36456
35760
|
}
|
|
36457
35761
|
continue;
|
|
36458
35762
|
}
|
|
36459
|
-
const
|
|
36460
|
-
if (isNaN(
|
|
35763
|
+
const n2 = parseInt(valuePart);
|
|
35764
|
+
if (isNaN(n2))
|
|
36461
35765
|
return { valid: false, error: `Invalid value "${valuePart}" in ${label}` };
|
|
36462
|
-
if (
|
|
36463
|
-
return { valid: false, error: `Value ${
|
|
35766
|
+
if (n2 < min || n2 > max) {
|
|
35767
|
+
return { valid: false, error: `Value ${n2} outside valid ${min}-${max} in ${label}` };
|
|
36464
35768
|
}
|
|
36465
35769
|
}
|
|
36466
35770
|
return { valid: true };
|
|
@@ -36507,8 +35811,8 @@ function getNextRun(cron, from = new Date) {
|
|
|
36507
35811
|
const [lo, hi] = part.split("-").map(Number);
|
|
36508
35812
|
return Array.from({ length: hi - lo + 1 }, (_, i) => i + lo);
|
|
36509
35813
|
}
|
|
36510
|
-
const
|
|
36511
|
-
return isNaN(
|
|
35814
|
+
const n2 = parseInt(part);
|
|
35815
|
+
return isNaN(n2) ? [] : [n2];
|
|
36512
35816
|
});
|
|
36513
35817
|
}
|
|
36514
35818
|
const minutes = parseField(minuteF, 0, 59);
|
|
@@ -36634,7 +35938,7 @@ function revisionIdOfRecord(record6) {
|
|
|
36634
35938
|
}
|
|
36635
35939
|
// src/lib/pull.ts
|
|
36636
35940
|
import { existsSync as existsSync17, mkdirSync as mkdirSync11, mkdtempSync as mkdtempSync3, readFileSync as readFileSync20, renameSync as renameSync5, rmSync as rmSync4, writeFileSync as writeFileSync10 } from "fs";
|
|
36637
|
-
import { dirname as dirname13, join as
|
|
35941
|
+
import { dirname as dirname13, join as join28 } from "path";
|
|
36638
35942
|
|
|
36639
35943
|
// src/lib/skill-bundles.ts
|
|
36640
35944
|
import { createHmac, timingSafeEqual } from "crypto";
|
|
@@ -36728,7 +36032,7 @@ async function pullOne(client, rawName, corpusOptions, verify) {
|
|
|
36728
36032
|
return reconcileTombstone(slug, corpusOptions);
|
|
36729
36033
|
}
|
|
36730
36034
|
if (bundleResponse.status === 404) {
|
|
36731
|
-
const marker = readPullMarker(
|
|
36035
|
+
const marker = readPullMarker(join28(getPortableSkillsRoot(corpusOptions), slug));
|
|
36732
36036
|
if (isPublishedInstallMarker(marker)) {
|
|
36733
36037
|
return { name: slug, success: true, purged: true, removed: false };
|
|
36734
36038
|
}
|
|
@@ -36767,7 +36071,7 @@ async function pullOne(client, rawName, corpusOptions, verify) {
|
|
|
36767
36071
|
return { name: slug, success: false, error: `Skill '${slug}' was not found on the configured Skills instance.` };
|
|
36768
36072
|
}
|
|
36769
36073
|
if (!meta3?.revisionId) {
|
|
36770
|
-
const marker = readPullMarker(
|
|
36074
|
+
const marker = readPullMarker(join28(getPortableSkillsRoot(corpusOptions), slug));
|
|
36771
36075
|
if (isPublishedInstallMarker(marker)) {
|
|
36772
36076
|
return { name: slug, success: true, purged: true, removed: false };
|
|
36773
36077
|
}
|
|
@@ -36824,7 +36128,7 @@ function provenRevision(meta3, slug, bundle) {
|
|
|
36824
36128
|
return declared;
|
|
36825
36129
|
}
|
|
36826
36130
|
function reconcileTombstone(slug, corpusOptions) {
|
|
36827
|
-
const target =
|
|
36131
|
+
const target = join28(getPortableSkillsRoot(corpusOptions), slug);
|
|
36828
36132
|
if (!hasSkillsOwnershipMarker(target)) {
|
|
36829
36133
|
return { name: slug, success: true, tombstoned: true, removed: false, leftInPlace: true };
|
|
36830
36134
|
}
|
|
@@ -36833,7 +36137,7 @@ function reconcileTombstone(slug, corpusOptions) {
|
|
|
36833
36137
|
}
|
|
36834
36138
|
function readPullMarker(dir) {
|
|
36835
36139
|
try {
|
|
36836
|
-
return JSON.parse(readFileSync20(
|
|
36140
|
+
return JSON.parse(readFileSync20(join28(dir, PULL_MARKER_FILE), "utf-8"));
|
|
36837
36141
|
} catch {
|
|
36838
36142
|
return null;
|
|
36839
36143
|
}
|
|
@@ -36968,14 +36272,14 @@ function verifyBundleResponseBytes(buffer, response, verify = {}) {
|
|
|
36968
36272
|
function installBundleAtomically(name, entries, options = {}, marker = {}) {
|
|
36969
36273
|
const root = getPortableSkillsRoot(options);
|
|
36970
36274
|
mkdirSync11(root, { recursive: true });
|
|
36971
|
-
const target =
|
|
36275
|
+
const target = join28(root, name);
|
|
36972
36276
|
const created = !existsSync17(target);
|
|
36973
|
-
const staging = mkdtempSync3(
|
|
36277
|
+
const staging = mkdtempSync3(join28(root, `.pull-${name}-`));
|
|
36974
36278
|
let moved = false;
|
|
36975
36279
|
let backup = null;
|
|
36976
36280
|
try {
|
|
36977
36281
|
for (const entry of entries) {
|
|
36978
|
-
const destination =
|
|
36282
|
+
const destination = join28(staging, entry.path);
|
|
36979
36283
|
mkdirSync11(dirname13(destination), { recursive: true });
|
|
36980
36284
|
writeFileSync10(destination, entry.bytes, { mode: entry.mode });
|
|
36981
36285
|
}
|
|
@@ -36988,8 +36292,8 @@ function installBundleAtomically(name, entries, options = {}, marker = {}) {
|
|
|
36988
36292
|
...marker.revisionId ? { revisionId: marker.revisionId } : {}
|
|
36989
36293
|
});
|
|
36990
36294
|
if (existsSync17(target)) {
|
|
36991
|
-
backup = mkdtempSync3(
|
|
36992
|
-
renameSync5(target,
|
|
36295
|
+
backup = mkdtempSync3(join28(root, `.pull-backup-${name}-`));
|
|
36296
|
+
renameSync5(target, join28(backup, name));
|
|
36993
36297
|
moved = true;
|
|
36994
36298
|
}
|
|
36995
36299
|
renameSync5(staging, target);
|
|
@@ -36997,9 +36301,9 @@ function installBundleAtomically(name, entries, options = {}, marker = {}) {
|
|
|
36997
36301
|
rmSync4(backup, { recursive: true, force: true });
|
|
36998
36302
|
} catch (error61) {
|
|
36999
36303
|
rmSync4(staging, { recursive: true, force: true });
|
|
37000
|
-
if (moved && backup && existsSync17(
|
|
36304
|
+
if (moved && backup && existsSync17(join28(backup, name))) {
|
|
37001
36305
|
try {
|
|
37002
|
-
renameSync5(
|
|
36306
|
+
renameSync5(join28(backup, name), target);
|
|
37003
36307
|
} catch {}
|
|
37004
36308
|
}
|
|
37005
36309
|
throw error61;
|
|
@@ -37018,7 +36322,7 @@ function writePullMarker(dir, record6) {
|
|
|
37018
36322
|
...record6.revisionId ? { revisionId: record6.revisionId } : {},
|
|
37019
36323
|
syncedAt: new Date().toISOString()
|
|
37020
36324
|
};
|
|
37021
|
-
writeFileSync10(
|
|
36325
|
+
writeFileSync10(join28(dir, PULL_MARKER_FILE), `${JSON.stringify(marker, null, 2)}
|
|
37022
36326
|
`);
|
|
37023
36327
|
}
|
|
37024
36328
|
async function safeMeta(client, slug) {
|
|
@@ -37174,11 +36478,11 @@ function findSkillsParityForMcpTool(tool) {
|
|
|
37174
36478
|
}
|
|
37175
36479
|
// src/lib/registry-sync.ts
|
|
37176
36480
|
import { mkdirSync as mkdirSync12, writeFileSync as writeFileSync11 } from "fs";
|
|
37177
|
-
import { dirname as dirname14, relative as
|
|
36481
|
+
import { dirname as dirname14, relative as relative7 } from "path";
|
|
37178
36482
|
// package.json
|
|
37179
36483
|
var package_default = {
|
|
37180
36484
|
name: "@hasna/skills",
|
|
37181
|
-
version: "0.
|
|
36485
|
+
version: "0.8.0",
|
|
37182
36486
|
description: "Skills library for AI coding agents",
|
|
37183
36487
|
type: "module",
|
|
37184
36488
|
bin: {
|
|
@@ -37263,7 +36567,8 @@ var package_default = {
|
|
|
37263
36567
|
author: "Hasna",
|
|
37264
36568
|
license: "Apache-2.0",
|
|
37265
36569
|
devDependencies: {
|
|
37266
|
-
"@hasna/contracts": "1.0
|
|
36570
|
+
"@hasna/contracts": "1.1.0",
|
|
36571
|
+
"@hasna/secrets": "0.4.2",
|
|
37267
36572
|
"@types/bun": "1.3.14",
|
|
37268
36573
|
"@types/node": "25.2.3",
|
|
37269
36574
|
"@types/react": "^18.2.0",
|
|
@@ -37316,7 +36621,7 @@ function createRegistrySyncArtifact(options = {}) {
|
|
|
37316
36621
|
const registry2 = [...loadRegistryProfile(profile)].sort((a, b) => a.name.localeCompare(b.name));
|
|
37317
36622
|
const skills = registry2.map((skill) => {
|
|
37318
36623
|
const skillPath = getSkillPath(skill.name);
|
|
37319
|
-
const directory =
|
|
36624
|
+
const directory = relative7(process.cwd(), skillPath) || skillPath;
|
|
37320
36625
|
const validation = includeValidation ? validateSkillDirectory(skill.name, skillPath, skill) : undefined;
|
|
37321
36626
|
const docs = includeDocs ? buildDocs(skill.name) : undefined;
|
|
37322
36627
|
return {
|
|
@@ -38435,10 +37740,10 @@ function clone3(value) {
|
|
|
38435
37740
|
}
|
|
38436
37741
|
// src/lib/feedback.ts
|
|
38437
37742
|
import { appendFileSync, existsSync as existsSync18, mkdirSync as mkdirSync13 } from "fs";
|
|
38438
|
-
import { dirname as dirname15, join as
|
|
37743
|
+
import { dirname as dirname15, join as join29 } from "path";
|
|
38439
37744
|
import { Database } from "bun:sqlite";
|
|
38440
37745
|
function getFeedbackDbPath() {
|
|
38441
|
-
return
|
|
37746
|
+
return join29(getDataDir(), "skills.db");
|
|
38442
37747
|
}
|
|
38443
37748
|
function getFeedbackDb() {
|
|
38444
37749
|
const dbPath = getFeedbackDbPath();
|
|
@@ -38470,7 +37775,7 @@ function saveFeedback(input2) {
|
|
|
38470
37775
|
throw new Error("Feedback message is required");
|
|
38471
37776
|
const category = input2.category ?? "general";
|
|
38472
37777
|
if (isApiMode()) {
|
|
38473
|
-
const path =
|
|
37778
|
+
const path = join29(getDataDir(), "feedback.jsonl");
|
|
38474
37779
|
const dir = dirname15(path);
|
|
38475
37780
|
if (!existsSync18(dir))
|
|
38476
37781
|
mkdirSync13(dir, { recursive: true });
|
|
@@ -38499,11 +37804,11 @@ import {
|
|
|
38499
37804
|
existsSync as existsSync19,
|
|
38500
37805
|
mkdirSync as mkdirSync14,
|
|
38501
37806
|
readFileSync as readFileSync21,
|
|
38502
|
-
readdirSync as
|
|
37807
|
+
readdirSync as readdirSync13,
|
|
38503
37808
|
statSync as statSync11,
|
|
38504
37809
|
writeFileSync as writeFileSync12
|
|
38505
37810
|
} from "fs";
|
|
38506
|
-
import { dirname as dirname16, join as
|
|
37811
|
+
import { dirname as dirname16, join as join30, normalize as normalize3, relative as relative8, sep as sep7 } from "path";
|
|
38507
37812
|
var SKILLS_STORAGE_TABLES = [
|
|
38508
37813
|
"skills_sync_records",
|
|
38509
37814
|
"skills_sync_cursors"
|
|
@@ -38640,7 +37945,7 @@ function getSkillsNativeStorageStatus(options = {}) {
|
|
|
38640
37945
|
local: {
|
|
38641
37946
|
dataDir: getDataDir(),
|
|
38642
37947
|
projectStateDir: getProjectStateDir(targetDir),
|
|
38643
|
-
feedbackDbPath:
|
|
37948
|
+
feedbackDbPath: join30(getDataDir(), "skills.db")
|
|
38644
37949
|
},
|
|
38645
37950
|
remote: {
|
|
38646
37951
|
databaseConfigured: Boolean(config2.databaseUrl),
|
|
@@ -38666,7 +37971,7 @@ function exportSkillsLocalSnapshot(targetDir = process.cwd(), options = {}) {
|
|
|
38666
37971
|
if (existsSync19(projectStateDir)) {
|
|
38667
37972
|
for (const filePath of walkFiles2(projectStateDir)) {
|
|
38668
37973
|
const bytes = readFileSync21(filePath);
|
|
38669
|
-
const relativePath = toPosix(
|
|
37974
|
+
const relativePath = toPosix(relative8(targetDir, filePath));
|
|
38670
37975
|
files.push({
|
|
38671
37976
|
path: relativePath,
|
|
38672
37977
|
sizeBytes: bytes.byteLength,
|
|
@@ -38996,8 +38301,8 @@ function parsePositiveInteger(value) {
|
|
|
38996
38301
|
}
|
|
38997
38302
|
function walkFiles2(dir) {
|
|
38998
38303
|
const files = [];
|
|
38999
|
-
for (const entry of
|
|
39000
|
-
const full =
|
|
38304
|
+
for (const entry of readdirSync13(dir)) {
|
|
38305
|
+
const full = join30(dir, entry);
|
|
39001
38306
|
const stats = statSync11(full);
|
|
39002
38307
|
if (stats.isDirectory())
|
|
39003
38308
|
files.push(...walkFiles2(full));
|
|
@@ -39008,13 +38313,13 @@ function walkFiles2(dir) {
|
|
|
39008
38313
|
}
|
|
39009
38314
|
function resolveSnapshotPath(targetDir, snapshotPath) {
|
|
39010
38315
|
const normalizedPath = normalize3(snapshotPath);
|
|
39011
|
-
if (normalizedPath.startsWith("..") || normalizedPath.includes(`${
|
|
38316
|
+
if (normalizedPath.startsWith("..") || normalizedPath.includes(`${sep7}..${sep7}`) || normalizedPath.startsWith(sep7)) {
|
|
39012
38317
|
throw new Error(`Unsafe snapshot path: ${snapshotPath}`);
|
|
39013
38318
|
}
|
|
39014
38319
|
if (!toPosix(normalizedPath).startsWith(".skills/")) {
|
|
39015
38320
|
throw new Error(`Snapshot path must stay inside .skills: ${snapshotPath}`);
|
|
39016
38321
|
}
|
|
39017
|
-
return
|
|
38322
|
+
return join30(targetDir, normalizedPath);
|
|
39018
38323
|
}
|
|
39019
38324
|
function normalizeS3Prefix(prefix) {
|
|
39020
38325
|
return (prefix ?? "").trim().replace(/^\/+|\/+$/g, "");
|
|
@@ -39081,18 +38386,18 @@ function toArrayBuffer(bytes) {
|
|
|
39081
38386
|
// src/lib/station-snapshot.ts
|
|
39082
38387
|
import { createHash as createHash14 } from "crypto";
|
|
39083
38388
|
import {
|
|
39084
|
-
copyFileSync
|
|
38389
|
+
copyFileSync,
|
|
39085
38390
|
mkdirSync as mkdirSync15,
|
|
39086
|
-
readFileSync as
|
|
38391
|
+
readFileSync as readFileSync23,
|
|
39087
38392
|
statSync as statSync13,
|
|
39088
38393
|
writeFileSync as writeFileSync13
|
|
39089
38394
|
} from "fs";
|
|
39090
|
-
import { dirname as dirname17, isAbsolute as isAbsolute10, relative as
|
|
38395
|
+
import { dirname as dirname17, isAbsolute as isAbsolute10, relative as relative9, resolve as resolve10, sep as sep9 } from "path";
|
|
39091
38396
|
|
|
39092
38397
|
// src/lib/portable-snapshot-filter.ts
|
|
39093
|
-
import { readdirSync as
|
|
38398
|
+
import { readdirSync as readdirSync14, statSync as statSync12 } from "fs";
|
|
39094
38399
|
import { homedir as homedir5 } from "os";
|
|
39095
|
-
import { join as
|
|
38400
|
+
import { join as join31, sep as sep8 } from "path";
|
|
39096
38401
|
var SYNC_HOMES = [
|
|
39097
38402
|
{ name: "skills", subClass: "skills", agent: null },
|
|
39098
38403
|
{ name: "custom", subClass: "custom", agent: null },
|
|
@@ -39185,27 +38490,27 @@ function isPortableWithinSkill(relativeParts) {
|
|
|
39185
38490
|
function homePathFor(definition, homesRoot) {
|
|
39186
38491
|
const home = homesRoot ?? homedir5();
|
|
39187
38492
|
if (definition.subClass === "skills" || definition.subClass === "custom") {
|
|
39188
|
-
return
|
|
38493
|
+
return join31(skillsDataRootForHome(home), definition.name);
|
|
39189
38494
|
}
|
|
39190
38495
|
if (definition.agent === "opencode") {
|
|
39191
|
-
return
|
|
38496
|
+
return join31(home, ".config", "opencode", "skills");
|
|
39192
38497
|
}
|
|
39193
|
-
return
|
|
38498
|
+
return join31(home, `.${definition.agent}`, "skills");
|
|
39194
38499
|
}
|
|
39195
38500
|
function destinationFor(definition, stationId, relativePath) {
|
|
39196
|
-
const category = definition.subClass === "agent-homes" ?
|
|
39197
|
-
return
|
|
38501
|
+
const category = definition.subClass === "agent-homes" ? join31("agent-homes", definition.agent ?? "") : definition.name;
|
|
38502
|
+
return join31("resources", stationId, "skills", category, ...relativePath.split(sep8));
|
|
39198
38503
|
}
|
|
39199
38504
|
function walkEntries(absoluteRoot) {
|
|
39200
38505
|
let entries;
|
|
39201
38506
|
try {
|
|
39202
|
-
entries =
|
|
38507
|
+
entries = readdirSync14(absoluteRoot, { withFileTypes: true });
|
|
39203
38508
|
} catch {
|
|
39204
38509
|
return [];
|
|
39205
38510
|
}
|
|
39206
38511
|
const output2 = [];
|
|
39207
38512
|
for (const entry of entries) {
|
|
39208
|
-
const childFull =
|
|
38513
|
+
const childFull = join31(absoluteRoot, entry.name);
|
|
39209
38514
|
if (entry.isSymbolicLink()) {
|
|
39210
38515
|
output2.push({ kind: "symlink", relativePath: entry.name, fullPath: childFull });
|
|
39211
38516
|
continue;
|
|
@@ -39216,7 +38521,7 @@ function walkEntries(absoluteRoot) {
|
|
|
39216
38521
|
}
|
|
39217
38522
|
const nested = walkEntries(childFull);
|
|
39218
38523
|
for (const item of nested) {
|
|
39219
|
-
output2.push({ ...item, relativePath:
|
|
38524
|
+
output2.push({ ...item, relativePath: join31(entry.name, item.relativePath) });
|
|
39220
38525
|
}
|
|
39221
38526
|
continue;
|
|
39222
38527
|
}
|
|
@@ -39254,7 +38559,7 @@ function validateStationId(stationId) {
|
|
|
39254
38559
|
}
|
|
39255
38560
|
}
|
|
39256
38561
|
function sha256File(filePath) {
|
|
39257
|
-
return createHash14("sha256").update(
|
|
38562
|
+
return createHash14("sha256").update(readFileSync23(filePath)).digest("hex");
|
|
39258
38563
|
}
|
|
39259
38564
|
function scanHome(definition, homesRoot) {
|
|
39260
38565
|
const homePath = homePathFor(definition, homesRoot);
|
|
@@ -39262,7 +38567,7 @@ function scanHome(definition, homesRoot) {
|
|
|
39262
38567
|
const portable = [];
|
|
39263
38568
|
const skipped = [];
|
|
39264
38569
|
for (const entry of entries) {
|
|
39265
|
-
const relativeParts = entry.relativePath.split(
|
|
38570
|
+
const relativeParts = entry.relativePath.split(sep9);
|
|
39266
38571
|
const fileName = relativeParts[relativeParts.length - 1];
|
|
39267
38572
|
if (entry.kind === "symlink") {
|
|
39268
38573
|
skipped.push({ relativePath: entry.relativePath, reason: "symlink" });
|
|
@@ -39352,8 +38657,8 @@ function writeStationSnapshot(options) {
|
|
|
39352
38657
|
const untouched = [];
|
|
39353
38658
|
for (const plan of plans) {
|
|
39354
38659
|
const destination = resolve10(repoRoot, plan.destination);
|
|
39355
|
-
const destinationRelative =
|
|
39356
|
-
if (destinationRelative.startsWith("..") || destinationRelative.startsWith(
|
|
38660
|
+
const destinationRelative = relative9(repoRoot, destination);
|
|
38661
|
+
if (destinationRelative.startsWith("..") || destinationRelative.startsWith(sep9) || isAbsolute10(destinationRelative)) {
|
|
39357
38662
|
throw new StationSnapshotError("DESTINATION_ESCAPE", `destination escapes repo root: ${plan.destination}`);
|
|
39358
38663
|
}
|
|
39359
38664
|
let existingDigest = null;
|
|
@@ -39376,7 +38681,7 @@ function writeStationSnapshot(options) {
|
|
|
39376
38681
|
for (const plan of untouched) {
|
|
39377
38682
|
const destination = resolve10(repoRoot, plan.destination);
|
|
39378
38683
|
mkdirSync15(dirname17(destination), { recursive: true });
|
|
39379
|
-
|
|
38684
|
+
copyFileSync(plan.source.fullPath, destination);
|
|
39380
38685
|
written += 1;
|
|
39381
38686
|
}
|
|
39382
38687
|
const unchanged2 = plans.length - untouched.length;
|
|
@@ -39407,14 +38712,14 @@ function writeStationSnapshot(options) {
|
|
|
39407
38712
|
// src/lib/station-hydrate.ts
|
|
39408
38713
|
import { createHash as createHash15 } from "crypto";
|
|
39409
38714
|
import {
|
|
39410
|
-
copyFileSync as
|
|
38715
|
+
copyFileSync as copyFileSync2,
|
|
39411
38716
|
mkdirSync as mkdirSync16,
|
|
39412
|
-
readdirSync as
|
|
39413
|
-
readFileSync as
|
|
38717
|
+
readdirSync as readdirSync15,
|
|
38718
|
+
readFileSync as readFileSync25,
|
|
39414
38719
|
statSync as statSync14,
|
|
39415
38720
|
writeFileSync as writeFileSync14
|
|
39416
38721
|
} from "fs";
|
|
39417
|
-
import { dirname as dirname18, join as
|
|
38722
|
+
import { dirname as dirname18, join as join32, resolve as resolve11, sep as sep10 } from "path";
|
|
39418
38723
|
var STATION_HYDRATION_MANIFEST_SCHEMA = "hasna.fleet-resources.skills-hydration-manifest/v1";
|
|
39419
38724
|
var STATION_HYDRATION_PRODUCER = { name: "@hasna/skills", version: package_default.version };
|
|
39420
38725
|
var MANIFEST_HASH_KEY_SEP = String.fromCharCode(0);
|
|
@@ -39422,14 +38727,14 @@ function fail(code, message, detail = []) {
|
|
|
39422
38727
|
throw new StationSnapshotError(code, message, detail);
|
|
39423
38728
|
}
|
|
39424
38729
|
function snapshotRootFor(repoRoot, stationId) {
|
|
39425
|
-
return
|
|
38730
|
+
return join32(repoRoot, "resources", stationId, "skills");
|
|
39426
38731
|
}
|
|
39427
38732
|
function readSnapshotManifest(repoRoot, stationId) {
|
|
39428
38733
|
const snapshotRoot = snapshotRootFor(repoRoot, stationId);
|
|
39429
|
-
const manifestPath =
|
|
38734
|
+
const manifestPath = join32(snapshotRoot, "sync-manifest.json");
|
|
39430
38735
|
let manifest;
|
|
39431
38736
|
try {
|
|
39432
|
-
manifest = JSON.parse(
|
|
38737
|
+
manifest = JSON.parse(readFileSync25(manifestPath, "utf8"));
|
|
39433
38738
|
} catch (error61) {
|
|
39434
38739
|
fail("MANIFEST_UNREADABLE", `cannot read snapshot manifest: ${manifestPath}: ${error61.message}`);
|
|
39435
38740
|
}
|
|
@@ -39453,10 +38758,10 @@ function planStationHydration(stationId, repoRoot) {
|
|
|
39453
38758
|
const hashMismatches = [];
|
|
39454
38759
|
const skippedByRule = [];
|
|
39455
38760
|
for (const agent of SYNC_AGENTS) {
|
|
39456
|
-
const agentRoot =
|
|
38761
|
+
const agentRoot = join32(snapshotRoot, "agent-homes", agent);
|
|
39457
38762
|
let identEntries;
|
|
39458
38763
|
try {
|
|
39459
|
-
identEntries =
|
|
38764
|
+
identEntries = readdirSync15(agentRoot, { withFileTypes: true });
|
|
39460
38765
|
} catch {
|
|
39461
38766
|
continue;
|
|
39462
38767
|
}
|
|
@@ -39464,10 +38769,10 @@ function planStationHydration(stationId, repoRoot) {
|
|
|
39464
38769
|
if (!identEntry.isDirectory() || identEntry.name.startsWith(".")) {
|
|
39465
38770
|
continue;
|
|
39466
38771
|
}
|
|
39467
|
-
const identRoot =
|
|
38772
|
+
const identRoot = join32(agentRoot, identEntry.name);
|
|
39468
38773
|
const entries = walkEntries(identRoot);
|
|
39469
38774
|
for (const entry of entries) {
|
|
39470
|
-
const relativeParts = [identEntry.name, ...entry.relativePath.split(
|
|
38775
|
+
const relativeParts = [identEntry.name, ...entry.relativePath.split(sep10)];
|
|
39471
38776
|
if (entry.kind === "symlink") {
|
|
39472
38777
|
symlinks.push({ ident: identEntry.name, agent, relativePath: entry.relativePath });
|
|
39473
38778
|
continue;
|
|
@@ -39491,8 +38796,8 @@ function planStationHydration(stationId, repoRoot) {
|
|
|
39491
38796
|
});
|
|
39492
38797
|
continue;
|
|
39493
38798
|
}
|
|
39494
|
-
const withinIdent = relativeParts.slice(1).join(
|
|
39495
|
-
const homeRelative = relativeParts.join(
|
|
38799
|
+
const withinIdent = relativeParts.slice(1).join(sep10);
|
|
38800
|
+
const homeRelative = relativeParts.join(sep10);
|
|
39496
38801
|
if (REFUSED_SCANNER_FLAGGED.has(homeRelative)) {
|
|
39497
38802
|
skippedByRule.push({
|
|
39498
38803
|
ident: identEntry.name,
|
|
@@ -39565,7 +38870,7 @@ function planStationHydration(stationId, repoRoot) {
|
|
|
39565
38870
|
for (const copy of copies) {
|
|
39566
38871
|
let isStub = false;
|
|
39567
38872
|
try {
|
|
39568
|
-
isStub = isPointerSkillMd(
|
|
38873
|
+
isStub = isPointerSkillMd(readFileSync25(copy.fullPath, "utf8"));
|
|
39569
38874
|
} catch {
|
|
39570
38875
|
isStub = false;
|
|
39571
38876
|
}
|
|
@@ -39649,7 +38954,7 @@ function writeStationHydration(options) {
|
|
|
39649
38954
|
const toWrite = [];
|
|
39650
38955
|
for (const skill of plan.winners) {
|
|
39651
38956
|
for (const file2 of skill.files) {
|
|
39652
|
-
const destination =
|
|
38957
|
+
const destination = join32(cacheRoot, skill.ident, file2.withinIdent);
|
|
39653
38958
|
const digest2 = sha256File(file2.winner.fullPath);
|
|
39654
38959
|
let existingDigest = null;
|
|
39655
38960
|
try {
|
|
@@ -39671,7 +38976,7 @@ function writeStationHydration(options) {
|
|
|
39671
38976
|
let written = 0;
|
|
39672
38977
|
for (const entry of toWrite) {
|
|
39673
38978
|
mkdirSync16(dirname18(entry.destination), { recursive: true });
|
|
39674
|
-
|
|
38979
|
+
copyFileSync2(entry.fullPath, entry.destination);
|
|
39675
38980
|
written += 1;
|
|
39676
38981
|
}
|
|
39677
38982
|
const unchanged2 = plan.totalFiles - written;
|
|
@@ -39691,7 +38996,7 @@ function writeStationHydration(options) {
|
|
|
39691
38996
|
},
|
|
39692
38997
|
skills: resultSkills
|
|
39693
38998
|
};
|
|
39694
|
-
const hydrationManifestPath =
|
|
38999
|
+
const hydrationManifestPath = join32(dirname18(cacheRoot), `hydration-${options.stationId}.json`);
|
|
39695
39000
|
mkdirSync16(dirname18(hydrationManifestPath), { recursive: true });
|
|
39696
39001
|
writeFileSync14(hydrationManifestPath, `${JSON.stringify(hydration, null, 2)}
|
|
39697
39002
|
`);
|
|
@@ -40327,23 +39632,23 @@ class RemoteSkillsAuthClient {
|
|
|
40327
39632
|
}
|
|
40328
39633
|
}
|
|
40329
39634
|
// src/lib/private-publication-recovery.ts
|
|
40330
|
-
import { constants as constants7, closeSync as closeSync8, fsyncSync as fsyncSync2, fstatSync as fstatSync8, lstatSync as
|
|
40331
|
-
import { dirname as dirname19, isAbsolute as isAbsolute11, join as
|
|
39635
|
+
import { constants as constants7, closeSync as closeSync8, fsyncSync as fsyncSync2, fstatSync as fstatSync8, lstatSync as lstatSync16, mkdirSync as mkdirSync17, openSync as openSync8, readSync as readSync6, realpathSync as realpathSync6, renameSync as renameSync6, unlinkSync as unlinkSync4, writeFileSync as writeFileSync15 } from "fs";
|
|
39636
|
+
import { dirname as dirname19, isAbsolute as isAbsolute11, join as join33, resolve as resolve12 } from "path";
|
|
40332
39637
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
40333
39638
|
var fail2 = () => {
|
|
40334
39639
|
throw new PrivatePublicationError("PUBLICATION_RECOVERY_INVALID", "The recovery directory is invalid or changed. Preserve it and inspect the existing intent; do not start a replacement automatically.");
|
|
40335
39640
|
};
|
|
40336
39641
|
function safeDirectory(directory) {
|
|
40337
|
-
if (!isAbsolute11(directory) || directory !== resolve12(directory) ||
|
|
39642
|
+
if (!isAbsolute11(directory) || directory !== resolve12(directory) || realpathSync6(directory) !== directory)
|
|
40338
39643
|
return fail2();
|
|
40339
39644
|
for (let path = directory;; path = dirname19(path)) {
|
|
40340
|
-
const stat =
|
|
39645
|
+
const stat = lstatSync16(path);
|
|
40341
39646
|
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
40342
39647
|
return fail2();
|
|
40343
39648
|
if (path === dirname19(path))
|
|
40344
39649
|
break;
|
|
40345
39650
|
}
|
|
40346
|
-
const own2 =
|
|
39651
|
+
const own2 = lstatSync16(directory);
|
|
40347
39652
|
if ((own2.mode & 63) !== 0 || process.getuid && own2.uid !== process.getuid())
|
|
40348
39653
|
return fail2();
|
|
40349
39654
|
return { dev: own2.dev, ino: own2.ino };
|
|
@@ -40354,7 +39659,7 @@ function unchangedDirectory(directory, identity3) {
|
|
|
40354
39659
|
return fail2();
|
|
40355
39660
|
}
|
|
40356
39661
|
function readOwned(directory, name, max) {
|
|
40357
|
-
const identity3 = safeDirectory(directory), file2 =
|
|
39662
|
+
const identity3 = safeDirectory(directory), file2 = join33(directory, name);
|
|
40358
39663
|
const fd = openSync8(file2, constants7.O_RDONLY | constants7.O_NOFOLLOW);
|
|
40359
39664
|
try {
|
|
40360
39665
|
const stat = fstatSync8(fd);
|
|
@@ -40378,7 +39683,7 @@ function readOwned(directory, name, max) {
|
|
|
40378
39683
|
}
|
|
40379
39684
|
}
|
|
40380
39685
|
function writeOwned(directory, name, bytes) {
|
|
40381
|
-
const fd = openSync8(
|
|
39686
|
+
const fd = openSync8(join33(directory, name), constants7.O_WRONLY | constants7.O_CREAT | constants7.O_EXCL | constants7.O_NOFOLLOW, 384);
|
|
40382
39687
|
try {
|
|
40383
39688
|
writeFileSync15(fd, bytes);
|
|
40384
39689
|
fsyncSync2(fd);
|
|
@@ -40391,7 +39696,7 @@ function save(directory, value) {
|
|
|
40391
39696
|
writeOwned(directory, temporary, JSON.stringify(value) + `
|
|
40392
39697
|
`);
|
|
40393
39698
|
unchangedDirectory(directory, identity3);
|
|
40394
|
-
renameSync6(
|
|
39699
|
+
renameSync6(join33(directory, temporary), join33(directory, "receipt.json"));
|
|
40395
39700
|
const fd = openSync8(directory, constants7.O_RDONLY | constants7.O_NOFOLLOW);
|
|
40396
39701
|
try {
|
|
40397
39702
|
fsyncSync2(fd);
|
|
@@ -40404,7 +39709,7 @@ function bind(client, receipt) {
|
|
|
40404
39709
|
throw new PrivatePublicationError("PUBLICATION_IDENTITY_CHANGED", "The fresh session does not match the recovery directory's server, account and membership.");
|
|
40405
39710
|
}
|
|
40406
39711
|
async function locked(directory, action) {
|
|
40407
|
-
const identity3 = safeDirectory(directory), file2 =
|
|
39712
|
+
const identity3 = safeDirectory(directory), file2 = join33(directory, "operation.lock");
|
|
40408
39713
|
let fd;
|
|
40409
39714
|
try {
|
|
40410
39715
|
fd = openSync8(file2, constants7.O_WRONLY | constants7.O_CREAT | constants7.O_EXCL | constants7.O_NOFOLLOW, 384);
|
|
@@ -40420,7 +39725,7 @@ async function locked(directory, action) {
|
|
|
40420
39725
|
} finally {
|
|
40421
39726
|
closeSync8(fd);
|
|
40422
39727
|
unchangedDirectory(directory, identity3);
|
|
40423
|
-
const now =
|
|
39728
|
+
const now = lstatSync16(file2);
|
|
40424
39729
|
if (now.dev !== lock.dev || now.ino !== lock.ino || !now.isFile() || now.isSymbolicLink())
|
|
40425
39730
|
fail2();
|
|
40426
39731
|
unlinkSync4(file2);
|
|
@@ -40472,7 +39777,7 @@ async function preparePrivatePublication(client, sourceDirectory, recoveryDirect
|
|
|
40472
39777
|
phase: "prepared",
|
|
40473
39778
|
intent: null
|
|
40474
39779
|
};
|
|
40475
|
-
if (!isAbsolute11(recoveryDirectory) || resolve12(recoveryDirectory) !== recoveryDirectory ||
|
|
39780
|
+
if (!isAbsolute11(recoveryDirectory) || resolve12(recoveryDirectory) !== recoveryDirectory || realpathSync6(dirname19(recoveryDirectory)) !== dirname19(recoveryDirectory))
|
|
40476
39781
|
return fail2();
|
|
40477
39782
|
mkdirSync17(recoveryDirectory, { mode: 448 });
|
|
40478
39783
|
safeDirectory(recoveryDirectory);
|