@deimoscloud/coreai 0.1.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 (216) hide show
  1. package/.prettierrc +9 -0
  2. package/AGENT_SPEC.md +347 -0
  3. package/ARCHITECTURE.md +547 -0
  4. package/DRAFT_PRD.md +1440 -0
  5. package/IMPLEMENTATION_PLAN.md +256 -0
  6. package/PRODUCT.md +473 -0
  7. package/README.md +303 -0
  8. package/WORKFLOWS.md +295 -0
  9. package/agents/_templates/ic-engineer.md +185 -0
  10. package/agents/_templates/reviewer.md +182 -0
  11. package/agents/backend-engineer.yaml +72 -0
  12. package/agents/devops-engineer.yaml +72 -0
  13. package/agents/engineering-manager.yaml +70 -0
  14. package/agents/examples/android-engineer.md +302 -0
  15. package/agents/examples/backend-engineer.md +320 -0
  16. package/agents/examples/devops-engineer.md +742 -0
  17. package/agents/examples/engineering-manager.md +469 -0
  18. package/agents/examples/frontend-engineer.md +58 -0
  19. package/agents/examples/product-manager.md +315 -0
  20. package/agents/examples/qa-engineer.md +371 -0
  21. package/agents/examples/security-engineer.md +525 -0
  22. package/agents/examples/solutions-architect.md +351 -0
  23. package/agents/examples/wearos-engineer.md +359 -0
  24. package/agents/frontend-engineer.yaml +72 -0
  25. package/commands/core/check-inbox.md +34 -0
  26. package/commands/core/delegate.md +30 -0
  27. package/commands/core/git-commit.md +144 -0
  28. package/commands/core/pr-create.md +193 -0
  29. package/commands/core/review.md +56 -0
  30. package/commands/core/sprint-status.md +65 -0
  31. package/commands/optional/docs-update.md +200 -0
  32. package/commands/optional/jira-create.md +200 -0
  33. package/commands/optional/jira-transition.md +184 -0
  34. package/commands/optional/worktree-cleanup.md +167 -0
  35. package/commands/optional/worktree-setup.md +110 -0
  36. package/dist/cli/index.js +4037 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/index.d.ts +2978 -0
  39. package/dist/index.js +3867 -0
  40. package/dist/index.js.map +1 -0
  41. package/eslint.config.js +29 -0
  42. package/jest.config.js +22 -0
  43. package/knowledge-library/README.md +118 -0
  44. package/knowledge-library/android-engineer/context/current.txt +42 -0
  45. package/knowledge-library/android-engineer/control/decisions.txt +9 -0
  46. package/knowledge-library/android-engineer/control/dependencies.txt +19 -0
  47. package/knowledge-library/android-engineer/control/objectives.txt +26 -0
  48. package/knowledge-library/android-engineer/history/.gitkeep +0 -0
  49. package/knowledge-library/android-engineer/inbox/processed/.gitkeep +0 -0
  50. package/knowledge-library/android-engineer/outbox/.gitkeep +0 -0
  51. package/knowledge-library/android-engineer/tech/.gitkeep +0 -0
  52. package/knowledge-library/architecture.txt +61 -0
  53. package/knowledge-library/backend-engineer/context/current.txt +42 -0
  54. package/knowledge-library/backend-engineer/control/decisions.txt +9 -0
  55. package/knowledge-library/backend-engineer/control/dependencies.txt +19 -0
  56. package/knowledge-library/backend-engineer/control/objectives.txt +26 -0
  57. package/knowledge-library/backend-engineer/history/.gitkeep +0 -0
  58. package/knowledge-library/backend-engineer/inbox/processed/.gitkeep +0 -0
  59. package/knowledge-library/backend-engineer/outbox/.gitkeep +0 -0
  60. package/knowledge-library/backend-engineer/tech/.gitkeep +0 -0
  61. package/knowledge-library/context.txt +52 -0
  62. package/knowledge-library/devops-engineer/context/current.txt +42 -0
  63. package/knowledge-library/devops-engineer/control/decisions.txt +9 -0
  64. package/knowledge-library/devops-engineer/control/dependencies.txt +19 -0
  65. package/knowledge-library/devops-engineer/control/objectives.txt +26 -0
  66. package/knowledge-library/devops-engineer/history/.gitkeep +0 -0
  67. package/knowledge-library/devops-engineer/inbox/processed/.gitkeep +0 -0
  68. package/knowledge-library/devops-engineer/outbox/.gitkeep +0 -0
  69. package/knowledge-library/devops-engineer/tech/.gitkeep +0 -0
  70. package/knowledge-library/engineering-manager/context/current.txt +40 -0
  71. package/knowledge-library/engineering-manager/control/decisions.txt +9 -0
  72. package/knowledge-library/engineering-manager/control/objectives.txt +27 -0
  73. package/knowledge-library/engineering-manager/history/.gitkeep +0 -0
  74. package/knowledge-library/engineering-manager/inbox/processed/.gitkeep +0 -0
  75. package/knowledge-library/engineering-manager/outbox/.gitkeep +0 -0
  76. package/knowledge-library/engineering-manager/tech/.gitkeep +0 -0
  77. package/knowledge-library/prd.txt +81 -0
  78. package/knowledge-library/product-manager/context/current.txt +42 -0
  79. package/knowledge-library/product-manager/control/decisions.txt +9 -0
  80. package/knowledge-library/product-manager/control/dependencies.txt +19 -0
  81. package/knowledge-library/product-manager/control/objectives.txt +26 -0
  82. package/knowledge-library/product-manager/history/.gitkeep +0 -0
  83. package/knowledge-library/product-manager/inbox/processed/.gitkeep +0 -0
  84. package/knowledge-library/product-manager/outbox/.gitkeep +0 -0
  85. package/knowledge-library/product-manager/tech/.gitkeep +0 -0
  86. package/knowledge-library/qa-engineer/context/current.txt +42 -0
  87. package/knowledge-library/qa-engineer/control/decisions.txt +9 -0
  88. package/knowledge-library/qa-engineer/control/dependencies.txt +19 -0
  89. package/knowledge-library/qa-engineer/control/objectives.txt +26 -0
  90. package/knowledge-library/qa-engineer/history/.gitkeep +0 -0
  91. package/knowledge-library/qa-engineer/inbox/processed/.gitkeep +0 -0
  92. package/knowledge-library/qa-engineer/outbox/.gitkeep +0 -0
  93. package/knowledge-library/qa-engineer/tech/.gitkeep +0 -0
  94. package/knowledge-library/security-engineer/context/current.txt +42 -0
  95. package/knowledge-library/security-engineer/control/decisions.txt +9 -0
  96. package/knowledge-library/security-engineer/control/dependencies.txt +19 -0
  97. package/knowledge-library/security-engineer/control/objectives.txt +26 -0
  98. package/knowledge-library/security-engineer/history/.gitkeep +0 -0
  99. package/knowledge-library/security-engineer/inbox/processed/.gitkeep +0 -0
  100. package/knowledge-library/security-engineer/outbox/.gitkeep +0 -0
  101. package/knowledge-library/security-engineer/tech/.gitkeep +0 -0
  102. package/knowledge-library/solutions-architect/context/current.txt +42 -0
  103. package/knowledge-library/solutions-architect/control/decisions.txt +9 -0
  104. package/knowledge-library/solutions-architect/control/dependencies.txt +19 -0
  105. package/knowledge-library/solutions-architect/control/objectives.txt +26 -0
  106. package/knowledge-library/solutions-architect/history/.gitkeep +0 -0
  107. package/knowledge-library/solutions-architect/inbox/processed/.gitkeep +0 -0
  108. package/knowledge-library/solutions-architect/outbox/.gitkeep +0 -0
  109. package/knowledge-library/solutions-architect/tech/.gitkeep +0 -0
  110. package/knowledge-library/wearos-engineer/context/current.txt +42 -0
  111. package/knowledge-library/wearos-engineer/control/decisions.txt +9 -0
  112. package/knowledge-library/wearos-engineer/control/dependencies.txt +19 -0
  113. package/knowledge-library/wearos-engineer/control/objectives.txt +26 -0
  114. package/knowledge-library/wearos-engineer/history/.gitkeep +0 -0
  115. package/knowledge-library/wearos-engineer/inbox/processed/.gitkeep +0 -0
  116. package/knowledge-library/wearos-engineer/outbox/.gitkeep +0 -0
  117. package/knowledge-library/wearos-engineer/tech/.gitkeep +0 -0
  118. package/package.json +66 -0
  119. package/schemas/agent.schema.json +171 -0
  120. package/schemas/coreai.config.schema.json +257 -0
  121. package/scripts/add-agent.sh +323 -0
  122. package/scripts/install.sh +354 -0
  123. package/src/adapters/factory.test.ts +386 -0
  124. package/src/adapters/factory.ts +305 -0
  125. package/src/adapters/index.ts +113 -0
  126. package/src/adapters/interfaces.ts +268 -0
  127. package/src/adapters/mcp/client.test.ts +130 -0
  128. package/src/adapters/mcp/client.ts +451 -0
  129. package/src/adapters/mcp/discovery.test.ts +315 -0
  130. package/src/adapters/mcp/discovery.ts +340 -0
  131. package/src/adapters/mcp/index.ts +66 -0
  132. package/src/adapters/mcp/mapper.test.ts +218 -0
  133. package/src/adapters/mcp/mapper.ts +536 -0
  134. package/src/adapters/mcp/registry.test.ts +433 -0
  135. package/src/adapters/mcp/registry.ts +550 -0
  136. package/src/adapters/mcp/types.ts +258 -0
  137. package/src/adapters/native/filesystem.test.ts +350 -0
  138. package/src/adapters/native/filesystem.ts +393 -0
  139. package/src/adapters/native/github.test.ts +173 -0
  140. package/src/adapters/native/github.ts +627 -0
  141. package/src/adapters/native/index.ts +22 -0
  142. package/src/adapters/native/selector.test.ts +224 -0
  143. package/src/adapters/native/selector.ts +150 -0
  144. package/src/adapters/types.ts +270 -0
  145. package/src/agents/compiler.test.ts +399 -0
  146. package/src/agents/compiler.ts +359 -0
  147. package/src/agents/index.ts +36 -0
  148. package/src/agents/loader.test.ts +319 -0
  149. package/src/agents/loader.ts +143 -0
  150. package/src/agents/resolver.test.ts +282 -0
  151. package/src/agents/resolver.ts +262 -0
  152. package/src/agents/types.ts +87 -0
  153. package/src/cache/index.ts +38 -0
  154. package/src/cache/interfaces.ts +283 -0
  155. package/src/cache/manager.test.ts +266 -0
  156. package/src/cache/manager.ts +388 -0
  157. package/src/cache/provider.test.ts +485 -0
  158. package/src/cache/provider.ts +745 -0
  159. package/src/cache/types.test.ts +192 -0
  160. package/src/cache/types.ts +313 -0
  161. package/src/cli/commands/build.test.ts +248 -0
  162. package/src/cli/commands/build.ts +244 -0
  163. package/src/cli/commands/cache.test.ts +221 -0
  164. package/src/cli/commands/cache.ts +229 -0
  165. package/src/cli/commands/index.ts +63 -0
  166. package/src/cli/commands/init.test.ts +173 -0
  167. package/src/cli/commands/init.ts +296 -0
  168. package/src/cli/commands/skills.test.ts +272 -0
  169. package/src/cli/commands/skills.ts +348 -0
  170. package/src/cli/commands/status.test.ts +392 -0
  171. package/src/cli/commands/status.ts +332 -0
  172. package/src/cli/commands/sync.test.ts +213 -0
  173. package/src/cli/commands/sync.ts +251 -0
  174. package/src/cli/commands/validate.test.ts +216 -0
  175. package/src/cli/commands/validate.ts +340 -0
  176. package/src/cli/index.test.ts +190 -0
  177. package/src/cli/index.ts +493 -0
  178. package/src/commands/context.test.ts +163 -0
  179. package/src/commands/context.ts +111 -0
  180. package/src/commands/index.ts +56 -0
  181. package/src/commands/loader.test.ts +273 -0
  182. package/src/commands/loader.ts +355 -0
  183. package/src/commands/registry.test.ts +384 -0
  184. package/src/commands/registry.ts +248 -0
  185. package/src/commands/runner.test.ts +297 -0
  186. package/src/commands/runner.ts +222 -0
  187. package/src/commands/types.ts +361 -0
  188. package/src/config/index.ts +19 -0
  189. package/src/config/loader.test.ts +262 -0
  190. package/src/config/loader.ts +188 -0
  191. package/src/config/types.ts +154 -0
  192. package/src/context/index.ts +14 -0
  193. package/src/context/loader.test.ts +334 -0
  194. package/src/context/loader.ts +357 -0
  195. package/src/index.test.ts +13 -0
  196. package/src/index.ts +244 -0
  197. package/src/knowledge-library/index.ts +44 -0
  198. package/src/knowledge-library/manager.test.ts +536 -0
  199. package/src/knowledge-library/manager.ts +804 -0
  200. package/src/knowledge-library/types.ts +432 -0
  201. package/src/skills/generator.test.ts +602 -0
  202. package/src/skills/generator.ts +491 -0
  203. package/src/skills/index.ts +27 -0
  204. package/src/skills/templates.ts +520 -0
  205. package/src/skills/types.ts +251 -0
  206. package/templates/completion-report.md +72 -0
  207. package/templates/feedback.md +56 -0
  208. package/templates/project-files/CLAUDE.md.template +109 -0
  209. package/templates/project-files/coreai.json.example +47 -0
  210. package/templates/project-files/mcp.json.template +20 -0
  211. package/templates/review-complete.md +64 -0
  212. package/templates/review-request.md +67 -0
  213. package/templates/task-assignment.md +51 -0
  214. package/tsconfig.build.json +4 -0
  215. package/tsconfig.json +26 -0
  216. package/tsup.config.ts +23 -0
