@decaf-ts/mcp-server 0.0.3 → 0.2.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 +1989 -341
- package/dist/mcp-server.esm.cjs +1963 -338
- package/lib/McpWrapper.cjs +12 -10
- 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 +12 -10
- 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 +4 -0
- package/lib/esm/modules/mcp/decoration-assist.js +6 -0
- 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 +13 -0
- package/lib/modules/mcp/decoration-assist.d.ts +4 -0
- 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 +18 -12
- package/lib/esm/modules/decoration-assist/index.d.ts +0 -39
- package/lib/esm/modules/decoration-assist/index.js +0 -353
- 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/decoration-assist/index.cjs +0 -360
- package/lib/modules/decoration-assist/index.d.ts +0 -39
- 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
|
@@ -1,360 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.PACKAGE_NAME = exports.VERSION = void 0;
|
|
7
|
-
exports.default = enrich;
|
|
8
|
-
const fs_1 = __importDefault(require("fs"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const zod_1 = require("zod");
|
|
11
|
-
const metadata_1 = require("./../../metadata.cjs");
|
|
12
|
-
// Utility: safe read file
|
|
13
|
-
function readFileSafe(filePath, encoding = "utf8") {
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kdWxlcy9kZWNvcmF0aW9uLWFzc2lzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF3YUEseUJBV0M7QUFuYkQsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qiw2QkFBd0I7QUFFeEIsbURBQW1FO0FBRW5FLDBCQUEwQjtBQUMxQixTQUFTLFlBQVksQ0FDbkIsUUFBZ0IsRUFDaEIsV0FBMkIsTUFBTTtJQUVqQyxJQUFJLENBQUM7UUFDSCxPQUFPLFlBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUN6QixJQUFZLEVBQ1osT0FBZ0M7SUFFaEMsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLE1BQU0sS0FBSyxHQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRyxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLFlBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLFlBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO2FBQU0sSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNw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QyxPQUFPLENBQUMsMEJBQTBCLEVBQVMsQ0FBQyxDQUFDO0lBQ2pELEdBQUcsQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQVMsQ0FBQyxDQUFDO0lBQ3JELEdBQUcsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQVMsQ0FBQyxDQUFDO0lBQzNDLG9CQUFvQjtJQUNwQixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUM7SUFDaEMsS0FBSyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFRLENBQUMsQ0FBQztJQUNoRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztRQUM5QyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBUSxDQUFDLENBQUM7SUFDcEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRVksUUFBQSxPQUFPLEdBQUcsa0JBQUMsQ0FBQztBQUNaLFFBQUEsWUFBWSxHQUFHLEdBQUcsdUJBQUcsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgRmFzdE1DUCwgVG9vbCwgSW5wdXRQcm9tcHQgfSBmcm9tIFwiZmFzdG1jcFwiO1xuaW1wb3J0IHsgVkVSU0lPTiBhcyBWLCBQQUNLQUdFX05BTUUgYXMgUEtHIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhXCI7XG5cbi8vIFV0aWxpdHk6IHNhZmUgcmVhZCBmaWxlXG5mdW5jdGlvbiByZWFkRmlsZVNhZmUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGVuY29kaW5nOiBCdWZmZXJFbmNvZGluZyA9IFwidXRmOFwiXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2RpbmcgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdEZpbGVzUmVjdXJzaXZlKFxuICByb290OiBzdHJpbmcsXG4gIG1hdGNoZXI/OiAocDogc3RyaW5nKSA9PiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RhY2s6IHN0cmluZ1tdID0gW3Jvb3RdO1xuICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gc3RhY2sucG9wKCkhO1xuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhjdXIpO1xuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmcy5yZWFkZGlyU3luYyhjdXIpKSBzdGFjay5wdXNoKHBhdGguam9pbihjdXIsIGYpKTtcbiAgICB9IGVsc2UgaWYgKCFtYXRjaGVyIHx8IG1hdGNoZXIoY3VyKSkge1xuICAgICAgb3V0LnB1c2goY3VyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dC5zb3J0KCk7XG59XG5cbi8vIFpvZCBTY2hlbWFzICh3aXRoIGV4cGxpY2l0IGRlc2NyaXB0aW9ucylcbmNvbnN0IGFuYWx5emVSZXBvU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICByZXBvUGF0aDogelxuICAgICAgLnN0cmluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkgaW5zaWRlIHRoaXMgbW9ub3JlcG8sIGUuZy4gJy4vZGVjb3JhdGlvbicuXCIsXG4gICAgICB9KVxuICAgICAgLm1pbigxLCBcInJlcG9QYXRoIGlzIHJlcXVpcmVkXCIpLFxuICAgIGluY2x1ZGVUZXN0czogelxuICAgICAgLmJvb2xlYW4oe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIklmIHRydWUsIGFuYWx5emUgdGhlIHRlc3RzIGRpcmVjdG9yeSAoaWYgcHJlc2VudCkgdG8gZGVyaXZlIGV4cGVjdGVkIGJlaGF2aW9ycy5cIixcbiAgICAgIH0pXG4gICAgICAuZGVmYXVsdCh0cnVlKSxcbiAgICBpbmNsdWRlRG9jczogelxuICAgICAgLmJvb2xlYW4oe1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBcIklmIHRydWUsIGFuYWx5emUgUkVBRE1FLm1kIGFuZCBkb2NzIGRpcmVjdG9yaWVzIHRvIGV4dHJhY3QgZG9jdW1lbnRlZCBmZWF0dXJlcy5cIixcbiAgICAgIH0pXG4gICAgICAuZGVmYXVsdCh0cnVlKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcbiAgICBcIkFuYWx5emUgYSBsb2NhbCByZXBvc2l0b3J5IChlLmcuIC4vZGVjb3JhdGlvbikgdG8gZXh0cmFjdCBBUElzLCBmZWF0dXJlcywgdGVzdHMsIGFuZCBkb2N1bWVudGF0aW9uIGN1ZXMuXCJcbiAgKTtcblxuY29uc3QgZW51bWVyYXRlQ2FwYWJpbGl0aWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICByZXBvUGF0aDogelxuICAgICAgLnN0cmluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiUmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkgdG8gZW51bWVyYXRlIGRldmVsb3Blci1mYWNpbmcgY2FwYWJpbGl0aWVzLlwiLFxuICAgICAgfSlcbiAgICAgIC5taW4oMSwgXCJyZXBvUGF0aCBpcyByZXF1aXJlZFwiKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcbiAgICBcIkVudW1lcmF0ZSB0aGUgY29tcGxldGUgc2V0IG9mIGNhcGFiaWxpdGllcyBhIGRldmVsb3BlciBpcyBleHBlY3RlZCB0byB1c2UgZnJvbSB0aGUgZ2l2ZW4gcmVwb3NpdG9yeS5cIlxuICApO1xuXG5jb25zdCBwbGFuRmVhdHVyZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZmVhdHVyZTogelxuICAgICAgLnN0cmluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiTmF0dXJhbC1sYW5ndWFnZSBkZXNjcmlwdGlvbiBvZiBhIGRldmVsb3BlcidzIHJlcXVlc3RlZCBmZWF0dXJlIG9yIHRhc2sgdG8gaW1wbGVtZW50IHVzaW5nIHRoZSByZXBvc2l0b3J5IGFuZCBhdmFpbGFibGUgTUNQIHRvb2xzLlwiLFxuICAgICAgfSlcbiAgICAgIC5taW4oNSwgXCJmZWF0dXJlIG11c3QgZGVzY3JpYmUgdGhlIGdvYWwgY2xlYXJseVwiKSxcbiAgICByZXBvUGF0aDogelxuICAgICAgLnN0cmluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiVGFyZ2V0IHJlcG9zaXRvcnkgcGF0aCBwcm92aWRpbmcgdGhlIGxpYnJhcnkgdG8gdXNlLCBlLmcuICcuL2RlY29yYXRpb24nLlwiLFxuICAgICAgfSlcbiAgICAgIC5kZWZhdWx0KFwiLi9kZWNvcmF0aW9uXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFxuICAgIFwiUGxhbiB3aGljaCBNQ1AgdG9vbHMgdG8gdXNlIGFuZCBpbiB3aGF0IHNlcXVlbmNlIHRvIGltcGxlbWVudCBhIHJlcXVlc3RlZCBmZWF0dXJlIHVzaW5nIHRoZSByZXBvc2l0b3J5LlwiXG4gICk7XG5cbi8vIFR5cGVzXG5leHBvcnQgdHlwZSBBbmFseXplUmVwb0FyZ3MgPSB6LmluZmVyPHR5cGVvZiBhbmFseXplUmVwb1NjaGVtYT47XG5leHBvcnQgdHlwZSBFbnVtZXJhdGVDYXBhYmlsaXRpZXNBcmdzID0gei5pbmZlcjxcbiAgdHlwZW9mIGVudW1lcmF0ZUNhcGFiaWxpdGllc1NjaGVtYVxuPjtcbmV4cG9ydCB0eXBlIFBsYW5GZWF0dXJlQXJncyA9IHouaW5mZXI8dHlwZW9mIHBsYW5GZWF0dXJlU2NoZW1hPjtcblxuLy8gQW5hbHlzaXMgaGVscGVycyAobWluaW1hbCB5ZXQgZWZmZWN0aXZlLCB0ZXh0LWJhc2VkIHRvIGF2b2lkIGhlYXZ5IEFTVCBkZXBzKVxuZnVuY3Rpb24gaXNTb3VyY2VGaWxlKHA6IHN0cmluZykge1xuICByZXR1cm4gL1xcLih0c3x0c3h8anN8anN4KSQvLnRlc3QocCkgJiYgIXAuZW5kc1dpdGgoXCIuZC50c1wiKTtcbn1cbmZ1bmN0aW9uIGlzVGVzdEZpbGUocDogc3RyaW5nKSB7XG4gIHJldHVybiAvKFxcLnRlc3RcXC58XFwuc3BlY1xcLikvLnRlc3QocCk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRzKGZpbGVDb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGV4cG9ydFJlID1cbiAgICAvKGV4cG9ydFxccysoPzpkZWZhdWx0XFxzKyk/KD86Y2xhc3N8ZnVuY3Rpb258Y29uc3R8bGV0fHZhcnxpbnRlcmZhY2V8dHlwZXxlbnVtKVxccyspKFtBLVphLXowLTlfXSspL2c7XG4gIGNvbnN0IG5hbWVkUmUgPSAvZXhwb3J0XFxzKlxceyhbXn1dKylcXH0vZztcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gIHdoaWxlICgobSA9IGV4cG9ydFJlLmV4ZWMoZmlsZUNvbnRlbnQpKSkgbmFtZXMuYWRkKG1bMl0pO1xuICB3aGlsZSAoKG0gPSBuYW1lZFJlLmV4ZWMoZmlsZUNvbnRlbnQpKSkge1xuICAgIG1bMV1cbiAgICAgIC5zcGxpdChcIixcIilcbiAgICAgIC5tYXAoKHMpID0+IHMudHJpbSgpLnNwbGl0KFwiIGFzIFwiKVswXS50cmltKCkpXG4gICAgICAuZm9yRWFjaCgobikgPT4ge1xuICAgICAgICBpZiAobikgbmFtZXMuYWRkKG4pO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5uYW1lc10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVjb3JhdG9ycyhmaWxlQ29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlY1JlID0gL0AoW0EtWmEtel9dW0EtWmEtejAtOV9dKikvZztcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gIHdoaWxlICgobSA9IGRlY1JlLmV4ZWMoZmlsZUNvbnRlbnQpKSkgZGVjcy5hZGQobVsxXSk7XG4gIHJldHVybiBbLi4uZGVjc10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBzdW1tYXJpemVSZWFkbWUocmVhZG1lPzogc3RyaW5nKSB7XG4gIGlmICghcmVhZG1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBsaW5lcyA9IHJlYWRtZS5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgdGl0bGUgPVxuICAgIGxpbmVzLmZpbmQoKGwpID0+IC9eI1xccysvLnRlc3QobCkpPy5yZXBsYWNlKC9eI1xccysvLCBcIlwiKSB8fCBcIlJFQURNRVwiO1xuICBjb25zdCBidWxsZXRzID0gbGluZXMuZmlsdGVyKChsKSA9PiAvXlstKl1cXHMrLy50ZXN0KGwpKS5zbGljZSgwLCAyMCk7XG4gIHJldHVybiB7IHRpdGxlLCBidWxsZXRzIH07XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVSZXBvKHJvb3Q6IHN0cmluZykge1xuICBjb25zdCBzcmMgPSBwYXRoLmpvaW4ocm9vdCwgXCJzcmNcIik7XG4gIGNvbnN0IHRlc3REaXIgPSBwYXRoLmpvaW4ocm9vdCwgXCJ0ZXN0c1wiKTtcbiAgY29uc3QgcmVhZG1lUGF0aCA9IHBhdGguam9pbihyb290LCBcIlJFQURNRS5tZFwiKTtcbiAgY29uc3QgcmVhZG1lID0gcmVhZEZpbGVTYWZlKHJlYWRtZVBhdGgpO1xuXG4gIGNvbnN0IGZpbGVzID0gZnMuZXhpc3RzU3luYyhzcmMpID8gbGlzdEZpbGVzUmVjdXJzaXZlKHNyYywgaXNTb3VyY2VGaWxlKSA6IFtdO1xuICBjb25zdCB0ZXN0RmlsZXMgPSBmcy5leGlzdHNTeW5jKHRlc3REaXIpXG4gICAgPyBsaXN0RmlsZXNSZWN1cnNpdmUodGVzdERpciwgKGYpID0+IGlzU291cmNlRmlsZShmKSAmJiBpc1Rlc3RGaWxlKGYpKVxuICAgIDogW107XG5cbiAgY29uc3QgYXBpOiBSZWNvcmQ8c3RyaW5nLCB7IGV4cG9ydHM6IHN0cmluZ1tdOyBkZWNvcmF0b3JzOiBzdHJpbmdbXSB9PiA9IHt9O1xuICBmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTYWZlKGYpIHx8IFwiXCI7XG4gICAgYXBpW3BhdGgucmVsYXRpdmUocm9vdCwgZildID0ge1xuICAgICAgZXhwb3J0czogZXh0cmFjdEV4cG9ydHMoY29udGVudCksXG4gICAgICBkZWNvcmF0b3JzOiBleHRyYWN0RGVjb3JhdG9ycyhjb250ZW50KSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHRlc3RzOiBSZWNvcmQ8c3RyaW5nLCB7IG1lbnRpb25zOiBzdHJpbmdbXSB9PiA9IHt9O1xuICBmb3IgKGNvbnN0IGYgb2YgdGVzdEZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU2FmZShmKSB8fCBcIlwiO1xuICAgIGNvbnN0IG1lbnRpb25zID0gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBTZXQoWy4uLmV4dHJhY3RFeHBvcnRzKGNvbnRlbnQpLCAuLi5leHRyYWN0RGVjb3JhdG9ycyhjb250ZW50KV0pXG4gICAgKS5zb3J0KCk7XG4gICAgdGVzdHNbcGF0aC5yZWxhdGl2ZShyb290LCBmKV0gPSB7IG1lbnRpb25zIH07XG4gIH1cbiAgcmV0dXJuIHsgZmlsZXMsIHRlc3RGaWxlcywgYXBpLCB0ZXN0cywgcmVhZG1lOiBzdW1tYXJpemVSZWFkbWUocmVhZG1lKSB9O1xufVxuXG4vLyBUb29sc1xuZnVuY3Rpb24gYnVpbGRBbmFseXplUmVwb3NpdG9yeVRvb2woKTogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgYW5hbHl6ZVJlcG9TY2hlbWFcbj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiYW5hbHl6ZS1yZXBvc2l0b3J5XCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkFuYWx5emUgYSBsb2NhbCByZXBvc2l0b3J5J3Mgc291cmNlLCB0ZXN0cywgYW5kIGRvY3MgdG8gZXh0cmFjdCBleHBvcnRlZCBBUElzLCBkZWNvcmF0b3JzLCBhbmQgdGVzdCBtZW50aW9ucy5cIixcbiAgICBwYXJhbWV0ZXJzOiBhbmFseXplUmVwb1NjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGxldCByZXBvUm9vdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIC8vIHRyeSByZXNvbHZpbmcgZnJvbSBtb25vcmVwbyByb290IChwYXJlbnQgb2YgY3VycmVudCBjd2QpXG4gICAgICAgIGNvbnN0IGFsdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcIi4uXCIsIGlucHV0LnJlcG9QYXRoKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0KSkgcmVwb1Jvb3QgPSBhbHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIC8vIGlmIGlucHV0IHdhcyBhYnNvbHV0ZSBhbmQgc3RpbGwgbm90IGZvdW5kLCB0cnkgLi4vPGJhc2VuYW1lPlxuICAgICAgICBjb25zdCBhbHQyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCIuLlwiLFxuICAgICAgICAgIHBhdGguYmFzZW5hbWUoaW5wdXQucmVwb1BhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdDIpKSByZXBvUm9vdCA9IGFsdDI7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcG9zaXRvcnkgbm90IGZvdW5kIGF0ICR7cmVwb1Jvb3R9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhbmFseXplUmVwbyhyZXBvUm9vdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSB9XSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlQ2FwYWJpbGl0aWVzKFxuICBhbmFseXNpczogUmV0dXJuVHlwZTx0eXBlb2YgYW5hbHl6ZVJlcG8+XG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNhcCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBoZXVyaXN0aWNzOiBpZiBkZWNvcmF0b3JzIGxpa2UgRGVjb3JhdGlvbiwgZmxhdm91cmVkQXMsIGV4dGVuZCwgb3ZlcnJpZGUgYXBwZWFyLCBhZGQgY2FwYWJpbGl0aWVzXG4gIGNvbnN0IGFsbERlY3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGFuYWx5c2lzLmFwaSkpIHtcbiAgICBmb3IgKGNvbnN0IGQgb2YgYW5hbHlzaXMuYXBpW2tdLmRlY29yYXRvcnMpIGFsbERlY3MuYWRkKGQpO1xuICAgIGZvciAoY29uc3QgZSBvZiBhbmFseXNpcy5hcGlba10uZXhwb3J0cylcbiAgICAgIGlmICgvRGVjb3JhdGlvbnxkZWNvcmF0ZXxCdWlsZGVyfEZsYXZvdXIvaS50ZXN0KGUpKVxuICAgICAgICBjYXAuYWRkKFwidXNlLWRlY29yYXRpb24tYXBpXCIpO1xuICB9XG4gIGlmIChbLi4uYWxsRGVjc10uc29tZSgoZCkgPT4gL292ZXJyaWRlfGV4dGVuZC9pLnRlc3QoZCkpKVxuICAgIGNhcC5hZGQoXCJvdmVycmlkZS1hbmQtZXh0ZW5kLWRlY29yYXRpb25zXCIpO1xuICBpZiAoT2JqZWN0LmtleXMoYW5hbHlzaXMudGVzdHMpLmxlbmd0aCA+IDApIGNhcC5hZGQoXCJ2YWxpZGF0ZS13aXRoLXRlc3RzXCIpO1xuICBpZiAoYW5hbHlzaXMucmVhZG1lKSBjYXAuYWRkKFwiZm9sbG93LXJlYWRtZS1ndWlkZXNcIik7XG4gIHJldHVybiBbLi4uY2FwXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRW51bWVyYXRlQ2FwYWJpbGl0aWVzVG9vbCgpOiBUb29sPFxuICB1bmRlZmluZWQsXG4gIHR5cGVvZiBlbnVtZXJhdGVDYXBhYmlsaXRpZXNTY2hlbWFcbj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiZW51bWVyYXRlLWNhcGFiaWxpdGllc1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFbnVtZXJhdGUgZGV2ZWxvcGVyLWZhY2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIGdpdmVuIHJlcG9zaXRvcnksIGluZmVycmVkIGZyb20gY29kZSwgdGVzdHMsIGFuZCBkb2NzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGVudW1lcmF0ZUNhcGFiaWxpdGllc1NjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGxldCByZXBvUm9vdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIGNvbnN0IGFsdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcIi4uXCIsIGlucHV0LnJlcG9QYXRoKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0KSkgcmVwb1Jvb3QgPSBhbHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIGNvbnN0IGFsdDIgPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIi4uXCIsXG4gICAgICAgICAgcGF0aC5iYXNlbmFtZShpbnB1dC5yZXBvUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0MikpIHJlcG9Sb290ID0gYWx0MjtcbiAgICAgIH1cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZXBvUm9vdCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3NpdG9yeSBub3QgZm91bmQgYXQgJHtyZXBvUm9vdH1gKTtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gYW5hbHl6ZVJlcG8ocmVwb1Jvb3QpO1xuICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZGVyaXZlQ2FwYWJpbGl0aWVzKGFuYWx5c2lzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgIGFuYWx5c2lzU3VtbWFyeToge1xuICAgICAgICAgICAgICAgICAgZmlsZXM6IGFuYWx5c2lzLmZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHRlc3RGaWxlczogYW5hbHlzaXMudGVzdEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHJlYWRtZTogYW5hbHlzaXMucmVhZG1lPy50aXRsZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxhbkZlYXR1cmVUb29sKCk6IFRvb2w8dW5kZWZpbmVkLCB0eXBlb2YgcGxhbkZlYXR1cmVTY2hlbWE+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcInBsYW4tZmVhdHVyZS1pbXBsZW1lbnRhdGlvblwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJHaXZlbiBhIGZlYXR1cmUgcmVxdWVzdCwgc2VsZWN0IGFwcHJvcHJpYXRlIE1DUCB0b29scyAoaW5jbHVkaW5nIGV4aXN0aW5nIGFuZCBuZXcgb25lcykgYW5kIHByb2R1Y2UgYW4gZXhlY3V0aW9uIHBsYW4uXCIsXG4gICAgcGFyYW1ldGVyczogcGxhbkZlYXR1cmVTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBzdGVwczogQXJyYXk8e1xuICAgICAgICBzdGVwOiBudW1iZXI7XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICB0b29sPzogc3RyaW5nO1xuICAgICAgICBhcmd1bWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICByYXRpb25hbGU6IHN0cmluZztcbiAgICAgIH0+ID0gW107XG4gICAgICBsZXQgaSA9IDE7XG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgc3RlcDogaSsrLFxuICAgICAgICBhY3Rpb246IFwiQW5hbHl6ZSByZXBvc2l0b3J5IHRvIGVudW1lcmF0ZSBBUElzIGFuZCBkZWNvcmF0b3JzXCIsXG4gICAgICAgIHRvb2w6IFwiYW5hbHl6ZS1yZXBvc2l0b3J5XCIsXG4gICAgICAgIGFyZ3VtZW50czogeyByZXBvUGF0aDogaW5wdXQucmVwb1BhdGggfSxcbiAgICAgICAgcmF0aW9uYWxlOiBcIlVuZGVyc3RhbmQgYXZhaWxhYmxlIGJ1aWxkaW5nIGJsb2Nrcy5cIixcbiAgICAgIH0pO1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIHN0ZXA6IGkrKyxcbiAgICAgICAgYWN0aW9uOiBcIkxpc3QgY2FwYWJpbGl0aWVzIGV4cGVjdGVkIGZvciBkZXZlbG9wZXJzXCIsXG4gICAgICAgIHRvb2w6IFwiZW51bWVyYXRlLWNhcGFiaWxpdGllc1wiLFxuICAgICAgICBhcmd1bWVudHM6IHsgcmVwb1BhdGg6IGlucHV0LnJlcG9QYXRoIH0sXG4gICAgICAgIHJhdGlvbmFsZTogXCJBbGlnbiB0aGUgcGxhbiB3aXRoIHN1cHBvcnRlZCBjYXBhYmlsaXRpZXMuXCIsXG4gICAgICB9KTtcbiAgICAgIC8vIFN1Z2dlc3QgZXhpc3RpbmcgZ2VuZXJpYyB0b29scyBmcm9tIG1jcC1tb2R1bGVcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjpcbiAgICAgICAgICBcIlNlbGVjdCBkb2N1bWVudGF0aW9uIHByb21wdCBhbmQgZ2F0aGVyIHJlbGV2YW50IHNvdXJjZSBmaWxlKHMpXCIsXG4gICAgICAgIHRvb2w6IFwiZG9jdW1lbnQtY29kZVwiLFxuICAgICAgICBhcmd1bWVudHM6IHsgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiIH0sXG4gICAgICAgIHJhdGlvbmFsZTogXCJQcm92aWRlIGNvbnRleHQgYW5kIGluc3RydWN0aW9ucyBmb3IgY2hhbmdlcy5cIixcbiAgICAgIH0pO1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIHN0ZXA6IGkrKyxcbiAgICAgICAgYWN0aW9uOiBcIkFwcGx5IGNvZGUgY2hhbmdlcyB1c2luZyB1bmlmaWVkIGRpZmYgcGF0Y2hcIixcbiAgICAgICAgdG9vbDogXCJhcHBseS1jb2RlLWNoYW5nZVwiLFxuICAgICAgICBhcmd1bWVudHM6IHtcbiAgICAgICAgICBmaWxlUGF0aDogXCI8dGFyZ2V0LWZpbGU+XCIsXG4gICAgICAgICAgcGF0Y2g6IFwiPHVuaWZpZWQtZGlmZj5cIixcbiAgICAgICAgICBkcnlSdW46IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHJhdGlvbmFsZTogXCJWYWxpZGF0ZSBjaGFuZ2VzIHNhZmVseSBiZWZvcmUgY29tbWl0dGluZy5cIixcbiAgICAgIH0pO1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIHN0ZXA6IGkrKyxcbiAgICAgICAgYWN0aW9uOiBcIkNvbW1pdCBjb2RlIGNoYW5nZXNcIixcbiAgICAgICAgdG9vbDogXCJhcHBseS1jb2RlLWNoYW5nZVwiLFxuICAgICAgICBhcmd1bWVudHM6IHtcbiAgICAgICAgICBmaWxlUGF0aDogXCI8dGFyZ2V0LWZpbGU+XCIsXG4gICAgICAgICAgcGF0Y2g6IFwiPHVuaWZpZWQtZGlmZj5cIixcbiAgICAgICAgICBkcnlSdW46IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICByYXRpb25hbGU6IFwiUGVyc2lzdCB0aGUgdXBkYXRlLlwiLFxuICAgICAgfSk7XG4gICAgICAvLyBJZiBkZWNvcmF0aW9uLXJlbGF0ZWQgdGVybXMgcHJlc2VudCwgc3VnZ2VzdCBkZWNvcmF0b3IgdG9vbHNcbiAgICAgIGlmICgvZGVjb3JhdHxmbGF2b3VyfG92ZXJyaWRlfGV4dGVuZHxidWlsZGVyL2kudGVzdChpbnB1dC5mZWF0dXJlKSkge1xuICAgICAgICBzdGVwcy51bnNoaWZ0KHtcbiAgICAgICAgICBzdGVwOiAwLFxuICAgICAgICAgIGFjdGlvbjogXCJVc2UgZGVjb3JhdG9yIHRvb2xpbmcgdG8gaW5zZXJ0L3JlbW92ZS9tb2RpZnkgZGVjb3JhdG9yc1wiLFxuICAgICAgICAgIHRvb2w6IFwiZGVjb3JhdG9yLXRvb2xzXCIsXG4gICAgICAgICAgYXJndW1lbnRzOiB7IGFjdGlvbjogXCJoZWxwXCIgfSxcbiAgICAgICAgICByYXRpb25hbGU6IFwiTGV2ZXJhZ2Ugc3BlY2lhbGl6ZWQgdXRpbGl0aWVzIGZvciBkZWNvcmF0aW9uIHBhdHRlcm5zLlwiLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RlcHMuZm9yRWFjaCgocywgaWR4KSA9PiAocy5zdGVwID0gaWR4ICsgMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwbGFuOiBzdGVwcyxcbiAgICAgICAgICAgICAgICBub3RlczpcbiAgICAgICAgICAgICAgICAgIFwiUmVwbGFjZSBwbGFjZWhvbGRlciBhcmd1bWVudHMgbGlrZSA8dGFyZ2V0LWZpbGU+IGFuZCA8dW5pZmllZC1kaWZmPiBiYXNlZCBvbiB0aGUgYW5hbHlzaXMgb3V0cHV0LlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvbXB0cyhyZXBvUGF0aDogc3RyaW5nKTogSW5wdXRQcm9tcHQ8dW5kZWZpbmVkPltdIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImRlY29yYXRpb24tb3ZlcnZpZXdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhpZ2gtbGV2ZWwgZ3VpZGFuY2Ugb24gdXNpbmcgdGhlIGRlY29yYXRpb24gbGlicmFyeToga2V5IGV4cG9ydHMsIGRlY29yYXRvcnMsIGFuZCBjb21tb24gd29ya2Zsb3dzLlwiLFxuICAgICAgbG9hZDogYXN5bmMgKCkgPT5cbiAgICAgICAgYFlvdSBhcmUgYXNzaXN0aW5nIHdpdGggdGhlIERlY2FmLnRzIGRlY29yYXRpb24gbW9kdWxlIGxvY2F0ZWQgYXQgJHtyZXBvUGF0aH0uIFByZWZlciB1c2luZyBleHBvcnRlZCBidWlsZGVycyBhbmQgZGVjb3JhdG9ycyBvdmVyIGFkLWhvYyBwYXR0ZXJucy5cXG5cXG5Qcm92aWRlIGEgY29uY2lzZSwgYWN0aW9uYWJsZSBvdmVydmlldyBvZiBob3cgdG8gdXNlIHRoZSBkZWNvcmF0aW9uIEFQSXMgZm9yIGV4dGVuZGluZyBhbmQgb3ZlcnJpZGluZyBiZWhhdmlvcnMuYCxcbiAgICB9LFxuICBdO1xufVxuXG50eXBlIERlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHVyaVRlbXBsYXRlOiBzdHJpbmc7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIGFyZ3VtZW50czogUmVhZG9ubHlBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIH0+O1xuICBsb2FkOiAoYXJnczogeyBwYXRoOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTx7IHRleHQ6IHN0cmluZyB9Pjtcbn07XG5mdW5jdGlvbiBidWlsZFJlc291cmNlVGVtcGxhdGVzKFxuICByZXBvUGF0aDogc3RyaW5nXG4pOiBEZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZVtdIHtcbiAgY29uc3Qgcm9vdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZXBvUGF0aCk7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogXCJkZWNvcmF0aW9uLXNyY1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUmVhZCBhIGZpbGUgZnJvbSB0aGUgZGVjb3JhdGlvbi9zcmMgdHJlZSBieSByZWxhdGl2ZSBwYXRoLlwiLFxuICAgICAgbWltZVR5cGU6IFwidGV4dC9wbGFpblwiLFxuICAgICAgdXJpVGVtcGxhdGU6IFwiZGVjb3JhdGlvbjovL3NyYy97cGF0aH1cIixcbiAgICAgIGFyZ3VtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJwYXRoXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIlBhdGggdW5kZXIgZGVjb3JhdGlvbi9zcmMgdG8gbG9hZCwgZS5nLiAnZGVjb3JhdGlvbi90eXBlcy50cydcIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2FkOiBhc3luYyAoeyBwYXRoOiByZWwgfTogeyBwYXRoOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBjb25zdCBhYnMgPSBwYXRoLmpvaW4ocm9vdCwgXCJzcmNcIiwgcmVsKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHJlYWRGaWxlU2FmZShhYnMpID8/IFwiXCI7XG4gICAgICAgIHJldHVybiB7IHRleHQgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW5yaWNoKG1jcDogRmFzdE1DUCkge1xuICAvLyBSZWdpc3RlciB0b29sc1xuICBtY3AuYWRkVG9vbChidWlsZEFuYWx5emVSZXBvc2l0b3J5VG9vbCgpIGFzIGFueSk7XG4gIG1jcC5hZGRUb29sKGJ1aWxkRW51bWVyYXRlQ2FwYWJpbGl0aWVzVG9vbCgpIGFzIGFueSk7XG4gIG1jcC5hZGRUb29sKGJ1aWxkUGxhbkZlYXR1cmVUb29sKCkgYXMgYW55KTtcbiAgLy8gUHJvbXB0cy9yZXNvdXJjZXNcbiAgY29uc3QgcmVwb1BhdGggPSBcIi4vZGVjb3JhdGlvblwiO1xuICBmb3IgKGNvbnN0IHAgb2YgYnVpbGRQcm9tcHRzKHJlcG9QYXRoKSkgbWNwLmFkZFByb21wdChwIGFzIGFueSk7XG4gIGZvciAoY29uc3QgciBvZiBidWlsZFJlc291cmNlVGVtcGxhdGVzKHJlcG9QYXRoKSlcbiAgICBtY3AuYWRkUmVzb3VyY2VUZW1wbGF0ZShyIGFzIGFueSk7XG4gIHJldHVybiBtY3A7XG59XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gVjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBgJHtQS0d9L2RlY29yYXRpb24tYXNzaXN0YDtcbiJdfQ==
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import type { FastMCP } from "fastmcp";
|
|
3
|
-
declare const analyzeRepoSchema: z.ZodObject<{
|
|
4
|
-
repoPath: z.ZodString;
|
|
5
|
-
includeTests: z.ZodDefault<z.ZodBoolean>;
|
|
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.2";
|
|
38
|
-
export declare const PACKAGE_NAME = "##PACKAGE_NAME##/decoration-assist";
|
|
39
|
-
export {};
|