@decaf-ts/mcp-server 0.0.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +18 -2
  2. package/dist/mcp-server.cjs +1989 -341
  3. package/dist/mcp-server.esm.cjs +1963 -338
  4. package/lib/McpWrapper.cjs +12 -10
  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 +12 -10
  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 +4 -0
  90. package/lib/esm/modules/mcp/decoration-assist.js +6 -0
  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 +13 -0
  183. package/lib/modules/mcp/decoration-assist.d.ts +4 -0
  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 +18 -12
  203. package/lib/esm/modules/decoration-assist/index.d.ts +0 -39
  204. package/lib/esm/modules/decoration-assist/index.js +0 -353
  205. package/lib/esm/modules/mcp/decorator-tools.js +0 -237
  206. package/lib/esm/modules/mcp/mcp-module.d.ts +0 -230
  207. package/lib/esm/modules/mcp/mcp-module.js +0 -406
  208. package/lib/modules/decoration-assist/index.cjs +0 -360
  209. package/lib/modules/decoration-assist/index.d.ts +0 -39
  210. package/lib/modules/mcp/decorator-tools.cjs +0 -243
  211. package/lib/modules/mcp/mcp-module.cjs +0 -452
  212. package/lib/modules/mcp/mcp-module.d.ts +0 -230
  213. /package/lib/esm/{modules/mcp → mcp}/decorator-tools.d.ts +0 -0
  214. /package/lib/{modules/mcp → mcp}/decorator-tools.d.ts +0 -0
