@decaf-ts/mcp-server 0.0.4 → 0.3.0
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/README.md +18 -2
- package/dist/mcp-server.cjs +1986 -340
- package/dist/mcp-server.esm.cjs +1960 -337
- package/lib/McpWrapper.cjs +9 -9
- package/lib/McpWrapper.d.ts +1 -1
- package/lib/bin/validate-modules.cjs +24 -0
- package/lib/bin/validate-modules.d.ts +2 -0
- package/lib/constants.cjs +22 -2
- package/lib/constants.d.ts +16 -0
- package/lib/esm/McpWrapper.d.ts +1 -1
- package/lib/esm/McpWrapper.js +9 -9
- package/lib/esm/bin/validate-modules.d.ts +2 -0
- package/lib/esm/bin/validate-modules.js +22 -0
- package/lib/esm/constants.d.ts +16 -0
- package/lib/esm/constants.js +21 -1
- package/lib/esm/mcp/aggregateModules.d.ts +26 -0
- package/lib/esm/mcp/aggregateModules.js +185 -0
- package/lib/esm/mcp/code.d.ts +23 -0
- package/lib/esm/mcp/code.js +70 -0
- package/lib/esm/mcp/decorator-tools.js +237 -0
- package/lib/esm/mcp/fastmcp-wiring.d.ts +14 -0
- package/lib/esm/mcp/fastmcp-wiring.js +56 -0
- package/lib/esm/mcp/index.d.ts +7 -1
- package/lib/esm/mcp/index.js +26 -2
- package/lib/esm/mcp/mcp-module.d.ts +11 -0
- package/lib/esm/mcp/mcp-module.js +31 -0
- package/lib/esm/mcp/moduleRegistry.d.ts +12 -0
- package/lib/esm/mcp/moduleRegistry.js +46 -0
- package/lib/esm/mcp/prompts/index.d.ts +4 -0
- package/lib/esm/mcp/prompts/index.js +7 -0
- package/lib/esm/mcp/prompts/prompts.d.ts +22 -0
- package/lib/esm/mcp/prompts/prompts.js +197 -0
- package/lib/esm/mcp/resources/index.d.ts +1 -0
- package/lib/esm/mcp/resources/index.js +2 -0
- package/lib/esm/mcp/resources/resources.d.ts +2 -0
- package/lib/esm/mcp/resources/resources.js +69 -0
- package/lib/esm/mcp/schemas.d.ts +53 -0
- package/lib/esm/mcp/schemas.js +97 -0
- package/lib/esm/mcp/templates/codex-templates.d.ts +3 -0
- package/lib/esm/mcp/templates/codex-templates.js +33 -0
- package/lib/esm/mcp/templates/index.d.ts +71 -0
- package/lib/esm/mcp/templates/index.js +66 -0
- package/lib/esm/mcp/templates/resource-templates.d.ts +3 -0
- package/lib/esm/mcp/templates/resource-templates.js +60 -0
- package/lib/esm/mcp/templates/workspace-templates.d.ts +3 -0
- package/lib/esm/mcp/templates/workspace-templates.js +66 -0
- package/lib/esm/mcp/tools/codex-tools.d.ts +5 -0
- package/lib/esm/mcp/tools/codex-tools.js +244 -0
- package/lib/esm/mcp/tools/generateMcpModule.d.ts +9 -0
- package/lib/esm/mcp/tools/generateMcpModule.js +133 -0
- package/lib/esm/mcp/tools/index.d.ts +321 -0
- package/lib/esm/mcp/tools/index.js +29 -0
- package/lib/esm/mcp/tools/tools.d.ts +10 -0
- package/lib/esm/mcp/tools/tools.js +273 -0
- package/lib/esm/mcp/types.d.ts +66 -0
- package/lib/esm/mcp/types.js +2 -0
- package/lib/esm/mcp/utils.d.ts +4 -0
- package/lib/esm/mcp/utils.js +46 -0
- package/lib/esm/mcp/validation/index.d.ts +13 -0
- package/lib/esm/mcp/validation/index.js +116 -0
- package/lib/esm/mcp/validation/scaffoldModule.d.ts +9 -0
- package/lib/esm/mcp/validation/scaffoldModule.js +88 -0
- package/lib/esm/mcp/workspace.d.ts +9 -0
- package/lib/esm/mcp/workspace.js +73 -0
- package/lib/esm/metadata.d.ts +1 -1
- package/lib/esm/metadata.js +1 -1
- package/lib/esm/modules/_template/index.d.ts +32 -0
- package/lib/esm/modules/_template/index.js +16 -0
- package/lib/esm/modules/_template/prompts/index.d.ts +6 -0
- package/lib/esm/modules/_template/prompts/index.js +9 -0
- package/lib/esm/modules/_template/resources/index.d.ts +6 -0
- package/lib/esm/modules/_template/resources/index.js +9 -0
- package/lib/esm/modules/_template/templates/index.d.ts +7 -0
- package/lib/esm/modules/_template/templates/index.js +10 -0
- package/lib/esm/modules/_template/tools/index.d.ts +6 -0
- package/lib/esm/modules/_template/tools/index.js +15 -0
- package/lib/esm/modules/decoration/index.d.ts +46 -0
- package/lib/esm/modules/decoration/index.js +10 -2
- package/lib/esm/modules/decoration/prompts/index.d.ts +1 -0
- package/lib/esm/modules/decoration/prompts/index.js +2 -0
- package/lib/esm/modules/decoration/resources/index.d.ts +7 -0
- package/lib/esm/modules/decoration/resources/index.js +10 -0
- package/lib/esm/modules/decoration/templates/index.d.ts +6 -0
- package/lib/esm/modules/decoration/templates/index.js +9 -0
- package/lib/esm/modules/decoration/tools/index.d.ts +26 -0
- package/lib/esm/modules/decoration/tools/index.js +7 -0
- package/lib/esm/modules/index.d.ts +2 -0
- package/lib/esm/modules/index.js +10 -0
- package/lib/esm/modules/mcp/decoration-assist.d.ts +3 -38
- package/lib/esm/modules/mcp/decoration-assist.js +5 -352
- package/lib/esm/modules/mcp/index.d.ts +6 -2
- package/lib/esm/modules/mcp/index.js +16 -3
- package/lib/esm/modules/mcp/prompts/index.d.ts +2 -0
- package/lib/esm/modules/mcp/prompts/index.js +9 -0
- package/lib/esm/modules/mcp/resources/index.d.ts +2 -0
- package/lib/esm/modules/mcp/resources/index.js +24 -0
- package/lib/esm/modules/mcp/templates/index.d.ts +2 -0
- package/lib/esm/modules/mcp/templates/index.js +28 -0
- package/lib/esm/modules/mcp/tools/index.d.ts +6 -0
- package/lib/esm/modules/mcp/tools/index.js +15 -0
- package/lib/esm/types.d.ts +41 -1
- package/lib/esm/types.js +1 -1
- package/lib/esm/utils/modulePaths.d.ts +6 -0
- package/lib/esm/utils/modulePaths.js +33 -0
- package/lib/esm/utils/moduleValidator.d.ts +14 -0
- package/lib/esm/utils/moduleValidator.js +176 -0
- package/lib/esm/utils.d.ts +1 -0
- package/lib/esm/utils.js +2 -1
- package/lib/mcp/aggregateModules.cjs +225 -0
- package/lib/mcp/aggregateModules.d.ts +26 -0
- package/lib/mcp/code.cjs +81 -0
- package/lib/mcp/code.d.ts +23 -0
- package/lib/mcp/decorator-tools.cjs +243 -0
- package/lib/mcp/fastmcp-wiring.cjs +59 -0
- package/lib/mcp/fastmcp-wiring.d.ts +14 -0
- package/lib/mcp/index.cjs +47 -12
- package/lib/mcp/index.d.ts +7 -1
- package/lib/mcp/mcp-module.cjs +53 -0
- package/lib/mcp/mcp-module.d.ts +11 -0
- package/lib/mcp/moduleRegistry.cjs +50 -0
- package/lib/mcp/moduleRegistry.d.ts +12 -0
- package/lib/mcp/prompts/index.cjs +25 -0
- package/lib/mcp/prompts/index.d.ts +4 -0
- package/lib/mcp/prompts/prompts.cjs +211 -0
- package/lib/mcp/prompts/prompts.d.ts +22 -0
- package/lib/mcp/resources/index.cjs +18 -0
- package/lib/mcp/resources/index.d.ts +1 -0
- package/lib/mcp/resources/resources.cjs +72 -0
- package/lib/mcp/resources/resources.d.ts +2 -0
- package/lib/mcp/schemas.cjs +100 -0
- package/lib/mcp/schemas.d.ts +53 -0
- package/lib/mcp/templates/codex-templates.cjs +40 -0
- package/lib/mcp/templates/codex-templates.d.ts +3 -0
- package/lib/mcp/templates/index.cjs +76 -0
- package/lib/mcp/templates/index.d.ts +71 -0
- package/lib/mcp/templates/resource-templates.cjs +67 -0
- package/lib/mcp/templates/resource-templates.d.ts +3 -0
- package/lib/mcp/templates/workspace-templates.cjs +70 -0
- package/lib/mcp/templates/workspace-templates.d.ts +3 -0
- package/lib/mcp/tools/codex-tools.cjs +250 -0
- package/lib/mcp/tools/codex-tools.d.ts +5 -0
- package/lib/mcp/tools/generateMcpModule.cjs +139 -0
- package/lib/mcp/tools/generateMcpModule.d.ts +9 -0
- package/lib/mcp/tools/index.cjs +46 -0
- package/lib/mcp/tools/index.d.ts +321 -0
- package/lib/mcp/tools/tools.cjs +282 -0
- package/lib/mcp/tools/tools.d.ts +10 -0
- package/lib/mcp/types.cjs +3 -0
- package/lib/mcp/types.d.ts +66 -0
- package/lib/mcp/utils.cjs +54 -0
- package/lib/mcp/utils.d.ts +4 -0
- package/lib/mcp/validation/index.cjs +123 -0
- package/lib/mcp/validation/index.d.ts +13 -0
- package/lib/mcp/validation/scaffoldModule.cjs +94 -0
- package/lib/mcp/validation/scaffoldModule.d.ts +9 -0
- package/lib/mcp/workspace.cjs +119 -0
- package/lib/mcp/workspace.d.ts +9 -0
- package/lib/metadata.cjs +1 -1
- package/lib/metadata.d.ts +1 -1
- package/lib/modules/_template/index.cjs +23 -0
- package/lib/modules/_template/index.d.ts +32 -0
- package/lib/modules/_template/prompts/index.cjs +12 -0
- package/lib/modules/_template/prompts/index.d.ts +6 -0
- package/lib/modules/_template/resources/index.cjs +12 -0
- package/lib/modules/_template/resources/index.d.ts +6 -0
- package/lib/modules/_template/templates/index.cjs +13 -0
- package/lib/modules/_template/templates/index.d.ts +7 -0
- package/lib/modules/_template/tools/index.cjs +18 -0
- package/lib/modules/_template/tools/index.d.ts +6 -0
- package/lib/modules/decoration/index.cjs +16 -1
- package/lib/modules/decoration/index.d.ts +46 -0
- package/lib/modules/decoration/prompts/index.cjs +5 -0
- package/lib/modules/decoration/prompts/index.d.ts +1 -0
- package/lib/modules/decoration/resources/index.cjs +13 -0
- package/lib/modules/decoration/resources/index.d.ts +7 -0
- package/lib/modules/decoration/templates/index.cjs +12 -0
- package/lib/modules/decoration/templates/index.d.ts +6 -0
- package/lib/modules/decoration/tools/index.cjs +10 -0
- package/lib/modules/decoration/tools/index.d.ts +26 -0
- package/lib/modules/index.cjs +13 -0
- package/lib/modules/index.d.ts +2 -0
- package/lib/modules/mcp/decoration-assist.cjs +8 -355
- package/lib/modules/mcp/decoration-assist.d.ts +3 -38
- package/lib/modules/mcp/index.cjs +21 -22
- package/lib/modules/mcp/index.d.ts +6 -2
- package/lib/modules/mcp/prompts/index.cjs +12 -0
- package/lib/modules/mcp/prompts/index.d.ts +2 -0
- package/lib/modules/mcp/resources/index.cjs +27 -0
- package/lib/modules/mcp/resources/index.d.ts +2 -0
- package/lib/modules/mcp/templates/index.cjs +31 -0
- package/lib/modules/mcp/templates/index.d.ts +2 -0
- package/lib/modules/mcp/tools/index.cjs +18 -0
- package/lib/modules/mcp/tools/index.d.ts +6 -0
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +41 -1
- package/lib/utils/modulePaths.cjs +43 -0
- package/lib/utils/modulePaths.d.ts +6 -0
- package/lib/utils/moduleValidator.cjs +184 -0
- package/lib/utils/moduleValidator.d.ts +14 -0
- package/lib/utils.cjs +5 -1
- package/lib/utils.d.ts +1 -0
- package/package.json +14 -13
- package/lib/esm/modules/mcp/decorator-tools.js +0 -237
- package/lib/esm/modules/mcp/mcp-module.d.ts +0 -230
- package/lib/esm/modules/mcp/mcp-module.js +0 -406
- package/lib/modules/mcp/decorator-tools.cjs +0 -243
- package/lib/modules/mcp/mcp-module.cjs +0 -452
- package/lib/modules/mcp/mcp-module.d.ts +0 -230
- /package/lib/esm/{modules/mcp → mcp}/decorator-tools.d.ts +0 -0
- /package/lib/{modules/mcp → mcp}/decorator-tools.d.ts +0 -0
|
@@ -3,358 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
exports.default =
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
return fs_1.default.readFileSync(filePath, { encoding });
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function listFilesRecursive(root, matcher) {
|
|
22
|
-
const out = [];
|
|
23
|
-
const stack = [root];
|
|
24
|
-
while (stack.length) {
|
|
25
|
-
const cur = stack.pop();
|
|
26
|
-
const stat = fs_1.default.statSync(cur);
|
|
27
|
-
if (stat.isDirectory()) {
|
|
28
|
-
for (const f of fs_1.default.readdirSync(cur))
|
|
29
|
-
stack.push(path_1.default.join(cur, f));
|
|
30
|
-
}
|
|
31
|
-
else if (!matcher || matcher(cur)) {
|
|
32
|
-
out.push(cur);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return out.sort();
|
|
36
|
-
}
|
|
37
|
-
// Zod Schemas (with explicit descriptions)
|
|
38
|
-
const analyzeRepoSchema = zod_1.z
|
|
39
|
-
.object({
|
|
40
|
-
repoPath: zod_1.z
|
|
41
|
-
.string({
|
|
42
|
-
description: "Relative or absolute path to the target repository inside this monorepo, e.g. './decoration'.",
|
|
43
|
-
})
|
|
44
|
-
.min(1, "repoPath is required"),
|
|
45
|
-
includeTests: zod_1.z
|
|
46
|
-
.boolean({
|
|
47
|
-
description: "If true, analyze the tests directory (if present) to derive expected behaviors.",
|
|
48
|
-
})
|
|
49
|
-
.default(true),
|
|
50
|
-
includeDocs: zod_1.z
|
|
51
|
-
.boolean({
|
|
52
|
-
description: "If true, analyze README.md and docs directories to extract documented features.",
|
|
53
|
-
})
|
|
54
|
-
.default(true),
|
|
55
|
-
})
|
|
56
|
-
.strict()
|
|
57
|
-
.describe("Analyze a local repository (e.g. ./decoration) to extract APIs, features, tests, and documentation cues.");
|
|
58
|
-
const enumerateCapabilitiesSchema = zod_1.z
|
|
59
|
-
.object({
|
|
60
|
-
repoPath: zod_1.z
|
|
61
|
-
.string({
|
|
62
|
-
description: "Relative or absolute path to the target repository to enumerate developer-facing capabilities.",
|
|
63
|
-
})
|
|
64
|
-
.min(1, "repoPath is required"),
|
|
65
|
-
})
|
|
66
|
-
.strict()
|
|
67
|
-
.describe("Enumerate the complete set of capabilities a developer is expected to use from the given repository.");
|
|
68
|
-
const planFeatureSchema = zod_1.z
|
|
69
|
-
.object({
|
|
70
|
-
feature: zod_1.z
|
|
71
|
-
.string({
|
|
72
|
-
description: "Natural-language description of a developer's requested feature or task to implement using the repository and available MCP tools.",
|
|
73
|
-
})
|
|
74
|
-
.min(5, "feature must describe the goal clearly"),
|
|
75
|
-
repoPath: zod_1.z
|
|
76
|
-
.string({
|
|
77
|
-
description: "Target repository path providing the library to use, e.g. './decoration'.",
|
|
78
|
-
})
|
|
79
|
-
.default("./decoration"),
|
|
80
|
-
})
|
|
81
|
-
.strict()
|
|
82
|
-
.describe("Plan which MCP tools to use and in what sequence to implement a requested feature using the repository.");
|
|
83
|
-
// Analysis helpers (minimal yet effective, text-based to avoid heavy AST deps)
|
|
84
|
-
function isSourceFile(p) {
|
|
85
|
-
return /\.(ts|tsx|js|jsx)$/.test(p) && !p.endsWith(".d.ts");
|
|
86
|
-
}
|
|
87
|
-
function isTestFile(p) {
|
|
88
|
-
return /(\.test\.|\.spec\.)/.test(p);
|
|
89
|
-
}
|
|
90
|
-
function extractExports(fileContent) {
|
|
91
|
-
const names = new Set();
|
|
92
|
-
const exportRe = /(export\s+(?:default\s+)?(?:class|function|const|let|var|interface|type|enum)\s+)([A-Za-z0-9_]+)/g;
|
|
93
|
-
const namedRe = /export\s*\{([^}]+)\}/g;
|
|
94
|
-
let m;
|
|
95
|
-
while ((m = exportRe.exec(fileContent)))
|
|
96
|
-
names.add(m[2]);
|
|
97
|
-
while ((m = namedRe.exec(fileContent))) {
|
|
98
|
-
m[1]
|
|
99
|
-
.split(",")
|
|
100
|
-
.map((s) => s.trim().split(" as ")[0].trim())
|
|
101
|
-
.forEach((n) => {
|
|
102
|
-
if (n)
|
|
103
|
-
names.add(n);
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
return [...names].sort();
|
|
107
|
-
}
|
|
108
|
-
function extractDecorators(fileContent) {
|
|
109
|
-
const decs = new Set();
|
|
110
|
-
const decRe = /@([A-Za-z_][A-Za-z0-9_]*)/g;
|
|
111
|
-
let m;
|
|
112
|
-
while ((m = decRe.exec(fileContent)))
|
|
113
|
-
decs.add(m[1]);
|
|
114
|
-
return [...decs].sort();
|
|
115
|
-
}
|
|
116
|
-
function summarizeReadme(readme) {
|
|
117
|
-
if (!readme)
|
|
118
|
-
return undefined;
|
|
119
|
-
const lines = readme.split(/\r?\n/).filter(Boolean);
|
|
120
|
-
const title = lines.find((l) => /^#\s+/.test(l))?.replace(/^#\s+/, "") || "README";
|
|
121
|
-
const bullets = lines.filter((l) => /^[-*]\s+/.test(l)).slice(0, 20);
|
|
122
|
-
return { title, bullets };
|
|
123
|
-
}
|
|
124
|
-
function analyzeRepo(root) {
|
|
125
|
-
const src = path_1.default.join(root, "src");
|
|
126
|
-
const testDir = path_1.default.join(root, "tests");
|
|
127
|
-
const readmePath = path_1.default.join(root, "README.md");
|
|
128
|
-
const readme = readFileSafe(readmePath);
|
|
129
|
-
const files = fs_1.default.existsSync(src) ? listFilesRecursive(src, isSourceFile) : [];
|
|
130
|
-
const testFiles = fs_1.default.existsSync(testDir)
|
|
131
|
-
? listFilesRecursive(testDir, (f) => isSourceFile(f) && isTestFile(f))
|
|
132
|
-
: [];
|
|
133
|
-
const api = {};
|
|
134
|
-
for (const f of files) {
|
|
135
|
-
const content = readFileSafe(f) || "";
|
|
136
|
-
api[path_1.default.relative(root, f)] = {
|
|
137
|
-
exports: extractExports(content),
|
|
138
|
-
decorators: extractDecorators(content),
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
const tests = {};
|
|
142
|
-
for (const f of testFiles) {
|
|
143
|
-
const content = readFileSafe(f) || "";
|
|
144
|
-
const mentions = Array.from(new Set([...extractExports(content), ...extractDecorators(content)])).sort();
|
|
145
|
-
tests[path_1.default.relative(root, f)] = { mentions };
|
|
146
|
-
}
|
|
147
|
-
return { files, testFiles, api, tests, readme: summarizeReadme(readme) };
|
|
148
|
-
}
|
|
149
|
-
// Tools
|
|
150
|
-
function buildAnalyzeRepositoryTool() {
|
|
151
|
-
return {
|
|
152
|
-
name: "analyze-repository",
|
|
153
|
-
description: "Analyze a local repository's source, tests, and docs to extract exported APIs, decorators, and test mentions.",
|
|
154
|
-
parameters: analyzeRepoSchema,
|
|
155
|
-
execute: async (input) => {
|
|
156
|
-
let repoRoot = path_1.default.resolve(process.cwd(), input.repoPath);
|
|
157
|
-
if (!fs_1.default.existsSync(repoRoot)) {
|
|
158
|
-
// try resolving from monorepo root (parent of current cwd)
|
|
159
|
-
const alt = path_1.default.resolve(process.cwd(), "..", input.repoPath);
|
|
160
|
-
if (fs_1.default.existsSync(alt))
|
|
161
|
-
repoRoot = alt;
|
|
162
|
-
}
|
|
163
|
-
if (!fs_1.default.existsSync(repoRoot)) {
|
|
164
|
-
// if input was absolute and still not found, try ../<basename>
|
|
165
|
-
const alt2 = path_1.default.resolve(process.cwd(), "..", path_1.default.basename(input.repoPath));
|
|
166
|
-
if (fs_1.default.existsSync(alt2))
|
|
167
|
-
repoRoot = alt2;
|
|
168
|
-
}
|
|
169
|
-
if (!fs_1.default.existsSync(repoRoot))
|
|
170
|
-
throw new Error(`Repository not found at ${repoRoot}`);
|
|
171
|
-
const result = analyzeRepo(repoRoot);
|
|
172
|
-
return {
|
|
173
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
174
|
-
};
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
function deriveCapabilities(analysis) {
|
|
179
|
-
const cap = new Set();
|
|
180
|
-
// heuristics: if decorators like Decoration, flavouredAs, extend, override appear, add capabilities
|
|
181
|
-
const allDecs = new Set();
|
|
182
|
-
for (const k of Object.keys(analysis.api)) {
|
|
183
|
-
for (const d of analysis.api[k].decorators)
|
|
184
|
-
allDecs.add(d);
|
|
185
|
-
for (const e of analysis.api[k].exports)
|
|
186
|
-
if (/Decoration|decorate|Builder|Flavour/i.test(e))
|
|
187
|
-
cap.add("use-decoration-api");
|
|
188
|
-
}
|
|
189
|
-
if ([...allDecs].some((d) => /override|extend/i.test(d)))
|
|
190
|
-
cap.add("override-and-extend-decorations");
|
|
191
|
-
if (Object.keys(analysis.tests).length > 0)
|
|
192
|
-
cap.add("validate-with-tests");
|
|
193
|
-
if (analysis.readme)
|
|
194
|
-
cap.add("follow-readme-guides");
|
|
195
|
-
return [...cap].sort();
|
|
196
|
-
}
|
|
197
|
-
function buildEnumerateCapabilitiesTool() {
|
|
198
|
-
return {
|
|
199
|
-
name: "enumerate-capabilities",
|
|
200
|
-
description: "Enumerate developer-facing capabilities of the given repository, inferred from code, tests, and docs.",
|
|
201
|
-
parameters: enumerateCapabilitiesSchema,
|
|
202
|
-
execute: async (input) => {
|
|
203
|
-
let repoRoot = path_1.default.resolve(process.cwd(), input.repoPath);
|
|
204
|
-
if (!fs_1.default.existsSync(repoRoot)) {
|
|
205
|
-
const alt = path_1.default.resolve(process.cwd(), "..", input.repoPath);
|
|
206
|
-
if (fs_1.default.existsSync(alt))
|
|
207
|
-
repoRoot = alt;
|
|
208
|
-
}
|
|
209
|
-
if (!fs_1.default.existsSync(repoRoot)) {
|
|
210
|
-
const alt2 = path_1.default.resolve(process.cwd(), "..", path_1.default.basename(input.repoPath));
|
|
211
|
-
if (fs_1.default.existsSync(alt2))
|
|
212
|
-
repoRoot = alt2;
|
|
213
|
-
}
|
|
214
|
-
if (!fs_1.default.existsSync(repoRoot))
|
|
215
|
-
throw new Error(`Repository not found at ${repoRoot}`);
|
|
216
|
-
const analysis = analyzeRepo(repoRoot);
|
|
217
|
-
const capabilities = deriveCapabilities(analysis);
|
|
218
|
-
return {
|
|
219
|
-
content: [
|
|
220
|
-
{
|
|
221
|
-
type: "text",
|
|
222
|
-
text: JSON.stringify({
|
|
223
|
-
capabilities,
|
|
224
|
-
analysisSummary: {
|
|
225
|
-
files: analysis.files.length,
|
|
226
|
-
testFiles: analysis.testFiles.length,
|
|
227
|
-
readme: analysis.readme?.title,
|
|
228
|
-
},
|
|
229
|
-
}, null, 2),
|
|
230
|
-
},
|
|
231
|
-
],
|
|
232
|
-
};
|
|
233
|
-
},
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
function buildPlanFeatureTool() {
|
|
237
|
-
return {
|
|
238
|
-
name: "plan-feature-implementation",
|
|
239
|
-
description: "Given a feature request, select appropriate MCP tools (including existing and new ones) and produce an execution plan.",
|
|
240
|
-
parameters: planFeatureSchema,
|
|
241
|
-
execute: async (input) => {
|
|
242
|
-
const steps = [];
|
|
243
|
-
let i = 1;
|
|
244
|
-
steps.push({
|
|
245
|
-
step: i++,
|
|
246
|
-
action: "Analyze repository to enumerate APIs and decorators",
|
|
247
|
-
tool: "analyze-repository",
|
|
248
|
-
arguments: { repoPath: input.repoPath },
|
|
249
|
-
rationale: "Understand available building blocks.",
|
|
250
|
-
});
|
|
251
|
-
steps.push({
|
|
252
|
-
step: i++,
|
|
253
|
-
action: "List capabilities expected for developers",
|
|
254
|
-
tool: "enumerate-capabilities",
|
|
255
|
-
arguments: { repoPath: input.repoPath },
|
|
256
|
-
rationale: "Align the plan with supported capabilities.",
|
|
257
|
-
});
|
|
258
|
-
// Suggest existing generic tools from mcp-module
|
|
259
|
-
steps.push({
|
|
260
|
-
step: i++,
|
|
261
|
-
action: "Select documentation prompt and gather relevant source file(s)",
|
|
262
|
-
tool: "document-code",
|
|
263
|
-
arguments: { filePath: "<target-file>" },
|
|
264
|
-
rationale: "Provide context and instructions for changes.",
|
|
265
|
-
});
|
|
266
|
-
steps.push({
|
|
267
|
-
step: i++,
|
|
268
|
-
action: "Apply code changes using unified diff patch",
|
|
269
|
-
tool: "apply-code-change",
|
|
270
|
-
arguments: {
|
|
271
|
-
filePath: "<target-file>",
|
|
272
|
-
patch: "<unified-diff>",
|
|
273
|
-
dryRun: true,
|
|
274
|
-
},
|
|
275
|
-
rationale: "Validate changes safely before committing.",
|
|
276
|
-
});
|
|
277
|
-
steps.push({
|
|
278
|
-
step: i++,
|
|
279
|
-
action: "Commit code changes",
|
|
280
|
-
tool: "apply-code-change",
|
|
281
|
-
arguments: {
|
|
282
|
-
filePath: "<target-file>",
|
|
283
|
-
patch: "<unified-diff>",
|
|
284
|
-
dryRun: false,
|
|
285
|
-
},
|
|
286
|
-
rationale: "Persist the update.",
|
|
287
|
-
});
|
|
288
|
-
// If decoration-related terms present, suggest decorator tools
|
|
289
|
-
if (/decorat|flavour|override|extend|builder/i.test(input.feature)) {
|
|
290
|
-
steps.unshift({
|
|
291
|
-
step: 0,
|
|
292
|
-
action: "Use decorator tooling to insert/remove/modify decorators",
|
|
293
|
-
tool: "decorator-tools",
|
|
294
|
-
arguments: { action: "help" },
|
|
295
|
-
rationale: "Leverage specialized utilities for decoration patterns.",
|
|
296
|
-
});
|
|
297
|
-
steps.forEach((s, idx) => (s.step = idx + 1));
|
|
298
|
-
}
|
|
299
|
-
return {
|
|
300
|
-
content: [
|
|
301
|
-
{
|
|
302
|
-
type: "text",
|
|
303
|
-
text: JSON.stringify({
|
|
304
|
-
plan: steps,
|
|
305
|
-
notes: "Replace placeholder arguments like <target-file> and <unified-diff> based on the analysis output.",
|
|
306
|
-
}, null, 2),
|
|
307
|
-
},
|
|
308
|
-
],
|
|
309
|
-
};
|
|
310
|
-
},
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
function buildPrompts(repoPath) {
|
|
314
|
-
return [
|
|
315
|
-
{
|
|
316
|
-
name: "decoration-overview",
|
|
317
|
-
description: "High-level guidance on using the decoration library: key exports, decorators, and common workflows.",
|
|
318
|
-
load: async () => `You are assisting with the Decaf.ts decoration module located at ${repoPath}. Prefer using exported builders and decorators over ad-hoc patterns.\n\nProvide a concise, actionable overview of how to use the decoration APIs for extending and overriding behaviors.`,
|
|
319
|
-
},
|
|
320
|
-
];
|
|
321
|
-
}
|
|
322
|
-
function buildResourceTemplates(repoPath) {
|
|
323
|
-
const root = path_1.default.resolve(process.cwd(), repoPath);
|
|
324
|
-
return [
|
|
325
|
-
{
|
|
326
|
-
name: "decoration-src",
|
|
327
|
-
description: "Read a file from the decoration/src tree by relative path.",
|
|
328
|
-
mimeType: "text/plain",
|
|
329
|
-
uriTemplate: "decoration://src/{path}",
|
|
330
|
-
arguments: [
|
|
331
|
-
{
|
|
332
|
-
name: "path",
|
|
333
|
-
description: "Path under decoration/src to load, e.g. 'decoration/types.ts'",
|
|
334
|
-
required: true,
|
|
335
|
-
},
|
|
336
|
-
],
|
|
337
|
-
load: async ({ path: rel }) => {
|
|
338
|
-
const abs = path_1.default.join(root, "src", rel);
|
|
339
|
-
const text = readFileSafe(abs) ?? "";
|
|
340
|
-
return { text };
|
|
341
|
-
},
|
|
342
|
-
},
|
|
343
|
-
];
|
|
344
|
-
}
|
|
345
|
-
function enrich(mcp) {
|
|
346
|
-
// Register tools
|
|
347
|
-
mcp.addTool(buildAnalyzeRepositoryTool());
|
|
348
|
-
mcp.addTool(buildEnumerateCapabilitiesTool());
|
|
349
|
-
mcp.addTool(buildPlanFeatureTool());
|
|
350
|
-
// Prompts/resources
|
|
351
|
-
const repoPath = "./decoration";
|
|
352
|
-
for (const p of buildPrompts(repoPath))
|
|
353
|
-
mcp.addPrompt(p);
|
|
354
|
-
for (const r of buildResourceTemplates(repoPath))
|
|
355
|
-
mcp.addResourceTemplate(r);
|
|
356
|
-
return mcp;
|
|
357
|
-
}
|
|
358
|
-
exports.VERSION = metadata_1.VERSION;
|
|
359
|
-
exports.PACKAGE_NAME = `${metadata_1.PACKAGE_NAME}/decoration-assist`;
|
|
360
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi1hc3Npc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvZGVjb3JhdGlvbi1hc3Npc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBd2FBLHlCQVdDO0FBbmJELDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsNkJBQXdCO0FBRXhCLG1EQUFtRTtBQUVuRSwwQkFBMEI7QUFDMUIsU0FBUyxZQUFZLENBQ25CLFFBQWdCLEVBQ2hCLFdBQTJCLE1BQU07SUFFakMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxZQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsSUFBWSxFQUNaLE9BQWdDO0lBRWhDLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztJQUN6QixNQUFNLEtBQUssR0FBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUcsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxZQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxZQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQzthQUFNLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFF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QixHQUFHLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFTLENBQUMsQ0FBQztJQUNqRCxHQUFHLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFTLENBQUMsQ0FBQztJQUNyRCxHQUFHLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFTLENBQUMsQ0FBQztJQUMzQyxvQkFBb0I7SUFDcEIsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDO0lBQ2hDLEtBQUssTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBUSxDQUFDLENBQUM7SUFDaEUsS0FBSyxNQUFNLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLENBQUM7UUFDOUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQVEsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVZLFFBQUEsT0FBTyxHQUFHLGtCQUFDLENBQUM7QUFDWixRQUFBLFlBQVksR0FBRyxHQUFHLHVCQUFHLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RNQ1AsIFRvb2wsIElucHV0UHJvbXB0IH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IFZFUlNJT04gYXMgViwgUEFDS0FHRV9OQU1FIGFzIFBLRyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YVwiO1xuXG4vLyBVdGlsaXR5OiBzYWZlIHJlYWQgZmlsZVxuZnVuY3Rpb24gcmVhZEZpbGVTYWZlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcgPSBcInV0ZjhcIlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCB7IGVuY29kaW5nIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RGaWxlc1JlY3Vyc2l2ZShcbiAgcm9vdDogc3RyaW5nLFxuICBtYXRjaGVyPzogKHA6IHN0cmluZykgPT4gYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0YWNrOiBzdHJpbmdbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IHN0YWNrLnBvcCgpITtcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoY3VyKTtcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZnMucmVhZGRpclN5bmMoY3VyKSkgc3RhY2sucHVzaChwYXRoLmpvaW4oY3VyLCBmKSk7XG4gICAgfSBlbHNlIGlmICghbWF0Y2hlciB8fCBtYXRjaGVyKGN1cikpIHtcbiAgICAgIG91dC5wdXNoKGN1cik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQuc29ydCgpO1xufVxuXG4vLyBab2QgU2NoZW1hcyAod2l0aCBleHBsaWNpdCBkZXNjcmlwdGlvbnMpXG5jb25zdCBhbmFseXplUmVwb1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcmVwb1BhdGg6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IGluc2lkZSB0aGlzIG1vbm9yZXBvLCBlLmcuICcuL2RlY29yYXRpb24nLlwiLFxuICAgICAgfSlcbiAgICAgIC5taW4oMSwgXCJyZXBvUGF0aCBpcyByZXF1aXJlZFwiKSxcbiAgICBpbmNsdWRlVGVzdHM6IHpcbiAgICAgIC5ib29sZWFuKHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJJZiB0cnVlLCBhbmFseXplIHRoZSB0ZXN0cyBkaXJlY3RvcnkgKGlmIHByZXNlbnQpIHRvIGRlcml2ZSBleHBlY3RlZCBiZWhhdmlvcnMuXCIsXG4gICAgICB9KVxuICAgICAgLmRlZmF1bHQodHJ1ZSksXG4gICAgaW5jbHVkZURvY3M6IHpcbiAgICAgIC5ib29sZWFuKHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJJZiB0cnVlLCBhbmFseXplIFJFQURNRS5tZCBhbmQgZG9jcyBkaXJlY3RvcmllcyB0byBleHRyYWN0IGRvY3VtZW50ZWQgZmVhdHVyZXMuXCIsXG4gICAgICB9KVxuICAgICAgLmRlZmF1bHQodHJ1ZSksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXG4gICAgXCJBbmFseXplIGEgbG9jYWwgcmVwb3NpdG9yeSAoZS5nLiAuL2RlY29yYXRpb24pIHRvIGV4dHJhY3QgQVBJcywgZmVhdHVyZXMsIHRlc3RzLCBhbmQgZG9jdW1lbnRhdGlvbiBjdWVzLlwiXG4gICk7XG5cbmNvbnN0IGVudW1lcmF0ZUNhcGFiaWxpdGllc1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcmVwb1BhdGg6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IHRvIGVudW1lcmF0ZSBkZXZlbG9wZXItZmFjaW5nIGNhcGFiaWxpdGllcy5cIixcbiAgICAgIH0pXG4gICAgICAubWluKDEsIFwicmVwb1BhdGggaXMgcmVxdWlyZWRcIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXG4gICAgXCJFbnVtZXJhdGUgdGhlIGNvbXBsZXRlIHNldCBvZiBjYXBhYmlsaXRpZXMgYSBkZXZlbG9wZXIgaXMgZXhwZWN0ZWQgdG8gdXNlIGZyb20gdGhlIGdpdmVuIHJlcG9zaXRvcnkuXCJcbiAgKTtcblxuY29uc3QgcGxhbkZlYXR1cmVTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGZlYXR1cmU6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIk5hdHVyYWwtbGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgYSBkZXZlbG9wZXIncyByZXF1ZXN0ZWQgZmVhdHVyZSBvciB0YXNrIHRvIGltcGxlbWVudCB1c2luZyB0aGUgcmVwb3NpdG9yeSBhbmQgYXZhaWxhYmxlIE1DUCB0b29scy5cIixcbiAgICAgIH0pXG4gICAgICAubWluKDUsIFwiZmVhdHVyZSBtdXN0IGRlc2NyaWJlIHRoZSBnb2FsIGNsZWFybHlcIiksXG4gICAgcmVwb1BhdGg6IHpcbiAgICAgIC5zdHJpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIlRhcmdldCByZXBvc2l0b3J5IHBhdGggcHJvdmlkaW5nIHRoZSBsaWJyYXJ5IHRvIHVzZSwgZS5nLiAnLi9kZWNvcmF0aW9uJy5cIixcbiAgICAgIH0pXG4gICAgICAuZGVmYXVsdChcIi4vZGVjb3JhdGlvblwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcbiAgICBcIlBsYW4gd2hpY2ggTUNQIHRvb2xzIHRvIHVzZSBhbmQgaW4gd2hhdCBzZXF1ZW5jZSB0byBpbXBsZW1lbnQgYSByZXF1ZXN0ZWQgZmVhdHVyZSB1c2luZyB0aGUgcmVwb3NpdG9yeS5cIlxuICApO1xuXG4vLyBUeXBlc1xuZXhwb3J0IHR5cGUgQW5hbHl6ZVJlcG9BcmdzID0gei5pbmZlcjx0eXBlb2YgYW5hbHl6ZVJlcG9TY2hlbWE+O1xuZXhwb3J0IHR5cGUgRW51bWVyYXRlQ2FwYWJpbGl0aWVzQXJncyA9IHouaW5mZXI8XG4gIHR5cGVvZiBlbnVtZXJhdGVDYXBhYmlsaXRpZXNTY2hlbWFcbj47XG5leHBvcnQgdHlwZSBQbGFuRmVhdHVyZUFyZ3MgPSB6LmluZmVyPHR5cGVvZiBwbGFuRmVhdHVyZVNjaGVtYT47XG5cbi8vIEFuYWx5c2lzIGhlbHBlcnMgKG1pbmltYWwgeWV0IGVmZmVjdGl2ZSwgdGV4dC1iYXNlZCB0byBhdm9pZCBoZWF2eSBBU1QgZGVwcylcbmZ1bmN0aW9uIGlzU291cmNlRmlsZShwOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9cXC4odHN8dHN4fGpzfGpzeCkkLy50ZXN0KHApICYmICFwLmVuZHNXaXRoKFwiLmQudHNcIik7XG59XG5mdW5jdGlvbiBpc1Rlc3RGaWxlKHA6IHN0cmluZykge1xuICByZXR1cm4gLyhcXC50ZXN0XFwufFxcLnNwZWNcXC4pLy50ZXN0KHApO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RXhwb3J0cyhmaWxlQ29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBleHBvcnRSZSA9XG4gICAgLyhleHBvcnRcXHMrKD86ZGVmYXVsdFxccyspPyg/OmNsYXNzfGZ1bmN0aW9ufGNvbnN0fGxldHx2YXJ8aW50ZXJmYWNlfHR5cGV8ZW51bSlcXHMrKShbQS1aYS16MC05X10rKS9nO1xuICBjb25zdCBuYW1lZFJlID0gL2V4cG9ydFxccypcXHsoW159XSspXFx9L2c7XG4gIGxldCBtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICB3aGlsZSAoKG0gPSBleHBvcnRSZS5leGVjKGZpbGVDb250ZW50KSkpIG5hbWVzLmFkZChtWzJdKTtcbiAgd2hpbGUgKChtID0gbmFtZWRSZS5leGVjKGZpbGVDb250ZW50KSkpIHtcbiAgICBtWzFdXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChzKSA9PiBzLnRyaW0oKS5zcGxpdChcIiBhcyBcIilbMF0udHJpbSgpKVxuICAgICAgLmZvckVhY2goKG4pID0+IHtcbiAgICAgICAgaWYgKG4pIG5hbWVzLmFkZChuKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4ubmFtZXNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY29yYXRvcnMoZmlsZUNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVjcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZWNSZSA9IC9AKFtBLVphLXpfXVtBLVphLXowLTlfXSopL2c7XG4gIGxldCBtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICB3aGlsZSAoKG0gPSBkZWNSZS5leGVjKGZpbGVDb250ZW50KSkpIGRlY3MuYWRkKG1bMV0pO1xuICByZXR1cm4gWy4uLmRlY3NdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gc3VtbWFyaXplUmVhZG1lKHJlYWRtZT86IHN0cmluZykge1xuICBpZiAoIXJlYWRtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbGluZXMgPSByZWFkbWUuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHRpdGxlID1cbiAgICBsaW5lcy5maW5kKChsKSA9PiAvXiNcXHMrLy50ZXN0KGwpKT8ucmVwbGFjZSgvXiNcXHMrLywgXCJcIikgfHwgXCJSRUFETUVcIjtcbiAgY29uc3QgYnVsbGV0cyA9IGxpbmVzLmZpbHRlcigobCkgPT4gL15bLSpdXFxzKy8udGVzdChsKSkuc2xpY2UoMCwgMjApO1xuICByZXR1cm4geyB0aXRsZSwgYnVsbGV0cyB9O1xufVxuXG5mdW5jdGlvbiBhbmFseXplUmVwbyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKHJvb3QsIFwic3JjXCIpO1xuICBjb25zdCB0ZXN0RGlyID0gcGF0aC5qb2luKHJvb3QsIFwidGVzdHNcIik7XG4gIGNvbnN0IHJlYWRtZVBhdGggPSBwYXRoLmpvaW4ocm9vdCwgXCJSRUFETUUubWRcIik7XG4gIGNvbnN0IHJlYWRtZSA9IHJlYWRGaWxlU2FmZShyZWFkbWVQYXRoKTtcblxuICBjb25zdCBmaWxlcyA9IGZzLmV4aXN0c1N5bmMoc3JjKSA/IGxpc3RGaWxlc1JlY3Vyc2l2ZShzcmMsIGlzU291cmNlRmlsZSkgOiBbXTtcbiAgY29uc3QgdGVzdEZpbGVzID0gZnMuZXhpc3RzU3luYyh0ZXN0RGlyKVxuICAgID8gbGlzdEZpbGVzUmVjdXJzaXZlKHRlc3REaXIsIChmKSA9PiBpc1NvdXJjZUZpbGUoZikgJiYgaXNUZXN0RmlsZShmKSlcbiAgICA6IFtdO1xuXG4gIGNvbnN0IGFwaTogUmVjb3JkPHN0cmluZywgeyBleHBvcnRzOiBzdHJpbmdbXTsgZGVjb3JhdG9yczogc3RyaW5nW10gfT4gPSB7fTtcbiAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU2FmZShmKSB8fCBcIlwiO1xuICAgIGFwaVtwYXRoLnJlbGF0aXZlKHJvb3QsIGYpXSA9IHtcbiAgICAgIGV4cG9ydHM6IGV4dHJhY3RFeHBvcnRzKGNvbnRlbnQpLFxuICAgICAgZGVjb3JhdG9yczogZXh0cmFjdERlY29yYXRvcnMoY29udGVudCksXG4gICAgfTtcbiAgfVxuICBjb25zdCB0ZXN0czogUmVjb3JkPHN0cmluZywgeyBtZW50aW9uczogc3RyaW5nW10gfT4gPSB7fTtcbiAgZm9yIChjb25zdCBmIG9mIHRlc3RGaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVNhZmUoZikgfHwgXCJcIjtcbiAgICBjb25zdCBtZW50aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5leHRyYWN0RXhwb3J0cyhjb250ZW50KSwgLi4uZXh0cmFjdERlY29yYXRvcnMoY29udGVudCldKVxuICAgICkuc29ydCgpO1xuICAgIHRlc3RzW3BhdGgucmVsYXRpdmUocm9vdCwgZildID0geyBtZW50aW9ucyB9O1xuICB9XG4gIHJldHVybiB7IGZpbGVzLCB0ZXN0RmlsZXMsIGFwaSwgdGVzdHMsIHJlYWRtZTogc3VtbWFyaXplUmVhZG1lKHJlYWRtZSkgfTtcbn1cblxuLy8gVG9vbHNcbmZ1bmN0aW9uIGJ1aWxkQW5hbHl6ZVJlcG9zaXRvcnlUb29sKCk6IFRvb2w8XG4gIHVuZGVmaW5lZCxcbiAgdHlwZW9mIGFuYWx5emVSZXBvU2NoZW1hXG4+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImFuYWx5emUtcmVwb3NpdG9yeVwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJBbmFseXplIGEgbG9jYWwgcmVwb3NpdG9yeSdzIHNvdXJjZSwgdGVzdHMsIGFuZCBkb2NzIHRvIGV4dHJhY3QgZXhwb3J0ZWQgQVBJcywgZGVjb3JhdG9ycywgYW5kIHRlc3QgbWVudGlvbnMuXCIsXG4gICAgcGFyYW1ldGVyczogYW5hbHl6ZVJlcG9TY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICBsZXQgcmVwb1Jvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgaW5wdXQucmVwb1BhdGgpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICAvLyB0cnkgcmVzb2x2aW5nIGZyb20gbW9ub3JlcG8gcm9vdCAocGFyZW50IG9mIGN1cnJlbnQgY3dkKVxuICAgICAgICBjb25zdCBhbHQgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCIuLlwiLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdCkpIHJlcG9Sb290ID0gYWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICAvLyBpZiBpbnB1dCB3YXMgYWJzb2x1dGUgYW5kIHN0aWxsIG5vdCBmb3VuZCwgdHJ5IC4uLzxiYXNlbmFtZT5cbiAgICAgICAgY29uc3QgYWx0MiA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIFwiLi5cIixcbiAgICAgICAgICBwYXRoLmJhc2VuYW1lKGlucHV0LnJlcG9QYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhhbHQyKSkgcmVwb1Jvb3QgPSBhbHQyO1xuICAgICAgfVxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXBvc2l0b3J5IG5vdCBmb3VuZCBhdCAke3JlcG9Sb290fWApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYW5hbHl6ZVJlcG8ocmVwb1Jvb3QpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgfV0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlcml2ZUNhcGFiaWxpdGllcyhcbiAgYW5hbHlzaXM6IFJldHVyblR5cGU8dHlwZW9mIGFuYWx5emVSZXBvPlxuKTogc3RyaW5nW10ge1xuICBjb25zdCBjYXAgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gaGV1cmlzdGljczogaWYgZGVjb3JhdG9ycyBsaWtlIERlY29yYXRpb24sIGZsYXZvdXJlZEFzLCBleHRlbmQsIG92ZXJyaWRlIGFwcGVhciwgYWRkIGNhcGFiaWxpdGllc1xuICBjb25zdCBhbGxEZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhbmFseXNpcy5hcGkpKSB7XG4gICAgZm9yIChjb25zdCBkIG9mIGFuYWx5c2lzLmFwaVtrXS5kZWNvcmF0b3JzKSBhbGxEZWNzLmFkZChkKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgYW5hbHlzaXMuYXBpW2tdLmV4cG9ydHMpXG4gICAgICBpZiAoL0RlY29yYXRpb258ZGVjb3JhdGV8QnVpbGRlcnxGbGF2b3VyL2kudGVzdChlKSlcbiAgICAgICAgY2FwLmFkZChcInVzZS1kZWNvcmF0aW9uLWFwaVwiKTtcbiAgfVxuICBpZiAoWy4uLmFsbERlY3NdLnNvbWUoKGQpID0+IC9vdmVycmlkZXxleHRlbmQvaS50ZXN0KGQpKSlcbiAgICBjYXAuYWRkKFwib3ZlcnJpZGUtYW5kLWV4dGVuZC1kZWNvcmF0aW9uc1wiKTtcbiAgaWYgKE9iamVjdC5rZXlzKGFuYWx5c2lzLnRlc3RzKS5sZW5ndGggPiAwKSBjYXAuYWRkKFwidmFsaWRhdGUtd2l0aC10ZXN0c1wiKTtcbiAgaWYgKGFuYWx5c2lzLnJlYWRtZSkgY2FwLmFkZChcImZvbGxvdy1yZWFkbWUtZ3VpZGVzXCIpO1xuICByZXR1cm4gWy4uLmNhcF0uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBidWlsZEVudW1lcmF0ZUNhcGFiaWxpdGllc1Rvb2woKTogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgZW51bWVyYXRlQ2FwYWJpbGl0aWVzU2NoZW1hXG4+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcImVudW1lcmF0ZS1jYXBhYmlsaXRpZXNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRW51bWVyYXRlIGRldmVsb3Blci1mYWNpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSBnaXZlbiByZXBvc2l0b3J5LCBpbmZlcnJlZCBmcm9tIGNvZGUsIHRlc3RzLCBhbmQgZG9jcy5cIixcbiAgICBwYXJhbWV0ZXJzOiBlbnVtZXJhdGVDYXBhYmlsaXRpZXNTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICBsZXQgcmVwb1Jvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgaW5wdXQucmVwb1BhdGgpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICBjb25zdCBhbHQgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCIuLlwiLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdCkpIHJlcG9Sb290ID0gYWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgICBjb25zdCBhbHQyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCIuLlwiLFxuICAgICAgICAgIHBhdGguYmFzZW5hbWUoaW5wdXQucmVwb1BhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdDIpKSByZXBvUm9vdCA9IGFsdDI7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcG9zaXRvcnkgbm90IGZvdW5kIGF0ICR7cmVwb1Jvb3R9YCk7XG4gICAgICBjb25zdCBhbmFseXNpcyA9IGFuYWx5emVSZXBvKHJlcG9Sb290KTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGRlcml2ZUNhcGFiaWxpdGllcyhhbmFseXNpcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICBhbmFseXNpc1N1bW1hcnk6IHtcbiAgICAgICAgICAgICAgICAgIGZpbGVzOiBhbmFseXNpcy5maWxlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICB0ZXN0RmlsZXM6IGFuYWx5c2lzLnRlc3RGaWxlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICByZWFkbWU6IGFuYWx5c2lzLnJlYWRtZT8udGl0bGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBsYW5GZWF0dXJlVG9vbCgpOiBUb29sPHVuZGVmaW5lZCwgdHlwZW9mIHBsYW5GZWF0dXJlU2NoZW1hPiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJwbGFuLWZlYXR1cmUtaW1wbGVtZW50YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiR2l2ZW4gYSBmZWF0dXJlIHJlcXVlc3QsIHNlbGVjdCBhcHByb3ByaWF0ZSBNQ1AgdG9vbHMgKGluY2x1ZGluZyBleGlzdGluZyBhbmQgbmV3IG9uZXMpIGFuZCBwcm9kdWNlIGFuIGV4ZWN1dGlvbiBwbGFuLlwiLFxuICAgIHBhcmFtZXRlcnM6IHBsYW5GZWF0dXJlU2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcHM6IEFycmF5PHtcbiAgICAgICAgc3RlcDogbnVtYmVyO1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdG9vbD86IHN0cmluZztcbiAgICAgICAgYXJndW1lbnRzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgcmF0aW9uYWxlOiBzdHJpbmc7XG4gICAgICB9PiA9IFtdO1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIHN0ZXA6IGkrKyxcbiAgICAgICAgYWN0aW9uOiBcIkFuYWx5emUgcmVwb3NpdG9yeSB0byBlbnVtZXJhdGUgQVBJcyBhbmQgZGVjb3JhdG9yc1wiLFxuICAgICAgICB0b29sOiBcImFuYWx5emUtcmVwb3NpdG9yeVwiLFxuICAgICAgICBhcmd1bWVudHM6IHsgcmVwb1BhdGg6IGlucHV0LnJlcG9QYXRoIH0sXG4gICAgICAgIHJhdGlvbmFsZTogXCJVbmRlcnN0YW5kIGF2YWlsYWJsZSBidWlsZGluZyBibG9ja3MuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJMaXN0IGNhcGFiaWxpdGllcyBleHBlY3RlZCBmb3IgZGV2ZWxvcGVyc1wiLFxuICAgICAgICB0b29sOiBcImVudW1lcmF0ZS1jYXBhYmlsaXRpZXNcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IHJlcG9QYXRoOiBpbnB1dC5yZXBvUGF0aCB9LFxuICAgICAgICByYXRpb25hbGU6IFwiQWxpZ24gdGhlIHBsYW4gd2l0aCBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzLlwiLFxuICAgICAgfSk7XG4gICAgICAvLyBTdWdnZXN0IGV4aXN0aW5nIGdlbmVyaWMgdG9vbHMgZnJvbSBtY3AtbW9kdWxlXG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgc3RlcDogaSsrLFxuICAgICAgICBhY3Rpb246XG4gICAgICAgICAgXCJTZWxlY3QgZG9jdW1lbnRhdGlvbiBwcm9tcHQgYW5kIGdhdGhlciByZWxldmFudCBzb3VyY2UgZmlsZShzKVwiLFxuICAgICAgICB0b29sOiBcImRvY3VtZW50LWNvZGVcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IGZpbGVQYXRoOiBcIjx0YXJnZXQtZmlsZT5cIiB9LFxuICAgICAgICByYXRpb25hbGU6IFwiUHJvdmlkZSBjb250ZXh0IGFuZCBpbnN0cnVjdGlvbnMgZm9yIGNoYW5nZXMuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJBcHBseSBjb2RlIGNoYW5nZXMgdXNpbmcgdW5pZmllZCBkaWZmIHBhdGNoXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICByYXRpb25hbGU6IFwiVmFsaWRhdGUgY2hhbmdlcyBzYWZlbHkgYmVmb3JlIGNvbW1pdHRpbmcuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJDb21taXQgY29kZSBjaGFuZ2VzXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmF0aW9uYWxlOiBcIlBlcnNpc3QgdGhlIHVwZGF0ZS5cIixcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgZGVjb3JhdGlvbi1yZWxhdGVkIHRlcm1zIHByZXNlbnQsIHN1Z2dlc3QgZGVjb3JhdG9yIHRvb2xzXG4gICAgICBpZiAoL2RlY29yYXR8Zmxhdm91cnxvdmVycmlkZXxleHRlbmR8YnVpbGRlci9pLnRlc3QoaW5wdXQuZmVhdHVyZSkpIHtcbiAgICAgICAgc3RlcHMudW5zaGlmdCh7XG4gICAgICAgICAgc3RlcDogMCxcbiAgICAgICAgICBhY3Rpb246IFwiVXNlIGRlY29yYXRvciB0b29saW5nIHRvIGluc2VydC9yZW1vdmUvbW9kaWZ5IGRlY29yYXRvcnNcIixcbiAgICAgICAgICB0b29sOiBcImRlY29yYXRvci10b29sc1wiLFxuICAgICAgICAgIGFyZ3VtZW50czogeyBhY3Rpb246IFwiaGVscFwiIH0sXG4gICAgICAgICAgcmF0aW9uYWxlOiBcIkxldmVyYWdlIHNwZWNpYWxpemVkIHV0aWxpdGllcyBmb3IgZGVjb3JhdGlvbiBwYXR0ZXJucy5cIixcbiAgICAgICAgfSk7XG4gICAgICAgIHN0ZXBzLmZvckVhY2goKHMsIGlkeCkgPT4gKHMuc3RlcCA9IGlkeCArIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGxhbjogc3RlcHMsXG4gICAgICAgICAgICAgICAgbm90ZXM6XG4gICAgICAgICAgICAgICAgICBcIlJlcGxhY2UgcGxhY2Vob2xkZXIgYXJndW1lbnRzIGxpa2UgPHRhcmdldC1maWxlPiBhbmQgPHVuaWZpZWQtZGlmZj4gYmFzZWQgb24gdGhlIGFuYWx5c2lzIG91dHB1dC5cIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFByb21wdHMocmVwb1BhdGg6IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogXCJkZWNvcmF0aW9uLW92ZXJ2aWV3XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIaWdoLWxldmVsIGd1aWRhbmNlIG9uIHVzaW5nIHRoZSBkZWNvcmF0aW9uIGxpYnJhcnk6IGtleSBleHBvcnRzLCBkZWNvcmF0b3JzLCBhbmQgY29tbW9uIHdvcmtmbG93cy5cIixcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgICAgIGBZb3UgYXJlIGFzc2lzdGluZyB3aXRoIHRoZSBEZWNhZi50cyBkZWNvcmF0aW9uIG1vZHVsZSBsb2NhdGVkIGF0ICR7cmVwb1BhdGh9LiBQcmVmZXIgdXNpbmcgZXhwb3J0ZWQgYnVpbGRlcnMgYW5kIGRlY29yYXRvcnMgb3ZlciBhZC1ob2MgcGF0dGVybnMuXFxuXFxuUHJvdmlkZSBhIGNvbmNpc2UsIGFjdGlvbmFibGUgb3ZlcnZpZXcgb2YgaG93IHRvIHVzZSB0aGUgZGVjb3JhdGlvbiBBUElzIGZvciBleHRlbmRpbmcgYW5kIG92ZXJyaWRpbmcgYmVoYXZpb3JzLmAsXG4gICAgfSxcbiAgXTtcbn1cblxudHlwZSBEZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB1cmlUZW1wbGF0ZTogc3RyaW5nO1xuICBtaW1lVHlwZTogc3RyaW5nO1xuICBhcmd1bWVudHM6IFJlYWRvbmx5QXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJlcXVpcmVkOiBib29sZWFuO1xuICB9PjtcbiAgbG9hZDogKGFyZ3M6IHsgcGF0aDogc3RyaW5nIH0pID0+IFByb21pc2U8eyB0ZXh0OiBzdHJpbmcgfT47XG59O1xuZnVuY3Rpb24gYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyhcbiAgcmVwb1BhdGg6IHN0cmluZ1xuKTogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSB7XG4gIGNvbnN0IHJvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVwb1BhdGgpO1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiZGVjb3JhdGlvbi1zcmNcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlYWQgYSBmaWxlIGZyb20gdGhlIGRlY29yYXRpb24vc3JjIHRyZWUgYnkgcmVsYXRpdmUgcGF0aC5cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImRlY29yYXRpb246Ly9zcmMve3BhdGh9XCIsXG4gICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicGF0aFwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCJQYXRoIHVuZGVyIGRlY29yYXRpb24vc3JjIHRvIGxvYWQsIGUuZy4gJ2RlY29yYXRpb24vdHlwZXMudHMnXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbG9hZDogYXN5bmMgKHsgcGF0aDogcmVsIH06IHsgcGF0aDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgY29uc3QgYWJzID0gcGF0aC5qb2luKHJvb3QsIFwic3JjXCIsIHJlbCk7XG4gICAgICAgIGNvbnN0IHRleHQgPSByZWFkRmlsZVNhZmUoYWJzKSA/PyBcIlwiO1xuICAgICAgICByZXR1cm4geyB0ZXh0IH07XG4gICAgICB9LFxuICAgIH0sXG4gIF07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVucmljaChtY3A6IEZhc3RNQ1ApIHtcbiAgLy8gUmVnaXN0ZXIgdG9vbHNcbiAgbWNwLmFkZFRvb2woYnVpbGRBbmFseXplUmVwb3NpdG9yeVRvb2woKSBhcyBhbnkpO1xuICBtY3AuYWRkVG9vbChidWlsZEVudW1lcmF0ZUNhcGFiaWxpdGllc1Rvb2woKSBhcyBhbnkpO1xuICBtY3AuYWRkVG9vbChidWlsZFBsYW5GZWF0dXJlVG9vbCgpIGFzIGFueSk7XG4gIC8vIFByb21wdHMvcmVzb3VyY2VzXG4gIGNvbnN0IHJlcG9QYXRoID0gXCIuL2RlY29yYXRpb25cIjtcbiAgZm9yIChjb25zdCBwIG9mIGJ1aWxkUHJvbXB0cyhyZXBvUGF0aCkpIG1jcC5hZGRQcm9tcHQocCBhcyBhbnkpO1xuICBmb3IgKGNvbnN0IHIgb2YgYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyhyZXBvUGF0aCkpXG4gICAgbWNwLmFkZFJlc291cmNlVGVtcGxhdGUociBhcyBhbnkpO1xuICByZXR1cm4gbWNwO1xufVxuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFY7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gYCR7UEtHfS9kZWNvcmF0aW9uLWFzc2lzdGA7XG4iXX0=
|
|
6
|
+
exports.enrich = void 0;
|
|
7
|
+
exports.default = decorationAssist;
|
|
8
|
+
const mcp_module_1 = __importDefault(require("./../../mcp/mcp-module.cjs"));
|
|
9
|
+
exports.enrich = mcp_module_1.default;
|
|
10
|
+
function decorationAssist(server) {
|
|
11
|
+
return (0, mcp_module_1.default)(server);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi1hc3Npc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvZGVjb3JhdGlvbi1hc3Npc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsbUNBRUM7QUFKRCw0RUFBMEM7QUFNakMsaUJBTkYsb0JBQU0sQ0FNRTtBQUpmLFNBQXdCLGdCQUFnQixDQUFDLE1BQWU7SUFDdEQsT0FBTyxJQUFBLG9CQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdE1DUCB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQgZW5yaWNoIGZyb20gXCIuLi8uLi9tY3AvbWNwLW1vZHVsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWNvcmF0aW9uQXNzaXN0KHNlcnZlcjogRmFzdE1DUCk6IEZhc3RNQ1Age1xuICByZXR1cm4gZW5yaWNoKHNlcnZlcik7XG59XG5cbmV4cG9ydCB7IGVucmljaCB9O1xuIl19
|
|
@@ -1,39 +1,4 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
1
|
import type { FastMCP } from "fastmcp";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
includeDocs: z.ZodDefault<z.ZodBoolean>;
|
|
7
|
-
}, "strict", z.ZodTypeAny, {
|
|
8
|
-
repoPath: string;
|
|
9
|
-
includeTests: boolean;
|
|
10
|
-
includeDocs: boolean;
|
|
11
|
-
}, {
|
|
12
|
-
repoPath: string;
|
|
13
|
-
includeTests?: boolean | undefined;
|
|
14
|
-
includeDocs?: boolean | undefined;
|
|
15
|
-
}>;
|
|
16
|
-
declare const enumerateCapabilitiesSchema: z.ZodObject<{
|
|
17
|
-
repoPath: z.ZodString;
|
|
18
|
-
}, "strict", z.ZodTypeAny, {
|
|
19
|
-
repoPath: string;
|
|
20
|
-
}, {
|
|
21
|
-
repoPath: string;
|
|
22
|
-
}>;
|
|
23
|
-
declare const planFeatureSchema: z.ZodObject<{
|
|
24
|
-
feature: z.ZodString;
|
|
25
|
-
repoPath: z.ZodDefault<z.ZodString>;
|
|
26
|
-
}, "strict", z.ZodTypeAny, {
|
|
27
|
-
repoPath: string;
|
|
28
|
-
feature: string;
|
|
29
|
-
}, {
|
|
30
|
-
feature: string;
|
|
31
|
-
repoPath?: string | undefined;
|
|
32
|
-
}>;
|
|
33
|
-
export type AnalyzeRepoArgs = z.infer<typeof analyzeRepoSchema>;
|
|
34
|
-
export type EnumerateCapabilitiesArgs = z.infer<typeof enumerateCapabilitiesSchema>;
|
|
35
|
-
export type PlanFeatureArgs = z.infer<typeof planFeatureSchema>;
|
|
36
|
-
export default function enrich(mcp: FastMCP): FastMCP<Record<string, unknown> | undefined>;
|
|
37
|
-
export declare const VERSION = "0.0.3";
|
|
38
|
-
export declare const PACKAGE_NAME = "##PACKAGE_NAME##/decoration-assist";
|
|
39
|
-
export {};
|
|
2
|
+
import enrich from "../../mcp/mcp-module";
|
|
3
|
+
export default function decorationAssist(server: FastMCP): FastMCP;
|
|
4
|
+
export { enrich };
|
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
3
|
+
exports.modulePackage = exports.tools = exports.templates = exports.resources = exports.prompts = void 0;
|
|
4
|
+
const prompts_1 = require("./prompts/index.cjs");
|
|
5
|
+
const resources_1 = require("./resources/index.cjs");
|
|
6
|
+
const templates_1 = require("./templates/index.cjs");
|
|
7
|
+
const tools_1 = require("./tools/index.cjs");
|
|
8
|
+
var prompts_2 = require("./prompts/index.cjs");
|
|
9
|
+
Object.defineProperty(exports, "prompts", { enumerable: true, get: function () { return prompts_2.prompts; } });
|
|
10
|
+
var resources_2 = require("./resources/index.cjs");
|
|
11
|
+
Object.defineProperty(exports, "resources", { enumerable: true, get: function () { return resources_2.resources; } });
|
|
12
|
+
var templates_2 = require("./templates/index.cjs");
|
|
13
|
+
Object.defineProperty(exports, "templates", { enumerable: true, get: function () { return templates_2.templates; } });
|
|
14
|
+
var tools_2 = require("./tools/index.cjs");
|
|
15
|
+
Object.defineProperty(exports, "tools", { enumerable: true, get: function () { return tools_2.tools; } });
|
|
16
|
+
exports.modulePackage = {
|
|
17
|
+
name: "mcp",
|
|
18
|
+
prompts: prompts_1.prompts,
|
|
19
|
+
resources: resources_1.resources,
|
|
20
|
+
templates: templates_1.templates,
|
|
21
|
+
tools: tools_1.tools,
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQW9DO0FBQ3BDLHFEQUF3QztBQUN4QyxxREFBd0M7QUFDeEMsNkNBQWdDO0FBRWhDLCtDQUFvQztBQUEzQixrR0FBQSxPQUFPLE9BQUE7QUFDaEIsbURBQXdDO0FBQS9CLHNHQUFBLFNBQVMsT0FBQTtBQUNsQixtREFBd0M7QUFBL0Isc0dBQUEsU0FBUyxPQUFBO0FBQ2xCLDJDQUFnQztBQUF2Qiw4RkFBQSxLQUFLLE9BQUE7QUFFRCxRQUFBLGFBQWEsR0FBd0I7SUFDaEQsSUFBSSxFQUFFLEtBQUs7SUFDWCxPQUFPLEVBQVAsaUJBQU87SUFDUCxTQUFTLEVBQVQscUJBQVM7SUFDVCxTQUFTLEVBQVQscUJBQVM7SUFDVCxLQUFLLEVBQUwsYUFBSztDQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1vZHVsZUV4cG9ydFBhY2thZ2UgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IHByb21wdHMgfSBmcm9tIFwiLi9wcm9tcHRzXCI7XG5pbXBvcnQgeyByZXNvdXJjZXMgfSBmcm9tIFwiLi9yZXNvdXJjZXNcIjtcbmltcG9ydCB7IHRlbXBsYXRlcyB9IGZyb20gXCIuL3RlbXBsYXRlc1wiO1xuaW1wb3J0IHsgdG9vbHMgfSBmcm9tIFwiLi90b29sc1wiO1xuXG5leHBvcnQgeyBwcm9tcHRzIH0gZnJvbSBcIi4vcHJvbXB0c1wiO1xuZXhwb3J0IHsgcmVzb3VyY2VzIH0gZnJvbSBcIi4vcmVzb3VyY2VzXCI7XG5leHBvcnQgeyB0ZW1wbGF0ZXMgfSBmcm9tIFwiLi90ZW1wbGF0ZXNcIjtcbmV4cG9ydCB7IHRvb2xzIH0gZnJvbSBcIi4vdG9vbHNcIjtcblxuZXhwb3J0IGNvbnN0IG1vZHVsZVBhY2thZ2U6IE1vZHVsZUV4cG9ydFBhY2thZ2UgPSB7XG4gIG5hbWU6IFwibWNwXCIsXG4gIHByb21wdHMsXG4gIHJlc291cmNlcyxcbiAgdGVtcGxhdGVzLFxuICB0b29scyxcbn07XG4iXX0=
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
import type { ModuleExportPackage } from "../../types";
|
|
2
|
+
export { prompts } from "./prompts";
|
|
3
|
+
export { resources } from "./resources";
|
|
4
|
+
export { templates } from "./templates";
|
|
5
|
+
export { tools } from "./tools";
|
|
6
|
+
export declare const modulePackage: ModuleExportPackage;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prompts = void 0;
|
|
4
|
+
exports.prompts = [
|
|
5
|
+
{
|
|
6
|
+
id: "mcp.prompt.module-catalog",
|
|
7
|
+
title: "Decaf MCP Module Catalog",
|
|
8
|
+
description: "Summarizes the modules contributing prompts/resources/templates/tools to FASTMCP.",
|
|
9
|
+
load: async () => "Use the module catalog tool to enumerate available module assets before fulfilling assistant requests.",
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvcHJvbXB0cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLE9BQU8sR0FBa0I7SUFDcEM7UUFDRSxFQUFFLEVBQUUsMkJBQTJCO1FBQy9CLEtBQUssRUFBRSwwQkFBMEI7UUFDakMsV0FBVyxFQUFFLG1GQUFtRjtRQUNoRyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FDZix3R0FBd0c7S0FDM0c7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9tcHRBc3NldCB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgcHJvbXB0czogUHJvbXB0QXNzZXRbXSA9IFtcbiAge1xuICAgIGlkOiBcIm1jcC5wcm9tcHQubW9kdWxlLWNhdGFsb2dcIixcbiAgICB0aXRsZTogXCJEZWNhZiBNQ1AgTW9kdWxlIENhdGFsb2dcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdW1tYXJpemVzIHRoZSBtb2R1bGVzIGNvbnRyaWJ1dGluZyBwcm9tcHRzL3Jlc291cmNlcy90ZW1wbGF0ZXMvdG9vbHMgdG8gRkFTVE1DUC5cIixcbiAgICBsb2FkOiBhc3luYyAoKSA9PlxuICAgICAgXCJVc2UgdGhlIG1vZHVsZSBjYXRhbG9nIHRvb2wgdG8gZW51bWVyYXRlIGF2YWlsYWJsZSBtb2R1bGUgYXNzZXRzIGJlZm9yZSBmdWxmaWxsaW5nIGFzc2lzdGFudCByZXF1ZXN0cy5cIixcbiAgfSxcbl07XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resources = void 0;
|
|
4
|
+
exports.resources = [
|
|
5
|
+
{
|
|
6
|
+
id: "mcp.resource.registry-overview",
|
|
7
|
+
title: "Module Registry Overview",
|
|
8
|
+
description: "Explains how the ModuleRegistry aggregates module exports into FASTMCP catalogs.",
|
|
9
|
+
uri: "decaf://mcp/module-registry",
|
|
10
|
+
mimeType: "text/markdown",
|
|
11
|
+
load: async () => ({
|
|
12
|
+
content: [
|
|
13
|
+
{
|
|
14
|
+
type: "text",
|
|
15
|
+
text: [
|
|
16
|
+
"# Module Registry",
|
|
17
|
+
"",
|
|
18
|
+
"The Decaf MCP server aggregates prompts, resources, templates, and tools from every module under src/modules.",
|
|
19
|
+
"Validators ensure each module contains the canonical folder layout before the registry loads it.",
|
|
20
|
+
].join("\n"),
|
|
21
|
+
mimeType: "text/markdown",
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
}),
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvcmVzb3VyY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVhLFFBQUEsU0FBUyxHQUFvQjtJQUN4QztRQUNFLEVBQUUsRUFBRSxnQ0FBZ0M7UUFDcEMsS0FBSyxFQUFFLDBCQUEwQjtRQUNqQyxXQUFXLEVBQ1Qsa0ZBQWtGO1FBQ3BGLEdBQUcsRUFBRSw2QkFBNkI7UUFDbEMsUUFBUSxFQUFFLGVBQWU7UUFDekIsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNqQixPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFO3dCQUNKLG1CQUFtQjt3QkFDbkIsRUFBRTt3QkFDRiwrR0FBK0c7d0JBQy9HLGtHQUFrRztxQkFDbkcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNaLFFBQVEsRUFBRSxlQUFlO2lCQUMxQjthQUNGO1NBQ0YsQ0FBQztLQUNIO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb3VyY2VBc3NldCB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgcmVzb3VyY2VzOiBSZXNvdXJjZUFzc2V0W10gPSBbXG4gIHtcbiAgICBpZDogXCJtY3AucmVzb3VyY2UucmVnaXN0cnktb3ZlcnZpZXdcIixcbiAgICB0aXRsZTogXCJNb2R1bGUgUmVnaXN0cnkgT3ZlcnZpZXdcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRXhwbGFpbnMgaG93IHRoZSBNb2R1bGVSZWdpc3RyeSBhZ2dyZWdhdGVzIG1vZHVsZSBleHBvcnRzIGludG8gRkFTVE1DUCBjYXRhbG9ncy5cIixcbiAgICB1cmk6IFwiZGVjYWY6Ly9tY3AvbW9kdWxlLXJlZ2lzdHJ5XCIsXG4gICAgbWltZVR5cGU6IFwidGV4dC9tYXJrZG93blwiLFxuICAgIGxvYWQ6IGFzeW5jICgpID0+ICh7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBcIiMgTW9kdWxlIFJlZ2lzdHJ5XCIsXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgXCJUaGUgRGVjYWYgTUNQIHNlcnZlciBhZ2dyZWdhdGVzIHByb21wdHMsIHJlc291cmNlcywgdGVtcGxhdGVzLCBhbmQgdG9vbHMgZnJvbSBldmVyeSBtb2R1bGUgdW5kZXIgc3JjL21vZHVsZXMuXCIsXG4gICAgICAgICAgICBcIlZhbGlkYXRvcnMgZW5zdXJlIGVhY2ggbW9kdWxlIGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgZm9sZGVyIGxheW91dCBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGxvYWRzIGl0LlwiLFxuICAgICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgICBtaW1lVHlwZTogXCJ0ZXh0L21hcmtkb3duXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pLFxuICB9LFxuXTtcblxuIl19
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.templates = void 0;
|
|
4
|
+
exports.templates = [
|
|
5
|
+
{
|
|
6
|
+
id: "mcp.template.module-readme",
|
|
7
|
+
title: "Module README Template",
|
|
8
|
+
description: "Guides maintainers through documenting a new MCP-aware module.",
|
|
9
|
+
content: `# {{moduleName}} Module
|
|
10
|
+
|
|
11
|
+
## Purpose
|
|
12
|
+
Describe why this module exists and how assistants should use it.
|
|
13
|
+
|
|
14
|
+
## Assets
|
|
15
|
+
- Prompts: {{promptSummary}}
|
|
16
|
+
- Resources: {{resourceSummary}}
|
|
17
|
+
- Templates: {{templateSummary}}
|
|
18
|
+
- Tools: {{toolSummary}}
|
|
19
|
+
|
|
20
|
+
## Validation
|
|
21
|
+
Explain what needs to happen when this module changes (tests, docs, etc.).`,
|
|
22
|
+
placeholders: [
|
|
23
|
+
"moduleName",
|
|
24
|
+
"promptSummary",
|
|
25
|
+
"resourceSummary",
|
|
26
|
+
"templateSummary",
|
|
27
|
+
"toolSummary",
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvdGVtcGxhdGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVhLFFBQUEsU0FBUyxHQUFvQjtJQUN4QztRQUNFLEVBQUUsRUFBRSw0QkFBNEI7UUFDaEMsS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixXQUFXLEVBQUUsZ0VBQWdFO1FBQzdFLE9BQU8sRUFBRTs7Ozs7Ozs7Ozs7OzJFQVk4RDtRQUN2RSxZQUFZLEVBQUU7WUFDWixZQUFZO1lBQ1osZUFBZTtZQUNmLGlCQUFpQjtZQUNqQixpQkFBaUI7WUFDakIsYUFBYTtTQUNkO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZUFzc2V0IH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCB0ZW1wbGF0ZXM6IFRlbXBsYXRlQXNzZXRbXSA9IFtcbiAge1xuICAgIGlkOiBcIm1jcC50ZW1wbGF0ZS5tb2R1bGUtcmVhZG1lXCIsXG4gICAgdGl0bGU6IFwiTW9kdWxlIFJFQURNRSBUZW1wbGF0ZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkd1aWRlcyBtYWludGFpbmVycyB0aHJvdWdoIGRvY3VtZW50aW5nIGEgbmV3IE1DUC1hd2FyZSBtb2R1bGUuXCIsXG4gICAgY29udGVudDogYCMge3ttb2R1bGVOYW1lfX0gTW9kdWxlXG5cbiMjIFB1cnBvc2VcbkRlc2NyaWJlIHdoeSB0aGlzIG1vZHVsZSBleGlzdHMgYW5kIGhvdyBhc3Npc3RhbnRzIHNob3VsZCB1c2UgaXQuXG5cbiMjIEFzc2V0c1xuLSBQcm9tcHRzOiB7e3Byb21wdFN1bW1hcnl9fVxuLSBSZXNvdXJjZXM6IHt7cmVzb3VyY2VTdW1tYXJ5fX1cbi0gVGVtcGxhdGVzOiB7e3RlbXBsYXRlU3VtbWFyeX19XG4tIFRvb2xzOiB7e3Rvb2xTdW1tYXJ5fX1cblxuIyMgVmFsaWRhdGlvblxuRXhwbGFpbiB3aGF0IG5lZWRzIHRvIGhhcHBlbiB3aGVuIHRoaXMgbW9kdWxlIGNoYW5nZXMgKHRlc3RzLCBkb2NzLCBldGMuKS5gLFxuICAgIHBsYWNlaG9sZGVyczogW1xuICAgICAgXCJtb2R1bGVOYW1lXCIsXG4gICAgICBcInByb21wdFN1bW1hcnlcIixcbiAgICAgIFwicmVzb3VyY2VTdW1tYXJ5XCIsXG4gICAgICBcInRlbXBsYXRlU3VtbWFyeVwiLFxuICAgICAgXCJ0b29sU3VtbWFyeVwiLFxuICAgIF0sXG4gIH0sXG5dO1xuIl19
|