prpm 2.1.15 → 2.1.17

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
@@ -8645,6 +8645,96 @@ var init_from_zed = __esm({
8645
8645
  }
8646
8646
  });
8647
8647
 
8648
+ // ../converters/dist/from-codex.js
8649
+ function parseFrontmatter8(content) {
8650
+ const normalizedContent = content.replace(/\r\n/g, "\n");
8651
+ const match = normalizedContent.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
8652
+ if (!match) {
8653
+ return { frontmatter: {}, body: normalizedContent };
8654
+ }
8655
+ try {
8656
+ const frontmatter = jsYaml.load(match[1]);
8657
+ const body = match[2];
8658
+ return { frontmatter: frontmatter || {}, body };
8659
+ } catch (error) {
8660
+ return { frontmatter: {}, body: normalizedContent };
8661
+ }
8662
+ }
8663
+ function parseAllowedTools(toolsString) {
8664
+ return toolsString.split(/\s+/).filter(Boolean).map((tool) => {
8665
+ const match = tool.match(/^([A-Za-z]+)(?:\([^)]*\))?$/);
8666
+ return match ? match[1] : tool;
8667
+ }).filter((tool, index, arr) => arr.indexOf(tool) === index);
8668
+ }
8669
+ function fromCodex(content, metadata) {
8670
+ const { frontmatter, body } = parseFrontmatter8(content);
8671
+ const fm = frontmatter;
8672
+ const sections = [];
8673
+ const metadataSection = {
8674
+ type: "metadata",
8675
+ data: {
8676
+ title: fm.name || metadata.name || metadata.id,
8677
+ description: fm.description || metadata.description || "",
8678
+ version: metadata.version || "1.0.0",
8679
+ author: metadata.author
8680
+ }
8681
+ };
8682
+ metadataSection.data.agentSkills = {
8683
+ name: fm.name,
8684
+ license: fm.license,
8685
+ compatibility: fm.compatibility,
8686
+ allowedTools: fm["allowed-tools"],
8687
+ metadata: fm.metadata
8688
+ };
8689
+ sections.push(metadataSection);
8690
+ if (fm["allowed-tools"]) {
8691
+ const tools = parseAllowedTools(fm["allowed-tools"]);
8692
+ if (tools.length > 0) {
8693
+ const toolsSection = {
8694
+ type: "tools",
8695
+ tools,
8696
+ description: "Pre-approved tools for this skill"
8697
+ };
8698
+ sections.push(toolsSection);
8699
+ }
8700
+ }
8701
+ if (body.trim()) {
8702
+ sections.push({
8703
+ type: "instructions",
8704
+ title: "Instructions",
8705
+ content: body.trim()
8706
+ });
8707
+ }
8708
+ const canonicalContent = {
8709
+ format: "canonical",
8710
+ version: "1.0",
8711
+ sections
8712
+ };
8713
+ const pkg = {
8714
+ ...metadata,
8715
+ id: metadata.id,
8716
+ name: fm.name || metadata.name || metadata.id,
8717
+ version: metadata.version,
8718
+ author: metadata.author,
8719
+ description: fm.description || metadata.description || "",
8720
+ license: fm.license || metadata.license,
8721
+ tags: metadata.tags || [],
8722
+ format: "codex",
8723
+ subtype: "skill",
8724
+ content: canonicalContent
8725
+ };
8726
+ setTaxonomy(pkg, "codex", "skill");
8727
+ return pkg;
8728
+ }
8729
+ var init_from_codex = __esm({
8730
+ "../converters/dist/from-codex.js"() {
8731
+ "use strict";
8732
+ init_cjs_shims();
8733
+ init_taxonomy_utils();
8734
+ init_js_yaml();
8735
+ }
8736
+ });
8737
+
8648
8738
  // ../converters/dist/from-mcp-server.js
