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 +388 -174
- package/dist/schemas/aider.schema.json +24 -0
- package/dist/schemas/replit.schema.json +21 -0
- package/dist/schemas/trae.schema.json +24 -0
- package/dist/schemas/zencoder.schema.json +51 -0
- package/package.json +5 -4
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
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[
|
|
111
|
+
lockfile.packages[lockfileKey].integrity = `sha256-${hash}`;
|
|
97
112
|
}
|
|
98
|
-
function getLockedVersion(lockfile, packageId) {
|
|
99
|
-
|
|
113
|
+
function getLockedVersion(lockfile, packageId, format) {
|
|
114
|
+
var _a;
|
|
115
|
+
if (!lockfile) {
|
|
100
116
|
return null;
|
|
101
117
|
}
|
|
102
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
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: ${
|
|
2700
|
+
console.log(`\u{1F4E6} Loading collection: ${name_slug}...
|
|
2664
2701
|
`);
|
|
2665
|
-
const collection = await client.getCollection(
|
|
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
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
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
|
|
2818
|
-
console.log(`\u{1F4A1} Install: prpm install
|
|
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
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
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: ${
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
11490
|
-
|
|
11491
|
-
|
|
11492
|
-
|
|
11493
|
-
|
|
11494
|
-
|
|
11495
|
-
|
|
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
|
-
|
|
11501
|
-
|
|
11502
|
-
|
|
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
|
-
|
|
11505
|
-
|
|
11506
|
-
|
|
11507
|
-
|
|
11508
|
-
|
|
11509
|
-
|
|
11510
|
-
|
|
11511
|
-
|
|
11512
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
11596
|
-
console.log(` \u{1F4E6} Installing 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
|
|
12124
|
-
const lockEntry = lockfile.packages[
|
|
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 ${
|
|
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 ${
|
|
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
|
-
|
|
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
|
-
|
|
12401
|
-
|
|
12402
|
-
|
|
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
|
-
|
|
12406
|
-
|
|
12407
|
-
const
|
|
12408
|
-
if (
|
|
12409
|
-
|
|
12410
|
-
|
|
12411
|
-
|
|
12412
|
-
|
|
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
|
-
|
|
12418
|
-
const
|
|
12419
|
-
|
|
12420
|
-
|
|
12421
|
-
|
|
12422
|
-
|
|
12423
|
-
|
|
12424
|
-
|
|
12425
|
-
|
|
12426
|
-
|
|
12427
|
-
|
|
12428
|
-
|
|
12429
|
-
|
|
12430
|
-
|
|
12431
|
-
|
|
12432
|
-
|
|
12433
|
-
|
|
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
|
-
|
|
12438
|
-
|
|
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
|
|
12675
|
+
console.warn(` \u26A0\uFE0F File/directory not found: ${targetPath}`);
|
|
12444
12676
|
} else {
|
|
12445
|
-
throw
|
|
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
|
|
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 =
|
|
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.
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
49
|
-
"@pr-pm/registry-client": "^2.1.
|
|
50
|
-
"@pr-pm/types": "^1.1.
|
|
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": {
|