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.
- package/dist/format-capabilities.json +3 -3
- package/dist/index.js +321 -15
- package/dist/schemas/agent-skills.schema.json +78 -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
|
@@ -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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 (
|
|
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
|
|
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(`## ${
|
|
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
|
|
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
|
|
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: ".
|
|
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.
|
|
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.
|
|
49
|
-
"@pr-pm/registry-client": "^2.3.
|
|
50
|
-
"@pr-pm/types": "^2.1.
|
|
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",
|