@aipm-registry/cli 0.2.0 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.cjs CHANGED
@@ -8015,6 +8015,10 @@ function registryFetchError(registry, cause) {
8015
8015
  }
8016
8016
  return new Error(`Registry request failed (${registry}): ${msg}`);
8017
8017
  }
8018
+ function registryAuthHeaders(token) {
8019
+ if (!token) return void 0;
8020
+ return { Authorization: `Bearer ${token}` };
8021
+ }
8018
8022
  async function registryFetch(url, registry, init) {
8019
8023
  const timeoutSignal = typeof AbortSignal !== "undefined" && "timeout" in AbortSignal ? AbortSignal.timeout(1e4) : void 0;
8020
8024
  try {
@@ -8023,6 +8027,12 @@ async function registryFetch(url, registry, init) {
8023
8027
  throw registryFetchError(registry, e);
8024
8028
  }
8025
8029
  }
8030
+ function privateInstallHint(name, status, token) {
8031
+ if (status !== 404 || !name.startsWith("@") || token) {
8032
+ return `Package not found: ${name} (${status})`;
8033
+ }
8034
+ return `Package not found: ${name} (${status}). If @org/pkg is private, set AIPM_TOKEN with an install token from the dashboard.`;
8035
+ }
8026
8036
  async function assertRegistryReachable(registry) {
8027
8037
  const base = registry.replace(/\/$/, "");
8028
8038
  const res = await registryFetch(`${base}/health`, base);
@@ -8053,19 +8063,19 @@ async function searchPackages(registry, query, limit = 20) {
8053
8063
  const data = await res.json();
8054
8064
  return data.packages ?? [];
8055
8065
  }
8056
- async function fetchPackageMetadata(registry, name, version) {
8066
+ async function fetchPackageMetadata(registry, name, version, token) {
8057
8067
  const base = registry.replace(/\/$/, "");
8058
8068
  const url = `${base}/v1/packages/${encodePackageName(name)}/versions/${version}`;
8059
- const res = await registryFetch(url, base);
8060
- if (!res.ok) throw new Error(`Package not found: ${name}@${version} (${res.status})`);
8069
+ const res = await registryFetch(url, base, { headers: registryAuthHeaders(token) });
8070
+ if (!res.ok) throw new Error(privateInstallHint(`${name}@${version}`, res.status, token));
8061
8071
  const data = await res.json();
8062
- return { manifest: data.manifest, integrity: data.integrity };
8072
+ return { manifest: data.manifest, integrity: data.integrity, deprecated: data.deprecated ?? null };
8063
8073
  }
8064
- async function fetchPackageTarball(registry, name, version) {
8074
+ async function fetchPackageTarball(registry, name, version, token) {
8065
8075
  const base = registry.replace(/\/$/, "");
8066
8076
  const url = `${base}/v1/packages/${encodePackageName(name)}/versions/${version}/tarball`;
8067
- const res = await registryFetch(url, base);
8068
- if (!res.ok) throw new Error(`Tarball not found: ${name}@${version} (${res.status})`);
8077
+ const res = await registryFetch(url, base, { headers: registryAuthHeaders(token) });
8078
+ if (!res.ok) throw new Error(privateInstallHint(`${name}@${version}`, res.status, token));
8069
8079
  const ab = await res.arrayBuffer();
8070
8080
  return Buffer.from(ab);
8071
8081
  }
@@ -8163,11 +8173,17 @@ async function installOnePackage(options) {
8163
8173
  const configRoot = options.configRoot;
8164
8174
  const installRoot = options.installRoot ?? configRoot;
8165
8175
  await assertRegistryReachable(options.registry);
8166
- const { manifest, integrity: remoteIntegrity } = await fetchPackageMetadata(
8176
+ const { manifest, integrity: remoteIntegrity, deprecated } = await fetchPackageMetadata(
8167
8177
  options.registry,
8168
8178
  options.name,
8169
- options.version
8179
+ options.version,
8180
+ options.token
8170
8181
  );
8182
+ if (deprecated) {
8183
+ console.warn(
8184
+ `Warning: ${options.name} is deprecated${deprecated.message ? `: ${deprecated.message}` : ""}.`
8185
+ );
8186
+ }
8171
8187
  let explicitTarget = options.explicitTarget;
8172
8188
  let preferredTools = options.project.preferredTools;
8173
8189
  const { resolveInstallTools: resolveInstallTools2 } = await Promise.resolve().then(() => (init_dist4(), dist_exports));
@@ -8196,7 +8212,8 @@ async function installOnePackage(options) {
8196
8212
  const tarball = await fetchPackageTarball(
8197
8213
  options.registry,
8198
8214
  options.name,
8199
- options.version
8215
+ options.version,
8216
+ options.token
8200
8217
  );
8201
8218
  const skillMarkdown = await unpackTarballToBuffer(tarball, manifest.entry);
8202
8219
  const result = await installSkillPackage({
@@ -8543,6 +8560,26 @@ async function inferEntryFromSource(source, fallback) {
8543
8560
  if (entries.includes(fallback)) return fallback;
8544
8561
  return entries.find((entry) => entry.endsWith(".md")) ?? entries.find((entry) => entry.endsWith(".mdc")) ?? fallback;
8545
8562
  }
8563
+ async function copySourceIntoSkillRoot(source, root, sourceLabel) {
8564
+ const sourceInfo = await (0, import_promises9.stat)(source);
8565
+ await (0, import_promises9.mkdir)(root, { recursive: true });
8566
+ if (sourceInfo.isDirectory()) {
8567
+ const entries = await (0, import_promises9.readdir)(source);
8568
+ for (const entry of entries) {
8569
+ await (0, import_promises9.cp)((0, import_node_path11.join)(source, entry), (0, import_node_path11.join)(root, entry), {
8570
+ recursive: true,
8571
+ force: false,
8572
+ errorOnExist: true
8573
+ });
8574
+ }
8575
+ return;
8576
+ }
8577
+ if (sourceInfo.isFile()) {
8578
+ await (0, import_promises9.cp)(source, (0, import_node_path11.join)(root, (0, import_node_path11.basename)(source)), { force: false, errorOnExist: true });
8579
+ return;
8580
+ }
8581
+ throw new Error(`Unsupported source path: ${sourceLabel}`);
8582
+ }
8546
8583
  async function latestVersionForPackage(registry, name) {
8547
8584
  const packages = await searchPackages(registry, name, 20);
8548
8585
  const exact = packages.find((pkg) => pkg.name === name);
@@ -8694,10 +8731,9 @@ async function initSkill(opts) {
8694
8731
  if (!isValidScopeName(opts.name)) throw new Error("Invalid @scope/name");
8695
8732
  const root = opts.here ? (0, import_node_process5.cwd)() : (0, import_node_path11.resolve)((0, import_node_process5.cwd)(), opts.dir ?? skillFolderName(opts.name));
8696
8733
  const cdTarget = opts.here ? null : opts.dir ?? skillFolderName(opts.name);
8697
- await (0, import_promises9.mkdir)(root, { recursive: true });
8698
8734
  const source = opts.from ? (0, import_node_path11.resolve)(opts.from) : null;
8699
8735
  const entry = source ? await inferEntryFromSource(source, opts.entry) : opts.entry;
8700
- const manifest = {
8736
+ const manifest = PackageManifestSchema.parse({
8701
8737
  schemaVersion: "0.1",
8702
8738
  name: opts.name,
8703
8739
  version: opts.version,
@@ -8706,17 +8742,11 @@ async function initSkill(opts) {
8706
8742
  entry,
8707
8743
  targets: parseTargetsFlag(opts.targets),
8708
8744
  license: "Apache-2.0"
8709
- };
8710
- PackageManifestSchema.parse(manifest);
8745
+ });
8711
8746
  if (source) {
8712
- const sourceInfo = await (0, import_promises9.stat)(source);
8713
- if (sourceInfo.isDirectory()) {
8714
- await (0, import_promises9.cp)(source, root, { recursive: true, force: false, errorOnExist: true });
8715
- } else if (sourceInfo.isFile()) {
8716
- await (0, import_promises9.cp)(source, (0, import_node_path11.join)(root, (0, import_node_path11.basename)(source)), { force: false, errorOnExist: true });
8717
- } else {
8718
- throw new Error(`Unsupported source path: ${opts.from}`);
8719
- }
8747
+ await copySourceIntoSkillRoot(source, root, source);
8748
+ } else {
8749
+ await (0, import_promises9.mkdir)(root, { recursive: true });
8720
8750
  }
8721
8751
  await writeStarterFile((0, import_node_path11.join)(root, "aipm.manifest.json"), JSON.stringify(manifest, null, 2) + "\n");
8722
8752
  if (!opts.from) {
@@ -8824,7 +8854,7 @@ program2.command("config").description("Show resolved AIPM CLI and project confi
8824
8854
  console.log(`Installed packages: ${data.installedPackages.length}`);
8825
8855
  console.log(`Publish guide: ${data.publishDoc}`);
8826
8856
  });
8827
- program2.command("add <package>").description("Add and install a package @scope/name[@version]").option(GLOBAL_OPTION, GLOBAL_OPTION_DESC).option("--registry <url>", "Registry base URL").option("--target <tool>", "cursor, claude, or *").option("--ci", "Non-interactive; fail if prompt needed").action(async (pkgArg, opts) => {
8857
+ program2.command("add <package>").description("Add and install a package @scope/name[@version]").option(GLOBAL_OPTION, GLOBAL_OPTION_DESC).option("--registry <url>", "Registry base URL").option("--target <tool>", "cursor, claude, or *").option("--token <token>", "Install token for private packages").option("--ci", "Non-interactive; fail if prompt needed").action(async (pkgArg, opts) => {
8828
8858
  const { name, version: requestedVersion } = parsePackageArg(pkgArg);
8829
8859
  const scope = { global: opts.global };
8830
8860
  const configRoot = resolveConfigRoot(scope);
@@ -8847,7 +8877,8 @@ program2.command("add <package>").description("Add and install a package @scope/
8847
8877
  version: version.replace(/^\^/, ""),
8848
8878
  project,
8849
8879
  explicitTarget: parseTargetFlag(opts.target),
8850
- ci: opts.ci
8880
+ ci: opts.ci,
8881
+ token: opts.token ?? process.env.AIPM_TOKEN
8851
8882
  });
8852
8883
  if (!opts.ci && !program2.opts().quiet) {
8853
8884
  await notifyCliUpdateIfNeeded(CLI_VERSION);
@@ -8872,7 +8903,7 @@ program2.command("search [query]").description("Search public registry packages"
8872
8903
  console.log(` ${meta}`);
8873
8904
  }
8874
8905
  });
8875
- program2.command("install").description("Install all packages from aipm.package.json").option(GLOBAL_OPTION, GLOBAL_OPTION_DESC).option("--registry <url>", "Registry base URL").option("--target <tool>", "cursor, claude, or *").option("--ci", "Non-interactive").action(async (opts) => {
8906
+ program2.command("install").description("Install all packages from aipm.package.json").option(GLOBAL_OPTION, GLOBAL_OPTION_DESC).option("--registry <url>", "Registry base URL").option("--target <tool>", "cursor, claude, or *").option("--token <token>", "Install token for private packages").option("--ci", "Non-interactive").action(async (opts) => {
8876
8907
  const scope = { global: opts.global };
8877
8908
  const configRoot = resolveConfigRoot(scope);
8878
8909
  const installRoot = resolveInstallRoot(scope);
@@ -8889,7 +8920,8 @@ program2.command("install").description("Install all packages from aipm.package.
8889
8920
  version: version.replace(/^\^/, ""),
8890
8921
  project,
8891
8922
  explicitTarget: target,
8892
- ci: opts.ci
8923
+ ci: opts.ci,
8924
+ token: opts.token ?? process.env.AIPM_TOKEN
8893
8925
  });
8894
8926
  }
8895
8927
  });