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 +553 -5
- package/dist/schemas/amp-command.schema.json +37 -0
- package/dist/schemas/amp.schema.json +48 -0
- package/package.json +4 -4
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
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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.
|
|
49
|
-
"@pr-pm/registry-client": "^2.3.
|
|
50
|
-
"@pr-pm/types": "^2.1.
|
|
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",
|