prpm 2.1.22 → 2.1.23

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/index.js CHANGED
@@ -830,6 +830,8 @@ function normalizeFormat(sourceFormat) {
830
830
  return "zed";
831
831
  if (normalized.includes("mcp"))
832
832
  return "mcp";
833
+ if (normalized.includes("amp"))
834
+ return "amp";
833
835
  return "generic";
834
836
  }
835
837
  var CLI_SUPPORTED_FORMATS;
@@ -854,7 +856,8 @@ var init_taxonomy_utils = __esm({
854
856
  "replit",
855
857
  "zencoder",
856
858
  "droid",
857
- "codex"
859
+ "codex",
860
+ "amp"
858
861
  ];
859
862
  }
860
863
  });
@@ -8765,6 +8768,91 @@ var init_from_codex = __esm({
8765
8768
  }
8766
8769
  });
8767
8770
 
8771
+ // ../converters/dist/from-amp.js
8772
+ function parseFrontmatter9(content) {
8773
+ const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
8774
+ if (!match) {
8775
+ return { frontmatter: {}, body: content };
8776
+ }
8777
+ const frontmatter = jsYaml.load(match[1]);
8778
+ const body = match[2];
8779
+ return { frontmatter, body };
8780
+ }
8781
+ function detectSubtype2(frontmatter) {
8782
+ if (frontmatter.name && frontmatter.description) {
8783
+ return "skill";
8784
+ }
8785
+ if (frontmatter.description && !frontmatter.name) {
8786
+ return "slash-command";
8787
+ }
8788
+ return "rule";
8789
+ }
8790
+ function fromAmp(content, metadata, subtypeHint) {
8791
+ const { frontmatter, body } = parseFrontmatter9(content);
8792
+ const fm = frontmatter;
8793
+ const sections = [];
8794
+ const detectedSubtype = subtypeHint || detectSubtype2(frontmatter);
8795
+ const metadataSection = {
8796
+ type: "metadata",
8797
+ data: {
8798
+ title: fm.name || metadata.name || metadata.id,
8799
+ description: fm.description || metadata.description || "",
8800
+ version: metadata.version || "1.0.0",
8801
+ author: metadata.author
8802
+ }
8803
+ };
8804
+ const skillFm = fm;
8805
+ const agentsFm = fm;
8806
+ if (detectedSubtype === "skill") {
8807
+ if (skillFm["argument-hint"] || skillFm["disable-model-invocation"] !== void 0) {
8808
+ metadataSection.data.amp = {
8809
+ argumentHint: skillFm["argument-hint"],
8810
+ disableModelInvocation: skillFm["disable-model-invocation"]
8811
+ };
8812
+ }
8813
+ } else if (agentsFm.globs) {
8814
+ const globs = Array.isArray(agentsFm.globs) ? agentsFm.globs : [agentsFm.globs];
8815
+ metadataSection.data.amp = {
8816
+ globs
8817
+ };
8818
+ }
8819
+ sections.push(metadataSection);
8820
+ if (body.trim()) {
8821
+ sections.push({
8822
+ type: "instructions",
8823
+ title: "Instructions",
8824
+ content: body.trim()
8825
+ });
8826
+ }
8827
+ const canonicalContent = {
8828
+ format: "canonical",
8829
+ version: "1.0",
8830
+ sections
8831
+ };
8832
+ const pkg = {
8833
+ ...metadata,
8834
+ id: metadata.id,
8835
+ name: fm.name || metadata.name || metadata.id,
8836
+ version: metadata.version,
8837
+ author: metadata.author,
8838
+ description: metadata.description || fm.description || "",
8839
+ tags: metadata.tags || [],
8840
+ format: "amp",
8841
+ subtype: detectedSubtype,
8842
+ content: canonicalContent
8843
+ };
8844
+ setTaxonomy(pkg, "amp", detectedSubtype);
8845
+ return pkg;
8846
+ }
8847
+ var init_from_amp = __esm({
8848
+ "../converters/dist/from-amp.js"() {
8849
+ "use strict";
8850
+ init_cjs_shims();
8851
+ init_taxonomy_utils();
8852
+ init_js_yaml();
8853
+ }
8854
+ });
8855
+
8768
8856
  // ../converters/dist/from-mcp-server.js
