@anytio/pspm 0.9.0 → 0.9.2
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/CHANGELOG.md +20 -0
- package/CLI_GUIDE.md +2 -2
- package/README.md +2 -2
- package/dist/index.js +555 -244
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -5,8 +5,8 @@ import { join, dirname, basename, resolve, relative } from 'path';
|
|
|
5
5
|
import * as ini from 'ini';
|
|
6
6
|
import ignore from 'ignore';
|
|
7
7
|
import { createHash, randomBytes } from 'crypto';
|
|
8
|
-
import * as
|
|
9
|
-
import
|
|
8
|
+
import * as semver2 from 'semver';
|
|
9
|
+
import semver2__default from 'semver';
|
|
10
10
|
import { checkbox } from '@inquirer/prompts';
|
|
11
11
|
import { readFileSync } from 'fs';
|
|
12
12
|
import { fileURLToPath, URL as URL$1 } from 'url';
|
|
@@ -258,6 +258,58 @@ async function undeprecateSkillVersion(username, skillName, version3) {
|
|
|
258
258
|
};
|
|
259
259
|
}
|
|
260
260
|
}
|
|
261
|
+
async function listGithubSkillVersions(owner, repo, name) {
|
|
262
|
+
const config2 = getConfig();
|
|
263
|
+
try {
|
|
264
|
+
const response = await fetch(
|
|
265
|
+
`${config2.baseUrl}/api/skills/@github/${owner}/${repo}/${name}/versions`,
|
|
266
|
+
{
|
|
267
|
+
method: "GET",
|
|
268
|
+
headers: {
|
|
269
|
+
"Content-Type": "application/json",
|
|
270
|
+
...config2.apiKey ? { Authorization: `Bearer ${config2.apiKey}` } : {}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
);
|
|
274
|
+
if (!response.ok) {
|
|
275
|
+
const error = await response.text();
|
|
276
|
+
return { status: response.status, error };
|
|
277
|
+
}
|
|
278
|
+
const data = await response.json();
|
|
279
|
+
return { status: response.status, data };
|
|
280
|
+
} catch (error) {
|
|
281
|
+
return {
|
|
282
|
+
status: 500,
|
|
283
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async function getGithubSkillVersion(owner, repo, name, version3) {
|
|
288
|
+
const config2 = getConfig();
|
|
289
|
+
try {
|
|
290
|
+
const response = await fetch(
|
|
291
|
+
`${config2.baseUrl}/api/skills/@github/${owner}/${repo}/${name}/versions/${version3}`,
|
|
292
|
+
{
|
|
293
|
+
method: "GET",
|
|
294
|
+
headers: {
|
|
295
|
+
"Content-Type": "application/json",
|
|
296
|
+
...config2.apiKey ? { Authorization: `Bearer ${config2.apiKey}` } : {}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
);
|
|
300
|
+
if (!response.ok) {
|
|
301
|
+
const error = await response.text();
|
|
302
|
+
return { status: response.status, error };
|
|
303
|
+
}
|
|
304
|
+
const data = await response.json();
|
|
305
|
+
return { status: response.status, data };
|
|
306
|
+
} catch (error) {
|
|
307
|
+
return {
|
|
308
|
+
status: 500,
|
|
309
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
}
|
|
261
313
|
async function changeSkillAccess(username, skillName, input) {
|
|
262
314
|
const config2 = getConfig();
|
|
263
315
|
if (!config2) {
|
|
@@ -786,22 +838,98 @@ var init_manifest = __esm({
|
|
|
786
838
|
PSPM_SCHEMA_URL = "https://pspm.dev/schema/v1/pspm.json";
|
|
787
839
|
}
|
|
788
840
|
});
|
|
789
|
-
|
|
790
|
-
|
|
841
|
+
var init_integrity2 = __esm({
|
|
842
|
+
"../../packages/shared/pspm-types/src/integrity.ts"() {
|
|
843
|
+
}
|
|
844
|
+
});
|
|
845
|
+
|
|
846
|
+
// ../../packages/shared/pspm-types/src/local.ts
|
|
847
|
+
var init_local = __esm({
|
|
848
|
+
"../../packages/shared/pspm-types/src/local.ts"() {
|
|
849
|
+
}
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
// ../../packages/shared/pspm-types/src/lockfile.ts
|
|
853
|
+
var init_lockfile2 = __esm({
|
|
854
|
+
"../../packages/shared/pspm-types/src/lockfile.ts"() {
|
|
855
|
+
}
|
|
856
|
+
});
|
|
857
|
+
|
|
858
|
+
// ../../packages/shared/pspm-types/src/manifest.ts
|
|
859
|
+
var init_manifest2 = __esm({
|
|
860
|
+
"../../packages/shared/pspm-types/src/manifest.ts"() {
|
|
861
|
+
}
|
|
862
|
+
});
|
|
863
|
+
|
|
864
|
+
// ../../packages/shared/pspm-types/src/specifier.ts
|
|
865
|
+
function parseRegistrySpecifier(specifier) {
|
|
866
|
+
const match = specifier.match(REGISTRY_SPECIFIER_PATTERN);
|
|
867
|
+
if (!match) {
|
|
868
|
+
return null;
|
|
869
|
+
}
|
|
870
|
+
const namespace = match[1];
|
|
871
|
+
const owner = match[2];
|
|
872
|
+
const name = match[3];
|
|
873
|
+
const subname = match[4];
|
|
874
|
+
const versionRange = match[5];
|
|
875
|
+
if (!owner || !name) {
|
|
876
|
+
return null;
|
|
877
|
+
}
|
|
878
|
+
if (namespace === "github" && !subname) {
|
|
879
|
+
return null;
|
|
880
|
+
}
|
|
881
|
+
if (namespace !== "github" && subname) {
|
|
882
|
+
return null;
|
|
883
|
+
}
|
|
884
|
+
return {
|
|
885
|
+
namespace,
|
|
886
|
+
owner,
|
|
887
|
+
name,
|
|
888
|
+
subname: subname || void 0,
|
|
889
|
+
versionRange: versionRange || void 0
|
|
890
|
+
};
|
|
891
|
+
}
|
|
892
|
+
var REGISTRY_SPECIFIER_PATTERN;
|
|
893
|
+
var init_specifier = __esm({
|
|
894
|
+
"../../packages/shared/pspm-types/src/specifier.ts"() {
|
|
895
|
+
REGISTRY_SPECIFIER_PATTERN = /^@(user|org|github)\/([a-zA-Z0-9_-]+)\/([a-zA-Z0-9._-]+)(?:\/([a-z][a-z0-9-]*))?(?:@(.+))?$/;
|
|
896
|
+
}
|
|
897
|
+
});
|
|
898
|
+
var init_version = __esm({
|
|
899
|
+
"../../packages/shared/pspm-types/src/version.ts"() {
|
|
900
|
+
}
|
|
901
|
+
});
|
|
902
|
+
|
|
903
|
+
// ../../packages/shared/pspm-types/src/index.ts
|
|
904
|
+
var init_src = __esm({
|
|
905
|
+
"../../packages/shared/pspm-types/src/index.ts"() {
|
|
906
|
+
init_integrity2();
|
|
907
|
+
init_local();
|
|
908
|
+
init_lockfile2();
|
|
909
|
+
init_manifest2();
|
|
910
|
+
init_specifier();
|
|
911
|
+
init_version();
|
|
912
|
+
}
|
|
913
|
+
});
|
|
914
|
+
function resolveVersion2(range, availableVersions) {
|
|
915
|
+
const sorted = availableVersions.filter((v) => semver2.valid(v)).sort((a, b) => semver2.rcompare(a, b));
|
|
791
916
|
if (!range || range === "latest" || range === "*") {
|
|
792
917
|
return sorted[0] ?? null;
|
|
793
918
|
}
|
|
794
|
-
return
|
|
919
|
+
return semver2.maxSatisfying(sorted, range);
|
|
920
|
+
}
|
|
921
|
+
function isNewerVersion2(a, b) {
|
|
922
|
+
return semver2.gt(a, b);
|
|
795
923
|
}
|
|
796
924
|
function findHighestSatisfying(ranges, availableVersions) {
|
|
797
|
-
const sorted = availableVersions.filter((v) =>
|
|
925
|
+
const sorted = availableVersions.filter((v) => semver2.valid(v)).sort((a, b) => semver2.rcompare(a, b));
|
|
798
926
|
if (sorted.length === 0) return null;
|
|
799
927
|
const normalizedRanges = ranges.map(
|
|
800
928
|
(r) => !r || r === "latest" || r === "*" ? "*" : r
|
|
801
929
|
);
|
|
802
930
|
for (const version3 of sorted) {
|
|
803
931
|
const satisfiesAll = normalizedRanges.every(
|
|
804
|
-
(range) =>
|
|
932
|
+
(range) => semver2.satisfies(version3, range)
|
|
805
933
|
);
|
|
806
934
|
if (satisfiesAll) {
|
|
807
935
|
return version3;
|
|
@@ -809,7 +937,7 @@ function findHighestSatisfying(ranges, availableVersions) {
|
|
|
809
937
|
}
|
|
810
938
|
return null;
|
|
811
939
|
}
|
|
812
|
-
var
|
|
940
|
+
var init_version2 = __esm({
|
|
813
941
|
"src/lib/version.ts"() {
|
|
814
942
|
}
|
|
815
943
|
});
|
|
@@ -872,8 +1000,8 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
872
1000
|
continue;
|
|
873
1001
|
}
|
|
874
1002
|
processing.add(name);
|
|
875
|
-
const
|
|
876
|
-
if (!
|
|
1003
|
+
const parsed = parseRegistrySpecifier(name);
|
|
1004
|
+
if (!parsed) {
|
|
877
1005
|
graph.errors.push({
|
|
878
1006
|
type: "package_not_found",
|
|
879
1007
|
package: name,
|
|
@@ -881,10 +1009,23 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
881
1009
|
});
|
|
882
1010
|
continue;
|
|
883
1011
|
}
|
|
884
|
-
const [, username, skillName] = match;
|
|
885
1012
|
try {
|
|
886
|
-
|
|
887
|
-
|
|
1013
|
+
let versionsData;
|
|
1014
|
+
let versionsStatus;
|
|
1015
|
+
if (parsed.namespace === "github" && parsed.subname) {
|
|
1016
|
+
const resp = await listGithubSkillVersions(
|
|
1017
|
+
parsed.owner,
|
|
1018
|
+
parsed.name,
|
|
1019
|
+
parsed.subname
|
|
1020
|
+
);
|
|
1021
|
+
versionsStatus = resp.status;
|
|
1022
|
+
versionsData = resp.data;
|
|
1023
|
+
} else {
|
|
1024
|
+
const resp = await listSkillVersions(parsed.owner, parsed.name);
|
|
1025
|
+
versionsStatus = resp.status;
|
|
1026
|
+
versionsData = resp.status === 200 ? resp.data : void 0;
|
|
1027
|
+
}
|
|
1028
|
+
if (versionsStatus !== 200 || !versionsData) {
|
|
888
1029
|
graph.errors.push({
|
|
889
1030
|
type: "package_not_found",
|
|
890
1031
|
package: name,
|
|
@@ -892,8 +1033,7 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
892
1033
|
});
|
|
893
1034
|
continue;
|
|
894
1035
|
}
|
|
895
|
-
|
|
896
|
-
if (versions.length === 0) {
|
|
1036
|
+
if (versionsData.length === 0) {
|
|
897
1037
|
graph.errors.push({
|
|
898
1038
|
type: "package_not_found",
|
|
899
1039
|
package: name,
|
|
@@ -901,7 +1041,7 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
901
1041
|
});
|
|
902
1042
|
continue;
|
|
903
1043
|
}
|
|
904
|
-
const availableVersions =
|
|
1044
|
+
const availableVersions = versionsData.map((v) => v.version);
|
|
905
1045
|
const resolvedVersion = findHighestSatisfying(
|
|
906
1046
|
[versionRange],
|
|
907
1047
|
availableVersions
|
|
@@ -914,12 +1054,28 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
914
1054
|
});
|
|
915
1055
|
continue;
|
|
916
1056
|
}
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
1057
|
+
let versionData = null;
|
|
1058
|
+
if (parsed.namespace === "github" && parsed.subname) {
|
|
1059
|
+
const resp = await getGithubSkillVersion(
|
|
1060
|
+
parsed.owner,
|
|
1061
|
+
parsed.name,
|
|
1062
|
+
parsed.subname,
|
|
1063
|
+
resolvedVersion
|
|
1064
|
+
);
|
|
1065
|
+
if (resp.status === 200 && resp.data) {
|
|
1066
|
+
versionData = resp.data;
|
|
1067
|
+
}
|
|
1068
|
+
} else {
|
|
1069
|
+
const resp = await getSkillVersion(
|
|
1070
|
+
parsed.owner,
|
|
1071
|
+
parsed.name,
|
|
1072
|
+
resolvedVersion
|
|
1073
|
+
);
|
|
1074
|
+
if (resp.status === 200 && resp.data) {
|
|
1075
|
+
versionData = resp.data;
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
if (!versionData) {
|
|
923
1079
|
graph.errors.push({
|
|
924
1080
|
type: "fetch_error",
|
|
925
1081
|
package: name,
|
|
@@ -927,20 +1083,19 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
927
1083
|
});
|
|
928
1084
|
continue;
|
|
929
1085
|
}
|
|
930
|
-
const
|
|
931
|
-
const manifest = versionInfo.manifest;
|
|
1086
|
+
const manifest = versionData.manifest;
|
|
932
1087
|
const dependencies = manifest?.dependencies ?? {};
|
|
933
1088
|
const node = {
|
|
934
1089
|
name,
|
|
935
1090
|
version: resolvedVersion,
|
|
936
1091
|
versionRange,
|
|
937
|
-
downloadUrl:
|
|
938
|
-
integrity: `sha256-${Buffer.from(
|
|
1092
|
+
downloadUrl: versionData.downloadUrl,
|
|
1093
|
+
integrity: `sha256-${Buffer.from(versionData.checksum, "hex").toString("base64")}`,
|
|
939
1094
|
depth,
|
|
940
1095
|
dependencies,
|
|
941
1096
|
dependents: [dependent],
|
|
942
1097
|
isDirect: depth === 0,
|
|
943
|
-
deprecated:
|
|
1098
|
+
deprecated: versionData.deprecationMessage ?? void 0
|
|
944
1099
|
};
|
|
945
1100
|
graph.nodes.set(name, node);
|
|
946
1101
|
for (const [depName, depRange] of Object.entries(dependencies)) {
|
|
@@ -967,14 +1122,23 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
967
1122
|
const uniqueDependents = [...new Set(ranges.map((r) => r.dependent))];
|
|
968
1123
|
node.dependents = uniqueDependents;
|
|
969
1124
|
const allRanges = ranges.map((r) => r.range);
|
|
970
|
-
const
|
|
971
|
-
if (!
|
|
972
|
-
const [, username, skillName] = match;
|
|
1125
|
+
const p2Parsed = parseRegistrySpecifier(name);
|
|
1126
|
+
if (!p2Parsed) continue;
|
|
973
1127
|
try {
|
|
974
|
-
|
|
975
|
-
if (
|
|
976
|
-
|
|
977
|
-
|
|
1128
|
+
let p2Versions;
|
|
1129
|
+
if (p2Parsed.namespace === "github" && p2Parsed.subname) {
|
|
1130
|
+
const resp = await listGithubSkillVersions(
|
|
1131
|
+
p2Parsed.owner,
|
|
1132
|
+
p2Parsed.name,
|
|
1133
|
+
p2Parsed.subname
|
|
1134
|
+
);
|
|
1135
|
+
p2Versions = resp.status === 200 ? resp.data : void 0;
|
|
1136
|
+
} else {
|
|
1137
|
+
const resp = await listSkillVersions(p2Parsed.owner, p2Parsed.name);
|
|
1138
|
+
p2Versions = resp.status === 200 ? resp.data : void 0;
|
|
1139
|
+
}
|
|
1140
|
+
if (!p2Versions) continue;
|
|
1141
|
+
const availableVersions = p2Versions.map((v) => v.version);
|
|
978
1142
|
const finalVersion = findHighestSatisfying(allRanges, availableVersions);
|
|
979
1143
|
if (!finalVersion) {
|
|
980
1144
|
graph.conflicts.push({
|
|
@@ -993,18 +1157,33 @@ async function resolveRecursive(rootDeps, config2) {
|
|
|
993
1157
|
continue;
|
|
994
1158
|
}
|
|
995
1159
|
if (finalVersion !== node.version) {
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1160
|
+
let p2VersionData = null;
|
|
1161
|
+
if (p2Parsed.namespace === "github" && p2Parsed.subname) {
|
|
1162
|
+
const resp = await getGithubSkillVersion(
|
|
1163
|
+
p2Parsed.owner,
|
|
1164
|
+
p2Parsed.name,
|
|
1165
|
+
p2Parsed.subname,
|
|
1166
|
+
finalVersion
|
|
1167
|
+
);
|
|
1168
|
+
if (resp.status === 200 && resp.data) {
|
|
1169
|
+
p2VersionData = resp.data;
|
|
1170
|
+
}
|
|
1171
|
+
} else {
|
|
1172
|
+
const resp = await getSkillVersion(
|
|
1173
|
+
p2Parsed.owner,
|
|
1174
|
+
p2Parsed.name,
|
|
1175
|
+
finalVersion
|
|
1176
|
+
);
|
|
1177
|
+
if (resp.status === 200 && resp.data) {
|
|
1178
|
+
p2VersionData = resp.data;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
if (p2VersionData) {
|
|
1003
1182
|
node.version = finalVersion;
|
|
1004
|
-
node.downloadUrl =
|
|
1005
|
-
node.integrity = `sha256-${Buffer.from(
|
|
1006
|
-
node.deprecated =
|
|
1007
|
-
const manifest =
|
|
1183
|
+
node.downloadUrl = p2VersionData.downloadUrl;
|
|
1184
|
+
node.integrity = `sha256-${Buffer.from(p2VersionData.checksum, "hex").toString("base64")}`;
|
|
1185
|
+
node.deprecated = p2VersionData.deprecationMessage ?? void 0;
|
|
1186
|
+
const manifest = p2VersionData.manifest;
|
|
1008
1187
|
node.dependencies = manifest?.dependencies ?? {};
|
|
1009
1188
|
}
|
|
1010
1189
|
}
|
|
@@ -1119,30 +1298,55 @@ function printResolutionErrors(errors, conflicts = []) {
|
|
|
1119
1298
|
var MAX_DEPENDENCY_DEPTH;
|
|
1120
1299
|
var init_resolver = __esm({
|
|
1121
1300
|
"src/lib/resolver.ts"() {
|
|
1301
|
+
init_src();
|
|
1122
1302
|
init_api_client();
|
|
1123
|
-
|
|
1303
|
+
init_version2();
|
|
1124
1304
|
MAX_DEPENDENCY_DEPTH = 5;
|
|
1125
1305
|
}
|
|
1126
1306
|
});
|
|
1127
1307
|
|
|
1128
1308
|
// src/lib/specifier.ts
|
|
1129
|
-
function
|
|
1130
|
-
const match = specifier.match(
|
|
1309
|
+
function parseRegistrySpecifier2(specifier) {
|
|
1310
|
+
const match = specifier.match(REGISTRY_SPECIFIER_PATTERN2);
|
|
1131
1311
|
if (!match) {
|
|
1132
1312
|
return null;
|
|
1133
1313
|
}
|
|
1134
|
-
const
|
|
1135
|
-
const
|
|
1136
|
-
|
|
1314
|
+
const namespace = match[1];
|
|
1315
|
+
const owner = match[2];
|
|
1316
|
+
const name = match[3];
|
|
1317
|
+
const subname = match[4];
|
|
1318
|
+
const versionRange = match[5];
|
|
1319
|
+
if (!owner || !name) {
|
|
1320
|
+
return null;
|
|
1321
|
+
}
|
|
1322
|
+
if (namespace === "github" && !subname) {
|
|
1323
|
+
return null;
|
|
1324
|
+
}
|
|
1325
|
+
if (namespace !== "github" && subname) {
|
|
1137
1326
|
return null;
|
|
1138
1327
|
}
|
|
1139
1328
|
return {
|
|
1140
|
-
|
|
1329
|
+
namespace,
|
|
1330
|
+
owner,
|
|
1141
1331
|
name,
|
|
1142
|
-
|
|
1332
|
+
subname: subname || void 0,
|
|
1333
|
+
versionRange: versionRange || void 0
|
|
1143
1334
|
};
|
|
1144
1335
|
}
|
|
1145
|
-
function
|
|
1336
|
+
function generateRegistryIdentifier2(spec) {
|
|
1337
|
+
let base = `@${spec.namespace}/${spec.owner}/${spec.name}`;
|
|
1338
|
+
if (spec.subname) {
|
|
1339
|
+
base += `/${spec.subname}`;
|
|
1340
|
+
}
|
|
1341
|
+
if (spec.versionRange) {
|
|
1342
|
+
base += `@${spec.versionRange}`;
|
|
1343
|
+
}
|
|
1344
|
+
return base;
|
|
1345
|
+
}
|
|
1346
|
+
function isRegistrySpecifier2(specifier) {
|
|
1347
|
+
return specifier.startsWith("@user/") || specifier.startsWith("@org/") || specifier.startsWith("@github/");
|
|
1348
|
+
}
|
|
1349
|
+
function parseGitHubSpecifier2(specifier) {
|
|
1146
1350
|
const match = specifier.match(GITHUB_SPECIFIER_PATTERN);
|
|
1147
1351
|
if (!match) {
|
|
1148
1352
|
return null;
|
|
@@ -1159,7 +1363,7 @@ function parseGitHubSpecifier(specifier) {
|
|
|
1159
1363
|
ref: ref || void 0
|
|
1160
1364
|
};
|
|
1161
1365
|
}
|
|
1162
|
-
function
|
|
1366
|
+
function formatGitHubSpecifier2(spec) {
|
|
1163
1367
|
let result = `github:${spec.owner}/${spec.repo}`;
|
|
1164
1368
|
if (spec.path) {
|
|
1165
1369
|
result += `/${spec.path}`;
|
|
@@ -1169,7 +1373,7 @@ function formatGitHubSpecifier(spec) {
|
|
|
1169
1373
|
}
|
|
1170
1374
|
return result;
|
|
1171
1375
|
}
|
|
1172
|
-
function
|
|
1376
|
+
function getGitHubSkillName2(spec) {
|
|
1173
1377
|
if (spec.path) {
|
|
1174
1378
|
const segments = spec.path.split("/").filter(Boolean);
|
|
1175
1379
|
const lastSegment = segments[segments.length - 1];
|
|
@@ -1179,7 +1383,7 @@ function getGitHubSkillName(spec) {
|
|
|
1179
1383
|
}
|
|
1180
1384
|
return spec.repo;
|
|
1181
1385
|
}
|
|
1182
|
-
function
|
|
1386
|
+
function isGitHubSpecifier2(specifier) {
|
|
1183
1387
|
return specifier.startsWith("github:");
|
|
1184
1388
|
}
|
|
1185
1389
|
function isGitHubUrl(input) {
|
|
@@ -1225,10 +1429,10 @@ function parseGitHubShorthand(input) {
|
|
|
1225
1429
|
path: path || void 0
|
|
1226
1430
|
};
|
|
1227
1431
|
}
|
|
1228
|
-
var
|
|
1229
|
-
var
|
|
1432
|
+
var REGISTRY_SPECIFIER_PATTERN2, GITHUB_SPECIFIER_PATTERN, GITHUB_URL_TREE_PATTERN, GITHUB_URL_PATTERN, GITHUB_SHORTHAND_PATTERN;
|
|
1433
|
+
var init_specifier2 = __esm({
|
|
1230
1434
|
"src/lib/specifier.ts"() {
|
|
1231
|
-
|
|
1435
|
+
REGISTRY_SPECIFIER_PATTERN2 = /^@(user|org|github)\/([a-zA-Z0-9_-]+)\/([a-zA-Z0-9._-]+)(?:\/([a-z][a-z0-9-]*))?(?:@(.+))?$/;
|
|
1232
1436
|
GITHUB_SPECIFIER_PATTERN = /^github:([a-zA-Z0-9_-]+)\/([a-zA-Z0-9_.-]+)(\/[^@]+)?(?:@(.+))?$/;
|
|
1233
1437
|
GITHUB_URL_TREE_PATTERN = /^https?:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)(?:\/(.+))?$/;
|
|
1234
1438
|
GITHUB_URL_PATTERN = /^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/;
|
|
@@ -1244,8 +1448,8 @@ var init_lib = __esm({
|
|
|
1244
1448
|
init_lockfile();
|
|
1245
1449
|
init_manifest();
|
|
1246
1450
|
init_resolver();
|
|
1247
|
-
|
|
1248
|
-
|
|
1451
|
+
init_specifier2();
|
|
1452
|
+
init_version2();
|
|
1249
1453
|
}
|
|
1250
1454
|
});
|
|
1251
1455
|
function resolveAgentConfig(name, overrides, global) {
|
|
@@ -1890,7 +2094,7 @@ async function listLockfileWellKnownPackages() {
|
|
|
1890
2094
|
})
|
|
1891
2095
|
);
|
|
1892
2096
|
}
|
|
1893
|
-
var
|
|
2097
|
+
var init_lockfile3 = __esm({
|
|
1894
2098
|
"src/lockfile.ts"() {
|
|
1895
2099
|
init_config();
|
|
1896
2100
|
init_lib();
|
|
@@ -1992,7 +2196,7 @@ async function addWellKnownDependency(baseUrl, skillNames) {
|
|
|
1992
2196
|
}
|
|
1993
2197
|
await writeManifest(manifest);
|
|
1994
2198
|
}
|
|
1995
|
-
var
|
|
2199
|
+
var init_manifest3 = __esm({
|
|
1996
2200
|
"src/manifest.ts"() {
|
|
1997
2201
|
init_config();
|
|
1998
2202
|
}
|
|
@@ -2063,8 +2267,19 @@ async function removeAgentSymlinks(skillName, options) {
|
|
|
2063
2267
|
}
|
|
2064
2268
|
}
|
|
2065
2269
|
}
|
|
2066
|
-
function getRegistrySkillPath(
|
|
2067
|
-
|
|
2270
|
+
function getRegistrySkillPath(ownerOrNamespace, skillNameOrOwner, skillName) {
|
|
2271
|
+
if (skillName !== void 0) {
|
|
2272
|
+
const namespace = ownerOrNamespace;
|
|
2273
|
+
const owner = skillNameOrOwner;
|
|
2274
|
+
if (namespace === "org") {
|
|
2275
|
+
return `.pspm/skills/_org/${owner}/${skillName}`;
|
|
2276
|
+
}
|
|
2277
|
+
if (namespace === "github") {
|
|
2278
|
+
return `.pspm/skills/_github-registry/${owner}/${skillName}`;
|
|
2279
|
+
}
|
|
2280
|
+
return `.pspm/skills/${owner}/${skillName}`;
|
|
2281
|
+
}
|
|
2282
|
+
return `.pspm/skills/${ownerOrNamespace}/${skillNameOrOwner}`;
|
|
2068
2283
|
}
|
|
2069
2284
|
function getGitHubSkillPath(owner, repo, path) {
|
|
2070
2285
|
if (path) {
|
|
@@ -2281,7 +2496,7 @@ var add_exports = {};
|
|
|
2281
2496
|
__export(add_exports, {
|
|
2282
2497
|
add: () => add
|
|
2283
2498
|
});
|
|
2284
|
-
function
|
|
2499
|
+
function isLocalSpecifier3(specifier) {
|
|
2285
2500
|
return specifier.startsWith("file:") || specifier.startsWith("./") || specifier.startsWith("../");
|
|
2286
2501
|
}
|
|
2287
2502
|
function parseLocalPath(specifier) {
|
|
@@ -2290,7 +2505,7 @@ function parseLocalPath(specifier) {
|
|
|
2290
2505
|
}
|
|
2291
2506
|
return specifier;
|
|
2292
2507
|
}
|
|
2293
|
-
function
|
|
2508
|
+
function normalizeToFileSpecifier2(path) {
|
|
2294
2509
|
if (path.startsWith("file:")) {
|
|
2295
2510
|
return path;
|
|
2296
2511
|
}
|
|
@@ -2306,18 +2521,27 @@ async function add(specifiers, options) {
|
|
|
2306
2521
|
const validationErrors = [];
|
|
2307
2522
|
for (const specifier of specifiers) {
|
|
2308
2523
|
try {
|
|
2309
|
-
if (
|
|
2524
|
+
if (isLocalSpecifier3(specifier)) {
|
|
2310
2525
|
const resolved = await validateLocalPackage(specifier);
|
|
2311
2526
|
resolvedPackages.push(resolved);
|
|
2312
|
-
} else if (
|
|
2527
|
+
} else if (isGitHubSpecifier2(specifier) || isGitHubUrl(specifier) || isGitHubShorthand(specifier)) {
|
|
2313
2528
|
const resolved = await validateGitHubPackage(specifier);
|
|
2314
2529
|
resolvedPackages.push(resolved);
|
|
2315
2530
|
} else if (isWellKnownSpecifier(specifier)) {
|
|
2316
2531
|
const resolved = await validateWellKnownPackage(specifier);
|
|
2317
2532
|
resolvedPackages.push(resolved);
|
|
2318
|
-
} else {
|
|
2533
|
+
} else if (isRegistrySpecifier2(specifier)) {
|
|
2319
2534
|
const resolved = await validateRegistryPackage(specifier);
|
|
2320
2535
|
resolvedPackages.push(resolved);
|
|
2536
|
+
} else {
|
|
2537
|
+
throw new Error(
|
|
2538
|
+
`Unknown specifier format "${specifier}". Supported formats:
|
|
2539
|
+
@user/{username}/{name}[@version] (registry)
|
|
2540
|
+
@org/{orgname}/{name}[@version] (organization)
|
|
2541
|
+
github:owner/repo[/path][@ref] (github)
|
|
2542
|
+
file:./path/to/skill (local)
|
|
2543
|
+
owner/repo (github shorthand)`
|
|
2544
|
+
);
|
|
2321
2545
|
}
|
|
2322
2546
|
} catch (error) {
|
|
2323
2547
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
@@ -2354,7 +2578,12 @@ async function add(specifiers, options) {
|
|
|
2354
2578
|
if (registryPackages.length > 0) {
|
|
2355
2579
|
const rootDeps = {};
|
|
2356
2580
|
for (const pkg of registryPackages) {
|
|
2357
|
-
const fullName =
|
|
2581
|
+
const fullName = generateRegistryIdentifier2({
|
|
2582
|
+
namespace: pkg.namespace,
|
|
2583
|
+
owner: pkg.owner,
|
|
2584
|
+
name: pkg.name,
|
|
2585
|
+
subname: pkg.subname
|
|
2586
|
+
});
|
|
2358
2587
|
rootDeps[fullName] = pkg.versionRange || `^${pkg.resolvedVersion}`;
|
|
2359
2588
|
}
|
|
2360
2589
|
console.log("Resolving dependencies...");
|
|
@@ -2487,11 +2716,11 @@ function getSymlinkRoot() {
|
|
|
2487
2716
|
return isGlobalMode() ? homedir() : process.cwd();
|
|
2488
2717
|
}
|
|
2489
2718
|
async function installFromNode(node, options) {
|
|
2490
|
-
const
|
|
2491
|
-
if (!
|
|
2719
|
+
const parsed = parseRegistrySpecifier2(node.name);
|
|
2720
|
+
if (!parsed) {
|
|
2492
2721
|
throw new Error(`Invalid package name: ${node.name}`);
|
|
2493
2722
|
}
|
|
2494
|
-
const
|
|
2723
|
+
const { namespace, owner, name, subname } = parsed;
|
|
2495
2724
|
console.log(`Installing ${node.name}@${node.version}...`);
|
|
2496
2725
|
const config2 = await resolveConfig();
|
|
2497
2726
|
const apiKey = getTokenForRegistry(config2, config2.registryUrl);
|
|
@@ -2513,7 +2742,15 @@ async function installFromNode(node, options) {
|
|
|
2513
2742
|
throw new Error("Checksum verification failed");
|
|
2514
2743
|
}
|
|
2515
2744
|
const skillsDir = getSkillsDir();
|
|
2516
|
-
const
|
|
2745
|
+
const effectiveSkillName = subname ?? name;
|
|
2746
|
+
let destDir;
|
|
2747
|
+
if (namespace === "org") {
|
|
2748
|
+
destDir = join(skillsDir, "_org", owner, effectiveSkillName);
|
|
2749
|
+
} else if (namespace === "github" && subname) {
|
|
2750
|
+
destDir = join(skillsDir, "_github-registry", owner, name, subname);
|
|
2751
|
+
} else {
|
|
2752
|
+
destDir = join(skillsDir, owner, effectiveSkillName);
|
|
2753
|
+
}
|
|
2517
2754
|
await mkdir(destDir, { recursive: true });
|
|
2518
2755
|
const { writeFile: writeFile11 } = await import('fs/promises');
|
|
2519
2756
|
const tempFile = join(destDir, ".temp.tgz");
|
|
@@ -2552,9 +2789,10 @@ async function installFromNode(node, options) {
|
|
|
2552
2789
|
const agents = options.resolvedAgents;
|
|
2553
2790
|
if (agents[0] !== "none") {
|
|
2554
2791
|
const skillManifest = await readManifest();
|
|
2792
|
+
const pathSkillName = namespace === "github" && subname ? `${name}/${subname}` : name;
|
|
2555
2793
|
const skillInfo = {
|
|
2556
|
-
name,
|
|
2557
|
-
sourcePath: getRegistrySkillPath(
|
|
2794
|
+
name: effectiveSkillName,
|
|
2795
|
+
sourcePath: getRegistrySkillPath(namespace, owner, pathSkillName)
|
|
2558
2796
|
};
|
|
2559
2797
|
await createAgentSymlinks([skillInfo], {
|
|
2560
2798
|
agents,
|
|
@@ -2570,73 +2808,110 @@ async function validateRegistryPackage(specifier) {
|
|
|
2570
2808
|
const config2 = await resolveConfig();
|
|
2571
2809
|
const registryUrl = config2.registryUrl;
|
|
2572
2810
|
const apiKey = getTokenForRegistry(config2, registryUrl);
|
|
2573
|
-
const parsed =
|
|
2811
|
+
const parsed = parseRegistrySpecifier2(specifier);
|
|
2574
2812
|
if (!parsed) {
|
|
2575
2813
|
throw new Error(
|
|
2576
|
-
`Invalid skill specifier "${specifier}". Use format: @user/{username}/{name}[@{version}]`
|
|
2814
|
+
`Invalid skill specifier "${specifier}". Use format: @user/{username}/{name}[@{version}] or @org/{orgname}/{name}[@{version}]`
|
|
2577
2815
|
);
|
|
2578
2816
|
}
|
|
2579
|
-
const {
|
|
2817
|
+
const { namespace, owner, name, subname, versionRange } = parsed;
|
|
2818
|
+
const fullName = generateRegistryIdentifier2({
|
|
2819
|
+
namespace,
|
|
2820
|
+
owner,
|
|
2821
|
+
name,
|
|
2822
|
+
subname
|
|
2823
|
+
});
|
|
2580
2824
|
configure2({ registryUrl, apiKey });
|
|
2581
2825
|
console.log(`Resolving ${specifier}...`);
|
|
2582
|
-
|
|
2583
|
-
if (
|
|
2584
|
-
|
|
2585
|
-
|
|
2826
|
+
let versions;
|
|
2827
|
+
if (namespace === "github" && subname) {
|
|
2828
|
+
const versionsResponse = await listGithubSkillVersions(
|
|
2829
|
+
owner,
|
|
2830
|
+
name,
|
|
2831
|
+
subname
|
|
2832
|
+
);
|
|
2833
|
+
if (versionsResponse.status !== 200 || !versionsResponse.data) {
|
|
2834
|
+
if (versionsResponse.status === 401) {
|
|
2586
2835
|
throw new Error(
|
|
2587
|
-
`
|
|
2836
|
+
apiKey ? `Access denied to ${fullName}. You may not have permission to access this private package.` : `Package ${fullName} requires authentication. Please run 'pspm login' to authenticate`
|
|
2588
2837
|
);
|
|
2589
2838
|
}
|
|
2590
|
-
throw new Error(
|
|
2591
|
-
|
|
2839
|
+
throw new Error(versionsResponse.error || `Skill ${fullName} not found`);
|
|
2840
|
+
}
|
|
2841
|
+
versions = versionsResponse.data;
|
|
2842
|
+
} else {
|
|
2843
|
+
const versionsResponse = await listSkillVersions(owner, name);
|
|
2844
|
+
if (versionsResponse.status !== 200) {
|
|
2845
|
+
if (versionsResponse.status === 401) {
|
|
2846
|
+
if (!apiKey) {
|
|
2847
|
+
throw new Error(
|
|
2848
|
+
`Package ${fullName} requires authentication. Please run 'pspm login' to authenticate`
|
|
2849
|
+
);
|
|
2850
|
+
}
|
|
2851
|
+
throw new Error(
|
|
2852
|
+
`Access denied to ${fullName}. You may not have permission to access this private package.`
|
|
2853
|
+
);
|
|
2854
|
+
}
|
|
2855
|
+
const errorMessage = extractApiErrorMessage(
|
|
2856
|
+
versionsResponse,
|
|
2857
|
+
`Skill ${fullName} not found`
|
|
2592
2858
|
);
|
|
2859
|
+
throw new Error(errorMessage);
|
|
2593
2860
|
}
|
|
2594
|
-
|
|
2595
|
-
versionsResponse,
|
|
2596
|
-
`Skill @user/${username}/${name} not found`
|
|
2597
|
-
);
|
|
2598
|
-
throw new Error(errorMessage);
|
|
2861
|
+
versions = versionsResponse.data;
|
|
2599
2862
|
}
|
|
2600
|
-
const versions = versionsResponse.data;
|
|
2601
2863
|
if (versions.length === 0) {
|
|
2602
|
-
throw new Error(`Skill
|
|
2864
|
+
throw new Error(`Skill ${fullName} not found`);
|
|
2603
2865
|
}
|
|
2604
2866
|
const versionStrings = versions.map((v) => v.version);
|
|
2605
|
-
const resolvedVersion =
|
|
2867
|
+
const resolvedVersion = resolveVersion2(versionRange || "*", versionStrings);
|
|
2606
2868
|
if (!resolvedVersion) {
|
|
2607
2869
|
throw new Error(
|
|
2608
|
-
`No version matching "${versionRange || "latest"}" found for
|
|
2870
|
+
`No version matching "${versionRange || "latest"}" found for ${fullName}. Available versions: ${versionStrings.join(", ")}`
|
|
2609
2871
|
);
|
|
2610
2872
|
}
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
`Version ${resolvedVersion} not found`
|
|
2873
|
+
let downloadUrl;
|
|
2874
|
+
let checksum;
|
|
2875
|
+
if (namespace === "github" && subname) {
|
|
2876
|
+
const versionResponse = await getGithubSkillVersion(
|
|
2877
|
+
owner,
|
|
2878
|
+
name,
|
|
2879
|
+
subname,
|
|
2880
|
+
resolvedVersion
|
|
2620
2881
|
);
|
|
2621
|
-
|
|
2882
|
+
if (versionResponse.status !== 200 || !versionResponse.data) {
|
|
2883
|
+
throw new Error(`Version ${resolvedVersion} not found for ${fullName}`);
|
|
2884
|
+
}
|
|
2885
|
+
downloadUrl = versionResponse.data.downloadUrl;
|
|
2886
|
+
checksum = versionResponse.data.checksum;
|
|
2887
|
+
} else {
|
|
2888
|
+
const versionResponse = await getSkillVersion(owner, name, resolvedVersion);
|
|
2889
|
+
if (versionResponse.status !== 200 || !versionResponse.data) {
|
|
2890
|
+
const errorMessage = extractApiErrorMessage(
|
|
2891
|
+
versionResponse,
|
|
2892
|
+
`Version ${resolvedVersion} not found`
|
|
2893
|
+
);
|
|
2894
|
+
throw new Error(errorMessage);
|
|
2895
|
+
}
|
|
2896
|
+
downloadUrl = versionResponse.data.downloadUrl;
|
|
2897
|
+
checksum = versionResponse.data.checksum;
|
|
2622
2898
|
}
|
|
2623
|
-
console.log(`Resolved
|
|
2899
|
+
console.log(`Resolved ${fullName}@${resolvedVersion}`);
|
|
2624
2900
|
return {
|
|
2625
2901
|
type: "registry",
|
|
2626
2902
|
specifier,
|
|
2627
|
-
|
|
2903
|
+
namespace,
|
|
2904
|
+
owner,
|
|
2628
2905
|
name,
|
|
2906
|
+
subname,
|
|
2629
2907
|
versionRange,
|
|
2630
2908
|
resolvedVersion,
|
|
2631
|
-
versionInfo: {
|
|
2632
|
-
downloadUrl: versionResponse.data.downloadUrl,
|
|
2633
|
-
checksum: versionResponse.data.checksum
|
|
2634
|
-
}
|
|
2909
|
+
versionInfo: { downloadUrl, checksum }
|
|
2635
2910
|
};
|
|
2636
2911
|
}
|
|
2637
2912
|
function parseAnyGitHubFormat(specifier) {
|
|
2638
|
-
if (
|
|
2639
|
-
return
|
|
2913
|
+
if (isGitHubSpecifier2(specifier)) {
|
|
2914
|
+
return parseGitHubSpecifier2(specifier);
|
|
2640
2915
|
}
|
|
2641
2916
|
if (isGitHubUrl(specifier)) {
|
|
2642
2917
|
return parseGitHubUrl(specifier);
|
|
@@ -2679,7 +2954,7 @@ async function installGitHubPackage(resolved, options) {
|
|
|
2679
2954
|
downloadResult.buffer,
|
|
2680
2955
|
skillsDir
|
|
2681
2956
|
);
|
|
2682
|
-
const lockfileSpecifier =
|
|
2957
|
+
const lockfileSpecifier = formatGitHubSpecifier2({
|
|
2683
2958
|
owner: parsed.owner,
|
|
2684
2959
|
repo: parsed.repo,
|
|
2685
2960
|
path: parsed.path
|
|
@@ -2697,7 +2972,7 @@ async function installGitHubPackage(resolved, options) {
|
|
|
2697
2972
|
const agents = options.resolvedAgents;
|
|
2698
2973
|
if (agents[0] !== "none") {
|
|
2699
2974
|
const manifest = await readManifest();
|
|
2700
|
-
const skillName =
|
|
2975
|
+
const skillName = getGitHubSkillName2(parsed);
|
|
2701
2976
|
const skillInfo = {
|
|
2702
2977
|
name: skillName,
|
|
2703
2978
|
sourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path)
|
|
@@ -2717,7 +2992,7 @@ async function installGitHubPackage(resolved, options) {
|
|
|
2717
2992
|
async function validateLocalPackage(specifier) {
|
|
2718
2993
|
const path = parseLocalPath(specifier);
|
|
2719
2994
|
const resolvedPath = resolve(process.cwd(), path);
|
|
2720
|
-
const normalizedSpecifier =
|
|
2995
|
+
const normalizedSpecifier = normalizeToFileSpecifier2(path);
|
|
2721
2996
|
console.log(`Resolving ${specifier}...`);
|
|
2722
2997
|
try {
|
|
2723
2998
|
const stats = await stat(resolvedPath);
|
|
@@ -2866,8 +3141,8 @@ var init_add = __esm({
|
|
|
2866
3141
|
init_errors();
|
|
2867
3142
|
init_github();
|
|
2868
3143
|
init_lib();
|
|
2869
|
-
|
|
2870
|
-
|
|
3144
|
+
init_lockfile3();
|
|
3145
|
+
init_manifest3();
|
|
2871
3146
|
init_symlinks();
|
|
2872
3147
|
init_wellknown();
|
|
2873
3148
|
}
|
|
@@ -2877,7 +3152,7 @@ var init_add = __esm({
|
|
|
2877
3152
|
init_api_client();
|
|
2878
3153
|
init_config();
|
|
2879
3154
|
init_lib();
|
|
2880
|
-
function
|
|
3155
|
+
function isLocalSpecifier2(specifier) {
|
|
2881
3156
|
return specifier.startsWith("file:") || specifier.startsWith("./") || specifier.startsWith("../");
|
|
2882
3157
|
}
|
|
2883
3158
|
async function access(specifier, options) {
|
|
@@ -2896,8 +3171,8 @@ async function access(specifier, options) {
|
|
|
2896
3171
|
let packageName;
|
|
2897
3172
|
let packageUsername;
|
|
2898
3173
|
if (specifier) {
|
|
2899
|
-
if (
|
|
2900
|
-
const ghSpec =
|
|
3174
|
+
if (isGitHubSpecifier2(specifier)) {
|
|
3175
|
+
const ghSpec = parseGitHubSpecifier2(specifier);
|
|
2901
3176
|
if (ghSpec) {
|
|
2902
3177
|
console.error(`Error: Cannot change visibility of GitHub packages.`);
|
|
2903
3178
|
console.error(
|
|
@@ -2912,7 +3187,7 @@ async function access(specifier, options) {
|
|
|
2912
3187
|
}
|
|
2913
3188
|
process.exit(1);
|
|
2914
3189
|
}
|
|
2915
|
-
if (
|
|
3190
|
+
if (isLocalSpecifier2(specifier)) {
|
|
2916
3191
|
console.error(`Error: Cannot change visibility of local packages.`);
|
|
2917
3192
|
console.error(
|
|
2918
3193
|
` "${specifier}" is a local directory, not a registry package.`
|
|
@@ -2922,10 +3197,12 @@ async function access(specifier, options) {
|
|
|
2922
3197
|
);
|
|
2923
3198
|
process.exit(1);
|
|
2924
3199
|
}
|
|
2925
|
-
const parsed =
|
|
3200
|
+
const parsed = parseRegistrySpecifier2(specifier);
|
|
2926
3201
|
if (!parsed) {
|
|
2927
3202
|
console.error(`Error: Invalid package specifier "${specifier}".`);
|
|
2928
|
-
console.error(
|
|
3203
|
+
console.error(
|
|
3204
|
+
` Use format: @user/{username}/{name} or @org/{orgname}/{name}`
|
|
3205
|
+
);
|
|
2929
3206
|
console.error(``);
|
|
2930
3207
|
console.error(` Examples:`);
|
|
2931
3208
|
console.error(` pspm access @user/myname/my-skill --public`);
|
|
@@ -2935,7 +3212,7 @@ async function access(specifier, options) {
|
|
|
2935
3212
|
process.exit(1);
|
|
2936
3213
|
}
|
|
2937
3214
|
packageName = parsed.name;
|
|
2938
|
-
packageUsername = parsed.
|
|
3215
|
+
packageUsername = parsed.owner;
|
|
2939
3216
|
} else {
|
|
2940
3217
|
const { readFile: readFile10 } = await import('fs/promises');
|
|
2941
3218
|
const { join: join18 } = await import('path');
|
|
@@ -2991,7 +3268,7 @@ async function access(specifier, options) {
|
|
|
2991
3268
|
}
|
|
2992
3269
|
const result = response.data;
|
|
2993
3270
|
console.log(
|
|
2994
|
-
`+
|
|
3271
|
+
`+ @${result.namespace ?? "user"}/${result.username}/${result.name} is now ${result.visibility}`
|
|
2995
3272
|
);
|
|
2996
3273
|
if (visibility === "public") {
|
|
2997
3274
|
console.log("");
|
|
@@ -3012,7 +3289,7 @@ init_add();
|
|
|
3012
3289
|
// src/commands/audit.ts
|
|
3013
3290
|
init_config();
|
|
3014
3291
|
init_lib();
|
|
3015
|
-
|
|
3292
|
+
init_lockfile3();
|
|
3016
3293
|
async function audit(options) {
|
|
3017
3294
|
try {
|
|
3018
3295
|
const lockfile = await readLockfile();
|
|
@@ -3082,7 +3359,7 @@ async function audit(options) {
|
|
|
3082
3359
|
}
|
|
3083
3360
|
const githubSkills = await listLockfileGitHubPackages();
|
|
3084
3361
|
for (const { specifier } of githubSkills) {
|
|
3085
|
-
const parsed =
|
|
3362
|
+
const parsed = parseGitHubSpecifier2(specifier);
|
|
3086
3363
|
if (!parsed) continue;
|
|
3087
3364
|
const destDir = parsed.path ? join(
|
|
3088
3365
|
projectRoot,
|
|
@@ -3280,14 +3557,19 @@ async function deprecate(specifier, message, options) {
|
|
|
3280
3557
|
try {
|
|
3281
3558
|
const apiKey = await requireApiKey();
|
|
3282
3559
|
const registryUrl = await getRegistryUrl();
|
|
3283
|
-
const parsed =
|
|
3560
|
+
const parsed = parseRegistrySpecifier2(specifier);
|
|
3284
3561
|
if (!parsed) {
|
|
3285
3562
|
console.error(
|
|
3286
|
-
`Error: Invalid skill specifier "${specifier}". Use format: @user/{username}/{name}@{version}`
|
|
3563
|
+
`Error: Invalid skill specifier "${specifier}". Use format: @user/{username}/{name}@{version} or @org/{orgname}/{name}@{version}`
|
|
3287
3564
|
);
|
|
3288
3565
|
process.exit(1);
|
|
3289
3566
|
}
|
|
3290
|
-
const {
|
|
3567
|
+
const { owner, name, versionRange } = parsed;
|
|
3568
|
+
const fullName = generateRegistryIdentifier2({
|
|
3569
|
+
namespace: parsed.namespace,
|
|
3570
|
+
owner,
|
|
3571
|
+
name
|
|
3572
|
+
});
|
|
3291
3573
|
if (!versionRange) {
|
|
3292
3574
|
console.error(
|
|
3293
3575
|
"Error: Version is required for deprecation. Use format: @user/{username}/{name}@{version}"
|
|
@@ -3296,23 +3578,15 @@ async function deprecate(specifier, message, options) {
|
|
|
3296
3578
|
}
|
|
3297
3579
|
configure2({ registryUrl, apiKey });
|
|
3298
3580
|
if (options.undo) {
|
|
3299
|
-
console.log(
|
|
3300
|
-
|
|
3301
|
-
);
|
|
3302
|
-
const response = await undeprecateSkillVersion(
|
|
3303
|
-
username,
|
|
3304
|
-
name,
|
|
3305
|
-
versionRange
|
|
3306
|
-
);
|
|
3581
|
+
console.log(`Removing deprecation from ${fullName}@${versionRange}...`);
|
|
3582
|
+
const response = await undeprecateSkillVersion(owner, name, versionRange);
|
|
3307
3583
|
if (response.status !== 200) {
|
|
3308
3584
|
console.error(
|
|
3309
3585
|
`Error: ${response.error || "Failed to remove deprecation"}`
|
|
3310
3586
|
);
|
|
3311
3587
|
process.exit(1);
|
|
3312
3588
|
}
|
|
3313
|
-
console.log(
|
|
3314
|
-
`Removed deprecation from @user/${username}/${name}@${versionRange}`
|
|
3315
|
-
);
|
|
3589
|
+
console.log(`Removed deprecation from ${fullName}@${versionRange}`);
|
|
3316
3590
|
} else {
|
|
3317
3591
|
if (!message) {
|
|
3318
3592
|
console.error(
|
|
@@ -3320,9 +3594,9 @@ async function deprecate(specifier, message, options) {
|
|
|
3320
3594
|
);
|
|
3321
3595
|
process.exit(1);
|
|
3322
3596
|
}
|
|
3323
|
-
console.log(`Deprecating
|
|
3597
|
+
console.log(`Deprecating ${fullName}@${versionRange}...`);
|
|
3324
3598
|
const response = await deprecateSkillVersion(
|
|
3325
|
-
|
|
3599
|
+
owner,
|
|
3326
3600
|
name,
|
|
3327
3601
|
versionRange,
|
|
3328
3602
|
message
|
|
@@ -3333,7 +3607,7 @@ async function deprecate(specifier, message, options) {
|
|
|
3333
3607
|
);
|
|
3334
3608
|
process.exit(1);
|
|
3335
3609
|
}
|
|
3336
|
-
console.log(`Deprecated
|
|
3610
|
+
console.log(`Deprecated ${fullName}@${versionRange}`);
|
|
3337
3611
|
console.log(`Message: ${message}`);
|
|
3338
3612
|
console.log("");
|
|
3339
3613
|
console.log(
|
|
@@ -3573,8 +3847,8 @@ init_config();
|
|
|
3573
3847
|
init_errors();
|
|
3574
3848
|
init_github();
|
|
3575
3849
|
init_lib();
|
|
3576
|
-
|
|
3577
|
-
|
|
3850
|
+
init_lockfile3();
|
|
3851
|
+
init_manifest3();
|
|
3578
3852
|
init_symlinks();
|
|
3579
3853
|
function getCacheFilePath(cacheDir, integrity) {
|
|
3580
3854
|
const match = integrity.match(/^sha256-(.+)$/);
|
|
@@ -3659,14 +3933,14 @@ async function installFromLockfile(options) {
|
|
|
3659
3933
|
`);
|
|
3660
3934
|
configure2({ registryUrl, apiKey });
|
|
3661
3935
|
for (const { fullName, versionRange } of missingDeps) {
|
|
3662
|
-
const parsed =
|
|
3936
|
+
const parsed = parseRegistrySpecifier2(fullName);
|
|
3663
3937
|
if (!parsed) {
|
|
3664
3938
|
console.error(`Error: Invalid dependency specifier: ${fullName}`);
|
|
3665
3939
|
continue;
|
|
3666
3940
|
}
|
|
3667
|
-
const {
|
|
3941
|
+
const { owner, name } = parsed;
|
|
3668
3942
|
console.log(`Resolving ${fullName}@${versionRange}...`);
|
|
3669
|
-
const versionsResponse = await listSkillVersions(
|
|
3943
|
+
const versionsResponse = await listSkillVersions(owner, name);
|
|
3670
3944
|
if (versionsResponse.status !== 200) {
|
|
3671
3945
|
const errorMessage = extractApiErrorMessage(
|
|
3672
3946
|
versionsResponse,
|
|
@@ -3683,14 +3957,14 @@ async function installFromLockfile(options) {
|
|
|
3683
3957
|
const versionStrings = versions.map(
|
|
3684
3958
|
(v) => v.version
|
|
3685
3959
|
);
|
|
3686
|
-
const resolved =
|
|
3960
|
+
const resolved = resolveVersion2(versionRange || "*", versionStrings);
|
|
3687
3961
|
if (!resolved) {
|
|
3688
3962
|
console.error(
|
|
3689
3963
|
`Error: No version matching "${versionRange}" for ${fullName}`
|
|
3690
3964
|
);
|
|
3691
3965
|
continue;
|
|
3692
3966
|
}
|
|
3693
|
-
const versionResponse = await getSkillVersion(
|
|
3967
|
+
const versionResponse = await getSkillVersion(owner, name, resolved);
|
|
3694
3968
|
if (versionResponse.status !== 200 || !versionResponse.data) {
|
|
3695
3969
|
const errorMessage = extractApiErrorMessage(
|
|
3696
3970
|
versionResponse,
|
|
@@ -3750,7 +4024,7 @@ Resolving ${missingGitHubDeps.length} GitHub dependency(ies)...
|
|
|
3750
4024
|
`
|
|
3751
4025
|
);
|
|
3752
4026
|
for (const { specifier, ref } of missingGitHubDeps) {
|
|
3753
|
-
const parsed =
|
|
4027
|
+
const parsed = parseGitHubSpecifier2(specifier);
|
|
3754
4028
|
if (!parsed) {
|
|
3755
4029
|
console.error(`Error: Invalid GitHub specifier: ${specifier}`);
|
|
3756
4030
|
continue;
|
|
@@ -3810,12 +4084,12 @@ Installing ${packageCount} registry skill(s)...
|
|
|
3810
4084
|
const installOrder = computeInstallOrder(packages);
|
|
3811
4085
|
const entries = installOrder.filter((name) => packages[name]).map((name) => [name, packages[name]]);
|
|
3812
4086
|
for (const [fullName, entry] of entries) {
|
|
3813
|
-
const
|
|
3814
|
-
if (!
|
|
4087
|
+
const parsedName = parseRegistrySpecifier2(fullName);
|
|
4088
|
+
if (!parsedName) {
|
|
3815
4089
|
console.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);
|
|
3816
4090
|
continue;
|
|
3817
4091
|
}
|
|
3818
|
-
const
|
|
4092
|
+
const { namespace: ns, owner: pkgOwner, name, subname } = parsedName;
|
|
3819
4093
|
console.log(`Installing ${fullName}@${entry.version}...`);
|
|
3820
4094
|
let tarballBuffer;
|
|
3821
4095
|
let fromCache = false;
|
|
@@ -3864,7 +4138,21 @@ Installing ${packageCount} registry skill(s)...
|
|
|
3864
4138
|
}
|
|
3865
4139
|
await writeToCache(cacheDir, entry.integrity, tarballBuffer);
|
|
3866
4140
|
}
|
|
3867
|
-
const
|
|
4141
|
+
const effectiveSkillName = subname ?? name;
|
|
4142
|
+
let destDir;
|
|
4143
|
+
if (ns === "org") {
|
|
4144
|
+
destDir = join(skillsDir, "_org", pkgOwner, effectiveSkillName);
|
|
4145
|
+
} else if (ns === "github" && subname) {
|
|
4146
|
+
destDir = join(
|
|
4147
|
+
skillsDir,
|
|
4148
|
+
"_github-registry",
|
|
4149
|
+
pkgOwner,
|
|
4150
|
+
name,
|
|
4151
|
+
subname
|
|
4152
|
+
);
|
|
4153
|
+
} else {
|
|
4154
|
+
destDir = join(skillsDir, pkgOwner, effectiveSkillName);
|
|
4155
|
+
}
|
|
3868
4156
|
await rm(destDir, { recursive: true, force: true });
|
|
3869
4157
|
await mkdir(destDir, { recursive: true });
|
|
3870
4158
|
const tempFile = join(destDir, ".temp.tgz");
|
|
@@ -3882,9 +4170,10 @@ Installing ${packageCount} registry skill(s)...
|
|
|
3882
4170
|
console.log(
|
|
3883
4171
|
` Installed to ${destDir}${fromCache ? " (from cache)" : ""}`
|
|
3884
4172
|
);
|
|
4173
|
+
const pathSkillName = ns === "github" && subname ? `${name}/${subname}` : name;
|
|
3885
4174
|
installedSkills.push({
|
|
3886
|
-
name,
|
|
3887
|
-
sourcePath: getRegistrySkillPath(
|
|
4175
|
+
name: effectiveSkillName,
|
|
4176
|
+
sourcePath: getRegistrySkillPath(ns, pkgOwner, pathSkillName)
|
|
3888
4177
|
});
|
|
3889
4178
|
}
|
|
3890
4179
|
}
|
|
@@ -3895,7 +4184,7 @@ Installing ${packageCount} registry skill(s)...
|
|
|
3895
4184
|
Installing ${githubCount} GitHub skill(s)...
|
|
3896
4185
|
`);
|
|
3897
4186
|
for (const [specifier, entry] of Object.entries(githubPackages)) {
|
|
3898
|
-
const parsed =
|
|
4187
|
+
const parsed = parseGitHubSpecifier2(specifier);
|
|
3899
4188
|
if (!parsed) {
|
|
3900
4189
|
console.warn(
|
|
3901
4190
|
`Warning: Invalid GitHub specifier in lockfile: ${specifier}`
|
|
@@ -3950,7 +4239,7 @@ Installing ${githubCount} GitHub skill(s)...
|
|
|
3950
4239
|
console.log(
|
|
3951
4240
|
` Installed to ${destPath}${fromCache ? " (from cache)" : ""}`
|
|
3952
4241
|
);
|
|
3953
|
-
const skillName =
|
|
4242
|
+
const skillName = getGitHubSkillName2(parsed);
|
|
3954
4243
|
installedSkills.push({
|
|
3955
4244
|
name: skillName,
|
|
3956
4245
|
sourcePath: getGitHubSkillPath(
|
|
@@ -3996,8 +4285,8 @@ All ${totalCount} skill(s) installed.`);
|
|
|
3996
4285
|
// src/commands/link.ts
|
|
3997
4286
|
init_agents();
|
|
3998
4287
|
init_lib();
|
|
3999
|
-
|
|
4000
|
-
|
|
4288
|
+
init_lockfile3();
|
|
4289
|
+
init_manifest3();
|
|
4001
4290
|
init_symlinks();
|
|
4002
4291
|
async function link(options) {
|
|
4003
4292
|
try {
|
|
@@ -4025,26 +4314,32 @@ async function link(options) {
|
|
|
4025
4314
|
const skills = [];
|
|
4026
4315
|
const registrySkills = await listLockfileSkills();
|
|
4027
4316
|
for (const { name } of registrySkills) {
|
|
4028
|
-
const parsed =
|
|
4317
|
+
const parsed = parseRegistrySpecifier2(name);
|
|
4029
4318
|
if (!parsed) {
|
|
4030
4319
|
console.warn(`Warning: Invalid skill name in lockfile: ${name}`);
|
|
4031
4320
|
continue;
|
|
4032
4321
|
}
|
|
4322
|
+
const effectiveName = parsed.subname ?? parsed.name;
|
|
4323
|
+
const pathName = parsed.namespace === "github" && parsed.subname ? `${parsed.name}/${parsed.subname}` : parsed.name;
|
|
4033
4324
|
skills.push({
|
|
4034
|
-
name:
|
|
4035
|
-
sourcePath: getRegistrySkillPath(
|
|
4325
|
+
name: effectiveName,
|
|
4326
|
+
sourcePath: getRegistrySkillPath(
|
|
4327
|
+
parsed.namespace,
|
|
4328
|
+
parsed.owner,
|
|
4329
|
+
pathName
|
|
4330
|
+
)
|
|
4036
4331
|
});
|
|
4037
4332
|
}
|
|
4038
4333
|
const githubSkills = await listLockfileGitHubPackages();
|
|
4039
4334
|
for (const { specifier } of githubSkills) {
|
|
4040
|
-
const parsed =
|
|
4335
|
+
const parsed = parseGitHubSpecifier2(specifier);
|
|
4041
4336
|
if (!parsed) {
|
|
4042
4337
|
console.warn(
|
|
4043
4338
|
`Warning: Invalid GitHub specifier in lockfile: ${specifier}`
|
|
4044
4339
|
);
|
|
4045
4340
|
continue;
|
|
4046
4341
|
}
|
|
4047
|
-
const skillName =
|
|
4342
|
+
const skillName = getGitHubSkillName2(parsed);
|
|
4048
4343
|
skills.push({
|
|
4049
4344
|
name: skillName,
|
|
4050
4345
|
sourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path)
|
|
@@ -4079,8 +4374,8 @@ async function link(options) {
|
|
|
4079
4374
|
// src/commands/list.ts
|
|
4080
4375
|
init_agents();
|
|
4081
4376
|
init_lib();
|
|
4082
|
-
|
|
4083
|
-
|
|
4377
|
+
init_lockfile3();
|
|
4378
|
+
init_manifest3();
|
|
4084
4379
|
init_symlinks();
|
|
4085
4380
|
async function list(options) {
|
|
4086
4381
|
try {
|
|
@@ -4097,10 +4392,15 @@ async function list(options) {
|
|
|
4097
4392
|
const projectRoot = process.cwd();
|
|
4098
4393
|
const skills = [];
|
|
4099
4394
|
for (const { name: fullName, entry } of registrySkills) {
|
|
4100
|
-
const
|
|
4101
|
-
if (!
|
|
4102
|
-
const
|
|
4103
|
-
const
|
|
4395
|
+
const parsed = parseRegistrySpecifier2(fullName);
|
|
4396
|
+
if (!parsed) continue;
|
|
4397
|
+
const skillName = parsed.subname ?? parsed.name;
|
|
4398
|
+
const pathName = parsed.namespace === "github" && parsed.subname ? `${parsed.name}/${parsed.subname}` : parsed.name;
|
|
4399
|
+
const sourcePath = getRegistrySkillPath(
|
|
4400
|
+
parsed.namespace,
|
|
4401
|
+
parsed.owner,
|
|
4402
|
+
pathName
|
|
4403
|
+
);
|
|
4104
4404
|
const absolutePath = join(projectRoot, sourcePath);
|
|
4105
4405
|
let status = "installed";
|
|
4106
4406
|
try {
|
|
@@ -4125,10 +4425,10 @@ async function list(options) {
|
|
|
4125
4425
|
});
|
|
4126
4426
|
}
|
|
4127
4427
|
for (const { specifier, entry } of githubSkills) {
|
|
4128
|
-
const parsed =
|
|
4428
|
+
const parsed = parseGitHubSpecifier2(specifier);
|
|
4129
4429
|
if (!parsed) continue;
|
|
4130
4430
|
const ghEntry = entry;
|
|
4131
|
-
const skillName =
|
|
4431
|
+
const skillName = getGitHubSkillName2(parsed);
|
|
4132
4432
|
const sourcePath = getGitHubSkillPath(
|
|
4133
4433
|
parsed.owner,
|
|
4134
4434
|
parsed.repo,
|
|
@@ -4442,7 +4742,7 @@ async function logout() {
|
|
|
4442
4742
|
|
|
4443
4743
|
// src/commands/migrate.ts
|
|
4444
4744
|
init_config();
|
|
4445
|
-
|
|
4745
|
+
init_lockfile3();
|
|
4446
4746
|
async function migrate(options) {
|
|
4447
4747
|
try {
|
|
4448
4748
|
const legacySkillsDir = getLegacySkillsDir();
|
|
@@ -4542,20 +4842,20 @@ async function migrate(options) {
|
|
|
4542
4842
|
process.exit(1);
|
|
4543
4843
|
}
|
|
4544
4844
|
}
|
|
4545
|
-
function
|
|
4546
|
-
const sorted = availableVersions.filter((v) =>
|
|
4845
|
+
function resolveVersion3(range, availableVersions) {
|
|
4846
|
+
const sorted = availableVersions.filter((v) => semver2.valid(v)).sort((a, b) => semver2.rcompare(a, b));
|
|
4547
4847
|
if (range === "latest") {
|
|
4548
4848
|
return sorted[0] ?? null;
|
|
4549
4849
|
}
|
|
4550
|
-
return
|
|
4850
|
+
return semver2.maxSatisfying(sorted, range);
|
|
4551
4851
|
}
|
|
4552
|
-
function
|
|
4553
|
-
return
|
|
4852
|
+
function compareVersions3(a, b) {
|
|
4853
|
+
return semver2.compare(a, b);
|
|
4554
4854
|
}
|
|
4555
|
-
function
|
|
4556
|
-
const
|
|
4557
|
-
if (
|
|
4558
|
-
return
|
|
4855
|
+
function getLatestVersion3(versions) {
|
|
4856
|
+
const valid5 = versions.filter((v) => semver2.valid(v));
|
|
4857
|
+
if (valid5.length === 0) return null;
|
|
4858
|
+
return valid5.sort((a, b) => semver2.rcompare(a, b))[0];
|
|
4559
4859
|
}
|
|
4560
4860
|
|
|
4561
4861
|
// ../../packages/server/skill-registry/src/client/outdated.ts
|
|
@@ -4588,14 +4888,14 @@ function createOutdatedChecker(config2) {
|
|
|
4588
4888
|
const versions = await fetchRegistryVersions(username, name);
|
|
4589
4889
|
const versionStrings = versions.map((v) => v.version);
|
|
4590
4890
|
const range = versionRange || "*";
|
|
4591
|
-
const wanted =
|
|
4592
|
-
const latest =
|
|
4891
|
+
const wanted = resolveVersion3(range, versionStrings);
|
|
4892
|
+
const latest = getLatestVersion3(versionStrings);
|
|
4593
4893
|
const currentVersionInfo = versions.find(
|
|
4594
4894
|
(v) => v.version === entry.version
|
|
4595
4895
|
);
|
|
4596
4896
|
const deprecated = currentVersionInfo?.deprecationMessage ?? void 0;
|
|
4597
|
-
const isOutdated = wanted !== null &&
|
|
4598
|
-
const wantedBehindLatest = wanted !== null && latest !== null &&
|
|
4897
|
+
const isOutdated = wanted !== null && compareVersions3(entry.version, wanted) < 0 || latest !== null && compareVersions3(entry.version, latest) < 0;
|
|
4898
|
+
const wantedBehindLatest = wanted !== null && latest !== null && compareVersions3(wanted, latest) < 0;
|
|
4599
4899
|
return {
|
|
4600
4900
|
name: specifier,
|
|
4601
4901
|
current: entry.version,
|
|
@@ -4728,8 +5028,8 @@ async function checkOutdated(config2, options) {
|
|
|
4728
5028
|
|
|
4729
5029
|
// src/commands/outdated.ts
|
|
4730
5030
|
init_config();
|
|
4731
|
-
|
|
4732
|
-
|
|
5031
|
+
init_lockfile3();
|
|
5032
|
+
init_manifest3();
|
|
4733
5033
|
async function outdated(packages, options) {
|
|
4734
5034
|
try {
|
|
4735
5035
|
const lockfile = await readLockfile();
|
|
@@ -4937,8 +5237,8 @@ async function publishCommand(options) {
|
|
|
4937
5237
|
dependencies: manifest.dependencies
|
|
4938
5238
|
};
|
|
4939
5239
|
if (options.bump) {
|
|
4940
|
-
const
|
|
4941
|
-
const newVersion =
|
|
5240
|
+
const semver6 = await import('semver');
|
|
5241
|
+
const newVersion = semver6.default.inc(packageJson2.version, options.bump);
|
|
4942
5242
|
if (!newVersion) {
|
|
4943
5243
|
console.error(
|
|
4944
5244
|
`Error: Failed to bump version from ${packageJson2.version}`
|
|
@@ -5067,7 +5367,7 @@ async function publishCommand(options) {
|
|
|
5067
5367
|
const visibility = result.skill.visibility;
|
|
5068
5368
|
const visibilityIcon = visibility === "public" ? "\u{1F310}" : "\u{1F512}";
|
|
5069
5369
|
console.log(
|
|
5070
|
-
`+
|
|
5370
|
+
`+ @${result.skill.namespace ?? "user"}/${result.skill.username}/${result.skill.name}@${result.version.version}`
|
|
5071
5371
|
);
|
|
5072
5372
|
console.log(`Checksum: ${result.version.checksum}`);
|
|
5073
5373
|
console.log(`Visibility: ${visibilityIcon} ${visibility}`);
|
|
@@ -5094,17 +5394,17 @@ async function publishCommand(options) {
|
|
|
5094
5394
|
init_agents();
|
|
5095
5395
|
init_config();
|
|
5096
5396
|
init_lib();
|
|
5097
|
-
|
|
5098
|
-
|
|
5397
|
+
init_lockfile3();
|
|
5398
|
+
init_manifest3();
|
|
5099
5399
|
init_symlinks();
|
|
5100
5400
|
async function remove(nameOrSpecifier) {
|
|
5101
5401
|
try {
|
|
5102
5402
|
const manifest = await readManifest();
|
|
5103
5403
|
const agentConfigs = manifest?.agents;
|
|
5104
5404
|
const agents = getAvailableAgents(agentConfigs);
|
|
5105
|
-
if (
|
|
5405
|
+
if (isGitHubSpecifier2(nameOrSpecifier)) {
|
|
5106
5406
|
await removeGitHub(nameOrSpecifier, agents, agentConfigs);
|
|
5107
|
-
} else if (nameOrSpecifier
|
|
5407
|
+
} else if (isRegistrySpecifier2(nameOrSpecifier)) {
|
|
5108
5408
|
await removeRegistry(nameOrSpecifier, agents, agentConfigs);
|
|
5109
5409
|
} else {
|
|
5110
5410
|
await removeByShortName(nameOrSpecifier, agents, agentConfigs);
|
|
@@ -5116,14 +5416,13 @@ async function remove(nameOrSpecifier) {
|
|
|
5116
5416
|
}
|
|
5117
5417
|
}
|
|
5118
5418
|
async function removeRegistry(specifier, agents, agentConfigs) {
|
|
5119
|
-
const
|
|
5120
|
-
if (!
|
|
5419
|
+
const parsed = parseRegistrySpecifier2(specifier);
|
|
5420
|
+
if (!parsed) {
|
|
5121
5421
|
console.error(`Error: Invalid skill specifier: ${specifier}`);
|
|
5122
5422
|
process.exit(1);
|
|
5123
5423
|
}
|
|
5124
|
-
const
|
|
5125
|
-
const
|
|
5126
|
-
const name = match[2];
|
|
5424
|
+
const { namespace, owner, name } = parsed;
|
|
5425
|
+
const fullName = `@${namespace}/${owner}/${name}`;
|
|
5127
5426
|
console.log(`Removing ${fullName}...`);
|
|
5128
5427
|
const removedFromLockfile = await removeFromLockfile(fullName);
|
|
5129
5428
|
const removedFromManifest = await removeDependency(fullName);
|
|
@@ -5137,7 +5436,7 @@ async function removeRegistry(specifier, agents, agentConfigs) {
|
|
|
5137
5436
|
agentConfigs
|
|
5138
5437
|
});
|
|
5139
5438
|
const skillsDir = getSkillsDir();
|
|
5140
|
-
const destDir = join(skillsDir,
|
|
5439
|
+
const destDir = namespace === "org" ? join(skillsDir, "_org", owner, name) : join(skillsDir, owner, name);
|
|
5141
5440
|
try {
|
|
5142
5441
|
await rm(destDir, { recursive: true, force: true });
|
|
5143
5442
|
} catch {
|
|
@@ -5145,7 +5444,7 @@ async function removeRegistry(specifier, agents, agentConfigs) {
|
|
|
5145
5444
|
console.log(`Removed ${fullName}`);
|
|
5146
5445
|
}
|
|
5147
5446
|
async function removeGitHub(specifier, agents, agentConfigs) {
|
|
5148
|
-
const parsed =
|
|
5447
|
+
const parsed = parseGitHubSpecifier2(specifier);
|
|
5149
5448
|
if (!parsed) {
|
|
5150
5449
|
console.error(`Error: Invalid GitHub specifier: ${specifier}`);
|
|
5151
5450
|
process.exit(1);
|
|
@@ -5158,7 +5457,7 @@ async function removeGitHub(specifier, agents, agentConfigs) {
|
|
|
5158
5457
|
console.error(`Error: ${lockfileKey} not found in lockfile or pspm.json`);
|
|
5159
5458
|
process.exit(1);
|
|
5160
5459
|
}
|
|
5161
|
-
const skillName =
|
|
5460
|
+
const skillName = getGitHubSkillName2(parsed);
|
|
5162
5461
|
await removeAgentSymlinks(skillName, {
|
|
5163
5462
|
agents,
|
|
5164
5463
|
projectRoot: process.cwd(),
|
|
@@ -5176,8 +5475,8 @@ async function removeGitHub(specifier, agents, agentConfigs) {
|
|
|
5176
5475
|
async function removeByShortName(shortName, agents, agentConfigs) {
|
|
5177
5476
|
const registrySkills = await listLockfileSkills();
|
|
5178
5477
|
const foundRegistry = registrySkills.find((s) => {
|
|
5179
|
-
const
|
|
5180
|
-
return
|
|
5478
|
+
const parsed = parseRegistrySpecifier2(s.name);
|
|
5479
|
+
return parsed && parsed.name === shortName;
|
|
5181
5480
|
});
|
|
5182
5481
|
if (foundRegistry) {
|
|
5183
5482
|
await removeRegistry(foundRegistry.name, agents, agentConfigs);
|
|
@@ -5185,9 +5484,9 @@ async function removeByShortName(shortName, agents, agentConfigs) {
|
|
|
5185
5484
|
}
|
|
5186
5485
|
const githubSkills = await listLockfileGitHubPackages();
|
|
5187
5486
|
const foundGitHub = githubSkills.find((s) => {
|
|
5188
|
-
const parsed =
|
|
5487
|
+
const parsed = parseGitHubSpecifier2(s.specifier);
|
|
5189
5488
|
if (!parsed) return false;
|
|
5190
|
-
return
|
|
5489
|
+
return getGitHubSkillName2(parsed) === shortName;
|
|
5191
5490
|
});
|
|
5192
5491
|
if (foundGitHub) {
|
|
5193
5492
|
await removeGitHub(foundGitHub.specifier, agents, agentConfigs);
|
|
@@ -5240,7 +5539,7 @@ async function search(query, options) {
|
|
|
5240
5539
|
return;
|
|
5241
5540
|
}
|
|
5242
5541
|
for (const skill of skills) {
|
|
5243
|
-
const name =
|
|
5542
|
+
const name = `@${skill.namespace ?? "user"}/${skill.username}/${skill.name}`;
|
|
5244
5543
|
const desc = skill.description ? ` - ${skill.description.slice(0, 80)}${skill.description.length > 80 ? "..." : ""}` : "";
|
|
5245
5544
|
const downloads = skill.totalDownloads > 0 ? ` (${formatDownloads(skill.totalDownloads)} downloads)` : "";
|
|
5246
5545
|
console.log(` ${name}${downloads}`);
|
|
@@ -5260,7 +5559,7 @@ ${total} skill(s) found.`);
|
|
|
5260
5559
|
const first = skills[0];
|
|
5261
5560
|
console.log(
|
|
5262
5561
|
`
|
|
5263
|
-
Install with: pspm add
|
|
5562
|
+
Install with: pspm add @${first.namespace ?? "user"}/${first.username}/${first.name}`
|
|
5264
5563
|
);
|
|
5265
5564
|
}
|
|
5266
5565
|
} catch (error) {
|
|
@@ -5288,14 +5587,19 @@ async function unpublish(specifier, options) {
|
|
|
5288
5587
|
try {
|
|
5289
5588
|
const apiKey = await requireApiKey();
|
|
5290
5589
|
const registryUrl = await getRegistryUrl();
|
|
5291
|
-
const parsed =
|
|
5590
|
+
const parsed = parseRegistrySpecifier2(specifier);
|
|
5292
5591
|
if (!parsed) {
|
|
5293
5592
|
console.error(
|
|
5294
|
-
`Error: Invalid skill specifier "${specifier}". Use format: @user/{username}/{name}[@{version}]`
|
|
5593
|
+
`Error: Invalid skill specifier "${specifier}". Use format: @user/{username}/{name}[@{version}] or @org/{orgname}/{name}[@{version}]`
|
|
5295
5594
|
);
|
|
5296
5595
|
process.exit(1);
|
|
5297
5596
|
}
|
|
5298
|
-
const {
|
|
5597
|
+
const { owner, name, versionRange } = parsed;
|
|
5598
|
+
const fullName = generateRegistryIdentifier2({
|
|
5599
|
+
namespace: parsed.namespace,
|
|
5600
|
+
owner,
|
|
5601
|
+
name
|
|
5602
|
+
});
|
|
5299
5603
|
configure2({ registryUrl, apiKey });
|
|
5300
5604
|
if (versionRange) {
|
|
5301
5605
|
console.log(`Unpublishing ${specifier}...`);
|
|
@@ -5305,7 +5609,7 @@ async function unpublish(specifier, options) {
|
|
|
5305
5609
|
);
|
|
5306
5610
|
process.exit(1);
|
|
5307
5611
|
}
|
|
5308
|
-
const response = await deleteSkillVersion(
|
|
5612
|
+
const response = await deleteSkillVersion(owner, name, versionRange);
|
|
5309
5613
|
if (response.status !== 200) {
|
|
5310
5614
|
const errorMessage = extractApiErrorMessage(
|
|
5311
5615
|
response,
|
|
@@ -5314,16 +5618,16 @@ async function unpublish(specifier, options) {
|
|
|
5314
5618
|
console.error(`Error: ${errorMessage}`);
|
|
5315
5619
|
process.exit(1);
|
|
5316
5620
|
}
|
|
5317
|
-
console.log(`Unpublished
|
|
5621
|
+
console.log(`Unpublished ${fullName}@${versionRange}`);
|
|
5318
5622
|
} else {
|
|
5319
|
-
console.log(`Unpublishing all versions of
|
|
5623
|
+
console.log(`Unpublishing all versions of ${fullName}...`);
|
|
5320
5624
|
if (!options.force) {
|
|
5321
5625
|
console.error(
|
|
5322
5626
|
"Warning: This will delete ALL versions. Use --force to confirm."
|
|
5323
5627
|
);
|
|
5324
5628
|
process.exit(1);
|
|
5325
5629
|
}
|
|
5326
|
-
const response = await deleteSkill(
|
|
5630
|
+
const response = await deleteSkill(owner, name);
|
|
5327
5631
|
if (response.status !== 200) {
|
|
5328
5632
|
const errorMessage = extractApiErrorMessage(
|
|
5329
5633
|
response,
|
|
@@ -5332,7 +5636,7 @@ async function unpublish(specifier, options) {
|
|
|
5332
5636
|
console.error(`Error: ${errorMessage}`);
|
|
5333
5637
|
process.exit(1);
|
|
5334
5638
|
}
|
|
5335
|
-
console.log(`Unpublished
|
|
5639
|
+
console.log(`Unpublished ${fullName} (all versions)`);
|
|
5336
5640
|
}
|
|
5337
5641
|
} catch (error) {
|
|
5338
5642
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
@@ -5346,7 +5650,7 @@ init_api_client();
|
|
|
5346
5650
|
init_config();
|
|
5347
5651
|
init_errors();
|
|
5348
5652
|
init_lib();
|
|
5349
|
-
|
|
5653
|
+
init_lockfile3();
|
|
5350
5654
|
init_add();
|
|
5351
5655
|
async function update(options) {
|
|
5352
5656
|
try {
|
|
@@ -5362,11 +5666,13 @@ async function update(options) {
|
|
|
5362
5666
|
const updates = [];
|
|
5363
5667
|
console.log("Checking for updates...\n");
|
|
5364
5668
|
for (const { name, entry } of skills) {
|
|
5365
|
-
const
|
|
5366
|
-
if (!
|
|
5367
|
-
const [, username, skillName] = match;
|
|
5669
|
+
const parsed = parseRegistrySpecifier2(name);
|
|
5670
|
+
if (!parsed) continue;
|
|
5368
5671
|
try {
|
|
5369
|
-
const versionsResponse = await listSkillVersions(
|
|
5672
|
+
const versionsResponse = await listSkillVersions(
|
|
5673
|
+
parsed.owner,
|
|
5674
|
+
parsed.name
|
|
5675
|
+
);
|
|
5370
5676
|
if (versionsResponse.status !== 200) {
|
|
5371
5677
|
const errorMessage = extractApiErrorMessage(
|
|
5372
5678
|
versionsResponse,
|
|
@@ -5380,7 +5686,7 @@ async function update(options) {
|
|
|
5380
5686
|
const versionStrings = versions.map(
|
|
5381
5687
|
(v) => v.version
|
|
5382
5688
|
);
|
|
5383
|
-
const latest =
|
|
5689
|
+
const latest = resolveVersion2("*", versionStrings);
|
|
5384
5690
|
if (latest && latest !== entry.version) {
|
|
5385
5691
|
updates.push({
|
|
5386
5692
|
name,
|
|
@@ -5405,11 +5711,10 @@ async function update(options) {
|
|
|
5405
5711
|
return;
|
|
5406
5712
|
}
|
|
5407
5713
|
console.log("\nUpdating...\n");
|
|
5408
|
-
for (const { name, latest } of updates) {
|
|
5409
|
-
const
|
|
5410
|
-
if (!
|
|
5411
|
-
const
|
|
5412
|
-
const specifier = `@user/${username}/${skillName}@${latest}`;
|
|
5714
|
+
for (const { name: pkgName, latest } of updates) {
|
|
5715
|
+
const parsed = parseRegistrySpecifier2(pkgName);
|
|
5716
|
+
if (!parsed) continue;
|
|
5717
|
+
const specifier = `${pkgName}@${latest}`;
|
|
5413
5718
|
await add([specifier], {});
|
|
5414
5719
|
}
|
|
5415
5720
|
console.log("\nAll skills updated.");
|
|
@@ -5424,12 +5729,12 @@ async function upgrade() {
|
|
|
5424
5729
|
try {
|
|
5425
5730
|
const currentVersion = getCurrentVersion();
|
|
5426
5731
|
console.log("Checking for updates...\n");
|
|
5427
|
-
const latestVersion =
|
|
5732
|
+
const latestVersion = getLatestVersion4(packageName);
|
|
5428
5733
|
if (!latestVersion) {
|
|
5429
5734
|
console.error("Error: Could not fetch latest version from registry.");
|
|
5430
5735
|
process.exit(1);
|
|
5431
5736
|
}
|
|
5432
|
-
if (currentVersion
|
|
5737
|
+
if (semver2.valid(currentVersion) && semver2.valid(latestVersion) && !semver2.gt(latestVersion, currentVersion)) {
|
|
5433
5738
|
console.log(`Already on the latest version: ${currentVersion}`);
|
|
5434
5739
|
return;
|
|
5435
5740
|
}
|
|
@@ -5462,7 +5767,7 @@ function getCurrentVersion() {
|
|
|
5462
5767
|
return "unknown";
|
|
5463
5768
|
}
|
|
5464
5769
|
}
|
|
5465
|
-
function
|
|
5770
|
+
function getLatestVersion4(packageName) {
|
|
5466
5771
|
try {
|
|
5467
5772
|
const output = execSync(`npm view ${packageName} version`, {
|
|
5468
5773
|
encoding: "utf-8",
|
|
@@ -5514,7 +5819,7 @@ function getInstallCommand(pm, packageName, version3) {
|
|
|
5514
5819
|
}
|
|
5515
5820
|
|
|
5516
5821
|
// src/commands/version.ts
|
|
5517
|
-
|
|
5822
|
+
init_manifest3();
|
|
5518
5823
|
async function version(bump, options = {}) {
|
|
5519
5824
|
try {
|
|
5520
5825
|
const manifest = await readManifest();
|
|
@@ -5530,7 +5835,7 @@ async function version(bump, options = {}) {
|
|
|
5530
5835
|
);
|
|
5531
5836
|
process.exit(1);
|
|
5532
5837
|
}
|
|
5533
|
-
if (!
|
|
5838
|
+
if (!semver2__default.valid(manifest.version)) {
|
|
5534
5839
|
console.error(
|
|
5535
5840
|
`Error: Current version "${manifest.version}" is not valid semver.`
|
|
5536
5841
|
);
|
|
@@ -5539,7 +5844,7 @@ async function version(bump, options = {}) {
|
|
|
5539
5844
|
);
|
|
5540
5845
|
process.exit(1);
|
|
5541
5846
|
}
|
|
5542
|
-
const newVersion =
|
|
5847
|
+
const newVersion = semver2__default.inc(manifest.version, bump);
|
|
5543
5848
|
if (!newVersion) {
|
|
5544
5849
|
console.error(`Error: Failed to bump version from ${manifest.version}`);
|
|
5545
5850
|
process.exit(1);
|
|
@@ -5585,6 +5890,9 @@ async function whoami() {
|
|
|
5585
5890
|
process.exit(1);
|
|
5586
5891
|
}
|
|
5587
5892
|
}
|
|
5893
|
+
|
|
5894
|
+
// src/update-notifier.ts
|
|
5895
|
+
init_version2();
|
|
5588
5896
|
var PACKAGE_NAME = "@anytio/pspm";
|
|
5589
5897
|
var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
|
|
5590
5898
|
var CACHE_DIR = join(homedir(), ".pspm");
|
|
@@ -5593,7 +5901,7 @@ async function checkForUpdates(currentVersion) {
|
|
|
5593
5901
|
try {
|
|
5594
5902
|
const cache = await readCache();
|
|
5595
5903
|
if (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {
|
|
5596
|
-
if (cache.latestVersion
|
|
5904
|
+
if (isNewerVersion2(cache.latestVersion, currentVersion)) {
|
|
5597
5905
|
printUpdateWarning(currentVersion, cache.latestVersion);
|
|
5598
5906
|
}
|
|
5599
5907
|
return;
|
|
@@ -5628,7 +5936,7 @@ function fetchAndCache(currentVersion) {
|
|
|
5628
5936
|
};
|
|
5629
5937
|
writeCache(cache).catch(() => {
|
|
5630
5938
|
});
|
|
5631
|
-
if (latestVersion
|
|
5939
|
+
if (isNewerVersion2(latestVersion, currentVersion)) {
|
|
5632
5940
|
printUpdateWarning(currentVersion, latestVersion);
|
|
5633
5941
|
}
|
|
5634
5942
|
} catch {
|
|
@@ -5650,7 +5958,7 @@ var packageJson = JSON.parse(
|
|
|
5650
5958
|
);
|
|
5651
5959
|
var version2 = packageJson.version;
|
|
5652
5960
|
var program = new Command();
|
|
5653
|
-
program.name("pspm").description("
|
|
5961
|
+
program.name("pspm").description("Package manager for AI agent skills").version(version2);
|
|
5654
5962
|
var configCmd = program.command("config").description("Manage PSPM configuration");
|
|
5655
5963
|
configCmd.command("show").description("Show resolved configuration").action(async () => {
|
|
5656
5964
|
await configShow();
|
|
@@ -5794,6 +6102,9 @@ program.command("deprecate <specifier> [message]").description(
|
|
|
5794
6102
|
await deprecate(specifier, message, { undo: options.undo });
|
|
5795
6103
|
});
|
|
5796
6104
|
await program.parseAsync();
|
|
5797
|
-
|
|
6105
|
+
var executedCommand = program.args[0];
|
|
6106
|
+
if (executedCommand !== "upgrade") {
|
|
6107
|
+
await checkForUpdates(version2);
|
|
6108
|
+
}
|
|
5798
6109
|
//# sourceMappingURL=index.js.map
|
|
5799
6110
|
//# sourceMappingURL=index.js.map
|