@imenam/mcp-github 1.1.54 → 1.1.55

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 (64) hide show
  1. package/README.md +276 -191
  2. package/dist/__tests__/gateway-exec/session.test.d.ts +2 -0
  3. package/dist/__tests__/gateway-exec/session.test.d.ts.map +1 -0
  4. package/dist/__tests__/gateway-exec/session.test.js +72 -0
  5. package/dist/__tests__/gateway-exec/session.test.js.map +1 -0
  6. package/dist/__tests__/git-proxy/pkt-line.test.d.ts +2 -0
  7. package/dist/__tests__/git-proxy/pkt-line.test.d.ts.map +1 -0
  8. package/dist/__tests__/git-proxy/pkt-line.test.js +93 -0
  9. package/dist/__tests__/git-proxy/pkt-line.test.js.map +1 -0
  10. package/dist/__tests__/git-proxy/proxy.e2e.test.d.ts +2 -0
  11. package/dist/__tests__/git-proxy/proxy.e2e.test.d.ts.map +1 -0
  12. package/dist/__tests__/git-proxy/proxy.e2e.test.js +206 -0
  13. package/dist/__tests__/git-proxy/proxy.e2e.test.js.map +1 -0
  14. package/dist/__tests__/handlers/agent-git.test.d.ts +2 -0
  15. package/dist/__tests__/handlers/agent-git.test.d.ts.map +1 -0
  16. package/dist/__tests__/handlers/agent-git.test.js +124 -0
  17. package/dist/__tests__/handlers/agent-git.test.js.map +1 -0
  18. package/dist/__tests__/utils/git.test.js +9 -2
  19. package/dist/__tests__/utils/git.test.js.map +1 -1
  20. package/dist/config-server.d.ts.map +1 -1
  21. package/dist/config-server.js +8 -0
  22. package/dist/config-server.js.map +1 -1
  23. package/dist/gateway-exec/session.d.ts +36 -0
  24. package/dist/gateway-exec/session.d.ts.map +1 -0
  25. package/dist/gateway-exec/session.js +116 -0
  26. package/dist/gateway-exec/session.js.map +1 -0
  27. package/dist/git-proxy/pkt-line.d.ts +50 -0
  28. package/dist/git-proxy/pkt-line.d.ts.map +1 -0
  29. package/dist/git-proxy/pkt-line.js +110 -0
  30. package/dist/git-proxy/pkt-line.js.map +1 -0
  31. package/dist/git-proxy/server.d.ts +27 -0
  32. package/dist/git-proxy/server.d.ts.map +1 -0
  33. package/dist/git-proxy/server.js +216 -0
  34. package/dist/git-proxy/server.js.map +1 -0
  35. package/dist/handlers/agent-git.d.ts +5 -0
  36. package/dist/handlers/agent-git.d.ts.map +1 -0
  37. package/dist/handlers/agent-git.js +205 -0
  38. package/dist/handlers/agent-git.js.map +1 -0
  39. package/dist/handlers/git.d.ts +1 -1
  40. package/dist/handlers/git.d.ts.map +1 -1
  41. package/dist/handlers/git.js +75 -121
  42. package/dist/handlers/git.js.map +1 -1
  43. package/dist/handlers/github.d.ts.map +1 -1
  44. package/dist/handlers/github.js +12 -7
  45. package/dist/handlers/github.js.map +1 -1
  46. package/dist/handlers/info.d.ts.map +1 -1
  47. package/dist/handlers/info.js +14 -3
  48. package/dist/handlers/info.js.map +1 -1
  49. package/dist/index.js +41 -3
  50. package/dist/index.js.map +1 -1
  51. package/dist/utils/git.d.ts +4 -1
  52. package/dist/utils/git.d.ts.map +1 -1
  53. package/dist/utils/git.js +30 -20
  54. package/dist/utils/git.js.map +1 -1
  55. package/dist/utils/role.d.ts +15 -0
  56. package/dist/utils/role.d.ts.map +1 -0
  57. package/dist/utils/role.js +18 -0
  58. package/dist/utils/role.js.map +1 -0
  59. package/dist/utils/target.d.ts +13 -0
  60. package/dist/utils/target.d.ts.map +1 -0
  61. package/dist/utils/target.js +38 -0
  62. package/dist/utils/target.js.map +1 -0
  63. package/package.json +1 -1
  64. package/public/index.html +5 -1