8769
8857
  function fromMCPServer(mcpServerJson, metadata) {
8770
8858
  var _a;
@@ -8892,6 +8980,8 @@ function loadSchema(format, subtype) {
8892
8980
  "opencode:skill": "agent-skills.schema.json",
8893
8981
  "codex:skill": "agent-skills.schema.json",
8894
8982
  "gemini:extension": "gemini-extension.schema.json",
8983
+ "amp:skill": "agent-skills.schema.json",
8984
+ "amp:slash-command": "amp-command.schema.json",
8895
8985
  "mcp:server": "mcp-server.schema.json"
8896
8986
  };
8897
8987
  schemaFilename = subtypeSchemaMap[cacheKey];
@@ -8913,6 +9003,7 @@ function loadSchema(format, subtype) {
8913
9003
  "aider": "aider.schema.json",
8914
9004
  "zencoder": "zencoder.schema.json",
8915
9005
  "replit": "replit.schema.json",
9006
+ "amp": "amp.schema.json",
8916
9007
  "canonical": "canonical.schema.json"
8917
9008
  // generic and mcp don't have specific schemas, will use fallback
8918
9009
  };
@@ -12811,6 +12902,130 @@ var init_to_codex = __esm({
12811
12902
  }
12812
12903
  });
12813
12904
 
12905
+ // ../converters/dist/to-amp.js
12906
+ function toAmp(pkg) {
12907
+ const warnings = [];
12908
+ let qualityScore = 100;
12909
+ try {
12910
+ const content = convertContent15(pkg, warnings);
12911
+ const lossyConversion = warnings.some((w) => w.includes("not supported") || w.includes("skipped"));
12912
+ if (lossyConversion) {
12913
+ qualityScore -= 10;
12914
+ }
12915
+ return {
12916
+ content,
12917
+ format: "amp",
12918
+ warnings: warnings.length > 0 ? warnings : void 0,
12919
+ lossyConversion,
12920
+ qualityScore
12921
+ };
12922
+ } catch (error) {
12923
+ warnings.push(`Conversion error: ${error instanceof Error ? error.message : String(error)}`);
12924
+ return {
12925
+ content: "",
12926
+ format: "amp",
12927
+ warnings,
12928
+ lossyConversion: true,
12929
+ qualityScore: 0
12930
+ };
12931
+ }
12932
+ }
12933
+ function convertContent15(pkg, warnings) {
12934
+ const lines = [];
12935
+ const metadata = pkg.content.sections.find((s) => s.type === "metadata");
12936
+ const frontmatter = {};
12937
+ const ampData = (metadata == null ? void 0 : metadata.type) === "metadata" ? metadata.data.amp : void 0;
12938
+ if (pkg.subtype === "skill") {
12939
+ const skillName = pkg.name || pkg.id;
12940
+ frontmatter.name = skillName.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
12941
+ if ((metadata == null ? void 0 : metadata.type) === "metadata" && metadata.data.description) {
12942
+ frontmatter.description = metadata.data.description;
12943
+ } else {
12944
+ frontmatter.description = pkg.description || "No description provided";
12945
+ warnings.push("REQUIRED description field missing, using package description");
12946
+ }
12947
+ if (ampData == null ? void 0 : ampData.argumentHint) {
12948
+ frontmatter["argument-hint"] = ampData.argumentHint;
12949
+ }
12950
+ if ((ampData == null ? void 0 : ampData.disableModelInvocation) !== void 0) {
12951
+ frontmatter["disable-model-invocation"] = ampData.disableModelInvocation;
12952
+ }
12953
+ } else if (pkg.subtype === "slash-command") {
12954
+ if ((metadata == null ? void 0 : metadata.type) === "metadata" && metadata.data.description) {
12955
+ frontmatter.description = metadata.data.description;
12956
+ }
12957
+ } else {
12958
+ if ((ampData == null ? void 0 : ampData.globs) && ampData.globs.length > 0) {
12959
+ frontmatter.globs = ampData.globs;
12960
+ }
12961
+ }
12962
+ const hasFrontmatter = Object.keys(frontmatter).length > 0;
12963
+ if (hasFrontmatter) {
12964
+ lines.push("---");
12965
+ lines.push(jsYaml.dump(frontmatter, { indent: 2, lineWidth: -1 }).trim());
12966
+ lines.push("---");
12967
+ lines.push("");
12968
+ }
12969
+ const contentSections = pkg.content.sections.filter((s) => s.type !== "metadata" && s.type !== "tools");
12970
+ for (const section of contentSections) {
12971
+ if (section.type === "persona") {
12972
+ if (section.data.role) {
12973
+ lines.push(`You are a ${section.data.role}.`);
12974
+ lines.push("");
12975
+ }
12976
+ } else if (section.type === "instructions") {
12977
+ if (section.title && section.title !== "Overview" && section.title !== "Instructions") {
12978
+ lines.push(`## ${section.title}`);
12979
+ lines.push("");
12980
+ }
12981
+ lines.push(section.content);
12982
+ lines.push("");
12983
+ } else if (section.type === "rules") {
12984
+ const rulesTitle = section.title || "Rules";
12985
+ lines.push(`## ${rulesTitle}`);
12986
+ lines.push("");
12987
+ for (const rule of section.items) {
12988
+ lines.push(`- ${rule.content}`);
12989
+ }
12990
+ lines.push("");
12991
+ } else if (section.type === "examples") {
12992
+ const examplesTitle = section.title || "Examples";
12993
+ lines.push(`## ${examplesTitle}`);
12994
+ lines.push("");
12995
+ for (const example of section.examples) {
12996
+ if (example.description) {
12997
+ lines.push(`### ${example.description}`);
12998
+ lines.push("");
12999
+ }
13000
+ const lang = example.language || "";
13001
+ lines.push("```" + lang);
13002
+ lines.push(example.code);
13003
+ lines.push("```");
13004
+ lines.push("");
13005
+ }
13006
+ } else if (section.type === "context") {
13007
+ const contextTitle = section.title || "Context";
13008
+ lines.push(`## ${contextTitle}`);
13009
+ lines.push("");
13010
+ lines.push(section.content);
13011
+ lines.push("");
13012
+ } else if (section.type === "hook" || section.type === "cursor-hook") {
13013
+ warnings.push(`Hook sections are not supported in Amp format`);
13014
+ } else if (section.type !== "custom" && section.type !== "file-reference") {
13015
+ const sectionType = section.type;
13016
+ warnings.push(`Section type '${sectionType}' may not be fully supported in Amp format`);
13017
+ }
13018
+ }
13019
+ return lines.join("\n").trim() + "\n";
13020
+ }
13021
+ var init_to_amp = __esm({
13022
+ "../converters/dist/to-amp.js"() {
13023
+ "use strict";
13024
+ init_cjs_shims();
13025
+ init_js_yaml();
13026
+ }
13027
+ });
13028
+
12814
13029
  // ../converters/dist/to-mcp-server.js