@@ -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
@@ -0,0 +1,321 @@
1
+ import { decoratorTools } from "../decorator-tools";
2
+ export * from "./tools";
3
+ export * from "./codex-tools";
4
+ export * from "./generateMcpModule";
5
+ export declare const toolList: any[];
6
+ export declare const decoratorToolList: ({
7
+ readonly name: "create-or-update-model";
8
+ readonly description: "Create or update a validation-ready model class";
9
+ readonly execute: (args: {
10
+ filePath: string;
11
+ className: string;
12
+ classDecorators?: import("../decorator-tools").DecoratorSpec[];
13
+ properties: import("../decorator-tools").AttributeSpec[];
14
+ importsFrom: string;
15
+ overwrite?: boolean;
16
+ }) => Promise<{
17
+ filePath: string;
18
+ }>;
19
+ } | {
20
+ readonly name: "add-attribute";
21
+ readonly description: "Add a decorated attribute to an existing model";
22
+ readonly execute: (args: {
23
+ filePath: string;
24
+ className: string;
25
+ attribute: import("../decorator-tools").AttributeSpec;
26
+ importsFrom: string;
27
+ }) => Promise<{
28
+ filePath: string;
29
+ }>;
30
+ } | {
31
+ readonly name: "remove-attribute";
32
+ readonly description: "Remove an attribute from a model class";
33
+ readonly execute: (args: {
34
+ filePath: string;
35
+ className: string;
36
+ attributeName: string;
37
+ }) => Promise<{
38
+ filePath: string;
39
+ }>;
40
+ } | {
41
+ readonly name: "apply-decorator";
42
+ readonly description: "Apply a decorator to a class or property";
43
+ readonly execute: (args: {
44
+ filePath: string;
45
+ className: string;
46
+ target: {
47
+ kind: "class" | "property";
48
+ name?: string;
49
+ };
50
+ decorator: import("../decorator-tools").DecoratorSpec;
51
+ importsFrom: string;
52
+ }) => Promise<{
53
+ filePath: string;
54
+ }>;
55
+ } | {
56
+ readonly name: "remove-decorator";
57
+ readonly description: "Remove a decorator from a class or property";
58
+ readonly execute: (args: {
59
+ filePath: string;
60
+ className: string;
61
+ target: {
62
+ kind: "class" | "property";
63
+ name?: string;
64
+ };
65
+ decoratorName: string;
66
+ }) => Promise<{
67
+ filePath: string;
68
+ }>;
69
+ } | {
70
+ readonly name: "scaffold-validator";
71
+ readonly description: "Scaffold a validator class and optional decorator";
72
+ readonly execute: (args: {
73
+ validatorsDir: string;
74
+ decoratorDir?: string;
75
+ name: string;
76
+ }) => Promise<{
77
+ classFile: string;
78
+ decoratorFile: string | undefined;
79
+ }>;
80
+ } | {
81
+ readonly name: "scaffold-serializer";
82
+ readonly description: "Scaffold a serializer class and optional registry";
83
+ readonly execute: (args: {
84
+ dir: string;
85
+ name: string;
86
+ registerDir?: string;
87
+ setDefault?: boolean;
88
+ }) => Promise<{
89
+ classFile: string;
90
+ registerFile: string | undefined;
91
+ }>;
92
+ } | {
93
+ readonly name: "scaffold-hashing";
94
+ readonly description: "Scaffold a hashing function and optional registry";
95
+ readonly execute: (args: {
96
+ dir: string;
97
+ name: string;
98
+ registerDir?: string;
99
+ setDefault?: boolean;
100
+ }) => Promise<{
101
+ functionFile: string;
102
+ registerFile: string | undefined;
103
+ }>;
104
+ })[];
105
+ export declare const tools: {
106
+ createOrUpdateModelTool: {
107
+ readonly name: "create-or-update-model";
108
+ readonly description: "Create or update a validation-ready model class";
109
+ readonly execute: (args: {
110
+ filePath: string;
111
+ className: string;
112
+ classDecorators?: import("../decorator-tools").DecoratorSpec[];
113
+ properties: import("../decorator-tools").AttributeSpec[];
114
+ importsFrom: string;
115
+ overwrite?: boolean;
116
+ }) => Promise<{
117
+ filePath: string;
118
+ }>;
119
+ };
120
+ addAttributeTool: {
121
+ readonly name: "add-attribute";
122
+ readonly description: "Add a decorated attribute to an existing model";
123
+ readonly execute: (args: {
124
+ filePath: string;
125
+ className: string;
126
+ attribute: import("../decorator-tools").AttributeSpec;
127
+ importsFrom: string;
128
+ }) => Promise<{
129
+ filePath: string;
130
+ }>;
131
+ };
132
+ removeAttributeTool: {
133
+ readonly name: "remove-attribute";
134
+ readonly description: "Remove an attribute from a model class";
135
+ readonly execute: (args: {
136
+ filePath: string;
137
+ className: string;
138
+ attributeName: string;
139
+ }) => Promise<{
140
+ filePath: string;
141
+ }>;
142
+ };
143
+ applyDecoratorTool: {
144
+ readonly name: "apply-decorator";
145
+ readonly description: "Apply a decorator to a class or property";
146
+ readonly execute: (args: {
147
+ filePath: string;
148
+ className: string;
149
+ target: {
150
+ kind: "class" | "property";
151
+ name?: string;
152
+ };
153
+ decorator: import("../decorator-tools").DecoratorSpec;
154
+ importsFrom: string;
155
+ }) => Promise<{
156
+ filePath: string;
157
+ }>;
158
+ };
159
+ removeDecoratorTool: {
160
+ readonly name: "remove-decorator";
161
+ readonly description: "Remove a decorator from a class or property";
162
+ readonly execute: (args: {
163
+ filePath: string;
164
+ className: string;
165
+ target: {
166
+ kind: "class" | "property";
167
+ name?: string;
168
+ };
169
+ decoratorName: string;
170
+ }) => Promise<{
171
+ filePath: string;
172
+ }>;
173
+ };
174
+ scaffoldValidatorTool: {
175
+ readonly name: "scaffold-validator";
176
+ readonly description: "Scaffold a validator class and optional decorator";
177
+ readonly execute: (args: {
178
+ validatorsDir: string;
179
+ decoratorDir?: string;
180
+ name: string;
181
+ }) => Promise<{
182
+ classFile: string;
183
+ decoratorFile: string | undefined;
184
+ }>;
185
+ };
186
+ scaffoldSerializerTool: {
187
+ readonly name: "scaffold-serializer";
188
+ readonly description: "Scaffold a serializer class and optional registry";
189
+ readonly execute: (args: {
190
+ dir: string;
191
+ name: string;
192
+ registerDir?: string;
193
+ setDefault?: boolean;
194
+ }) => Promise<{
195
+ classFile: string;
196
+ registerFile: string | undefined;
197
+ }>;
198
+ };
199
+ scaffoldHashingTool: {
200
+ readonly name: "scaffold-hashing";
201
+ readonly description: "Scaffold a hashing function and optional registry";
202
+ readonly execute: (args: {
203
+ dir: string;
204
+ name: string;
205
+ registerDir?: string;
206
+ setDefault?: boolean;
207
+ }) => Promise<{
208
+ functionFile: string;
209
+ registerFile: string | undefined;
210
+ }>;
211
+ };
212
+ analyzeRepositoryTool: {
213
+ annotations?: {
214
+ streamingHint?: boolean;
215
+ } & {
216
+ destructiveHint?: boolean;
217
+ idempotentHint?: boolean;
218
+ openWorldHint?: boolean;
219
+ readOnlyHint?: boolean;
220
+ title?: string;
221
+ };
222
+ canAccess?: ((auth: undefined) => boolean) | undefined;
223
+ description?: string;
224
+ execute: (args: any, context: import("fastmcp").Context<undefined>) => Promise<import("fastmcp").AudioContent | import("fastmcp").ContentResult | import("fastmcp").ImageContent | import("fastmcp").ResourceContent | import("fastmcp").ResourceLink | string | import("fastmcp").TextContent | void>;
225
+ name: string;
226
+ parameters?: any;
227
+ timeoutMs?: number;
228
+ };
229
+ enumerateCapabilitiesTool: {
230
+ annotations?: {
231
+ streamingHint?: boolean;
232
+ } & {
233
+ destructiveHint?: boolean;
234
+ idempotentHint?: boolean;
235
+ openWorldHint?: boolean;
236
+ readOnlyHint?: boolean;
237
+ title?: string;
238
+ };
239
+ canAccess?: ((auth: undefined) => boolean) | undefined;
240
+ description?: string;
241
+ execute: (args: any, context: import("fastmcp").Context<undefined>) => Promise<import("fastmcp").AudioContent | import("fastmcp").ContentResult | import("fastmcp").ImageContent | import("fastmcp").ResourceContent | import("fastmcp").ResourceLink | string | import("fastmcp").TextContent | void>;
242
+ name: string;
243
+ parameters?: any;
244
+ timeoutMs?: number;
245
+ };
246
+ planFeatureTool: {
247
+ annotations?: {
248
+ streamingHint?: boolean;
249
+ } & {
250
+ destructiveHint?: boolean;
251
+ idempotentHint?: boolean;
252
+ openWorldHint?: boolean;
253
+ readOnlyHint?: boolean;
254
+ title?: string;
255
+ };
256
+ canAccess?: ((auth: undefined) => boolean) | undefined;
257
+ description?: string;
258
+ execute: (args: any, context: import("fastmcp").Context<undefined>) => Promise<import("fastmcp").AudioContent | import("fastmcp").ContentResult | import("fastmcp").ImageContent | import("fastmcp").ResourceContent | import("fastmcp").ResourceLink | string | import("fastmcp").TextContent | void>;
259
+ name: string;
260
+ parameters?: any;
261
+ timeoutMs?: number;
262
+ };
263
+ documentCodeTool: {
264
+ annotations?: {
265
+ streamingHint?: boolean;
266
+ } & {
267
+ destructiveHint?: boolean;
268
+ idempotentHint?: boolean;
269
+ openWorldHint?: boolean;
270
+ readOnlyHint?: boolean;
271
+ title?: string;
272
+ };
273
+ canAccess?: ((auth: undefined) => boolean) | undefined;
274
+ description?: string;
275
+ execute: (args: any, context: import("fastmcp").Context<undefined>) => Promise<import("fastmcp").AudioContent | import("fastmcp").ContentResult | import("fastmcp").ImageContent | import("fastmcp").ResourceContent | import("fastmcp").ResourceLink | string | import("fastmcp").TextContent | void>;
276
+ name: string;
277
+ parameters?: any;
278
+ timeoutMs?: number;
279
+ };
280
+ applyCodeChangeTool: {
281
+ annotations?: {
282
+ streamingHint?: boolean;
283
+ } & {
284
+ destructiveHint?: boolean;
285
+ idempotentHint?: boolean;
286
+ openWorldHint?: boolean;
287
+ readOnlyHint?: boolean;
288
+ title?: string;
289
+ };
290
+ canAccess?: ((auth: undefined) => boolean) | undefined;
291
+ description?: string;
292
+ execute: (args: any, context: import("fastmcp").Context<undefined>) => Promise<import("fastmcp").AudioContent | import("fastmcp").ContentResult | import("fastmcp").ImageContent | import("fastmcp").ResourceContent | import("fastmcp").ResourceLink | string | import("fastmcp").TextContent | void>;
293
+ name: string;
294
+ parameters?: any;
295
+ timeoutMs?: number;
296
+ };
297
+ documentObjectTool: import("fastmcp").Tool<undefined, import("zod").ZodObject<{
298
+ basePath: import("zod").ZodString;
299
+ objectType: import("zod").ZodEnum<{
300
+ function: "function";
301
+ module: "module";
302
+ file: "file";
303
+ class: "class";
304
+ interface: "interface";
305
+ decorator: "decorator";
306
+ constant: "constant";
307
+ }>;
308
+ targetFile: import("zod").ZodOptional<import("zod").ZodString>;
309
+ includeContent: import("zod").ZodDefault<import("zod").ZodBoolean>;
310
+ }, import("zod/v4/core").$strict>>;
311
+ coverageEnforcerTool: import("fastmcp").Tool<undefined, import("zod").ZodObject<{
312
+ basePath: import("zod").ZodString;
313
+ coverage: import("zod").ZodDefault<import("zod").ZodNumber>;
314
+ dryRun: import("zod").ZodDefault<import("zod").ZodBoolean>;
315
+ }, import("zod/v4/core").$strict>>;
316
+ readmeImprovementTool: import("fastmcp").Tool<undefined, import("zod").ZodObject<{
317
+ basePath: import("zod").ZodString;
318
+ includeExamples: import("zod").ZodDefault<import("zod").ZodBoolean>;
319
+ }, import("zod/v4/core").$strict>>;
320
+ };
321
+ export { decoratorTools };