prpm 2.1.15 → 2.1.16
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.
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"lastVerified": "2025-12-06",
|
|
6
6
|
"verificationSources": {
|
|
7
7
|
"claude": "https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview",
|
|
8
|
-
"copilot": "https://
|
|
8
|
+
"copilot": "https://code.visualstudio.com/docs/copilot/customization/agent-skills",
|
|
9
9
|
"cursor": "https://docs.cursor.com/context/rules",
|
|
10
10
|
"continue": "https://docs.continue.dev/reference",
|
|
11
11
|
"windsurf": "https://docs.codeium.com/windsurf/cascade",
|
|
@@ -58,13 +58,13 @@
|
|
|
58
58
|
},
|
|
59
59
|
"copilot": {
|
|
60
60
|
"name": "GitHub Copilot",
|
|
61
|
-
"supportsSkills":
|
|
61
|
+
"supportsSkills": true,
|
|
62
62
|
"supportsPlugins": false,
|
|
63
63
|
"supportsExtensions": false,
|
|
64
64
|
"supportsAgents": true,
|
|
65
65
|
"supportsAgentsMd": true,
|
|
66
66
|
"markdownFallback": "copilot-instructions.md",
|
|
67
|
-
"notes": "GitHub Copilot
|
|
67
|
+
"notes": "GitHub Copilot supports skills in .github/skills/<name>/SKILL.md (VS Code Insiders with chat.useAgentSkills setting). Also supports AGENTS.md, CLAUDE.md, GEMINI.md, and .instructions.md custom instructions."
|
|
68
68
|
},
|
|
69
69
|
"kiro": {
|
|
70
70
|
"name": "Kiro AI",
|
package/dist/index.js
CHANGED
|
@@ -8758,6 +8758,7 @@ function loadSchema(format, subtype) {
|
|
|
8758
8758
|
"claude:slash-command": "claude-slash-command.schema.json",
|
|
8759
8759
|
"claude:hook": "claude-hook.schema.json",
|
|
8760
8760
|
"claude:plugin": "claude-plugin.schema.json",
|
|
8761
|
+
"copilot:skill": "copilot-skill.schema.json",
|
|
8761
8762
|
"cursor:slash-command": "cursor-command.schema.json",
|
|
8762
8763
|
"cursor:hook": "cursor-hooks.schema.json",
|
|
8763
8764
|
// cursor + hook subtype uses cursor-hooks schema
|
|
@@ -9830,7 +9831,11 @@ function toCopilot(pkg, options = {}) {
|
|
|
9830
9831
|
let qualityScore = 100;
|
|
9831
9832
|
try {
|
|
9832
9833
|
const config = options.copilotConfig || {};
|
|
9833
|
-
const
|
|
9834
|
+
const isSkill = config.isSkill || pkg.subtype === "skill";
|
|
9835
|
+
const isPathSpecific = !!config.applyTo && !isSkill;
|
|
9836
|
+
if (isSkill) {
|
|
9837
|
+
return convertToSkill(pkg, config, warnings);
|
|
9838
|
+
}
|
|
9834
9839
|
if (isPathSpecific && !config.applyTo) {
|
|
9835
9840
|
warnings.push("Path-specific instruction requires applyTo pattern");
|
|
9836
9841
|
qualityScore -= 20;
|
|
@@ -9838,7 +9843,7 @@ function toCopilot(pkg, options = {}) {
|
|
|
9838
9843
|
const content = convertContent3(pkg, warnings, config);
|
|
9839
9844
|
let fullContent;
|
|
9840
9845
|
if (isPathSpecific && config.applyTo) {
|
|
9841
|
-
const frontmatter =
|
|
9846
|
+
const frontmatter = generateInstructionFrontmatter(config);
|
|
9842
9847
|
fullContent = `${frontmatter}
|
|
9843
9848
|
|
|
9844
9849
|
${content}`;
|
|
@@ -9867,7 +9872,81 @@ ${content}`;
|
|
|
9867
9872
|
};
|
|
9868
9873
|
}
|
|
9869
9874
|
}
|
|
9870
|
-
function
|
|
9875
|
+
function convertToSkill(pkg, config, warnings) {
|
|
9876
|
+
var _a, _b;
|
|
9877
|
+
let qualityScore = 100;
|
|
9878
|
+
const skillName = config.skillName || ((_a = pkg.name) == null ? void 0 : _a.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64)) || pkg.id.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64);
|
|
9879
|
+
const skillDescription = config.skillDescription || pkg.description || ((_b = pkg.metadata) == null ? void 0 : _b.description) || "";
|
|
9880
|
+
if (!skillDescription) {
|
|
9881
|
+
warnings.push("Skill requires a description - using empty string");
|
|
9882
|
+
qualityScore -= 20;
|
|
9883
|
+
}
|
|
9884
|
+
if (!/^[a-z0-9-]+$/.test(skillName)) {
|
|
9885
|
+
warnings.push("Skill name should be lowercase with hyphens only");
|
|
9886
|
+
qualityScore -= 10;
|
|
9887
|
+
}
|
|
9888
|
+
const frontmatter = generateSkillFrontmatter(skillName, skillDescription);
|
|
9889
|
+
const content = convertSkillContent(pkg, warnings);
|
|
9890
|
+
const fullContent = `${frontmatter}
|
|
9891
|
+
|
|
9892
|
+
${content}`;
|
|
9893
|
+
const lossyConversion = warnings.some((w) => w.includes("not supported") || w.includes("skipped"));
|
|
9894
|
+
if (lossyConversion) {
|
|
9895
|
+
qualityScore -= 10;
|
|
9896
|
+
}
|
|
9897
|
+
return {
|
|
9898
|
+
content: fullContent,
|
|
9899
|
+
format: "copilot",
|
|
9900
|
+
warnings: warnings.length > 0 ? warnings : void 0,
|
|
9901
|
+
lossyConversion,
|
|
9902
|
+
qualityScore
|
|
9903
|
+
};
|
|
9904
|
+
}
|
|
9905
|
+
function generateSkillFrontmatter(name, description) {
|
|
9906
|
+
const lines = ["---"];
|
|
9907
|
+
lines.push(`name: ${name}`);
|
|
9908
|
+
const truncatedDesc = description.length > 1024 ? description.slice(0, 1021) + "..." : description;
|
|
9909
|
+
const quotedDesc = `"${truncatedDesc.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\r/g, "\\r").replace(/\n/g, "\\n")}"`;
|
|
9910
|
+
lines.push(`description: ${quotedDesc}`);
|
|
9911
|
+
lines.push("---");
|
|
9912
|
+
return lines.join("\n");
|
|
9913
|
+
}
|
|
9914
|
+
function convertSkillContent(pkg, warnings) {
|
|
9915
|
+
var _a, _b, _c, _d;
|
|
9916
|
+
const lines = [];
|
|
9917
|
+
const title = ((_a = pkg.metadata) == null ? void 0 : _a.title) || pkg.name || pkg.id;
|
|
9918
|
+
lines.push(`# ${title}`);
|
|
9919
|
+
lines.push("");
|
|
9920
|
+
if (pkg.description || ((_b = pkg.metadata) == null ? void 0 : _b.description)) {
|
|
9921
|
+
lines.push(pkg.description || ((_c = pkg.metadata) == null ? void 0 : _c.description) || "");
|
|
9922
|
+
lines.push("");
|
|
9923
|
+
}
|
|
9924
|
+
for (const section of pkg.content.sections) {
|
|
9925
|
+
if (section.type === "metadata") {
|
|
9926
|
+
continue;
|
|
9927
|
+
}
|
|
9928
|
+
if (section.type === "tools") {
|
|
9929
|
+
warnings.push("Tools section converted to reference list");
|
|
9930
|
+
continue;
|
|
9931
|
+
}
|
|
9932
|
+
if (section.type === "persona") {
|
|
9933
|
+
if ((_d = section.data) == null ? void 0 : _d.role) {
|
|
9934
|
+
lines.push("## When to Use");
|
|
9935
|
+
lines.push("");
|
|
9936
|
+
lines.push(section.data.role);
|
|
9937
|
+
lines.push("");
|
|
9938
|
+
}
|
|
9939
|
+
continue;
|
|
9940
|
+
}
|
|
9941
|
+
const sectionContent = convertSection4(section, warnings);
|
|
9942
|
+
if (sectionContent) {
|
|
9943
|
+
lines.push(sectionContent);
|
|
9944
|
+
lines.push("");
|
|
9945
|
+
}
|
|
9946
|
+
}
|
|
9947
|
+
return lines.join("\n").trim();
|
|
9948
|
+
}
|
|
9949
|
+
function generateInstructionFrontmatter(config) {
|
|
9871
9950
|
const lines = ["---"];
|
|
9872
9951
|
if (config.applyTo) {
|
|
9873
9952
|
const patterns = Array.isArray(config.applyTo) ? config.applyTo : [config.applyTo];
|
|
@@ -10002,7 +10081,7 @@ function toKiro(pkg, options = {}) {
|
|
|
10002
10081
|
if (config.inclusion === "fileMatch" && !config.fileMatchPattern) {
|
|
10003
10082
|
throw new Error("fileMatch inclusion mode requires fileMatchPattern");
|
|
10004
10083
|
}
|
|
10005
|
-
const frontmatter =
|
|
10084
|
+
const frontmatter = generateFrontmatter(config);
|
|
10006
10085
|
const content = convertContent4(pkg, warnings, config);
|
|
10007
10086
|
const fullContent = `${frontmatter}
|
|
10008
10087
|
|
|
@@ -10029,7 +10108,7 @@ ${content}`;
|
|
|
10029
10108
|
};
|
|
10030
10109
|
}
|
|
10031
10110
|
}
|
|
10032
|
-
function
|
|
10111
|
+
function generateFrontmatter(config) {
|
|
10033
10112
|
const lines = ["---"];
|
|
10034
10113
|
lines.push(`inclusion: ${config.inclusion || "always"}`);
|
|
10035
10114
|
if (config.inclusion === "fileMatch" && config.fileMatchPattern) {
|
|
@@ -11711,7 +11790,7 @@ function toZencoder(pkg, options = {}) {
|
|
|
11711
11790
|
const content = convertContent12(pkg, warnings, config);
|
|
11712
11791
|
let fullContent;
|
|
11713
11792
|
if (includeFrontmatter) {
|
|
11714
|
-
const frontmatter =
|
|
11793
|
+
const frontmatter = generateFrontmatter2(pkg, config);
|
|
11715
11794
|
if (frontmatter) {
|
|
11716
11795
|
fullContent = `${frontmatter}
|
|
11717
11796
|
|
|
@@ -11744,7 +11823,7 @@ ${content}`;
|
|
|
11744
11823
|
};
|
|
11745
11824
|
}
|
|
11746
11825
|
}
|
|
11747
|
-
function
|
|
11826
|
+
function generateFrontmatter2(pkg, config) {
|
|
11748
11827
|
var _a, _b, _c;
|
|
11749
11828
|
const lines = [];
|
|
11750
11829
|
let hasContent = false;
|
|
@@ -12546,7 +12625,7 @@ var init_to_mcp_server = __esm({
|
|
|
12546
12625
|
});
|
|
12547
12626
|
|
|
12548
12627
|
// ../converters/dist/schema-files.js
|
|
12549
|
-
var import_module, import_path7, schemaRequire, convertersPackagePath, convertersDir, loadSchema2, formatRegistrySchema, agentsMdSchema, canonicalSchema, claudeSchema, continueSchema, copilotSchema, cursorSchema, droidSchema, geminiMdSchema, geminiSchema, kiroSteeringSchema, opencodeSchema, rulerSchema, windsurfSchema, traeSchema, aiderSchema, zencoderSchema, replitSchema, zedSchema, claudeAgentSchema, claudeHookSchema, claudeSkillSchema, claudeSlashCommandSchema, cursorCommandSchema, cursorHooksSchema, droidHookSchema, droidSkillSchema, droidSlashCommandSchema, kiroAgentSchema, kiroHookSchema, opencodeSlashCommandSchema;
|
|
12628
|
+
var import_module, import_path7, schemaRequire, convertersPackagePath, convertersDir, loadSchema2, formatRegistrySchema, agentsMdSchema, canonicalSchema, claudeSchema, continueSchema, copilotSchema, cursorSchema, droidSchema, geminiMdSchema, geminiSchema, kiroSteeringSchema, opencodeSchema, rulerSchema, windsurfSchema, traeSchema, aiderSchema, zencoderSchema, replitSchema, zedSchema, claudeAgentSchema, claudeHookSchema, claudeSkillSchema, claudeSlashCommandSchema, copilotSkillSchema, cursorCommandSchema, cursorHooksSchema, droidHookSchema, droidSkillSchema, droidSlashCommandSchema, kiroAgentSchema, kiroHookSchema, opencodeSlashCommandSchema;
|
|
12550
12629
|
var init_schema_files = __esm({
|
|
12551
12630
|
"../converters/dist/schema-files.js"() {
|
|
12552
12631
|
"use strict";
|
|
@@ -12580,6 +12659,7 @@ var init_schema_files = __esm({
|
|
|
12580
12659
|
claudeHookSchema = loadSchema2("claude-hook.schema.json");
|
|
12581
12660
|
claudeSkillSchema = loadSchema2("claude-skill.schema.json");
|
|
12582
12661
|
claudeSlashCommandSchema = loadSchema2("claude-slash-command.schema.json");
|
|
12662
|
+
copilotSkillSchema = loadSchema2("copilot-skill.schema.json");
|
|
12583
12663
|
cursorCommandSchema = loadSchema2("cursor-command.schema.json");
|
|
12584
12664
|
cursorHooksSchema = loadSchema2("cursor-hooks.schema.json");
|
|
12585
12665
|
droidHookSchema = loadSchema2("droid-hook.schema.json");
|
|
@@ -12717,7 +12797,7 @@ var init_format_registry = __esm({
|
|
|
12717
12797
|
},
|
|
12718
12798
|
copilot: {
|
|
12719
12799
|
name: "GitHub Copilot",
|
|
12720
|
-
description: "GitHub Copilot instructions
|
|
12800
|
+
description: "GitHub Copilot instructions, chat modes, and skills",
|
|
12721
12801
|
documentationUrl: "https://docs.github.com/en/copilot",
|
|
12722
12802
|
subtypes: {
|
|
12723
12803
|
rule: {
|
|
@@ -12729,6 +12809,14 @@ var init_format_registry = __esm({
|
|
|
12729
12809
|
directory: ".github/chatmodes",
|
|
12730
12810
|
filePatterns: ["*.chatmode.md"],
|
|
12731
12811
|
fileExtension: ".chatmode.md"
|
|
12812
|
+
},
|
|
12813
|
+
skill: {
|
|
12814
|
+
directory: ".github/skills",
|
|
12815
|
+
filePatterns: ["SKILL.md"],
|
|
12816
|
+
nested: true,
|
|
12817
|
+
nestedIndicator: "SKILL.md",
|
|
12818
|
+
usesPackageSubdirectory: true,
|
|
12819
|
+
fileExtension: ".md"
|
|
12732
12820
|
}
|
|
12733
12821
|
}
|
|
12734
12822
|
},
|
|
@@ -13356,6 +13444,7 @@ __export(dist_exports, {
|
|
|
13356
13444
|
claudeSlashCommandSchema: () => claudeSlashCommandSchema,
|
|
13357
13445
|
continueSchema: () => continueSchema,
|
|
13358
13446
|
copilotSchema: () => copilotSchema,
|
|
13447
|
+
copilotSkillSchema: () => copilotSkillSchema,
|
|
13359
13448
|
createMinimalPluginJson: () => createMinimalPluginJson,
|
|
13360
13449
|
cursorCommandSchema: () => cursorCommandSchema,
|
|
13361
13450
|
cursorHooksSchema: () => cursorHooksSchema,
|
|
@@ -17204,6 +17293,8 @@ This could indicate:
|
|
|
17204
17293
|
}
|
|
17205
17294
|
} else if (effectiveFormat === "droid" && effectiveSubtype === "skill") {
|
|
17206
17295
|
destPath = `${destDir}/SKILL.md`;
|
|
17296
|
+
} else if (effectiveFormat === "copilot" && effectiveSubtype === "skill") {
|
|
17297
|
+
destPath = `${destDir}/SKILL.md`;
|
|
17207
17298
|
} else {
|
|
17208
17299
|
const nativeSubtypes2 = import_types.FORMAT_NATIVE_SUBTYPES[effectiveFormat];
|
|
17209
17300
|
const needsProgressiveDisclosureHere = nativeSubtypes2 && !nativeSubtypes2.includes(effectiveSubtype) && (effectiveSubtype === "skill" || effectiveSubtype === "agent" || effectiveSubtype === "slash-command");
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://registry.prpm.dev/api/v1/schemas/copilot/skill.json",
|
|
4
|
+
"$comment": "https://code.visualstudio.com/docs/copilot/customization/agent-skills",
|
|
5
|
+
"title": "GitHub Copilot Skill Format",
|
|
6
|
+
"description": "JSON Schema for GitHub Copilot agent skills (.github/skills/*/SKILL.md)",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"required": ["frontmatter", "content"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"frontmatter": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"description": "YAML frontmatter with skill metadata",
|
|
13
|
+
"required": ["name", "description"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"name": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Unique identifier for the skill. Must be lowercase, using hyphens for spaces.",
|
|
18
|
+
"maxLength": 64,
|
|
19
|
+
"pattern": "^[a-z0-9-]+$"
|
|
20
|
+
},
|
|
21
|
+
"description": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Description of what the skill does and when to use it. Be specific about both capabilities and use cases.",
|
|
24
|
+
"maxLength": 1024
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"additionalProperties": false
|
|
28
|
+
},
|
|
29
|
+
"content": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "Markdown body with detailed instructions, procedures, examples, and references to bundled resources."
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"examples": [
|
|
35
|
+
{
|
|
36
|
+
"frontmatter": {
|
|
37
|
+
"name": "webapp-testing",
|
|
38
|
+
"description": "Guides testing of web applications using browser automation and testing frameworks"
|
|
39
|
+
},
|
|
40
|
+
"content": "# Web Application Testing\n\nThis skill helps you test web applications effectively.\n\n## Procedures\n\n1. Set up testing environment\n2. Write unit tests\n3. Run integration tests\n\n## Resources\n\n- [Test template](./test-template.ts)"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"frontmatter": {
|
|
44
|
+
"name": "api-documentation",
|
|
45
|
+
"description": "Generates and maintains API documentation following OpenAPI specifications"
|
|
46
|
+
},
|
|
47
|
+
"content": "# API Documentation\n\nThis skill assists with creating comprehensive API documentation.\n\n## Guidelines\n\n- Document all endpoints\n- Include request/response examples\n- Specify authentication requirements"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prpm",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.16",
|
|
4
4
|
"description": "Prompt Package Manager CLI - Install and manage prompt-based files",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -45,9 +45,9 @@
|
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@octokit/rest": "^22.0.0",
|
|
48
|
-
"@pr-pm/converters": "^2.1.
|
|
49
|
-
"@pr-pm/registry-client": "^2.3.
|
|
50
|
-
"@pr-pm/types": "^2.1.
|
|
48
|
+
"@pr-pm/converters": "^2.1.17",
|
|
49
|
+
"@pr-pm/registry-client": "^2.3.16",
|
|
50
|
+
"@pr-pm/types": "^2.1.17",
|
|
51
51
|
"ajv": "^8.17.1",
|
|
52
52
|
"ajv-formats": "^3.0.1",
|
|
53
53
|
"commander": "^11.1.0",
|