12815
13030
  function toMCPServer(pkg) {
12816
13031
  var _a, _b;
@@ -13396,6 +13611,41 @@ var init_format_registry = __esm({
13396
13611
  fileExtension: ".json"
13397
13612
  }
13398
13613
  }
13614
+ },
13615
+ amp: {
13616
+ name: "Amp",
13617
+ description: "Amp code editor skills, commands, and AGENTS.md",
13618
+ documentationUrl: "https://ampcode.com/manual",
13619
+ rootFiles: ["AGENTS.md", "AGENT.md", "CLAUDE.md"],
13620
+ defaultSubtype: "skill",
13621
+ subtypes: {
13622
+ skill: {
13623
+ directory: ".agents/skills",
13624
+ filePatterns: ["SKILL.md"],
13625
+ nested: true,
13626
+ nestedIndicator: "SKILL.md",
13627
+ usesPackageSubdirectory: true,
13628
+ fileExtension: ".md"
13629
+ },
13630
+ "slash-command": {
13631
+ directory: ".agents/commands",
13632
+ filePatterns: ["*.md"],
13633
+ fileExtension: ".md"
13634
+ },
13635
+ rule: {
13636
+ directory: ".",
13637
+ filePatterns: ["AGENTS.md"],
13638
+ fileExtension: ".md"
13639
+ },
13640
+ agent: {
13641
+ directory: ".openagents",
13642
+ filePatterns: ["AGENT.md"],
13643
+ nested: true,
13644
+ nestedIndicator: "AGENT.md",
13645
+ usesPackageSubdirectory: true,
13646
+ fileExtension: ".md"
13647
+ }
13648
+ }
13399
13649
  }
13400
13650
  }
13401
13651
  };
@@ -13695,6 +13945,281 @@ var init_progressive_disclosure = __esm({
13695
13945
  }
13696
13946
  });
13697
13947
 
