@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/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 semver from 'semver';
9
- import semver__default from 'semver';
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
- function resolveVersion(range, availableVersions) {
790
- const sorted = availableVersions.filter((v) => semver.valid(v)).sort((a, b) => semver.rcompare(a, b));
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 semver.maxSatisfying(sorted, range);
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) => semver.valid(v)).sort((a, b) => semver.rcompare(a, b));
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) => semver.satisfies(version3, 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 init_version = __esm({
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 match = name.match(/^@user\/([^/]+)\/([^/]+)$/);
876
- if (!match) {
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
- const versionsResponse = await listSkillVersions(username, skillName);
887
- if (versionsResponse.status !== 200) {
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
- const versions = versionsResponse.data;
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 = versions.map((v) => v.version);
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
- const versionResponse = await getSkillVersion(
918
- username,
919
- skillName,
920
- resolvedVersion
921
- );
922
- if (versionResponse.status !== 200 || !versionResponse.data) {
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 versionInfo = versionResponse.data;
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: versionInfo.downloadUrl,
938
- integrity: `sha256-${Buffer.from(versionInfo.checksum, "hex").toString("base64")}`,
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: versionInfo.deprecationMessage ?? void 0
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 match = name.match(/^@user\/([^/]+)\/([^/]+)$/);
971
- if (!match) continue;
972
- const [, username, skillName] = match;
1125
+ const p2Parsed = parseRegistrySpecifier(name);
1126
+ if (!p2Parsed) continue;
973
1127
  try {
974
- const versionsResponse = await listSkillVersions(username, skillName);
975
- if (versionsResponse.status !== 200) continue;
976
- const versions = versionsResponse.data;
977
- const availableVersions = versions.map((v) => v.version);
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
- const versionResponse = await getSkillVersion(
997
- username,
998
- skillName,
999
- finalVersion
1000
- );
1001
- if (versionResponse.status === 200 && versionResponse.data) {
1002
- const versionInfo = versionResponse.data;
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 = versionInfo.downloadUrl;
1005
- node.integrity = `sha256-${Buffer.from(versionInfo.checksum, "hex").toString("base64")}`;
1006
- node.deprecated = versionInfo.deprecationMessage ?? void 0;
1007
- const manifest = versionInfo.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
- init_version();
1303
+ init_version2();
1124
1304
  MAX_DEPENDENCY_DEPTH = 5;
1125
1305
  }
1126
1306
  });
1127
1307
 
1128
1308
  // src/lib/specifier.ts
1129
- function parseSkillSpecifier(specifier) {
1130
- const match = specifier.match(SPECIFIER_PATTERN);
1309
+ function parseRegistrySpecifier2(specifier) {
1310
+ const match = specifier.match(REGISTRY_SPECIFIER_PATTERN2);
1131
1311
  if (!match) {
1132
1312
  return null;
1133
1313
  }
1134
- const username = match[1];
1135
- const name = match[2];
1136
- if (!username || !name) {
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
- username,
1329
+ namespace,
1330
+ owner,
1141
1331
  name,
1142
- versionRange: match[3]
1332
+ subname: subname || void 0,
1333
+ versionRange: versionRange || void 0
1143
1334
  };
1144
1335
  }
1145
- function parseGitHubSpecifier(specifier) {
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 formatGitHubSpecifier(spec) {
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 getGitHubSkillName(spec) {
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 isGitHubSpecifier(specifier) {
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 SPECIFIER_PATTERN, GITHUB_SPECIFIER_PATTERN, GITHUB_URL_TREE_PATTERN, GITHUB_URL_PATTERN, GITHUB_SHORTHAND_PATTERN;
1229
- var init_specifier = __esm({
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
- SPECIFIER_PATTERN = /^@user\/([a-zA-Z0-9_-]+)\/([a-z][a-z0-9_-]*)(?:@(.+))?$/;
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
- init_specifier();
1248
- init_version();
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 init_lockfile2 = __esm({
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 init_manifest2 = __esm({
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(username, skillName) {
2067
- return `.pspm/skills/${username}/${skillName}`;
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 isLocalSpecifier2(specifier) {
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 normalizeToFileSpecifier(path) {
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 (isLocalSpecifier2(specifier)) {
2524
+ if (isLocalSpecifier3(specifier)) {
2310
2525
  const resolved = await validateLocalPackage(specifier);
2311
2526
  resolvedPackages.push(resolved);
2312
- } else if (isGitHubSpecifier(specifier) || isGitHubUrl(specifier) || isGitHubShorthand(specifier)) {
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 = `@user/${pkg.username}/${pkg.name}`;
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 match = node.name.match(/^@user\/([^/]+)\/([^/]+)$/);
2491
- if (!match) {
2719
+ const parsed = parseRegistrySpecifier2(node.name);
2720
+ if (!parsed) {
2492
2721
  throw new Error(`Invalid package name: ${node.name}`);
2493
2722
  }
2494
- const [, username, name] = match;
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 destDir = join(skillsDir, username, name);
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(username, name)
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 = parseSkillSpecifier(specifier);
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 { username, name, versionRange } = parsed;
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
- const versionsResponse = await listSkillVersions(username, name);
2583
- if (versionsResponse.status !== 200) {
2584
- if (versionsResponse.status === 401) {
2585
- if (!apiKey) {
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
- `Package @user/${username}/${name} requires authentication. Please run 'pspm login' to authenticate`
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
- `Access denied to @user/${username}/${name}. You may not have permission to access this private package.`
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
- const errorMessage = extractApiErrorMessage(
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 @user/${username}/${name} not found`);
2864
+ throw new Error(`Skill ${fullName} not found`);
2603
2865
  }
2604
2866
  const versionStrings = versions.map((v) => v.version);
2605
- const resolvedVersion = resolveVersion(versionRange || "*", versionStrings);
2867
+ const resolvedVersion = resolveVersion2(versionRange || "*", versionStrings);
2606
2868
  if (!resolvedVersion) {
2607
2869
  throw new Error(
2608
- `No version matching "${versionRange || "latest"}" found for @user/${username}/${name}. Available versions: ${versionStrings.join(", ")}`
2870
+ `No version matching "${versionRange || "latest"}" found for ${fullName}. Available versions: ${versionStrings.join(", ")}`
2609
2871
  );
2610
2872
  }
2611
- const versionResponse = await getSkillVersion(
2612
- username,
2613
- name,
2614
- resolvedVersion
2615
- );
2616
- if (versionResponse.status !== 200 || !versionResponse.data) {
2617
- const errorMessage = extractApiErrorMessage(
2618
- versionResponse,
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
- throw new Error(errorMessage);
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 @user/${username}/${name}@${resolvedVersion}`);
2899
+ console.log(`Resolved ${fullName}@${resolvedVersion}`);
2624
2900
  return {
2625
2901
  type: "registry",
2626
2902
  specifier,
2627
- username,
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 (isGitHubSpecifier(specifier)) {
2639
- return parseGitHubSpecifier(specifier);
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 = formatGitHubSpecifier({
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 = getGitHubSkillName(parsed);
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 = normalizeToFileSpecifier(path);
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
- init_lockfile2();
2870
- init_manifest2();
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 isLocalSpecifier(specifier) {
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 (isGitHubSpecifier(specifier)) {
2900
- const ghSpec = parseGitHubSpecifier(specifier);
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 (isLocalSpecifier(specifier)) {
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 = parseSkillSpecifier(specifier);
3200
+ const parsed = parseRegistrySpecifier2(specifier);
2926
3201
  if (!parsed) {
2927
3202
  console.error(`Error: Invalid package specifier "${specifier}".`);
2928
- console.error(` Use format: @user/{username}/{name}`);
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.username;
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
- `+ @user/${result.username}/${result.name} is now ${result.visibility}`
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
- init_lockfile2();
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 = parseGitHubSpecifier(specifier);
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 = parseSkillSpecifier(specifier);
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 { username, name, versionRange } = parsed;
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
- `Removing deprecation from @user/${username}/${name}@${versionRange}...`
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 @user/${username}/${name}@${versionRange}...`);
3597
+ console.log(`Deprecating ${fullName}@${versionRange}...`);
3324
3598
  const response = await deprecateSkillVersion(
3325
- username,
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 @user/${username}/${name}@${versionRange}`);
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
- init_lockfile2();
3577
- init_manifest2();
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 = parseSkillSpecifier(fullName);
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 { username, name } = parsed;
3941
+ const { owner, name } = parsed;
3668
3942
  console.log(`Resolving ${fullName}@${versionRange}...`);
3669
- const versionsResponse = await listSkillVersions(username, name);
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 = resolveVersion(versionRange || "*", versionStrings);
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(username, name, resolved);
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 = parseGitHubSpecifier(specifier);
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 match = fullName.match(/^@user\/([^/]+)\/([^/]+)$/);
3814
- if (!match) {
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 [, username, name] = match;
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 destDir = join(skillsDir, username, name);
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(username, name)
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 = parseGitHubSpecifier(specifier);
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 = getGitHubSkillName(parsed);
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
- init_lockfile2();
4000
- init_manifest2();
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 = parseSkillSpecifier(name);
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: parsed.name,
4035
- sourcePath: getRegistrySkillPath(parsed.username, parsed.name)
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 = parseGitHubSpecifier(specifier);
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 = getGitHubSkillName(parsed);
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
- init_lockfile2();
4083
- init_manifest2();
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 match = fullName.match(/^@user\/([^/]+)\/([^/]+)$/);
4101
- if (!match) continue;
4102
- const [, username, skillName] = match;
4103
- const sourcePath = getRegistrySkillPath(username, skillName);
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 = parseGitHubSpecifier(specifier);
4428
+ const parsed = parseGitHubSpecifier2(specifier);
4129
4429
  if (!parsed) continue;
4130
4430
  const ghEntry = entry;
4131
- const skillName = getGitHubSkillName(parsed);
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
- init_lockfile2();
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 resolveVersion2(range, availableVersions) {
4546
- const sorted = availableVersions.filter((v) => semver.valid(v)).sort((a, b) => semver.rcompare(a, b));
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 semver.maxSatisfying(sorted, range);
4850
+ return semver2.maxSatisfying(sorted, range);
4551
4851
  }
4552
- function compareVersions2(a, b) {
4553
- return semver.compare(a, b);
4852
+ function compareVersions3(a, b) {
4853
+ return semver2.compare(a, b);
4554
4854
  }
4555
- function getLatestVersion2(versions) {
4556
- const valid3 = versions.filter((v) => semver.valid(v));
4557
- if (valid3.length === 0) return null;
4558
- return valid3.sort((a, b) => semver.rcompare(a, b))[0];
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 = resolveVersion2(range, versionStrings);
4592
- const latest = getLatestVersion2(versionStrings);
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 && compareVersions2(entry.version, wanted) < 0 || latest !== null && compareVersions2(entry.version, latest) < 0;
4598
- const wantedBehindLatest = wanted !== null && latest !== null && compareVersions2(wanted, latest) < 0;
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
- init_lockfile2();
4732
- init_manifest2();
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 semver4 = await import('semver');
4941
- const newVersion = semver4.default.inc(packageJson2.version, options.bump);
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
- `+ @user/${result.skill.username}/${result.skill.name}@${result.version.version}`
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
- init_lockfile2();
5098
- init_manifest2();
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 (isGitHubSpecifier(nameOrSpecifier)) {
5405
+ if (isGitHubSpecifier2(nameOrSpecifier)) {
5106
5406
  await removeGitHub(nameOrSpecifier, agents, agentConfigs);
5107
- } else if (nameOrSpecifier.startsWith("@user/")) {
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 match = specifier.match(/^@user\/([^/]+)\/([^@/]+)/);
5120
- if (!match) {
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 fullName = `@user/${match[1]}/${match[2]}`;
5125
- const username = match[1];
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, username, name);
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 = parseGitHubSpecifier(specifier);
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 = getGitHubSkillName(parsed);
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 match = s.name.match(/^@user\/([^/]+)\/([^/]+)$/);
5180
- return match && match[2] === shortName;
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 = parseGitHubSpecifier(s.specifier);
5487
+ const parsed = parseGitHubSpecifier2(s.specifier);
5189
5488
  if (!parsed) return false;
5190
- return getGitHubSkillName(parsed) === shortName;
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 = `@user/${skill.username}/${skill.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 @user/${first.username}/${first.name}`
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 = parseSkillSpecifier(specifier);
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 { username, name, versionRange } = parsed;
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(username, name, versionRange);
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 @user/${username}/${name}@${versionRange}`);
5621
+ console.log(`Unpublished ${fullName}@${versionRange}`);
5318
5622
  } else {
5319
- console.log(`Unpublishing all versions of @user/${username}/${name}...`);
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(username, name);
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 @user/${username}/${name} (all versions)`);
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
- init_lockfile2();
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 match = name.match(/^@user\/([^/]+)\/([^/]+)$/);
5366
- if (!match) continue;
5367
- const [, username, skillName] = match;
5669
+ const parsed = parseRegistrySpecifier2(name);
5670
+ if (!parsed) continue;
5368
5671
  try {
5369
- const versionsResponse = await listSkillVersions(username, skillName);
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 = resolveVersion("*", versionStrings);
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 match = name.match(/^@user\/([^/]+)\/([^/]+)$/);
5410
- if (!match) continue;
5411
- const [, username, skillName] = match;
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 = getLatestVersion3(packageName);
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 === latestVersion) {
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 getLatestVersion3(packageName) {
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
- init_manifest2();
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 (!semver__default.valid(manifest.version)) {
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 = semver__default.inc(manifest.version, bump);
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 !== currentVersion) {
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 !== currentVersion) {
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("Prompt Skill Package Manager for AI coding agents").version(version2);
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
- await checkForUpdates(version2);
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