@imenam/mcp-github 1.1.45 → 1.1.47

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 (46) hide show
  1. package/README.md +2 -2
  2. package/dist/__tests__/utils/config.test.d.ts +2 -0
  3. package/dist/__tests__/utils/config.test.d.ts.map +1 -0
  4. package/dist/__tests__/utils/config.test.js +212 -0
  5. package/dist/__tests__/utils/config.test.js.map +1 -0
  6. package/dist/__tests__/utils/git.test.d.ts +2 -0
  7. package/dist/__tests__/utils/git.test.d.ts.map +1 -0
  8. package/dist/__tests__/utils/git.test.js +96 -0
  9. package/dist/__tests__/utils/git.test.js.map +1 -0
  10. package/dist/config-server.d.ts.map +1 -1
  11. package/dist/config-server.js +2 -0
  12. package/dist/config-server.js.map +1 -1
  13. package/dist/gui-process.d.ts +7 -0
  14. package/dist/gui-process.d.ts.map +1 -0
  15. package/dist/gui-process.js +59 -0
  16. package/dist/gui-process.js.map +1 -0
  17. package/dist/handlers/deploy.d.ts +28 -0
  18. package/dist/handlers/deploy.d.ts.map +1 -0
  19. package/dist/handlers/deploy.js +78 -0
  20. package/dist/handlers/deploy.js.map +1 -0
  21. package/dist/handlers/git.d.ts +39 -0
  22. package/dist/handlers/git.d.ts.map +1 -0
  23. package/dist/handlers/git.js +248 -0
  24. package/dist/handlers/git.js.map +1 -0
  25. package/dist/handlers/github.d.ts +17 -0
  26. package/dist/handlers/github.d.ts.map +1 -0
  27. package/dist/handlers/github.js +80 -0
  28. package/dist/handlers/github.js.map +1 -0
  29. package/dist/handlers/info.d.ts +15 -0
  30. package/dist/handlers/info.d.ts.map +1 -0
  31. package/dist/handlers/info.js +66 -0
  32. package/dist/handlers/info.js.map +1 -0
  33. package/dist/index.js +27 -597
  34. package/dist/index.js.map +1 -1
  35. package/dist/utils/config.d.ts +2 -0
  36. package/dist/utils/config.d.ts.map +1 -1
  37. package/dist/utils/config.js +4 -4
  38. package/dist/utils/config.js.map +1 -1
  39. package/dist/utils/git.d.ts +5 -0
  40. package/dist/utils/git.d.ts.map +1 -0
  41. package/dist/utils/git.js +74 -0
  42. package/dist/utils/git.js.map +1 -0
  43. package/dist/utils/ssh.js +1 -1
  44. package/dist/utils/ssh.js.map +1 -1
  45. package/package.json +7 -3
  46. package/public/index.html +2 -0