13948
+ // ../converters/dist/cross-converters/mcp-transformer.js
13949
+ function geminiToClaudeMCP(geminiServers) {
13950
+ const warnings = [];
13951
+ const servers = {};
13952
+ let lossless = true;
13953
+ for (const [name, config] of Object.entries(geminiServers)) {
13954
+ servers[name] = {
13955
+ command: config.command
13956
+ };
13957
+ if (config.args) {
13958
+ servers[name].args = [...config.args];
13959
+ }
13960
+ if (config.env) {
13961
+ servers[name].env = { ...config.env };
13962
+ const hasGeminiVars = Object.values(config.env).some((val) => typeof val === "string" && (val.includes("${extensionPath}") || val.includes("${home}")));
13963
+ if (hasGeminiVars) {
13964
+ warnings.push(`MCP server '${name}' uses Gemini variable substitutions (\${extensionPath}, \${home}). Claude uses different variable syntax - manual adjustment may be needed.`);
13965
+ lossless = false;
13966
+ }
13967
+ }
13968
+ if (config.disabled !== void 0) {
13969
+ servers[name].disabled = config.disabled;
13970
+ }
13971
+ }
13972
+ return {
13973
+ servers,
13974
+ warnings,
13975
+ lossless
13976
+ };
13977
+ }
13978
+ function claudeToGeminiMCP(claudeServers) {
13979
+ const warnings = [];
13980
+ const servers = {};
13981
+ let lossless = true;
13982
+ for (const [name, config] of Object.entries(claudeServers)) {
13983
+ servers[name] = {
13984
+ command: config.command
13985
+ };
13986
+ if (config.args) {
13987
+ servers[name].args = [...config.args];
13988
+ }
13989
+ if (config.env) {
13990
+ servers[name].env = { ...config.env };
13991
+ const hasClaudePatterns = Object.values(config.env).some((val) => val.includes("${CLAUDE_") || val.includes("%APPDATA%"));
13992
+ if (hasClaudePatterns) {
13993
+ warnings.push(`MCP server '${name}' uses Claude-specific patterns. Consider using Gemini variable syntax: \${extensionPath}, \${home}`);
13994
+ lossless = false;
13995
+ }
13996
+ }
13997
+ if (config.disabled !== void 0) {
13998
+ servers[name].disabled = config.disabled;
13999
+ }
14000
+ }
14001
+ return {
14002
+ servers,
14003
+ warnings,
14004
+ lossless
14005
+ };
14006
+ }
14007
+ function validateMCPServer(config) {
14008
+ const errors = [];
14009
+ if (!config.command) {
14010
+ errors.push("MCP server must have a command");
14011
+ }
14012
+ if (config.args && !Array.isArray(config.args)) {
14013
+ errors.push("MCP server args must be an array");
14014
+ }
14015
+ if (config.env !== void 0 && (typeof config.env !== "object" || config.env === null)) {
14016
+ errors.push("MCP server env must be an object");
14017
+ }
14018
+ if (config.disabled !== void 0 && typeof config.disabled !== "boolean") {
14019
+ errors.push("MCP server disabled must be a boolean");
14020
+ }
14021
+ return errors;
14022
+ }
14023
+ function mergeMCPServers(...serverSets) {
14024
+ const warnings = [];
14025
+ const servers = {};
14026
+ let lossless = true;
14027
+ for (const serverSet of serverSets) {
14028
+ for (const [name, config] of Object.entries(serverSet)) {
14029
+ if (servers[name]) {
14030
+ warnings.push(`MCP server '${name}' defined multiple times. Using latest definition.`);
14031
+ lossless = false;
14032
+ }
14033
+ servers[name] = { ...config };
14034
+ }
14035
+ }
14036
+ return {
14037
+ servers,
14038
+ warnings,
14039
+ lossless
14040
+ };
14041
+ }
14042
+ function kiroToClaudeMCP(kiroServers) {
14043
+ const warnings = [];
14044
+ const servers = {};
14045
+ let lossless = true;
14046
+ for (const [name, config] of Object.entries(kiroServers)) {
14047
+ servers[name] = {
14048
+ command: config.command
14049
+ };
14050
+ if (config.args) {
14051
+ servers[name].args = [...config.args];
14052
+ }
14053
+ if (config.env) {
14054
+ servers[name].env = { ...config.env };
14055
+ }
14056
+ if (config.disabled !== void 0) {
14057
+ servers[name].disabled = config.disabled;
14058
+ }
14059
+ if (config.timeout !== void 0) {
14060
+ warnings.push(`MCP server '${name}' has timeout=${config.timeout}ms which is not supported in Claude format. This field will be lost.`);
14061
+ lossless = false;
14062
+ }
14063
+ }
14064
+ return {
14065
+ servers,
14066
+ warnings,
14067
+ lossless
14068
+ };
14069
+ }
14070
+ function claudeToKiroMCP(claudeServers) {
14071
+ const warnings = [];
14072
+ const servers = {};
14073
+ let lossless = true;
14074
+ for (const [name, config] of Object.entries(claudeServers)) {
14075
+ servers[name] = {
14076
+ command: config.command
14077
+ };
14078
+ if (config.args) {
14079
+ servers[name].args = [...config.args];
14080
+ }
14081
+ if (config.env) {
14082
+ servers[name].env = { ...config.env };
14083
+ }
14084
+ if (config.disabled !== void 0) {
14085
+ servers[name].disabled = config.disabled;
14086
+ }
14087
+ }
14088
+ return {
14089
+ servers,
14090
+ warnings,
14091
+ lossless
14092
+ };
14093
+ }
14094
+ function kiroToGeminiMCP(kiroServers) {
14095
+ const warnings = [];
14096
+ const servers = {};
14097
+ let lossless = true;
14098
+ for (const [name, config] of Object.entries(kiroServers)) {
14099
+ servers[name] = {
14100
+ command: config.command
14101
+ };
14102
+ if (config.args) {
14103
+ servers[name].args = [...config.args];
14104
+ }
14105
+ if (config.env) {
14106
+ servers[name].env = { ...config.env };
14107
+ }
14108
+ if (config.disabled !== void 0) {
14109
+ servers[name].disabled = config.disabled;
14110
+ }
14111
+ if (config.timeout !== void 0) {
14112
+ warnings.push(`MCP server '${name}' has timeout=${config.timeout}ms which is not supported in Gemini format. This field will be lost.`);
14113
+ lossless = false;
14114
+ }
14115
+ }
14116
+ return {
14117
+ servers,
14118
+ warnings,
14119
+ lossless
14120
+ };
14121
+ }
14122
+ function geminiToKiroMCP(geminiServers) {
14123
+ const warnings = [];
14124
+ const servers = {};
14125
+ let lossless = true;
14126
+ for (const [name, config] of Object.entries(geminiServers)) {
14127
+ servers[name] = {
14128
+ command: config.command
14129
+ };
14130
+ if (config.args) {
14131
+ servers[name].args = [...config.args];
14132
+ }
14133
+ if (config.env) {
14134
+ servers[name].env = { ...config.env };
14135
+ const hasGeminiVars = Object.values(config.env).some((val) => typeof val === "string" && (val.includes("${extensionPath}") || val.includes("${home}")));
14136
+ if (hasGeminiVars) {
14137
+ warnings.push(`MCP server '${name}' uses Gemini variable substitutions (\${extensionPath}, \${home}). These may need manual adjustment for Kiro.`);
14138
+ lossless = false;
14139
+ }
14140
+ }
14141
+ if (config.disabled !== void 0) {
14142
+ servers[name].disabled = config.disabled;
14143
+ }
14144
+ }
14145
+ return {
14146
+ servers,
14147
+ warnings,
14148
+ lossless
14149
+ };
14150
+ }
14151
+ function translateEnvVar(envValue, direction) {
14152
+ let translated = false;
14153
+ let value = envValue;
14154
+ const mappings = ENV_VAR_MAPPINGS[direction];
14155
+ if (mappings) {
14156
+ for (const [from, to] of Object.entries(mappings)) {
14157
+ if (value.includes(from)) {
14158
+ value = value.replace(new RegExp(from.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), to);
14159
+ translated = true;
14160
+ }
14161
+ }
14162
+ }
14163
+ return { value, translated };
14164
+ }
14165
+ function translateMCPServerEnv(config, direction) {
14166
+ const warnings = [];
14167
+ if (!config.env) {
14168
+ return { config, warnings };
14169
+ }
14170
+ const translatedEnv = {};
14171
+ let anyTranslated = false;
14172
+ for (const [key, value] of Object.entries(config.env)) {
14173
+ const { value: translatedValue, translated } = translateEnvVar(value, direction);
14174
+ translatedEnv[key] = translatedValue;
14175
+ if (translated) {
14176
+ anyTranslated = true;
14177
+ }
14178
+ }
14179
+ if (anyTranslated) {
14180
+ warnings.push(`Environment variables were automatically translated for target format`);
14181
+ }
14182
+ return {
14183
+ config: { ...config, env: translatedEnv },
14184
+ warnings
14185
+ };
14186
+ }
14187
+ var ENV_VAR_MAPPINGS;
14188
+ var init_mcp_transformer = __esm({
14189
+ "../converters/dist/cross-converters/mcp-transformer.js"() {
14190
+ "use strict";
14191
+ init_cjs_shims();
14192
+ ENV_VAR_MAPPINGS = {
14193
+ "gemini-to-claude": {
14194
+ "${extensionPath}": "${CLAUDE_EXTENSIONS_PATH}",
14195
+ "${home}": "${HOME}"
14196
+ },
14197
+ "claude-to-gemini": {
14198
+ "${CLAUDE_EXTENSIONS_PATH}": "${extensionPath}",
14199
+ "${HOME}": "${home}",
14200
+ "%APPDATA%": "${home}"
14201
+ },
14202
+ // Kiro uses standard env vars similar to Claude
14203
+ "gemini-to-kiro": {
14204
+ "${extensionPath}": "${KIRO_EXTENSIONS_PATH}",
14205
+ "${home}": "${HOME}"
14206
+ },
14207
+ "kiro-to-gemini": {
14208
+ "${KIRO_EXTENSIONS_PATH}": "${extensionPath}",
14209
+ "${HOME}": "${home}",
14210
+ "%APPDATA%": "${home}"
14211
+ },
14212
+ // Claude and Kiro use similar env var conventions, minimal translation needed
14213
+ "kiro-to-claude": {
14214
+ "${KIRO_EXTENSIONS_PATH}": "${CLAUDE_EXTENSIONS_PATH}"
14215
+ },
14216
+ "claude-to-kiro": {
14217
+ "${CLAUDE_EXTENSIONS_PATH}": "${KIRO_EXTENSIONS_PATH}"
14218
+ }
14219
+ };
14220
+ }
14221
+ });
14222
+
13698
14223
  // ../converters/dist/index.js
