rebar-mcp 2.0.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 (248) hide show
  1. package/.claude/agents/template-writer.md +43 -0
  2. package/.claude/agents/test-runner.md +47 -0
  3. package/.claude/mcp.json +9 -0
  4. package/.claude/settings.json +29 -0
  5. package/.claude/skills/ /SKILL.md +21 -0
  6. package/.claude/skills/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/SKILL.md +21 -0
  7. package/.claude/skills/bmmibwetxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  8. package/.claude/skills/bmmibwjgvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  9. package/.claude/skills/bmmibwsesxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  10. package/.claude/skills/bmmibwxufxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  11. package/.claude/skills/bmmibx3r9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  12. package/.claude/skills/bmmji0lrkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  13. package/.claude/skills/bmmjiniphxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  14. package/.claude/skills/bmmjio86zxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  15. package/.claude/skills/bmmjiolfbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  16. package/.claude/skills/bmmjit1lvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  17. package/.claude/skills/bmmjita1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/SKILL.md +21 -0
  18. package/.claude/skills/bnd-mmibweu3/SKILL.md +21 -0
  19. package/.claude/skills/bnd-mmibwjh4/SKILL.md +21 -0
  20. package/.claude/skills/bnd-mmibwsey/SKILL.md +21 -0
  21. package/.claude/skills/bnd-mmibwxup/SKILL.md +21 -0
  22. package/.claude/skills/bnd-mmibx3rg/SKILL.md +21 -0
  23. package/.claude/skills/bnd-mmji0lrp/SKILL.md +21 -0
  24. package/.claude/skills/bnd-mmjinipm/SKILL.md +21 -0
  25. package/.claude/skills/bnd-mmjio875/SKILL.md +21 -0
  26. package/.claude/skills/bnd-mmjiolfg/SKILL.md +21 -0
  27. package/.claude/skills/bnd-mmjit1m3/SKILL.md +21 -0
  28. package/.claude/skills/bnd-mmjita1x/SKILL.md +21 -0
  29. package/.claude/skills/coercion-test/SKILL.md +50 -0
  30. package/.claude/skills/large-skill/SKILL.md +21 -0
  31. package/.claude/skills/long-desc-skill/SKILL.md +21 -0
  32. package/.claude/skills/mcp-dev/SKILL.md +61 -0
  33. package/.claude/skills/nl-mmibweus/SKILL.md +25 -0
  34. package/.claude/skills/nl-mmibwjhf/SKILL.md +25 -0
  35. package/.claude/skills/nl-mmibwsf7/SKILL.md +25 -0
  36. package/.claude/skills/nl-mmibwxvq/SKILL.md +25 -0
  37. package/.claude/skills/nl-mmibx3rt/SKILL.md +25 -0
  38. package/.claude/skills/nl-mmji0lrz/SKILL.md +25 -0
  39. package/.claude/skills/nl-mmjinipx/SKILL.md +25 -0
  40. package/.claude/skills/nl-mmjio87f/SKILL.md +25 -0
  41. package/.claude/skills/nl-mmjiolfs/SKILL.md +25 -0
  42. package/.claude/skills/nl-mmjit1mc/SKILL.md +25 -0
  43. package/.claude/skills/nl-mmjita26/SKILL.md +25 -0
  44. package/.claude/skills/rapid-1/SKILL.md +21 -0
  45. package/.claude/skills/rapid-2/SKILL.md +21 -0
  46. package/.claude/skills/rapid-3/SKILL.md +21 -0
  47. package/.claude/skills/rapid-4/SKILL.md +21 -0
  48. package/.claude/skills/rapid-5/SKILL.md +21 -0
  49. package/.claude/skills/test/", /"malicious/": /"true/SKILL.md" +69 -0
  50. package/.claude/skills/test-emoji-/360/237/230/200-skill/SKILL.md +69 -0
  51. package/.claude/skills/test-skill/SKILL.md +69 -0
  52. package/.claude/skills/test; rm -rf /; skill/SKILL.md +69 -0
  53. package/.claude/skills/test<script>alert(1)</script>skill/SKILL.md +69 -0
  54. package/.claudeignore +5 -0
  55. package/.mcp.json +3 -0
  56. package/CHANGELOG.md +29 -0
  57. package/CLAUDE.md +76 -0
  58. package/LICENSE +21 -0
  59. package/README.md +149 -0
  60. package/ROADMAP.md +526 -0
  61. package/ccboot-PRD-v1.0.docx.md +732 -0
  62. package/ccboot-v1.2.0-enforcement-spec.md +1272 -0
  63. package/dist/cli.d.ts +3 -0
  64. package/dist/cli.d.ts.map +1 -0
  65. package/dist/cli.js +674 -0
  66. package/dist/cli.js.map +1 -0
  67. package/dist/constants.d.ts +25 -0
  68. package/dist/constants.d.ts.map +1 -0
  69. package/dist/constants.js +118 -0
  70. package/dist/constants.js.map +1 -0
  71. package/dist/index.d.ts +3 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +47 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/schemas/common.d.ts +62 -0
  76. package/dist/schemas/common.d.ts.map +1 -0
  77. package/dist/schemas/common.js +15 -0
  78. package/dist/schemas/common.js.map +1 -0
  79. package/dist/schemas/scaffolding.d.ts +277 -0
  80. package/dist/schemas/scaffolding.d.ts.map +1 -0
  81. package/dist/schemas/scaffolding.js +133 -0
  82. package/dist/schemas/scaffolding.js.map +1 -0
  83. package/dist/services/claudemd-generator.d.ts +16 -0
  84. package/dist/services/claudemd-generator.d.ts.map +1 -0
  85. package/dist/services/claudemd-generator.js +426 -0
  86. package/dist/services/claudemd-generator.js.map +1 -0
  87. package/dist/services/codex-generator.d.ts +6 -0
  88. package/dist/services/codex-generator.d.ts.map +1 -0
  89. package/dist/services/codex-generator.js +35 -0
  90. package/dist/services/codex-generator.js.map +1 -0
  91. package/dist/services/cursor-generator.d.ts +15 -0
  92. package/dist/services/cursor-generator.d.ts.map +1 -0
  93. package/dist/services/cursor-generator.js +134 -0
  94. package/dist/services/cursor-generator.js.map +1 -0
  95. package/dist/services/file-ops.d.ts +48 -0
  96. package/dist/services/file-ops.d.ts.map +1 -0
  97. package/dist/services/file-ops.js +153 -0
  98. package/dist/services/file-ops.js.map +1 -0
  99. package/dist/services/output-formatter.d.ts +57 -0
  100. package/dist/services/output-formatter.d.ts.map +1 -0
  101. package/dist/services/output-formatter.js +88 -0
  102. package/dist/services/output-formatter.js.map +1 -0
  103. package/dist/services/platform-detect.d.ts +14 -0
  104. package/dist/services/platform-detect.d.ts.map +1 -0
  105. package/dist/services/platform-detect.js +63 -0
  106. package/dist/services/platform-detect.js.map +1 -0
  107. package/dist/services/project-analyzer.d.ts +71 -0
  108. package/dist/services/project-analyzer.d.ts.map +1 -0
  109. package/dist/services/project-analyzer.js +595 -0
  110. package/dist/services/project-analyzer.js.map +1 -0
  111. package/dist/services/rules-engine.d.ts +41 -0
  112. package/dist/services/rules-engine.d.ts.map +1 -0
  113. package/dist/services/rules-engine.js +304 -0
  114. package/dist/services/rules-engine.js.map +1 -0
  115. package/dist/services/strictness.d.ts +37 -0
  116. package/dist/services/strictness.d.ts.map +1 -0
  117. package/dist/services/strictness.js +182 -0
  118. package/dist/services/strictness.js.map +1 -0
  119. package/dist/services/template-engine.d.ts +16 -0
  120. package/dist/services/template-engine.d.ts.map +1 -0
  121. package/dist/services/template-engine.js +85 -0
  122. package/dist/services/template-engine.js.map +1 -0
  123. package/dist/services/validation.d.ts +41 -0
  124. package/dist/services/validation.d.ts.map +1 -0
  125. package/dist/services/validation.js +104 -0
  126. package/dist/services/validation.js.map +1 -0
  127. package/dist/services/windsurf-generator.d.ts +15 -0
  128. package/dist/services/windsurf-generator.d.ts.map +1 -0
  129. package/dist/services/windsurf-generator.js +127 -0
  130. package/dist/services/windsurf-generator.js.map +1 -0
  131. package/dist/tests/enforcement.test.d.ts +2 -0
  132. package/dist/tests/enforcement.test.d.ts.map +1 -0
  133. package/dist/tests/enforcement.test.js +541 -0
  134. package/dist/tests/enforcement.test.js.map +1 -0
  135. package/dist/tests/enterprise.test.d.ts +2 -0
  136. package/dist/tests/enterprise.test.d.ts.map +1 -0
  137. package/dist/tests/enterprise.test.js +353 -0
  138. package/dist/tests/enterprise.test.js.map +1 -0
  139. package/dist/tests/fuzzing.test.d.ts +2 -0
  140. package/dist/tests/fuzzing.test.d.ts.map +1 -0
  141. package/dist/tests/fuzzing.test.js +596 -0
  142. package/dist/tests/fuzzing.test.js.map +1 -0
  143. package/dist/tests/knowledge.test.d.ts +2 -0
  144. package/dist/tests/knowledge.test.d.ts.map +1 -0
  145. package/dist/tests/knowledge.test.js +292 -0
  146. package/dist/tests/knowledge.test.js.map +1 -0
  147. package/dist/tests/management.test.d.ts +2 -0
  148. package/dist/tests/management.test.d.ts.map +1 -0
  149. package/dist/tests/management.test.js +338 -0
  150. package/dist/tests/management.test.js.map +1 -0
  151. package/dist/tests/scaffolding.test.d.ts +2 -0
  152. package/dist/tests/scaffolding.test.d.ts.map +1 -0
  153. package/dist/tests/scaffolding.test.js +419 -0
  154. package/dist/tests/scaffolding.test.js.map +1 -0
  155. package/dist/tests/test-utils.d.ts +76 -0
  156. package/dist/tests/test-utils.d.ts.map +1 -0
  157. package/dist/tests/test-utils.js +171 -0
  158. package/dist/tests/test-utils.js.map +1 -0
  159. package/dist/tests/tool-harness.d.ts +18 -0
  160. package/dist/tests/tool-harness.d.ts.map +1 -0
  161. package/dist/tests/tool-harness.js +51 -0
  162. package/dist/tests/tool-harness.js.map +1 -0
  163. package/dist/tools/enterprise.d.ts +8 -0
  164. package/dist/tools/enterprise.d.ts.map +1 -0
  165. package/dist/tools/enterprise.js +571 -0
  166. package/dist/tools/enterprise.js.map +1 -0
  167. package/dist/tools/knowledge.d.ts +7 -0
  168. package/dist/tools/knowledge.d.ts.map +1 -0
  169. package/dist/tools/knowledge.js +120 -0
  170. package/dist/tools/knowledge.js.map +1 -0
  171. package/dist/tools/management.d.ts +10 -0
  172. package/dist/tools/management.d.ts.map +1 -0
  173. package/dist/tools/management.js +1541 -0
  174. package/dist/tools/management.js.map +1 -0
  175. package/dist/tools/scaffolding.d.ts +8 -0
  176. package/dist/tools/scaffolding.d.ts.map +1 -0
  177. package/dist/tools/scaffolding.js +736 -0
  178. package/dist/tools/scaffolding.js.map +1 -0
  179. package/dist/types.d.ts +54 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +5 -0
  182. package/dist/types.js.map +1 -0
  183. package/landing/app/layout.tsx +30 -0
  184. package/landing/app/page.tsx +944 -0
  185. package/landing/next-env.d.ts +6 -0
  186. package/landing/next.config.js +6 -0
  187. package/landing/package-lock.json +896 -0
  188. package/landing/package.json +20 -0
  189. package/landing/tsconfig.json +40 -0
  190. package/package.json +49 -0
  191. package/rebar-v2.0.0-platform-spec.md +1567 -0
  192. package/server.json +20 -0
  193. package/src/cli.ts +735 -0
  194. package/src/constants.ts +131 -0
  195. package/src/index.ts +54 -0
  196. package/src/schemas/common.ts +22 -0
  197. package/src/schemas/scaffolding.ts +161 -0
  198. package/src/services/claudemd-generator.ts +481 -0
  199. package/src/services/codex-generator.ts +44 -0
  200. package/src/services/cursor-generator.ts +153 -0
  201. package/src/services/file-ops.ts +172 -0
  202. package/src/services/platform-detect.ts +80 -0
  203. package/src/services/project-analyzer.ts +690 -0
  204. package/src/services/rules-engine.ts +353 -0
  205. package/src/services/strictness.ts +202 -0
  206. package/src/services/template-engine.ts +119 -0
  207. package/src/services/validation.ts +138 -0
  208. package/src/services/windsurf-generator.ts +145 -0
  209. package/src/tests/enforcement.test.ts +794 -0
  210. package/src/tests/enterprise.test.ts +483 -0
  211. package/src/tests/fuzzing.test.ts +690 -0
  212. package/src/tests/knowledge.test.ts +371 -0
  213. package/src/tests/management.test.ts +451 -0
  214. package/src/tests/scaffolding.test.ts +575 -0
  215. package/src/tests/test-utils.ts +206 -0
  216. package/src/tests/tool-harness.ts +70 -0
  217. package/src/tools/enterprise.ts +666 -0
  218. package/src/tools/knowledge.ts +162 -0
  219. package/src/tools/management.ts +1706 -0
  220. package/src/tools/scaffolding.ts +909 -0
  221. package/src/types.ts +93 -0
  222. package/supabase/.temp/cli-latest +1 -0
  223. package/supabase/.temp/gotrue-version +1 -0
  224. package/supabase/.temp/pooler-url +1 -0
  225. package/supabase/.temp/postgres-version +1 -0
  226. package/supabase/.temp/project-ref +1 -0
  227. package/supabase/.temp/rest-version +1 -0
  228. package/supabase/.temp/storage-migration +1 -0
  229. package/supabase/.temp/storage-version +1 -0
  230. package/templates/agents/explore.md +41 -0
  231. package/templates/agents/plan.md +73 -0
  232. package/templates/agents/security-auditor.md +77 -0
  233. package/templates/agents/test-runner.md +60 -0
  234. package/templates/claudemd/fastapi.md +49 -0
  235. package/templates/claudemd/monorepo.md +48 -0
  236. package/templates/claudemd/nextjs.md +52 -0
  237. package/templates/claudemd/react-spa.md +50 -0
  238. package/templates/claudemd/springboot.md +50 -0
  239. package/templates/hooks/danger-blocker.json +11 -0
  240. package/templates/hooks/format-on-write.json +17 -0
  241. package/templates/hooks/lint-on-write.json +16 -0
  242. package/templates/hooks/secret-detector.json +11 -0
  243. package/templates/skills/code-review.md +68 -0
  244. package/templates/skills/documentation.md +62 -0
  245. package/templates/skills/performance-audit.md +80 -0
  246. package/templates/skills/security-scan.md +66 -0
  247. package/templates/skills/test-writer.md +56 -0
  248. package/tsconfig.json +19 -0
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Test utilities for rebar-mcp-server integration tests
3
+ * Provides mock filesystem and helper functions
4
+ */
5
+ import * as fs from "node:fs/promises";
6
+ import * as path from "node:path";
7
+ import * as os from "node:os";
8
+ import * as crypto from "node:crypto";
9
+
10
+ /**
11
+ * Creates an isolated temporary directory for testing
12
+ * Returns cleanup function to remove it after test
13
+ */
14
+ export async function createTestDir(): Promise<{
15
+ path: string;
16
+ cleanup: () => Promise<void>;
17
+ }> {
18
+ const tmpBase = os.tmpdir();
19
+ const dirName = `rebar-test-${crypto.randomBytes(8).toString("hex")}`;
20
+ const testDir = path.join(tmpBase, dirName);
21
+
22
+ await fs.mkdir(testDir, { recursive: true });
23
+
24
+ return {
25
+ path: testDir,
26
+ cleanup: async () => {
27
+ await fs.rm(testDir, { recursive: true, force: true });
28
+ },
29
+ };
30
+ }
31
+
32
+ /**
33
+ * Creates a mock project structure for testing
34
+ */
35
+ export async function createMockProject(
36
+ testDir: string,
37
+ options: {
38
+ packageJson?: Record<string, unknown>;
39
+ existingClaudeMd?: string;
40
+ existingSettings?: Record<string, unknown>;
41
+ techStack?: "node" | "python" | "rust" | "go";
42
+ } = {}
43
+ ): Promise<void> {
44
+ const { packageJson, existingClaudeMd, existingSettings, techStack = "node" } = options;
45
+
46
+ // Create package.json or equivalent based on tech stack
47
+ if (techStack === "node") {
48
+ const pkg = packageJson ?? {
49
+ name: "test-project",
50
+ version: "1.0.0",
51
+ scripts: {
52
+ build: "tsc",
53
+ test: "jest",
54
+ lint: "eslint .",
55
+ },
56
+ dependencies: {
57
+ express: "^4.18.0",
58
+ },
59
+ devDependencies: {
60
+ typescript: "^5.0.0",
61
+ jest: "^29.0.0",
62
+ },
63
+ };
64
+ await fs.writeFile(
65
+ path.join(testDir, "package.json"),
66
+ JSON.stringify(pkg, null, 2)
67
+ );
68
+ } else if (techStack === "python") {
69
+ await fs.writeFile(
70
+ path.join(testDir, "pyproject.toml"),
71
+ `[project]\nname = "test-project"\nversion = "1.0.0"\n`
72
+ );
73
+ } else if (techStack === "rust") {
74
+ await fs.writeFile(
75
+ path.join(testDir, "Cargo.toml"),
76
+ `[package]\nname = "test-project"\nversion = "1.0.0"\n`
77
+ );
78
+ } else if (techStack === "go") {
79
+ await fs.writeFile(
80
+ path.join(testDir, "go.mod"),
81
+ `module test-project\n\ngo 1.21\n`
82
+ );
83
+ }
84
+
85
+ // Create src directory
86
+ await fs.mkdir(path.join(testDir, "src"), { recursive: true });
87
+ await fs.writeFile(path.join(testDir, "src", "index.ts"), "// test file\n");
88
+
89
+ // Create existing CLAUDE.md if specified
90
+ if (existingClaudeMd) {
91
+ await fs.writeFile(path.join(testDir, "CLAUDE.md"), existingClaudeMd);
92
+ }
93
+
94
+ // Create .claude directory structure if settings provided
95
+ if (existingSettings) {
96
+ await fs.mkdir(path.join(testDir, ".claude"), { recursive: true });
97
+ await fs.writeFile(
98
+ path.join(testDir, ".claude", "settings.json"),
99
+ JSON.stringify(existingSettings, null, 2)
100
+ );
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Reads a file from test directory, returns null if not found
106
+ */
107
+ export async function readTestFile(testDir: string, relativePath: string): Promise<string | null> {
108
+ try {
109
+ return await fs.readFile(path.join(testDir, relativePath), "utf-8");
110
+ } catch {
111
+ return null;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Checks if a file exists in test directory
117
+ */
118
+ export async function testFileExists(testDir: string, relativePath: string): Promise<boolean> {
119
+ try {
120
+ await fs.access(path.join(testDir, relativePath));
121
+ return true;
122
+ } catch {
123
+ return false;
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Parses JSON from a test file
129
+ */
130
+ export async function readTestJson<T = unknown>(testDir: string, relativePath: string): Promise<T | null> {
131
+ const content = await readTestFile(testDir, relativePath);
132
+ if (!content) return null;
133
+ try {
134
+ return JSON.parse(content) as T;
135
+ } catch {
136
+ return null;
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Creates a minimal valid CLAUDE.md for testing
142
+ */
143
+ export function createMinimalClaudeMd(): string {
144
+ return `# Test Project
145
+
146
+ ## Tech Stack
147
+ - Node.js
148
+
149
+ ## Build & Test
150
+ \`\`\`bash
151
+ npm run build
152
+ npm test
153
+ \`\`\`
154
+ `;
155
+ }
156
+
157
+ /**
158
+ * Creates a minimal valid skill for testing
159
+ */
160
+ export function createMinimalSkill(name: string, description: string): string {
161
+ return `---
162
+ name: ${name}
163
+ description: ${description}
164
+ invocation: user
165
+ context: inline
166
+ ---
167
+
168
+ # ${name}
169
+
170
+ ${description}
171
+ `;
172
+ }
173
+
174
+ /**
175
+ * Asserts tool result is successful
176
+ */
177
+ export function assertToolSuccess(result: { content: Array<{ type: string; text: string }>; isError?: boolean }): void {
178
+ if (result.isError) {
179
+ const text = result.content[0]?.text ?? "Unknown error";
180
+ throw new Error(`Tool returned error: ${text}`);
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Asserts tool result is an error
186
+ */
187
+ export function assertToolError(result: { content: Array<{ type: string; text: string }>; isError?: boolean }): void {
188
+ if (!result.isError) {
189
+ throw new Error("Expected tool to return error, but it succeeded");
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Gets text content from tool result
195
+ */
196
+ export function getToolResultText(result: { content: Array<{ type: string; text: string }> }): string {
197
+ return result.content[0]?.text ?? "";
198
+ }
199
+
200
+ /**
201
+ * Parses JSON output from tool result
202
+ */
203
+ export function parseToolResultJson<T = unknown>(result: { content: Array<{ type: string; text: string }> }): T {
204
+ const text = getToolResultText(result);
205
+ return JSON.parse(text) as T;
206
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Tool Harness for Integration Testing
3
+ * Creates a minimal MCP server and provides a way to invoke tools directly
4
+ */
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { registerScaffoldingTools } from "../tools/scaffolding.js";
7
+ import { registerKnowledgeTools } from "../tools/knowledge.js";
8
+ import { registerManagementTools } from "../tools/management.js";
9
+ import { registerEnterpriseTools } from "../tools/enterprise.js";
10
+ import type { ToolResult } from "../types.js";
11
+
12
+ // Store registered tools for direct invocation
13
+ const toolRegistry = new Map<string, (args: Record<string, unknown>) => Promise<ToolResult>>();
14
+
15
+ /**
16
+ * Mock MCP Server that captures tool registrations
17
+ */
18
+ function createMockServer(): McpServer {
19
+ // Create a minimal mock that captures tool registrations
20
+ const mockServer = {
21
+ registerTool: (
22
+ name: string,
23
+ _options: unknown,
24
+ handler: (args: Record<string, unknown>) => Promise<ToolResult>
25
+ ) => {
26
+ toolRegistry.set(name, handler);
27
+ },
28
+ } as unknown as McpServer;
29
+
30
+ return mockServer;
31
+ }
32
+
33
+ /**
34
+ * Initialize all tools for testing
35
+ */
36
+ export function initializeTools(): void {
37
+ const server = createMockServer();
38
+ registerScaffoldingTools(server);
39
+ registerKnowledgeTools(server);
40
+ registerManagementTools(server);
41
+ registerEnterpriseTools(server);
42
+ }
43
+
44
+ /**
45
+ * Invoke a tool by name with arguments
46
+ */
47
+ export async function invokeTool(
48
+ name: string,
49
+ args: Record<string, unknown>
50
+ ): Promise<ToolResult> {
51
+ const handler = toolRegistry.get(name);
52
+ if (!handler) {
53
+ throw new Error(`Tool not found: ${name}. Available tools: ${Array.from(toolRegistry.keys()).join(", ")}`);
54
+ }
55
+ return handler(args);
56
+ }
57
+
58
+ /**
59
+ * Get list of registered tool names
60
+ */
61
+ export function getRegisteredTools(): string[] {
62
+ return Array.from(toolRegistry.keys());
63
+ }
64
+
65
+ /**
66
+ * Check if a tool is registered
67
+ */
68
+ export function isToolRegistered(name: string): boolean {
69
+ return toolRegistry.has(name);
70
+ }