@arii/boomtick-mcp 0.4.0 → 0.4.2

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 (115) hide show
  1. package/.mcp/schemas/agent.search_ddgs.json +28 -24
  2. package/.mcp/schemas/agent_search_ddgs.json +31 -0
  3. package/.mcp/schemas/boomtick.health.json +14 -10
  4. package/.mcp/schemas/boomtick_health.json +16 -0
  5. package/.mcp/schemas/github.checkout_branch.json +28 -24
  6. package/.mcp/schemas/github.comment_triage_summary.json +21 -17
  7. package/.mcp/schemas/github.create_issue.json +55 -50
  8. package/.mcp/schemas/github.create_pull_request.json +53 -48
  9. package/.mcp/schemas/github.get_merge_conflict_files.json +21 -17
  10. package/.mcp/schemas/github.get_pr.json +30 -12
  11. package/.mcp/schemas/github.get_pr_diff.json +30 -12
  12. package/.mcp/schemas/github.issue_comment.json +35 -17
  13. package/.mcp/schemas/github.issue_update.json +114 -96
  14. package/.mcp/schemas/github.issue_view.json +30 -12
  15. package/.mcp/schemas/github.open_replacement_pr.json +64 -60
  16. package/.mcp/schemas/github.search_open_prs.json +61 -43
  17. package/.mcp/schemas/github_checkout_branch.json +31 -0
  18. package/.mcp/schemas/github_comment_triage_summary.json +24 -0
  19. package/.mcp/schemas/github_create_issue.json +58 -0
  20. package/.mcp/schemas/github_create_pull_request.json +56 -0
  21. package/.mcp/schemas/github_get_merge_conflict_files.json +24 -0
  22. package/.mcp/schemas/github_get_pr.json +32 -0
  23. package/.mcp/schemas/github_get_pr_diff.json +32 -0
  24. package/.mcp/schemas/github_issue_comment.json +38 -0
  25. package/.mcp/schemas/github_issue_update.json +123 -0
  26. package/.mcp/schemas/github_issue_view.json +32 -0
  27. package/.mcp/schemas/github_open_replacement_pr.json +67 -0
  28. package/.mcp/schemas/github_search_open_prs.json +65 -0
  29. package/.mcp/schemas/jules.cancel_session.json +16 -12
  30. package/.mcp/schemas/jules.create_session.json +41 -37
  31. package/.mcp/schemas/jules.get_messages.json +16 -12
  32. package/.mcp/schemas/jules.get_pr.json +16 -12
  33. package/.mcp/schemas/jules.get_session.json +16 -12
  34. package/.mcp/schemas/jules.list_sessions.json +33 -29
  35. package/.mcp/schemas/jules.send_message.json +30 -26
  36. package/.mcp/schemas/jules.trigger_feedback.json +16 -12
  37. package/.mcp/schemas/jules_cancel_session.json +18 -0
  38. package/.mcp/schemas/jules_create_session.json +44 -0
  39. package/.mcp/schemas/jules_get_messages.json +18 -0
  40. package/.mcp/schemas/jules_get_pr.json +18 -0
  41. package/.mcp/schemas/jules_get_session.json +18 -0
  42. package/.mcp/schemas/jules_list_sessions.json +36 -0
  43. package/.mcp/schemas/jules_send_message.json +35 -0
  44. package/.mcp/schemas/jules_trigger_feedback.json +18 -0
  45. package/.mcp/schemas/repo.commit_patch.json +34 -30
  46. package/.mcp/schemas/repo.create_branch.json +21 -17
  47. package/.mcp/schemas/repo.create_repair_branch.json +34 -30
  48. package/.mcp/schemas/repo.get_changed_files.json +19 -15
  49. package/.mcp/schemas/repo.get_command_schema.json +16 -12
  50. package/.mcp/schemas/repo.get_package_scripts.json +21 -17
  51. package/.mcp/schemas/repo.get_route_map.json +21 -17
  52. package/.mcp/schemas/repo.logs.json +28 -24
  53. package/.mcp/schemas/repo.read_agent_context.json +7 -3
  54. package/.mcp/schemas/repo.read_ci_logs.json +21 -17
  55. package/.mcp/schemas/repo.run_lighthouse.json +26 -22
  56. package/.mcp/schemas/repo.run_playwright.json +33 -29
  57. package/.mcp/schemas/repo.run_tests.json +40 -36
  58. package/.mcp/schemas/repo_commit_patch.json +39 -0
  59. package/.mcp/schemas/repo_create_branch.json +24 -0
  60. package/.mcp/schemas/repo_create_repair_branch.json +37 -0
  61. package/.mcp/schemas/repo_get_changed_files.json +22 -0
  62. package/.mcp/schemas/repo_get_command_schema.json +18 -0
  63. package/.mcp/schemas/repo_get_package_scripts.json +23 -0
  64. package/.mcp/schemas/repo_get_route_map.json +23 -0
  65. package/.mcp/schemas/repo_logs.json +31 -0
  66. package/.mcp/schemas/repo_read_agent_context.json +9 -0
  67. package/.mcp/schemas/repo_read_ci_logs.json +24 -0
  68. package/.mcp/schemas/repo_run_lighthouse.json +29 -0
  69. package/.mcp/schemas/repo_run_playwright.json +36 -0
  70. package/.mcp/schemas/repo_run_tests.json +45 -0
  71. package/CHANGELOG.md +16 -0
  72. package/dist/config.js +43 -17
  73. package/dist/config.test.js +18 -3
  74. package/dist/lib/git.js +30 -0
  75. package/dist/lib/param_utils.js +35 -0
  76. package/dist/lib/param_utils.test.js +44 -0
  77. package/dist/mcp/definitions.js +11 -1
  78. package/dist/mcp/schemas.test.js +28 -0
  79. package/dist/mcp/server.js +72 -36
  80. package/dist/tools/contract.js +94 -8
  81. package/dist/tools/github.create_issue.js +3 -2
  82. package/dist/tools/github.create_issue.test.js +10 -0
  83. package/dist/tools/github.create_pull_request.js +4 -4
  84. package/dist/tools/github.get_pr.js +4 -1
  85. package/dist/tools/github.get_pr_diff.js +6 -2
  86. package/dist/tools/github.issue_comment.js +8 -1
  87. package/dist/tools/github.issue_update.js +3 -0
  88. package/dist/tools/github.issue_view.js +4 -1
  89. package/dist/tools/github.search_open_prs.js +4 -0
  90. package/dist/tools/repo.commit_patch.js +30 -10
  91. package/dist/tools/repo.run_playwright.js +10 -5
  92. package/dist/tools/repo.run_tests.js +26 -4
  93. package/package.json +2 -2
  94. package/scripts/sync-mcp-schemas.ts +6 -1
  95. package/src/config.test.ts +22 -3
  96. package/src/config.ts +47 -17
  97. package/src/lib/git.ts +34 -0
  98. package/src/lib/param_utils.test.ts +49 -0
  99. package/src/lib/param_utils.ts +42 -0
  100. package/src/mcp/definitions.ts +12 -1
  101. package/src/mcp/schemas.test.ts +34 -0
  102. package/src/mcp/server.ts +73 -38
  103. package/src/tools/contract.ts +94 -8
  104. package/src/tools/github.create_issue.test.ts +10 -0
  105. package/src/tools/github.create_issue.ts +3 -1
  106. package/src/tools/github.create_pull_request.ts +4 -5
  107. package/src/tools/github.get_pr.ts +4 -1
  108. package/src/tools/github.get_pr_diff.ts +7 -2
  109. package/src/tools/github.issue_comment.ts +8 -1
  110. package/src/tools/github.issue_update.ts +4 -1
  111. package/src/tools/github.issue_view.ts +4 -1
  112. package/src/tools/github.search_open_prs.ts +4 -0
  113. package/src/tools/repo.commit_patch.ts +35 -11
  114. package/src/tools/repo.run_playwright.ts +13 -6
  115. package/src/tools/repo.run_tests.ts +28 -5