package/dist/utils/git.js CHANGED
@@ -3,16 +3,11 @@ import path from "path";
3
3
  import fs from "fs";
4
4
  import { logToFile } from "../logger.js";
5
5
  import { getConfig, updateEnvFile } from "./config.js";
6
+ import { getRole } from "./role.js";
7
+ import { getGitAuthHeader, getGitHubRemoteUrl, repoName, resolveTarget } from "./target.js";
6
8
  export function getCurrentBranch(repoPath) {
7
9
  return execGitSecure("branch --show-current", { cwd: repoPath }).toString().trim();
8
10
  }
9
- export function getGitAuthHeader() {
10
- const { GITHUB_TOKEN } = getConfig();
11
- if (!GITHUB_TOKEN)
12
- return null;
13
- const auth = Buffer.from(`x-access-token:${GITHUB_TOKEN}`).toString('base64');
14
- return `Authorization: Basic ${auth}`;
15
- }
16
11
  // `safe.directory='*'` désactive la protection "dubious ownership" de Git pour
17
12
  // CE process. Indispensable car le MCP exécute git (souvent en root dans le
18
13
  // conteneur) sur un dépôt qui peut appartenir à un autre utilisateur (ex. `node`,
@@ -24,19 +19,37 @@ function buildGitCommand(command, extra = "") {
24
19
  return `${GIT_BASE}${extra ? ` ${extra}` : ""} ${rest}`;
25
20
  }
26
21
  export function execGitSecure(command, options) {
22
+ // Sans terminal, git ne doit jamais demander d'identifiants : il échoue à la place.
23
+ const execOptions = { ...options, env: { ...process.env, ...options?.env, GIT_TERMINAL_PROMPT: "0" } };
27
24
  const authHeader = getGitAuthHeader();
28
25
  if (!authHeader) {
29
- return execSync(buildGitCommand(command), options);
26
+ return execSync(buildGitCommand(command), execOptions);
30
27
  }
31
28
  const secureCommand = buildGitCommand(command, `-c http.extraHeader="${authHeader}"`);
32
29
  try {
33
- return execSync(secureCommand, options);
30
+ return execSync(secureCommand, execOptions);
34
31
  }
35
32
  catch (error) {
36
33
  error.message = error.message.replace(authHeader, "[REDACTED_AUTH_HEADER]");
37
34
  throw error;
38
35
  }
39
36
  }