@@ -0,0 +1,536 @@
1
+ /**
2
+ * MCP Tool Mapper
3
+ *
4
+ * Maps MCP server tools to adapter interface methods.
5
+ * Provides both pre-defined mappings for known servers and
6
+ * heuristic-based auto-discovery for unknown servers.
7
+ */
8
+
9
+ import type { AdapterType } from '../types.js';
10
+ import type { McpTool } from './types.js';
11
+
12
+ /**
13
+ * Mapping from an MCP tool to an adapter method
14
+ */
15
+ export interface ToolMapping {
16
+ /**
17
+ * The MCP tool name
18
+ */
19
+ toolName: string;
20
+
21
+ /**
22
+ * The adapter type this tool maps to
23
+ */
24
+ adapterType: AdapterType;
25
+
26
+ /**
27
+ * The adapter method this tool implements
28
+ */
29
+ method: string;
30
+
31
+ /**
32
+ * Parameter mapping from adapter method params to MCP tool args
33
+ */
34
+ parameterMap?: Record<string, string>;
35
+
36
+ /**
37
+ * How to extract the result from the MCP tool response
38
+ */
39
+ resultExtractor?: (result: unknown) => unknown;
40
+
41
+ /**
42
+ * Confidence score (0-1) for auto-discovered mappings
43
+ */
44
+ confidence?: number;
45
+ }
46
+
47
+ /**
48
+ * Registry of known MCP server tool mappings
49
+ */
50
+ export interface ServerMapping {
51
+ /**
52
+ * Server identifier patterns (name or npm package)
53
+ */
54
+ patterns: string[];
55
+
56
+ /**
57
+ * Tool mappings for this server
58
+ */
59
+ mappings: ToolMapping[];
60
+ }
61
+
62
+ /**
63
+ * Known server mappings registry
64
+ */
65
+ const KNOWN_SERVER_MAPPINGS: ServerMapping[] = [
66
+ // GitHub MCP Server (@modelcontextprotocol/server-github)
67
+ {
68
+ patterns: ['@modelcontextprotocol/server-github', 'github', 'mcp-server-github'],
69
+ mappings: [
70
+ // Git Provider mappings
71
+ {
72
+ toolName: 'create_pull_request',
73
+ adapterType: 'git',
74
+ method: 'createPullRequest',
75
+ parameterMap: {
76
+ title: 'title',
77
+ body: 'description',
78
+ head: 'source_branch',
79
+ base: 'target_branch',
80
+ },
81
+ },
82
+ {
83
+ toolName: 'get_pull_request',
84
+ adapterType: 'git',
85
+ method: 'getPullRequest',
86
+ parameterMap: {
87
+ pull_number: 'idOrNumber',
88
+ },
89
+ },
90
+ {
91
+ toolName: 'list_pull_requests',
92
+ adapterType: 'git',
93
+ method: 'listPullRequests',
94
+ parameterMap: {
95
+ state: 'status',
96
+ },
97
+ },
98
+ {
99
+ toolName: 'merge_pull_request',
100
+ adapterType: 'git',
101
+ method: 'mergePullRequest',
102
+ parameterMap: {
103
+ pull_number: 'idOrNumber',
104
+ },
105
+ },
106
+ {
107
+ toolName: 'create_review',
108
+ adapterType: 'git',
109
+ method: 'addReview',
110
+ parameterMap: {
111
+ pull_number: 'idOrNumber',
112
+ event: 'decision',
113
+ body: 'body',
114
+ },
115
+ },
116
+ // Issue Tracker mappings (GitHub Issues)
117
+ {
118
+ toolName: 'get_issue',
119
+ adapterType: 'issue_tracker',
120
+ method: 'getIssue',
121
+ parameterMap: {
122
+ issue_number: 'idOrKey',
123
+ },
124
+ },
125
+ {
126
+ toolName: 'list_issues',
127
+ adapterType: 'issue_tracker',
128
+ method: 'listIssues',
129
+ parameterMap: {
130
+ state: 'status',
131
+ assignee: 'assignee',
132
+ labels: 'labels',
133
+ },
134
+ },
135
+ {
136
+ toolName: 'create_issue',
137
+ adapterType: 'issue_tracker',
138
+ method: 'createIssue',
139
+ parameterMap: {
140
+ title: 'title',
141
+ body: 'description',
142
+ assignees: 'assignee',
143
+ labels: 'labels',
144
+ },
145
+ },
146
+ {
147
+ toolName: 'update_issue',
148
+ adapterType: 'issue_tracker',
149
+ method: 'updateIssue',
150
+ parameterMap: {
151
+ issue_number: 'idOrKey',
152
+ title: 'title',
153
+ body: 'description',
154
+ state: 'status',
155
+ },
156
+ },
157
+ {
158
+ toolName: 'add_issue_comment',
159
+ adapterType: 'issue_tracker',
160
+ method: 'addComment',
161
+ parameterMap: {
162
+ issue_number: 'idOrKey',
163
+ body: 'comment',
164
+ },
165
+ },
166
+ ],
167
+ },
168
+
169
+ // Jira MCP Server (if available)
170
+ {
171
+ patterns: ['jira', 'mcp-server-jira', 'atlassian-jira'],
172
+ mappings: [
173
+ {
174
+ toolName: 'get_issue',
175
+ adapterType: 'issue_tracker',
176
+ method: 'getIssue',
177
+ parameterMap: {
178
+ issue_key: 'idOrKey',
179
+ },
180
+ },
181
+ {
182
+ toolName: 'search_issues',
183
+ adapterType: 'issue_tracker',
184
+ method: 'listIssues',
185
+ },
186
+ {
187
+ toolName: 'create_issue',
188
+ adapterType: 'issue_tracker',
189
+ method: 'createIssue',
190
+ parameterMap: {
191
+ summary: 'title',
192
+ description: 'description',
193
+ },
194
+ },
195
+ {
196
+ toolName: 'update_issue',
197
+ adapterType: 'issue_tracker',
198
+ method: 'updateIssue',
199
+ parameterMap: {
200
+ issue_key: 'idOrKey',
201
+ summary: 'title',
202
+ description: 'description',
203
+ },
204
+ },
205
+ {
206
+ toolName: 'transition_issue',
207
+ adapterType: 'issue_tracker',
208
+ method: 'transitionIssue',
209
+ parameterMap: {
210
+ issue_key: 'idOrKey',
211
+ transition_id: 'status',
212
+ },
213
+ },
214
+ {
215
+ toolName: 'add_comment',
216
+ adapterType: 'issue_tracker',
217
+ method: 'addComment',
218
+ parameterMap: {
219
+ issue_key: 'idOrKey',
220
+ body: 'comment',
221
+ },
222
+ },
223
+ ],
224
+ },
225
+
226
+ // Confluence MCP Server (if available)
227
+ {
228
+ patterns: ['confluence', 'mcp-server-confluence', 'atlassian-confluence'],
229
+ mappings: [
230
+ {
231
+ toolName: 'get_page',
232
+ adapterType: 'documentation',
233
+ method: 'getPage',
234
+ parameterMap: {
235
+ page_id: 'id',
236
+ },
237
+ },
238
+ {
239
+ toolName: 'get_page_content',
240
+ adapterType: 'documentation',
241
+ method: 'getPageContent',
242
+ parameterMap: {
243
+ page_id: 'id',
244
+ },
245
+ },
246
+ {
247
+ toolName: 'search_pages',
248
+ adapterType: 'documentation',
249
+ method: 'searchPages',
250
+ parameterMap: {
251
+ query: 'query',
252
+ space_key: 'space',
253
+ },
254
+ },
255
+ ],
256
+ },
257
+
258
+ // Filesystem MCP Server
259
+ {
260
+ patterns: ['filesystem', 'mcp-server-filesystem', '@modelcontextprotocol/server-filesystem'],
261
+ mappings: [
262
+ {
263
+ toolName: 'read_file',
264
+ adapterType: 'state',
265
+ method: 'read',
266
+ parameterMap: {
267
+ path: 'path',
268
+ },
269
+ },
270
+ {
271
+ toolName: 'write_file',
272
+ adapterType: 'state',
273
+ method: 'write',
274
+ parameterMap: {
275
+ path: 'path',
276
+ content: 'content',
277
+ },
278
+ },
279
+ {
280
+ toolName: 'list_directory',
281
+ adapterType: 'state',
282
+ method: 'list',
283
+ parameterMap: {
284
+ path: 'path',
285
+ },
286
+ },
287
+ {
288
+ toolName: 'create_directory',
289
+ adapterType: 'state',
290
+ method: 'mkdir',
291
+ parameterMap: {
292
+ path: 'path',
293
+ },
294
+ },
295
+ ],
296
+ },
297
+ ];
298
+
299
+ /**
300
+ * Find mappings for a known server
301
+ */
302
+ export function findKnownServerMappings(serverName: string): ToolMapping[] {
303
+ const normalizedName = serverName.toLowerCase();
304
+
305
+ for (const server of KNOWN_SERVER_MAPPINGS) {
306
+ for (const pattern of server.patterns) {
307
+ if (
308
+ normalizedName.includes(pattern.toLowerCase()) ||
309
+ pattern.toLowerCase().includes(normalizedName)
310
+ ) {
311
+ return server.mappings;
312
+ }
313
+ }
314
+ }
315
+
316
+ return [];
317
+ }
318
+
319
+ /**
320
+ * Auto-discover mappings for tools based on naming conventions
321
+ */
322
+ export function autoDiscoverMappings(tools: McpTool[]): ToolMapping[] {
323
+ const mappings: ToolMapping[] = [];
324
+
325
+ for (const tool of tools) {
326
+ const discovered = discoverToolMapping(tool);
327
+ if (discovered) {
328
+ mappings.push(discovered);
329
+ }
330
+ }
331
+
332
+ return mappings;
333
+ }
334
+
335
+ /**
336
+ * Try to discover a mapping for a single tool
337
+ */
338
+ function discoverToolMapping(tool: McpTool): ToolMapping | null {
339
+ const name = tool.name.toLowerCase();
340
+ const desc = (tool.description ?? '').toLowerCase();
341
+
342
+ // Issue tracker patterns
343
+ if (matchesPatterns(name, desc, ['issue', 'ticket', 'bug', 'task'])) {
344
+ return discoverIssueTrackerMapping(tool);
345
+ }
346
+
347
+ // Git provider patterns
348
+ if (matchesPatterns(name, desc, ['pull_request', 'pr', 'merge', 'branch', 'commit', 'review'])) {
349
+ return discoverGitMapping(tool);
350
+ }
351
+
352
+ // Documentation patterns
353
+ if (matchesPatterns(name, desc, ['page', 'doc', 'wiki', 'content', 'article'])) {
354
+ return discoverDocumentationMapping(tool);
355
+ }
356
+
357
+ // State/filesystem patterns
358
+ if (matchesPatterns(name, desc, ['file', 'directory', 'folder', 'read', 'write', 'path'])) {
359
+ return discoverStateMapping(tool);
360
+ }
361
+
362
+ return null;
363
+ }
364
+
365
+ /**
366
+ * Check if name or description matches any patterns
367
+ */
368
+ function matchesPatterns(name: string, description: string, patterns: string[]): boolean {
369
+ return patterns.some((p) => name.includes(p) || description.includes(p));
370
+ }
371
+
372
+ /**
373
+ * Discover issue tracker mapping
374
+ */
375
+ function discoverIssueTrackerMapping(tool: McpTool): ToolMapping | null {
376
+ const name = tool.name.toLowerCase();
377
+
378
+ const methodPatterns: Record<string, string> = {
379
+ get_issue: 'getIssue',
380
+ get_ticket: 'getIssue',
381
+ list_issues: 'listIssues',
382
+ search_issues: 'listIssues',
383
+ create_issue: 'createIssue',
384
+ create_ticket: 'createIssue',
385
+ update_issue: 'updateIssue',
386
+ transition_issue: 'transitionIssue',
387
+ move_issue: 'transitionIssue',
388
+ add_comment: 'addComment',
389
+ comment_issue: 'addComment',
390
+ };
391
+
392
+ for (const [pattern, method] of Object.entries(methodPatterns)) {
393
+ if (name.includes(pattern) || name === pattern.replace(/_/g, '')) {
394
+ return {
395
+ toolName: tool.name,
396
+ adapterType: 'issue_tracker',
397
+ method,
398
+ confidence: 0.7,
399
+ };
400
+ }
401
+ }
402
+
403
+ return null;
404
+ }
405
+
406
+ /**
407
+ * Discover git provider mapping
408
+ */
409
+ function discoverGitMapping(tool: McpTool): ToolMapping | null {
410
+ const name = tool.name.toLowerCase();
411
+
412
+ const methodPatterns: Record<string, string> = {
413
+ get_pull_request: 'getPullRequest',
414
+ get_pr: 'getPullRequest',
415
+ list_pull_requests: 'listPullRequests',
416
+ list_prs: 'listPullRequests',
417
+ create_pull_request: 'createPullRequest',
418
+ create_pr: 'createPullRequest',
419
+ merge_pull_request: 'mergePullRequest',
420
+ merge_pr: 'mergePullRequest',
421
+ add_review: 'addReview',
422
+ create_review: 'addReview',
423
+ request_reviewers: 'requestReviewers',
424
+ };
425
+
426
+ for (const [pattern, method] of Object.entries(methodPatterns)) {
427
+ if (name.includes(pattern) || name === pattern.replace(/_/g, '')) {
428
+ return {
429
+ toolName: tool.name,
430
+ adapterType: 'git',
431
+ method,
432
+ confidence: 0.7,
433
+ };
434
+ }
435
+ }
436
+
437
+ return null;
438
+ }
439
+
440
+ /**
441
+ * Discover documentation provider mapping
442
+ */
443
+ function discoverDocumentationMapping(tool: McpTool): ToolMapping | null {
444
+ const name = tool.name.toLowerCase();
445
+
446
+ const methodPatterns: Record<string, string> = {
447
+ get_page: 'getPage',
448
+ get_doc: 'getPage',
449
+ get_page_content: 'getPageContent',
450
+ get_content: 'getPageContent',
451
+ search_pages: 'searchPages',
452
+ search_docs: 'searchPages',
453
+ list_pages: 'listPages',
454
+ };
455
+
456
+ for (const [pattern, method] of Object.entries(methodPatterns)) {
457
+ if (name.includes(pattern) || name === pattern.replace(/_/g, '')) {
458
+ return {
459
+ toolName: tool.name,
460
+ adapterType: 'documentation',
461
+ method,
462
+ confidence: 0.7,
463
+ };
464
+ }
465
+ }
466
+
467
+ return null;
468
+ }
469
+
470
+ /**
471
+ * Discover state provider mapping
472
+ */
473
+ function discoverStateMapping(tool: McpTool): ToolMapping | null {
474
+ const name = tool.name.toLowerCase();
475
+
476
+ const methodPatterns: Record<string, string> = {
477
+ read_file: 'read',
478
+ read: 'read',
479
+ get_file: 'read',
480
+ write_file: 'write',
481
+ write: 'write',
482
+ save_file: 'write',
483
+ list_directory: 'list',
484
+ list_files: 'list',
485
+ ls: 'list',
486
+ delete_file: 'delete',
487
+ remove_file: 'delete',
488
+ create_directory: 'mkdir',
489
+ mkdir: 'mkdir',
490
+ };
491
+
492
+ for (const [pattern, method] of Object.entries(methodPatterns)) {
493
+ if (name.includes(pattern) || name === pattern.replace(/_/g, '')) {
494
+ return {
495
+ toolName: tool.name,
496
+ adapterType: 'state',
497
+ method,
498
+ confidence: 0.7,
499
+ };
500
+ }
501
+ }
502
+
503
+ return null;
504
+ }
505
+
506
+ /**
507
+ * Get all mappings for a server (known + auto-discovered)
508
+ */
509
+ export function getMappingsForServer(serverName: string, tools: McpTool[]): ToolMapping[] {
510
+ // First try known mappings
511
+ const knownMappings = findKnownServerMappings(serverName);
512
+
513
+ if (knownMappings.length > 0) {
514
+ // Filter to only tools that exist
515
+ const toolNames = new Set(tools.map((t) => t.name));
516
+ return knownMappings.filter((m) => toolNames.has(m.toolName));
517
+ }
518
+
519
+ // Fall back to auto-discovery
520
+ return autoDiscoverMappings(tools);
521
+ }
522
+
523
+ /**
524
+ * Group mappings by adapter type
525
+ */
526
+ export function groupMappingsByAdapter(mappings: ToolMapping[]): Map<AdapterType, ToolMapping[]> {
527
+ const grouped = new Map<AdapterType, ToolMapping[]>();
528
+
529
+ for (const mapping of mappings) {
530
+ const existing = grouped.get(mapping.adapterType) ?? [];
531
+ existing.push(mapping);
532
+ grouped.set(mapping.adapterType, existing);
533
+ }
534
+
535
+ return grouped;
536
+ }