@imenam/mcp-github 1.1.54 → 1.1.56
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.
- package/README.md +280 -191
- package/dist/__tests__/config-server.guard.test.d.ts +2 -0
- package/dist/__tests__/config-server.guard.test.d.ts.map +1 -0
- package/dist/__tests__/config-server.guard.test.js +135 -0
- package/dist/__tests__/config-server.guard.test.js.map +1 -0
- package/dist/__tests__/gateway-exec/session.test.d.ts +2 -0
- package/dist/__tests__/gateway-exec/session.test.d.ts.map +1 -0
- package/dist/__tests__/gateway-exec/session.test.js +72 -0
- package/dist/__tests__/gateway-exec/session.test.js.map +1 -0
- package/dist/__tests__/git-proxy/pkt-line.test.d.ts +2 -0
- package/dist/__tests__/git-proxy/pkt-line.test.d.ts.map +1 -0
- package/dist/__tests__/git-proxy/pkt-line.test.js +93 -0
- package/dist/__tests__/git-proxy/pkt-line.test.js.map +1 -0
- package/dist/__tests__/git-proxy/proxy.e2e.test.d.ts +2 -0
- package/dist/__tests__/git-proxy/proxy.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/git-proxy/proxy.e2e.test.js +206 -0
- package/dist/__tests__/git-proxy/proxy.e2e.test.js.map +1 -0
- package/dist/__tests__/handlers/agent-git.test.d.ts +2 -0
- package/dist/__tests__/handlers/agent-git.test.d.ts.map +1 -0
- package/dist/__tests__/handlers/agent-git.test.js +124 -0
- package/dist/__tests__/handlers/agent-git.test.js.map +1 -0
- package/dist/__tests__/utils/git.test.js +9 -2
- package/dist/__tests__/utils/git.test.js.map +1 -1
- package/dist/config-server.d.ts.map +1 -1
- package/dist/config-server.js +11 -2
- package/dist/config-server.js.map +1 -1
- package/dist/gateway-exec/session.d.ts +36 -0
- package/dist/gateway-exec/session.d.ts.map +1 -0
- package/dist/gateway-exec/session.js +116 -0
- package/dist/gateway-exec/session.js.map +1 -0
- package/dist/git-proxy/pkt-line.d.ts +50 -0
- package/dist/git-proxy/pkt-line.d.ts.map +1 -0
- package/dist/git-proxy/pkt-line.js +110 -0
- package/dist/git-proxy/pkt-line.js.map +1 -0
- package/dist/git-proxy/server.d.ts +27 -0
- package/dist/git-proxy/server.d.ts.map +1 -0
- package/dist/git-proxy/server.js +216 -0
- package/dist/git-proxy/server.js.map +1 -0
- package/dist/handlers/agent-git.d.ts +5 -0
- package/dist/handlers/agent-git.d.ts.map +1 -0
- package/dist/handlers/agent-git.js +205 -0
- package/dist/handlers/agent-git.js.map +1 -0
- package/dist/handlers/git.d.ts +1 -1
- package/dist/handlers/git.d.ts.map +1 -1
- package/dist/handlers/git.js +75 -121
- package/dist/handlers/git.js.map +1 -1
- package/dist/handlers/github.d.ts.map +1 -1
- package/dist/handlers/github.js +12 -7
- package/dist/handlers/github.js.map +1 -1
- package/dist/handlers/info.d.ts.map +1 -1
- package/dist/handlers/info.js +14 -3
- package/dist/handlers/info.js.map +1 -1
- package/dist/index.js +41 -3
- package/dist/index.js.map +1 -1
- package/dist/utils/git.d.ts +4 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +30 -20
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/role.d.ts +15 -0
- package/dist/utils/role.d.ts.map +1 -0
- package/dist/utils/role.js +18 -0
- package/dist/utils/role.js.map +1 -0
- package/dist/utils/target.d.ts +13 -0
- package/dist/utils/target.d.ts.map +1 -0
- package/dist/utils/target.js +38 -0
- package/dist/utils/target.js.map +1 -0
- package/package.json +2 -2
- 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),
|
|
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,
|
|
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
|
-
|
|
78
|
-
|
|
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 ${
|
|
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}`;
|
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
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.
|
|
3
|
+
"version": "1.1.56",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"license": "ISC",
|
|
28
28
|
"description": "Un serveur MCP GitHub contrôlé et sécurisé pour les agents IA.",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@imenam/mcp-gui-interface": "^1.0.
|
|
30
|
+
"@imenam/mcp-gui-interface": "^1.0.14",
|
|
31
31
|
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
32
32
|
"dotenv": "^17.2.3",
|
|
33
33
|
"express": "^5.2.1",
|
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();
|