itismyskillmarket 1.3.11 → 1.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +371 -0
- package/gui/index.html +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1869,6 +1869,336 @@ Press Ctrl+C to stop
|
|
|
1869
1869
|
});
|
|
1870
1870
|
}
|
|
1871
1871
|
|
|
1872
|
+
// src/commands/admin.ts
|
|
1873
|
+
async function fetchScopePackages() {
|
|
1874
|
+
const all = /* @__PURE__ */ new Set();
|
|
1875
|
+
for (const scope of SKILL_SCOPES) {
|
|
1876
|
+
try {
|
|
1877
|
+
const { packages } = await searchSkillmarketPackages({ from: 0, size: 100, keyword: scope });
|
|
1878
|
+
for (const p of packages) {
|
|
1879
|
+
if (p.startsWith(scope)) all.add(p);
|
|
1880
|
+
}
|
|
1881
|
+
} catch {
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
return [...all].sort();
|
|
1885
|
+
}
|
|
1886
|
+
async function adminList() {
|
|
1887
|
+
console.log("\n\u{1F50D} Fetching all published skills...\n");
|
|
1888
|
+
const packages = await fetchScopePackages();
|
|
1889
|
+
if (packages.length === 0) {
|
|
1890
|
+
console.log("No published skills found.");
|
|
1891
|
+
return;
|
|
1892
|
+
}
|
|
1893
|
+
const details = await Promise.all(
|
|
1894
|
+
packages.map(async (pkg) => {
|
|
1895
|
+
try {
|
|
1896
|
+
const info = await fetchNpmPackage(pkg);
|
|
1897
|
+
if (!info) return null;
|
|
1898
|
+
const ver = info["dist-tags"]?.latest || "?";
|
|
1899
|
+
const p = info.versions?.[ver];
|
|
1900
|
+
return {
|
|
1901
|
+
name: info.name,
|
|
1902
|
+
version: ver,
|
|
1903
|
+
description: p?.description || "",
|
|
1904
|
+
hasSkillmarket: !!p?.skillmarket,
|
|
1905
|
+
platforms: (p?.skillmarket?.platforms || []).join(", "),
|
|
1906
|
+
updated: info.time?.[ver] || ""
|
|
1907
|
+
};
|
|
1908
|
+
} catch {
|
|
1909
|
+
return null;
|
|
1910
|
+
}
|
|
1911
|
+
})
|
|
1912
|
+
);
|
|
1913
|
+
const valid = details.filter(Boolean);
|
|
1914
|
+
console.log(`\u{1F4E6} ${valid.length} published skill(s):
|
|
1915
|
+
`);
|
|
1916
|
+
valid.sort((a, b) => a.name.localeCompare(b.name));
|
|
1917
|
+
for (const d of valid) {
|
|
1918
|
+
const flag = d.hasSkillmarket ? "\u2705" : "\u{1F4E6}";
|
|
1919
|
+
console.log(` ${flag} ${d.name}@${d.version}`);
|
|
1920
|
+
if (d.description) console.log(` ${d.description.slice(0, 80)}`);
|
|
1921
|
+
if (d.platforms) console.log(` Platforms: ${d.platforms}`);
|
|
1922
|
+
console.log();
|
|
1923
|
+
}
|
|
1924
|
+
}
|
|
1925
|
+
async function adminInfo(skillId) {
|
|
1926
|
+
console.log(`
|
|
1927
|
+
\u{1F50D} Fetching detailed info for "${skillId}"...
|
|
1928
|
+
`);
|
|
1929
|
+
const info = await fetchSkillPackage(skillId);
|
|
1930
|
+
if (!info) {
|
|
1931
|
+
console.error(`\u274C Skill "${skillId}" not found in any configured scope.`);
|
|
1932
|
+
console.log(` Scopes checked: ${SKILL_SCOPES.join(", ")}`);
|
|
1933
|
+
process.exit(1);
|
|
1934
|
+
}
|
|
1935
|
+
const latestVer = info["dist-tags"]?.latest || "unknown";
|
|
1936
|
+
const latestPkg = info.versions?.[latestVer];
|
|
1937
|
+
const meta = latestPkg?.skillmarket;
|
|
1938
|
+
const allVersions = Object.keys(info.versions || {});
|
|
1939
|
+
console.log(`\u{1F4E6} ${info.name}`);
|
|
1940
|
+
console.log(` Description: ${info.description || "N/A"}`);
|
|
1941
|
+
console.log(` Latest: ${latestVer}`);
|
|
1942
|
+
console.log(` Total versions: ${allVersions.length}`);
|
|
1943
|
+
console.log(` Modified: ${info.time?.modified || "N/A"}`);
|
|
1944
|
+
console.log(` Author: ${info.author?.name || latestPkg?.author?.name || "N/A"}`);
|
|
1945
|
+
console.log(` License: ${info.license || latestPkg?.license || "N/A"}`);
|
|
1946
|
+
if (meta) {
|
|
1947
|
+
console.log(`
|
|
1948
|
+
\u{1F4CB} SkillMarket Metadata:`);
|
|
1949
|
+
if (meta.id) console.log(` ID: ${meta.id}`);
|
|
1950
|
+
if (meta.displayName) console.log(` Display Name: ${meta.displayName}`);
|
|
1951
|
+
if (meta.description) console.log(` Description: ${meta.description}`);
|
|
1952
|
+
if (meta.platforms && meta.platforms.length > 0) {
|
|
1953
|
+
console.log(` Platforms: ${meta.platforms.join(", ")}`);
|
|
1954
|
+
const unknown = meta.platforms.filter((p) => !PLATFORMS.includes(p));
|
|
1955
|
+
if (unknown.length > 0) {
|
|
1956
|
+
console.log(` \u26A0\uFE0F Unknown platforms: ${unknown.join(", ")}`);
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
} else {
|
|
1960
|
+
console.log(`
|
|
1961
|
+
\u26A0\uFE0F No SkillMarket metadata (not a skillmarket skill)`);
|
|
1962
|
+
}
|
|
1963
|
+
console.log(`
|
|
1964
|
+
\u{1F4C5} Version History:`);
|
|
1965
|
+
for (const ver of allVersions.slice().reverse()) {
|
|
1966
|
+
const v = info.versions?.[ver];
|
|
1967
|
+
const time = info.time?.[ver] ? new Date(info.time[ver]).toLocaleDateString() : "?";
|
|
1968
|
+
const size = v?.dist?.unpackedSize ? ` (${(v.dist.unpackedSize / 1024).toFixed(1)} KB)` : "";
|
|
1969
|
+
const tag = ver === latestVer ? " \u2190 latest" : "";
|
|
1970
|
+
console.log(` ${ver}${tag} \u2014 ${time}${size}`);
|
|
1971
|
+
}
|
|
1972
|
+
const tags = info["dist-tags"] || {};
|
|
1973
|
+
const otherTags = Object.entries(tags).filter(([k]) => k !== "latest");
|
|
1974
|
+
if (otherTags.length > 0) {
|
|
1975
|
+
console.log(`
|
|
1976
|
+
\u{1F3F7}\uFE0F dist-tags:`);
|
|
1977
|
+
for (const [tag, ver] of otherTags) {
|
|
1978
|
+
console.log(` ${tag}: ${ver}`);
|
|
1979
|
+
}
|
|
1980
|
+
}
|
|
1981
|
+
console.log(`
|
|
1982
|
+
\u{1F517} Registry:`);
|
|
1983
|
+
console.log(` ${NPM_REGISTRY}/${info.name}`);
|
|
1984
|
+
console.log();
|
|
1985
|
+
}
|
|
1986
|
+
async function adminSearch(keyword, limit = 20) {
|
|
1987
|
+
console.log(`
|
|
1988
|
+
\u{1F50D} Searching published skills for "${keyword}"...
|
|
1989
|
+
`);
|
|
1990
|
+
const scopePackages = await fetchScopePackages();
|
|
1991
|
+
const matched = scopePackages.filter(
|
|
1992
|
+
(p) => p.toLowerCase().includes(keyword.toLowerCase())
|
|
1993
|
+
);
|
|
1994
|
+
if (matched.length === 0) {
|
|
1995
|
+
const { packages } = await searchSkillmarketPackages({ keyword });
|
|
1996
|
+
const filtered = packages.filter((p) => p.toLowerCase().includes(keyword.toLowerCase())).slice(0, limit);
|
|
1997
|
+
if (filtered.length === 0) {
|
|
1998
|
+
console.log(`No skills found matching "${keyword}".`);
|
|
1999
|
+
return;
|
|
2000
|
+
}
|
|
2001
|
+
console.log(`Found ${filtered.length} skill(s) (from npm keyword search):
|
|
2002
|
+
`);
|
|
2003
|
+
for (const pkg of filtered) {
|
|
2004
|
+
const info = await fetchNpmPackage(pkg);
|
|
2005
|
+
const ver = info?.["dist-tags"]?.latest || "?";
|
|
2006
|
+
const p = info?.versions?.[ver];
|
|
2007
|
+
console.log(` ${pkg}@${ver}`);
|
|
2008
|
+
if (p?.description) console.log(` ${p.description.slice(0, 80)}`);
|
|
2009
|
+
console.log();
|
|
2010
|
+
}
|
|
2011
|
+
return;
|
|
2012
|
+
}
|
|
2013
|
+
console.log(`Found ${matched.length} skill(s) in configured scopes:
|
|
2014
|
+
`);
|
|
2015
|
+
const show = matched.slice(0, limit);
|
|
2016
|
+
for (const pkg of show) {
|
|
2017
|
+
const info = await fetchNpmPackage(pkg);
|
|
2018
|
+
const ver = info?.["dist-tags"]?.latest || "?";
|
|
2019
|
+
const p = info?.versions?.[ver];
|
|
2020
|
+
console.log(` ${pkg}@${ver}`);
|
|
2021
|
+
if (p?.skillmarket) {
|
|
2022
|
+
console.log(` \u{1F4CB} ${p.skillmarket.displayName || ""} \u2014 Platforms: ${(p.skillmarket.platforms || []).join(", ") || "none"}`);
|
|
2023
|
+
}
|
|
2024
|
+
if (p?.description) console.log(` ${p.description.slice(0, 80)}`);
|
|
2025
|
+
console.log();
|
|
2026
|
+
}
|
|
2027
|
+
if (matched.length > limit) {
|
|
2028
|
+
console.log(` ... and ${matched.length - limit} more (use --limit to show more)`);
|
|
2029
|
+
}
|
|
2030
|
+
}
|
|
2031
|
+
async function adminStats() {
|
|
2032
|
+
console.log("\n\u{1F4CA} SkillMarket Publishing Statistics\n");
|
|
2033
|
+
const packages = await fetchScopePackages();
|
|
2034
|
+
if (packages.length === 0) {
|
|
2035
|
+
console.log("No published skills found.");
|
|
2036
|
+
return;
|
|
2037
|
+
}
|
|
2038
|
+
const infos = (await Promise.all(
|
|
2039
|
+
packages.map(async (pkg) => {
|
|
2040
|
+
try {
|
|
2041
|
+
const info = await fetchNpmPackage(pkg);
|
|
2042
|
+
return info ? { name: pkg, info } : null;
|
|
2043
|
+
} catch {
|
|
2044
|
+
return null;
|
|
2045
|
+
}
|
|
2046
|
+
})
|
|
2047
|
+
)).filter(Boolean);
|
|
2048
|
+
const totalSkills = infos.length;
|
|
2049
|
+
let totalVersions = 0;
|
|
2050
|
+
let totalSize = 0;
|
|
2051
|
+
const platformSet = /* @__PURE__ */ new Set();
|
|
2052
|
+
let withMetadata = 0;
|
|
2053
|
+
let mostVersions = { name: "", count: 0 };
|
|
2054
|
+
let mostRecent = { name: "", date: "" };
|
|
2055
|
+
for (const { name, info } of infos) {
|
|
2056
|
+
const versions = Object.keys(info.versions || {});
|
|
2057
|
+
totalVersions += versions.length;
|
|
2058
|
+
if (versions.length > mostVersions.count) {
|
|
2059
|
+
mostVersions = { name, count: versions.length };
|
|
2060
|
+
}
|
|
2061
|
+
const latestVer = info["dist-tags"]?.latest;
|
|
2062
|
+
const latestPkg = latestVer ? info.versions?.[latestVer] : void 0;
|
|
2063
|
+
const meta = latestPkg?.skillmarket;
|
|
2064
|
+
if (meta) {
|
|
2065
|
+
withMetadata++;
|
|
2066
|
+
if (meta.platforms) {
|
|
2067
|
+
for (const p of meta.platforms) platformSet.add(p);
|
|
2068
|
+
}
|
|
2069
|
+
}
|
|
2070
|
+
if (latestPkg?.dist?.unpackedSize) {
|
|
2071
|
+
totalSize += latestPkg.dist.unpackedSize;
|
|
2072
|
+
}
|
|
2073
|
+
const modTime = info.time?.modified || "";
|
|
2074
|
+
if (modTime && modTime > mostRecent.date) {
|
|
2075
|
+
mostRecent = { name, date: modTime };
|
|
2076
|
+
}
|
|
2077
|
+
}
|
|
2078
|
+
console.log(`\u{1F4E6} Total published skills: ${totalSkills}`);
|
|
2079
|
+
console.log(`\u{1F4DD} Total versions: ${totalVersions}`);
|
|
2080
|
+
console.log(` Avg versions/skill: ${(totalVersions / totalSkills).toFixed(1)}`);
|
|
2081
|
+
console.log(`\u{1F4CB} Skills with skillmarket metadata: ${withMetadata}/${totalSkills}`);
|
|
2082
|
+
console.log(`\u{1F4BE} Total unpacked size: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);
|
|
2083
|
+
console.log(`\u{1F527} Platforms covered: ${platformSet.size} (${[...platformSet].join(", ")})`);
|
|
2084
|
+
console.log(`\u{1F3C6} Most versions: ${mostVersions.name} (${mostVersions.count})`);
|
|
2085
|
+
if (mostRecent.date) {
|
|
2086
|
+
console.log(`\u{1F550} Most recent update: ${mostRecent.name} (${new Date(mostRecent.date).toLocaleDateString()})`);
|
|
2087
|
+
}
|
|
2088
|
+
console.log(`\u{1F517} Registry: ${NPM_REGISTRY}`);
|
|
2089
|
+
console.log(`
|
|
2090
|
+
Configured scopes: ${SKILL_SCOPES.join(", ")}`);
|
|
2091
|
+
console.log();
|
|
2092
|
+
}
|
|
2093
|
+
async function adminVerify(skillId) {
|
|
2094
|
+
console.log(`
|
|
2095
|
+
\u{1F50D} Verifying published skill "${skillId}"...
|
|
2096
|
+
`);
|
|
2097
|
+
const info = await fetchSkillPackage(skillId);
|
|
2098
|
+
if (!info) {
|
|
2099
|
+
console.error(`\u274C Skill "${skillId}" not found.`);
|
|
2100
|
+
process.exit(1);
|
|
2101
|
+
}
|
|
2102
|
+
let passed = 0;
|
|
2103
|
+
let failed = 0;
|
|
2104
|
+
let warnings = 0;
|
|
2105
|
+
const nameValid = /^@[^/]+\/[^/]+$/.test(info.name);
|
|
2106
|
+
if (nameValid) {
|
|
2107
|
+
console.log(`\u2705 Package name format: ${info.name}`);
|
|
2108
|
+
passed++;
|
|
2109
|
+
} else {
|
|
2110
|
+
console.log(`\u26A0\uFE0F Package name format unusual: ${info.name}`);
|
|
2111
|
+
warnings++;
|
|
2112
|
+
}
|
|
2113
|
+
const tags = info["dist-tags"] || {};
|
|
2114
|
+
if (tags.latest) {
|
|
2115
|
+
console.log(`\u2705 dist-tags.latest: ${tags.latest}`);
|
|
2116
|
+
passed++;
|
|
2117
|
+
} else {
|
|
2118
|
+
console.log(`\u274C dist-tags.latest missing`);
|
|
2119
|
+
failed++;
|
|
2120
|
+
}
|
|
2121
|
+
const latestVer = tags.latest;
|
|
2122
|
+
const latestPkg = latestVer ? info.versions?.[latestVer] : void 0;
|
|
2123
|
+
if (latestPkg) {
|
|
2124
|
+
console.log(`\u2705 Latest version ${latestVer} exists in versions`);
|
|
2125
|
+
passed++;
|
|
2126
|
+
} else {
|
|
2127
|
+
console.log(`\u274C Latest version ${latestVer} not found in versions object`);
|
|
2128
|
+
failed++;
|
|
2129
|
+
}
|
|
2130
|
+
const meta = latestPkg?.skillmarket;
|
|
2131
|
+
if (meta) {
|
|
2132
|
+
console.log(`\u2705 Has skillmarket metadata`);
|
|
2133
|
+
const checks = [
|
|
2134
|
+
{ name: "id", ok: !!meta.id },
|
|
2135
|
+
{ name: "displayName", ok: !!meta.displayName },
|
|
2136
|
+
{ name: "platforms (array)", ok: Array.isArray(meta.platforms) && meta.platforms.length > 0 }
|
|
2137
|
+
];
|
|
2138
|
+
for (const c of checks) {
|
|
2139
|
+
if (c.ok) {
|
|
2140
|
+
console.log(` \u2705 skillmarket.${c.name}`);
|
|
2141
|
+
passed++;
|
|
2142
|
+
} else {
|
|
2143
|
+
console.log(` \u26A0\uFE0F skillmarket.${c.name} missing or empty`);
|
|
2144
|
+
warnings++;
|
|
2145
|
+
}
|
|
2146
|
+
}
|
|
2147
|
+
if (meta.platforms) {
|
|
2148
|
+
const unknown = meta.platforms.filter(
|
|
2149
|
+
(p) => !PLATFORMS.includes(p)
|
|
2150
|
+
);
|
|
2151
|
+
if (unknown.length > 0) {
|
|
2152
|
+
console.log(` \u26A0\uFE0F Unknown platforms: ${unknown.join(", ")}`);
|
|
2153
|
+
warnings++;
|
|
2154
|
+
} else {
|
|
2155
|
+
console.log(` \u2705 All platforms recognized`);
|
|
2156
|
+
passed++;
|
|
2157
|
+
}
|
|
2158
|
+
}
|
|
2159
|
+
} else {
|
|
2160
|
+
console.log(`\u26A0\uFE0F No skillmarket metadata (not a skillmarket-formatted skill)`);
|
|
2161
|
+
warnings++;
|
|
2162
|
+
}
|
|
2163
|
+
if (latestPkg?.description) {
|
|
2164
|
+
console.log(`\u2705 Has description (${latestPkg.description.length} chars)`);
|
|
2165
|
+
passed++;
|
|
2166
|
+
} else {
|
|
2167
|
+
console.log(`\u26A0\uFE0F No description`);
|
|
2168
|
+
warnings++;
|
|
2169
|
+
}
|
|
2170
|
+
if (info.license || latestPkg?.license) {
|
|
2171
|
+
console.log(`\u2705 License: ${info.license || latestPkg?.license}`);
|
|
2172
|
+
passed++;
|
|
2173
|
+
} else {
|
|
2174
|
+
console.log(`\u26A0\uFE0F No license specified`);
|
|
2175
|
+
warnings++;
|
|
2176
|
+
}
|
|
2177
|
+
if (latestPkg?.dist?.unpackedSize) {
|
|
2178
|
+
const sizeKB = (latestPkg.dist.unpackedSize / 1024).toFixed(1);
|
|
2179
|
+
console.log(`\u2705 Package size: ${sizeKB} KB (unpacked)`);
|
|
2180
|
+
passed++;
|
|
2181
|
+
}
|
|
2182
|
+
const versionCount = Object.keys(info.versions || {}).length;
|
|
2183
|
+
console.log(`\u2139\uFE0F Total versions: ${versionCount}`);
|
|
2184
|
+
const total = passed + failed;
|
|
2185
|
+
console.log(`
|
|
2186
|
+
\u{1F4CA} Verification Result:`);
|
|
2187
|
+
console.log(` \u2705 Passed: ${passed}`);
|
|
2188
|
+
console.log(` \u26A0\uFE0F Warnings: ${warnings}`);
|
|
2189
|
+
console.log(` \u274C Failed: ${failed}`);
|
|
2190
|
+
if (failed === 0) {
|
|
2191
|
+
console.log(`
|
|
2192
|
+
\u2705 Skill "${skillId}" is valid!
|
|
2193
|
+
`);
|
|
2194
|
+
} else {
|
|
2195
|
+
console.log(`
|
|
2196
|
+
\u26A0\uFE0F Skill "${skillId}" has issues that need attention.
|
|
2197
|
+
`);
|
|
2198
|
+
process.exitCode = 1;
|
|
2199
|
+
}
|
|
2200
|
+
}
|
|
2201
|
+
|
|
1872
2202
|
// src/cli.ts
|
|
1873
2203
|
var __filename3 = fileURLToPath4(import.meta.url);
|
|
1874
2204
|
var __dirname3 = dirname2(__filename3);
|
|
@@ -2061,4 +2391,45 @@ program.command("verify <skill>").description("Verify skill integrity and format
|
|
|
2061
2391
|
process.exit(1);
|
|
2062
2392
|
}
|
|
2063
2393
|
});
|
|
2394
|
+
var admin = program.command("admin").description("Admin: manage published skills (cloud)");
|
|
2395
|
+
admin.command("ls").description("List all published skills").action(async () => {
|
|
2396
|
+
try {
|
|
2397
|
+
await adminList();
|
|
2398
|
+
} catch (err) {
|
|
2399
|
+
console.error("Admin ls failed:", err);
|
|
2400
|
+
process.exit(1);
|
|
2401
|
+
}
|
|
2402
|
+
});
|
|
2403
|
+
admin.command("info <skill>").description("Show detailed info for a published skill").action(async (skill) => {
|
|
2404
|
+
try {
|
|
2405
|
+
await adminInfo(skill);
|
|
2406
|
+
} catch (err) {
|
|
2407
|
+
console.error("Admin info failed:", err);
|
|
2408
|
+
process.exit(1);
|
|
2409
|
+
}
|
|
2410
|
+
});
|
|
2411
|
+
admin.command("search <keyword>").description("Search across published skills").option("-l, --limit <number>", "Max results (default: 20)", parseInt).action(async (keyword, opts) => {
|
|
2412
|
+
try {
|
|
2413
|
+
await adminSearch(keyword, opts.limit ?? 20);
|
|
2414
|
+
} catch (err) {
|
|
2415
|
+
console.error("Admin search failed:", err);
|
|
2416
|
+
process.exit(1);
|
|
2417
|
+
}
|
|
2418
|
+
});
|
|
2419
|
+
admin.command("stats").description("Show publishing statistics").action(async () => {
|
|
2420
|
+
try {
|
|
2421
|
+
await adminStats();
|
|
2422
|
+
} catch (err) {
|
|
2423
|
+
console.error("Admin stats failed:", err);
|
|
2424
|
+
process.exit(1);
|
|
2425
|
+
}
|
|
2426
|
+
});
|
|
2427
|
+
admin.command("verify <skill>").description("Verify a published skill structure and metadata").action(async (skill) => {
|
|
2428
|
+
try {
|
|
2429
|
+
await adminVerify(skill);
|
|
2430
|
+
} catch (err) {
|
|
2431
|
+
console.error("Admin verify failed:", err);
|
|
2432
|
+
process.exit(1);
|
|
2433
|
+
}
|
|
2434
|
+
});
|
|
2064
2435
|
program.parse();
|
package/gui/index.html
CHANGED