itismyskillmarket 1.3.47 → 1.3.48
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 +1 -1
- package/dist/{chunk-KDSWKP7T.js → chunk-B3B5NGC6.js} +216 -207
- package/dist/electron-entry.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SkillMarket
|
|
2
2
|
|
|
3
|
-
> **v1.3.
|
|
3
|
+
> **v1.3.48** — Cross-platform skill manager for AI coding tools (Cursor, VSCode, Codex CLI, OpenCode, Claude Code, Antigravity, OpenClaw, Hermes Agent, Saitec TUI).
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -1295,13 +1295,9 @@ async function fetchScopePackages() {
|
|
|
1295
1295
|
}
|
|
1296
1296
|
return [...all].sort();
|
|
1297
1297
|
}
|
|
1298
|
-
async function
|
|
1299
|
-
console.log("\n\u{1F50D} Fetching all published skills...\n");
|
|
1298
|
+
async function fetchScopePackageDetails() {
|
|
1300
1299
|
const packages = await fetchScopePackages();
|
|
1301
|
-
if (packages.length === 0)
|
|
1302
|
-
console.log("No published skills found.");
|
|
1303
|
-
return;
|
|
1304
|
-
}
|
|
1300
|
+
if (packages.length === 0) return [];
|
|
1305
1301
|
const details = await throttledMap(
|
|
1306
1302
|
packages,
|
|
1307
1303
|
async (pkg) => {
|
|
@@ -1323,21 +1319,189 @@ async function adminList() {
|
|
|
1323
1319
|
}
|
|
1324
1320
|
},
|
|
1325
1321
|
3,
|
|
1326
|
-
// 并发 3
|
|
1327
1322
|
200
|
|
1328
|
-
// 批次间 200ms
|
|
1329
1323
|
);
|
|
1330
1324
|
const valid = details.filter(Boolean);
|
|
1331
|
-
console.log(`\u{1F4E6} ${valid.length} published skill(s):
|
|
1332
|
-
`);
|
|
1333
1325
|
valid.sort((a, b) => a.name.localeCompare(b.name));
|
|
1326
|
+
return valid;
|
|
1327
|
+
}
|
|
1328
|
+
async function getPublishingStats() {
|
|
1329
|
+
const packages = await fetchScopePackages();
|
|
1330
|
+
if (packages.length === 0) {
|
|
1331
|
+
return {
|
|
1332
|
+
totalSkills: 0,
|
|
1333
|
+
totalVersions: 0,
|
|
1334
|
+
averageVersions: "0",
|
|
1335
|
+
withMetadata: 0,
|
|
1336
|
+
totalSizeMB: "0",
|
|
1337
|
+
platformCount: 0,
|
|
1338
|
+
platforms: []
|
|
1339
|
+
};
|
|
1340
|
+
}
|
|
1341
|
+
const infos = (await throttledMap(
|
|
1342
|
+
packages,
|
|
1343
|
+
async (pkg) => {
|
|
1344
|
+
try {
|
|
1345
|
+
const info = await fetchNpmPackage(pkg);
|
|
1346
|
+
return info ? { name: pkg, info } : null;
|
|
1347
|
+
} catch {
|
|
1348
|
+
return null;
|
|
1349
|
+
}
|
|
1350
|
+
},
|
|
1351
|
+
3,
|
|
1352
|
+
200
|
|
1353
|
+
)).filter((item) => item !== null);
|
|
1354
|
+
let totalVersions = 0;
|
|
1355
|
+
let totalSize = 0;
|
|
1356
|
+
const platformSet = /* @__PURE__ */ new Set();
|
|
1357
|
+
let withMetadata = 0;
|
|
1358
|
+
let mostVersions = { name: "", count: 0 };
|
|
1359
|
+
let mostRecent = { name: "", date: "" };
|
|
1360
|
+
for (const { name, info } of infos) {
|
|
1361
|
+
const versions = Object.keys(info.versions || {});
|
|
1362
|
+
totalVersions += versions.length;
|
|
1363
|
+
if (versions.length > mostVersions.count) {
|
|
1364
|
+
mostVersions = { name, count: versions.length };
|
|
1365
|
+
}
|
|
1366
|
+
const latestVer = info["dist-tags"]?.latest;
|
|
1367
|
+
const latestPkg = latestVer ? info.versions?.[latestVer] : void 0;
|
|
1368
|
+
const meta = latestPkg?.skillmarket;
|
|
1369
|
+
if (meta) {
|
|
1370
|
+
withMetadata++;
|
|
1371
|
+
if (meta.platforms) meta.platforms.forEach((p) => platformSet.add(p));
|
|
1372
|
+
}
|
|
1373
|
+
if (latestPkg?.dist?.unpackedSize) totalSize += latestPkg.dist.unpackedSize;
|
|
1374
|
+
const modTime = info.time?.modified || "";
|
|
1375
|
+
if (modTime && modTime > mostRecent.date) {
|
|
1376
|
+
mostRecent = { name, date: modTime };
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
return {
|
|
1380
|
+
totalSkills: infos.length,
|
|
1381
|
+
totalVersions,
|
|
1382
|
+
averageVersions: infos.length > 0 ? (totalVersions / infos.length).toFixed(1) : "0",
|
|
1383
|
+
withMetadata,
|
|
1384
|
+
totalSizeMB: (totalSize / 1024 / 1024).toFixed(2),
|
|
1385
|
+
platformCount: platformSet.size,
|
|
1386
|
+
platforms: [...platformSet],
|
|
1387
|
+
mostVersions,
|
|
1388
|
+
mostRecent,
|
|
1389
|
+
registry: NPM_REGISTRY,
|
|
1390
|
+
scopes: [...SKILL_SCOPES]
|
|
1391
|
+
};
|
|
1392
|
+
}
|
|
1393
|
+
async function verifySkillData(skillId) {
|
|
1394
|
+
const info = await fetchSkillPackage(skillId);
|
|
1395
|
+
if (!info) return null;
|
|
1396
|
+
const checks = [];
|
|
1397
|
+
let passed = 0;
|
|
1398
|
+
let failed = 0;
|
|
1399
|
+
let warnings = 0;
|
|
1400
|
+
const nameValid = /^@[^/]+\/[^/]+$/.test(info.name);
|
|
1401
|
+
if (nameValid) {
|
|
1402
|
+
checks.push({ label: "Package name format", status: "pass", message: info.name });
|
|
1403
|
+
passed++;
|
|
1404
|
+
} else {
|
|
1405
|
+
checks.push({ label: "Package name format", status: "warn", message: `Unusual: ${info.name}` });
|
|
1406
|
+
warnings++;
|
|
1407
|
+
}
|
|
1408
|
+
const tags = info["dist-tags"] || {};
|
|
1409
|
+
if (tags.latest) {
|
|
1410
|
+
checks.push({ label: "dist-tags.latest", status: "pass", message: tags.latest });
|
|
1411
|
+
passed++;
|
|
1412
|
+
} else {
|
|
1413
|
+
checks.push({ label: "dist-tags.latest", status: "fail", message: "Missing" });
|
|
1414
|
+
failed++;
|
|
1415
|
+
}
|
|
1416
|
+
const latestVer = tags.latest;
|
|
1417
|
+
const latestPkg = latestVer ? info.versions?.[latestVer] : void 0;
|
|
1418
|
+
if (latestPkg) {
|
|
1419
|
+
checks.push({ label: "Latest version exists", status: "pass", message: `${latestVer} exists in versions` });
|
|
1420
|
+
passed++;
|
|
1421
|
+
} else {
|
|
1422
|
+
checks.push({ label: "Latest version exists", status: "fail", message: `${latestVer} not found in versions` });
|
|
1423
|
+
failed++;
|
|
1424
|
+
}
|
|
1425
|
+
const meta = latestPkg?.skillmarket;
|
|
1426
|
+
if (meta) {
|
|
1427
|
+
checks.push({ label: "skillmarket metadata", status: "pass", message: "Present" });
|
|
1428
|
+
passed++;
|
|
1429
|
+
const subChecks = [
|
|
1430
|
+
{ label: "skillmarket.id", ok: !!meta.id },
|
|
1431
|
+
{ label: "skillmarket.displayName", ok: !!meta.displayName },
|
|
1432
|
+
{ label: "skillmarket.platforms", ok: Array.isArray(meta.platforms) && meta.platforms.length > 0 }
|
|
1433
|
+
];
|
|
1434
|
+
for (const c of subChecks) {
|
|
1435
|
+
if (c.ok) {
|
|
1436
|
+
checks.push({ label: c.label, status: "pass", message: "Present" });
|
|
1437
|
+
passed++;
|
|
1438
|
+
} else {
|
|
1439
|
+
checks.push({ label: c.label, status: "warn", message: "Missing or empty" });
|
|
1440
|
+
warnings++;
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
if (meta.platforms) {
|
|
1444
|
+
const unknown = meta.platforms.filter((p) => !PLATFORMS.includes(p));
|
|
1445
|
+
if (unknown.length > 0) {
|
|
1446
|
+
checks.push({ label: "Platforms recognized", status: "warn", message: `Unknown: ${unknown.join(", ")}` });
|
|
1447
|
+
warnings++;
|
|
1448
|
+
} else {
|
|
1449
|
+
checks.push({ label: "Platforms recognized", status: "pass", message: "All recognized" });
|
|
1450
|
+
passed++;
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
} else {
|
|
1454
|
+
checks.push({ label: "skillmarket metadata", status: "warn", message: "Not a skillmarket-formatted skill" });
|
|
1455
|
+
warnings++;
|
|
1456
|
+
}
|
|
1457
|
+
if (latestPkg?.description) {
|
|
1458
|
+
checks.push({ label: "Description", status: "pass", message: `${latestPkg.description.length} chars` });
|
|
1459
|
+
passed++;
|
|
1460
|
+
} else {
|
|
1461
|
+
checks.push({ label: "Description", status: "warn", message: "Missing" });
|
|
1462
|
+
warnings++;
|
|
1463
|
+
}
|
|
1464
|
+
if (info.license || latestPkg?.license) {
|
|
1465
|
+
checks.push({ label: "License", status: "pass", message: info.license || latestPkg?.license || "" });
|
|
1466
|
+
passed++;
|
|
1467
|
+
} else {
|
|
1468
|
+
checks.push({ label: "License", status: "warn", message: "Missing" });
|
|
1469
|
+
warnings++;
|
|
1470
|
+
}
|
|
1471
|
+
if (latestPkg?.dist?.unpackedSize) {
|
|
1472
|
+
const sizeKB = (latestPkg.dist.unpackedSize / 1024).toFixed(1);
|
|
1473
|
+
checks.push({ label: "Package size", status: "pass", message: `${sizeKB} KB (unpacked)` });
|
|
1474
|
+
passed++;
|
|
1475
|
+
}
|
|
1476
|
+
const versionCount = Object.keys(info.versions || {}).length;
|
|
1477
|
+
checks.push({ label: "Total versions", status: "info", message: String(versionCount) });
|
|
1478
|
+
return {
|
|
1479
|
+
skillId,
|
|
1480
|
+
valid: failed === 0,
|
|
1481
|
+
passed,
|
|
1482
|
+
failed,
|
|
1483
|
+
warnings,
|
|
1484
|
+
checks
|
|
1485
|
+
};
|
|
1486
|
+
}
|
|
1487
|
+
async function adminList() {
|
|
1488
|
+
console.log("\n\u{1F50D} Fetching all published skills...\n");
|
|
1489
|
+
const valid = await fetchScopePackageDetails();
|
|
1490
|
+
if (valid.length === 0) {
|
|
1491
|
+
console.log("No published skills found.");
|
|
1492
|
+
return;
|
|
1493
|
+
}
|
|
1494
|
+
let hasSkillmarketCount = 0;
|
|
1334
1495
|
for (const d of valid) {
|
|
1496
|
+
if (d.hasSkillmarket) hasSkillmarketCount++;
|
|
1335
1497
|
const flag = d.hasSkillmarket ? "\u2705" : "\u{1F4E6}";
|
|
1336
1498
|
console.log(` ${flag} ${d.name}@${d.version}`);
|
|
1337
1499
|
if (d.description) console.log(` ${d.description.slice(0, 80)}`);
|
|
1338
1500
|
if (d.platforms) console.log(` Platforms: ${d.platforms}`);
|
|
1339
1501
|
console.log();
|
|
1340
1502
|
}
|
|
1503
|
+
console.log(`\u{1F4E6} ${valid.length} published skill(s) \uFF08${hasSkillmarketCount} with skillmarket metadata\uFF09
|
|
1504
|
+
`);
|
|
1341
1505
|
}
|
|
1342
1506
|
async function adminInfo(skillId) {
|
|
1343
1507
|
console.log(`
|
|
@@ -1345,9 +1509,10 @@ async function adminInfo(skillId) {
|
|
|
1345
1509
|
`);
|
|
1346
1510
|
const info = await fetchSkillPackage(skillId);
|
|
1347
1511
|
if (!info) {
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1512
|
+
throw new Error(
|
|
1513
|
+
`Skill "${skillId}" not found in any configured scope.
|
|
1514
|
+
Scopes checked: ${SKILL_SCOPES.join(", ")}`
|
|
1515
|
+
);
|
|
1351
1516
|
}
|
|
1352
1517
|
const latestVer = info["dist-tags"]?.latest || "unknown";
|
|
1353
1518
|
const latestPkg = info.versions?.[latestVer];
|
|
@@ -1447,169 +1612,44 @@ async function adminSearch(keyword, limit = 20) {
|
|
|
1447
1612
|
}
|
|
1448
1613
|
async function adminStats() {
|
|
1449
1614
|
console.log("\n\u{1F4CA} SkillMarket Publishing Statistics\n");
|
|
1450
|
-
const
|
|
1451
|
-
if (
|
|
1615
|
+
const stats = await getPublishingStats();
|
|
1616
|
+
if (stats.totalSkills === 0) {
|
|
1452
1617
|
console.log("No published skills found.");
|
|
1453
1618
|
return;
|
|
1454
1619
|
}
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
// 并发 3
|
|
1467
|
-
200
|
|
1468
|
-
// 批次间 200ms
|
|
1469
|
-
)).filter(Boolean);
|
|
1470
|
-
const totalSkills = infos.length;
|
|
1471
|
-
let totalVersions = 0;
|
|
1472
|
-
let totalSize = 0;
|
|
1473
|
-
const platformSet = /* @__PURE__ */ new Set();
|
|
1474
|
-
let withMetadata = 0;
|
|
1475
|
-
let mostVersions = { name: "", count: 0 };
|
|
1476
|
-
let mostRecent = { name: "", date: "" };
|
|
1477
|
-
for (const { name, info } of infos) {
|
|
1478
|
-
const versions = Object.keys(info.versions || {});
|
|
1479
|
-
totalVersions += versions.length;
|
|
1480
|
-
if (versions.length > mostVersions.count) {
|
|
1481
|
-
mostVersions = { name, count: versions.length };
|
|
1482
|
-
}
|
|
1483
|
-
const latestVer = info["dist-tags"]?.latest;
|
|
1484
|
-
const latestPkg = latestVer ? info.versions?.[latestVer] : void 0;
|
|
1485
|
-
const meta = latestPkg?.skillmarket;
|
|
1486
|
-
if (meta) {
|
|
1487
|
-
withMetadata++;
|
|
1488
|
-
if (meta.platforms) {
|
|
1489
|
-
for (const p of meta.platforms) platformSet.add(p);
|
|
1490
|
-
}
|
|
1491
|
-
}
|
|
1492
|
-
if (latestPkg?.dist?.unpackedSize) {
|
|
1493
|
-
totalSize += latestPkg.dist.unpackedSize;
|
|
1494
|
-
}
|
|
1495
|
-
const modTime = info.time?.modified || "";
|
|
1496
|
-
if (modTime && modTime > mostRecent.date) {
|
|
1497
|
-
mostRecent = { name, date: modTime };
|
|
1498
|
-
}
|
|
1499
|
-
}
|
|
1500
|
-
console.log(`\u{1F4E6} Total published skills: ${totalSkills}`);
|
|
1501
|
-
console.log(`\u{1F4DD} Total versions: ${totalVersions}`);
|
|
1502
|
-
console.log(` Avg versions/skill: ${(totalVersions / totalSkills).toFixed(1)}`);
|
|
1503
|
-
console.log(`\u{1F4CB} Skills with skillmarket metadata: ${withMetadata}/${totalSkills}`);
|
|
1504
|
-
console.log(`\u{1F4BE} Total unpacked size: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);
|
|
1505
|
-
console.log(`\u{1F527} Platforms covered: ${platformSet.size} (${[...platformSet].join(", ")})`);
|
|
1506
|
-
console.log(`\u{1F3C6} Most versions: ${mostVersions.name} (${mostVersions.count})`);
|
|
1507
|
-
if (mostRecent.date) {
|
|
1508
|
-
console.log(`\u{1F550} Most recent update: ${mostRecent.name} (${new Date(mostRecent.date).toLocaleDateString()})`);
|
|
1509
|
-
}
|
|
1510
|
-
console.log(`\u{1F517} Registry: ${NPM_REGISTRY}`);
|
|
1620
|
+
console.log(`\u{1F4E6} Total published skills: ${stats.totalSkills}`);
|
|
1621
|
+
console.log(`\u{1F4DD} Total versions: ${stats.totalVersions}`);
|
|
1622
|
+
console.log(` Avg versions/skill: ${stats.averageVersions}`);
|
|
1623
|
+
console.log(`\u{1F4CB} Skills with skillmarket metadata: ${stats.withMetadata}/${stats.totalSkills}`);
|
|
1624
|
+
console.log(`\u{1F4BE} Total unpacked size: ${stats.totalSizeMB} MB`);
|
|
1625
|
+
console.log(`\u{1F527} Platforms covered: ${stats.platformCount} (${stats.platforms.join(", ")})`);
|
|
1626
|
+
console.log(`\u{1F3C6} Most versions: ${stats.mostVersions.name} (${stats.mostVersions.count})`);
|
|
1627
|
+
if (stats.mostRecent.date) {
|
|
1628
|
+
console.log(`\u{1F550} Most recent update: ${stats.mostRecent.name} (${new Date(stats.mostRecent.date).toLocaleDateString()})`);
|
|
1629
|
+
}
|
|
1630
|
+
console.log(`\u{1F517} Registry: ${stats.registry}`);
|
|
1511
1631
|
console.log(`
|
|
1512
|
-
Configured scopes: ${
|
|
1632
|
+
Configured scopes: ${stats.scopes.join(", ")}`);
|
|
1513
1633
|
console.log();
|
|
1514
1634
|
}
|
|
1515
1635
|
async function adminVerify(skillId) {
|
|
1516
1636
|
console.log(`
|
|
1517
1637
|
\u{1F50D} Verifying published skill "${skillId}"...
|
|
1518
1638
|
`);
|
|
1519
|
-
const
|
|
1520
|
-
if (!
|
|
1521
|
-
|
|
1522
|
-
process.exit(1);
|
|
1639
|
+
const result = await verifySkillData(skillId);
|
|
1640
|
+
if (!result) {
|
|
1641
|
+
throw new Error(`Skill "${skillId}" not found.`);
|
|
1523
1642
|
}
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
const nameValid = /^@[^/]+\/[^/]+$/.test(info.name);
|
|
1528
|
-
if (nameValid) {
|
|
1529
|
-
console.log(`\u2705 Package name format: ${info.name}`);
|
|
1530
|
-
passed++;
|
|
1531
|
-
} else {
|
|
1532
|
-
console.log(`\u26A0\uFE0F Package name format unusual: ${info.name}`);
|
|
1533
|
-
warnings++;
|
|
1534
|
-
}
|
|
1535
|
-
const tags = info["dist-tags"] || {};
|
|
1536
|
-
if (tags.latest) {
|
|
1537
|
-
console.log(`\u2705 dist-tags.latest: ${tags.latest}`);
|
|
1538
|
-
passed++;
|
|
1539
|
-
} else {
|
|
1540
|
-
console.log(`\u274C dist-tags.latest missing`);
|
|
1541
|
-
failed++;
|
|
1643
|
+
for (const check of result.checks) {
|
|
1644
|
+
const icon = check.status === "pass" ? "\u2705" : check.status === "fail" ? "\u274C" : check.status === "warn" ? "\u26A0\uFE0F" : "\u2139\uFE0F";
|
|
1645
|
+
console.log(` ${icon} ${check.label}: ${check.message}`);
|
|
1542
1646
|
}
|
|
1543
|
-
const latestVer = tags.latest;
|
|
1544
|
-
const latestPkg = latestVer ? info.versions?.[latestVer] : void 0;
|
|
1545
|
-
if (latestPkg) {
|
|
1546
|
-
console.log(`\u2705 Latest version ${latestVer} exists in versions`);
|
|
1547
|
-
passed++;
|
|
1548
|
-
} else {
|
|
1549
|
-
console.log(`\u274C Latest version ${latestVer} not found in versions object`);
|
|
1550
|
-
failed++;
|
|
1551
|
-
}
|
|
1552
|
-
const meta = latestPkg?.skillmarket;
|
|
1553
|
-
if (meta) {
|
|
1554
|
-
console.log(`\u2705 Has skillmarket metadata`);
|
|
1555
|
-
const checks = [
|
|
1556
|
-
{ name: "id", ok: !!meta.id },
|
|
1557
|
-
{ name: "displayName", ok: !!meta.displayName },
|
|
1558
|
-
{ name: "platforms (array)", ok: Array.isArray(meta.platforms) && meta.platforms.length > 0 }
|
|
1559
|
-
];
|
|
1560
|
-
for (const c of checks) {
|
|
1561
|
-
if (c.ok) {
|
|
1562
|
-
console.log(` \u2705 skillmarket.${c.name}`);
|
|
1563
|
-
passed++;
|
|
1564
|
-
} else {
|
|
1565
|
-
console.log(` \u26A0\uFE0F skillmarket.${c.name} missing or empty`);
|
|
1566
|
-
warnings++;
|
|
1567
|
-
}
|
|
1568
|
-
}
|
|
1569
|
-
if (meta.platforms) {
|
|
1570
|
-
const unknown = meta.platforms.filter(
|
|
1571
|
-
(p) => !PLATFORMS.includes(p)
|
|
1572
|
-
);
|
|
1573
|
-
if (unknown.length > 0) {
|
|
1574
|
-
console.log(` \u26A0\uFE0F Unknown platforms: ${unknown.join(", ")}`);
|
|
1575
|
-
warnings++;
|
|
1576
|
-
} else {
|
|
1577
|
-
console.log(` \u2705 All platforms recognized`);
|
|
1578
|
-
passed++;
|
|
1579
|
-
}
|
|
1580
|
-
}
|
|
1581
|
-
} else {
|
|
1582
|
-
console.log(`\u26A0\uFE0F No skillmarket metadata (not a skillmarket-formatted skill)`);
|
|
1583
|
-
warnings++;
|
|
1584
|
-
}
|
|
1585
|
-
if (latestPkg?.description) {
|
|
1586
|
-
console.log(`\u2705 Has description (${latestPkg.description.length} chars)`);
|
|
1587
|
-
passed++;
|
|
1588
|
-
} else {
|
|
1589
|
-
console.log(`\u26A0\uFE0F No description`);
|
|
1590
|
-
warnings++;
|
|
1591
|
-
}
|
|
1592
|
-
if (info.license || latestPkg?.license) {
|
|
1593
|
-
console.log(`\u2705 License: ${info.license || latestPkg?.license}`);
|
|
1594
|
-
passed++;
|
|
1595
|
-
} else {
|
|
1596
|
-
console.log(`\u26A0\uFE0F No license specified`);
|
|
1597
|
-
warnings++;
|
|
1598
|
-
}
|
|
1599
|
-
if (latestPkg?.dist?.unpackedSize) {
|
|
1600
|
-
const sizeKB = (latestPkg.dist.unpackedSize / 1024).toFixed(1);
|
|
1601
|
-
console.log(`\u2705 Package size: ${sizeKB} KB (unpacked)`);
|
|
1602
|
-
passed++;
|
|
1603
|
-
}
|
|
1604
|
-
const versionCount = Object.keys(info.versions || {}).length;
|
|
1605
|
-
console.log(`\u2139\uFE0F Total versions: ${versionCount}`);
|
|
1606
|
-
const total = passed + failed;
|
|
1607
1647
|
console.log(`
|
|
1608
1648
|
\u{1F4CA} Verification Result:`);
|
|
1609
|
-
console.log(` \u2705 Passed: ${passed}`);
|
|
1610
|
-
console.log(` \u26A0\uFE0F Warnings: ${warnings}`);
|
|
1611
|
-
console.log(` \u274C Failed: ${failed}`);
|
|
1612
|
-
if (
|
|
1649
|
+
console.log(` \u2705 Passed: ${result.passed}`);
|
|
1650
|
+
console.log(` \u26A0\uFE0F Warnings: ${result.warnings}`);
|
|
1651
|
+
console.log(` \u274C Failed: ${result.failed}`);
|
|
1652
|
+
if (result.valid) {
|
|
1613
1653
|
console.log(`
|
|
1614
1654
|
\u2705 Skill "${skillId}" is valid!
|
|
1615
1655
|
`);
|
|
@@ -1917,9 +1957,10 @@ function getSourceBadge(source) {
|
|
|
1917
1957
|
async function getConfigValue(key) {
|
|
1918
1958
|
const entry = await getConfig(key);
|
|
1919
1959
|
if (!entry) {
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1960
|
+
throw new Error(
|
|
1961
|
+
`Unknown config key: "${key}"
|
|
1962
|
+
Valid keys: ${CONFIG_DEFINITIONS.map((d) => d.key).join(", ")}`
|
|
1963
|
+
);
|
|
1923
1964
|
}
|
|
1924
1965
|
console.log(`
|
|
1925
1966
|
\u{1F527} ${entry.key}`);
|
|
@@ -1933,9 +1974,10 @@ async function getConfigValue(key) {
|
|
|
1933
1974
|
async function setConfigValue(key, value) {
|
|
1934
1975
|
const def = CONFIG_DEFINITIONS.find((d) => d.key === key);
|
|
1935
1976
|
if (!def) {
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1977
|
+
throw new Error(
|
|
1978
|
+
`Unknown config key: "${key}"
|
|
1979
|
+
Valid keys: ${CONFIG_DEFINITIONS.map((d) => d.key).join(", ")}`
|
|
1980
|
+
);
|
|
1939
1981
|
}
|
|
1940
1982
|
await writeConfigFile({ [key]: value });
|
|
1941
1983
|
console.log(`
|
|
@@ -1959,9 +2001,10 @@ async function resetConfig(key, all = false) {
|
|
|
1959
2001
|
if (key) {
|
|
1960
2002
|
const def = CONFIG_DEFINITIONS.find((d) => d.key === key);
|
|
1961
2003
|
if (!def) {
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
2004
|
+
throw new Error(
|
|
2005
|
+
`Unknown config key: "${key}"
|
|
2006
|
+
Valid keys: ${CONFIG_DEFINITIONS.map((d) => d.key).join(", ")}`
|
|
2007
|
+
);
|
|
1965
2008
|
}
|
|
1966
2009
|
await removeConfigKeys([key]);
|
|
1967
2010
|
const sourceNow = process.env[def.envVar] ? "env" : "default";
|
|
@@ -2314,42 +2357,8 @@ API_ROUTES.POST["/api/uninstall"] = async (req, res, _url) => {
|
|
|
2314
2357
|
};
|
|
2315
2358
|
API_ROUTES.GET["/api/admin/stats"] = async (_req, res, _url) => {
|
|
2316
2359
|
try {
|
|
2317
|
-
const
|
|
2318
|
-
|
|
2319
|
-
packages.map(async (pkg) => {
|
|
2320
|
-
try {
|
|
2321
|
-
const info = await fetchNpmPackage(pkg);
|
|
2322
|
-
return info ? { name: pkg, info } : null;
|
|
2323
|
-
} catch {
|
|
2324
|
-
return null;
|
|
2325
|
-
}
|
|
2326
|
-
})
|
|
2327
|
-
)).filter((item) => item !== null);
|
|
2328
|
-
let totalVersions = 0;
|
|
2329
|
-
let totalSize = 0;
|
|
2330
|
-
const platformSet = /* @__PURE__ */ new Set();
|
|
2331
|
-
let withMetadata = 0;
|
|
2332
|
-
for (const { info } of infos) {
|
|
2333
|
-
const versions = Object.keys(info.versions || {});
|
|
2334
|
-
totalVersions += versions.length;
|
|
2335
|
-
const latestVer = info["dist-tags"]?.latest;
|
|
2336
|
-
const latestPkg = latestVer ? info.versions?.[latestVer] : void 0;
|
|
2337
|
-
const meta = latestPkg?.skillmarket;
|
|
2338
|
-
if (meta) {
|
|
2339
|
-
withMetadata++;
|
|
2340
|
-
if (meta.platforms) meta.platforms.forEach((p) => platformSet.add(p));
|
|
2341
|
-
}
|
|
2342
|
-
if (latestPkg?.dist?.unpackedSize) totalSize += latestPkg.dist.unpackedSize;
|
|
2343
|
-
}
|
|
2344
|
-
jsonResponse(res, 200, {
|
|
2345
|
-
totalSkills: infos.length,
|
|
2346
|
-
totalVersions,
|
|
2347
|
-
averageVersions: infos.length > 0 ? (totalVersions / infos.length).toFixed(1) : "0",
|
|
2348
|
-
withMetadata,
|
|
2349
|
-
totalSizeMB: (totalSize / 1024 / 1024).toFixed(2),
|
|
2350
|
-
platformCount: platformSet.size,
|
|
2351
|
-
platforms: [...platformSet]
|
|
2352
|
-
});
|
|
2360
|
+
const stats = await getPublishingStats();
|
|
2361
|
+
jsonResponse(res, 200, stats);
|
|
2353
2362
|
} catch (err) {
|
|
2354
2363
|
jsonResponse(res, 500, { error: String(err) });
|
|
2355
2364
|
}
|
package/dist/electron-entry.js
CHANGED
package/dist/index.js
CHANGED