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