13699
14224
  var dist_exports = {};
13700
14225
  __export(dist_exports, {
@@ -13719,6 +14244,8 @@ __export(dist_exports, {
13719
14244
  claudeSchema: () => claudeSchema,
13720
14245
  claudeSkillSchema: () => claudeSkillSchema,
13721
14246
  claudeSlashCommandSchema: () => claudeSlashCommandSchema,
14247
+ claudeToGeminiMCP: () => claudeToGeminiMCP,
14248
+ claudeToKiroMCP: () => claudeToKiroMCP,
13722
14249
  codexSkillSchema: () => codexSkillSchema,
13723
14250
  continueSchema: () => continueSchema,
13724
14251
  copilotSchema: () => copilotSchema,
@@ -13741,6 +14268,7 @@ __export(dist_exports, {
13741
14268
  formatValidationErrors: () => formatValidationErrors,
13742
14269
  fromAgentsMd: () => fromAgentsMd,
13743
14270
  fromAider: () => fromAider,
14271
+ fromAmp: () => fromAmp,
13744
14272
  fromClaude: () => fromClaude,
13745
14273
  fromClaudePlugin: () => fromClaudePlugin,
13746
14274
  fromCodex: () => fromCodex,
@@ -13763,6 +14291,8 @@ __export(dist_exports, {
13763
14291
  fromZencoder: () => fromZencoder,
13764
14292
  geminiMdSchema: () => geminiMdSchema,
13765
14293
  geminiSchema: () => geminiSchema,
14294
+ geminiToClaudeMCP: () => geminiToClaudeMCP,
14295
+ geminiToKiroMCP: () => geminiToKiroMCP,
13766
14296
  generateCodexFilename: () => generateFilename2,
13767
14297
  generateMCPServerPackage: () => generateMCPServerPackage,
13768
14298
  generatePluginJson: () => generatePluginJson,
@@ -13811,8 +14341,11 @@ __export(dist_exports, {
13811
14341
  kiroAgentSchema: () => kiroAgentSchema,
13812
14342
  kiroHookSchema: () => kiroHookSchema,
13813
14343
  kiroSteeringSchema: () => kiroSteeringSchema,
14344
+ kiroToClaudeMCP: () => kiroToClaudeMCP,
14345
+ kiroToGeminiMCP: () => kiroToGeminiMCP,
13814
14346
  mapHook: () => mapHook,
13815
14347
  mapHooks: () => mapHooks,
14348
+ mergeMCPServerConfigs: () => mergeMCPServers,
13816
14349
  normalizeFormat: () => normalizeFormat,
13817
14350
  opencodeSchema: () => opencodeSchema,
13818
14351
  opencodeSlashCommandSchema: () => opencodeSlashCommandSchema,
@@ -13826,6 +14359,7 @@ __export(dist_exports, {
13826
14359
  supportsAgentsMd: () => supportsAgentsMd,
13827
14360
  toAgentsMd: () => toAgentsMd,
13828
14361
  toAider: () => toAider,
14362
+ toAmp: () => toAmp,
13829
14363
  toClaude: () => toClaude,
13830
14364
  toClaudeMd: () => toClaudeMd,
13831
14365
  toClaudePlugin: () => toClaudePlugin,
@@ -13848,8 +14382,11 @@ __export(dist_exports, {
13848
14382
  toZed: () => toZed,
13849
14383
  toZencoder: () => toZencoder,
13850
14384
  traeSchema: () => traeSchema,
14385
+ translateEnvVar: () => translateEnvVar,
14386
+ translateMCPServerEnv: () => translateMCPServerEnv,
13851
14387
  validateConversion: () => validateConversion,
13852
14388
  validateFormat: () => validateFormat,
14389
+ validateMCPServer: () => validateMCPServer,
13853
14390
  validateMarkdown: () => validateMarkdown,
13854
14391
  windsurfSchema: () => windsurfSchema,
13855
14392
  zedSchema: () => zedSchema,
@@ -13883,6 +14420,7 @@ var init_dist = __esm({
13883
14420
  init_from_replit();
13884
14421
  init_from_zed();
13885
14422
  init_from_codex();
14423
+ init_from_amp();
13886
14424
  init_from_mcp_server();
13887
14425
  init_to_cursor();
13888
14426
  init_to_cursor_hooks();
@@ -13905,12 +14443,14 @@ var init_dist = __esm({
13905
14443
  init_to_replit();
13906
14444
  init_to_zed();
13907
14445
  init_to_codex();
14446
+ init_to_amp();
13908
14447
  init_to_mcp_server();
13909
14448
  init_taxonomy_utils();
13910
14449
  init_validation();
13911
14450
  init_schema_files();
13912
14451
  init_format_registry2();
13913
14452
  init_progressive_disclosure();
14453
+ init_mcp_transformer();
13914
14454
  }
13915
14455
  });
13916
14456
 
@@ -14415,7 +14955,7 @@ function writeMCPConfig(configPath, config) {
14415
14955
  }
14416
14956
  (0, import_fs10.writeFileSync)(configPath, JSON.stringify(config, null, 2) + "\n");
14417
14957
  }
14418
- function mergeMCPServers(servers, global2 = false, projectDir = process.cwd()) {
14958
+ function mergeMCPServers2(servers, global2 = false, projectDir = process.cwd()) {
14419
14959
  const result = {
14420
14960
  added: [],
14421
14961
  skipped: [],
@@ -16001,6 +16541,7 @@ function getPackageIcon2(format, subtype) {
16001
16541
  "replit": "\u{1F52E}",
16002
16542
  "zed": "\u26A1",
16003
16543
  "codex": "\u{1F9E0}",
16544
+ "amp": "\u26A1",
16004
16545
  "mcp": "\u{1F517}",
16005
16546
  "agents.md": "\u{1F4DD}",
16006
16547
  "ruler": "\u{1F4CF}",
@@ -16028,6 +16569,7 @@ function getPackageLabel2(format, subtype) {
16028
16569
  "replit": "Replit",
16029
16570
  "zed": "Zed",
16030
16571
  "codex": "Codex",
16572
+ "amp": "Amp",
16031
16573
  "mcp": "MCP",
16032
16574
  "agents.md": "Agents.md",
16033
16575
  "ruler": "Ruler",
@@ -16571,7 +17113,7 @@ This could indicate:
16571
17113
  console.log(` \u2713 Installed ${commandFiles.length} commands to .claude/commands/`);
16572
17114
  }
16573
17115
  if (pluginConfig.mcpServers && Object.keys(pluginConfig.mcpServers).length > 0) {
16574
- const mcpResult = mergeMCPServers(
17116
+ const mcpResult = mergeMCPServers2(
16575
17117
  pluginConfig.mcpServers,
16576
17118
  options.global || false,
16577
17119
  process.cwd()
@@ -16608,7 +17150,7 @@ This could indicate:
16608
17150
  } catch (error2) {
16609
17151
  throw new Error(`Failed to parse MCP server config: ${error2 instanceof Error ? error2.message : error2}`);
16610
17152
  }
16611
- const mcpResult = mergeMCPServers(mcpServerConfig.mcpServers, options.global || false);
17153
+ const mcpResult = mergeMCPServers2(mcpServerConfig.mcpServers, options.global || false);
16612
17154
  if (mcpResult.added.length > 0) {
16613
17155
  const location = options.global ? "~/.claude/settings.json" : ".mcp.json";
16614
17156
  console.log(` \u2713 Added MCP servers to ${location}: ${mcpResult.added.join(", ")}`);
@@ -17530,11 +18072,15 @@ async function collectPackageFiles(packageDir, baseDir, packageName) {
17530
18072
  }
17531
18073
  function buildRootManifestFiles() {
17532
18074
  const files = [];
18075
+ const seenFiles = /* @__PURE__ */ new Set();
17533
18076
  const registry = getFormatRegistry();
17534
18077
  for (const [formatName, formatConfig] of Object.entries(registry.formats)) {
17535
18078
  if (formatConfig.rootFiles) {
17536
18079
  for (const rootFile of formatConfig.rootFiles) {
17537
- files.push({ file: rootFile, format: formatName });
18080
+ if (!seenFiles.has(rootFile)) {
18081
+ seenFiles.add(rootFile);
18082
+ files.push({ file: rootFile, format: formatName });
18083
+ }
17538
18084
  }
17539
18085
  }
17540
18086
  }
@@ -19813,6 +20359,7 @@ function getPackageIcon(format, subtype) {
19813
20359
  "replit": "\u{1F52E}",
19814
20360
  "zed": "\u26A1",
19815
20361
  "codex": "\u{1F9E0}",
20362
+ "amp": "\u26A1",
19816
20363
  "mcp": "\u{1F517}",
19817
20364
  "agents.md": "\u{1F4DD}",
19818
20365
  "ruler": "\u{1F4CF}",
@@ -19840,6 +20387,7 @@ function getPackageLabel(format, subtype) {
19840
20387
  "replit": "Replit",
19841
20388
  "zed": "Zed",
19842
20389
  "codex": "Codex",
20390
+ "amp": "Amp",
19843
20391
  "mcp": "MCP",
19844
20392
  "agents.md": "Agents.md",
19845
20393
  "ruler": "Ruler",
@@ -0,0 +1,37 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/amp/command.json",
4
+ "$comment": "https://ampcode.com/manual#custom-commands",
5
+ "title": "Amp Custom Command Format",
6
+ "description": "JSON Schema for Amp Custom Commands - markdown files or executables that extend prompt input",
7
+ "type": "object",
8
+ "required": ["content"],
9
+ "properties": {
10
+ "frontmatter": {
11
+ "type": "object",
12
+ "properties": {
13
+ "description": {
14
+ "type": "string",
15
+ "maxLength": 1024,
16
+ "description": "Brief description of what this command does"
17
+ }
18
+ },
19
+ "additionalProperties": false
20
+ },
21
+ "content": {
22
+ "type": "string",
23
+ "description": "Markdown content appended to the prompt when command is invoked"
24
+ }
25
+ },
26
+ "examples": [
27
+ {
28
+ "content": "# Deploy Command\n\nDeploy the application to production:\n\n1. Run tests\n2. Build the application\n3. Deploy to production server\n4. Verify deployment health"
29
+ },
30
+ {
31
+ "frontmatter": {
32
+ "description": "Generate a comprehensive test suite"
33
+ },
34
+ "content": "# Generate Tests\n\nCreate comprehensive tests for the specified code:\n\n- Unit tests for all functions\n- Integration tests for API endpoints\n- Edge case coverage"
35
+ }
36
+ ]
37
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/amp.json",
4
+ "$comment": "https://ampcode.com/manual#agents-md",
5
+ "title": "Amp AGENTS.md Format",
6
+ "description": "JSON Schema for Amp agent files - plain markdown with optional YAML frontmatter for glob patterns",
7
+ "type": "object",
8
+ "required": ["content"],
9
+ "properties": {
10
+ "frontmatter": {
11
+ "type": "object",
12
+ "properties": {
13
+ "globs": {
14
+ "oneOf": [
15
+ {
16
+ "type": "string",
17
+ "description": "Single glob pattern for file matching"
18
+ },
19
+ {
20
+ "type": "array",
21
+ "items": {
22
+ "type": "string"
23
+ },
24
+ "description": "Array of glob patterns for file matching"
25
+ }
26
+ ],
27
+ "description": "Glob patterns - file is only included when matching file types are accessed"
28
+ }
29
+ },
30
+ "additionalProperties": false
31
+ },
32
+ "content": {
33
+ "type": "string",
34
+ "description": "Plain markdown content with project-specific instructions. Supports @-mentions for including other files (e.g., @doc/*.md)"
35
+ }
36
+ },
37
+ "examples": [
38
+ {
39
+ "content": "# Backend Guidelines\n\n## Architecture\n\nWe use a clean architecture pattern with dependency injection.\n\n## Database\n\nPostgreSQL with Prisma ORM.\n\n## Coding Standards\n\n- Use TypeScript strict mode\n- Write unit tests for all services\n- Follow @docs/api-conventions.md"
40
+ },
41
+ {
42
+ "frontmatter": {
43
+ "globs": ["**/*.ts", "**/*.tsx"]
44
+ },
45
+ "content": "# TypeScript Guidelines\n\nThese rules apply only to TypeScript files:\n\n- Use strict null checks\n- Prefer interfaces over type aliases\n- Export types explicitly"
46
+ }
47
+ ]
48
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm",
3
- "version": "2.1.22",
3
+ "version": "2.1.23",
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.23",
49
- "@pr-pm/registry-client": "^2.3.22",
50
- "@pr-pm/types": "^2.1.23",
48
+ "@pr-pm/converters": "^2.1.24",
49
+ "@pr-pm/registry-client": "^2.3.23",
50
+ "@pr-pm/types": "^2.1.24",
51
51
  "ajv": "^8.17.1",
52
52
  "ajv-formats": "^3.0.1",
53
53
  "chalk": "^5.6.2",