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.
@@ -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
@@ -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
- return toolMap[tool.toLowerCase()] || tool;
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: "agent",
7338
- // OpenCode only supports agents
7353
+ subtype: detectedSubtype,
7339
7354
  content: canonicalContent
7340
7355
  };
7341
- setTaxonomy(pkg, "opencode", "agent");
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 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
+ }
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 = generateFrontmatter(config);
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 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) {
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 = generateFrontmatter2(config);
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 generateFrontmatter2(config) {
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 = generateFrontmatter3(pkg, config);
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 generateFrontmatter3(pkg, config) {
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 and chat modes",
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.14",
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.15",
49
- "@pr-pm/registry-client": "^2.3.14",
50
- "@pr-pm/types": "^2.1.15",
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",