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://github.blog/changelog/2025-08-28-copilot-coding-agent-now-supports-agents-md-custom-instructions/",
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": false,
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 coding agent supports AGENTS.md, CLAUDE.md, GEMINI.md, and .instructions.md custom instructions (as of August 2025). Full agents.md support."
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 isPathSpecific = !!config.applyTo;
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 = generateFrontmatter(config);
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 generateFrontmatter(config) {
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 = generateFrontmatter2(config);
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 generateFrontmatter2(config) {
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 = generateFrontmatter3(pkg, config);
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 generateFrontmatter3(pkg, config) {
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 and chat modes",
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.15",
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.16",
49
- "@pr-pm/registry-client": "^2.3.15",
50
- "@pr-pm/types": "^2.1.16",
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",