package/src/config.ts CHANGED
@@ -1,4 +1,3 @@
1
- import dotenv from "dotenv";
2
1
  import path from "path";
3
2
  import fs from "fs";
4
3
  import { fileURLToPath } from "url";
@@ -6,10 +5,14 @@ import { execSync } from "child_process";
6
5
 
7
6
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
7
 
9
- dotenv.config({
10
- path: path.resolve(__dirname, "../.env"),
11
- quiet: true
12
- });
8
+ const envPath = path.resolve(__dirname, "../.env");
9
+ if (fs.existsSync(envPath) && typeof process.loadEnvFile === "function") {
10
+ try {
11
+ process.loadEnvFile(envPath);
12
+ } catch {
13
+ // Ignore if already loaded or invalid
14
+ }
15
+ }
13
16
 
14
17
  function getGithubToken(): string | undefined {
15
18
  if (process.env.GITHUB_TOKEN) {
@@ -36,9 +39,11 @@ export function initializeConfig() {
36
39
  }
37
40
 
38
41
  try {
39
- // Attempt to load core properties from the Python CLI to avoid duplication
42
+ // Attempt to load core properties from the Python CLI in the active workspace
43
+ const cwd = process.env.BOOMTICK_REPO_PATH || process.cwd();
40
44
  const cmd = `td-cli config view`;
41
45
  const output = execSync(cmd, {
46
+ cwd,
42
47
  encoding: "utf-8",
43
48
  stdio: ["ignore", "pipe", "ignore"]
44
49
  });
@@ -64,10 +69,27 @@ function findRepoRoot() {
64
69
  return process.env.BOOMTICK_REPO_PATH;
65
70
  }
66
71
 
67
- // Traverse up to find workspace.json or .git
68
- let current = __dirname;
72
+ // Traverse up from process.cwd() to find project_config.json, workspace.json, or .git
73
+ let current = process.cwd();
69
74
  while (current !== path.parse(current).root) {
70
- if (fs.existsSync(path.join(current, "workspace.json")) || fs.existsSync(path.join(current, ".git"))) {
75
+ if (
76
+ fs.existsSync(path.join(current, "project_config.json")) ||
77
+ fs.existsSync(path.join(current, "workspace.json")) ||
78
+ fs.existsSync(path.join(current, ".git"))
79
+ ) {
80
+ return current;
81
+ }
82
+ current = path.dirname(current);
83
+ }
84
+
85
+ // Fallback to __dirname search if discovery from cwd fails
86
+ current = __dirname;
87
+ while (current !== path.parse(current).root) {
88
+ if (
89
+ fs.existsSync(path.join(current, "project_config.json")) ||
90
+ fs.existsSync(path.join(current, "workspace.json")) ||
91
+ fs.existsSync(path.join(current, ".git"))
92
+ ) {
71
93
  return current;
72
94
  }
73
95
  current = path.dirname(current);
@@ -79,20 +101,28 @@ function findRepoRoot() {
79
101
  export const config = {
80
102
  get githubToken() { return getGithubToken(); },
81
103
  get githubOwner() {
82
- if (process.env.GITHUB_OWNER) return process.env.GITHUB_OWNER;
83
104
  const repoString = cachedDynamicConfig?.github_repo;
84
- if (typeof repoString !== "string" || !repoString.includes("/")) {
85
- throw new Error("GITHUB_OWNER must be set via environment variable or project_config.json");
105
+ if (typeof repoString === "string" && repoString.includes("/")) {
106
+ return repoString.split("/")[0];
107
+ }
108
+ if (process.env.GITHUB_OWNER) return process.env.GITHUB_OWNER;
109
+ const envRepo = process.env.GITHUB_REPOSITORY || process.env.GH_REPO;
110
+ if (envRepo && envRepo.includes("/")) {
111
+ return envRepo.split("/")[0];
86
112
  }
87
- return repoString.split("/")[0];
113
+ throw new Error("GITHUB_OWNER must be set via environment variable or project_config.json");
88
114
  },
89
115
  get githubRepo() {
90
- if (process.env.GITHUB_REPO) return process.env.GITHUB_REPO;
91
116
  const repoString = cachedDynamicConfig?.github_repo;
92
- if (typeof repoString !== "string" || !repoString.includes("/")) {
93
- throw new Error("GITHUB_REPO must be set via environment variable or project_config.json");
117
+ if (typeof repoString === "string" && repoString.includes("/")) {
118
+ return repoString.split("/")[1];
119
+ }
120
+ if (process.env.GITHUB_REPO) return process.env.GITHUB_REPO;
121
+ const envRepo = process.env.GITHUB_REPOSITORY || process.env.GH_REPO;
122
+ if (envRepo && envRepo.includes("/")) {
123
+ return envRepo.split("/")[1];
94
124
  }
95
- return repoString.split("/")[1];
125
+ throw new Error("GITHUB_REPO must be set via environment variable or project_config.json");
96
126
  },
97
127
  get repoPath() {
98
128
  return findRepoRoot();
package/src/lib/git.ts CHANGED
@@ -2,6 +2,40 @@ import { runCommand } from "./shell.js";
2
2
  import { config } from "../config.js";
3
3
  import path from "path";
4
4
  import fs from "fs/promises";
5
+ import { execSync } from "child_process";
6
+
7
+ const repoCache = new Map<string, string>();
8
+
9
+ export function resolveRepo(explicitRepo?: string | null, cwd?: string): string {
10
+ if (explicitRepo && explicitRepo.trim().length > 0) {
11
+ return explicitRepo.trim();
12
+ }
13
+
14
+ const targetCwd = cwd || process.cwd();
15
+ if (repoCache.has(targetCwd)) {
16
+ return repoCache.get(targetCwd)!;
17
+ }
18
+
19
+ try {
20
+ const url = execSync("git remote get-url origin", {
21
+ cwd: targetCwd,
22
+ encoding: "utf-8",
23
+ stdio: ["ignore", "pipe", "ignore"],
24
+ }).trim();
25
+
26
+ const match = url.match(/[:/]([^/]+\/[^/.]+)(\.git)?$/);
27
+ if (match) {
28
+ repoCache.set(targetCwd, match[1]);
29
+ return match[1];
30
+ }
31
+ } catch (e) {
32
+ // Ignore error and fall back to static config
33
+ }
34
+
35
+ const fallback = `${config.githubOwner}/${config.githubRepo}`;
36
+ repoCache.set(targetCwd, fallback);
37
+ return fallback;
38
+ }
5
39
 
6
40
  function validatePrNumber(value: unknown): number {
7
41
  const prNumber = Number(value);
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { normalizeArguments } from "./param_utils.js";
3
+
4
+ describe("param_utils.normalizeArguments", () => {
5
+ it("should convert snake_case keys to camelCase", () => {
6
+ const input = {
7
+ pr_number: 123,
8
+ issue_number: 456,
9
+ worktree_path: "/tmp/worktree",
10
+ base_branch: "main",
11
+ };
12
+ const output = normalizeArguments(input);
13
+ expect(output).toEqual({
14
+ prNumber: 123,
15
+ issueNumber: 456,
16
+ worktreePath: "/tmp/worktree",
17
+ baseBranch: "main",
18
+ });
19
+ });
20
+
21
+ it("should coerce numeric strings for prNumber and issueNumber", () => {
22
+ const input = {
23
+ pr_number: "789",
24
+ issue_number: "101",
25
+ };
26
+ const output = normalizeArguments(input);
27
+ expect(output).toEqual({
28
+ prNumber: 789,
29
+ issueNumber: 101,
30
+ });
31
+ });
32
+
33
+ it("should synchronize branch and branchName", () => {
34
+ expect(normalizeArguments({ branch: "feat-x" })).toEqual({
35
+ branch: "feat-x",
36
+ branchName: "feat-x",
37
+ });
38
+
39
+ expect(normalizeArguments({ branch_name: "feat-y" })).toEqual({
40
+ branchName: "feat-y",
41
+ branch: "feat-y",
42
+ });
43
+ });
44
+
45
+ it("should handle null or empty arguments safely", () => {
46
+ expect(normalizeArguments(null)).toEqual({});
47
+ expect(normalizeArguments(undefined)).toEqual({});
48
+ });
49
+ });
@@ -0,0 +1,42 @@
1
+ export function normalizeArguments(args: Record<string, unknown> | null | undefined): Record<string, unknown> {
2
+ if (!args || typeof args !== "object") {
3
+ return {};
4
+ }
5
+
6
+ const result: Record<string, unknown> = {};
7
+
8
+ for (const [key, value] of Object.entries(args)) {
9
+ // Convert snake_case to camelCase
10
+ const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
11
+
12
+ // Normalize value recursively if it's an object/array
13
+ let normalizedValue = value;
14
+ if (Array.isArray(value)) {
15
+ normalizedValue = value.map((item) =>
16
+ item && typeof item === "object" ? normalizeArguments(item as Record<string, unknown>) : item
17
+ );
18
+ } else if (value && typeof value === "object" && !(value instanceof RegExp)) {
19
+ normalizedValue = normalizeArguments(value as Record<string, unknown>);
20
+ }
21
+
22
+ // Coerce numeric string to integer for prNumber / issueNumber if applicable
23
+ if ((camelKey === "prNumber" || camelKey === "issueNumber") && typeof normalizedValue === "string") {
24
+ const parsedNum = parseInt(normalizedValue, 10);
25
+ if (!isNaN(parsedNum)) {
26
+ normalizedValue = parsedNum;
27
+ }
28
+ }
29
+
30
+ result[camelKey] = normalizedValue;
31
+ }
32
+
33
+ // Parameter aliases harmonization
34
+ // branch vs branchName harmonization
35
+ if (result.branch !== undefined && result.branchName === undefined) {
36
+ result.branchName = result.branch;
37
+ } else if (result.branchName !== undefined && result.branch === undefined) {
38
+ result.branch = result.branchName;
39
+ }
40
+
41
+ return result;
42
+ }
@@ -99,7 +99,7 @@ export const MCP_RESOURCES: Resource[] = [
99
99
  },
100
100
  ];
101
101
 
102
- export const MCP_TOOLS: Tool[] = [
102
+ const BASE_MCP_TOOLS: Tool[] = [
103
103
  {
104
104
  name: "boomtick.health",
105
105
  description: "Check the health and configuration of the MCP server.",
@@ -276,3 +276,14 @@ export const MCP_TOOLS: Tool[] = [
276
276
  inputSchema: SearchDdgsInputJsonSchema as any,
277
277
  },
278
278
  ];
279
+
280
+ export const MCP_TOOLS: Tool[] = BASE_MCP_TOOLS.flatMap((tool) => {
281
+ const underscoreName = tool.name.replace(/\./g, "_");
282
+ if (underscoreName !== tool.name) {
283
+ return [
284
+ { ...tool, name: underscoreName },
285
+ tool,
286
+ ];
287
+ }
288
+ return [tool];
289
+ });
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import { execSync } from "child_process";
5
+
6
+ describe("MCP tool schemas export", () => {
7
+ it("should generate valid schema files with non-null parameters object", () => {
8
+ const schemasDir = path.resolve(process.cwd(), ".mcp/schemas");
9
+ if (!fs.existsSync(schemasDir)) {
10
+ execSync("npx tsx scripts/sync-mcp-schemas.ts", { cwd: process.cwd() });
11
+ }
12
+ expect(fs.existsSync(schemasDir)).toBe(true);
13
+
14
+ const files = fs.readdirSync(schemasDir).filter((f) => f.endsWith(".json"));
15
+ expect(files.length).toBeGreaterThan(0);
16
+
17
+ for (const file of files) {
18
+ const filePath = path.join(schemasDir, file);
19
+ const content = JSON.parse(fs.readFileSync(filePath, "utf-8"));
20
+
21
+ expect(content).toHaveProperty("name");
22
+ expect(typeof content.name).toBe("string");
23
+
24
+ expect(content).toHaveProperty("description");
25
+ expect(typeof content.description).toBe("string");
26
+
27
+ expect(content).toHaveProperty("parameters");
28
+ expect(content.parameters).not.toBeNull();
29
+ expect(typeof content.parameters).toBe("object");
30
+ expect(content.parameters.type).toBe("object");
31
+ expect(content.parameters.properties).toBeDefined();
32
+ }
33
+ });
34
+ });
package/src/mcp/server.ts CHANGED
@@ -11,6 +11,7 @@ import {
11
11
  import { config } from "../config.js";
12
12
  import { createSuccessResult, createErrorResult } from "../lib/result.js";
13
13
  import { MCP_TOOLS, MCP_PROMPTS, MCP_RESOURCES } from "./definitions.js";
14
+ import { normalizeArguments } from "../lib/param_utils.js";
14
15
  import { healthHandler, HealthCheckInputSchema } from "./tools.js";
15
16
  import { searchOpenPrsHandler, SearchOpenPrsInputSchema } from "../tools/github.search_open_prs.js";
16
17
  import { getPrDiffHandler, GetPrDiffInputSchema } from "../tools/github.get_pr_diff.js";
@@ -182,80 +183,114 @@ export class BoomtickMCPServer {
182
183
 
183
184
  this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
184
185
  try {
185
- switch (request.params.name) {
186
+ const normalizedToolName = request.params.name.replace(/_/g, ".");
187
+ const normArgs = normalizeArguments(request.params.arguments as Record<string, unknown>);
188
+
189
+ switch (normalizedToolName) {
186
190
  case "boomtick.health":
187
- return createSuccessResult(await healthHandler(HealthCheckInputSchema.parse(request.params.arguments || {})));
191
+ return createSuccessResult(await healthHandler(HealthCheckInputSchema.parse(normArgs)));
192
+ case "github.search.open.prs":
188
193
  case "github.search_open_prs":
189
- return createSuccessResult(await searchOpenPrsHandler(SearchOpenPrsInputSchema.parse(request.params.arguments || {})));
194
+ return createSuccessResult(await searchOpenPrsHandler(SearchOpenPrsInputSchema.parse(normArgs)));
195
+ case "repo.read.agent.context":
190
196
  case "repo.read_agent_context":
191
- return createSuccessResult(await readAgentContextHandler(ReadAgentContextInputSchema.parse(request.params.arguments || {})));
197
+ return createSuccessResult(await readAgentContextHandler(ReadAgentContextInputSchema.parse(normArgs)));
198
+ case "github.get.pr.diff":
192
199
  case "github.get_pr_diff":
193
- return createSuccessResult(await getPrDiffHandler(GetPrDiffInputSchema.parse(request.params.arguments)));
200
+ return createSuccessResult(await getPrDiffHandler(GetPrDiffInputSchema.parse(normArgs)));
201
+ case "github.get.merge.conflict.files":
194
202
  case "github.get_merge_conflict_files":
195
- return createSuccessResult(await getMergeConflictFilesHandler(GetMergeConflictFilesInputSchema.parse(request.params.arguments)));
203
+ return createSuccessResult(await getMergeConflictFilesHandler(GetMergeConflictFilesInputSchema.parse(normArgs)));
204
+ case "github.checkout.branch":
196
205
  case "github.checkout_branch":
197
- return createSuccessResult(await checkoutBranchHandler(CheckoutBranchInputSchema.parse(request.params.arguments)));
206
+ return createSuccessResult(await checkoutBranchHandler(CheckoutBranchInputSchema.parse(normArgs)));
207
+ case "repo.get.changed.files":
198
208
  case "repo.get_changed_files":
199
- return createSuccessResult(await getChangedFilesHandler(GetChangedFilesInputSchema.parse(request.params.arguments || {})));
209
+ return createSuccessResult(await getChangedFilesHandler(GetChangedFilesInputSchema.parse(normArgs)));
210
+ case "repo.get.command.schema":
200
211
  case "repo.get_command_schema":
201
- return createSuccessResult(await getCommandSchemaHandler(GetCommandSchemaInputSchema.parse(request.params.arguments)));
212
+ return createSuccessResult(await getCommandSchemaHandler(GetCommandSchemaInputSchema.parse(normArgs)));
213
+ case "repo.get.package.scripts":
202
214
  case "repo.get_package_scripts":
203
- return createSuccessResult(await getPackageScriptsHandler(GetPackageScriptsInputSchema.parse(request.params.arguments || {})));
215
+ return createSuccessResult(await getPackageScriptsHandler(GetPackageScriptsInputSchema.parse(normArgs)));
216
+ case "repo.get.route.map":
204
217
  case "repo.get_route_map":
205
- return createSuccessResult(await getRouteMapHandler(GetRouteMapInputSchema.parse(request.params.arguments || {})));
218
+ return createSuccessResult(await getRouteMapHandler(GetRouteMapInputSchema.parse(normArgs)));
219
+ case "repo.read.ci.logs":
206
220
  case "repo.read_ci_logs":
207
- return createSuccessResult(await readCiLogsHandler(ReadCiLogsInputSchema.parse(request.params.arguments)));
221
+ return createSuccessResult(await readCiLogsHandler(ReadCiLogsInputSchema.parse(normArgs)));
208
222
  case "repo.logs":
209
- return createSuccessResult(await repoLogsHandler(RepoLogsInputSchema.parse(request.params.arguments)));
223
+ return createSuccessResult(await repoLogsHandler(RepoLogsInputSchema.parse(normArgs)));
224
+ case "repo.create.branch":
210
225
  case "repo.create_branch":
211
- return createSuccessResult(await createBranchHandler(CreateBranchInputSchema.parse(request.params.arguments)));
226
+ return createSuccessResult(await createBranchHandler(CreateBranchInputSchema.parse(normArgs)));
227
+ case "repo.create.repair.branch":
212
228
  case "repo.create_repair_branch":
213
- return createSuccessResult(await createRepairBranchHandler(CreateRepairBranchInputSchema.parse(request.params.arguments)));
229
+ return createSuccessResult(await createRepairBranchHandler(CreateRepairBranchInputSchema.parse(normArgs)));
230
+ case "repo.run.tests":
214
231
  case "repo.run_tests":
215
- return createSuccessResult(await runTestsHandler(RunTestsInputSchema.parse(request.params.arguments || {})));
232
+ return createSuccessResult(await runTestsHandler(RunTestsInputSchema.parse(normArgs)));
233
+ case "repo.run.lighthouse":
216
234
  case "repo.run_lighthouse":
217
- return createSuccessResult(await runLighthouseHandler(RunLighthouseInputSchema.parse(request.params.arguments || {})));
235
+ return createSuccessResult(await runLighthouseHandler(RunLighthouseInputSchema.parse(normArgs)));
236
+ case "repo.run.playwright":
218
237
  case "repo.run_playwright":
219
- return createSuccessResult(await runPlaywrightHandler(RunPlaywrightInputSchema.parse(request.params.arguments || {})));
238
+ return createSuccessResult(await runPlaywrightHandler(RunPlaywrightInputSchema.parse(normArgs)));
239
+ case "repo.commit.patch":
220
240
  case "repo.commit_patch":
221
- return createSuccessResult(await commitPatchHandler(CommitPatchInputSchema.parse(request.params.arguments)));
241
+ return createSuccessResult(await commitPatchHandler(CommitPatchInputSchema.parse(normArgs)));
242
+ case "github.open.replacement.pr":
222
243
  case "github.open_replacement_pr":
223
- return createSuccessResult(await openReplacementPrHandler(OpenReplacementPrInputSchema.parse(request.params.arguments)));
244
+ return createSuccessResult(await openReplacementPrHandler(OpenReplacementPrInputSchema.parse(normArgs)));
245
+ case "github.comment.triage.summary":
224
246
  case "github.comment_triage_summary":
225
- return createSuccessResult(await commentTriageSummaryHandler(CommentTriageSummaryInputSchema.parse(request.params.arguments)));
247
+ return createSuccessResult(await commentTriageSummaryHandler(CommentTriageSummaryInputSchema.parse(normArgs)));
248
+ case "github.create.pull.request":
226
249
  case "github.create_pull_request":
227
- return createSuccessResult(await createPullRequestHandler(CreatePullRequestInputSchema.parse(request.params.arguments)));
250
+ return createSuccessResult(await createPullRequestHandler(CreatePullRequestInputSchema.parse(normArgs)));
251
+ case "github.get.pr":
228
252
  case "github.get_pr":
229
- return createSuccessResult(await getPrHandler(GetPrInputSchema.parse(request.params.arguments)));
253
+ return createSuccessResult(await getPrHandler(GetPrInputSchema.parse(normArgs)));
254
+ case "github.issue.view":
230
255
  case "github.issue_view":
231
- return createSuccessResult(await issueViewHandler(IssueViewInputSchema.parse(request.params.arguments)));
256
+ return createSuccessResult(await issueViewHandler(IssueViewInputSchema.parse(normArgs)));
257
+ case "github.issue.update":
232
258
  case "github.issue_update":
233
- return createSuccessResult(await issueUpdateHandler(IssueUpdateInputSchema.parse(request.params.arguments)));
259
+ return createSuccessResult(await issueUpdateHandler(IssueUpdateInputSchema.parse(normArgs)));
260
+ case "github.issue.comment":
234
261
  case "github.issue_comment":
235
- return createSuccessResult(await issueCommentHandler(IssueCommentInputSchema.parse(request.params.arguments)));
262
+ return createSuccessResult(await issueCommentHandler(IssueCommentInputSchema.parse(normArgs)));
263
+ case "github.create.issue":
236
264
  case "github.create_issue":
237
- return createSuccessResult(await createIssueHandler(CreateIssueInputSchema.parse(request.params.arguments)));
238
-
239
-
265
+ return createSuccessResult(await createIssueHandler(CreateIssueInputSchema.parse(normArgs)));
240
266
 
267
+ case "jules.create.session":
241
268
  case "jules.create_session":
242
- return createSuccessResult(await createJulesSessionHandler(CreateJulesSessionInputSchema.parse(request.params.arguments)));
269
+ return createSuccessResult(await createJulesSessionHandler(CreateJulesSessionInputSchema.parse(normArgs)));
270
+ case "jules.get.session":
243
271
  case "jules.get_session":
244
- return createSuccessResult(await getJulesSessionHandler(GetJulesSessionInputSchema.parse(request.params.arguments)));
272
+ return createSuccessResult(await getJulesSessionHandler(GetJulesSessionInputSchema.parse(normArgs)));
273
+ case "jules.send.message":
245
274
  case "jules.send_message":
246
- return createSuccessResult(await sendJulesMessageHandler(SendJulesMessageInputSchema.parse(request.params.arguments)));
275
+ return createSuccessResult(await sendJulesMessageHandler(SendJulesMessageInputSchema.parse(normArgs)));
276
+ case "jules.get.messages":
247
277
  case "jules.get_messages":
248
- return createSuccessResult(await getJulesMessagesHandler(GetJulesMessagesInputSchema.parse(request.params.arguments)));
278
+ return createSuccessResult(await getJulesMessagesHandler(GetJulesMessagesInputSchema.parse(normArgs)));
279
+ case "jules.list.sessions":
249
280
  case "jules.list_sessions":
250
- return createSuccessResult(await listJulesSessionsHandler(ListJulesSessionsInputSchema.parse(request.params.arguments || {})));
281
+ return createSuccessResult(await listJulesSessionsHandler(ListJulesSessionsInputSchema.parse(normArgs)));
282
+ case "jules.cancel.session":
251
283
  case "jules.cancel_session":
252
- return createSuccessResult(await cancelJulesSessionHandler(CancelJulesSessionInputSchema.parse(request.params.arguments)));
284
+ return createSuccessResult(await cancelJulesSessionHandler(CancelJulesSessionInputSchema.parse(normArgs)));
285
+ case "jules.get.pr":
253
286
  case "jules.get_pr":
254
- return createSuccessResult(await getJulesPullRequestHandler(GetJulesPullRequestInputSchema.parse(request.params.arguments)));
287
+ return createSuccessResult(await getJulesPullRequestHandler(GetJulesPullRequestInputSchema.parse(normArgs)));
288
+ case "jules.trigger.feedback":
255
289
  case "jules.trigger_feedback":
256
- return createSuccessResult(await triggerJulesFeedbackHandler(TriggerJulesFeedbackInputSchema.parse(request.params.arguments)));
290
+ return createSuccessResult(await triggerJulesFeedbackHandler(TriggerJulesFeedbackInputSchema.parse(normArgs)));
291
+ case "agent.search.ddgs":
257
292
  case "agent.search_ddgs":
258
- return createSuccessResult(await ddgsSearchHandler(DdgsSearchInputSchema.parse(request.params.arguments)));
293
+ return createSuccessResult(await ddgsSearchHandler(DdgsSearchInputSchema.parse(normArgs)));
259
294
  default:
260
295
  return createErrorResult(`Tool not found: ${request.params.name}`);
261
296
  }