prpm 2.1.22 → 2.1.24

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
  };
@@ -8953,8 +9044,14 @@ function validateFormat(format, data, subtype) {
8953
9044
  const warnings = [];
8954
9045
  if (!valid && validate.errors) {
8955
9046
  for (const error of validate.errors) {
8956
- const path12 = error.instancePath || "/" + error.params.missingProperty || "/";
8957
- const message = error.message || "Validation error";
9047
+ const params = error.params;
9048
+ const path12 = error.instancePath || "/" + (params.missingProperty || "");
9049
+ let message = error.message || "Validation error";
9050
+ if (error.keyword === "additionalProperties" && params.additionalProperty) {
9051
+ message = `${message}: '${params.additionalProperty}'`;
9052
+ } else if (error.keyword === "enum" && params.allowedValues) {
9053
+ message = `${message}. Allowed values: ${params.allowedValues.join(", ")}`;
9054
+ }
8958
9055
  const validationError = {
8959
9056
  path: path12,
8960
9057
  message: `${path12}: ${message}`,
@@ -12811,6 +12908,130 @@ var init_to_codex = __esm({
12811
12908
  }
12812
12909
  });
12813
12910
 
12911
+ // ../converters/dist/to-amp.js
12912
+ function toAmp(pkg) {
12913
+ const warnings = [];
12914
+ let qualityScore = 100;
12915
+ try {
12916
+ const content = convertContent15(pkg, warnings);
12917
+ const lossyConversion = warnings.some((w) => w.includes("not supported") || w.includes("skipped"));
12918
+ if (lossyConversion) {
12919
+ qualityScore -= 10;
12920
+ }
12921
+ return {
12922
+ content,
12923
+ format: "amp",
12924
+ warnings: warnings.length > 0 ? warnings : void 0,
12925
+ lossyConversion,
12926
+ qualityScore
12927
+ };
12928
+ } catch (error) {
12929
+ warnings.push(`Conversion error: ${error instanceof Error ? error.message : String(error)}`);
12930
+ return {
12931
+ content: "",
12932
+ format: "amp",
12933
+ warnings,
12934
+ lossyConversion: true,
12935
+ qualityScore: 0
12936
+ };
12937
+ }
12938
+ }
12939
+ function convertContent15(pkg, warnings) {
12940
+ const lines = [];
12941
+ const metadata = pkg.content.sections.find((s) => s.type === "metadata");
12942
+ const frontmatter = {};
12943
+ const ampData = (metadata == null ? void 0 : metadata.type) === "metadata" ? metadata.data.amp : void 0;
12944
+ if (pkg.subtype === "skill") {
12945
+ const skillName = pkg.name || pkg.id;
12946
+ frontmatter.name = skillName.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
12947
+ if ((metadata == null ? void 0 : metadata.type) === "metadata" && metadata.data.description) {
12948
+ frontmatter.description = metadata.data.description;
12949
+ } else {
12950
+ frontmatter.description = pkg.description || "No description provided";
12951
+ warnings.push("REQUIRED description field missing, using package description");
12952
+ }
12953
+ if (ampData == null ? void 0 : ampData.argumentHint) {
12954
+ frontmatter["argument-hint"] = ampData.argumentHint;
12955
+ }
12956
+ if ((ampData == null ? void 0 : ampData.disableModelInvocation) !== void 0) {
12957
+ frontmatter["disable-model-invocation"] = ampData.disableModelInvocation;
12958
+ }
12959
+ } else if (pkg.subtype === "slash-command") {
12960
+ if ((metadata == null ? void 0 : metadata.type) === "metadata" && metadata.data.description) {
12961
+ frontmatter.description = metadata.data.description;
12962
+ }
12963
+ } else {
12964
+ if ((ampData == null ? void 0 : ampData.globs) && ampData.globs.length > 0) {
12965
+ frontmatter.globs = ampData.globs;
12966
+ }
12967
+ }
12968
+ const hasFrontmatter = Object.keys(frontmatter).length > 0;
12969
+ if (hasFrontmatter) {
12970
+ lines.push("---");
12971
+ lines.push(jsYaml.dump(frontmatter, { indent: 2, lineWidth: -1 }).trim());
12972
+ lines.push("---");
12973
+ lines.push("");
12974
+ }
12975
+ const contentSections = pkg.content.sections.filter((s) => s.type !== "metadata" && s.type !== "tools");
12976
+ for (const section of contentSections) {
12977
+ if (section.type === "persona") {
12978
+ if (section.data.role) {
12979
+ lines.push(`You are a ${section.data.role}.`);
12980
+ lines.push("");
12981
+ }
12982
+ } else if (section.type === "instructions") {
12983
+ if (section.title && section.title !== "Overview" && section.title !== "Instructions") {
12984
+ lines.push(`## ${section.title}`);
12985
+ lines.push("");
12986
+ }
12987
+ lines.push(section.content);
12988
+ lines.push("");
12989
+ } else if (section.type === "rules") {
12990
+ const rulesTitle = section.title || "Rules";
12991
+ lines.push(`## ${rulesTitle}`);
12992
+ lines.push("");
12993
+ for (const rule of section.items) {
12994
+ lines.push(`- ${rule.content}`);
12995
+ }
12996
+ lines.push("");
12997
+ } else if (section.type === "examples") {
12998
+ const examplesTitle = section.title || "Examples";
12999
+ lines.push(`## ${examplesTitle}`);
13000
+ lines.push("");
13001
+ for (const example of section.examples) {
13002
+ if (example.description) {
13003
+ lines.push(`### ${example.description}`);
13004
+ lines.push("");
13005
+ }
13006
+ const lang = example.language || "";
13007
+ lines.push("```" + lang);
13008
+ lines.push(example.code);
13009
+ lines.push("```");
13010
+ lines.push("");
13011
+ }
13012
+ } else if (section.type === "context") {
13013
+ const contextTitle = section.title || "Context";
13014
+ lines.push(`## ${contextTitle}`);
13015
+ lines.push("");
13016
+ lines.push(section.content);
13017
+ lines.push("");
13018
+ } else if (section.type === "hook" || section.type === "cursor-hook") {
13019
+ warnings.push(`Hook sections are not supported in Amp format`);
13020
+ } else if (section.type !== "custom" && section.type !== "file-reference") {
13021
+ const sectionType = section.type;
13022
+ warnings.push(`Section type '${sectionType}' may not be fully supported in Amp format`);
13023
+ }
13024
+ }
13025
+ return lines.join("\n").trim() + "\n";
13026
+ }
13027
+ var init_to_amp = __esm({
13028
+ "../converters/dist/to-amp.js"() {
13029
+ "use strict";
13030
+ init_cjs_shims();
13031
+ init_js_yaml();
13032
+ }
13033
+ });
13034
+
12814
13035
  // ../converters/dist/to-mcp-server.js
12815
13036
  function toMCPServer(pkg) {
12816
13037
  var _a, _b;
@@ -13396,6 +13617,41 @@ var init_format_registry = __esm({
13396
13617
  fileExtension: ".json"
13397
13618
  }
13398
13619
  }
13620
+ },
13621
+ amp: {
13622
+ name: "Amp",
13623
+ description: "Amp code editor skills, commands, and AGENTS.md",
13624
+ documentationUrl: "https://ampcode.com/manual",
13625
+ rootFiles: ["AGENTS.md", "AGENT.md", "CLAUDE.md"],
13626
+ defaultSubtype: "skill",
13627
+ subtypes: {
13628
+ skill: {
13629
+ directory: ".agents/skills",
13630
+ filePatterns: ["SKILL.md"],
13631
+ nested: true,
13632
+ nestedIndicator: "SKILL.md",
13633
+ usesPackageSubdirectory: true,
13634
+ fileExtension: ".md"
13635
+ },
13636
+ "slash-command": {
13637
+ directory: ".agents/commands",
13638
+ filePatterns: ["*.md"],
13639
+ fileExtension: ".md"
13640
+ },
13641
+ rule: {
13642
+ directory: ".",
13643
+ filePatterns: ["AGENTS.md"],
13644
+ fileExtension: ".md"
13645
+ },
13646
+ agent: {
13647
+ directory: ".openagents",
13648
+ filePatterns: ["AGENT.md"],
13649
+ nested: true,
13650
+ nestedIndicator: "AGENT.md",
13651
+ usesPackageSubdirectory: true,
13652
+ fileExtension: ".md"
13653
+ }
13654
+ }
13399
13655
  }
13400
13656
  }
13401
13657
  };
@@ -13695,6 +13951,281 @@ var init_progressive_disclosure = __esm({
13695
13951
  }
13696
13952
  });