8649
8739
  function fromMCPServer(mcpServerJson, metadata) {
8650
8740
  var _a;
@@ -8758,6 +8848,7 @@ function loadSchema(format, subtype) {
8758
8848
  "claude:slash-command": "claude-slash-command.schema.json",
8759
8849
  "claude:hook": "claude-hook.schema.json",
8760
8850
  "claude:plugin": "claude-plugin.schema.json",
8851
+ "copilot:skill": "agent-skills.schema.json",
8761
8852
  "cursor:slash-command": "cursor-command.schema.json",
8762
8853
  "cursor:hook": "cursor-hooks.schema.json",
8763
8854
  // cursor + hook subtype uses cursor-hooks schema
@@ -8768,6 +8859,7 @@ function loadSchema(format, subtype) {
8768
8859
  "droid:hook": "droid-hook.schema.json",
8769
8860
  "opencode:slash-command": "opencode-slash-command.schema.json",
8770
8861
  "opencode:plugin": "opencode-plugin.schema.json",
8862
+ "codex:skill": "agent-skills.schema.json",
8771
8863
  "gemini:extension": "gemini-extension.schema.json",
8772
8864
  "mcp:server": "mcp-server.schema.json"
8773
8865
  };
@@ -9830,7 +9922,11 @@ function toCopilot(pkg, options = {}) {
9830
9922
  let qualityScore = 100;
9831
9923
  try {
9832
9924
  const config = options.copilotConfig || {};
9833
- const isPathSpecific = !!config.applyTo;
9925
+ const isSkill = config.isSkill || pkg.subtype === "skill";
9926
+ const isPathSpecific = !!config.applyTo && !isSkill;
9927
+ if (isSkill) {
9928
+ return convertToSkill(pkg, config, warnings);
9929
+ }
9834
9930
  if (isPathSpecific && !config.applyTo) {
9835
9931
  warnings.push("Path-specific instruction requires applyTo pattern");
9836
9932
  qualityScore -= 20;
@@ -9838,7 +9934,7 @@ function toCopilot(pkg, options = {}) {
9838
9934
  const content = convertContent3(pkg, warnings, config);
9839
9935
  let fullContent;
9840
9936
  if (isPathSpecific && config.applyTo) {
9841
- const frontmatter = generateFrontmatter(config);
9937
+ const frontmatter = generateInstructionFrontmatter(config);
9842
9938
  fullContent = `${frontmatter}
9843
9939
 
9844
9940
  ${content}`;
@@ -9867,7 +9963,99 @@ ${content}`;
9867
9963
  };
9868
9964
  }
9869
9965
  }
9870
- function generateFrontmatter(config) {
9966
+ function convertToSkill(pkg, config, warnings) {
9967
+ var _a, _b;
9968
+ let qualityScore = 100;
9969
+ const metadataSection = pkg.content.sections.find((s) => s.type === "metadata");
9970
+ const agentSkillsData = (metadataSection == null ? void 0 : metadataSection.type) === "metadata" ? metadataSection.data.agentSkills : void 0;
9971
+ const skillName = (agentSkillsData == null ? void 0 : agentSkillsData.name) || 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);
9972
+ const skillDescription = config.skillDescription || pkg.description || ((_b = pkg.metadata) == null ? void 0 : _b.description) || "";
9973
+ if (!skillDescription) {
9974
+ warnings.push("Skill requires a description - using empty string");
9975
+ qualityScore -= 20;
9976
+ }
9977
+ if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(skillName)) {
9978
+ warnings.push("Skill name should be lowercase alphanumeric with single hyphens (no start/end/consecutive hyphens)");
9979
+ qualityScore -= 10;
9980
+ }
9981
+ const frontmatter = generateSkillFrontmatter(skillName, skillDescription, pkg, agentSkillsData);
9982
+ const content = convertSkillContent(pkg, warnings);
9983
+ const fullContent = `${frontmatter}
9984
+
9985
+ ${content}`;
9986
+ const lossyConversion = warnings.some((w) => w.includes("not supported") || w.includes("skipped"));
9987
+ if (lossyConversion) {
9988
+ qualityScore -= 10;
9989
+ }
9990
+ return {
9991
+ content: fullContent,
9992
+ format: "copilot",
9993
+ warnings: warnings.length > 0 ? warnings : void 0,
9994
+ lossyConversion,
9995
+ qualityScore
9996
+ };
9997
+ }
9998
+ function generateSkillFrontmatter(name, description, pkg, agentSkillsData) {
9999
+ const lines = ["---"];
10000
+ lines.push(`name: ${name}`);
10001
+ const truncatedDesc = description.length > 1024 ? description.slice(0, 1021) + "..." : description;
10002
+ const quotedDesc = `"${truncatedDesc.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\r/g, "\\r").replace(/\n/g, "\\n")}"`;
10003
+ lines.push(`description: ${quotedDesc}`);
10004
+ const license = (agentSkillsData == null ? void 0 : agentSkillsData.license) || pkg.license;
10005
+ if (license) {
10006
+ lines.push(`license: ${license}`);
10007
+ }
10008
+ if (agentSkillsData == null ? void 0 : agentSkillsData.compatibility) {
10009
+ lines.push(`compatibility: "${agentSkillsData.compatibility}"`);
10010
+ }
10011
+ if (agentSkillsData == null ? void 0 : agentSkillsData.allowedTools) {
10012
+ lines.push(`allowed-tools: ${agentSkillsData.allowedTools}`);
10013
+ }
10014
+ if ((agentSkillsData == null ? void 0 : agentSkillsData.metadata) && Object.keys(agentSkillsData.metadata).length > 0) {
10015
+ lines.push("metadata:");
10016
+ for (const [key, value] of Object.entries(agentSkillsData.metadata)) {
10017
+ lines.push(` ${key}: "${value}"`);
10018
+ }
10019
+ }
10020
+ lines.push("---");
10021
+ return lines.join("\n");
10022
+ }
10023
+ function convertSkillContent(pkg, warnings) {
10024
+ var _a, _b, _c, _d;
10025
+ const lines = [];
10026
+ const title = ((_a = pkg.metadata) == null ? void 0 : _a.title) || pkg.name || pkg.id;
10027
+ lines.push(`# ${title}`);
10028
+ lines.push("");
10029
+ if (pkg.description || ((_b = pkg.metadata) == null ? void 0 : _b.description)) {
10030
+ lines.push(pkg.description || ((_c = pkg.metadata) == null ? void 0 : _c.description) || "");
10031
+ lines.push("");
10032
+ }
10033
+ for (const section of pkg.content.sections) {
10034
+ if (section.type === "metadata") {
10035
+ continue;
10036
+ }
10037
+ if (section.type === "tools") {
10038
+ warnings.push("Tools section converted to reference list");
10039
+ continue;
10040
+ }
10041
+ if (section.type === "persona") {
10042
+ if ((_d = section.data) == null ? void 0 : _d.role) {
10043
+ lines.push("## When to Use");
10044
+ lines.push("");
10045
+ lines.push(section.data.role);
10046
+ lines.push("");
10047
+ }
10048
+ continue;
10049
+ }
10050
+ const sectionContent = convertSection4(section, warnings);
10051
+ if (sectionContent) {
10052
+ lines.push(sectionContent);
10053
+ lines.push("");
10054
+ }
10055
+ }
10056
+ return lines.join("\n").trim();
10057
+ }
10058
+ function generateInstructionFrontmatter(config) {
9871
10059
  const lines = ["---"];
9872
10060
  if (config.applyTo) {
9873
10061
  const patterns = Array.isArray(config.applyTo) ? config.applyTo : [config.applyTo];
@@ -10002,7 +10190,7 @@ function toKiro(pkg, options = {}) {
10002
10190
  if (config.inclusion === "fileMatch" && !config.fileMatchPattern) {
10003
10191
  throw new Error("fileMatch inclusion mode requires fileMatchPattern");
10004
10192
  }
10005
- const frontmatter = generateFrontmatter2(config);
10193
+ const frontmatter = generateFrontmatter(config);
10006
10194
  const content = convertContent4(pkg, warnings, config);
10007
10195
  const fullContent = `${frontmatter}
10008
10196
 
@@ -10029,7 +10217,7 @@ ${content}`;
10029
10217
  };
10030
10218
  }
10031
10219
  }
10032
- function generateFrontmatter2(config) {
10220
+ function generateFrontmatter(config) {
10033
10221
  const lines = ["---"];
10034
10222
  lines.push(`inclusion: ${config.inclusion || "always"}`);
10035
10223
  if (config.inclusion === "fileMatch" && config.fileMatchPattern) {
@@ -11711,7 +11899,7 @@ function toZencoder(pkg, options = {}) {
11711
11899
  const content = convertContent12(pkg, warnings, config);
11712
11900
  let fullContent;
11713
11901
  if (includeFrontmatter) {
11714
- const frontmatter = generateFrontmatter3(pkg, config);
11902
+ const frontmatter = generateFrontmatter2(pkg, config);
11715
11903
  if (frontmatter) {
11716
11904
  fullContent = `${frontmatter}
11717
11905
 
@@ -11744,7 +11932,7 @@ ${content}`;
11744
11932
  };
11745
11933
  }
11746
11934
  }
11747
- function generateFrontmatter3(pkg, config) {
11935
+ function generateFrontmatter2(pkg, config) {
11748
11936
  var _a, _b, _c;
11749
11937
  const lines = [];
11750
11938
  let hasContent = false;
@@ -12218,9 +12406,12 @@ function toCodex(pkg, options = {}) {
12218
12406
  let qualityScore = 100;
12219
12407
  try {
12220
12408
  const config = options.codexConfig || {};
12409
+ const isSkill = pkg.subtype === "skill";
12221
12410
  const isSlashCommand = pkg.subtype === "slash-command";
12222
12411
  let content;
12223
- if (isSlashCommand) {
12412
+ if (isSkill && !config.forceAgentsMd) {
12413
+ content = convertToSkillMd(pkg, warnings);
12414
+ } else if (isSlashCommand) {
12224
12415
  content = convertSlashCommandToSection(pkg, warnings);
12225
12416
  if (config.appendMode && config.existingContent) {
12226
12417
  content = appendToExistingAgentsMd(config.existingContent, content, pkg.name);
@@ -12250,6 +12441,74 @@ function toCodex(pkg, options = {}) {
12250
12441
  };
12251
12442
  }
12252
12443
  }
12444
+ function convertToSkillMd(pkg, warnings) {
12445
+ var _a;
12446
+ const lines = [];
12447
+ const metadataSection = pkg.content.sections.find((s) => s.type === "metadata");
12448
+ const toolsSection = pkg.content.sections.find((s) => s.type === "tools");
12449
+ const title = ((_a = pkg.metadata) == null ? void 0 : _a.title) || pkg.name;
12450
+ const description = pkg.description || "";
12451
+ const frontmatter = {
12452
+ name: slugify(title),
12453
+ description: truncateDescription(description, 1024)
12454
+ };
12455
+ if (pkg.license) {
12456
+ frontmatter.license = pkg.license;
12457
+ }
12458
+ if ((metadataSection == null ? void 0 : metadataSection.type) === "metadata" && metadataSection.data.agentSkills) {
12459
+ const skillsData = metadataSection.data.agentSkills;
12460
+ if (skillsData.name) {
12461
+ frontmatter.name = skillsData.name;
12462
+ }
12463
+ if (skillsData.license) {
12464
+ frontmatter.license = skillsData.license;
12465
+ }
12466
+ if (skillsData.compatibility) {
12467
+ frontmatter.compatibility = skillsData.compatibility;
12468
+ }
12469
+ if (skillsData.allowedTools) {
12470
+ frontmatter["allowed-tools"] = skillsData.allowedTools;
12471
+ }
12472
+ if (skillsData.metadata && Object.keys(skillsData.metadata).length > 0) {
12473
+ frontmatter.metadata = skillsData.metadata;
12474
+ }
12475
+ }
12476
+ if ((toolsSection == null ? void 0 : toolsSection.type) === "tools" && toolsSection.tools.length > 0 && !frontmatter["allowed-tools"]) {
12477
+ frontmatter["allowed-tools"] = toolsSection.tools.join(" ");
12478
+ }
12479
+ lines.push("---");
12480
+ lines.push(jsYaml.dump(frontmatter, { indent: 2, lineWidth: -1 }).trim());
12481
+ lines.push("---");
12482
+ lines.push("");
12483
+ for (const section of pkg.content.sections) {
12484
+ if (section.type === "metadata")
12485
+ continue;
12486
+ if (section.type === "tools")
12487
+ continue;
12488
+ if (section.type === "persona") {
12489
+ warnings.push("Persona section skipped (not supported by Agent Skills format)");
12490
+ continue;
12491
+ }
12492
+ const sectionContent = convertSection13(section, warnings);
12493
+ if (sectionContent) {
12494
+ lines.push(sectionContent);
12495
+ lines.push("");
12496
+ }
12497
+ }
12498
+ return lines.join("\n").trim() + "\n";
12499
+ }
12500
+ function truncateDescription(desc, maxLength) {
12501
+ if (desc.length <= maxLength)
12502
+ return desc;
12503
+ return desc.substring(0, maxLength - 3) + "...";
12504
+ }
12505
+ function slugify(name) {
12506
+ const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
12507
+ if (!slug) {
12508
+ return "unnamed-skill";
12509
+ }
12510
+ return slug.slice(0, 64);
12511
+ }
12253
12512
  function convertSlashCommandToSection(pkg, warnings) {
12254
12513
  const lines = [];
12255
12514
  const commandName = pkg.name.replace(/^\//, "");
@@ -12340,10 +12599,15 @@ function convertToAgentsMd(pkg, warnings) {
12340
12599
  }
12341
12600
  return lines.join("\n").trim();
12342
12601
  }
12602
+ function escapeRegex(str2) {
12603
+ return str2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
12604
+ }
12343
12605
  function appendToExistingAgentsMd(existingContent, newSection, commandName) {
12344
- const sectionHeader = `## ${commandName.replace(/^\//, "")}`;
12606
+ const cleanCommandName = commandName.replace(/^\//, "");
12607
+ const escapedCommandName = escapeRegex(cleanCommandName);
12608
+ const sectionHeader = `## ${cleanCommandName}`;
12345
12609
  if (existingContent.includes(sectionHeader)) {
12346
- const regex = new RegExp(`## ${commandName.replace(/^\//, "")}[\\s\\S]*?(?=## |$)`, "g");
12610
+ const regex = new RegExp(`## ${escapedCommandName}[\\s\\S]*?(?=## |$)`, "g");
12347
12611
  return existingContent.replace(regex, newSection + "\n\n");
12348
12612
  }
12349
12613
  const trimmedExisting = existingContent.trim();
@@ -12457,13 +12721,25 @@ function parseArgumentHint2(hint) {
12457
12721
  }
12458
12722
  return hint.split(/\s+/).filter(Boolean);
12459
12723
  }
12460
- function generateFilename2() {
12724
+ function generateFilename2(pkg) {
12725
+ if ((pkg == null ? void 0 : pkg.subtype) === "skill") {
12726
+ return "SKILL.md";
12727
+ }
12461
12728
  return "AGENTS.md";
12462
12729
  }
12730
+ function isCodexSkillFormat(content) {
12731
+ const normalizedContent = content.replace(/\r\n/g, "\n");
12732
+ const match = normalizedContent.match(/^---\n([\s\S]*?)\n---/);
12733
+ if (!match)
12734
+ return false;
12735
+ const frontmatterText = match[1];
12736
+ return frontmatterText.includes("name:") && frontmatterText.includes("description:");
12737
+ }
12463
12738
  var init_to_codex = __esm({
12464
12739
  "../converters/dist/to-codex.js"() {
12465
12740
  "use strict";
12466
12741
  init_cjs_shims();
12742
+ init_js_yaml();
12467
12743
  }
12468
12744
  });
12469
12745
 
@@ -12546,7 +12822,7 @@ var init_to_mcp_server = __esm({
12546
12822
  });
12547
12823
 
12548
12824
  // ../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;
12825
+ 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, agentSkillsSchema, copilotSkillSchema, codexSkillSchema, cursorCommandSchema, cursorHooksSchema, droidHookSchema, droidSkillSchema, droidSlashCommandSchema, kiroAgentSchema, kiroHookSchema, opencodeSlashCommandSchema;
12550
12826
  var init_schema_files = __esm({
12551
12827
  "../converters/dist/schema-files.js"() {
12552
12828
  "use strict";
@@ -12580,6 +12856,9 @@ var init_schema_files = __esm({
12580
12856
  claudeHookSchema = loadSchema2("claude-hook.schema.json");
12581
12857
  claudeSkillSchema = loadSchema2("claude-skill.schema.json");
12582
12858
  claudeSlashCommandSchema = loadSchema2("claude-slash-command.schema.json");
12859
+ agentSkillsSchema = loadSchema2("agent-skills.schema.json");
12860
+ copilotSkillSchema = agentSkillsSchema;
12861
+ codexSkillSchema = agentSkillsSchema;
12583
12862
  cursorCommandSchema = loadSchema2("cursor-command.schema.json");
12584
12863
  cursorHooksSchema = loadSchema2("cursor-hooks.schema.json");
12585
12864
  droidHookSchema = loadSchema2("droid-hook.schema.json");
@@ -12717,7 +12996,7 @@ var init_format_registry = __esm({
12717
12996
  },
12718
12997
  copilot: {
12719
12998
  name: "GitHub Copilot",
12720
- description: "GitHub Copilot instructions and chat modes",
12999
+ description: "GitHub Copilot instructions, chat modes, and skills",
12721
13000
  documentationUrl: "https://docs.github.com/en/copilot",
12722
13001
  subtypes: {
12723
13002
  rule: {
@@ -12729,6 +13008,14 @@ var init_format_registry = __esm({
12729
13008
  directory: ".github/chatmodes",
12730
13009
  filePatterns: ["*.chatmode.md"],
12731
13010
  fileExtension: ".chatmode.md"
13011
+ },
13012
+ skill: {
13013
+ directory: ".github/skills",
13014
+ filePatterns: ["SKILL.md"],
13015
+ nested: true,
13016
+ nestedIndicator: "SKILL.md",
13017
+ usesPackageSubdirectory: true,
13018
+ fileExtension: ".md"
12732
13019
  }
12733
13020
  }
12734
13021
  },
@@ -12890,7 +13177,8 @@ var init_format_registry = __esm({
12890
13177
  },
12891
13178
  codex: {
12892
13179
  name: "OpenAI Codex CLI",
12893
- description: "OpenAI Codex CLI using AGENTS.md for project instructions",
13180
+ description: "OpenAI Codex CLI skills and AGENTS.md project instructions",
13181
+ documentationUrl: "https://developers.openai.com/codex/skills",
12894
13182
  subtypes: {
12895
13183
  rule: {
12896
13184
  directory: ".",
@@ -12903,7 +13191,7 @@ var init_format_registry = __esm({
12903
13191
  fileExtension: ".md"
12904
13192
  },
12905
13193
  skill: {
12906
- directory: ".openskills",
13194
+ directory: ".codex/skills",
12907
13195
  filePatterns: ["SKILL.md"],
12908
13196
  nested: true,
12909
13197
  nestedIndicator: "SKILL.md",
@@ -13346,6 +13634,7 @@ __export(dist_exports, {
13346
13634
  SCRIPT_LANGUAGE_EXTENSIONS: () => SCRIPT_LANGUAGE_EXTENSIONS,
13347
13635
  VALID_CURSOR_HOOK_TYPES: () => VALID_CURSOR_HOOK_TYPES,
13348
13636
  VALID_HOOK_MAPPING_STRATEGIES: () => VALID_HOOK_MAPPING_STRATEGIES,
13637
+ agentSkillsSchema: () => agentSkillsSchema,
13349
13638
  agentsMdSchema: () => agentsMdSchema,
13350
13639
  aiderSchema: () => aiderSchema,
13351
13640
  canonicalSchema: () => canonicalSchema,
@@ -13354,8 +13643,10 @@ __export(dist_exports, {
13354
13643
  claudeSchema: () => claudeSchema,
13355
13644
  claudeSkillSchema: () => claudeSkillSchema,
13356
13645
  claudeSlashCommandSchema: () => claudeSlashCommandSchema,
13646
+ codexSkillSchema: () => codexSkillSchema,
13357
13647
  continueSchema: () => continueSchema,
13358
13648
  copilotSchema: () => copilotSchema,
13649
+ copilotSkillSchema: () => copilotSkillSchema,
13359
13650
  createMinimalPluginJson: () => createMinimalPluginJson,
13360
13651
  cursorCommandSchema: () => cursorCommandSchema,
13361
13652
  cursorHooksSchema: () => cursorHooksSchema,
@@ -13376,6 +13667,7 @@ __export(dist_exports, {
13376
13667
  fromAider: () => fromAider,
13377
13668
  fromClaude: () => fromClaude,
13378
13669
  fromClaudePlugin: () => fromClaudePlugin,
13670
+ fromCodex: () => fromCodex,
13379
13671
  fromContinue: () => fromContinue,
13380
13672
  fromCopilot: () => fromCopilot,
13381
13673
  fromCursor: () => fromCursor,
@@ -13423,6 +13715,7 @@ __export(dist_exports, {
13423
13715
  isAgentsMdFormat: () => isAgentsMdFormat,
13424
13716
  isAiderFormat: () => isAiderFormat,
13425
13717
  isClaudeFormat: () => isClaudeFormat,
13718
+ isCodexSkillFormat: () => isCodexSkillFormat,
13426
13719
  isContinueFormat: () => isContinueFormat,
13427
13720
  isCopilotFormat: () => isCopilotFormat,
13428
13721
  isCursorFormat: () => isCursorFormat,
@@ -13513,6 +13806,7 @@ var init_dist = __esm({
13513
13806
  init_from_zencoder();
13514
13807
  init_from_replit();
13515
13808
  init_from_zed();
13809
+ init_from_codex();
13516
13810
  init_from_mcp_server();
13517
13811
  init_to_cursor();
13518
13812
  init_to_cursor_hooks();
@@ -17204,6 +17498,8 @@ This could indicate:
17204
17498
  }
17205
17499
  } else if (effectiveFormat === "droid" && effectiveSubtype === "skill") {
17206
17500
  destPath = `${destDir}/SKILL.md`;
17501
+ } else if (effectiveFormat === "copilot" && effectiveSubtype === "skill") {
17502
+ destPath = `${destDir}/SKILL.md`;
17207
17503
  } else {
17208
17504
  const nativeSubtypes2 = import_types.FORMAT_NATIVE_SUBTYPES[effectiveFormat];
17209
17505
  const needsProgressiveDisclosureHere = nativeSubtypes2 && !nativeSubtypes2.includes(effectiveSubtype) && (effectiveSubtype === "skill" || effectiveSubtype === "agent" || effectiveSubtype === "slash-command");
@@ -24820,6 +25116,9 @@ function getDefaultPath(format, filename, subtype, customName) {
24820
25116
  case "droid":
24821
25117
  return (0, import_path23.join)(process.cwd(), ".factory", `${baseName}.md`);
24822
25118
  case "codex":
25119
+ if (subtype === "skill") {
25120
+ return (0, import_path23.join)(process.cwd(), ".codex", "skills", baseName, "SKILL.md");
25121
+ }
24823
25122
  return (0, import_path23.join)(process.cwd(), "AGENTS.md");
24824
25123
  default:
24825
25124
  throw new CLIError(`Unknown format: ${format}`);
@@ -24863,6 +25162,9 @@ function detectFormat(content, filepath) {
24863
25162
  if (filepath.includes(".zed/extensions") || filepath.includes(".zed/slash_commands")) {
24864
25163
  return "zed";
24865
25164
  }
25165
+ if (filepath.includes(".codex/skills") || (0, import_path23.basename)(filepath) === "SKILL.md") {
25166
+ return "codex";
25167
+ }
24866
25168
  if (isCursorHooksFormat(content)) return "cursor-hooks";
24867
25169
  if (isClaudeFormat(content)) {
24868
25170
  if (content.includes("type: skill")) return "claude-skill";
@@ -24878,6 +25180,7 @@ function detectFormat(content, filepath) {
24878
25180
  if (isAgentsMdFormat(content)) return "agents.md";
24879
25181
  if (isRulerFormat(content)) return "ruler";
24880
25182
  if (isZedFormat(content)) return "zed";
25183
+ if (isCodexSkillFormat(content)) return "codex";
24881
25184
  return null;
24882
25185
  }
24883
25186
  async function confirmOverwrite(filepath) {
@@ -24999,6 +25302,9 @@ async function handleConvert(sourcePath, options) {
24999
25302
  case "droid":
25000
25303
  canonicalPkg = fromDroid(content, metadata);
25001
25304
  break;
25305
+ case "codex":
25306
+ canonicalPkg = fromCodex(content, metadata);
25307
+ break;
25002
25308
  default:
25003
25309
  throw new CLIError(`Unsupported source format: ${sourceFormat}`);
25004
25310
  }
@@ -0,0 +1,78 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/agent-skills.json",
4
+ "$comment": "https://agentskills.io/specification",
5
+ "title": "Agent Skills Format",
6
+ "description": "JSON Schema for Agent Skills - a shared standard implemented by Codex, GitHub Copilot, and other AI assistants. Skills are SKILL.md files with YAML frontmatter.",
7
+ "type": "object",
8
+ "required": ["frontmatter", "content"],
9
+ "properties": {
10
+ "frontmatter": {
11
+ "type": "object",
12
+ "required": ["name", "description"],
13
+ "properties": {
14
+ "name": {
15
+ "type": "string",
16
+ "description": "Skill identifier: 1-64 chars, lowercase alphanumeric and hyphens only, cannot start/end with hyphens or contain consecutive hyphens. Must match parent directory name.",
17
+ "minLength": 1,
18
+ "maxLength": 64,
19
+ "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
20
+ },
21
+ "description": {
22
+ "type": "string",
23
+ "description": "Explains what the skill does and when to use it. Should include specific keywords for agent identification. (1-1024 chars)",
24
+ "minLength": 1,
25
+ "maxLength": 1024
26
+ },
27
+ "license": {
28
+ "type": "string",
29
+ "description": "Specifies skill licensing terms. Keep brief (license name or bundled file reference)."
30
+ },
31
+ "compatibility": {
32
+ "type": "string",
33
+ "description": "Indicates environment requirements (products, system packages, network access). Example: 'Requires git, docker, jq, and internet access'",
34
+ "maxLength": 500
35
+ },
36
+ "allowed-tools": {
37
+ "type": "string",
38
+ "description": "Space-delimited list of pre-approved tools. Experimental; support varies by implementation. Example: 'Bash(git:*) Bash(jq:*) Read'"
39
+ },
40
+ "metadata": {
41
+ "type": "object",
42
+ "description": "Arbitrary string key-value pairs for additional properties not defined by the specification",
43
+ "additionalProperties": {
44
+ "type": "string"
45
+ }
46
+ }
47
+ },
48
+ "additionalProperties": true
49
+ },
50
+ "content": {
51
+ "type": "string",
52
+ "description": "Skill instructions as markdown text. Recommended to keep under 5000 tokens for progressive disclosure."
53
+ }
54
+ },
55
+ "examples": [
56
+ {
57
+ "frontmatter": {
58
+ "name": "code-review",
59
+ "description": "Reviews code for best practices, security issues, and improvements. Use when analyzing pull requests, code changes, or conducting security audits.",
60
+ "license": "MIT",
61
+ "compatibility": "Requires git",
62
+ "metadata": {
63
+ "category": "development",
64
+ "version": "1.0.0"
65
+ }
66
+ },
67
+ "content": "You are an expert code reviewer.\n\n## Instructions\n\n- Check for code smells\n- Verify test coverage\n- Suggest improvements"
68
+ },
69
+ {
70
+ "frontmatter": {
71
+ "name": "pdf-processing",
72
+ "description": "Extracts and processes content from PDF documents. Use for document analysis, text extraction, and PDF manipulation tasks.",
73
+ "allowed-tools": "Bash(pdftotext:*) Read Write"
74
+ },
75
+ "content": "Process PDF documents using available command-line tools.\n\n## Capabilities\n\n- Extract text from PDFs\n- Convert PDF pages to images\n- Merge and split PDF files"
76
+ }
77
+ ]
78
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm",
3
- "version": "2.1.15",
3
+ "version": "2.1.17",
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.18",
49
+ "@pr-pm/registry-client": "^2.3.17",
50
+ "@pr-pm/types": "^2.1.18",
51
51
  "ajv": "^8.17.1",
52
52
  "ajv-formats": "^3.0.1",
53
53
  "commander": "^11.1.0",