prpm 1.1.9 → 1.1.10

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
@@ -70,8 +70,22 @@ function createLockfile() {
70
70
  generated: (/* @__PURE__ */ new Date()).toISOString()
71
71
  };
72
72
  }
73
+ function getLockfileKey(packageId, format) {
74
+ if (!format) {
75
+ return packageId;
76
+ }
77
+ return `${packageId}#${format}`;
78
+ }
79
+ function parseLockfileKey(key) {
80
+ const parts = key.split("#");
81
+ return {
82
+ packageId: parts[0],
83
+ format: parts[1]
84
+ };
85
+ }
73
86
  function addToLockfile(lockfile, packageId, packageInfo) {
74
- lockfile.packages[packageId] = {
87
+ const lockfileKey = getLockfileKey(packageId, packageInfo.format);
88
+ lockfile.packages[lockfileKey] = {
75
89
  version: packageInfo.version,
76
90
  resolved: packageInfo.tarballUrl,
77
91
  integrity: "",
@@ -88,18 +102,33 @@ function addToLockfile(lockfile, packageId, packageInfo) {
88
102
  };
89
103
  lockfile.generated = (/* @__PURE__ */ new Date()).toISOString();
90
104
  }
91
- function setPackageIntegrity(lockfile, packageId, tarballBuffer) {
92
- if (!lockfile.packages[packageId]) {
93
- throw new Error(`Package ${packageId} not found in lock file`);
105
+ function setPackageIntegrity(lockfile, packageId, tarballBuffer, format) {
106
+ const lockfileKey = getLockfileKey(packageId, format);
107
+ if (!lockfile.packages[lockfileKey]) {
108
+ throw new Error(`Package ${lockfileKey} not found in lock file`);
94
109
  }
95
110
  const hash = (0, import_crypto.createHash)("sha256").update(tarballBuffer).digest("hex");
96
- lockfile.packages[packageId].integrity = `sha256-${hash}`;
111
+ lockfile.packages[lockfileKey].integrity = `sha256-${hash}`;
97
112
  }
98
- function getLockedVersion(lockfile, packageId) {
99
- if (!lockfile || !lockfile.packages[packageId]) {
113
+ function getLockedVersion(lockfile, packageId, format) {
114
+ var _a;
115
+ if (!lockfile) {
100
116
  return null;
101
117
  }
102
- return lockfile.packages[packageId].version;
118
+ if (format) {
119
+ const lockfileKey = getLockfileKey(packageId, format);
120
+ return ((_a = lockfile.packages[lockfileKey]) == null ? void 0 : _a.version) || null;
121
+ }
122
+ if (lockfile.packages[packageId]) {
123
+ return lockfile.packages[packageId].version;
124
+ }
125
+ for (const key of Object.keys(lockfile.packages)) {
126
+ const parsed = parseLockfileKey(key);
127
+ if (parsed.packageId === packageId) {
128
+ return lockfile.packages[key].version;
129
+ }
130
+ }
131
+ return null;
103
132
  }
104
133
  async function addPackage(packageInfo) {
105
134
  const lockfile = await readLockfile() || createLockfile();
@@ -141,7 +170,6 @@ function addCollectionToLockfile(lockfile, collectionKey, collectionInfo) {
141
170
  lockfile.collections = {};
142
171
  }
143
172
  lockfile.collections[collectionKey] = {
144
- scope: collectionInfo.scope,
145
173
  name_slug: collectionInfo.name_slug,
146
174
  version: collectionInfo.version,
147
175
  installedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -525,6 +553,14 @@ function getDestinationDir2(format, subtype, name) {
525
553
  return ".prompts";
526
554
  case "mcp":
527
555
  return ".mcp/tools";
556
+ case "trae":
557
+ return ".trae/rules";
558
+ case "aider":
559
+ return ".";
560
+ case "zencoder":
561
+ return ".zencoder/rules";
562
+ case "replit":
563
+ return ".";
528
564
  default:
529
565
  throw new Error(`Unknown format: ${format}`);
530
566
  }
@@ -583,6 +619,12 @@ async function autoDetectFormat() {
583
619
  if (await fileExists("AGENTS.md")) {
584
620
  return "agents.md";
585
621
  }
622
+ if (await fileExists("CONVENTIONS.md")) {
623
+ return "aider";
624
+ }
625
+ if (await fileExists("replit.md")) {
626
+ return "replit";
627
+ }
586
628
  const formatDirs = [
587
629
  { format: "cursor", dir: ".cursor" },
588
630
  { format: "claude", dir: ".claude" },
@@ -593,6 +635,8 @@ async function autoDetectFormat() {
593
635
  { format: "gemini", dir: ".gemini" },
594
636
  { format: "opencode", dir: ".opencode" },
595
637
  { format: "droid", dir: ".factory" },
638
+ { format: "trae", dir: ".trae" },
639
+ { format: "zencoder", dir: ".zencoder" },
596
640
  { format: "agents.md", dir: ".agents" }
597
641
  ];
598
642
  for (const { format, dir } of formatDirs) {
@@ -2424,7 +2468,7 @@ async function promptYesNo(question, nonInteractiveWarning) {
2424
2468
  }
2425
2469
  return false;
2426
2470
  }
2427
- const rl = readline2.createInterface({
2471
+ const rl = readline3.createInterface({
2428
2472
  input: process.stdin,
2429
2473
  output: process.stdout
2430
2474
  });
@@ -2435,12 +2479,12 @@ async function promptYesNo(question, nonInteractiveWarning) {
2435
2479
  rl.close();
2436
2480
  }
2437
2481
  }
2438
- var readline2;
2482
+ var readline3;
2439
2483
  var init_prompts = __esm({
2440
2484
  "src/core/prompts.ts"() {
2441
2485
  "use strict";
2442
2486
  init_cjs_shims();
2443
- readline2 = __toESM(require("readline/promises"));
2487
+ readline3 = __toESM(require("readline/promises"));
2444
2488
  }
2445
2489
  });
2446
2490
 
@@ -2557,7 +2601,6 @@ async function handleCollectionsList(options) {
2557
2601
  category: options.category,
2558
2602
  tag: options.tag,
2559
2603
  official: options.official,
2560
- scope: options.scope,
2561
2604
  limit: 500
2562
2605
  // Increased limit to show more collections
2563
2606
  });
@@ -2644,25 +2687,19 @@ async function handleCollectionsList(options) {
2644
2687
  async function handleCollectionInfo(collectionSpec) {
2645
2688
  const startTime = Date.now();
2646
2689
  try {
2647
- let scope;
2648
2690
  let name_slug;
2649
2691
  let version;
2650
- const matchWithScope = collectionSpec.match(/^@?([^/]+)\/([^/@]+)(?:@(.+))?$/);
2651
- if (matchWithScope) {
2652
- [, scope, name_slug, version] = matchWithScope;
2653
- } else {
2654
- const matchNoScope = collectionSpec.match(/^([^/@]+)(?:@(.+))?$/);
2655
- if (!matchNoScope) {
2656
- throw new Error("Invalid collection format. Use: name, @scope/name, or scope/name (optionally with @version)");
2657
- }
2658
- [, name_slug, version] = matchNoScope;
2659
- scope = "collection";
2692
+ const cleanSpec = collectionSpec.replace(/^collections\//, "");
2693
+ const match = cleanSpec.match(/^([^@]+)(?:@(.+))?$/);
2694
+ if (!match) {
2695
+ throw new Error("Invalid collection format. Use: name or name@version");
2660
2696
  }
2697
+ [, name_slug, version] = match;
2661
2698
  const config = await getConfig();
2662
2699
  const client = (0, import_registry_client4.getRegistryClient)(config);
2663
- console.log(`\u{1F4E6} Loading collection: ${scope === "collection" ? name_slug : `@${scope}/${name_slug}`}...
2700
+ console.log(`\u{1F4E6} Loading collection: ${name_slug}...
2664
2701
  `);
2665
- const collection = await client.getCollection(scope, name_slug, version);
2702
+ const collection = await client.getCollection(name_slug, version);
2666
2703
  console.log(`${collection.icon || "\u{1F4E6}"} ${collection.name}`);
2667
2704
  console.log(`${"=".repeat(collection.name.length + 2)}`);
2668
2705
  console.log("");
@@ -2716,16 +2753,9 @@ async function handleCollectionInfo(collectionSpec) {
2716
2753
  });
2717
2754
  }
2718
2755
  console.log("\u{1F4A1} Install:");
2719
- if (scope === "collection") {
2720
- console.log(` prpm install ${name_slug}`);
2721
- if (optionalPkgs.length > 0) {
2722
- console.log(` prpm install ${name_slug} --skip-optional # Skip optional packages`);
2723
- }
2724
- } else {
2725
- console.log(` prpm install @${scope}/${name_slug}`);
2726
- if (optionalPkgs.length > 0) {
2727
- console.log(` prpm install @${scope}/${name_slug} --skip-optional # Skip optional packages`);
2728
- }
2756
+ console.log(` prpm install ${name_slug}`);
2757
+ if (optionalPkgs.length > 0) {
2758
+ console.log(` prpm install ${name_slug} --skip-optional # Skip optional packages`);
2729
2759
  }
2730
2760
  console.log("");
2731
2761
  await telemetry.track({
@@ -2733,7 +2763,6 @@ async function handleCollectionInfo(collectionSpec) {
2733
2763
  success: true,
2734
2764
  duration: Date.now() - startTime,
2735
2765
  data: {
2736
- scope,
2737
2766
  name_slug,
2738
2767
  packageCount: collection.packages.length
2739
2768
  }
@@ -2810,12 +2839,11 @@ async function handleCollectionPublish(manifestPath = "./collection.json") {
2810
2839
  icon: manifest.icon
2811
2840
  });
2812
2841
  console.log(`\u2705 Collection published successfully!`);
2813
- console.log(` Scope: ${result.scope}`);
2814
2842
  console.log(` Name: ${result.name_slug}`);
2815
2843
  console.log(` Version: ${result.version || "1.0.0"}`);
2816
2844
  console.log("");
2817
- console.log(`\u{1F4A1} View: prpm collection info @${result.scope}/${result.name_slug}`);
2818
- console.log(`\u{1F4A1} Install: prpm install @${result.scope}/${result.name_slug}`);
2845
+ console.log(`\u{1F4A1} View: prpm collection info ${result.name_slug}`);
2846
+ console.log(`\u{1F4A1} Install: prpm install ${result.name_slug}`);
2819
2847
  console.log("");
2820
2848
  await telemetry.track({
2821
2849
  command: "collections:publish",
@@ -2848,26 +2876,19 @@ async function handleCollectionInstall(collectionSpec, options) {
2848
2876
  let packagesInstalled = 0;
2849
2877
  let packagesFailed = 0;
2850
2878
  try {
2851
- let scope;
2852
2879
  let name_slug;
2853
2880
  let version;
2854
- const matchWithScope = collectionSpec.match(/^@?([^/]+)\/([^/@]+)(?:@(.+))?$/);
2855
- if (matchWithScope) {
2856
- [, scope, name_slug, version] = matchWithScope;
2857
- } else {
2858
- const matchNoScope = collectionSpec.match(/^([^/@]+)(?:@(.+))?$/);
2859
- if (!matchNoScope) {
2860
- throw new Error("Invalid collection format. Use: name, @scope/name, or scope/name (optionally with @version)");
2861
- }
2862
- [, name_slug, version] = matchNoScope;
2863
- scope = "collection";
2881
+ const cleanSpec = collectionSpec.replace(/^collections\//, "");
2882
+ const match = cleanSpec.match(/^([^@]+)(?:@(.+))?$/);
2883
+ if (!match) {
2884
+ throw new Error("Invalid collection format. Use: name or name@version");
2864
2885
  }
2886
+ [, name_slug, version] = match;
2865
2887
  const config = await getConfig();
2866
2888
  const client = (0, import_registry_client4.getRegistryClient)(config);
2867
- console.log(`\u{1F4E6} Installing collection: ${scope === "collection" ? name_slug : `@${scope}/${name_slug}`}...
2889
+ console.log(`\u{1F4E6} Installing collection: ${name_slug}...
2868
2890
  `);
2869
2891
  const installResult = await client.installCollection({
2870
- scope,
2871
2892
  id: name_slug,
2872
2893
  version,
2873
2894
  format: options.format,
@@ -2897,7 +2918,6 @@ async function handleCollectionInstall(collectionSpec, options) {
2897
2918
  ${progress} Installing ${pkg.packageId}@${pkg.version}...`);
2898
2919
  const installOptions = {
2899
2920
  fromCollection: {
2900
- scope,
2901
2921
  name_slug,
2902
2922
  version: collection.version || version || "1.0.0"
2903
2923
  }
@@ -2922,9 +2942,8 @@ async function handleCollectionInstall(collectionSpec, options) {
2922
2942
  }
2923
2943
  }
2924
2944
  const lockfile = await readLockfile() || createLockfile();
2925
- const collectionKey = `@${scope}/${name_slug}`;
2945
+ const collectionKey = name_slug;
2926
2946
  addCollectionToLockfile(lockfile, collectionKey, {
2927
- scope,
2928
2947
  name_slug,
2929
2948
  version: collection.version || version || "1.0.0",
2930
2949
  packages: installedPackageIds
@@ -2948,7 +2967,6 @@ async function handleCollectionInstall(collectionSpec, options) {
2948
2967
  success: true,
2949
2968
  duration: Date.now() - startTime,
2950
2969
  data: {
2951
- scope,
2952
2970
  name_slug,
2953
2971
  packageCount: packages.length,
2954
2972
  installed: packagesInstalled,
@@ -9367,6 +9385,43 @@ var init_from_droid = __esm({
9367
9385
  }
9368
9386
  });
9369
9387
 
9388
+ // ../converters/dist/from-trae.js
9389
+ var init_from_trae = __esm({
9390
+ "../converters/dist/from-trae.js"() {
9391
+ "use strict";
9392
+ init_cjs_shims();
9393
+ init_taxonomy_utils();
9394
+ }
9395
+ });
9396
+
9397
+ // ../converters/dist/from-aider.js
9398
+ var init_from_aider = __esm({
9399
+ "../converters/dist/from-aider.js"() {
9400
+ "use strict";
9401
+ init_cjs_shims();
9402
+ init_taxonomy_utils();
9403
+ }
9404
+ });
9405
+
9406
+ // ../converters/dist/from-zencoder.js
9407
+ var init_from_zencoder = __esm({
9408
+ "../converters/dist/from-zencoder.js"() {
9409
+ "use strict";
9410
+ init_cjs_shims();
9411
+ init_js_yaml();
9412
+ init_taxonomy_utils();
9413
+ }
9414
+ });
9415
+
9416
+ // ../converters/dist/from-replit.js
9417
+ var init_from_replit = __esm({
9418
+ "../converters/dist/from-replit.js"() {
9419
+ "use strict";
9420
+ init_cjs_shims();
9421
+ init_taxonomy_utils();
9422
+ }
9423
+ });
9424
+
9370
9425
  // ../converters/dist/validation.js
9371
9426
  function loadSchema(format, subtype) {
9372
9427
  const cacheKey = subtype ? `${format}:${subtype}` : format;
@@ -9403,6 +9458,10 @@ function loadSchema(format, subtype) {
9403
9458
  "opencode": "opencode.schema.json",
9404
9459
  "ruler": "ruler.schema.json",
9405
9460
  "droid": "droid.schema.json",
9461
+ "trae": "trae.schema.json",
9462
+ "aider": "aider.schema.json",
9463
+ "zencoder": "zencoder.schema.json",
9464
+ "replit": "replit.schema.json",
9406
9465
  "canonical": "canonical.schema.json"
9407
9466
  };
9408
9467
  schemaFilename = schemaMap[format] || `${format}.schema.json`;
@@ -11298,8 +11357,40 @@ var init_to_droid = __esm({
11298
11357
  }
11299
11358
  });
11300
11359
 
11360
+ // ../converters/dist/to-trae.js
11361
+ var init_to_trae = __esm({
11362
+ "../converters/dist/to-trae.js"() {
11363
+ "use strict";
11364
+ init_cjs_shims();
11365
+ }
11366
+ });
11367
+
11368
+ // ../converters/dist/to-aider.js
11369
+ var init_to_aider = __esm({
11370
+ "../converters/dist/to-aider.js"() {
11371
+ "use strict";
11372
+ init_cjs_shims();
11373
+ }
11374
+ });
11375
+
11376
+ // ../converters/dist/to-zencoder.js
11377
+ var init_to_zencoder = __esm({
11378
+ "../converters/dist/to-zencoder.js"() {
11379
+ "use strict";
11380
+ init_cjs_shims();
11381
+ }
11382
+ });
11383
+
11384
+ // ../converters/dist/to-replit.js
11385
+ var init_to_replit = __esm({
11386
+ "../converters/dist/to-replit.js"() {
11387
+ "use strict";
11388
+ init_cjs_shims();
11389
+ }
11390
+ });
11391
+
11301
11392
  // ../converters/dist/schema-files.js
11302
- var import_module, import_path9, schemaRequire, convertersPackagePath, convertersDir, loadSchema2, agentsMdSchema, canonicalSchema, claudeSchema, continueSchema, copilotSchema, cursorSchema, droidSchema, geminiMdSchema, geminiSchema, kiroSteeringSchema, opencodeSchema, rulerSchema, windsurfSchema, claudeAgentSchema, claudeHookSchema, claudeSkillSchema, claudeSlashCommandSchema, cursorCommandSchema, droidHookSchema, droidSkillSchema, droidSlashCommandSchema, kiroAgentSchema, kiroHookSchema, opencodeSlashCommandSchema;
11393
+ var import_module, import_path9, schemaRequire, convertersPackagePath, convertersDir, loadSchema2, agentsMdSchema, canonicalSchema, claudeSchema, continueSchema, copilotSchema, cursorSchema, droidSchema, geminiMdSchema, geminiSchema, kiroSteeringSchema, opencodeSchema, rulerSchema, windsurfSchema, traeSchema, aiderSchema, zencoderSchema, replitSchema, claudeAgentSchema, claudeHookSchema, claudeSkillSchema, claudeSlashCommandSchema, cursorCommandSchema, droidHookSchema, droidSkillSchema, droidSlashCommandSchema, kiroAgentSchema, kiroHookSchema, opencodeSlashCommandSchema;
11303
11394
  var init_schema_files = __esm({
11304
11395
  "../converters/dist/schema-files.js"() {
11305
11396
  "use strict";
@@ -11323,6 +11414,10 @@ var init_schema_files = __esm({
11323
11414
  opencodeSchema = loadSchema2("opencode.schema.json");
11324
11415
  rulerSchema = loadSchema2("ruler.schema.json");
11325
11416
  windsurfSchema = loadSchema2("windsurf.schema.json");
11417
+ traeSchema = loadSchema2("trae.schema.json");
11418
+ aiderSchema = loadSchema2("aider.schema.json");
11419
+ zencoderSchema = loadSchema2("zencoder.schema.json");
11420
+ replitSchema = loadSchema2("replit.schema.json");
11326
11421
  claudeAgentSchema = loadSchema2("claude-agent.schema.json");
11327
11422
  claudeHookSchema = loadSchema2("claude-hook.schema.json");
11328
11423
  claudeSkillSchema = loadSchema2("claude-skill.schema.json");
@@ -11355,6 +11450,10 @@ var init_dist = __esm({
11355
11450
  init_from_opencode();
11356
11451
  init_from_ruler();
11357
11452
  init_from_droid();
11453
+ init_from_trae();
11454
+ init_from_aider();
11455
+ init_from_zencoder();
11456
+ init_from_replit();
11358
11457
  init_to_cursor();
11359
11458
  init_to_claude();
11360
11459
  init_to_continue();
@@ -11367,6 +11466,10 @@ var init_dist = __esm({
11367
11466
  init_to_opencode();
11368
11467
  init_to_ruler();
11369
11468
  init_to_droid();
11469
+ init_to_trae();
11470
+ init_to_aider();
11471
+ init_to_zencoder();
11472
+ init_to_replit();
11370
11473
  init_taxonomy_utils();
11371
11474
  init_validation();
11372
11475
  init_schema_files();
@@ -11400,6 +11503,10 @@ function getPackageIcon2(format, subtype) {
11400
11503
  "claude.md": "\u{1F916}",
11401
11504
  "opencode": "\u26A1",
11402
11505
  "droid": "\u{1F3ED}",
11506
+ "trae": "\u{1F3AF}",
11507
+ "aider": "\u{1F91D}",
11508
+ "zencoder": "\u26A1",
11509
+ "replit": "\u{1F52E}",
11403
11510
  "mcp": "\u{1F517}",
11404
11511
  "agents.md": "\u{1F4DD}",
11405
11512
  "ruler": "\u{1F4CF}",
@@ -11420,6 +11527,10 @@ function getPackageLabel2(format, subtype) {
11420
11527
  "claude.md": "Claude",
11421
11528
  "opencode": "OpenCode",
11422
11529
  "droid": "Factory Droid",
11530
+ "trae": "Trae",
11531
+ "aider": "Aider",
11532
+ "zencoder": "Zencoder",
11533
+ "replit": "Replit",
11423
11534
  "mcp": "MCP",
11424
11535
  "agents.md": "Agents.md",
11425
11536
  "ruler": "Ruler",
@@ -11476,7 +11587,11 @@ async function handleInstall(packageSpec, options) {
11476
11587
  }
11477
11588
  const config = await getConfig();
11478
11589
  const lockfile = await readLockfile();
11479
- const lockedVersion = getLockedVersion(lockfile, packageId);
11590
+ let targetFormat = options.as;
11591
+ if (!targetFormat) {
11592
+ targetFormat = config.defaultFormat || await autoDetectFormat() || void 0;
11593
+ }
11594
+ const lockedVersion = getLockedVersion(lockfile, packageId, targetFormat);
11480
11595
  let version;
11481
11596
  if (options.frozenLockfile) {
11482
11597
  if (!lockedVersion) {
@@ -11486,46 +11601,44 @@ async function handleInstall(packageSpec, options) {
11486
11601
  } else {
11487
11602
  version = options.version || specVersion || lockedVersion || "latest";
11488
11603
  }
11489
- let targetFormat = options.as;
11490
- if (!targetFormat) {
11491
- targetFormat = config.defaultFormat || await autoDetectFormat() || void 0;
11492
- }
11493
- if (!options.force && lockfile && lockfile.packages[packageId]) {
11494
- const installedPkg = lockfile.packages[packageId];
11495
- const requestedVersion = options.version || specVersion;
11496
- const sameFormat = !targetFormat || installedPkg.format === targetFormat;
11497
- if (sameFormat && (!requestedVersion || requestedVersion === "latest" || requestedVersion === installedPkg.version)) {
11498
- console.log(`
11604
+ if (!options.force && lockfile && targetFormat) {
11605
+ const lockfileKey = getLockfileKey(packageId, targetFormat);
11606
+ const installedPkg = lockfile.packages[lockfileKey];
11607
+ if (installedPkg) {
11608
+ const requestedVersion = options.version || specVersion;
11609
+ if (!requestedVersion || requestedVersion === "latest" || requestedVersion === installedPkg.version) {
11610
+ console.log(`
11499
11611
  \u2728 Package already installed!`);
11500
- console.log(` \u{1F4E6} ${packageId}@${installedPkg.version}`);
11501
- console.log(` \u{1F504} Format: ${installedPkg.format || "unknown"} | Subtype: ${installedPkg.subtype || "unknown"}`);
11502
- console.log(`
11612
+ console.log(` \u{1F4E6} ${packageId}@${installedPkg.version}`);
11613
+ console.log(` \u{1F504} Format: ${installedPkg.format || "unknown"} | Subtype: ${installedPkg.subtype || "unknown"}`);
11614
+ console.log(`
11503
11615
  \u{1F4A1} To reinstall or upgrade:`);
11504
- console.log(` prpm upgrade ${packageId} # Upgrade to latest version`);
11505
- console.log(` prpm uninstall ${packageId} # Uninstall first, then install`);
11506
- console.log(` prpm install ${packageId} --as <format> # Install in different format`);
11507
- success = true;
11508
- return;
11509
- } else if (!sameFormat) {
11510
- console.log(`\u{1F4E6} Installing ${packageId} in ${targetFormat} format (already have ${installedPkg.format} version)`);
11511
- } else if (requestedVersion !== installedPkg.version) {
11512
- console.log(`\u{1F4E6} Upgrading ${packageId}: ${installedPkg.version} \u2192 ${requestedVersion}`);
11616
+ console.log(` prpm upgrade ${packageId} # Upgrade to latest version`);
11617
+ console.log(` prpm uninstall ${packageId} # Uninstall first, then install`);
11618
+ console.log(` prpm install ${packageId} --as <format> # Install in different format`);
11619
+ success = true;
11620
+ return;
11621
+ } else {
11622
+ console.log(`\u{1F4E6} Upgrading ${packageId}: ${installedPkg.version} \u2192 ${requestedVersion}`);
11623
+ }
11624
+ } else if (options.as) {
11625
+ const existingFormats = [];
11626
+ for (const key of Object.keys(lockfile.packages)) {
11627
+ const parsed = parseLockfileKey(key);
11628
+ if (parsed.packageId === packageId && parsed.format) {
11629
+ existingFormats.push(parsed.format);
11630
+ }
11631
+ }
11632
+ if (existingFormats.length > 0) {
11633
+ console.log(`\u{1F4E6} Installing ${packageId} in ${targetFormat} format (already have ${existingFormats.join(", ")} version${existingFormats.length > 1 ? "s" : ""})`);
11634
+ }
11513
11635
  }
11514
11636
  }
11515
11637
  console.log(`\u{1F4E5} Installing ${packageId}@${version}...`);
11516
11638
  const client = (0, import_registry_client5.getRegistryClient)(config);
11517
11639
  let isCollection = false;
11518
11640
  try {
11519
- let scope;
11520
- let name_slug;
11521
- const matchWithScope = packageId.match(/^@?([^/]+)\/([^/@]+)$/);
11522
- if (matchWithScope) {
11523
- [, scope, name_slug] = matchWithScope;
11524
- } else {
11525
- scope = "collection";
11526
- name_slug = packageId;
11527
- }
11528
- await client.getCollection(scope, name_slug, version === "latest" ? void 0 : version);
11641
+ await client.getCollection(packageId, version === "latest" ? void 0 : version);
11529
11642
  isCollection = true;
11530
11643
  return await handleCollectionInstall(packageId, {
11531
11644
  format: options.as,
@@ -11590,10 +11703,22 @@ async function handleInstall(packageSpec, options) {
11590
11703
  actualVersion = pkg.latest_version.version;
11591
11704
  console.log(` \u{1F4E6} Installing version ${pkg.latest_version.version}`);
11592
11705
  } else {
11593
- const versionInfo = await client.getPackageVersion(packageId, version);
11706
+ let resolvedVersion = version;
11707
+ if (import_semver.default.validRange(version) && !import_semver.default.valid(version)) {
11708
+ console.log(` \u{1F50D} Resolving semver range: ${version}`);
11709
+ const versionsData = await client.getPackageVersions(packageId);
11710
+ const availableVersions = versionsData.versions.map((v) => v.version);
11711
+ const maxSatisfying = import_semver.default.maxSatisfying(availableVersions, version);
11712
+ if (!maxSatisfying) {
11713
+ throw new Error(`No version found matching range "${version}". Available versions: ${availableVersions.join(", ")}`);
11714
+ }
11715
+ resolvedVersion = maxSatisfying;
11716
+ console.log(` \u2713 Resolved to version ${resolvedVersion}`);
11717
+ }
11718
+ const versionInfo = await client.getPackageVersion(packageId, resolvedVersion);
11594
11719
  tarballUrl = versionInfo.tarball_url;
11595
- actualVersion = version;
11596
- console.log(` \u{1F4E6} Installing version ${version}`);
11720
+ actualVersion = resolvedVersion;
11721
+ console.log(` \u{1F4E6} Installing version ${resolvedVersion}`);
11597
11722
  }
11598
11723
  console.log(` \u2B07\uFE0F Downloading...`);
11599
11724
  const tarball = await client.downloadPackage(tarballUrl);
@@ -11658,6 +11783,7 @@ async function handleInstall(packageSpec, options) {
11658
11783
  convertedContent = cursorResult.content;
11659
11784
  break;
11660
11785
  case "claude":
11786
+ case "claude.md":
11661
11787
  const claudeResult = toClaude(canonicalPkg);
11662
11788
  convertedContent = claudeResult.content;
11663
11789
  break;
@@ -11684,6 +11810,7 @@ async function handleInstall(packageSpec, options) {
11684
11810
  convertedContent = agentsResult.content;
11685
11811
  break;
11686
11812
  case "gemini":
11813
+ case "gemini.md":
11687
11814
  const geminiResult = toGemini(canonicalPkg);
11688
11815
  convertedContent = geminiResult.content;
11689
11816
  break;
@@ -11974,7 +12101,7 @@ ${afterFrontmatter}`;
11974
12101
  // Track hook installation metadata for uninstall
11975
12102
  progressiveDisclosure: progressiveDisclosureMetadata
11976
12103
  });
11977
- setPackageIntegrity(updatedLockfile, packageId, tarball);
12104
+ setPackageIntegrity(updatedLockfile, packageId, tarball, effectiveFormat);
11978
12105
  await writeLockfile(updatedLockfile);
11979
12106
  await client.trackDownload(packageId, {
11980
12107
  version: actualVersion || version,
@@ -12120,11 +12247,13 @@ async function installFromLockfile(options) {
12120
12247
  `);
12121
12248
  let successCount = 0;
12122
12249
  let failCount = 0;
12123
- for (const packageId of packageIds) {
12124
- const lockEntry = lockfile.packages[packageId];
12250
+ for (const lockfileKey of packageIds) {
12251
+ const lockEntry = lockfile.packages[lockfileKey];
12252
+ const { packageId, format } = parseLockfileKey(lockfileKey);
12253
+ const displayName = format ? `${packageId} (${format})` : packageId;
12125
12254
  try {
12126
12255
  const packageSpec = packageId.includes("@") && !packageId.startsWith("@") ? packageId.substring(0, packageId.lastIndexOf("@")) : packageId;
12127
- console.log(` Installing ${packageId}...`);
12256
+ console.log(` Installing ${displayName}...`);
12128
12257
  let locationOverride = options.location;
12129
12258
  if (!locationOverride && lockEntry.format === "agents.md" && lockEntry.installedPath) {
12130
12259
  const baseName = import_path10.default.basename(lockEntry.installedPath);
@@ -12151,7 +12280,7 @@ async function installFromLockfile(options) {
12151
12280
  successCount++;
12152
12281
  } else {
12153
12282
  failCount++;
12154
- console.error(` \u274C Failed to install ${packageId}:`);
12283
+ console.error(` \u274C Failed to install ${displayName}:`);
12155
12284
  console.error(` Type: ${(_b = error == null ? void 0 : error.constructor) == null ? void 0 : _b.name}`);
12156
12285
  console.error(` Message: ${error instanceof Error ? error.message : String(error)}`);
12157
12286
  if (error instanceof CLIError) {
@@ -12200,7 +12329,7 @@ function createInstallCommand() {
12200
12329
  });
12201
12330
  return command;
12202
12331
  }
12203
- var import_commander11, import_chalk, import_registry_client5, import_stream, import_promises, tar, import_path10, import_zlib, import_promises2, import_os3;
12332
+ var import_commander11, import_chalk, import_registry_client5, import_stream, import_promises, tar, import_path10, import_zlib, import_promises2, import_os3, import_semver;
12204
12333
  var init_install = __esm({
12205
12334
  "src/commands/install.ts"() {
12206
12335
  "use strict";
@@ -12220,6 +12349,7 @@ var init_install = __esm({
12220
12349
  import_zlib = __toESM(require("zlib"));
12221
12350
  import_promises2 = __toESM(require("fs/promises"));
12222
12351
  import_os3 = __toESM(require("os"));
12352
+ import_semver = __toESM(require("semver"));
12223
12353
  init_collections();
12224
12354
  init_lockfile();
12225
12355
  init_cursor_config();
@@ -12395,87 +12525,160 @@ init_filesystem();
12395
12525
  var import_fs7 = require("fs");
12396
12526
  init_errors();
12397
12527
  init_agents_md_progressive();
12398
- async function handleUninstall(name) {
12528
+ var readline = __toESM(require("readline"));
12529
+ async function promptForFormat(packageId, formats) {
12530
+ console.log(`
12531
+ \u{1F4E6} Multiple formats found for ${packageId}:`);
12532
+ formats.forEach((fmt, idx) => {
12533
+ console.log(` ${idx + 1}. ${fmt}`);
12534
+ });
12535
+ console.log(` ${formats.length + 1}. All formats`);
12536
+ const rl = readline.createInterface({
12537
+ input: process.stdin,
12538
+ output: process.stdout
12539
+ });
12540
+ return new Promise((resolve2) => {
12541
+ rl.question("\nSelect format to uninstall (number): ", (answer) => {
12542
+ rl.close();
12543
+ const choice = parseInt(answer.trim(), 10);
12544
+ if (choice > 0 && choice <= formats.length) {
12545
+ resolve2(formats[choice - 1]);
12546
+ } else if (choice === formats.length + 1) {
12547
+ resolve2("all");
12548
+ } else {
12549
+ console.log("Invalid choice, uninstalling all formats");
12550
+ resolve2("all");
12551
+ }
12552
+ });
12553
+ });
12554
+ }
12555
+ async function handleUninstall(name, options = {}) {
12399
12556
  try {
12400
- console.log(`\u{1F5D1}\uFE0F Uninstalling package: ${name}`);
12401
- const pkg = await removePackage(name);
12402
- if (!pkg) {
12557
+ const lockfile = await readLockfile();
12558
+ if (!lockfile) {
12559
+ throw new CLIError("\u274C No prpm.lock file found", 1);
12560
+ }
12561
+ const matchingKeys = [];
12562
+ for (const key of Object.keys(lockfile.packages)) {
12563
+ const parsed = parseLockfileKey(key);
12564
+ if (parsed.packageId === name) {
12565
+ matchingKeys.push(key);
12566
+ }
12567
+ }
12568
+ if (matchingKeys.length === 0) {
12403
12569
  throw new CLIError(`\u274C Package "${name}" not found`, 1);
12404
12570
  }
12405
- if (pkg.progressiveDisclosure) {
12406
- const { manifestPath, resourceName, skillName } = pkg.progressiveDisclosure;
12407
- const name2 = resourceName || skillName;
12408
- if (name2) {
12409
- try {
12410
- await removeSkillFromManifest(name2, manifestPath);
12411
- console.log(` \u{1F4DD} Removed from ${manifestPath} manifest`);
12412
- } catch (error) {
12413
- console.warn(` \u26A0\uFE0F Failed to remove from manifest: ${error}`);
12571
+ let keysToUninstall;
12572
+ if (options.format) {
12573
+ const requestedKey = getLockfileKey(name, options.format);
12574
+ if (!lockfile.packages[requestedKey]) {
12575
+ if (lockfile.packages[name] && lockfile.packages[name].format === options.format) {
12576
+ keysToUninstall = [name];
12577
+ } else {
12578
+ throw new CLIError(`\u274C Package "${name}" with format "${options.format}" not found`, 1);
12414
12579
  }
12580
+ } else {
12581
+ keysToUninstall = [requestedKey];
12582
+ }
12583
+ } else if (matchingKeys.length > 1) {
12584
+ const formats = matchingKeys.map((key) => {
12585
+ const parsed = parseLockfileKey(key);
12586
+ return parsed.format || lockfile.packages[key].format || "unknown";
12587
+ });
12588
+ const selectedFormat = await promptForFormat(name, formats);
12589
+ if (selectedFormat === "all") {
12590
+ keysToUninstall = matchingKeys;
12591
+ } else {
12592
+ const selectedKey = matchingKeys[formats.indexOf(selectedFormat)];
12593
+ keysToUninstall = [selectedKey];
12415
12594
  }
12595
+ } else {
12596
+ keysToUninstall = matchingKeys;
12416
12597
  }
12417
- if (pkg.format === "claude" && pkg.subtype === "hook" && pkg.hookMetadata) {
12418
- const settingsPath = pkg.installedPath || ".claude/settings.json";
12419
- try {
12420
- const settingsContent = await import_fs7.promises.readFile(settingsPath, "utf-8");
12421
- const settings = JSON.parse(settingsContent);
12422
- if (settings.hooks) {
12423
- let removedCount = 0;
12424
- for (const event of pkg.hookMetadata.events) {
12425
- if (settings.hooks[event]) {
12426
- const originalLength = settings.hooks[event].length;
12427
- settings.hooks[event] = settings.hooks[event].filter(
12428
- (hook) => hook.__prpm_hook_id !== pkg.hookMetadata.hookId
12429
- );
12430
- const newLength = settings.hooks[event].length;
12431
- removedCount += originalLength - newLength;
12432
- if (settings.hooks[event].length === 0) {
12433
- delete settings.hooks[event];
12598
+ for (const lockfileKey of keysToUninstall) {
12599
+ const parsed = parseLockfileKey(lockfileKey);
12600
+ const formatDisplay = parsed.format ? ` (${parsed.format})` : "";
12601
+ console.log(`
12602
+ \u{1F5D1}\uFE0F Uninstalling package: ${name}${formatDisplay}`);
12603
+ const pkg = await removePackage(lockfileKey);
12604
+ if (!pkg) {
12605
+ throw new CLIError(`\u274C Package "${name}" not found`, 1);
12606
+ }
12607
+ if (pkg.progressiveDisclosure) {
12608
+ const { manifestPath, resourceName, skillName } = pkg.progressiveDisclosure;
12609
+ const name2 = resourceName || skillName;
12610
+ if (name2) {
12611
+ try {
12612
+ await removeSkillFromManifest(name2, manifestPath);
12613
+ console.log(` \u{1F4DD} Removed from ${manifestPath} manifest`);
12614
+ } catch (error) {
12615
+ console.warn(` \u26A0\uFE0F Failed to remove from manifest: ${error}`);
12616
+ }
12617
+ }
12618
+ }
12619
+ if (pkg.format === "claude" && pkg.subtype === "hook" && pkg.hookMetadata) {
12620
+ const settingsPath = pkg.installedPath || ".claude/settings.json";
12621
+ try {
12622
+ const settingsContent = await import_fs7.promises.readFile(settingsPath, "utf-8");
12623
+ const settings = JSON.parse(settingsContent);
12624
+ if (settings.hooks) {
12625
+ let removedCount = 0;
12626
+ for (const event of pkg.hookMetadata.events) {
12627
+ if (settings.hooks[event]) {
12628
+ const originalLength = settings.hooks[event].length;
12629
+ settings.hooks[event] = settings.hooks[event].filter(
12630
+ (hook) => hook.__prpm_hook_id !== pkg.hookMetadata.hookId
12631
+ );
12632
+ const newLength = settings.hooks[event].length;
12633
+ removedCount += originalLength - newLength;
12634
+ if (settings.hooks[event].length === 0) {
12635
+ delete settings.hooks[event];
12636
+ }
12434
12637
  }
12435
12638
  }
12639
+ await import_fs7.promises.writeFile(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
12640
+ console.log(` \u{1FA9D} Removed ${removedCount} hook(s) from ${settingsPath}`);
12641
+ }
12642
+ } catch (error) {
12643
+ const err = error;
12644
+ if (err.code === "ENOENT") {
12645
+ console.warn(` \u26A0\uFE0F Settings file not found: ${settingsPath}`);
12646
+ } else {
12647
+ throw new Error(`Failed to remove hooks from settings: ${error}`);
12436
12648
  }
12437
- await import_fs7.promises.writeFile(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
12438
- console.log(` \u{1FA9D} Removed ${removedCount} hook(s) from ${settingsPath}`);
12649
+ }
12650
+ console.log(`\u2705 Successfully uninstalled ${name}`);
12651
+ return;
12652
+ }
12653
+ const packageName = stripAuthorNamespace2(name);
12654
+ let targetPath;
12655
+ if (pkg.installedPath) {
12656
+ targetPath = pkg.installedPath;
12657
+ console.log(` \u{1F4CD} Using installation path from lock file: ${targetPath}`);
12658
+ } else {
12659
+ console.warn(` \u26A0\uFE0F No installation path in lock file for ${name}`);
12660
+ console.warn(` \u26A0\uFE0F This may indicate an old or corrupted lock file`);
12661
+ throw new CLIError(`Cannot uninstall ${name}: installation path unknown`, 1);
12662
+ }
12663
+ try {
12664
+ const stats = await import_fs7.promises.stat(targetPath);
12665
+ if (stats.isDirectory()) {
12666
+ await import_fs7.promises.rm(targetPath, { recursive: true, force: true });
12667
+ console.log(` \u{1F5D1}\uFE0F Deleted directory: ${targetPath}`);
12668
+ } else if (stats.isFile()) {
12669
+ await import_fs7.promises.unlink(targetPath);
12670
+ console.log(` \u{1F5D1}\uFE0F Deleted file: ${targetPath}`);
12439
12671
  }
12440
12672
  } catch (error) {
12441
12673
  const err = error;
12442
12674
  if (err.code === "ENOENT") {
12443
- console.warn(` \u26A0\uFE0F Settings file not found: ${settingsPath}`);
12675
+ console.warn(` \u26A0\uFE0F File/directory not found: ${targetPath}`);
12444
12676
  } else {
12445
- throw new Error(`Failed to remove hooks from settings: ${error}`);
12677
+ throw err;
12446
12678
  }
12447
12679
  }
12448
- console.log(`\u2705 Successfully uninstalled ${name}`);
12449
- return;
12450
- }
12451
- const packageName = stripAuthorNamespace2(name);
12452
- let targetPath;
12453
- if (pkg.installedPath) {
12454
- targetPath = pkg.installedPath;
12455
- console.log(` \u{1F4CD} Using installation path from lock file: ${targetPath}`);
12456
- } else {
12457
- console.warn(` \u26A0\uFE0F No installation path in lock file for ${name}`);
12458
- console.warn(` \u26A0\uFE0F This may indicate an old or corrupted lock file`);
12459
- throw new CLIError(`Cannot uninstall ${name}: installation path unknown`, 1);
12460
- }
12461
- try {
12462
- const stats = await import_fs7.promises.stat(targetPath);
12463
- if (stats.isDirectory()) {
12464
- await import_fs7.promises.rm(targetPath, { recursive: true, force: true });
12465
- console.log(` \u{1F5D1}\uFE0F Deleted directory: ${targetPath}`);
12466
- } else if (stats.isFile()) {
12467
- await import_fs7.promises.unlink(targetPath);
12468
- console.log(` \u{1F5D1}\uFE0F Deleted file: ${targetPath}`);
12469
- }
12470
- } catch (error) {
12471
- const err = error;
12472
- if (err.code === "ENOENT") {
12473
- console.warn(` \u26A0\uFE0F File/directory not found: ${targetPath}`);
12474
- } else {
12475
- throw err;
12476
- }
12680
+ console.log(`\u2705 Successfully uninstalled ${name}${formatDisplay}`);
12477
12681
  }
12478
- console.log(`\u2705 Successfully uninstalled ${name}`);
12479
12682
  } catch (error) {
12480
12683
  if (error instanceof CLIError) {
12481
12684
  throw error;
@@ -12485,7 +12688,7 @@ async function handleUninstall(name) {
12485
12688
  }
12486
12689
  function createUninstallCommand() {
12487
12690
  const command = new import_commander2.Command("uninstall");
12488
- command.description("Uninstall a prompt package").argument("<id>", "Package ID to uninstall").alias("remove").action(handleUninstall);
12691
+ command.description("Uninstall a prompt package").argument("<id>", "Package ID to uninstall").option("--format <format>", "Specific format to uninstall (if multiple formats installed)").alias("remove").action(handleUninstall);
12489
12692
  return command;
12490
12693
  }
12491
12694
 
@@ -12823,7 +13026,7 @@ var import_commander7 = require("commander");
12823
13026
  var import_registry_client2 = require("@pr-pm/registry-client");
12824
13027
  init_user_config();
12825
13028
  init_telemetry();
12826
- var readline = __toESM(require("readline"));
13029
+ var readline2 = __toESM(require("readline"));
12827
13030
  init_errors();
12828
13031
  function getPackageIcon(format, subtype) {
12829
13032
  const subtypeIcons = {
@@ -12851,6 +13054,10 @@ function getPackageIcon(format, subtype) {
12851
13054
  "claude.md": "\u{1F916}",
12852
13055
  "opencode": "\u26A1",
12853
13056
  "droid": "\u{1F3ED}",
13057
+ "trae": "\u{1F3AF}",
13058
+ "aider": "\u{1F91D}",
13059
+ "zencoder": "\u26A1",
13060
+ "replit": "\u{1F52E}",
12854
13061
  "mcp": "\u{1F517}",
12855
13062
  "agents.md": "\u{1F4DD}",
12856
13063
  "ruler": "\u{1F4CF}",
@@ -12871,6 +13078,10 @@ function getPackageLabel(format, subtype) {
12871
13078
  "claude.md": "Claude",
12872
13079
  "opencode": "OpenCode",
12873
13080
  "droid": "Factory Droid",
13081
+ "trae": "Trae",
13082
+ "aider": "Aider",
13083
+ "zencoder": "Zencoder",
13084
+ "replit": "Replit",
12874
13085
  "mcp": "MCP",
12875
13086
  "agents.md": "Agents.md",
12876
13087
  "ruler": "Ruler",
@@ -12933,7 +13144,7 @@ function displayResults(packages, total, page, limit) {
12933
13144
  }
12934
13145
  function promptUser() {
12935
13146
  return new Promise((resolve2) => {
12936
- const rl = readline.createInterface({
13147
+ const rl = readline2.createInterface({
12937
13148
  input: process.stdin,
12938
13149
  output: process.stdout
12939
13150
  });
@@ -14275,7 +14486,11 @@ async function handlePublish(options) {
14275
14486
  console.log(" Will publish each separately\n");
14276
14487
  }
14277
14488
  let filteredManifests = manifests;
14278
- if (options.package) {
14489
+ if (options.collection) {
14490
+ filteredManifests = [];
14491
+ console.log(` Skipping packages (publishing collection only)
14492
+ `);
14493
+ } else if (options.package) {
14279
14494
  filteredManifests = manifests.filter((m) => m.name === options.package);
14280
14495
  if (filteredManifests.length === 0) {
14281
14496
  throw new Error(`Package "${options.package}" not found in manifest. Available packages: ${manifests.map((m) => m.name).join(", ")}`);
@@ -14608,7 +14823,6 @@ ${"=".repeat(60)}`);
14608
14823
  };
14609
14824
  const result = await client.createCollection(collectionData);
14610
14825
  console.log(`\u2705 Collection published successfully!`);
14611
- console.log(` Scope: ${result.scope}`);
14612
14826
  console.log(` Name: ${result.name_slug}`);
14613
14827
  console.log(` Version: ${result.version || "1.0.0"}`);
14614
14828
  console.log("");
@@ -15306,7 +15520,7 @@ var import_commander19 = require("commander");
15306
15520
  var import_promises7 = require("fs/promises");
15307
15521
  var import_path15 = require("path");
15308
15522
  var import_fs12 = require("fs");
15309
- var readline3 = __toESM(require("readline/promises"));
15523
+ var readline4 = __toESM(require("readline/promises"));
15310
15524
  var import_process = require("process");
15311
15525
 
15312
15526
  // src/types.ts
@@ -15746,7 +15960,7 @@ async function initPackage(options) {
15746
15960
  (f) => f.replace(/example-skill/g, config.name || "example-skill")
15747
15961
  );
15748
15962
  } else {
15749
- const rl = readline3.createInterface({ input: import_process.stdin, output: import_process.stdout });
15963
+ const rl = readline4.createInterface({ input: import_process.stdin, output: import_process.stdout });
15750
15964
  try {
15751
15965
  console.log("\n\u{1F680} Welcome to PRPM package initialization!\n");
15752
15966
  console.log("This utility will walk you through creating a prpm.json file.\n");
@@ -16326,12 +16540,12 @@ init_cjs_shims();
16326
16540
  var import_commander22 = require("commander");
16327
16541
  init_user_config();
16328
16542
  init_telemetry();
16329
- var readline4 = __toESM(require("readline"));
16543
+ var readline5 = __toESM(require("readline"));
16330
16544
  var fs10 = __toESM(require("fs"));
16331
16545
  var path7 = __toESM(require("path"));
16332
16546
  init_errors();
16333
16547
  function createReadline() {
16334
- return readline4.createInterface({
16548
+ return readline5.createInterface({
16335
16549
  input: process.stdin,
16336
16550
  output: process.stdout
16337
16551
  });
@@ -17473,7 +17687,7 @@ async function handleStarred(options) {
17473
17687
  for (const collection of collections) {
17474
17688
  const stars = `\u2B50 ${collection.stars || 0}`.padEnd(8);
17475
17689
  const packages2 = `\u{1F4E6} ${collection.package_count || 0} packages`;
17476
- console.log(` ${collection.scope}/${collection.name_slug}`);
17690
+ console.log(` ${collection.name_slug}`);
17477
17691
  console.log(` ${stars} ${packages2}`);
17478
17692
  if (collection.description) {
17479
17693
  const desc = collection.description.length > 80 ? collection.description.substring(0, 77) + "..." : collection.description;
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/aider.json",
4
+ "$comment": "https://aider.chat/docs/usage/conventions.html",
5
+ "title": "Aider CONVENTIONS.md Format",
6
+ "description": "JSON Schema for Aider CONVENTIONS.md format - plain markdown coding conventions (NO frontmatter)",
7
+ "type": "object",
8
+ "required": ["content"],
9
+ "properties": {
10
+ "content": {
11
+ "type": "string",
12
+ "description": "Plain markdown content with coding conventions, standards, and project-specific guidelines. No frontmatter allowed."
13
+ }
14
+ },
15
+ "additionalProperties": false,
16
+ "examples": [
17
+ {
18
+ "content": "# Coding Conventions\n\n## Python\n\n- Follow PEP 8\n- Use type hints\n- Write docstrings for all functions\n\n## Testing\n\n- Use pytest\n- Aim for 80% coverage"
19
+ },
20
+ {
21
+ "content": "# Project Standards\n\n## Code Review\n\n- All PRs need approval\n- Run linters before committing\n\n## Documentation\n\n- Update README for new features"
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/replit.json",
4
+ "$comment": "https://docs.replit.com/replitai/replit-dot-md",
5
+ "title": "Replit.md Format",
6
+ "description": "JSON Schema for Replit replit.md format - plain markdown project configuration (NO frontmatter)",
7
+ "type": "object",
8
+ "required": ["content"],
9
+ "properties": {
10
+ "content": {
11
+ "type": "string",
12
+ "description": "Plain markdown content with project overview, technology preferences, coding standards, and communication style. No frontmatter allowed."
13
+ }
14
+ },
15
+ "additionalProperties": false,
16
+ "examples": [
17
+ {
18
+ "content": "# Project Name\n\n## Project Overview\n\nA web application for task management.\n\n## Technology Preferences\n\n- Frontend: React with TypeScript\n- Backend: Node.js with Express\n- Database: PostgreSQL\n\n## Coding Standards\n\n- Use ESLint and Prettier\n- Follow Airbnb style guide\n\n## Communication Style\n\n- Prefer detailed explanations\n- Include code examples"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/trae.json",
4
+ "$comment": "https://docs.trae.ai/ide/rules",
5
+ "title": "Trae Rules Format",
6
+ "description": "JSON Schema for Trae .trae/rules format - plain markdown user and project rules (NO frontmatter)",
7
+ "type": "object",
8
+ "required": ["content"],
9
+ "properties": {
10
+ "content": {
11
+ "type": "string",
12
+ "description": "Plain markdown content with coding rules, style preferences, conventions, etc. No frontmatter allowed."
13
+ }
14
+ },
15
+ "additionalProperties": false,
16
+ "examples": [
17
+ {
18
+ "content": "# Code Style\n\n- Use spaces for indentation (2 spaces)\n- Prefer functional components in React\n- Use TypeScript strict mode"
19
+ },
20
+ {
21
+ "content": "# Project Conventions\n\n## Naming\n\n- Components: PascalCase\n- Functions: camelCase\n- Constants: UPPER_SNAKE_CASE"
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/zencoder.json",
4
+ "$comment": "https://docs.zencoder.ai/rules-context/zen-rules",
5
+ "title": "Zencoder Rules Format",
6
+ "description": "JSON Schema for Zencoder .zencoder/rules format with optional YAML frontmatter",
7
+ "type": "object",
8
+ "required": ["content"],
9
+ "properties": {
10
+ "frontmatter": {
11
+ "type": "object",
12
+ "description": "Optional YAML frontmatter enclosed in --- markers",
13
+ "properties": {
14
+ "description": {
15
+ "type": "string",
16
+ "description": "Brief description of what the rule covers"
17
+ },
18
+ "globs": {
19
+ "type": "array",
20
+ "description": "File patterns where the rule applies (e.g., ['*.md', '*.mdx'])",
21
+ "items": {
22
+ "type": "string"
23
+ }
24
+ },
25
+ "alwaysApply": {
26
+ "type": "boolean",
27
+ "description": "Set to true if rule should always be active",
28
+ "default": false
29
+ }
30
+ },
31
+ "additionalProperties": false
32
+ },
33
+ "content": {
34
+ "type": "string",
35
+ "description": "Markdown content following the frontmatter. Standard markdown with headings, lists, code blocks, etc."
36
+ }
37
+ },
38
+ "examples": [
39
+ {
40
+ "frontmatter": {
41
+ "description": "TypeScript coding standards",
42
+ "globs": ["*.ts", "*.tsx"],
43
+ "alwaysApply": false
44
+ },
45
+ "content": "# TypeScript Standards\n\n- Use strict mode\n- Prefer interfaces over types\n- Always define return types"
46
+ },
47
+ {
48
+ "content": "# General Coding Guidelines\n\nThese guidelines apply to all code.\n\n- Write clear, self-documenting code\n- Add comments for complex logic"
49
+ }
50
+ ]
51
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm",
3
- "version": "1.1.9",
3
+ "version": "1.1.10",
4
4
  "description": "Prompt Package Manager CLI - Install and manage prompt-based files",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -45,14 +45,15 @@
45
45
  "license": "MIT",
46
46
  "dependencies": {
47
47
  "@octokit/rest": "^22.0.0",
48
- "@pr-pm/converters": "^1.1.9",
49
- "@pr-pm/registry-client": "^2.1.9",
50
- "@pr-pm/types": "^1.1.9",
48
+ "@pr-pm/converters": "^1.1.10",
49
+ "@pr-pm/registry-client": "^2.1.10",
50
+ "@pr-pm/types": "^1.1.10",
51
51
  "ajv": "^8.17.1",
52
52
  "ajv-formats": "^3.0.1",
53
53
  "commander": "^11.1.0",
54
54
  "jsonwebtoken": "^9.0.2",
55
55
  "posthog-node": "^5.10.0",
56
+ "semver": "^7.7.3",
56
57
  "tar": "^6.2.1"
57
58
  },
58
59
  "devDependencies": {