13697
13953
 
13954
+ // ../converters/dist/cross-converters/mcp-transformer.js
13955
+ function geminiToClaudeMCP(geminiServers) {
13956
+ const warnings = [];
13957
+ const servers = {};
13958
+ let lossless = true;
13959
+ for (const [name, config] of Object.entries(geminiServers)) {
13960
+ servers[name] = {
13961
+ command: config.command
13962
+ };
13963
+ if (config.args) {
13964
+ servers[name].args = [...config.args];
13965
+ }
13966
+ if (config.env) {
13967
+ servers[name].env = { ...config.env };
13968
+ const hasGeminiVars = Object.values(config.env).some((val) => typeof val === "string" && (val.includes("${extensionPath}") || val.includes("${home}")));
13969
+ if (hasGeminiVars) {
13970
+ warnings.push(`MCP server '${name}' uses Gemini variable substitutions (\${extensionPath}, \${home}). Claude uses different variable syntax - manual adjustment may be needed.`);
13971
+ lossless = false;
13972
+ }
13973
+ }
13974
+ if (config.disabled !== void 0) {
13975
+ servers[name].disabled = config.disabled;
13976
+ }
13977
+ }
13978
+ return {
13979
+ servers,
13980
+ warnings,
13981
+ lossless
13982
+ };
13983
+ }
13984
+ function claudeToGeminiMCP(claudeServers) {
13985
+ const warnings = [];
13986
+ const servers = {};
13987
+ let lossless = true;
13988
+ for (const [name, config] of Object.entries(claudeServers)) {
13989
+ servers[name] = {
13990
+ command: config.command
13991
+ };
13992
+ if (config.args) {
13993
+ servers[name].args = [...config.args];
13994
+ }
13995
+ if (config.env) {
13996
+ servers[name].env = { ...config.env };
13997
+ const hasClaudePatterns = Object.values(config.env).some((val) => val.includes("${CLAUDE_") || val.includes("%APPDATA%"));
13998
+ if (hasClaudePatterns) {
13999
+ warnings.push(`MCP server '${name}' uses Claude-specific patterns. Consider using Gemini variable syntax: \${extensionPath}, \${home}`);
14000
+ lossless = false;
14001
+ }
14002
+ }
14003
+ if (config.disabled !== void 0) {
14004
+ servers[name].disabled = config.disabled;
14005
+ }
14006
+ }
14007
+ return {
14008
+ servers,
14009
+ warnings,
14010
+ lossless
14011
+ };
14012
+ }
14013
+ function validateMCPServer(config) {
14014
+ const errors = [];
14015
+ if (!config.command) {
14016
+ errors.push("MCP server must have a command");
14017
+ }
14018
+ if (config.args && !Array.isArray(config.args)) {
14019
+ errors.push("MCP server args must be an array");
14020
+ }
14021
+ if (config.env !== void 0 && (typeof config.env !== "object" || config.env === null)) {
14022
+ errors.push("MCP server env must be an object");
14023
+ }
14024
+ if (config.disabled !== void 0 && typeof config.disabled !== "boolean") {
14025
+ errors.push("MCP server disabled must be a boolean");
14026
+ }
14027
+ return errors;
14028
+ }
14029
+ function mergeMCPServers(...serverSets) {
14030
+ const warnings = [];
14031
+ const servers = {};
14032
+ let lossless = true;
14033
+ for (const serverSet of serverSets) {
14034
+ for (const [name, config] of Object.entries(serverSet)) {
14035
+ if (servers[name]) {
14036
+ warnings.push(`MCP server '${name}' defined multiple times. Using latest definition.`);
14037
+ lossless = false;
14038
+ }
14039
+ servers[name] = { ...config };
14040
+ }
14041
+ }
14042
+ return {
14043
+ servers,
14044
+ warnings,
14045
+ lossless
14046
+ };
14047
+ }
14048
+ function kiroToClaudeMCP(kiroServers) {
14049
+ const warnings = [];
14050
+ const servers = {};
14051
+ let lossless = true;
14052
+ for (const [name, config] of Object.entries(kiroServers)) {
14053
+ servers[name] = {
14054
+ command: config.command
14055
+ };
14056
+ if (config.args) {
14057
+ servers[name].args = [...config.args];
14058
+ }
14059
+ if (config.env) {
14060
+ servers[name].env = { ...config.env };
14061
+ }
14062
+ if (config.disabled !== void 0) {
14063
+ servers[name].disabled = config.disabled;
14064
+ }
14065
+ if (config.timeout !== void 0) {
14066
+ warnings.push(`MCP server '${name}' has timeout=${config.timeout}ms which is not supported in Claude format. This field will be lost.`);
14067
+ lossless = false;
14068
+ }
14069
+ }
14070
+ return {
14071
+ servers,
14072
+ warnings,
14073
+ lossless
14074
+ };
14075
+ }
14076
+ function claudeToKiroMCP(claudeServers) {
14077
+ const warnings = [];
14078
+ const servers = {};
14079
+ let lossless = true;
14080
+ for (const [name, config] of Object.entries(claudeServers)) {
14081
+ servers[name] = {
14082
+ command: config.command
14083
+ };
14084
+ if (config.args) {
14085
+ servers[name].args = [...config.args];
14086
+ }
14087
+ if (config.env) {
14088
+ servers[name].env = { ...config.env };
14089
+ }
14090
+ if (config.disabled !== void 0) {
14091
+ servers[name].disabled = config.disabled;
14092
+ }
14093
+ }
14094
+ return {
14095
+ servers,
14096
+ warnings,
14097
+ lossless
14098
+ };
14099
+ }
14100
+ function kiroToGeminiMCP(kiroServers) {
14101
+ const warnings = [];
14102
+ const servers = {};
14103
+ let lossless = true;
14104
+ for (const [name, config] of Object.entries(kiroServers)) {
14105
+ servers[name] = {
14106
+ command: config.command
14107
+ };
14108
+ if (config.args) {
14109
+ servers[name].args = [...config.args];
14110
+ }
14111
+ if (config.env) {
14112
+ servers[name].env = { ...config.env };
14113
+ }
14114
+ if (config.disabled !== void 0) {
14115
+ servers[name].disabled = config.disabled;
14116
+ }
14117
+ if (config.timeout !== void 0) {
14118
+ warnings.push(`MCP server '${name}' has timeout=${config.timeout}ms which is not supported in Gemini format. This field will be lost.`);
14119
+ lossless = false;
14120
+ }
14121
+ }
14122
+ return {
14123
+ servers,
14124
+ warnings,
14125
+ lossless
14126
+ };
14127
+ }
14128
+ function geminiToKiroMCP(geminiServers) {
14129
+ const warnings = [];
14130
+ const servers = {};
14131
+ let lossless = true;
14132
+ for (const [name, config] of Object.entries(geminiServers)) {
14133
+ servers[name] = {
14134
+ command: config.command
14135
+ };
14136
+ if (config.args) {
14137
+ servers[name].args = [...config.args];
14138
+ }
14139
+ if (config.env) {
14140
+ servers[name].env = { ...config.env };
14141
+ const hasGeminiVars = Object.values(config.env).some((val) => typeof val === "string" && (val.includes("${extensionPath}") || val.includes("${home}")));
14142
+ if (hasGeminiVars) {
14143
+ warnings.push(`MCP server '${name}' uses Gemini variable substitutions (\${extensionPath}, \${home}). These may need manual adjustment for Kiro.`);
14144
+ lossless = false;
14145
+ }
14146
+ }
14147
+ if (config.disabled !== void 0) {
14148
+ servers[name].disabled = config.disabled;
14149
+ }
14150
+ }
14151
+ return {
14152
+ servers,
14153
+ warnings,
14154
+ lossless
14155
+ };
14156
+ }
14157
+ function translateEnvVar(envValue, direction) {
14158
+ let translated = false;
14159
+ let value = envValue;
14160
+ const mappings = ENV_VAR_MAPPINGS[direction];
14161
+ if (mappings) {
14162
+ for (const [from, to] of Object.entries(mappings)) {
14163
+ if (value.includes(from)) {
14164
+ value = value.replace(new RegExp(from.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), to);
14165
+ translated = true;
14166
+ }
14167
+ }
14168
+ }
14169
+ return { value, translated };
14170
+ }
14171
+ function translateMCPServerEnv(config, direction) {
14172
+ const warnings = [];
14173
+ if (!config.env) {
14174
+ return { config, warnings };
14175
+ }
14176
+ const translatedEnv = {};
14177
+ let anyTranslated = false;
14178
+ for (const [key, value] of Object.entries(config.env)) {
14179
+ const { value: translatedValue, translated } = translateEnvVar(value, direction);
14180
+ translatedEnv[key] = translatedValue;
14181
+ if (translated) {
14182
+ anyTranslated = true;
14183
+ }
14184
+ }
14185
+ if (anyTranslated) {
14186
+ warnings.push(`Environment variables were automatically translated for target format`);
14187
+ }
14188
+ return {
14189
+ config: { ...config, env: translatedEnv },
14190
+ warnings
14191
+ };
14192
+ }
14193
+ var ENV_VAR_MAPPINGS;
14194
+ var init_mcp_transformer = __esm({
14195
+ "../converters/dist/cross-converters/mcp-transformer.js"() {
14196
+ "use strict";
14197
+ init_cjs_shims();
14198
+ ENV_VAR_MAPPINGS = {
14199
+ "gemini-to-claude": {
14200
+ "${extensionPath}": "${CLAUDE_EXTENSIONS_PATH}",
14201
+ "${home}": "${HOME}"
14202
+ },
14203
+ "claude-to-gemini": {
14204
+ "${CLAUDE_EXTENSIONS_PATH}": "${extensionPath}",
14205
+ "${HOME}": "${home}",
14206
+ "%APPDATA%": "${home}"
14207
+ },
14208
+ // Kiro uses standard env vars similar to Claude
14209
+ "gemini-to-kiro": {
14210
+ "${extensionPath}": "${KIRO_EXTENSIONS_PATH}",
14211
+ "${home}": "${HOME}"
14212
+ },
14213
+ "kiro-to-gemini": {
14214
+ "${KIRO_EXTENSIONS_PATH}": "${extensionPath}",
14215
+ "${HOME}": "${home}",
14216
+ "%APPDATA%": "${home}"
14217
+ },
14218
+ // Claude and Kiro use similar env var conventions, minimal translation needed
14219
+ "kiro-to-claude": {
14220
+ "${KIRO_EXTENSIONS_PATH}": "${CLAUDE_EXTENSIONS_PATH}"
14221
+ },
14222
+ "claude-to-kiro": {
14223
+ "${CLAUDE_EXTENSIONS_PATH}": "${KIRO_EXTENSIONS_PATH}"
14224
+ }
14225
+ };
14226
+ }
14227
+ });
14228
+
13698
14229
  // ../converters/dist/index.js
