prpm 2.1.14 → 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.
- package/dist/format-capabilities.json +3 -3
- package/dist/index.js +119 -13
- package/dist/schemas/copilot-skill.schema.json +50 -0
- package/package.json +4 -4
|
@@ -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
|
@@ -7290,6 +7290,15 @@ function fromOpencode(content, metadata) {
|
|
|
7290
7290
|
disable: fm.disable
|
|
7291
7291
|
};
|
|
7292
7292
|
}
|
|
7293
|
+
if (fm.template) {
|
|
7294
|
+
metadataSection.data.opencodeSlashCommand = {
|
|
7295
|
+
template: fm.template,
|
|
7296
|
+
description: fm.description,
|
|
7297
|
+
agent: fm.agent,
|
|
7298
|
+
model: fm.model,
|
|
7299
|
+
subtask: fm.subtask
|
|
7300
|
+
};
|
|
7301
|
+
}
|
|
7293
7302
|
sections.push(metadataSection);
|
|
7294
7303
|
if (fm.tools) {
|
|
7295
7304
|
const enabledTools = Object.entries(fm.tools).filter(([_, enabled]) => enabled === true).map(([tool, _]) => {
|
|
@@ -7303,7 +7312,11 @@ function fromOpencode(content, metadata) {
|
|
|
7303
7312
|
"webfetch": "WebFetch",
|
|
7304
7313
|
"websearch": "WebSearch"
|
|
7305
7314
|
};
|
|
7306
|
-
|
|
7315
|
+
const normalized = toolMap[tool.toLowerCase()];
|
|
7316
|
+
if (normalized) {
|
|
7317
|
+
return normalized;
|
|
7318
|
+
}
|
|
7319
|
+
return tool.charAt(0).toUpperCase() + tool.slice(1).toLowerCase();
|
|
7307
7320
|
});
|
|
7308
7321
|
if (enabledTools.length > 0) {
|
|
7309
7322
|
const toolsSection = {
|
|
@@ -7325,6 +7338,9 @@ function fromOpencode(content, metadata) {
|
|
|
7325
7338
|
version: "1.0",
|
|
7326
7339
|
sections
|
|
7327
7340
|
};
|
|
7341
|
+
const templateValue = fm.template;
|
|
7342
|
+
const isSlashCommand = typeof templateValue === "string" && templateValue.trim().length > 0;
|
|
7343
|
+
const detectedSubtype = isSlashCommand ? "slash-command" : "agent";
|
|
7328
7344
|
const pkg = {
|
|
7329
7345
|
...metadata,
|
|
7330
7346
|
id: metadata.id,
|
|
@@ -7334,11 +7350,10 @@ function fromOpencode(content, metadata) {
|
|
|
7334
7350
|
description: metadata.description || fm.description || "",
|
|
7335
7351
|
tags: metadata.tags || [],
|
|
7336
7352
|
format: "opencode",
|
|
7337
|
-
subtype:
|
|
7338
|
-
// OpenCode only supports agents
|
|
7353
|
+
subtype: detectedSubtype,
|
|
7339
7354
|
content: canonicalContent
|
|
7340
7355
|
};
|
|
7341
|
-
setTaxonomy(pkg, "opencode",
|
|
7356
|
+
setTaxonomy(pkg, "opencode", detectedSubtype);
|
|
7342
7357
|
return pkg;
|
|
7343
7358
|
}
|
|
7344
7359
|
var init_from_opencode = __esm({
|
|
@@ -8743,6 +8758,7 @@ function loadSchema(format, subtype) {
|
|
|
8743
8758
|
"claude:slash-command": "claude-slash-command.schema.json",
|
|
8744
8759
|
"claude:hook": "claude-hook.schema.json",
|
|
8745
8760
|
"claude:plugin": "claude-plugin.schema.json",
|
|
8761
|
+
"copilot:skill": "copilot-skill.schema.json",
|
|
8746
8762
|
"cursor:slash-command": "cursor-command.schema.json",
|
|
8747
8763
|
"cursor:hook": "cursor-hooks.schema.json",
|
|
8748
8764
|
// cursor + hook subtype uses cursor-hooks schema
|
|
@@ -9815,7 +9831,11 @@ function toCopilot(pkg, options = {}) {
|
|
|
9815
9831
|
let qualityScore = 100;
|
|
9816
9832
|
try {
|
|
9817
9833
|
const config = options.copilotConfig || {};
|
|
9818
|
-
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
|
+
}
|
|
9819
9839
|
if (isPathSpecific && !config.applyTo) {
|
|
9820
9840
|
warnings.push("Path-specific instruction requires applyTo pattern");
|
|
9821
9841
|
qualityScore -= 20;
|
|
@@ -9823,7 +9843,7 @@ function toCopilot(pkg, options = {}) {
|
|
|
9823
9843
|
const content = convertContent3(pkg, warnings, config);
|
|
9824
9844
|
let fullContent;
|
|
9825
9845
|
if (isPathSpecific && config.applyTo) {
|
|
9826
|
-
const frontmatter =
|
|
9846
|
+
const frontmatter = generateInstructionFrontmatter(config);
|
|
9827
9847
|
fullContent = `${frontmatter}
|
|
9828
9848
|
|
|
9829
9849
|
${content}`;
|
|
@@ -9852,7 +9872,81 @@ ${content}`;
|
|
|
9852
9872
|
};
|
|
9853
9873
|
}
|
|
9854
9874
|
}
|
|
9855
|
-
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) {
|
|
9856
9950
|
const lines = ["---"];
|
|
9857
9951
|
if (config.applyTo) {
|
|
9858
9952
|
const patterns = Array.isArray(config.applyTo) ? config.applyTo : [config.applyTo];
|
|
@@ -9987,7 +10081,7 @@ function toKiro(pkg, options = {}) {
|
|
|
9987
10081
|
if (config.inclusion === "fileMatch" && !config.fileMatchPattern) {
|
|
9988
10082
|
throw new Error("fileMatch inclusion mode requires fileMatchPattern");
|
|
9989
10083
|
}
|
|
9990
|
-
const frontmatter =
|
|
10084
|
+
const frontmatter = generateFrontmatter(config);
|
|
9991
10085
|
const content = convertContent4(pkg, warnings, config);
|
|
9992
10086
|
const fullContent = `${frontmatter}
|
|
9993
10087
|
|
|
@@ -10014,7 +10108,7 @@ ${content}`;
|
|
|
10014
10108
|
};
|
|
10015
10109
|
}
|
|
10016
10110
|
}
|
|
10017
|
-
function
|
|
10111
|
+
function generateFrontmatter(config) {
|
|
10018
10112
|
const lines = ["---"];
|
|
10019
10113
|
lines.push(`inclusion: ${config.inclusion || "always"}`);
|
|
10020
10114
|
if (config.inclusion === "fileMatch" && config.fileMatchPattern) {
|
|
@@ -11696,7 +11790,7 @@ function toZencoder(pkg, options = {}) {
|
|
|
11696
11790
|
const content = convertContent12(pkg, warnings, config);
|
|
11697
11791
|
let fullContent;
|
|
11698
11792
|
if (includeFrontmatter) {
|
|
11699
|
-
const frontmatter =
|
|
11793
|
+
const frontmatter = generateFrontmatter2(pkg, config);
|
|
11700
11794
|
if (frontmatter) {
|
|
11701
11795
|
fullContent = `${frontmatter}
|
|
11702
11796
|
|
|
@@ -11729,7 +11823,7 @@ ${content}`;
|
|
|
11729
11823
|
};
|
|
11730
11824
|
}
|
|
11731
11825
|
}
|
|
11732
|
-
function
|
|
11826
|
+
function generateFrontmatter2(pkg, config) {
|
|
11733
11827
|
var _a, _b, _c;
|
|
11734
11828
|
const lines = [];
|
|
11735
11829
|
let hasContent = false;
|
|
@@ -12531,7 +12625,7 @@ var init_to_mcp_server = __esm({
|
|
|
12531
12625
|
});
|
|
12532
12626
|
|
|
12533
12627
|
// ../converters/dist/schema-files.js
|
|
12534
|
-
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;
|
|
12535
12629
|
var init_schema_files = __esm({
|
|
12536
12630
|
"../converters/dist/schema-files.js"() {
|
|
12537
12631
|
"use strict";
|
|
@@ -12565,6 +12659,7 @@ var init_schema_files = __esm({
|
|
|
12565
12659
|
claudeHookSchema = loadSchema2("claude-hook.schema.json");
|
|
12566
12660
|
claudeSkillSchema = loadSchema2("claude-skill.schema.json");
|
|
12567
12661
|
claudeSlashCommandSchema = loadSchema2("claude-slash-command.schema.json");
|
|
12662
|
+
copilotSkillSchema = loadSchema2("copilot-skill.schema.json");
|
|
12568
12663
|
cursorCommandSchema = loadSchema2("cursor-command.schema.json");
|
|
12569
12664
|
cursorHooksSchema = loadSchema2("cursor-hooks.schema.json");
|
|
12570
12665
|
droidHookSchema = loadSchema2("droid-hook.schema.json");
|
|
@@ -12702,7 +12797,7 @@ var init_format_registry = __esm({
|
|
|
12702
12797
|
},
|
|
12703
12798
|
copilot: {
|
|
12704
12799
|
name: "GitHub Copilot",
|
|
12705
|
-
description: "GitHub Copilot instructions
|
|
12800
|
+
description: "GitHub Copilot instructions, chat modes, and skills",
|
|
12706
12801
|
documentationUrl: "https://docs.github.com/en/copilot",
|
|
12707
12802
|
subtypes: {
|
|
12708
12803
|
rule: {
|
|
@@ -12714,6 +12809,14 @@ var init_format_registry = __esm({
|
|
|
12714
12809
|
directory: ".github/chatmodes",
|
|
12715
12810
|
filePatterns: ["*.chatmode.md"],
|
|
12716
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"
|
|
12717
12820
|
}
|
|
12718
12821
|
}
|
|
12719
12822
|
},
|
|
@@ -13341,6 +13444,7 @@ __export(dist_exports, {
|
|
|
13341
13444
|
claudeSlashCommandSchema: () => claudeSlashCommandSchema,
|
|
13342
13445
|
continueSchema: () => continueSchema,
|
|
13343
13446
|
copilotSchema: () => copilotSchema,
|
|
13447
|
+
copilotSkillSchema: () => copilotSkillSchema,
|
|
13344
13448
|
createMinimalPluginJson: () => createMinimalPluginJson,
|
|
13345
13449
|
cursorCommandSchema: () => cursorCommandSchema,
|
|
13346
13450
|
cursorHooksSchema: () => cursorHooksSchema,
|
|
@@ -17189,6 +17293,8 @@ This could indicate:
|
|
|
17189
17293
|
}
|
|
17190
17294
|
} else if (effectiveFormat === "droid" && effectiveSubtype === "skill") {
|
|
17191
17295
|
destPath = `${destDir}/SKILL.md`;
|
|
17296
|
+
} else if (effectiveFormat === "copilot" && effectiveSubtype === "skill") {
|
|
17297
|
+
destPath = `${destDir}/SKILL.md`;
|
|
17192
17298
|
} else {
|
|
17193
17299
|
const nativeSubtypes2 = import_types.FORMAT_NATIVE_SUBTYPES[effectiveFormat];
|
|
17194
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",
|