prpm 2.1.0 → 2.1.1
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 +232 -0
- package/dist/index.js +413 -2
- package/package.json +4 -4
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../schemas/format-capabilities.schema.json",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Format capability matrix for PRPM converters - defines which subtypes each format supports and progressive disclosure fallbacks",
|
|
5
|
+
"lastVerified": "2025-12-06",
|
|
6
|
+
"verificationSources": {
|
|
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/",
|
|
9
|
+
"cursor": "https://docs.cursor.com/context/rules",
|
|
10
|
+
"continue": "https://docs.continue.dev/reference",
|
|
11
|
+
"windsurf": "https://docs.codeium.com/windsurf/cascade",
|
|
12
|
+
"gemini": "https://geminicli.com/docs/extensions/",
|
|
13
|
+
"aider": "https://aider.chat/docs/usage/conventions.html",
|
|
14
|
+
"replit": "https://docs.replit.com/replitai/agent",
|
|
15
|
+
"zed": "https://zed.dev/docs/assistant/assistant-settings"
|
|
16
|
+
},
|
|
17
|
+
"formats": {
|
|
18
|
+
"cursor": {
|
|
19
|
+
"name": "Cursor",
|
|
20
|
+
"supportsSkills": false,
|
|
21
|
+
"supportsPlugins": false,
|
|
22
|
+
"supportsExtensions": false,
|
|
23
|
+
"supportsAgents": false,
|
|
24
|
+
"supportsAgentsMd": true,
|
|
25
|
+
"supportsSlashCommands": true,
|
|
26
|
+
"markdownFallback": "cursor-rules.md",
|
|
27
|
+
"notes": "Cursor supports AGENTS.md files for project instructions. Custom slash commands in .cursor/commands/*.md (introduced v1.6, Sept 2025). Built-in /summarize command. Rules are appended automatically, slash commands are explicit prompts with more weight. No native agent/skill/plugin packages."
|
|
28
|
+
},
|
|
29
|
+
"claude": {
|
|
30
|
+
"name": "Claude Code",
|
|
31
|
+
"supportsSkills": true,
|
|
32
|
+
"supportsPlugins": true,
|
|
33
|
+
"supportsExtensions": false,
|
|
34
|
+
"supportsAgents": true,
|
|
35
|
+
"supportsAgentsMd": false,
|
|
36
|
+
"markdownFallback": "CLAUDE.md",
|
|
37
|
+
"notes": "Claude Code supports skills, agents, and plugins. Uses CLAUDE.md (not AGENTS.md) for project-specific instructions. Feature request open for AGENTS.md support (Issue #6235)."
|
|
38
|
+
},
|
|
39
|
+
"continue": {
|
|
40
|
+
"name": "Continue",
|
|
41
|
+
"supportsSkills": false,
|
|
42
|
+
"supportsPlugins": false,
|
|
43
|
+
"supportsExtensions": false,
|
|
44
|
+
"supportsAgents": false,
|
|
45
|
+
"supportsAgentsMd": false,
|
|
46
|
+
"markdownFallback": "continue-prompts.md",
|
|
47
|
+
"notes": "Continue uses simple prompt files. No native support for advanced package types."
|
|
48
|
+
},
|
|
49
|
+
"windsurf": {
|
|
50
|
+
"name": "Windsurf",
|
|
51
|
+
"supportsSkills": false,
|
|
52
|
+
"supportsPlugins": false,
|
|
53
|
+
"supportsExtensions": false,
|
|
54
|
+
"supportsAgents": false,
|
|
55
|
+
"supportsAgentsMd": false,
|
|
56
|
+
"markdownFallback": "windsurf-rules.md",
|
|
57
|
+
"notes": "Windsurf uses markdown rules with 12K character limit. No advanced package support."
|
|
58
|
+
},
|
|
59
|
+
"copilot": {
|
|
60
|
+
"name": "GitHub Copilot",
|
|
61
|
+
"supportsSkills": false,
|
|
62
|
+
"supportsPlugins": false,
|
|
63
|
+
"supportsExtensions": false,
|
|
64
|
+
"supportsAgents": true,
|
|
65
|
+
"supportsAgentsMd": true,
|
|
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."
|
|
68
|
+
},
|
|
69
|
+
"kiro": {
|
|
70
|
+
"name": "Kiro AI",
|
|
71
|
+
"supportsSkills": false,
|
|
72
|
+
"supportsPlugins": false,
|
|
73
|
+
"supportsExtensions": false,
|
|
74
|
+
"supportsAgents": true,
|
|
75
|
+
"supportsAgentsMd": true,
|
|
76
|
+
"markdownFallback": "kiro-agent.md",
|
|
77
|
+
"notes": "Kiro supports agents in .kiro/agents/ directory. Full agents.md support."
|
|
78
|
+
},
|
|
79
|
+
"gemini": {
|
|
80
|
+
"name": "Gemini CLI",
|
|
81
|
+
"supportsSkills": false,
|
|
82
|
+
"supportsPlugins": false,
|
|
83
|
+
"supportsExtensions": true,
|
|
84
|
+
"supportsAgents": false,
|
|
85
|
+
"supportsAgentsMd": false,
|
|
86
|
+
"supportsSlashCommands": true,
|
|
87
|
+
"markdownFallback": "GEMINI.md",
|
|
88
|
+
"notes": "Gemini CLI uses extensions in gemini-extension.json. Custom slash commands in ~/.gemini/commands/ (user-scoped) or .gemini/commands/ (project-scoped). Built-in commands: /help, /copy, /mcp, /memory, /directory. Only supports GEMINI.md for project context. Does not support AGENT.md or AGENTS.md."
|
|
89
|
+
},
|
|
90
|
+
"opencode": {
|
|
91
|
+
"name": "OpenCode",
|
|
92
|
+
"supportsSkills": false,
|
|
93
|
+
"supportsPlugins": true,
|
|
94
|
+
"supportsExtensions": false,
|
|
95
|
+
"supportsAgents": true,
|
|
96
|
+
"supportsAgentsMd": true,
|
|
97
|
+
"supportsSlashCommands": true,
|
|
98
|
+
"markdownFallback": "opencode-agent.md",
|
|
99
|
+
"notes": "OpenCode supports agents with mode/model/temperature config. Plugins are JavaScript/TypeScript modules in .opencode/plugin with 40+ event hooks. Slash commands available. Full agents.md support."
|
|
100
|
+
},
|
|
101
|
+
"ruler": {
|
|
102
|
+
"name": "Ruler",
|
|
103
|
+
"supportsSkills": false,
|
|
104
|
+
"supportsPlugins": false,
|
|
105
|
+
"supportsExtensions": false,
|
|
106
|
+
"supportsAgents": true,
|
|
107
|
+
"supportsAgentsMd": true,
|
|
108
|
+
"markdownFallback": "ruler-rules.md",
|
|
109
|
+
"notes": "Ruler supports agents in .ruler/agents/ directory. Full agents.md support."
|
|
110
|
+
},
|
|
111
|
+
"droid": {
|
|
112
|
+
"name": "Factory Droid",
|
|
113
|
+
"supportsSkills": true,
|
|
114
|
+
"supportsPlugins": false,
|
|
115
|
+
"supportsExtensions": false,
|
|
116
|
+
"supportsAgents": true,
|
|
117
|
+
"supportsAgentsMd": true,
|
|
118
|
+
"markdownFallback": "droid-skill.md",
|
|
119
|
+
"notes": "Factory Droid supports both skills and agents. Full agents.md support."
|
|
120
|
+
},
|
|
121
|
+
"trae": {
|
|
122
|
+
"name": "Trae",
|
|
123
|
+
"supportsSkills": false,
|
|
124
|
+
"supportsPlugins": false,
|
|
125
|
+
"supportsExtensions": false,
|
|
126
|
+
"supportsAgents": false,
|
|
127
|
+
"supportsAgentsMd": false,
|
|
128
|
+
"markdownFallback": "trae-rules.md",
|
|
129
|
+
"notes": "Trae uses simple markdown rules. No advanced package support."
|
|
130
|
+
},
|
|
131
|
+
"aider": {
|
|
132
|
+
"name": "Aider",
|
|
133
|
+
"supportsSkills": false,
|
|
134
|
+
"supportsPlugins": false,
|
|
135
|
+
"supportsExtensions": false,
|
|
136
|
+
"supportsAgents": false,
|
|
137
|
+
"supportsAgentsMd": false,
|
|
138
|
+
"markdownFallback": "CONVENTIONS.md",
|
|
139
|
+
"notes": "Aider uses CONVENTIONS.md for coding standards. No advanced package support."
|
|
140
|
+
},
|
|
141
|
+
"zencoder": {
|
|
142
|
+
"name": "Zencoder",
|
|
143
|
+
"supportsSkills": false,
|
|
144
|
+
"supportsPlugins": false,
|
|
145
|
+
"supportsExtensions": false,
|
|
146
|
+
"supportsAgents": false,
|
|
147
|
+
"supportsAgentsMd": false,
|
|
148
|
+
"markdownFallback": "zencoder-rules.md",
|
|
149
|
+
"notes": "Zencoder uses simple rules with glob patterns. No advanced package support."
|
|
150
|
+
},
|
|
151
|
+
"replit": {
|
|
152
|
+
"name": "Replit Agent",
|
|
153
|
+
"supportsSkills": false,
|
|
154
|
+
"supportsPlugins": false,
|
|
155
|
+
"supportsExtensions": false,
|
|
156
|
+
"supportsAgents": true,
|
|
157
|
+
"supportsAgentsMd": true,
|
|
158
|
+
"markdownFallback": "AGENTS.md",
|
|
159
|
+
"notes": "Replit Agent supports AGENTS.md for custom agent instructions. Full agents.md support following the agent-rules.org standard."
|
|
160
|
+
},
|
|
161
|
+
"zed": {
|
|
162
|
+
"name": "Zed",
|
|
163
|
+
"supportsSkills": false,
|
|
164
|
+
"supportsPlugins": false,
|
|
165
|
+
"supportsExtensions": true,
|
|
166
|
+
"supportsAgents": false,
|
|
167
|
+
"supportsAgentsMd": true,
|
|
168
|
+
"supportsSlashCommands": true,
|
|
169
|
+
"markdownFallback": ".rules",
|
|
170
|
+
"notes": "Zed supports .rules files (plain markdown, no frontmatter). Slash commands can be used in rules with /file, /diagnostics, /fetch, etc. Extensions written in Rust/WASM with extension.toml manifest. Also reads .cursorrules, .windsurfrules, .clinerules, AGENTS.md, CLAUDE.md, GEMINI.md in priority order. Extensions installed to ~/Library/Application Support/Zed/extensions (macOS). License required: MIT, Apache 2.0, BSD 3-Clause, or GPLv3."
|
|
171
|
+
},
|
|
172
|
+
"codex": {
|
|
173
|
+
"name": "OpenAI Codex CLI",
|
|
174
|
+
"supportsSkills": false,
|
|
175
|
+
"supportsPlugins": false,
|
|
176
|
+
"supportsExtensions": false,
|
|
177
|
+
"supportsAgents": true,
|
|
178
|
+
"supportsAgentsMd": true,
|
|
179
|
+
"supportsSlashCommands": false,
|
|
180
|
+
"slashCommandFallback": "agents.md",
|
|
181
|
+
"markdownFallback": "AGENTS.md",
|
|
182
|
+
"notes": "OpenAI Codex CLI uses AGENTS.md for project instructions. No native slash commands - slash commands are converted to named sections in AGENTS.md that users invoke by saying the command name (e.g., 'build-actions' not '/build-actions')."
|
|
183
|
+
},
|
|
184
|
+
"agents.md": {
|
|
185
|
+
"name": "agents.md (Universal)",
|
|
186
|
+
"supportsSkills": false,
|
|
187
|
+
"supportsPlugins": false,
|
|
188
|
+
"supportsExtensions": false,
|
|
189
|
+
"supportsAgents": true,
|
|
190
|
+
"supportsAgentsMd": true,
|
|
191
|
+
"markdownFallback": "agents.md",
|
|
192
|
+
"notes": "Universal agents.md format - works with OpenAI, Gemini, Claude, and most AI systems."
|
|
193
|
+
},
|
|
194
|
+
"mcp": {
|
|
195
|
+
"name": "Model Context Protocol",
|
|
196
|
+
"supportsSkills": false,
|
|
197
|
+
"supportsPlugins": true,
|
|
198
|
+
"supportsExtensions": false,
|
|
199
|
+
"supportsAgents": false,
|
|
200
|
+
"supportsAgentsMd": false,
|
|
201
|
+
"markdownFallback": "mcp-server.json",
|
|
202
|
+
"notes": "MCP is a server protocol, not a package format. Supports plugins via server configuration."
|
|
203
|
+
},
|
|
204
|
+
"generic": {
|
|
205
|
+
"name": "Generic (Markdown)",
|
|
206
|
+
"supportsSkills": false,
|
|
207
|
+
"supportsPlugins": false,
|
|
208
|
+
"supportsExtensions": false,
|
|
209
|
+
"supportsAgents": true,
|
|
210
|
+
"supportsAgentsMd": true,
|
|
211
|
+
"markdownFallback": "README.md",
|
|
212
|
+
"notes": "Generic markdown format for maximum compatibility. Supports agents.md convention."
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
"agentsMdSupport": {
|
|
216
|
+
"description": "Formats that intelligently support agents.md for progressive disclosure",
|
|
217
|
+
"formats": [
|
|
218
|
+
"cursor",
|
|
219
|
+
"copilot",
|
|
220
|
+
"kiro",
|
|
221
|
+
"opencode",
|
|
222
|
+
"ruler",
|
|
223
|
+
"droid",
|
|
224
|
+
"replit",
|
|
225
|
+
"zed",
|
|
226
|
+
"codex",
|
|
227
|
+
"agents.md",
|
|
228
|
+
"generic"
|
|
229
|
+
],
|
|
230
|
+
"notes": "These formats can use AGENTS.md as a universal fallback. Claude Code uses CLAUDE.md instead (not AGENTS.md). Gemini uses GEMINI.md instead. Cursor added AGENTS.md support in version 1.6+. GitHub Copilot added AGENTS.md support in August 2025. Zed reads AGENTS.md along with other rule file formats."
|
|
231
|
+
}
|
|
232
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -815,7 +815,8 @@ var init_taxonomy_utils = __esm({
|
|
|
815
815
|
"trae",
|
|
816
816
|
"replit",
|
|
817
817
|
"zencoder",
|
|
818
|
-
"droid"
|
|
818
|
+
"droid",
|
|
819
|
+
"codex"
|
|
819
820
|
];
|
|
820
821
|
}
|
|
821
822
|
});
|
|
@@ -852,6 +853,25 @@ function fromClaude(content, metadata, sourceFormat = "claude", explicitSubtype)
|
|
|
852
853
|
}
|
|
853
854
|
metadataSection.data.claudeAgent.model = frontmatter.model;
|
|
854
855
|
}
|
|
856
|
+
const argumentHint = frontmatter["argument-hint"];
|
|
857
|
+
const hasSlashCommandFields = argumentHint || frontmatter["allowed-tools"] || frontmatter["disable-model-invocation"];
|
|
858
|
+
if (hasSlashCommandFields) {
|
|
859
|
+
metadataSection.data.claudeSlashCommand = {
|
|
860
|
+
description: frontmatter.description
|
|
861
|
+
};
|
|
862
|
+
if (argumentHint) {
|
|
863
|
+
metadataSection.data.claudeSlashCommand.argumentHint = argumentHint;
|
|
864
|
+
}
|
|
865
|
+
if (frontmatter["allowed-tools"]) {
|
|
866
|
+
metadataSection.data.claudeSlashCommand.allowedTools = frontmatter["allowed-tools"];
|
|
867
|
+
}
|
|
868
|
+
if (frontmatter.model) {
|
|
869
|
+
metadataSection.data.claudeSlashCommand.model = frontmatter.model;
|
|
870
|
+
}
|
|
871
|
+
if (frontmatter["disable-model-invocation"] !== void 0) {
|
|
872
|
+
metadataSection.data.claudeSlashCommand.disableModelInvocation = frontmatter["disable-model-invocation"] === "true" || frontmatter["disable-model-invocation"] === true;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
855
875
|
const { sections: bodySections, h1Title, h1Icon } = parseMarkdownBody(body);
|
|
856
876
|
if (h1Title) {
|
|
857
877
|
metadataSection.data.title = h1Title;
|
|
@@ -10564,7 +10584,11 @@ function toGemini(pkg, options = {}) {
|
|
|
10564
10584
|
const warnings = [];
|
|
10565
10585
|
let qualityScore = 100;
|
|
10566
10586
|
try {
|
|
10567
|
-
|
|
10587
|
+
let prompt3 = buildPrompt(pkg.content, warnings);
|
|
10588
|
+
const argumentHint = extractArgumentHint(pkg);
|
|
10589
|
+
if (argumentHint) {
|
|
10590
|
+
prompt3 = integrateArgumentsIntoPrompt(prompt3, argumentHint, warnings);
|
|
10591
|
+
}
|
|
10568
10592
|
const geminiCommand = {
|
|
10569
10593
|
prompt: prompt3
|
|
10570
10594
|
};
|
|
@@ -10723,6 +10747,89 @@ function convertContext7(section) {
|
|
|
10723
10747
|
lines.push(section.content);
|
|
10724
10748
|
return lines.join("\n");
|
|
10725
10749
|
}
|
|
10750
|
+
function extractArgumentHint(pkg) {
|
|
10751
|
+
var _a, _b, _c, _d, _e;
|
|
10752
|
+
const metadataSection = pkg.content.sections.find((s) => s.type === "metadata");
|
|
10753
|
+
if (metadataSection && metadataSection.type === "metadata") {
|
|
10754
|
+
if ((_a = metadataSection.data.claudeSlashCommand) == null ? void 0 : _a.argumentHint) {
|
|
10755
|
+
return metadataSection.data.claudeSlashCommand.argumentHint;
|
|
10756
|
+
}
|
|
10757
|
+
if ((_b = metadataSection.data.opencodeSlashCommand) == null ? void 0 : _b.argumentHint) {
|
|
10758
|
+
return metadataSection.data.opencodeSlashCommand.argumentHint;
|
|
10759
|
+
}
|
|
10760
|
+
if ((_c = metadataSection.data.droid) == null ? void 0 : _c.argumentHint) {
|
|
10761
|
+
return metadataSection.data.droid.argumentHint;
|
|
10762
|
+
}
|
|
10763
|
+
}
|
|
10764
|
+
if ((_e = (_d = pkg.metadata) == null ? void 0 : _d.droid) == null ? void 0 : _e.argumentHint) {
|
|
10765
|
+
return pkg.metadata.droid.argumentHint;
|
|
10766
|
+
}
|
|
10767
|
+
return void 0;
|
|
10768
|
+
}
|
|
10769
|
+
function parseArgumentHint(hint) {
|
|
10770
|
+
if (Array.isArray(hint)) {
|
|
10771
|
+
return hint;
|
|
10772
|
+
}
|
|
10773
|
+
const bracketMatches = hint.match(/\[([^\]]+)\]/g);
|
|
10774
|
+
if (bracketMatches) {
|
|
10775
|
+
return bracketMatches.map((m) => m.replace(/^\[|\]$/g, ""));
|
|
10776
|
+
}
|
|
10777
|
+
return hint.split(/\s+/).filter(Boolean);
|
|
10778
|
+
}
|
|
10779
|
+
function integrateArgumentsIntoPrompt(prompt3, argumentHint, warnings) {
|
|
10780
|
+
const args = parseArgumentHint(argumentHint);
|
|
10781
|
+
if (args.length === 0) {
|
|
10782
|
+
return prompt3;
|
|
10783
|
+
}
|
|
10784
|
+
let translatedPrompt = translatePositionalArgs(prompt3, args, warnings);
|
|
10785
|
+
const usageFormat = args.map((arg) => `<${arg}>`).join(" ");
|
|
10786
|
+
const usageSection = `**Expected Arguments:** ${usageFormat}
|
|
10787
|
+
|
|
10788
|
+
The user will provide these arguments which are available via {{args}}.
|
|
10789
|
+
|
|
10790
|
+
`;
|
|
10791
|
+
if (translatedPrompt.includes("{{args}}")) {
|
|
10792
|
+
return usageSection + translatedPrompt;
|
|
10793
|
+
}
|
|
10794
|
+
const instructionHeaders = /^(#+\s*(?:Instructions?|Overview|Task):?\s*\n)/im;
|
|
10795
|
+
const match = translatedPrompt.match(instructionHeaders);
|
|
10796
|
+
if (match) {
|
|
10797
|
+
const insertPoint = match.index + match[0].length;
|
|
10798
|
+
const before = translatedPrompt.slice(0, insertPoint);
|
|
10799
|
+
const after = translatedPrompt.slice(insertPoint);
|
|
10800
|
+
return usageSection + before + `
|
|
10801
|
+
**Arguments provided:** {{args}}
|
|
10802
|
+
|
|
10803
|
+
` + after;
|
|
10804
|
+
}
|
|
10805
|
+
return usageSection + `**Arguments provided:** {{args}}
|
|
10806
|
+
|
|
10807
|
+
` + translatedPrompt;
|
|
10808
|
+
}
|
|
10809
|
+
function translatePositionalArgs(prompt3, argNames, warnings) {
|
|
10810
|
+
let result = prompt3;
|
|
10811
|
+
const hasPositionalArgs = /\$\d+/.test(prompt3);
|
|
10812
|
+
if (!hasPositionalArgs) {
|
|
10813
|
+
return result;
|
|
10814
|
+
}
|
|
10815
|
+
for (let i = 0; i < argNames.length; i++) {
|
|
10816
|
+
const positionalArg = `$${i + 1}`;
|
|
10817
|
+
const namedPlaceholder = `{{${argNames[i]}}}`;
|
|
10818
|
+
const regex = new RegExp(`\\$${i + 1}(?![0-9])`, "g");
|
|
10819
|
+
result = result.replace(regex, namedPlaceholder);
|
|
10820
|
+
}
|
|
10821
|
+
const remainingArgs = result.match(/\$(\d+)/g);
|
|
10822
|
+
if (remainingArgs) {
|
|
10823
|
+
const unmappedArgs = remainingArgs.filter((arg) => {
|
|
10824
|
+
const num = parseInt(arg.slice(1), 10);
|
|
10825
|
+
return num > argNames.length;
|
|
10826
|
+
});
|
|
10827
|
+
if (unmappedArgs.length > 0) {
|
|
10828
|
+
warnings.push(`Positional arguments ${unmappedArgs.join(", ")} found but no corresponding argumentHint names provided`);
|
|
10829
|
+
}
|
|
10830
|
+
}
|
|
10831
|
+
return result;
|
|
10832
|
+
}
|
|
10726
10833
|
var TOML2;
|
|
10727
10834
|
var init_to_gemini = __esm({
|
|
10728
10835
|
"../converters/dist/to-gemini.js"() {
|
|
@@ -12043,6 +12150,261 @@ var init_to_zed = __esm({
|
|
|
12043
12150
|
}
|
|
12044
12151
|
});
|
|
12045
12152
|
|
|
12153
|
+
// ../converters/dist/to-codex.js
|
|
12154
|
+
function toCodex(pkg, options = {}) {
|
|
12155
|
+
const warnings = [];
|
|
12156
|
+
let qualityScore = 100;
|
|
12157
|
+
try {
|
|
12158
|
+
const config = options.codexConfig || {};
|
|
12159
|
+
const isSlashCommand = pkg.subtype === "slash-command";
|
|
12160
|
+
let content;
|
|
12161
|
+
if (isSlashCommand) {
|
|
12162
|
+
content = convertSlashCommandToSection(pkg, warnings);
|
|
12163
|
+
if (config.appendMode && config.existingContent) {
|
|
12164
|
+
content = appendToExistingAgentsMd(config.existingContent, content, pkg.name);
|
|
12165
|
+
}
|
|
12166
|
+
} else {
|
|
12167
|
+
content = convertToAgentsMd(pkg, warnings);
|
|
12168
|
+
}
|
|
12169
|
+
const lossyConversion = warnings.some((w) => w.includes("not supported") || w.includes("skipped"));
|
|
12170
|
+
if (lossyConversion) {
|
|
12171
|
+
qualityScore -= 10;
|
|
12172
|
+
}
|
|
12173
|
+
return {
|
|
12174
|
+
content,
|
|
12175
|
+
format: "codex",
|
|
12176
|
+
warnings: warnings.length > 0 ? warnings : void 0,
|
|
12177
|
+
lossyConversion,
|
|
12178
|
+
qualityScore
|
|
12179
|
+
};
|
|
12180
|
+
} catch (error) {
|
|
12181
|
+
warnings.push(`Conversion error: ${error instanceof Error ? error.message : String(error)}`);
|
|
12182
|
+
return {
|
|
12183
|
+
content: "",
|
|
12184
|
+
format: "codex",
|
|
12185
|
+
warnings,
|
|
12186
|
+
lossyConversion: true,
|
|
12187
|
+
qualityScore: 0
|
|
12188
|
+
};
|
|
12189
|
+
}
|
|
12190
|
+
}
|
|
12191
|
+
function convertSlashCommandToSection(pkg, warnings) {
|
|
12192
|
+
const lines = [];
|
|
12193
|
+
const commandName = pkg.name.replace(/^\//, "");
|
|
12194
|
+
const metadataSection = pkg.content.sections.find((s) => s.type === "metadata");
|
|
12195
|
+
let argumentHint;
|
|
12196
|
+
let description = pkg.description;
|
|
12197
|
+
if (metadataSection && metadataSection.type === "metadata") {
|
|
12198
|
+
const claudeSlashCommand = metadataSection.data.claudeSlashCommand;
|
|
12199
|
+
if (claudeSlashCommand) {
|
|
12200
|
+
argumentHint = claudeSlashCommand.argumentHint;
|
|
12201
|
+
if (claudeSlashCommand.description) {
|
|
12202
|
+
description = claudeSlashCommand.description;
|
|
12203
|
+
}
|
|
12204
|
+
}
|
|
12205
|
+
}
|
|
12206
|
+
lines.push(`## ${commandName}`);
|
|
12207
|
+
lines.push("");
|
|
12208
|
+
if (argumentHint) {
|
|
12209
|
+
const args = formatArgumentHint(argumentHint);
|
|
12210
|
+
lines.push(`**Usage:** Say "${commandName} ${args}" to invoke this command`);
|
|
12211
|
+
} else {
|
|
12212
|
+
lines.push(`**Usage:** Say "${commandName}" to invoke this command`);
|
|
12213
|
+
}
|
|
12214
|
+
lines.push("");
|
|
12215
|
+
if (description) {
|
|
12216
|
+
lines.push(`**Description:** ${description}`);
|
|
12217
|
+
lines.push("");
|
|
12218
|
+
}
|
|
12219
|
+
if (argumentHint) {
|
|
12220
|
+
const argNames = parseArgumentHint2(argumentHint);
|
|
12221
|
+
if (argNames.length > 0) {
|
|
12222
|
+
lines.push("**Arguments:**");
|
|
12223
|
+
argNames.forEach((arg, i) => {
|
|
12224
|
+
lines.push(`- \`${arg}\` - Argument ${i + 1}`);
|
|
12225
|
+
});
|
|
12226
|
+
lines.push("");
|
|
12227
|
+
}
|
|
12228
|
+
}
|
|
12229
|
+
lines.push("---");
|
|
12230
|
+
lines.push("");
|
|
12231
|
+
lines.push(`When the user says "${commandName}" or asks to "${commandName.replace(/-/g, " ")}", follow these instructions:`);
|
|
12232
|
+
lines.push("");
|
|
12233
|
+
for (const section of pkg.content.sections) {
|
|
12234
|
+
if (section.type === "metadata")
|
|
12235
|
+
continue;
|
|
12236
|
+
if (section.type === "tools") {
|
|
12237
|
+
warnings.push("Tools section skipped (not supported by Codex AGENTS.md)");
|
|
12238
|
+
continue;
|
|
12239
|
+
}
|
|
12240
|
+
if (section.type === "persona") {
|
|
12241
|
+
warnings.push("Persona section skipped (not supported by Codex AGENTS.md)");
|
|
12242
|
+
continue;
|
|
12243
|
+
}
|
|
12244
|
+
const sectionContent = convertSection13(section, warnings);
|
|
12245
|
+
if (sectionContent) {
|
|
12246
|
+
lines.push(sectionContent);
|
|
12247
|
+
lines.push("");
|
|
12248
|
+
}
|
|
12249
|
+
}
|
|
12250
|
+
return lines.join("\n").trim();
|
|
12251
|
+
}
|
|
12252
|
+
function convertToAgentsMd(pkg, warnings) {
|
|
12253
|
+
var _a;
|
|
12254
|
+
const lines = [];
|
|
12255
|
+
const title = ((_a = pkg.metadata) == null ? void 0 : _a.title) || pkg.name;
|
|
12256
|
+
lines.push(`# ${title}`);
|
|
12257
|
+
lines.push("");
|
|
12258
|
+
if (pkg.description) {
|
|
12259
|
+
lines.push(pkg.description);
|
|
12260
|
+
lines.push("");
|
|
12261
|
+
}
|
|
12262
|
+
for (const section of pkg.content.sections) {
|
|
12263
|
+
if (section.type === "metadata")
|
|
12264
|
+
continue;
|
|
12265
|
+
if (section.type === "tools") {
|
|
12266
|
+
warnings.push("Tools section skipped (not supported by Codex AGENTS.md)");
|
|
12267
|
+
continue;
|
|
12268
|
+
}
|
|
12269
|
+
if (section.type === "persona") {
|
|
12270
|
+
warnings.push("Persona section skipped (not supported by Codex AGENTS.md)");
|
|
12271
|
+
continue;
|
|
12272
|
+
}
|
|
12273
|
+
const sectionContent = convertSection13(section, warnings);
|
|
12274
|
+
if (sectionContent) {
|
|
12275
|
+
lines.push(sectionContent);
|
|
12276
|
+
lines.push("");
|
|
12277
|
+
}
|
|
12278
|
+
}
|
|
12279
|
+
return lines.join("\n").trim();
|
|
12280
|
+
}
|
|
12281
|
+
function appendToExistingAgentsMd(existingContent, newSection, commandName) {
|
|
12282
|
+
const sectionHeader = `## ${commandName.replace(/^\//, "")}`;
|
|
12283
|
+
if (existingContent.includes(sectionHeader)) {
|
|
12284
|
+
const regex = new RegExp(`## ${commandName.replace(/^\//, "")}[\\s\\S]*?(?=## |$)`, "g");
|
|
12285
|
+
return existingContent.replace(regex, newSection + "\n\n");
|
|
12286
|
+
}
|
|
12287
|
+
const trimmedExisting = existingContent.trim();
|
|
12288
|
+
return `${trimmedExisting}
|
|
12289
|
+
|
|
12290
|
+
${newSection}`;
|
|
12291
|
+
}
|
|
12292
|
+
function convertSection13(section, warnings) {
|
|
12293
|
+
switch (section.type) {
|
|
12294
|
+
case "instructions":
|
|
12295
|
+
return convertInstructions13(section);
|
|
12296
|
+
case "rules":
|
|
12297
|
+
return convertRules13(section);
|
|
12298
|
+
case "examples":
|
|
12299
|
+
return convertExamples13(section);
|
|
12300
|
+
case "context":
|
|
12301
|
+
return convertContext13(section);
|
|
12302
|
+
case "hook":
|
|
12303
|
+
warnings.push("Hook section skipped (not supported by Codex)");
|
|
12304
|
+
return "";
|
|
12305
|
+
case "cursor-hook":
|
|
12306
|
+
warnings.push("Cursor hook section skipped (not supported by Codex)");
|
|
12307
|
+
return "";
|
|
12308
|
+
case "file-reference":
|
|
12309
|
+
warnings.push("File reference section skipped (not supported by Codex)");
|
|
12310
|
+
return "";
|
|
12311
|
+
case "custom":
|
|
12312
|
+
if (!section.editorType || section.editorType === "codex") {
|
|
12313
|
+
return section.content;
|
|
12314
|
+
}
|
|
12315
|
+
warnings.push(`Custom ${section.editorType} section skipped`);
|
|
12316
|
+
return "";
|
|
12317
|
+
default:
|
|
12318
|
+
return "";
|
|
12319
|
+
}
|
|
12320
|
+
}
|
|
12321
|
+
function convertInstructions13(section) {
|
|
12322
|
+
const lines = [];
|
|
12323
|
+
lines.push(`### ${section.title}`);
|
|
12324
|
+
lines.push("");
|
|
12325
|
+
if (section.priority === "high") {
|
|
12326
|
+
lines.push("**Important:**");
|
|
12327
|
+
lines.push("");
|
|
12328
|
+
}
|
|
12329
|
+
lines.push(section.content);
|
|
12330
|
+
return lines.join("\n");
|
|
12331
|
+
}
|
|
12332
|
+
function convertRules13(section) {
|
|
12333
|
+
const lines = [];
|
|
12334
|
+
lines.push(`### ${section.title}`);
|
|
12335
|
+
lines.push("");
|
|
12336
|
+
section.items.forEach((rule, index) => {
|
|
12337
|
+
const prefix = section.ordered ? `${index + 1}.` : "-";
|
|
12338
|
+
lines.push(`${prefix} ${rule.content}`);
|
|
12339
|
+
if (rule.rationale) {
|
|
12340
|
+
lines.push(` - Rationale: ${rule.rationale}`);
|
|
12341
|
+
}
|
|
12342
|
+
if (rule.examples && rule.examples.length > 0) {
|
|
12343
|
+
rule.examples.forEach((example) => {
|
|
12344
|
+
lines.push(` - Example: \`${example}\``);
|
|
12345
|
+
});
|
|
12346
|
+
}
|
|
12347
|
+
});
|
|
12348
|
+
return lines.join("\n");
|
|
12349
|
+
}
|
|
12350
|
+
function convertExamples13(section) {
|
|
12351
|
+
const lines = [];
|
|
12352
|
+
lines.push(`### ${section.title}`);
|
|
12353
|
+
lines.push("");
|
|
12354
|
+
section.examples.forEach((example) => {
|
|
12355
|
+
if (example.good === false) {
|
|
12356
|
+
lines.push(`#### \u274C Avoid: ${example.description}`);
|
|
12357
|
+
} else if (example.good === true) {
|
|
12358
|
+
lines.push(`#### \u2705 Preferred: ${example.description}`);
|
|
12359
|
+
} else {
|
|
12360
|
+
lines.push(`#### ${example.description}`);
|
|
12361
|
+
}
|
|
12362
|
+
lines.push("");
|
|
12363
|
+
const lang = example.language || "";
|
|
12364
|
+
lines.push("```" + lang);
|
|
12365
|
+
lines.push(example.code);
|
|
12366
|
+
lines.push("```");
|
|
12367
|
+
lines.push("");
|
|
12368
|
+
});
|
|
12369
|
+
return lines.join("\n");
|
|
12370
|
+
}
|
|
12371
|
+
function convertContext13(section) {
|
|
12372
|
+
const lines = [];
|
|
12373
|
+
lines.push(`### ${section.title}`);
|
|
12374
|
+
lines.push("");
|
|
12375
|
+
lines.push(section.content);
|
|
12376
|
+
return lines.join("\n");
|
|
12377
|
+
}
|
|
12378
|
+
function formatArgumentHint(hint) {
|
|
12379
|
+
if (Array.isArray(hint)) {
|
|
12380
|
+
return hint.map((arg) => `<${arg}>`).join(" ");
|
|
12381
|
+
}
|
|
12382
|
+
const bracketMatches = hint.match(/\[([^\]]+)\]/g);
|
|
12383
|
+
if (bracketMatches) {
|
|
12384
|
+
return bracketMatches.map((m) => `<${m.replace(/^\[|\]$/g, "")}>`).join(" ");
|
|
12385
|
+
}
|
|
12386
|
+
return hint.split(/\s+/).filter(Boolean).map((arg) => `<${arg}>`).join(" ");
|
|
12387
|
+
}
|
|
12388
|
+
function parseArgumentHint2(hint) {
|
|
12389
|
+
if (Array.isArray(hint)) {
|
|
12390
|
+
return hint;
|
|
12391
|
+
}
|
|
12392
|
+
const bracketMatches = hint.match(/\[([^\]]+)\]/g);
|
|
12393
|
+
if (bracketMatches) {
|
|
12394
|
+
return bracketMatches.map((m) => m.replace(/^\[|\]$/g, ""));
|
|
12395
|
+
}
|
|
12396
|
+
return hint.split(/\s+/).filter(Boolean);
|
|
12397
|
+
}
|
|
12398
|
+
function generateFilename2() {
|
|
12399
|
+
return "AGENTS.md";
|
|
12400
|
+
}
|
|
12401
|
+
var init_to_codex = __esm({
|
|
12402
|
+
"../converters/dist/to-codex.js"() {
|
|
12403
|
+
"use strict";
|
|
12404
|
+
init_cjs_shims();
|
|
12405
|
+
}
|
|
12406
|
+
});
|
|
12407
|
+
|
|
12046
12408
|
// ../converters/dist/to-mcp-server.js
|
|
12047
12409
|
function toMCPServer(pkg) {
|
|
12048
12410
|
var _a, _b;
|
|
@@ -12457,6 +12819,36 @@ var init_format_registry = __esm({
|
|
|
12457
12819
|
}
|
|
12458
12820
|
}
|
|
12459
12821
|
},
|
|
12822
|
+
codex: {
|
|
12823
|
+
name: "OpenAI Codex CLI",
|
|
12824
|
+
description: "OpenAI Codex CLI using AGENTS.md for project instructions",
|
|
12825
|
+
subtypes: {
|
|
12826
|
+
rule: {
|
|
12827
|
+
directory: ".",
|
|
12828
|
+
filePatterns: ["AGENTS.md"],
|
|
12829
|
+
fileExtension: ".md"
|
|
12830
|
+
},
|
|
12831
|
+
"slash-command": {
|
|
12832
|
+
directory: ".",
|
|
12833
|
+
filePatterns: ["AGENTS.md"],
|
|
12834
|
+
fileExtension: ".md"
|
|
12835
|
+
},
|
|
12836
|
+
skill: {
|
|
12837
|
+
directory: ".openskills",
|
|
12838
|
+
filePatterns: ["*.md"],
|
|
12839
|
+
nested: true,
|
|
12840
|
+
usesPackageSubdirectory: true,
|
|
12841
|
+
fileExtension: ".md"
|
|
12842
|
+
},
|
|
12843
|
+
agent: {
|
|
12844
|
+
directory: ".openagents",
|
|
12845
|
+
filePatterns: ["*.md"],
|
|
12846
|
+
nested: true,
|
|
12847
|
+
usesPackageSubdirectory: true,
|
|
12848
|
+
fileExtension: ".md"
|
|
12849
|
+
}
|
|
12850
|
+
}
|
|
12851
|
+
},
|
|
12460
12852
|
"gemini.md": {
|
|
12461
12853
|
name: "GEMINI.md",
|
|
12462
12854
|
description: "Gemini GEMINI.md project instructions",
|
|
@@ -12926,6 +13318,7 @@ __export(dist_exports, {
|
|
|
12926
13318
|
fromZencoder: () => fromZencoder,
|
|
12927
13319
|
geminiMdSchema: () => geminiMdSchema,
|
|
12928
13320
|
geminiSchema: () => geminiSchema,
|
|
13321
|
+
generateCodexFilename: () => generateFilename2,
|
|
12929
13322
|
generateMCPServerPackage: () => generateMCPServerPackage,
|
|
12930
13323
|
generatePluginJson: () => generatePluginJson,
|
|
12931
13324
|
generateZedFilename: () => generateFilename,
|
|
@@ -12990,6 +13383,7 @@ __export(dist_exports, {
|
|
|
12990
13383
|
toClaude: () => toClaude,
|
|
12991
13384
|
toClaudeMd: () => toClaudeMd,
|
|
12992
13385
|
toClaudePlugin: () => toClaudePlugin,
|
|
13386
|
+
toCodex: () => toCodex,
|
|
12993
13387
|
toContinue: () => toContinue,
|
|
12994
13388
|
toCopilot: () => toCopilot,
|
|
12995
13389
|
toCursor: () => toCursor,
|
|
@@ -13063,6 +13457,7 @@ var init_dist = __esm({
|
|
|
13063
13457
|
init_to_zencoder();
|
|
13064
13458
|
init_to_replit();
|
|
13065
13459
|
init_to_zed();
|
|
13460
|
+
init_to_codex();
|
|
13066
13461
|
init_to_mcp_server();
|
|
13067
13462
|
init_taxonomy_utils();
|
|
13068
13463
|
init_validation();
|
|
@@ -15904,6 +16299,7 @@ function getPackageIcon2(format, subtype) {
|
|
|
15904
16299
|
"copilot": "\u2708\uFE0F",
|
|
15905
16300
|
"kiro": "\u{1F3AF}",
|
|
15906
16301
|
"gemini": "\u2728",
|
|
16302
|
+
"gemini-extension": "\u2728",
|
|
15907
16303
|
"gemini.md": "\u2728",
|
|
15908
16304
|
"claude.md": "\u{1F916}",
|
|
15909
16305
|
"opencode": "\u26A1",
|
|
@@ -15913,6 +16309,7 @@ function getPackageIcon2(format, subtype) {
|
|
|
15913
16309
|
"zencoder": "\u26A1",
|
|
15914
16310
|
"replit": "\u{1F52E}",
|
|
15915
16311
|
"zed": "\u26A1",
|
|
16312
|
+
"codex": "\u{1F9E0}",
|
|
15916
16313
|
"mcp": "\u{1F517}",
|
|
15917
16314
|
"agents.md": "\u{1F4DD}",
|
|
15918
16315
|
"ruler": "\u{1F4CF}",
|
|
@@ -15929,6 +16326,7 @@ function getPackageLabel2(format, subtype) {
|
|
|
15929
16326
|
"copilot": "GitHub Copilot",
|
|
15930
16327
|
"kiro": "Kiro",
|
|
15931
16328
|
"gemini": "Gemini",
|
|
16329
|
+
"gemini-extension": "Gemini Extension",
|
|
15932
16330
|
"gemini.md": "Gemini",
|
|
15933
16331
|
"claude.md": "Claude",
|
|
15934
16332
|
"opencode": "OpenCode",
|
|
@@ -15938,6 +16336,7 @@ function getPackageLabel2(format, subtype) {
|
|
|
15938
16336
|
"zencoder": "Zencoder",
|
|
15939
16337
|
"replit": "Replit",
|
|
15940
16338
|
"zed": "Zed",
|
|
16339
|
+
"codex": "Codex",
|
|
15941
16340
|
"mcp": "MCP",
|
|
15942
16341
|
"agents.md": "Agents.md",
|
|
15943
16342
|
"ruler": "Ruler",
|
|
@@ -16358,6 +16757,9 @@ This could indicate:
|
|
|
16358
16757
|
case "replit":
|
|
16359
16758
|
convertedContent = toReplit(canonicalPkg).content;
|
|
16360
16759
|
break;
|
|
16760
|
+
case "codex":
|
|
16761
|
+
convertedContent = toCodex(canonicalPkg).content;
|
|
16762
|
+
break;
|
|
16361
16763
|
case "generic":
|
|
16362
16764
|
convertedContent = toCursor(canonicalPkg).content;
|
|
16363
16765
|
break;
|
|
@@ -19416,6 +19818,7 @@ function getPackageIcon(format, subtype) {
|
|
|
19416
19818
|
"copilot": "\u2708\uFE0F",
|
|
19417
19819
|
"kiro": "\u{1F3AF}",
|
|
19418
19820
|
"gemini": "\u2728",
|
|
19821
|
+
"gemini-extension": "\u2728",
|
|
19419
19822
|
"gemini.md": "\u2728",
|
|
19420
19823
|
"claude.md": "\u{1F916}",
|
|
19421
19824
|
"opencode": "\u26A1",
|
|
@@ -19425,6 +19828,7 @@ function getPackageIcon(format, subtype) {
|
|
|
19425
19828
|
"zencoder": "\u26A1",
|
|
19426
19829
|
"replit": "\u{1F52E}",
|
|
19427
19830
|
"zed": "\u26A1",
|
|
19831
|
+
"codex": "\u{1F9E0}",
|
|
19428
19832
|
"mcp": "\u{1F517}",
|
|
19429
19833
|
"agents.md": "\u{1F4DD}",
|
|
19430
19834
|
"ruler": "\u{1F4CF}",
|
|
@@ -19441,6 +19845,7 @@ function getPackageLabel(format, subtype) {
|
|
|
19441
19845
|
"copilot": "GitHub Copilot",
|
|
19442
19846
|
"kiro": "Kiro",
|
|
19443
19847
|
"gemini": "Gemini",
|
|
19848
|
+
"gemini-extension": "Gemini Extension",
|
|
19444
19849
|
"gemini.md": "Gemini",
|
|
19445
19850
|
"claude.md": "Claude",
|
|
19446
19851
|
"opencode": "OpenCode",
|
|
@@ -19450,6 +19855,7 @@ function getPackageLabel(format, subtype) {
|
|
|
19450
19855
|
"zencoder": "Zencoder",
|
|
19451
19856
|
"replit": "Replit",
|
|
19452
19857
|
"zed": "Zed",
|
|
19858
|
+
"codex": "Codex",
|
|
19453
19859
|
"mcp": "MCP",
|
|
19454
19860
|
"agents.md": "Agents.md",
|
|
19455
19861
|
"ruler": "Ruler",
|
|
@@ -23568,6 +23974,8 @@ function getDefaultPath(format, filename, subtype, customName) {
|
|
|
23568
23974
|
return (0, import_path23.join)(process.cwd(), ".zencoder", `${baseName}.md`);
|
|
23569
23975
|
case "droid":
|
|
23570
23976
|
return (0, import_path23.join)(process.cwd(), ".factory", `${baseName}.md`);
|
|
23977
|
+
case "codex":
|
|
23978
|
+
return (0, import_path23.join)(process.cwd(), "AGENTS.md");
|
|
23571
23979
|
default:
|
|
23572
23980
|
throw new CLIError(`Unknown format: ${format}`);
|
|
23573
23981
|
}
|
|
@@ -23819,6 +24227,9 @@ async function handleConvert(sourcePath, options) {
|
|
|
23819
24227
|
case "droid":
|
|
23820
24228
|
result = toDroid(canonicalPkg);
|
|
23821
24229
|
break;
|
|
24230
|
+
case "codex":
|
|
24231
|
+
result = toCodex(canonicalPkg);
|
|
24232
|
+
break;
|
|
23822
24233
|
default:
|
|
23823
24234
|
throw new CLIError(`Unsupported target format: ${options.to}`);
|
|
23824
24235
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prpm",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
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.1",
|
|
49
|
+
"@pr-pm/registry-client": "^2.3.1",
|
|
50
|
+
"@pr-pm/types": "^2.1.1",
|
|
51
51
|
"ajv": "^8.17.1",
|
|
52
52
|
"ajv-formats": "^3.0.1",
|
|
53
53
|
"commander": "^11.1.0",
|