@@ -0,0 +1,78 @@
1
+ import {} from "@modelcontextprotocol/sdk/types.js";
2
+ import { logToFile } from "../logger.js";
3
+ import { getConfig } from "../utils/config.js";
4
+ import { assertSshConfig, execRemote } from "../utils/ssh.js";
5
+ let _lastTestResult = null;
6
+ export const DEPLOY_TOOLS = [
7
+ {
8
+ name: "deploy",
9
+ description: "Sur le serveur distant configuré (SSH_HOST), exécute 'git fetch --all', 'git checkout TARGET_BRANCH' et 'git pull' dans SSH_REMOTE_PATH. Le repo doit déjà être cloné sur le serveur.",
10
+ inputSchema: {
11
+ type: "object",
12
+ properties: {},
13
+ },
14
+ },
15
+ {
16
+ name: "test",
17
+ description: "Exécute TEST_COMMAND sur le serveur distant (cwd = SSH_REMOTE_PATH) et renvoie stdout, stderr et exit code. Stocke la sortie pour 'test_logs'.",
18
+ inputSchema: {
19
+ type: "object",
20
+ properties: {},
21
+ },
22
+ },
23
+ {
24
+ name: "test_logs",
25
+ description: "Renvoie la sortie (stdout + stderr + exit code) du dernier 'test' exécuté, sans relancer la commande.",
26
+ inputSchema: {
27
+ type: "object",
28
+ properties: {},
29
+ },
30
+ },
31
+ ];
32
+ export async function handleDeploy(_args, config) {
33
+ assertSshConfig();
34
+ if (!config.TARGET_BRANCH) {
35
+ throw new Error("TARGET_BRANCH est manquant. Configurez-le via la GUI ou le .env.");
36
+ }
37
+ const authHeader = config.GITHUB_TOKEN
38
+ ? `Authorization: Basic ${Buffer.from(`x-access-token:${config.GITHUB_TOKEN}`).toString("base64")}`
39
+ : null;
40
+ const gitPrefix = authHeader
41
+ ? `git -c http.extraHeader="${authHeader}" -c http.prompt=false`
42
+ : `GIT_TERMINAL_PROMPT=0 git`;
43
+ const deployCommand = `${gitPrefix} fetch --all && ${gitPrefix} checkout ${config.TARGET_BRANCH} && ${gitPrefix} pull`;
44
+ const deployResult = await execRemote(deployCommand);
45
+ if (deployResult.code !== 0) {
46
+ const msg = `Deploy échoué (exit code ${deployResult.code}):\n${deployResult.stderr || deployResult.stdout}`;
47
+ logToFile(`[deploy] ${msg}`);
48
+ return { content: [{ type: "text", text: msg }], isError: true };
49
+ }
50
+ const deployMsg = `Deploy réussi sur ${config.SSH_HOST}:${config.SSH_REMOTE_PATH} (branche: ${config.TARGET_BRANCH})\n\n${deployResult.stdout}`.trim();
51
+ logToFile(`[deploy] ${deployMsg}`);
52
+ return { content: [{ type: "text", text: deployMsg }] };
53
+ }
54
+ export async function handleTest(_args, config) {
55
+ assertSshConfig();
56
+ if (!config.TEST_COMMAND) {
57
+ throw new Error("TEST_COMMAND est manquant dans le .env.");
58
+ }
59
+ const testResult = await execRemote(config.TEST_COMMAND);
60
+ _lastTestResult = {
61
+ command: config.TEST_COMMAND,
62
+ stdout: testResult.stdout,
63
+ stderr: testResult.stderr,
64
+ code: testResult.code,
65
+ ranAt: new Date().toISOString(),
66
+ };
67
+ const testMsg = `Command: ${config.TEST_COMMAND}\nExit code: ${testResult.code}\n--- STDOUT ---\n${testResult.stdout}\n--- STDERR ---\n${testResult.stderr}`;
68
+ logToFile(`[test] Exit code: ${testResult.code}`);
69
+ return { content: [{ type: "text", text: testMsg }] };
70
+ }
71
+ export async function handleTestLogs() {
72
+ if (!_lastTestResult) {
73
+ return { content: [{ type: "text", text: "Aucun test n'a encore été exécuté. Lance d'abord 'test'." }] };
74
+ }
75
+ const logsMsg = `(Cached, ranAt: ${_lastTestResult.ranAt})\nCommand: ${_lastTestResult.command}\nExit code: ${_lastTestResult.code}\n--- STDOUT ---\n${_lastTestResult.stdout}\n--- STDERR ---\n${_lastTestResult.stderr}`;
76
+ return { content: [{ type: "text", text: logsMsg }] };
77
+ }
78
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/handlers/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const GIT_TOOLS: Tool[];
3
+ export declare function handleCommit(args: any, config: any): Promise<{
4
+ content: {
5
+ type: string;
6
+ text: string;
7
+ }[];
8
+ }>;
9
+ export declare function handlePush(_args: any, config: any): Promise<{
10
+ content: {
11
+ type: string;
12
+ text: string;
13
+ }[];
14
+ }>;
15
+ export declare function handleCommitAndPush(args: any, config: any): Promise<{
16
+ content: {
17
+ type: string;
18
+ text: string;
19
+ }[];
20
+ }>;
21
+ export declare function handleClone(): Promise<{
22
+ content: {
23
+ type: string;
24
+ text: string;
25
+ }[];
26
+ }>;
27
+ export declare function handleCheckStatus(_args: any, config: any): Promise<{
28
+ content: {
29
+ type: string;
30
+ text: string;
31
+ }[];
32
+ }>;
33
+ export declare function handleInitWorkingDir(_args: any, config: any, octokit: any): Promise<{
34
+ content: {
35
+ type: string;
36
+ text: string;
37
+ }[];
38
+ }>;
39
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/handlers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAK/D,eAAO,MAAM,SAAS,EAAE,IAAI,EAuD3B,CAAC;AAEF,wBAAsB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;;;;;GAyCxD;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;;;;;GAqCvD;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;;;;;GAmD/D;AAED,wBAAsB,WAAW;;;;;GAGhC;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;;;;;GAY9D;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG;;;;;GAwD/E"}
@@ -0,0 +1,248 @@
1
+ import {} from "@modelcontextprotocol/sdk/types.js";
2
+ import fs from "fs";
3
+ import { logToFile } from "../logger.js";
4
+ import { getCurrentBranch, execGitSecure, performClone } from "../utils/git.js";
5
+ export const GIT_TOOLS = [
6
+ {
7
+ name: "commit",
8
+ description: "Stage all changes (git add .) and commit with the provided message. Does NOT push to remote.",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ message: { type: "string", description: "The commit message" },
13
+ },
14
+ required: ["message"],
15
+ },
16
+ },
17
+ {
18
+ name: "push",
19
+ description: "Push the current branch to the remote origin using the configured TARGET_BRANCH. Does NOT add or commit changes.",
20
+ inputSchema: {
21
+ type: "object",
22
+ properties: {},
23
+ },
24
+ },
25
+ {
26
+ name: "commit_and_push",
27
+ description: "Automated workflow: adds all local changes (including untracked), commits with a message, and pushes to the branch defined in TARGET_BRANCH",
28
+ inputSchema: {
29
+ type: "object",
30
+ properties: {
31
+ message: { type: "string", description: "The commit message" },
32
+ },
33
+ required: ["message"],
34
+ },
35
+ },
36
+ {
37
+ name: "clone",
38
+ description: "Clone the repository defined in TARGET_REPO into <CLONE_DIR>/<repo-name>/. Does NOT checkout TARGET_BRANCH — use 'init_working_dir' for that. If the repository is already cloned, REPO_PATH is updated and a message is returned.",
39
+ inputSchema: {
40
+ type: "object",
41
+ properties: {},
42
+ },
43
+ },
44
+ {
45
+ name: "check_status",
46
+ description: "Check whether the current git branch of the local repository matches the configured TARGET_BRANCH. Returns currentBranch, expectedBranch, and a match indicator.",
47
+ inputSchema: {
48
+ type: "object",
49
+ properties: {},
50
+ },
51
+ },
52
+ {
53
+ name: "init_working_dir",
54
+ description: "Prepare the working directory for the configured TARGET_BRANCH: auto-stash local changes, checkout BASE_BRANCH, fetch all remotes, then checkout TARGET_BRANCH (pulling latest if it exists, or creating and pushing it if not).",
55
+ inputSchema: {
56
+ type: "object",
57
+ properties: {},
58
+ },
59
+ },
60
+ ];
61
+ export async function handleCommit(args, config) {
62
+ if (config.READ_ONLY)
63
+ throw new Error("Server is in read-only mode");
64
+ const { message } = args;
65
+ const finalRepoPath = config.REPO_PATH;
66
+ if (!finalRepoPath) {
67
+ throw new Error("Repository path is not defined. You must call 'clone' first.");
68
+ }
69
+ if (!fs.existsSync(finalRepoPath)) {
70
+ throw new Error(`Repository not found at "${finalRepoPath}". You must call 'clone' first.`);
71
+ }
72
+ const currentBranch = getCurrentBranch(finalRepoPath);
73
+ if (currentBranch !== config.TARGET_BRANCH) {
74
+ throw new Error(`Branch mismatch: current branch is "${currentBranch}", expected "${config.TARGET_BRANCH}". Run 'init_working_dir' first.`);
75
+ }
76
+ const execOptions = { cwd: finalRepoPath };
77
+ try {
78
+ execGitSecure("git add .", execOptions);
79
+ try {
80
+ execGitSecure(`git commit -m "${message}"`, execOptions);
81
+ }
82
+ catch (e) {
83
+ const status = execGitSecure("git status --porcelain", execOptions).toString();
84
+ if (status.length === 0) {
85
+ return { content: [{ type: "text", text: "Nothing to commit, working tree clean." }] };
86
+ }
87
+ throw e;
88
+ }
89
+ const successMsg = `Successfully committed all changes with message: "${message}"`;
90
+ logToFile(successMsg);
91
+ return { content: [{ type: "text", text: successMsg }] };
92
+ }
93
+ catch (error) {
94
+ const msg = `Git commit failed at ${finalRepoPath}: ${error.message}`;
95
+ logToFile(msg);
96
+ throw new Error(msg);
97
+ }
98
+ }
99
+ export async function handlePush(_args, config) {
100
+ if (config.READ_ONLY)
101
+ throw new Error("Server is in read-only mode");
102
+ const finalRepoPath = config.REPO_PATH;
103
+ if (!finalRepoPath) {
104
+ throw new Error("Repository path is not defined. You must call 'clone' first.");
105
+ }
106
+ if (!fs.existsSync(finalRepoPath)) {
107
+ throw new Error(`Repository not found at "${finalRepoPath}". You must call 'clone' first.`);
108
+ }
109
+ if (!config.TARGET_BRANCH) {
110
+ throw new Error("TARGET_BRANCH environment variable is not defined");
111
+ }
112
+ const currentBranch = getCurrentBranch(finalRepoPath);
113
+ if (currentBranch !== config.TARGET_BRANCH) {
114
+ throw new Error(`Branch mismatch: current branch is "${currentBranch}", expected "${config.TARGET_BRANCH}". Run 'init_working_dir' first.`);
115
+ }
116
+ const execOptions = { cwd: finalRepoPath };
117
+ try {
118
+ const remote = config.TARGET_REPO
119
+ ? `https://github.com/${config.TARGET_REPO}.git`
120
+ : "origin";
121
+ execGitSecure(`push ${remote} HEAD:${config.TARGET_BRANCH}`, execOptions);
122
+ const successMsg = `Successfully pushed to ${config.TARGET_BRANCH} from ${finalRepoPath}`;
123
+ logToFile(successMsg);
124
+ return { content: [{ type: "text", text: successMsg }] };
125
+ }
126
+ catch (error) {
127
+ const msg = `Git push failed at ${finalRepoPath}: ${error.message}`;
128
+ logToFile(msg);
129
+ throw new Error(msg);
130
+ }
131
+ }
132
+ export async function handleCommitAndPush(args, config) {
133
+ if (config.READ_ONLY)
134
+ throw new Error("Server is in read-only mode");
135
+ const { message } = args;
136
+ const finalRepoPath = config.REPO_PATH;
137
+ if (!finalRepoPath) {
138
+ throw new Error("Repository path is not defined. You must call 'clone' first.");
139
+ }
140
+ if (!fs.existsSync(finalRepoPath)) {
141
+ throw new Error(`Repository not found at "${finalRepoPath}". You must call 'clone' first.`);
142
+ }
143
+ if (!config.TARGET_BRANCH) {
144
+ throw new Error("TARGET_BRANCH environment variable is not defined");
145
+ }
146
+ const currentBranch = getCurrentBranch(finalRepoPath);
147
+ if (currentBranch !== config.TARGET_BRANCH) {
148
+ throw new Error(`Branch mismatch: current branch is "${currentBranch}", expected "${config.TARGET_BRANCH}". Run 'init_working_dir' first.`);
149
+ }
150
+ const execOptions = { cwd: finalRepoPath };
151
+ try {
152
+ execGitSecure("git add .", execOptions);
153
+ try {
154
+ execGitSecure(`git commit -m "${message}"`, execOptions);
155
+ }
156
+ catch (e) {
157
+ const status = execGitSecure("git status --porcelain", execOptions).toString();
158
+ if (status.length === 0) {
159
+ return { content: [{ type: "text", text: "Nothing to commit, working tree clean." }] };
160
+ }
161
+ throw e;
162
+ }
163
+ const remote = config.TARGET_REPO
164
+ ? `https://github.com/${config.TARGET_REPO}.git`
165
+ : "origin";
166
+ execGitSecure(`push ${remote} HEAD:${config.TARGET_BRANCH}`, execOptions);
167
+ const successMsg = `Successfully committed and pushed all changes to branch ${config.TARGET_BRANCH} from ${finalRepoPath}`;
168
+ logToFile(successMsg);
169
+ return { content: [{ type: "text", text: successMsg }] };
170
+ }
171
+ catch (error) {
172
+ const msg = `Git operation failed at ${finalRepoPath}: ${error.message}`;
173
+ logToFile(msg);
174
+ throw new Error(msg);
175
+ }
176
+ }
177
+ export async function handleClone() {
178
+ const result = await performClone();
179
+ return { content: [{ type: "text", text: result }] };
180
+ }
181
+ export async function handleCheckStatus(_args, config) {
182
+ const repoPath = config.REPO_PATH;
183
+ if (!repoPath) {
184
+ throw new Error("Repository path is not defined. You must call 'clone' first.");
185
+ }
186
+ if (!fs.existsSync(repoPath)) {
187
+ throw new Error(`Repository not found at "${repoPath}". You must call 'clone' first.`);
188
+ }
189
+ const currentBranch = getCurrentBranch(repoPath);
190
+ const expectedBranch = config.TARGET_BRANCH;
191
+ const match = currentBranch === expectedBranch;
192
+ return { content: [{ type: "text", text: JSON.stringify({ currentBranch, expectedBranch, match }, null, 2) }] };
193
+ }
194
+ export async function handleInitWorkingDir(_args, config, octokit) {
195
+ const repoPath = config.REPO_PATH;
196
+ if (!repoPath) {
197
+ throw new Error("Repository path is not defined. You must call 'clone' first.");
198
+ }
199
+ if (!fs.existsSync(repoPath)) {
200
+ throw new Error(`Repository not found at "${repoPath}". You must call 'clone' first.`);
201
+ }
202
+ if (!config.TARGET_BRANCH) {
203
+ throw new Error("TARGET_BRANCH is not defined.");
204
+ }
205
+ if (!config.TARGET_REPO || !config.TARGET_REPO.includes("/")) {
206
+ throw new Error("TARGET_REPO must be defined as 'owner/repo'");
207
+ }
208
+ const execOptions = { cwd: repoPath };
209
+ const steps = [];
210
+ const [owner, repo] = config.TARGET_REPO.split("/");
211
+ const currentBranchBefore = getCurrentBranch(repoPath);
212
+ const stashOutput = execGitSecure(`stash push -u -m "auto-stash/${currentBranchBefore}"`, execOptions).toString().trim();
213
+ if (stashOutput.includes("No local changes to save")) {
214
+ steps.push("No local changes to stash");
215
+ }
216
+ else {
217
+ steps.push(`Stashed local changes as "auto-stash/${currentBranchBefore}"`);
218
+ }
219
+ execGitSecure(`checkout ${config.BASE_BRANCH}`, execOptions);
220
+ steps.push(`Checked out ${config.BASE_BRANCH}`);
221
+ execGitSecure("fetch --all", execOptions);
222
+ steps.push("Fetched all remotes");
223
+ let branchExistsOnRemote = false;
224
+ if (octokit && owner && repo) {
225
+ try {
226
+ await octokit.rest.repos.getBranch({ owner, repo, branch: config.TARGET_BRANCH });
227
+ branchExistsOnRemote = true;
228
+ }
229
+ catch (e) {
230
+ if (e.status !== 404)
231
+ throw e;
232
+ }
233
+ }
234
+ if (branchExistsOnRemote) {
235
+ execGitSecure(`checkout ${config.TARGET_BRANCH}`, execOptions);
236
+ execGitSecure(`pull origin ${config.TARGET_BRANCH}`, execOptions);
237
+ steps.push(`Checked out and pulled "${config.TARGET_BRANCH}"`);
238
+ }
239
+ else {
240
+ execGitSecure(`checkout -b ${config.TARGET_BRANCH}`, execOptions);
241
+ execGitSecure(`push -u origin ${config.TARGET_BRANCH}`, execOptions);
242
+ steps.push(`Created and pushed new branch "${config.TARGET_BRANCH}"`);
243
+ }
244
+ const successMsg = `Working directory initialized:\n${steps.map(s => `- ${s}`).join("\n")}`;
245
+ logToFile(`[init_working_dir] ${successMsg}`);
246
+ return { content: [{ type: "text", text: successMsg }] };
247
+ }
248
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/handlers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAW;IAC/B;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,8FAA8F;QAC3G,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;aAC/D;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kHAAkH;QAC/H,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,6IAA6I;QAC1J,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;aAC/D;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,oOAAoO;QACjP,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,kKAAkK;QAC/K,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,kOAAkO;QAC/O,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAS,EAAE,MAAW;IACvD,IAAI,MAAM,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAErE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;IAEvC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,aAAa,iCAAiC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,aAAa,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uCAAuC,aAAa,gBAAgB,MAAM,CAAC,aAAa,kCAAkC,CAAC,CAAC;IAC9I,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,aAAa,CAAC,kBAAkB,OAAO,GAAG,EAAE,WAAW,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,aAAa,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC,EAAE,CAAC;YACzF,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;QAED,MAAM,UAAU,GAAG,qDAAqD,OAAO,GAAG,CAAC;QACnF,SAAS,CAAC,UAAU,CAAC,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,wBAAwB,aAAa,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACtE,SAAS,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAU,EAAE,MAAW;IACtD,IAAI,MAAM,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAErE,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;IACvC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,aAAa,iCAAiC,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,aAAa,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uCAAuC,aAAa,gBAAgB,MAAM,CAAC,aAAa,kCAAkC,CAAC,CAAC;IAC9I,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW;YAC/B,CAAC,CAAC,sBAAsB,MAAM,CAAC,WAAW,MAAM;YAChD,CAAC,CAAC,QAAQ,CAAC;QAEb,aAAa,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;QAE1E,MAAM,UAAU,GAAG,0BAA0B,MAAM,CAAC,aAAa,SAAS,aAAa,EAAE,CAAC;QAC1F,SAAS,CAAC,UAAU,CAAC,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,sBAAsB,aAAa,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACpE,SAAS,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAS,EAAE,MAAW;IAC9D,IAAI,MAAM,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAErE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC;IAEvC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,aAAa,iCAAiC,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,aAAa,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uCAAuC,aAAa,gBAAgB,MAAM,CAAC,aAAa,kCAAkC,CAAC,CAAC;IAC9I,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,aAAa,CAAC,kBAAkB,OAAO,GAAG,EAAE,WAAW,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,aAAa,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC,EAAE,CAAC;YACzF,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW;YAC/B,CAAC,CAAC,sBAAsB,MAAM,CAAC,WAAW,MAAM;YAChD,CAAC,CAAC,QAAQ,CAAC;QAEb,aAAa,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;QAE1E,MAAM,UAAU,GAAG,2DAA2D,MAAM,CAAC,aAAa,SAAS,aAAa,EAAE,CAAC;QAC3H,SAAS,CAAC,UAAU,CAAC,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,2BAA2B,aAAa,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACzE,SAAS,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAU,EAAE,MAAW;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,iCAAiC,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,KAAK,cAAc,CAAC;IAC/C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAClH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAU,EAAE,MAAW,EAAE,OAAY;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,iCAAiC,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpD,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,aAAa,CAAC,gCAAgC,mBAAmB,GAAG,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;IACzH,IAAI,WAAW,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,wCAAwC,mBAAmB,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,aAAa,CAAC,YAAY,MAAM,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhD,aAAa,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAElC,IAAI,oBAAoB,GAAG,KAAK,CAAC;IACjC,IAAI,OAAO,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YAClF,oBAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,aAAa,CAAC,YAAY,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/D,aAAa,CAAC,eAAe,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,eAAe,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;QAClE,aAAa,CAAC,kBAAkB,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,UAAU,GAAG,mCAAmC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5F,SAAS,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare function getOctokit(): (import("@octokit/core").Octokit & {
3
+ paginate: import("@octokit/plugin-paginate-rest").PaginateInterface;
4
+ } & import("@octokit/plugin-paginate-graphql").paginateGraphQLInterface & import("@octokit/plugin-rest-endpoint-methods").Api & {
5
+ retry: {
6
+ retryRequest: (error: import("octokit").RequestError, retries: number, retryAfter: number) => import("octokit").RequestError;
7
+ };
8
+ }) | null;
9
+ export declare function resetOctokit(): void;
10
+ export declare const GITHUB_TOOLS: Tool[];
11
+ export declare function handlePullRequest(args: any, config: any): Promise<{
12
+ content: {
13
+ type: string;
14
+ text: string;
15
+ }[];
16
+ }>;
17
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/handlers/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAQ/D,wBAAgB,UAAU;;;;;;UAOzB;AAED,wBAAgB,YAAY,SAE3B;AAED,eAAO,MAAM,YAAY,EAAE,IAAI,EAa9B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;;;;;GAkD7D"}
@@ -0,0 +1,80 @@
1
+ import {} from "@modelcontextprotocol/sdk/types.js";
2
+ import { Octokit } from "octokit";
3
+ import { logToFile } from "../logger.js";
4
+ import { getConfig } from "../utils/config.js";
5
+ import { getCurrentBranch } from "../utils/git.js";
6
+ let _octokit = null;
7
+ export function getOctokit() {
8
+ const { GITHUB_TOKEN } = getConfig();
9
+ if (!GITHUB_TOKEN)
10
+ return null;
11
+ if (!_octokit) {
12
+ _octokit = new Octokit({ auth: GITHUB_TOKEN });
13
+ }
14
+ return _octokit;
15
+ }
16
+ export function resetOctokit() {
17
+ _octokit = null;
18
+ }
19
+ export const GITHUB_TOOLS = [
20
+ {
21
+ name: "pull_request",
22
+ description: "Create a pull request from the TARGET_BRANCH to the BASE_BRANCH",
23
+ inputSchema: {
24
+ type: "object",
25
+ properties: {
26
+ title: { type: "string", description: "The title of the pull request" },
27
+ body: { type: "string", description: "The body/description of the pull request" },
28
+ },
29
+ required: ["title"],
30
+ },
31
+ },
32
+ ];
33
+ export async function handlePullRequest(args, config) {
34
+ const octokit = getOctokit();
35
+ if (!config.GITHUB_TOKEN) {
36
+ throw new Error("GITHUB_TOKEN est manquant. Veuillez le configurer via l'interface graphique.");
37
+ }
38
+ if (config.READ_ONLY)
39
+ throw new Error("Server is in read-only mode");
40
+ const prRepoPath = config.REPO_PATH;
41
+ if (!prRepoPath) {
42
+ throw new Error("Repository path is not defined. You must call 'clone' first.");
43
+ }
44
+ const currentBranch = getCurrentBranch(prRepoPath);
45
+ if (currentBranch !== config.TARGET_BRANCH) {
46
+ throw new Error(`Branch mismatch: current branch is "${currentBranch}", expected "${config.TARGET_BRANCH}". Run 'init_working_dir' first.`);
47
+ }
48
+ const { title, body } = args;
49
+ if (!config.TARGET_REPO || !config.TARGET_REPO.includes("/")) {
50
+ throw new Error("TARGET_REPO must be defined as 'owner/repo'");
51
+ }
52
+ if (!config.TARGET_BRANCH) {
53
+ throw new Error("TARGET_BRANCH is not defined");
54
+ }
55
+ const [owner, repo] = config.TARGET_REPO.split("/");
56
+ if (!owner || !repo) {
57
+ throw new Error("Invalid TARGET_REPO format. Expected 'owner/repo'");
58
+ }
59
+ try {
60
+ if (!octokit)
61
+ throw new Error("Octokit non initialisé");
62
+ const response = await octokit.rest.pulls.create({
63
+ owner,
64
+ repo,
65
+ title,
66
+ body,
67
+ head: config.TARGET_BRANCH,
68
+ base: config.BASE_BRANCH,
69
+ });
70
+ const successMsg = `Pull request created successfully: ${response.data.html_url}`;
71
+ logToFile(successMsg);
72
+ return { content: [{ type: "text", text: successMsg }] };
73
+ }
74
+ catch (error) {
75
+ const msg = `Failed to create pull request: ${error.message}`;
76
+ logToFile(msg);
77
+ throw new Error(msg);
78
+ }
79
+ }
80
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/handlers/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const INFO_TOOLS: Tool[];
3
+ export declare function handleGetInfo(_args: any, config: any): Promise<{
4
+ content: {
5
+ type: string;
6
+ text: string;
7
+ }[];
8
+ }>;
9
+ export declare function handleGetLogs(args: any): Promise<{
10
+ content: {
11
+ type: string;
12
+ text: string;
13
+ }[];
14
+ }>;
15
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/handlers/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAK/D,eAAO,MAAM,UAAU,EAAE,IAAI,EAmB5B,CAAC;AAEF,wBAAsB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;;;;;GAoB1D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,GAAG;;;;;GAqB5C"}
@@ -0,0 +1,66 @@
1
+ import {} from "@modelcontextprotocol/sdk/types.js";
2
+ import path from "path";
3
+ import fs from "fs";
4
+ import { logToFile } from "../logger.js";
5
+ export const INFO_TOOLS = [
6
+ {
7
+ name: "get_info",
8
+ description: "Get the current configuration of the server (excluding sensitive tokens)",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {},
12
+ },
13
+ },
14
+ {
15
+ name: "get_logs",
16
+ description: "Retrieve the last N lines from the server log file",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ lines: { type: "number", description: "Number of lines to retrieve (default: 50)", default: 50 },
21
+ },
22
+ },
23
+ },
24
+ ];
25
+ export async function handleGetInfo(_args, config) {
26
+ const info = {
27
+ TARGET_REPO: config.TARGET_REPO,
28
+ TARGET_BRANCH: config.TARGET_BRANCH,
29
+ BASE_BRANCH: config.BASE_BRANCH,
30
+ CLONE_DIR: config.CLONE_DIR,
31
+ REPO_PATH: config.REPO_PATH || "Not defined (Call 'clone' first)",
32
+ READ_ONLY: config.READ_ONLY,
33
+ INCLUDE_PUBLIC: config.INCLUDE_PUBLIC,
34
+ INCLUDE_NOT_OWNED: config.INCLUDE_NOT_OWNED,
35
+ CURRENT_WORKING_DIR: process.cwd(),
36
+ GITHUB_TOKEN_LAST_5: config.GITHUB_TOKEN ? `***${config.GITHUB_TOKEN.slice(-5)}` : "Non configuré",
37
+ };
38
+ return {
39
+ content: [{
40
+ type: "text",
41
+ text: `Current Configuration:\n${JSON.stringify(info, null, 2)}`,
42
+ }],
43
+ };
44
+ }
45
+ export async function handleGetLogs(args) {
46
+ const { lines = 50 } = args;
47
+ const logDir = process.platform === 'win32'
48
+ ? 'C:\\var\\log\\restricted-github-mcp'
49
+ : '/var/log/restricted-github-mcp';
50
+ const logFile = path.join(logDir, 'server.log');
51
+ if (!fs.existsSync(logFile)) {
52
+ return { content: [{ type: "text", text: "Log file does not exist yet." }] };
53
+ }
54
+ try {
55
+ const content = fs.readFileSync(logFile, 'utf8');
56
+ const allLines = content.split('\n');
57
+ const lastLines = allLines.slice(-Math.abs(lines)).join('\n');
58
+ return { content: [{ type: "text", text: `Last ${lines} lines of logs:\n\n${lastLines}` }] };
59
+ }
60
+ catch (error) {
61
+ const msg = `Failed to read logs: ${error.message}`;
62
+ logToFile(msg);
63
+ throw new Error(msg);
64
+ }
65
+ }
66
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/handlers/info.ts"],"names":[],"mappings":"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"}