37
+ /** Indique si la branche existe sur le remote, via `git ls-remote` (code 2 : absente). */
38
+ export function remoteBranchExists(repoPath, remoteUrl, branch) {
39
+ try {
40
+ execGitSecure(`ls-remote --exit-code --heads ${remoteUrl} refs/heads/${branch}`, { cwd: repoPath, stdio: "pipe" });
41
+ return true;
42
+ }
43
+ catch (error) {
44
+ if (error.status === 2)
45
+ return false;
46
+ throw error;
47
+ }
48
+ }
49
+ /** Fait pointer `origin` sur l'URL attendue pour le rôle de l'instance. */
50
+ export function ensureOrigin(repoPath, remoteUrl) {
51
+ execGitSecure(`remote set-url origin ${remoteUrl}`, { cwd: repoPath });
52
+ }
40
53
  /**
41
54
  * Aligne la propriété et les droits du dépôt sur l'utilisateur de l'agent.
42
55
  *
@@ -71,21 +84,18 @@ export function alignRepoOwnership(repoPath) {
71
84
  }
72
85
  export async function performClone() {
73
86
  const config = getConfig();
87
+ if (getRole() === "remote") {
88
+ throw new Error("En rôle remote, le clone se fait sur la machine de l'agent : utilisez l'outil 'clone'.");
89
+ }
74
90
  if (!config.GITHUB_TOKEN) {
75
91
  throw new Error("GITHUB_TOKEN est manquant. Le clonage nécessite une authentification.");
76
92
  }
77
- if (!config.TARGET_REPO || !config.TARGET_REPO.includes("/")) {
78
- throw new Error("TARGET_REPO must be defined as 'owner/repo'");
79
- }
80
- const repoParts = config.TARGET_REPO.split("/");
81
- const repo = repoParts[1];
82
- if (!repo) {
83
- throw new Error("Invalid TARGET_REPO format. Expected 'owner/repo'");
84
- }
85
- const remote = `https://github.com/${config.TARGET_REPO}.git`;
86
- const finalRepoPath = path.join(config.CLONE_DIR, repo);
93
+ const target = resolveTarget();
94
+ const remote = getGitHubRemoteUrl(target);
95
+ const finalRepoPath = path.join(config.CLONE_DIR, repoName(target));
87
96
  logToFile(`[CLONE] Destination calculée : ${finalRepoPath}`);
88
97
  if (fs.existsSync(finalRepoPath)) {
98
+ ensureOrigin(finalRepoPath, remote);
89
99
  alignRepoOwnership(finalRepoPath);
90
100
  process.env.REPO_PATH = finalRepoPath;
91
101
  await updateEnvFile("REPO_PATH", finalRepoPath);
@@ -107,7 +117,7 @@ export async function performClone() {
107
117
  alignRepoOwnership(finalRepoPath);
108
118
  process.env.REPO_PATH = finalRepoPath;
109
119
  await updateEnvFile("REPO_PATH", finalRepoPath);
110
- return `Successfully cloned ${config.TARGET_REPO} into ${finalRepoPath}. Run 'init_working_dir' to switch to the target branch.`;
120
+ return `Successfully cloned ${target.repo} into ${finalRepoPath}. Run 'init_working_dir' to switch to the target branch.`;
111
121
  }
112
122
  catch (error) {
113
123
  const msg = `Clone failed: ${error.message}`;
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Rôle de l'instance, fixé par la variable GITHUB_MCP_ROLE.
3
+ *
4
+ * - `standalone` (défaut) : une seule instance, sur la machine de l'agent, qui détient
5
+ * le token et exécute git en direct vers GitHub.
6
+ * - `remote` : instance déclarée dans mcp-http-gateway. Seule à connaître le token, le
7
+ * dépôt et les branches. Elle expose le proxy git sur 127.0.0.1:MCP_HTTP_RELAY_PORT
8
+ * et fait exécuter git sur la machine de l'agent par le relais agent
9
+ * (`mcp-http-gateway --mcp`), à travers ce proxy.
10
+ */
11
+ export type Role = "standalone" | "remote";
12
+ export declare function getRole(): Role;
13
+ /** Route de l'instance remote dans le gateway (MCP_SERVER_ROUTE, ex. /github). */
14
+ export declare function getGatewayRoute(): string;
15
+ //# sourceMappingURL=role.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../src/utils/role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,IAAI,GAAG,YAAY,GAAG,QAAQ,CAAC;AAI3C,wBAAgB,OAAO,IAAI,IAAI,CAK9B;AAED,kFAAkF;AAClF,wBAAgB,eAAe,IAAI,MAAM,CAMxC"}
@@ -0,0 +1,18 @@
1
+ const ROLES = ["standalone", "remote"];
2
+ export function getRole() {
3
+ const raw = process.env.GITHUB_MCP_ROLE?.trim();
4
+ if (!raw)
5
+ return "standalone";
6
+ if (ROLES.includes(raw))
7
+ return raw;
8
+ throw new Error(`GITHUB_MCP_ROLE="${raw}" invalide (attendu : ${ROLES.join(" | ")})`);
9
+ }
10
+ /** Route de l'instance remote dans le gateway (MCP_SERVER_ROUTE, ex. /github). */
11
+ export function getGatewayRoute() {
12
+ const route = process.env.MCP_SERVER_ROUTE?.trim().replace(/\/+$/, "");
13
+ if (!route || !route.startsWith("/")) {
14
+ throw new Error("MCP_SERVER_ROUTE est requis quand GITHUB_MCP_ROLE=remote (route déclarée au gateway, ex. /github)");
15
+ }
16
+ return route;
17
+ }
18
+ //# sourceMappingURL=role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.js","sourceRoot":"","sources":["../../src/utils/role.ts"],"names":[],"mappings":"AAYA,MAAM,KAAK,GAAoB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAExD,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,YAAY,CAAC;IAC9B,IAAK,KAA2B,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAW,CAAC;IACnE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,yBAAyB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface Target {
2
+ repo: string;
3
+ targetBranch: string;
4
+ baseBranch: string;
5
+ readOnly: boolean;
6
+ }
7
+ export declare function resolveTarget(): Target;
8
+ /** Nom du dossier du dépôt : la partie `repo` de `owner/repo`. */
9
+ export declare function repoName(target: Target): string;
10
+ export declare function getGitHubRemoteUrl(target: Target): string;
11
+ /** En-tête d'authentification ajouté aux commandes git : le token GitHub. */
12
+ export declare function getGitAuthHeader(): string | null;
13
+ //# sourceMappingURL=target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../src/utils/target.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,IAAI,MAAM,CAYtC;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAKhD"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Cible des opérations git (dépôt, branches), lue dans la configuration de l'instance,
3
+ * et moyens de la joindre en rôle `standalone`.
4
+ */
5
+ import { getConfig } from "./config.js";
6
+ export function resolveTarget() {
7
+ const config = getConfig();
8
+ if (!config.TARGET_REPO || !config.TARGET_REPO.includes("/")) {
9
+ throw new Error("TARGET_REPO must be defined as 'owner/repo'");
10
+ }
11
+ if (!config.TARGET_BRANCH)
12
+ throw new Error("TARGET_BRANCH is not defined.");
13
+ return {
14
+ repo: config.TARGET_REPO,
15
+ targetBranch: config.TARGET_BRANCH,
16
+ baseBranch: config.BASE_BRANCH,
17
+ readOnly: config.READ_ONLY,
18
+ };
19
+ }
20
+ /** Nom du dossier du dépôt : la partie `repo` de `owner/repo`. */
21
+ export function repoName(target) {
22
+ const name = target.repo.split("/")[1];
23
+ if (!name)
24
+ throw new Error("Invalid TARGET_REPO format. Expected 'owner/repo'");
25
+ return name;
26
+ }
27
+ export function getGitHubRemoteUrl(target) {
28
+ return `https://github.com/${target.repo}.git`;
29
+ }
30
+ /** En-tête d'authentification ajouté aux commandes git : le token GitHub. */
31
+ export function getGitAuthHeader() {
32
+ const { GITHUB_TOKEN } = getConfig();
33
+ if (!GITHUB_TOKEN)
34
+ return null;
35
+ const auth = Buffer.from(`x-access-token:${GITHUB_TOKEN}`).toString("base64");
36
+ return `Authorization: Basic ${auth}`;
37
+ }
38
+ //# sourceMappingURL=target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../../src/utils/target.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AASxC,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,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;IACD,IAAI,CAAC,MAAM,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC5E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,YAAY,EAAE,MAAM,CAAC,aAAa;QAClC,UAAU,EAAE,MAAM,CAAC,WAAW;QAC9B,QAAQ,EAAE,MAAM,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,sBAAsB,MAAM,CAAC,IAAI,MAAM,CAAC;AACjD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,CAAC;IACrC,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9E,OAAO,wBAAwB,IAAI,EAAE,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imenam/mcp-github",
3
- "version": "1.1.54",
3
+ "version": "1.1.55",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "files": [
package/public/index.html CHANGED
@@ -1480,7 +1480,8 @@
1480
1480
  state.extras = {
1481
1481
  AGENT_NAME: data.AGENT_NAME || '',
1482
1482
  CLONE_DIR: data.CLONE_DIR || '',
1483
- REPO_PATH: data.REPO_PATH || ''
1483
+ REPO_PATH: data.REPO_PATH || '',
1484
+ ROLE: data.ROLE || 'standalone'
1484
1485
  };
1485
1486
  }
1486
1487
 
@@ -1596,6 +1597,9 @@
1596
1597
 
1597
1598
  $('btnClone').disabled = !state.config.TARGET_REPO || !state.config.TARGET_BRANCH;
1598
1599
  $('btnClean').disabled = !state.extras.REPO_PATH;
1600
+ // En rôle remote, la copie de travail est sur la machine de l'agent.
1601
+ $('btnClone').hidden = state.extras.ROLE === 'remote';
1602
+ $('btnClean').hidden = state.extras.ROLE === 'remote';
1599
1603
 
1600
1604
  const preview = $('cmdPreview');
1601
1605
  if (preview) preview.textContent = buildCommandPreview();