13699
14230
  var dist_exports = {};
13700
14231
  __export(dist_exports, {
@@ -13719,6 +14250,8 @@ __export(dist_exports, {
13719
14250
  claudeSchema: () => claudeSchema,
13720
14251
  claudeSkillSchema: () => claudeSkillSchema,
13721
14252
  claudeSlashCommandSchema: () => claudeSlashCommandSchema,
14253
+ claudeToGeminiMCP: () => claudeToGeminiMCP,
14254
+ claudeToKiroMCP: () => claudeToKiroMCP,
13722
14255
  codexSkillSchema: () => codexSkillSchema,
13723
14256
  continueSchema: () => continueSchema,
13724
14257
  copilotSchema: () => copilotSchema,
@@ -13741,6 +14274,7 @@ __export(dist_exports, {
13741
14274
  formatValidationErrors: () => formatValidationErrors,
13742
14275
  fromAgentsMd: () => fromAgentsMd,
13743
14276
  fromAider: () => fromAider,
14277
+ fromAmp: () => fromAmp,
13744
14278
  fromClaude: () => fromClaude,
13745
14279
  fromClaudePlugin: () => fromClaudePlugin,
13746
14280
  fromCodex: () => fromCodex,
@@ -13763,6 +14297,8 @@ __export(dist_exports, {
13763
14297
  fromZencoder: () => fromZencoder,
13764
14298
  geminiMdSchema: () => geminiMdSchema,
13765
14299
  geminiSchema: () => geminiSchema,
14300
+ geminiToClaudeMCP: () => geminiToClaudeMCP,
14301
+ geminiToKiroMCP: () => geminiToKiroMCP,
13766
14302
  generateCodexFilename: () => generateFilename2,
13767
14303
  generateMCPServerPackage: () => generateMCPServerPackage,
13768
14304
  generatePluginJson: () => generatePluginJson,
@@ -13811,8 +14347,11 @@ __export(dist_exports, {
13811
14347
  kiroAgentSchema: () => kiroAgentSchema,
13812
14348
  kiroHookSchema: () => kiroHookSchema,
13813
14349
  kiroSteeringSchema: () => kiroSteeringSchema,
14350
+ kiroToClaudeMCP: () => kiroToClaudeMCP,
14351
+ kiroToGeminiMCP: () => kiroToGeminiMCP,
13814
14352
  mapHook: () => mapHook,
13815
14353
  mapHooks: () => mapHooks,
14354
+ mergeMCPServerConfigs: () => mergeMCPServers,
13816
14355
  normalizeFormat: () => normalizeFormat,
13817
14356
  opencodeSchema: () => opencodeSchema,
13818
14357
  opencodeSlashCommandSchema: () => opencodeSlashCommandSchema,
@@ -13826,6 +14365,7 @@ __export(dist_exports, {
13826
14365
  supportsAgentsMd: () => supportsAgentsMd,
13827
14366
  toAgentsMd: () => toAgentsMd,
13828
14367
  toAider: () => toAider,
14368
+ toAmp: () => toAmp,
13829
14369
  toClaude: () => toClaude,
13830
14370
  toClaudeMd: () => toClaudeMd,
13831
14371
  toClaudePlugin: () => toClaudePlugin,
@@ -13848,8 +14388,11 @@ __export(dist_exports, {
13848
14388
  toZed: () => toZed,
13849
14389
  toZencoder: () => toZencoder,
13850
14390
  traeSchema: () => traeSchema,
14391
+ translateEnvVar: () => translateEnvVar,
14392
+ translateMCPServerEnv: () => translateMCPServerEnv,
13851
14393
  validateConversion: () => validateConversion,
13852
14394
  validateFormat: () => validateFormat,
14395
+ validateMCPServer: () => validateMCPServer,
13853
14396
  validateMarkdown: () => validateMarkdown,
13854
14397
  windsurfSchema: () => windsurfSchema,
13855
14398
  zedSchema: () => zedSchema,
@@ -13883,6 +14426,7 @@ var init_dist = __esm({
13883
14426
  init_from_replit();
13884
14427
  init_from_zed();
13885
14428
  init_from_codex();
14429
+ init_from_amp();
13886
14430
  init_from_mcp_server();
13887
14431
  init_to_cursor();
13888
14432
  init_to_cursor_hooks();
@@ -13905,12 +14449,14 @@ var init_dist = __esm({
13905
14449
  init_to_replit();
13906
14450
  init_to_zed();
13907
14451
  init_to_codex();
14452
+ init_to_amp();
13908
14453
  init_to_mcp_server();
13909
14454
  init_taxonomy_utils();
13910
14455
  init_validation();
13911
14456
  init_schema_files();
13912
14457
  init_format_registry2();
13913
14458
  init_progressive_disclosure();
14459
+ init_mcp_transformer();
13914
14460
  }
13915
14461
  });
13916
14462
 
@@ -14415,7 +14961,7 @@ function writeMCPConfig(configPath, config) {
14415
14961
  }
14416
14962
  (0, import_fs10.writeFileSync)(configPath, JSON.stringify(config, null, 2) + "\n");
14417
14963
  }
14418
- function mergeMCPServers(servers, global2 = false, projectDir = process.cwd()) {
14964
+ function mergeMCPServers2(servers, global2 = false, projectDir = process.cwd()) {
14419
14965
  const result = {
14420
14966
  added: [],
14421
14967
  skipped: [],
@@ -16001,6 +16547,7 @@ function getPackageIcon2(format, subtype) {
16001
16547
  "replit": "\u{1F52E}",
16002
16548
  "zed": "\u26A1",
16003
16549
  "codex": "\u{1F9E0}",
16550
+ "amp": "\u26A1",
16004
16551
  "mcp": "\u{1F517}",
16005
16552
  "agents.md": "\u{1F4DD}",
16006
16553
  "ruler": "\u{1F4CF}",
@@ -16028,6 +16575,7 @@ function getPackageLabel2(format, subtype) {
16028
16575
  "replit": "Replit",
16029
16576
  "zed": "Zed",
16030
16577
  "codex": "Codex",
16578
+ "amp": "Amp",
16031
16579
  "mcp": "MCP",
16032
16580
  "agents.md": "Agents.md",
16033
16581
  "ruler": "Ruler",
@@ -16571,7 +17119,7 @@ This could indicate:
16571
17119
  console.log(` \u2713 Installed ${commandFiles.length} commands to .claude/commands/`);
16572
17120
  }
16573
17121
  if (pluginConfig.mcpServers && Object.keys(pluginConfig.mcpServers).length > 0) {
16574
- const mcpResult = mergeMCPServers(
17122
+ const mcpResult = mergeMCPServers2(
16575
17123
  pluginConfig.mcpServers,
16576
17124
  options.global || false,
16577
17125
  process.cwd()
@@ -16608,7 +17156,7 @@ This could indicate:
16608
17156
  } catch (error2) {
16609
17157
  throw new Error(`Failed to parse MCP server config: ${error2 instanceof Error ? error2.message : error2}`);
16610
17158
  }
16611
- const mcpResult = mergeMCPServers(mcpServerConfig.mcpServers, options.global || false);
17159
+ const mcpResult = mergeMCPServers2(mcpServerConfig.mcpServers, options.global || false);
16612
17160
  if (mcpResult.added.length > 0) {
16613
17161
  const location = options.global ? "~/.claude/settings.json" : ".mcp.json";
16614
17162
  console.log(` \u2713 Added MCP servers to ${location}: ${mcpResult.added.join(", ")}`);
@@ -17530,11 +18078,15 @@ async function collectPackageFiles(packageDir, baseDir, packageName) {
17530
18078
  }
17531
18079
  function buildRootManifestFiles() {
17532
18080
  const files = [];
18081
+ const seenFiles = /* @__PURE__ */ new Set();
17533
18082
  const registry = getFormatRegistry();
17534
18083
  for (const [formatName, formatConfig] of Object.entries(registry.formats)) {
17535
18084
  if (formatConfig.rootFiles) {
17536
18085
  for (const rootFile of formatConfig.rootFiles) {
17537
- files.push({ file: rootFile, format: formatName });
18086
+ if (!seenFiles.has(rootFile)) {
18087
+ seenFiles.add(rootFile);
18088
+ files.push({ file: rootFile, format: formatName });
18089
+ }
17538
18090
  }
17539
18091
  }
17540
18092
  }
@@ -19813,6 +20365,7 @@ function getPackageIcon(format, subtype) {
19813
20365
  "replit": "\u{1F52E}",
19814
20366
  "zed": "\u26A1",
19815
20367
  "codex": "\u{1F9E0}",
20368
+ "amp": "\u26A1",
19816
20369
  "mcp": "\u{1F517}",
19817
20370
  "agents.md": "\u{1F4DD}",
19818
20371
  "ruler": "\u{1F4CF}",
@@ -19840,6 +20393,7 @@ function getPackageLabel(format, subtype) {
19840
20393
  "replit": "Replit",
19841
20394
  "zed": "Zed",
19842
20395
  "codex": "Codex",
20396
+ "amp": "Amp",
19843
20397
  "mcp": "MCP",
19844
20398
  "agents.md": "Agents.md",
19845
20399
  "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.24",
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.25",
49
+ "@pr-pm/registry-client": "^2.3.24",
50
+ "@pr-pm/types": "^2.1.25",
51
51
  "ajv": "^8.17.1",
52
52
  "ajv-formats": "^3.0.1",
53
53
  "chalk": "^5.6.2",