@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
@@ -0,0 +1,250 @@
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.readmeImprovementTool = exports.coverageEnforcerTool = exports.documentObjectTool = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const child_process_1 = require("child_process");
10
+ const schemas_1 = require("./../schemas.cjs");
11
+ const workspace_1 = require("./../workspace.cjs");
12
+ const prompts_1 = require("./../prompts/prompts.cjs");
13
+ const utils_1 = require("./../utils.cjs");
14
+ const code_1 = require("./../code.cjs");
15
+ function relativeFiles(root, files) {
16
+ return files.map((file) => path_1.default.relative(root, file)).sort();
17
+ }
18
+ function collectPromptSections(names) {
19
+ const root = (0, workspace_1.getWorkspaceRoot)();
20
+ const promptIndex = new Map((0, prompts_1.discoverDocPrompts)(root).map((prompt) => [prompt.name, prompt]));
21
+ return names
22
+ .map((name) => promptIndex.get(name))
23
+ .filter((prompt) => Boolean(prompt))
24
+ .map((prompt) => ({
25
+ name: prompt.name,
26
+ title: prompt.title,
27
+ description: prompt.description,
28
+ content: prompt.content,
29
+ absolutePath: prompt.absolutePath,
30
+ }));
31
+ }
32
+ function parseTaskLines(content) {
33
+ return content
34
+ .split(/\r?\n/)
35
+ .map((line) => line.trim())
36
+ .filter((line) => /^task\s+\d+/i.test(line));
37
+ }
38
+ function computeCoverageFromFinal(coveragePath) {
39
+ const payload = JSON.parse(fs_1.default.readFileSync(coveragePath, "utf8"));
40
+ const totals = {
41
+ statements: { covered: 0, total: 0 },
42
+ functions: { covered: 0, total: 0 },
43
+ branches: { covered: 0, total: 0 },
44
+ };
45
+ const files = Object.entries(payload).map(([filePath, info]) => {
46
+ const statementCounts = Object.values(info.s);
47
+ const functionCounts = Object.values(info.f);
48
+ const branchCounts = Object.values(info.b).flatMap((value) => Array.isArray(value) ? value : [value]);
49
+ const statementTotal = statementCounts.length;
50
+ const functionTotal = functionCounts.length;
51
+ const branchTotal = branchCounts.length;
52
+ const statementCovered = statementCounts.filter((count) => count > 0).length;
53
+ const functionCovered = functionCounts.filter((count) => count > 0).length;
54
+ const branchCovered = branchCounts.filter((count) => count > 0).length;
55
+ totals.statements.covered += statementCovered;
56
+ totals.statements.total += statementTotal;
57
+ totals.functions.covered += functionCovered;
58
+ totals.functions.total += functionTotal;
59
+ totals.branches.covered += branchCovered;
60
+ totals.branches.total += branchTotal;
61
+ const pct = (covered, total) => total === 0 ? 100 : Number(((covered / total) * 100).toFixed(2));
62
+ return {
63
+ path: filePath,
64
+ statements: pct(statementCovered, statementTotal),
65
+ functions: pct(functionCovered, functionTotal),
66
+ branches: pct(branchCovered, branchTotal),
67
+ };
68
+ });
69
+ const pct = (covered, total) => total === 0 ? 100 : Number(((covered / total) * 100).toFixed(2));
70
+ return {
71
+ totals: {
72
+ statements: {
73
+ ...totals.statements,
74
+ pct: pct(totals.statements.covered, totals.statements.total),
75
+ },
76
+ functions: {
77
+ ...totals.functions,
78
+ pct: pct(totals.functions.covered, totals.functions.total),
79
+ },
80
+ branches: {
81
+ ...totals.branches,
82
+ pct: pct(totals.branches.covered, totals.branches.total),
83
+ },
84
+ },
85
+ files,
86
+ };
87
+ }
88
+ function normalizePromptSections(sections) {
89
+ return sections.map((section) => ({
90
+ name: section.name,
91
+ title: section.title,
92
+ tasks: parseTaskLines(section.content),
93
+ content: section.content,
94
+ }));
95
+ }
96
+ async function resolveRepoRoot(basePath) {
97
+ const root = (0, workspace_1.getWorkspaceRoot)();
98
+ try {
99
+ return (0, workspace_1.resolveInWorkspace)(root, basePath);
100
+ }
101
+ catch (error) {
102
+ if (error instanceof workspace_1.WorkspaceError) {
103
+ await (0, workspace_1.throwUserError)(error.message);
104
+ }
105
+ throw error;
106
+ }
107
+ }
108
+ exports.documentObjectTool = {
109
+ name: "document-object",
110
+ description: "Create a documentation plan for a specific object type using .codex prompts and repository analysis.",
111
+ parameters: schemas_1.documentObjectSchema,
112
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
113
+ execute: async (input, _context) => {
114
+ const args = schemas_1.documentObjectSchema.parse(input);
115
+ const repoRoot = await resolveRepoRoot(args.basePath);
116
+ const dependencies = (0, prompts_1.getObjectPromptDependencies)()[args.objectType] ?? [];
117
+ if (!dependencies.length) {
118
+ await (0, workspace_1.throwUserError)(`No prompt guidance configured for object type ${args.objectType}`);
119
+ }
120
+ const sections = normalizePromptSections(collectPromptSections(dependencies));
121
+ const srcDir = path_1.default.join(repoRoot, "src");
122
+ const testDir = path_1.default.join(repoRoot, "tests");
123
+ const sourceFiles = fs_1.default.existsSync(srcDir)
124
+ ? (0, utils_1.listFilesRecursive)(srcDir, code_1.isSourceFile)
125
+ : [];
126
+ const testFiles = fs_1.default.existsSync(testDir)
127
+ ? (0, utils_1.listFilesRecursive)(testDir, (file) => (0, code_1.isSourceFile)(file) && (0, code_1.isTestFile)(file))
128
+ : [];
129
+ let targetFileContent;
130
+ if (args.targetFile) {
131
+ try {
132
+ const absolute = (0, workspace_1.resolveInWorkspace)(repoRoot, args.targetFile);
133
+ targetFileContent = (0, utils_1.readFileSafe)(absolute) ?? undefined;
134
+ }
135
+ catch (error) {
136
+ if (error instanceof workspace_1.WorkspaceError) {
137
+ await (0, workspace_1.throwUserError)(error.message);
138
+ }
139
+ throw error;
140
+ }
141
+ }
142
+ const payload = {
143
+ basePath: path_1.default.relative((0, workspace_1.getWorkspaceRoot)(), repoRoot) || ".",
144
+ objectType: args.objectType,
145
+ targetFile: args.targetFile,
146
+ guidance: sections,
147
+ files: {
148
+ source: relativeFiles(repoRoot, sourceFiles),
149
+ tests: relativeFiles(repoRoot, testFiles),
150
+ },
151
+ targetFileContent: args.includeContent ? targetFileContent : undefined,
152
+ };
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: JSON.stringify(payload, null, 2),
158
+ },
159
+ ],
160
+ };
161
+ },
162
+ };
163
+ exports.coverageEnforcerTool = {
164
+ name: "ensure-test-coverage",
165
+ description: "Run the configured coverage command and report whether the target percentage is met, highlighting weak files.",
166
+ parameters: schemas_1.coverageTaskSchema,
167
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
168
+ execute: async (input, _context) => {
169
+ const args = schemas_1.coverageTaskSchema.parse(input);
170
+ const repoRoot = await resolveRepoRoot(args.basePath);
171
+ if (!args.dryRun) {
172
+ const env = {
173
+ ...process.env,
174
+ USE_WATCHMAN: "false",
175
+ WATCHMAN_DISABLE: "1",
176
+ JEST_DISABLE_WATCHMAN: "1",
177
+ };
178
+ const result = (0, child_process_1.spawnSync)("npm", ["run", "coverage", "--", "--watchman=false", "--runInBand"], { cwd: repoRoot, env, encoding: "utf8" });
179
+ if (result.status !== 0) {
180
+ const message = result.stderr || result.stdout || "Coverage command failed";
181
+ await (0, workspace_1.throwUserError)(message.trim());
182
+ }
183
+ }
184
+ const coveragePath = path_1.default.join(repoRoot, "workdocs", "reports", "coverage", "coverage-final.json");
185
+ if (!fs_1.default.existsSync(coveragePath)) {
186
+ await (0, workspace_1.throwUserError)(`Coverage report not found at ${path_1.default.relative(repoRoot, coveragePath)}`);
187
+ }
188
+ const summary = computeCoverageFromFinal(coveragePath);
189
+ const meetsThreshold = summary.totals.statements.pct >= args.coverage &&
190
+ summary.totals.functions.pct >= args.coverage &&
191
+ summary.totals.branches.pct >= args.coverage;
192
+ const weakest = [...summary.files]
193
+ .sort((a, b) => a.statements - b.statements)
194
+ .slice(0, 10);
195
+ const guidance = normalizePromptSections(collectPromptSections(["bulk-tests"]));
196
+ const payload = {
197
+ basePath: path_1.default.relative((0, workspace_1.getWorkspaceRoot)(), repoRoot) || ".",
198
+ target: args.coverage,
199
+ meetsThreshold,
200
+ totals: summary.totals,
201
+ weakest,
202
+ guidance,
203
+ };
204
+ return {
205
+ content: [
206
+ {
207
+ type: "text",
208
+ text: JSON.stringify(payload, null, 2),
209
+ },
210
+ ],
211
+ };
212
+ },
213
+ };
214
+ exports.readmeImprovementTool = {
215
+ name: "improve-readme",
216
+ description: "Summarize required steps to refresh README and workdocs content using .codex guidance and repository analysis.",
217
+ parameters: schemas_1.readmeImprovementSchema,
218
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
219
+ execute: async (input, _context) => {
220
+ const args = schemas_1.readmeImprovementSchema.parse(input);
221
+ const repoRoot = await resolveRepoRoot(args.basePath);
222
+ const analysis = (0, code_1.analyzeRepo)(repoRoot);
223
+ const modules = analysis.files
224
+ .filter((file) => /index\.ts$/.test(file))
225
+ .map((file) => path_1.default.relative(repoRoot, file));
226
+ const promptSections = normalizePromptSections(collectPromptSections(["update-readme", "doc", "module"]));
227
+ const testExamples = Object.keys(analysis.tests ?? {});
228
+ const examples = args.includeExamples ? testExamples.slice(0, 20) : [];
229
+ const payload = {
230
+ basePath: path_1.default.relative((0, workspace_1.getWorkspaceRoot)(), repoRoot) || ".",
231
+ summary: {
232
+ modules,
233
+ totalSourceFiles: analysis.files.length,
234
+ totalTestFiles: analysis.testFiles.length,
235
+ hasReadme: Boolean(analysis.readme),
236
+ },
237
+ guidance: promptSections,
238
+ suggestedExamples: examples,
239
+ };
240
+ return {
241
+ content: [
242
+ {
243
+ type: "text",
244
+ text: JSON.stringify(payload, null, 2),
245
+ },
246
+ ],
247
+ };
248
+ },
249
+ };
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL2NvZGV4LXRvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsaURBQTBDO0FBRTFDLDhDQUlvQjtBQU1wQixrREFLc0I7QUFDdEIsc0RBSTRCO0FBRTVCLDBDQUE0RDtBQUM1RCx3Q0FBZ0U7QUFVaEUsU0FBUyxhQUFhLENBQUMsSUFBWSxFQUFFLEtBQWU7SUFDbEQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEtBQXdCO0lBQ3JELE1BQU0sSUFBSSxHQUFHLElBQUEsNEJBQWdCLEdBQUUsQ0FBQztJQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FDekIsSUFBQSw0QkFBa0IsRUFBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUNoRSxDQUFDO0lBQ0YsT0FBTyxLQUFLO1NBQ1QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBdUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4RCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNu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QUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV2RSxNQUFNLE9BQU8sR0FBRztZQUNkLFFBQVEsRUFBRSxjQUFJLENBQUMsUUFBUSxDQUFDLElBQUEsNEJBQWdCLEdBQUUsRUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHO1lBQzVELE9BQU8sRUFBRTtnQkFDUCxPQUFPO2dCQUNQLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDdkMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTTtnQkFDekMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2FBQ3BDO1lBQ0QsUUFBUSxFQUFFLGNBQWM7WUFDeEIsaUJBQWlCLEVBQUUsUUFBUTtTQUM1QixDQUFDO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtTQUNzQixDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRSZXN1bHQsIFRvb2wgfSBmcm9tIFwiZmFzdG1jcFwiO1xuaW1wb3J0IHtcbiAgZG9jdW1lbnRPYmplY3RTY2hlbWEsXG4gIGNvdmVyYWdlVGFza1NjaGVtYSxcbiAgcmVhZG1lSW1wcm92ZW1lbnRTY2hlbWEsXG59IGZyb20gXCIuLi9zY2hlbWFzXCI7XG5pbXBvcnQge1xuICBEb2N1bWVudE9iamVjdEFyZ3MsXG4gIENvdmVyYWdlVGFza0FyZ3MsXG4gIFJlYWRtZUltcHJvdmVtZW50QXJncyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRXb3Jrc3BhY2VSb290LFxuICByZXNvbHZlSW5Xb3Jrc3BhY2UsXG4gIHRocm93VXNlckVycm9yLFxuICBXb3Jrc3BhY2VFcnJvcixcbn0gZnJvbSBcIi4uL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHtcbiAgYnVpbGRPYmplY3RQcm9tcHRzLFxuICBkaXNjb3ZlckRvY1Byb21wdHMsXG4gIGdldE9iamVjdFByb21wdERlcGVuZGVuY2llcyxcbn0gZnJvbSBcIi4uL3Byb21wdHMvcHJvbXB0c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NQcm9tcHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGxpc3RGaWxlc1JlY3Vyc2l2ZSwgcmVhZEZpbGVTYWZlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBhbmFseXplUmVwbywgaXNTb3VyY2VGaWxlLCBpc1Rlc3RGaWxlIH0gZnJvbSBcIi4uL2NvZGVcIjtcblxudHlwZSBQcm9tcHRTZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgYWJzb2x1dGVQYXRoPzogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gcmVsYXRpdmVGaWxlcyhyb290OiBzdHJpbmcsIGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZWxhdGl2ZShyb290LCBmaWxlKSkuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0UHJvbXB0U2VjdGlvbnMobmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbXB0U2VjdGlvbltdIHtcbiAgY29uc3Qgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKTtcbiAgY29uc3QgcHJvbXB0SW5kZXggPSBuZXcgTWFwPHN0cmluZywgRG9jUHJvbXB0PihcbiAgICBkaXNjb3ZlckRvY1Byb21wdHMocm9vdCkubWFwKChwcm9tcHQpID0+IFtwcm9tcHQubmFtZSwgcHJvbXB0XSlcbiAgKTtcbiAgcmV0dXJuIG5hbWVzXG4gICAgLm1hcCgobmFtZSkgPT4gcHJvbXB0SW5kZXguZ2V0KG5hbWUpKVxuICAgIC5maWx0ZXIoKHByb21wdCk6IHByb21wdCBpcyBEb2NQcm9tcHQgPT4gQm9vbGVhbihwcm9tcHQpKVxuICAgIC5tYXAoKHByb21wdCkgPT4gKHtcbiAgICAgIG5hbWU6IHByb21wdC5uYW1lLFxuICAgICAgdGl0bGU6IHByb21wdC50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9tcHQuZGVzY3JpcHRpb24sXG4gICAgICBjb250ZW50OiBwcm9tcHQuY29udGVudCxcbiAgICAgIGFic29sdXRlUGF0aDogcHJvbXB0LmFic29sdXRlUGF0aCxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFza0xpbmVzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IC9edGFza1xccytcXGQrL2kudGVzdChsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVDb3ZlcmFnZUZyb21GaW5hbChjb3ZlcmFnZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY292ZXJhZ2VQYXRoLCBcInV0ZjhcIikpIGFzIFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgczogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICAgIGY6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgICBiOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBudW1iZXJbXT47XG4gICAgfVxuICA+O1xuXG4gIGNvbnN0IHRvdGFscyA9IHtcbiAgICBzdGF0ZW1lbnRzOiB7IGNvdmVyZWQ6IDAsIHRvdGFsOiAwIH0sXG4gICAgZnVuY3Rpb25zOiB7IGNvdmVyZWQ6IDAsIHRvdGFsOiAwIH0sXG4gICAgYnJhbmNoZXM6IHsgY292ZXJlZDogMCwgdG90YWw6IDAgfSxcbiAgfTtcblxuICBjb25zdCBmaWxlcyA9IE9iamVjdC5lbnRyaWVzKHBheWxvYWQpLm1hcCgoW2ZpbGVQYXRoLCBpbmZvXSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudENvdW50cyA9IE9iamVjdC52YWx1ZXMoaW5mby5zKTtcbiAgICBjb25zdCBmdW5jdGlvbkNvdW50cyA9IE9iamVjdC52YWx1ZXMoaW5mby5mKTtcbiAgICBjb25zdCBicmFuY2hDb3VudHMgPSBPYmplY3QudmFsdWVzKGluZm8uYikuZmxhdE1hcCgodmFsdWUpID0+XG4gICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXVxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRUb3RhbCA9IHN0YXRlbWVudENvdW50cy5sZW5ndGg7XG4gICAgY29uc3QgZnVuY3Rpb25Ub3RhbCA9IGZ1bmN0aW9uQ291bnRzLmxlbmd0aDtcbiAgICBjb25zdCBicmFuY2hUb3RhbCA9IGJyYW5jaENvdW50cy5sZW5ndGg7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRDb3ZlcmVkID0gc3RhdGVtZW50Q291bnRzLmZpbHRlcihcbiAgICAgIChjb3VudCkgPT4gY291bnQgPiAwXG4gICAgKS5sZW5ndGg7XG4gICAgY29uc3QgZnVuY3Rpb25Db3ZlcmVkID0gZnVuY3Rpb25Db3VudHMuZmlsdGVyKChjb3VudCkgPT4gY291bnQgPiAwKS5sZW5ndGg7XG4gICAgY29uc3QgYnJhbmNoQ292ZXJlZCA9IGJyYW5jaENvdW50cy5maWx0ZXIoKGNvdW50KSA9PiBjb3VudCA+IDApLmxlbmd0aDtcblxuICAgIHRvdGFscy5zdGF0ZW1lbnRzLmNvdmVyZWQgKz0gc3RhdGVtZW50Q292ZXJlZDtcbiAgICB0b3RhbHMuc3RhdGVtZW50cy50b3RhbCArPSBzdGF0ZW1lbnRUb3RhbDtcbiAgICB0b3RhbHMuZnVuY3Rpb25zLmNvdmVyZWQgKz0gZnVuY3Rpb25Db3ZlcmVkO1xuICAgIHRvdGFscy5mdW5jdGlvbnMudG90YWwgKz0gZnVuY3Rpb25Ub3RhbDtcbiAgICB0b3RhbHMuYnJhbmNoZXMuY292ZXJlZCArPSBicmFuY2hDb3ZlcmVkO1xuICAgIHRvdGFscy5icmFuY2hlcy50b3RhbCArPSBicmFuY2hUb3RhbDtcblxuICAgIGNvbnN0IHBjdCA9IChjb3ZlcmVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgICB0b3RhbCA9PT0gMCA/IDEwMCA6IE51bWJlcigoKGNvdmVyZWQgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMikpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgc3RhdGVtZW50czogcGN0KHN0YXRlbWVudENvdmVyZWQsIHN0YXRlbWVudFRvdGFsKSxcbiAgICAgIGZ1bmN0aW9uczogcGN0KGZ1bmN0aW9uQ292ZXJlZCwgZnVuY3Rpb25Ub3RhbCksXG4gICAgICBicmFuY2hlczogcGN0KGJyYW5jaENvdmVyZWQsIGJyYW5jaFRvdGFsKSxcbiAgICB9O1xuICB9KTtcblxuICBjb25zdCBwY3QgPSAoY292ZXJlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PlxuICAgIHRvdGFsID09PSAwID8gMTAwIDogTnVtYmVyKCgoY292ZXJlZCAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgyKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b3RhbHM6IHtcbiAgICAgIHN0YXRlbWVudHM6IHtcbiAgICAgICAgLi4udG90YWxzLnN0YXRlbWVudHMsXG4gICAgICAgIHBjdDogcGN0KHRvdGFscy5zdGF0ZW1lbnRzLmNvdmVyZWQsIHRvdGFscy5zdGF0ZW1lbnRzLnRvdGFsKSxcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbnM6IHtcbiAgICAgICAgLi4udG90YWxzLmZ1bmN0aW9ucyxcbiAgICAgICAgcGN0OiBwY3QodG90YWxzLmZ1bmN0aW9ucy5jb3ZlcmVkLCB0b3RhbHMuZnVuY3Rpb25zLnRvdGFsKSxcbiAgICAgIH0sXG4gICAgICBicmFuY2hlczoge1xuICAgICAgICAuLi50b3RhbHMuYnJhbmNoZXMsXG4gICAgICAgIHBjdDogcGN0KHRvdGFscy5icmFuY2hlcy5jb3ZlcmVkLCB0b3RhbHMuYnJhbmNoZXMudG90YWwpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGZpbGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQcm9tcHRTZWN0aW9ucyhzZWN0aW9uczogUHJvbXB0U2VjdGlvbltdKSB7XG4gIHJldHVybiBzZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgbmFtZTogc2VjdGlvbi5uYW1lLFxuICAgIHRpdGxlOiBzZWN0aW9uLnRpdGxlLFxuICAgIHRhc2tzOiBwYXJzZVRhc2tMaW5lcyhzZWN0aW9uLmNvbnRlbnQpLFxuICAgIGNvbnRlbnQ6IHNlY3Rpb24uY29udGVudCxcbiAgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1Jvb3QoYmFzZVBhdGg6IHN0cmluZykge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICB0cnkge1xuICAgIHJldHVybiByZXNvbHZlSW5Xb3Jrc3BhY2Uocm9vdCwgYmFzZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtzcGFjZUVycm9yKSB7XG4gICAgICBhd2FpdCB0aHJvd1VzZXJFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY3VtZW50T2JqZWN0VG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBkb2N1bWVudE9iamVjdFNjaGVtYT4gPVxuICB7XG4gICAgbmFtZTogXCJkb2N1bWVudC1vYmplY3RcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQ3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBwbGFuIGZvciBhIHNwZWNpZmljIG9iamVjdCB0eXBlIHVzaW5nIC5jb2RleCBwcm9tcHRzIGFuZCByZXBvc2l0b3J5IGFuYWx5c2lzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGRvY3VtZW50T2JqZWN0U2NoZW1hLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gZG9jdW1lbnRPYmplY3RTY2hlbWEucGFyc2UoaW5wdXQgYXMgRG9jdW1lbnRPYmplY3RBcmdzKTtcbiAgICAgIGNvbnN0IHJlcG9Sb290ID0gYXdhaXQgcmVzb2x2ZVJlcG9Sb290KGFyZ3MuYmFzZVBhdGgpO1xuXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBnZXRPYmplY3RQcm9tcHREZXBlbmRlbmNpZXMoKVthcmdzLm9iamVjdFR5cGVdID8/IFtdO1xuICAgICAgaWYgKCFkZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKFxuICAgICAgICAgIGBObyBwcm9tcHQgZ3VpZGFuY2UgY29uZmlndXJlZCBmb3Igb2JqZWN0IHR5cGUgJHthcmdzLm9iamVjdFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWN0aW9ucyA9IG5vcm1hbGl6ZVByb21wdFNlY3Rpb25zKFxuICAgICAgICBjb2xsZWN0UHJvbXB0U2VjdGlvbnMoZGVwZW5kZW5jaWVzKVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3JjRGlyID0gcGF0aC5qb2luKHJlcG9Sb290LCBcInNyY1wiKTtcbiAgICAgIGNvbnN0IHRlc3REaXIgPSBwYXRoLmpvaW4ocmVwb1Jvb3QsIFwidGVzdHNcIik7XG5cbiAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gZnMuZXhpc3RzU3luYyhzcmNEaXIpXG4gICAgICAgID8gbGlzdEZpbGVzUmVjdXJzaXZlKHNyY0RpciwgaXNTb3VyY2VGaWxlKVxuICAgICAgICA6IFtdO1xuICAgICAgY29uc3QgdGVzdEZpbGVzID0gZnMuZXhpc3RzU3luYyh0ZXN0RGlyKVxuICAgICAgICA/IGxpc3RGaWxlc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgIHRlc3REaXIsXG4gICAgICAgICAgICAoZmlsZSkgPT4gaXNTb3VyY2VGaWxlKGZpbGUpICYmIGlzVGVzdEZpbGUoZmlsZSlcbiAgICAgICAgICApXG4gICAgICAgIDogW107XG5cbiAgICAgIGxldCB0YXJnZXRGaWxlQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyZ3MudGFyZ2V0RmlsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcmVzb2x2ZUluV29ya3NwYWNlKHJlcG9Sb290LCBhcmdzLnRhcmdldEZpbGUpO1xuICAgICAgICAgIHRhcmdldEZpbGVDb250ZW50ID0gcmVhZEZpbGVTYWZlKGFic29sdXRlKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya3NwYWNlRXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBiYXNlUGF0aDogcGF0aC5yZWxhdGl2ZShnZXRXb3Jrc3BhY2VSb290KCksIHJlcG9Sb290KSB8fCBcIi5cIixcbiAgICAgICAgb2JqZWN0VHlwZTogYXJncy5vYmplY3RUeXBlLFxuICAgICAgICB0YXJnZXRGaWxlOiBhcmdzLnRhcmdldEZpbGUsXG4gICAgICAgIGd1aWRhbmNlOiBzZWN0aW9ucyxcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBzb3VyY2U6IHJlbGF0aXZlRmlsZXMocmVwb1Jvb3QsIHNvdXJjZUZpbGVzKSxcbiAgICAgICAgICB0ZXN0czogcmVsYXRpdmVGaWxlcyhyZXBvUm9vdCwgdGVzdEZpbGVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0RmlsZUNvbnRlbnQ6IGFyZ3MuaW5jbHVkZUNvbnRlbnQgPyB0YXJnZXRGaWxlQ29udGVudCA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9IHNhdGlzZmllcyBDb250ZW50UmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbmV4cG9ydCBjb25zdCBjb3ZlcmFnZUVuZm9yY2VyVG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBjb3ZlcmFnZVRhc2tTY2hlbWE+ID1cbiAge1xuICAgIG5hbWU6IFwiZW5zdXJlLXRlc3QtY292ZXJhZ2VcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUnVuIHRoZSBjb25maWd1cmVkIGNvdmVyYWdlIGNvbW1hbmQgYW5kIHJlcG9ydCB3aGV0aGVyIHRoZSB0YXJnZXQgcGVyY2VudGFnZSBpcyBtZXQsIGhpZ2hsaWdodGluZyB3ZWFrIGZpbGVzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGNvdmVyYWdlVGFza1NjaGVtYSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBfY29udGV4dCk6IFByb21pc2U8Q29udGVudFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgYXJncyA9IGNvdmVyYWdlVGFza1NjaGVtYS5wYXJzZShpbnB1dCBhcyBDb3ZlcmFnZVRhc2tBcmdzKTtcbiAgICAgIGNvbnN0IHJlcG9Sb290ID0gYXdhaXQgcmVzb2x2ZVJlcG9Sb290KGFyZ3MuYmFzZVBhdGgpO1xuXG4gICAgICBpZiAoIWFyZ3MuZHJ5UnVuKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBVU0VfV0FUQ0hNQU46IFwiZmFsc2VcIixcbiAgICAgICAgICBXQVRDSE1BTl9ESVNBQkxFOiBcIjFcIixcbiAgICAgICAgICBKRVNUX0RJU0FCTEVfV0FUQ0hNQU46IFwiMVwiLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXG4gICAgICAgICAgXCJucG1cIixcbiAgICAgICAgICBbXCJydW5cIiwgXCJjb3ZlcmFnZVwiLCBcIi0tXCIsIFwiLS13YXRjaG1hbj1mYWxzZVwiLCBcIi0tcnVuSW5CYW5kXCJdLFxuICAgICAgICAgIHsgY3dkOiByZXBvUm9vdCwgZW52LCBlbmNvZGluZzogXCJ1dGY4XCIgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgICByZXN1bHQuc3RkZXJyIHx8IHJlc3VsdC5zdGRvdXQgfHwgXCJDb3ZlcmFnZSBjb21tYW5kIGZhaWxlZFwiO1xuICAgICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKG1lc3NhZ2UudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb3ZlcmFnZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHJlcG9Sb290LFxuICAgICAgICBcIndvcmtkb2NzXCIsXG4gICAgICAgIFwicmVwb3J0c1wiLFxuICAgICAgICBcImNvdmVyYWdlXCIsXG4gICAgICAgIFwiY292ZXJhZ2UtZmluYWwuanNvblwiXG4gICAgICApO1xuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY292ZXJhZ2VQYXRoKSkge1xuICAgICAgICBhd2FpdCB0aHJvd1VzZXJFcnJvcihcbiAgICAgICAgICBgQ292ZXJhZ2UgcmVwb3J0IG5vdCBmb3VuZCBhdCAke3BhdGgucmVsYXRpdmUocmVwb1Jvb3QsIGNvdmVyYWdlUGF0aCl9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdW1tYXJ5ID0gY29tcHV0ZUNvdmVyYWdlRnJvbUZpbmFsKGNvdmVyYWdlUGF0aCk7XG4gICAgICBjb25zdCBtZWV0c1RocmVzaG9sZCA9XG4gICAgICAgIHN1bW1hcnkudG90YWxzLnN0YXRlbWVudHMucGN0ID49IGFyZ3MuY292ZXJhZ2UgJiZcbiAgICAgICAgc3VtbWFyeS50b3RhbHMuZnVuY3Rpb25zLnBjdCA+PSBhcmdzLmNvdmVyYWdlICYmXG4gICAgICAgIHN1bW1hcnkudG90YWxzLmJyYW5jaGVzLnBjdCA+PSBhcmdzLmNvdmVyYWdlO1xuXG4gICAgICBjb25zdCB3ZWFrZXN0ID0gWy4uLnN1bW1hcnkuZmlsZXNdXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnN0YXRlbWVudHMgLSBiLnN0YXRlbWVudHMpXG4gICAgICAgIC5zbGljZSgwLCAxMCk7XG5cbiAgICAgIGNvbnN0IGd1aWRhbmNlID0gbm9ybWFsaXplUHJvbXB0U2VjdGlvbnMoXG4gICAgICAgIGNvbGxlY3RQcm9tcHRTZWN0aW9ucyhbXCJidWxrLXRlc3RzXCJdKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgYmFzZVBhdGg6IHBhdGgucmVsYXRpdmUoZ2V0V29ya3NwYWNlUm9vdCgpLCByZXBvUm9vdCkgfHwgXCIuXCIsXG4gICAgICAgIHRhcmdldDogYXJncy5jb3ZlcmFnZSxcbiAgICAgICAgbWVldHNUaHJlc2hvbGQsXG4gICAgICAgIHRvdGFsczogc3VtbWFyeS50b3RhbHMsXG4gICAgICAgIHdlYWtlc3QsXG4gICAgICAgIGd1aWRhbmNlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMiksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0gc2F0aXNmaWVzIENvbnRlbnRSZXN1bHQ7XG4gICAgfSxcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHJlYWRtZUltcHJvdmVtZW50VG9vbDogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgcmVhZG1lSW1wcm92ZW1lbnRTY2hlbWFcbj4gPSB7XG4gIG5hbWU6IFwiaW1wcm92ZS1yZWFkbWVcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJTdW1tYXJpemUgcmVxdWlyZWQgc3RlcHMgdG8gcmVmcmVzaCBSRUFETUUgYW5kIHdvcmtkb2NzIGNvbnRlbnQgdXNpbmcgLmNvZGV4IGd1aWRhbmNlIGFuZCByZXBvc2l0b3J5IGFuYWx5c2lzLlwiLFxuICBwYXJhbWV0ZXJzOiByZWFkbWVJbXByb3ZlbWVudFNjaGVtYSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgYXJncyA9IHJlYWRtZUltcHJvdmVtZW50U2NoZW1hLnBhcnNlKGlucHV0IGFzIFJlYWRtZUltcHJvdmVtZW50QXJncyk7XG4gICAgY29uc3QgcmVwb1Jvb3QgPSBhd2FpdCByZXNvbHZlUmVwb1Jvb3QoYXJncy5iYXNlUGF0aCk7XG5cbiAgICBjb25zdCBhbmFseXNpcyA9IGFuYWx5emVSZXBvKHJlcG9Sb290KTtcbiAgICBjb25zdCBtb2R1bGVzID0gYW5hbHlzaXMuZmlsZXNcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IC9pbmRleFxcLnRzJC8udGVzdChmaWxlKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUocmVwb1Jvb3QsIGZpbGUpKTtcblxuICAgIGNvbnN0IHByb21wdFNlY3Rpb25zID0gbm9ybWFsaXplUHJvbXB0U2VjdGlvbnMoXG4gICAgICBjb2xsZWN0UHJvbXB0U2VjdGlvbnMoW1widXBkYXRlLXJlYWRtZVwiLCBcImRvY1wiLCBcIm1vZHVsZVwiXSlcbiAgICApO1xuXG4gICAgY29uc3QgdGVzdEV4YW1wbGVzID0gT2JqZWN0LmtleXMoYW5hbHlzaXMudGVzdHMgPz8ge30pO1xuICAgIGNvbnN0IGV4YW1wbGVzID0gYXJncy5pbmNsdWRlRXhhbXBsZXMgPyB0ZXN0RXhhbXBsZXMuc2xpY2UoMCwgMjApIDogW107XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYmFzZVBhdGg6IHBhdGgucmVsYXRpdmUoZ2V0V29ya3NwYWNlUm9vdCgpLCByZXBvUm9vdCkgfHwgXCIuXCIsXG4gICAgICBzdW1tYXJ5OiB7XG4gICAgICAgIG1vZHVsZXMsXG4gICAgICAgIHRvdGFsU291cmNlRmlsZXM6IGFuYWx5c2lzLmZpbGVzLmxlbmd0aCxcbiAgICAgICAgdG90YWxUZXN0RmlsZXM6IGFuYWx5c2lzLnRlc3RGaWxlcy5sZW5ndGgsXG4gICAgICAgIGhhc1JlYWRtZTogQm9vbGVhbihhbmFseXNpcy5yZWFkbWUpLFxuICAgICAgfSxcbiAgICAgIGd1aWRhbmNlOiBwcm9tcHRTZWN0aW9ucyxcbiAgICAgIHN1Z2dlc3RlZEV4YW1wbGVzOiBleGFtcGxlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9IHNhdGlzZmllcyBDb250ZW50UmVzdWx0O1xuICB9LFxufTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import type { Tool } from "fastmcp";
2
+ import { documentObjectSchema, coverageTaskSchema, readmeImprovementSchema } from "../schemas";
3
+ export declare const documentObjectTool: Tool<undefined, typeof documentObjectSchema>;
4
+ export declare const coverageEnforcerTool: Tool<undefined, typeof coverageTaskSchema>;
5
+ export declare const readmeImprovementTool: Tool<undefined, typeof readmeImprovementSchema>;
@@ -0,0 +1,139 @@
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.generateMcpModuleTool = void 0;
7
+ // New tool: generate-mcp-module
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const zod_1 = require("zod");
11
+ const workspace_1 = require("./../workspace.cjs");
12
+ const code_1 = require("./../code.cjs");
13
+ const scaffoldModule_1 = require("./../validation/scaffoldModule.cjs");
14
+ const generateSchema = zod_1.z.object({
15
+ repoPath: zod_1.z.string().optional().default("."),
16
+ moduleName: zod_1.z.string().optional(),
17
+ includeDocs: zod_1.z.boolean().default(true),
18
+ });
19
+ exports.generateMcpModuleTool = {
20
+ name: "generate-mcp-module",
21
+ description: "Generate a minimal MCP module under src/modules/<name> by analyzing a target repository and exporting prompts, resources, templates and tools.",
22
+ parameters: generateSchema,
23
+ execute: async (input) => {
24
+ const args = generateSchema.parse(input);
25
+ const root = (0, workspace_1.getWorkspaceRoot)();
26
+ let repoRoot = path_1.default.resolve(process.cwd(), args.repoPath || ".");
27
+ if (!fs_1.default.existsSync(repoRoot)) {
28
+ const alt = path_1.default.resolve(process.cwd(), "..", args.repoPath);
29
+ if (fs_1.default.existsSync(alt))
30
+ repoRoot = alt;
31
+ }
32
+ if (!fs_1.default.existsSync(repoRoot)) {
33
+ const alt2 = path_1.default.resolve(process.cwd(), "..", path_1.default.basename(args.repoPath));
34
+ if (fs_1.default.existsSync(alt2))
35
+ repoRoot = alt2;
36
+ }
37
+ if (!fs_1.default.existsSync(repoRoot))
38
+ throw new Error(`Repository not found at ${repoRoot}`);
39
+ const analysis = (0, code_1.analyzeRepo)(repoRoot);
40
+ const inferredName = args.moduleName ?? path_1.default.basename(path_1.default.resolve(repoRoot));
41
+ const moduleRoot = path_1.default.join(root, "src", "modules", inferredName);
42
+ // Use existing scaffold to create folders
43
+ (0, scaffoldModule_1.scaffoldModule)(root, inferredName);
44
+ // populate prompts: copy markdown prompts from README.md and docs/
45
+ const promptsDir = path_1.default.join(moduleRoot, "prompts");
46
+ const resourcesDir = path_1.default.join(moduleRoot, "resources");
47
+ const templatesDir = path_1.default.join(moduleRoot, "templates");
48
+ const toolsDir = path_1.default.join(moduleRoot, "tools");
49
+ // helper to write an index.ts that exports arrays
50
+ function writeIndex(dir, varName, items) {
51
+ const p = path_1.default.join(dir, "index.ts");
52
+ const content = `export const ${varName} = ${items} as const;\n`;
53
+ fs_1.default.writeFileSync(p, content, { encoding: "utf8" });
54
+ }
55
+ // Prompts: create a simple prompt from README and any .md in docs
56
+ const promptAssets = [];
57
+ if (args.includeDocs) {
58
+ const readme = path_1.default.join(repoRoot, "README.md");
59
+ if (fs_1.default.existsSync(readme)) {
60
+ const content = fs_1.default.readFileSync(readme, "utf8");
61
+ const id = "readme";
62
+ const promptPath = path_1.default.join(promptsDir, `${id}.md`);
63
+ fs_1.default.writeFileSync(promptPath, content, { encoding: "utf8" });
64
+ promptAssets.push({
65
+ id,
66
+ title: "README",
67
+ description: "Repository README",
68
+ absolutePath: promptPath,
69
+ load: () => content,
70
+ });
71
+ }
72
+ const docsDir = path_1.default.join(repoRoot, "docs");
73
+ if (fs_1.default.existsSync(docsDir) && fs_1.default.statSync(docsDir).isDirectory()) {
74
+ for (const f of fs_1.default.readdirSync(docsDir)) {
75
+ if (!f.endsWith(".md"))
76
+ continue;
77
+ const content = fs_1.default.readFileSync(path_1.default.join(docsDir, f), "utf8");
78
+ const id = path_1.default.parse(f).name;
79
+ const promptPath = path_1.default.join(promptsDir, `${id}.md`);
80
+ fs_1.default.writeFileSync(promptPath, content, { encoding: "utf8" });
81
+ promptAssets.push({
82
+ id,
83
+ title: id,
84
+ description: content.split(/\r?\n/)[0] || "",
85
+ absolutePath: promptPath,
86
+ load: () => content,
87
+ });
88
+ }
89
+ }
90
+ }
91
+ writeIndex(promptsDir, "prompts", JSON.stringify(promptAssets, null, 2));
92
+ // Resources: reference the repo root and docs
93
+ const resourceAssets = [
94
+ {
95
+ id: `${inferredName}.repo`,
96
+ name: `${inferredName} repository`,
97
+ description: "Source repository",
98
+ uri: `file://${repoRoot}`,
99
+ absolutePath: repoRoot,
100
+ },
101
+ ];
102
+ writeIndex(resourcesDir, "resources", JSON.stringify(resourceAssets, null, 2));
103
+ // Templates: create a placeholder template that references README
104
+ const templateAssets = [
105
+ {
106
+ name: "readme-template",
107
+ description: "README as guidance",
108
+ uriTemplate: `file://${path_1.default.join(repoRoot, "README.md")}`,
109
+ mimeType: "text/markdown",
110
+ },
111
+ ];
112
+ writeIndex(templatesDir, "templates", JSON.stringify(templateAssets, null, 2));
113
+ // Tools: create a wrapper tool that exposes analyze/enumerate for the module
114
+ const toolIndexPath = path_1.default.join(toolsDir, "index.ts");
115
+ const toolContent = `import type { Tool } from 'fastmcp';\nimport { buildAnalyzeRepositoryTool, buildEnumerateCapabilitiesTool, buildPlanFeatureTool } from '../../../mcp/tools/tools';\nexport const tools = [\n { id: '${inferredName}.analyze', title: 'Analyze ${inferredName}', description: 'Analyze the target repository', tool: buildAnalyzeRepositoryTool() },\n { id: '${inferredName}.enumerate', title: 'Enumerate capabilities for ${inferredName}', description: 'Enumerate capabilities', tool: buildEnumerateCapabilitiesTool() },\n { id: '${inferredName}.plan', title: 'Plan features for ${inferredName}', description: 'Plan feature implementation', tool: buildPlanFeatureTool() },\n] as const;\n`;
116
+ fs_1.default.writeFileSync(toolIndexPath, toolContent, { encoding: "utf8" });
117
+ // Write module index.ts
118
+ const moduleIndex = path_1.default.join(moduleRoot, "index.ts");
119
+ const moduleIndexContent = `import { prompts } from './prompts';\nimport { resources } from './resources';\nimport { templates } from './templates';\nimport { tools } from './tools';\nexport { prompts } from './prompts';\nexport { resources } from './resources';\nexport { templates } from './templates';\nexport { tools } from './tools';\nexport const modulePackage = { name: '${inferredName}', prompts, resources, templates, tools } as const;\n`;
120
+ fs_1.default.writeFileSync(moduleIndex, moduleIndexContent, { encoding: "utf8" });
121
+ return {
122
+ content: [
123
+ {
124
+ type: "text",
125
+ text: JSON.stringify({
126
+ moduleRoot,
127
+ inferredName,
128
+ analysisSummary: {
129
+ files: analysis.files.length,
130
+ testFiles: analysis.testFiles.length,
131
+ },
132
+ }, null, 2),
133
+ },
134
+ ],
135
+ };
136
+ },
137
+ };
138
+ exports.default = exports.generateMcpModuleTool;
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVNY3BNb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL2dlbmVyYXRlTWNwTW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdDQUFnQztBQUNoQyw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBRXhCLDZCQUF3QjtBQUN4QixrREFBZ0Q7QUFDaEQsd0NBQXNDO0FBQ3RDLHVFQUE4RDtBQUU5RCxNQUFNLGNBQWMsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlCLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM1QyxVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNqQyxXQUFXLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Q0FDdkMsQ0FBQyxDQUFDO0FBSVUsUUFBQSxxQkFBcUIsR0FBMkM7SUFDM0UsSUFBSSxFQUFFLHFCQUFxQjtJQUMzQixXQUFXLEVBQ1QsZ0pBQWdKO0lBQ2xKLFVBQVUsRUFBRSxjQUFjO0lBQzFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFZLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxJQUFBLDRCQUFnQixHQUFFLENBQUM7UUFDaEMsSUFBSSxRQUFRLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsWUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sR0FBRyxHQUFHLGNBQUksQ0FBQyxP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LEdBQUcsd01BQXdNLFlBQVksOEJBQThCLFlBQVksb0dBQW9HLFlBQVksbURBQW1ELFlBQVksaUdBQWlHLFlBQVkscUNBQXFDLFlBQVksK0ZBQStGLENBQUM7UUFDL3JCLFlBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRW5FLHdCQUF3QjtRQUN4QixNQUFNLFdBQVcsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RCxNQUFNLGtCQUFrQixHQUFHLGlXQUFpVyxZQUFZLHVEQUF1RCxDQUFDO1FBQ2hjLFlBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFeEUsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDbEI7d0JBQ0UsVUFBVTt3QkFDVixZQUFZO3dCQUNaLGVBQWUsRUFBRTs0QkFDZixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNOzRCQUM1QixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNO3lCQUNyQztxQkFDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLGtCQUFlLDZCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTmV3IHRvb2w6IGdlbmVyYXRlLW1jcC1tb2R1bGVcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiZmFzdG1jcFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZVJvb3QgfSBmcm9tIFwiLi4vd29ya3NwYWNlXCI7XG5pbXBvcnQgeyBhbmFseXplUmVwbyB9IGZyb20gXCIuLi9jb2RlXCI7XG5pbXBvcnQgeyBzY2FmZm9sZE1vZHVsZSB9IGZyb20gXCIuLi92YWxpZGF0aW9uL3NjYWZmb2xkTW9kdWxlXCI7XG5cbmNvbnN0IGdlbmVyYXRlU2NoZW1hID0gei5vYmplY3Qoe1xuICByZXBvUGF0aDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlZmF1bHQoXCIuXCIpLFxuICBtb2R1bGVOYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGluY2x1ZGVEb2NzOiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxufSk7XG5cbnR5cGUgR2VuZXJhdGVBcmdzID0gei5pbmZlcjx0eXBlb2YgZ2VuZXJhdGVTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNY3BNb2R1bGVUb29sOiBUb29sPHVuZGVmaW5lZCwgdHlwZW9mIGdlbmVyYXRlU2NoZW1hPiA9IHtcbiAgbmFtZTogXCJnZW5lcmF0ZS1tY3AtbW9kdWxlXCIsXG4gIGRlc2NyaXB0aW9uOlxuICAgIFwiR2VuZXJhdGUgYSBtaW5pbWFsIE1DUCBtb2R1bGUgdW5kZXIgc3JjL21vZHVsZXMvPG5hbWU+IGJ5IGFuYWx5emluZyBhIHRhcmdldCByZXBvc2l0b3J5IGFuZCBleHBvcnRpbmcgcHJvbXB0cywgcmVzb3VyY2VzLCB0ZW1wbGF0ZXMgYW5kIHRvb2xzLlwiLFxuICBwYXJhbWV0ZXJzOiBnZW5lcmF0ZVNjaGVtYSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgY29uc3QgYXJncyA9IGdlbmVyYXRlU2NoZW1hLnBhcnNlKGlucHV0IGFzIGFueSk7XG4gICAgY29uc3Qgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKTtcbiAgICBsZXQgcmVwb1Jvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYXJncy5yZXBvUGF0aCB8fCBcIi5cIik7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgY29uc3QgYWx0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIFwiLi5cIiwgYXJncy5yZXBvUGF0aCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhhbHQpKSByZXBvUm9vdCA9IGFsdDtcbiAgICB9XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSkge1xuICAgICAgY29uc3QgYWx0MiA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgXCIuLlwiLFxuICAgICAgICBwYXRoLmJhc2VuYW1lKGFyZ3MucmVwb1BhdGgpXG4gICAgICApO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0MikpIHJlcG9Sb290ID0gYWx0MjtcbiAgICB9XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcG9Sb290KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3NpdG9yeSBub3QgZm91bmQgYXQgJHtyZXBvUm9vdH1gKTtcblxuICAgIGNvbnN0IGFuYWx5c2lzID0gYW5hbHl6ZVJlcG8ocmVwb1Jvb3QpO1xuICAgIGNvbnN0IGluZmVycmVkTmFtZSA9XG4gICAgICBhcmdzLm1vZHVsZU5hbWUgPz8gcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocmVwb1Jvb3QpKTtcbiAgICBjb25zdCBtb2R1bGVSb290ID0gcGF0aC5qb2luKHJvb3QsIFwic3JjXCIsIFwibW9kdWxlc1wiLCBpbmZlcnJlZE5hbWUpO1xuXG4gICAgLy8gVXNlIGV4aXN0aW5nIHNjYWZmb2xkIHRvIGNyZWF0ZSBmb2xkZXJzXG4gICAgc2NhZmZvbGRNb2R1bGUocm9vdCwgaW5mZXJyZWROYW1lKTtcblxuICAgIC8vIHBvcHVsYXRlIHByb21wdHM6IGNvcHkgbWFya2Rvd24gcHJvbXB0cyBmcm9tIFJFQURNRS5tZCBhbmQgZG9jcy9cbiAgICBjb25zdCBwcm9tcHRzRGlyID0gcGF0aC5qb2luKG1vZHVsZVJvb3QsIFwicHJvbXB0c1wiKTtcbiAgICBjb25zdCByZXNvdXJjZXNEaXIgPSBwYXRoLmpvaW4obW9kdWxlUm9vdCwgXCJyZXNvdXJjZXNcIik7XG4gICAgY29uc3QgdGVtcGxhdGVzRGlyID0gcGF0aC5qb2luKG1vZHVsZVJvb3QsIFwidGVtcGxhdGVzXCIpO1xuICAgIGNvbnN0IHRvb2xzRGlyID0gcGF0aC5qb2luKG1vZHVsZVJvb3QsIFwidG9vbHNcIik7XG5cbiAgICAvLyBoZWxwZXIgdG8gd3JpdGUgYW4gaW5kZXgudHMgdGhhdCBleHBvcnRzIGFycmF5c1xuICAgIGZ1bmN0aW9uIHdyaXRlSW5kZXgoZGlyOiBzdHJpbmcsIHZhck5hbWU6IHN0cmluZywgaXRlbXM6IHN0cmluZykge1xuICAgICAgY29uc3QgcCA9IHBhdGguam9pbihkaXIsIFwiaW5kZXgudHNcIik7XG4gICAgICBjb25zdCBjb250ZW50ID0gYGV4cG9ydCBjb25zdCAke3Zhck5hbWV9ID0gJHtpdGVtc30gYXMgY29uc3Q7XFxuYDtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocCwgY29udGVudCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvbXB0czogY3JlYXRlIGEgc2ltcGxlIHByb21wdCBmcm9tIFJFQURNRSBhbmQgYW55IC5tZCBpbiBkb2NzXG4gICAgY29uc3QgcHJvbXB0QXNzZXRzOiBhbnlbXSA9IFtdO1xuICAgIGlmIChhcmdzLmluY2x1ZGVEb2NzKSB7XG4gICAgICBjb25zdCByZWFkbWUgPSBwYXRoLmpvaW4ocmVwb1Jvb3QsIFwiUkVBRE1FLm1kXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocmVhZG1lKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHJlYWRtZSwgXCJ1dGY4XCIpO1xuICAgICAgICBjb25zdCBpZCA9IFwicmVhZG1lXCI7XG4gICAgICAgIGNvbnN0IHByb21wdFBhdGggPSBwYXRoLmpvaW4ocHJvbXB0c0RpciwgYCR7aWR9Lm1kYCk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocHJvbXB0UGF0aCwgY29udGVudCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgICAgIHByb21wdEFzc2V0cy5wdXNoKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICB0aXRsZTogXCJSRUFETUVcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IFJFQURNRVwiLFxuICAgICAgICAgIGFic29sdXRlUGF0aDogcHJvbXB0UGF0aCxcbiAgICAgICAgICBsb2FkOiAoKSA9PiBjb250ZW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvY3NEaXIgPSBwYXRoLmpvaW4ocmVwb1Jvb3QsIFwiZG9jc1wiKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGRvY3NEaXIpICYmIGZzLnN0YXRTeW5jKGRvY3NEaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIGZzLnJlYWRkaXJTeW5jKGRvY3NEaXIpKSB7XG4gICAgICAgICAgaWYgKCFmLmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkb2NzRGlyLCBmKSwgXCJ1dGY4XCIpO1xuICAgICAgICAgIGNvbnN0IGlkID0gcGF0aC5wYXJzZShmKS5uYW1lO1xuICAgICAgICAgIGNvbnN0IHByb21wdFBhdGggPSBwYXRoLmpvaW4ocHJvbXB0c0RpciwgYCR7aWR9Lm1kYCk7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwcm9tcHRQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcbiAgICAgICAgICBwcm9tcHRBc3NldHMucHVzaCh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHRpdGxlOiBpZCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb250ZW50LnNwbGl0KC9cXHI/XFxuLylbMF0gfHwgXCJcIixcbiAgICAgICAgICAgIGFic29sdXRlUGF0aDogcHJvbXB0UGF0aCxcbiAgICAgICAgICAgIGxvYWQ6ICgpID0+IGNvbnRlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZUluZGV4KHByb21wdHNEaXIsIFwicHJvbXB0c1wiLCBKU09OLnN0cmluZ2lmeShwcm9tcHRBc3NldHMsIG51bGwsIDIpKTtcblxuICAgIC8vIFJlc291cmNlczogcmVmZXJlbmNlIHRoZSByZXBvIHJvb3QgYW5kIGRvY3NcbiAgICBjb25zdCByZXNvdXJjZUFzc2V0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IGAke2luZmVycmVkTmFtZX0ucmVwb2AsXG4gICAgICAgIG5hbWU6IGAke2luZmVycmVkTmFtZX0gcmVwb3NpdG9yeWAsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlNvdXJjZSByZXBvc2l0b3J5XCIsXG4gICAgICAgIHVyaTogYGZpbGU6Ly8ke3JlcG9Sb290fWAsXG4gICAgICAgIGFic29sdXRlUGF0aDogcmVwb1Jvb3QsXG4gICAgICB9LFxuICAgIF07XG4gICAgd3JpdGVJbmRleChcbiAgICAgIHJlc291cmNlc0RpcixcbiAgICAgIFwicmVzb3VyY2VzXCIsXG4gICAgICBKU09OLnN0cmluZ2lmeShyZXNvdXJjZUFzc2V0cywgbnVsbCwgMilcbiAgICApO1xuXG4gICAgLy8gVGVtcGxhdGVzOiBjcmVhdGUgYSBwbGFjZWhvbGRlciB0ZW1wbGF0ZSB0aGF0IHJlZmVyZW5jZXMgUkVBRE1FXG4gICAgY29uc3QgdGVtcGxhdGVBc3NldHMgPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVhZG1lLXRlbXBsYXRlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJFQURNRSBhcyBndWlkYW5jZVwiLFxuICAgICAgICB1cmlUZW1wbGF0ZTogYGZpbGU6Ly8ke3BhdGguam9pbihyZXBvUm9vdCwgXCJSRUFETUUubWRcIil9YCxcbiAgICAgICAgbWltZVR5cGU6IFwidGV4dC9tYXJrZG93blwiLFxuICAgICAgfSxcbiAgICBdO1xuICAgIHdyaXRlSW5kZXgoXG4gICAgICB0ZW1wbGF0ZXNEaXIsXG4gICAgICBcInRlbXBsYXRlc1wiLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodGVtcGxhdGVBc3NldHMsIG51bGwsIDIpXG4gICAgKTtcblxuICAgIC8vIFRvb2xzOiBjcmVhdGUgYSB3cmFwcGVyIHRvb2wgdGhhdCBleHBvc2VzIGFuYWx5emUvZW51bWVyYXRlIGZvciB0aGUgbW9kdWxlXG4gICAgY29uc3QgdG9vbEluZGV4UGF0aCA9IHBhdGguam9pbih0b29sc0RpciwgXCJpbmRleC50c1wiKTtcbiAgICBjb25zdCB0b29sQ29udGVudCA9IGBpbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tICdmYXN0bWNwJztcXG5pbXBvcnQgeyBidWlsZEFuYWx5emVSZXBvc2l0b3J5VG9vbCwgYnVpbGRFbnVtZXJhdGVDYXBhYmlsaXRpZXNUb29sLCBidWlsZFBsYW5GZWF0dXJlVG9vbCB9IGZyb20gJy4uLy4uLy4uL21jcC90b29scy90b29scyc7XFxuZXhwb3J0IGNvbnN0IHRvb2xzID0gW1xcbiAgeyBpZDogJyR7aW5mZXJyZWROYW1lfS5hbmFseXplJywgdGl0bGU6ICdBbmFseXplICR7aW5mZXJyZWROYW1lfScsIGRlc2NyaXB0aW9uOiAnQW5hbHl6ZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnknLCB0b29sOiBidWlsZEFuYWx5emVSZXBvc2l0b3J5VG9vbCgpIH0sXFxuICB7IGlkOiAnJHtpbmZlcnJlZE5hbWV9LmVudW1lcmF0ZScsIHRpdGxlOiAnRW51bWVyYXRlIGNhcGFiaWxpdGllcyBmb3IgJHtpbmZlcnJlZE5hbWV9JywgZGVzY3JpcHRpb246ICdFbnVtZXJhdGUgY2FwYWJpbGl0aWVzJywgdG9vbDogYnVpbGRFbnVtZXJhdGVDYXBhYmlsaXRpZXNUb29sKCkgfSxcXG4gIHsgaWQ6ICcke2luZmVycmVkTmFtZX0ucGxhbicsIHRpdGxlOiAnUGxhbiBmZWF0dXJlcyBmb3IgJHtpbmZlcnJlZE5hbWV9JywgZGVzY3JpcHRpb246ICdQbGFuIGZlYXR1cmUgaW1wbGVtZW50YXRpb24nLCB0b29sOiBidWlsZFBsYW5GZWF0dXJlVG9vbCgpIH0sXFxuXSBhcyBjb25zdDtcXG5gO1xuICAgIGZzLndyaXRlRmlsZVN5bmModG9vbEluZGV4UGF0aCwgdG9vbENvbnRlbnQsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuXG4gICAgLy8gV3JpdGUgbW9kdWxlIGluZGV4LnRzXG4gICAgY29uc3QgbW9kdWxlSW5kZXggPSBwYXRoLmpvaW4obW9kdWxlUm9vdCwgXCJpbmRleC50c1wiKTtcbiAgICBjb25zdCBtb2R1bGVJbmRleENvbnRlbnQgPSBgaW1wb3J0IHsgcHJvbXB0cyB9IGZyb20gJy4vcHJvbXB0cyc7XFxuaW1wb3J0IHsgcmVzb3VyY2VzIH0gZnJvbSAnLi9yZXNvdXJjZXMnO1xcbmltcG9ydCB7IHRlbXBsYXRlcyB9IGZyb20gJy4vdGVtcGxhdGVzJztcXG5pbXBvcnQgeyB0b29scyB9IGZyb20gJy4vdG9vbHMnO1xcbmV4cG9ydCB7IHByb21wdHMgfSBmcm9tICcuL3Byb21wdHMnO1xcbmV4cG9ydCB7IHJlc291cmNlcyB9IGZyb20gJy4vcmVzb3VyY2VzJztcXG5leHBvcnQgeyB0ZW1wbGF0ZXMgfSBmcm9tICcuL3RlbXBsYXRlcyc7XFxuZXhwb3J0IHsgdG9vbHMgfSBmcm9tICcuL3Rvb2xzJztcXG5leHBvcnQgY29uc3QgbW9kdWxlUGFja2FnZSA9IHsgbmFtZTogJyR7aW5mZXJyZWROYW1lfScsIHByb21wdHMsIHJlc291cmNlcywgdGVtcGxhdGVzLCB0b29scyB9IGFzIGNvbnN0O1xcbmA7XG4gICAgZnMud3JpdGVGaWxlU3luYyhtb2R1bGVJbmRleCwgbW9kdWxlSW5kZXhDb250ZW50LCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbW9kdWxlUm9vdCxcbiAgICAgICAgICAgICAgaW5mZXJyZWROYW1lLFxuICAgICAgICAgICAgICBhbmFseXNpc1N1bW1hcnk6IHtcbiAgICAgICAgICAgICAgICBmaWxlczogYW5hbHlzaXMuZmlsZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHRlc3RGaWxlczogYW5hbHlzaXMudGVzdEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMlxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZW5lcmF0ZU1jcE1vZHVsZVRvb2w7XG4iXX0=
@@ -0,0 +1,9 @@
1
+ import type { Tool } from "fastmcp";
2
+ import { z } from "zod";
3
+ declare const generateSchema: z.ZodObject<{
4
+ repoPath: z.ZodDefault<z.ZodOptional<z.ZodString>>;
5
+ moduleName: z.ZodOptional<z.ZodString>;
6
+ includeDocs: z.ZodDefault<z.ZodBoolean>;
7
+ }, z.core.$strip>;
8
+ export declare const generateMcpModuleTool: Tool<undefined, typeof generateSchema>;
9
+ export default generateMcpModuleTool;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.decoratorTools = exports.tools = exports.decoratorToolList = exports.toolList = void 0;
18
+ const decorator_tools_1 = require("./../decorator-tools.cjs");
19
+ Object.defineProperty(exports, "decoratorTools", { enumerable: true, get: function () { return decorator_tools_1.decoratorTools; } });
20
+ const moduleRegistry_1 = require("./../moduleRegistry.cjs");
21
+ const tools_1 = require("./tools.cjs");
22
+ const codex_tools_1 = require("./codex-tools.cjs");
23
+ __exportStar(require("./tools.cjs"), exports);
24
+ __exportStar(require("./codex-tools.cjs"), exports);
25
+ __exportStar(require("./generateMcpModule.cjs"), exports);
26
+ const codexToolList = [
27
+ codex_tools_1.documentObjectTool,
28
+ codex_tools_1.coverageEnforcerTool,
29
+ codex_tools_1.readmeImprovementTool,
30
+ ];
31
+ const moduleToolList = moduleRegistry_1.moduleRegistry.listTools().map((asset) => asset.tool);
32
+ exports.toolList = [...tools_1.toolList, ...codexToolList, ...moduleToolList];
33
+ exports.decoratorToolList = Object.values(decorator_tools_1.decoratorTools);
34
+ const [analyzeRepositoryTool, enumerateCapabilitiesTool, planFeatureTool, documentCodeToolRef, applyCodeChangeToolRef,] = tools_1.toolList;
35
+ exports.tools = {
36
+ analyzeRepositoryTool,
37
+ enumerateCapabilitiesTool,
38
+ planFeatureTool,
39
+ documentCodeTool: documentCodeToolRef,
40
+ applyCodeChangeTool: applyCodeChangeToolRef,
41
+ documentObjectTool: codex_tools_1.documentObjectTool,
42
+ coverageEnforcerTool: codex_tools_1.coverageEnforcerTool,
43
+ readmeImprovementTool: codex_tools_1.readmeImprovementTool,
44
+ ...decorator_tools_1.decoratorTools,
45
+ };
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwL3Rvb2xzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOERBQW9EO0FBK0MzQywrRkEvQ0EsZ0NBQWMsT0ErQ0E7QUE5Q3ZCLDREQUFtRDtBQUNuRCx1Q0FJaUI7QUFDakIsbURBSXVCO0FBRXZCLDhDQUF3QjtBQUN4QixvREFBOEI7QUFDOUIsMERBQW9DO0FBRXBDLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLGdDQUFrQjtJQUNsQixrQ0FBb0I7SUFDcEIsbUNBQXFCO0NBQ3RCLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRywrQkFBYyxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQVcsQ0FBQyxDQUFDO0FBRXZFLFFBQUEsUUFBUSxHQUFHLENBQUMsR0FBRyxnQkFBWSxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7QUFDbEUsUUFBQSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGdDQUFjLENBQUMsQ0FBQztBQUMvRCxNQUFNLENBQ0oscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6QixlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN2QixHQUFHLGdCQUFZLENBQUM7QUFFSixRQUFBLEtBQUssR0FBRztJQUNuQixxQkFBcUI7SUFDckIseUJBQXlCO0lBQ3pCLGVBQWU7SUFDZixnQkFBZ0IsRUFBRSxtQkFBbUI7SUFDckMsbUJBQW1CLEVBQUUsc0JBQXNCO0lBQzNDLGtCQUFrQixFQUFsQixnQ0FBa0I7SUFDbEIsb0JBQW9CLEVBQXBCLGtDQUFvQjtJQUNwQixxQkFBcUIsRUFBckIsbUNBQXFCO0lBQ3JCLEdBQUcsZ0NBQWM7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29yYXRvclRvb2xzIH0gZnJvbSBcIi4uL2RlY29yYXRvci10b29sc1wiO1xuaW1wb3J0IHsgbW9kdWxlUmVnaXN0cnkgfSBmcm9tIFwiLi4vbW9kdWxlUmVnaXN0cnlcIjtcbmltcG9ydCB7XG4gIGFwcGx5Q29kZUNoYW5nZVRvb2wsXG4gIGRvY3VtZW50Q29kZVRvb2wsXG4gIHRvb2xMaXN0IGFzIGNvcmVUb29sTGlzdCxcbn0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7XG4gIGNvdmVyYWdlRW5mb3JjZXJUb29sLFxuICBkb2N1bWVudE9iamVjdFRvb2wsXG4gIHJlYWRtZUltcHJvdmVtZW50VG9vbCxcbn0gZnJvbSBcIi4vY29kZXgtdG9vbHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vdG9vbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvZGV4LXRvb2xzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZU1jcE1vZHVsZVwiO1xuXG5jb25zdCBjb2RleFRvb2xMaXN0ID0gW1xuICBkb2N1bWVudE9iamVjdFRvb2wsXG4gIGNvdmVyYWdlRW5mb3JjZXJUb29sLFxuICByZWFkbWVJbXByb3ZlbWVudFRvb2wsXG5dO1xuXG5jb25zdCBtb2R1bGVUb29sTGlzdCA9IG1vZHVsZVJlZ2lzdHJ5Lmxpc3RUb29scygpLm1hcCgoYXNzZXQpID0+IGFzc2V0LnRvb2wgYXMgYW55KTtcblxuZXhwb3J0IGNvbnN0IHRvb2xMaXN0ID0gWy4uLmNvcmVUb29sTGlzdCwgLi4uY29kZXhUb29sTGlzdCwgLi4ubW9kdWxlVG9vbExpc3RdO1xuZXhwb3J0IGNvbnN0IGRlY29yYXRvclRvb2xMaXN0ID0gT2JqZWN0LnZhbHVlcyhkZWNvcmF0b3JUb29scyk7XG5jb25zdCBbXG4gIGFuYWx5emVSZXBvc2l0b3J5VG9vbCxcbiAgZW51bWVyYXRlQ2FwYWJpbGl0aWVzVG9vbCxcbiAgcGxhbkZlYXR1cmVUb29sLFxuICBkb2N1bWVudENvZGVUb29sUmVmLFxuICBhcHBseUNvZGVDaGFuZ2VUb29sUmVmLFxuXSA9IGNvcmVUb29sTGlzdDtcblxuZXhwb3J0IGNvbnN0IHRvb2xzID0ge1xuICBhbmFseXplUmVwb3NpdG9yeVRvb2wsXG4gIGVudW1lcmF0ZUNhcGFiaWxpdGllc1Rvb2wsXG4gIHBsYW5GZWF0dXJlVG9vbCxcbiAgZG9jdW1lbnRDb2RlVG9vbDogZG9jdW1lbnRDb2RlVG9vbFJlZixcbiAgYXBwbHlDb2RlQ2hhbmdlVG9vbDogYXBwbHlDb2RlQ2hhbmdlVG9vbFJlZixcbiAgZG9jdW1lbnRPYmplY3RUb29sLFxuICBjb3ZlcmFnZUVuZm9yY2VyVG9vbCxcbiAgcmVhZG1lSW1wcm92ZW1lbnRUb29sLFxuICAuLi5kZWNvcmF0b3JUb29scyxcbn07XG5cbmV4cG9ydCB7IGRlY29yYXRvclRvb2xzIH07Il19