restricted-github-mcp 1.1.29 → 1.1.31
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/dist/config-server.d.ts.map +1 -1
- package/dist/config-server.js +78 -0
- package/dist/config-server.js.map +1 -1
- package/package.json +1 -1
- package/public/index.html +452 -217
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-server.d.ts","sourceRoot":"","sources":["../src/config-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-server.d.ts","sourceRoot":"","sources":["../src/config-server.ts"],"names":[],"mappings":"AA0EA;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAazD;AAED,wBAAsB,iBAAiB,kBAqOtC"}
|
package/dist/config-server.js
CHANGED
|
@@ -2,6 +2,7 @@ import express from "express";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import fs from "fs";
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
|
+
import { Octokit } from "octokit";
|
|
5
6
|
import { logToFile, updateEnvFile } from "./logger.js";
|
|
6
7
|
/**
|
|
7
8
|
* Envoie un message au parent de manière sécurisée.
|
|
@@ -122,6 +123,83 @@ export async function startConfigServer() {
|
|
|
122
123
|
res.status(500).json({ error: msg });
|
|
123
124
|
}
|
|
124
125
|
});
|
|
126
|
+
app.get("/api/repositories", async (req, res) => {
|
|
127
|
+
logToFile("[GUI] GET /api/repositories called");
|
|
128
|
+
try {
|
|
129
|
+
const token = process.env.GITHUB_TOKEN;
|
|
130
|
+
if (!token) {
|
|
131
|
+
logToFile("[GUI] Repositories endpoint: Token non configuré");
|
|
132
|
+
return res.status(400).json({ error: "Token GitHub non configuré" });
|
|
133
|
+
}
|
|
134
|
+
const octokit = new Octokit({ auth: token });
|
|
135
|
+
const user = await octokit.rest.users.getAuthenticated();
|
|
136
|
+
logToFile(`[GUI] Authenticated as: ${user.data.login}`);
|
|
137
|
+
const { data } = await octokit.rest.repos.listForAuthenticatedUser({
|
|
138
|
+
affiliation: "owner",
|
|
139
|
+
sort: "updated",
|
|
140
|
+
per_page: 100,
|
|
141
|
+
});
|
|
142
|
+
// Filtrer pour garder seulement les repos accessibles au token
|
|
143
|
+
const accessibleRepos = [];
|
|
144
|
+
for (const repo of data) {
|
|
145
|
+
try {
|
|
146
|
+
// Tenter de lister les branches pour tester l'accès
|
|
147
|
+
await octokit.rest.repos.listBranches({
|
|
148
|
+
owner: repo.owner.login,
|
|
149
|
+
repo: repo.name,
|
|
150
|
+
per_page: 1,
|
|
151
|
+
});
|
|
152
|
+
accessibleRepos.push(repo.full_name);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error.status !== 403) {
|
|
156
|
+
logToFile(`[GUI] Error checking access for ${repo.full_name}: ${error.message}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
logToFile(`[GUI] Filtered to ${accessibleRepos.length} accessible repos`);
|
|
161
|
+
res.json(accessibleRepos);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const msg = `[GUI] Failed to fetch repositories: ${error.message}`;
|
|
165
|
+
logToFile(msg);
|
|
166
|
+
res.status(500).json({ error: msg });
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
app.get("/api/branches", async (req, res) => {
|
|
170
|
+
logToFile("[GUI] GET /api/branches called");
|
|
171
|
+
try {
|
|
172
|
+
const repo = req.query.repo;
|
|
173
|
+
const token = process.env.GITHUB_TOKEN;
|
|
174
|
+
if (!repo) {
|
|
175
|
+
logToFile("[GUI] Branches endpoint: Paramètre repo manquant");
|
|
176
|
+
return res.status(400).json({ error: "Paramètre repo manquant" });
|
|
177
|
+
}
|
|
178
|
+
if (!token) {
|
|
179
|
+
logToFile("[GUI] Branches endpoint: Token non configuré");
|
|
180
|
+
return res.status(400).json({ error: "Token GitHub non configuré" });
|
|
181
|
+
}
|
|
182
|
+
const [owner, repoName] = repo.split("/");
|
|
183
|
+
if (!owner || !repoName) {
|
|
184
|
+
logToFile("[GUI] Branches endpoint: Format de repo invalide");
|
|
185
|
+
return res.status(400).json({ error: "Format de repo invalide (owner/repo)" });
|
|
186
|
+
}
|
|
187
|
+
const octokit = new Octokit({ auth: token });
|
|
188
|
+
const { data } = await octokit.rest.repos.listBranches({
|
|
189
|
+
owner,
|
|
190
|
+
repo: repoName,
|
|
191
|
+
per_page: 100,
|
|
192
|
+
});
|
|
193
|
+
const branches = data.map((branch) => branch.name).reverse();
|
|
194
|
+
logToFile(`[GUI] Branches endpoint: ${branches.length} branches retournées pour ${repo}`);
|
|
195
|
+
res.json(branches);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
const msg = `[GUI] Failed to fetch branches: ${error.message}`;
|
|
199
|
+
logToFile(msg);
|
|
200
|
+
res.status(500).json({ error: msg });
|
|
201
|
+
}
|
|
202
|
+
});
|
|
125
203
|
app.post("/api/config", (req, res) => {
|
|
126
204
|
logToFile("[GUI] POST /api/config called");
|
|
127
205
|
const newConfig = req.body;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-server.js","sourceRoot":"","sources":["../src/config-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config-server.js","sourceRoot":"","sources":["../src/config-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/public/index.html
CHANGED
|
@@ -1,217 +1,452 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="fr" class="dark">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>GitHub MCP</title>
|
|
7
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
8
|
-
<style>
|
|
9
|
-
body {
|
|
10
|
-
background-color: #0f172a;
|
|
11
|
-
color: #f8fafc;
|
|
12
|
-
}
|
|
13
|
-
</style>
|
|
14
|
-
</head>
|
|
15
|
-
<body class="min-h-screen p-8">
|
|
16
|
-
<div class="max-w-2xl mx-auto bg-slate-800 rounded-xl shadow-2xl p-8 border border-slate-700">
|
|
17
|
-
<h1 class="text-3xl font-bold mb-6 text-blue-400 flex items-center">
|
|
18
|
-
<svg class="w-8 h-8 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
19
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path>
|
|
20
|
-
</svg>
|
|
21
|
-
Configuration MCP GitHub
|
|
22
|
-
</h1>
|
|
23
|
-
|
|
24
|
-
<form id="configForm" class="space-y-6">
|
|
25
|
-
<div class="space-y-4" id="inputs">
|
|
26
|
-
<!-- Inputs will be injected here -->
|
|
27
|
-
<div class="flex justify-center p-8">
|
|
28
|
-
<div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-400"></div>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
|
|
32
|
-
<div class="pt-4 space-y-3">
|
|
33
|
-
<button type="submit" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-4 rounded-lg transition duration-200 shadow-lg flex justify-center items-center">
|
|
34
|
-
<span>Enregistrer la configuration</span>
|
|
35
|
-
</button>
|
|
36
|
-
|
|
37
|
-
<button type="button" id="restartBtn" class="w-full bg-amber-600 hover:bg-amber-700 text-white font-bold py-3 px-4 rounded-lg transition duration-200 shadow-lg flex justify-center items-center">
|
|
38
|
-
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
39
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"></path>
|
|
40
|
-
</svg>
|
|
41
|
-
<span>Redémarrer le serveur MCP</span>
|
|
42
|
-
</button>
|
|
43
|
-
|
|
44
|
-
<button type="button" id="stopBtn" class="w-full bg-red-600 hover:bg-red-700 text-white font-bold py-3 px-4 rounded-lg transition duration-200 shadow-lg flex justify-center items-center">
|
|
45
|
-
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
46
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
|
47
|
-
</svg>
|
|
48
|
-
<span>Arrêter le serveur MCP</span>
|
|
49
|
-
</button>
|
|
50
|
-
</div>
|
|
51
|
-
</form>
|
|
52
|
-
|
|
53
|
-
<div id="status" class="mt-6 p-4 rounded-lg hidden"></div>
|
|
54
|
-
|
|
55
|
-
<div class="mt-8 text-sm text-slate-400 border-t border-slate-700 pt-4 italic">
|
|
56
|
-
Note: Le serveur MCP doit être redémarré pour appliquer les changements.
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
|
|
60
|
-
<script>
|
|
61
|
-
// Détection automatique du base path pour fonctionner via proxy
|
|
62
|
-
const pathname = window.location.pathname;
|
|
63
|
-
const BASE_PATH = pathname.includes('.')
|
|
64
|
-
? pathname.replace(/\/[^/]*$/, '') // /github-mcp/index.html -> /github-mcp
|
|
65
|
-
: pathname.endsWith('/')
|
|
66
|
-
? pathname.slice(0, -1) // /github-mcp/ -> /github-mcp
|
|
67
|
-
: pathname === '/' ? '' : pathname; // /github-mcp -> /github-mcp, / -> ''
|
|
68
|
-
|
|
69
|
-
// Helper pour construire les URLs d'API
|
|
70
|
-
const api = (endpoint) => `${BASE_PATH}/${endpoint}`.replace(/\/+/g, '/');
|
|
71
|
-
|
|
72
|
-
const form = document.getElementById('configForm');
|
|
73
|
-
const status = document.getElementById('status');
|
|
74
|
-
const inputsContainer = document.getElementById('inputs');
|
|
75
|
-
const restartBtn = document.getElementById('restartBtn');
|
|
76
|
-
const stopBtn = document.getElementById('stopBtn');
|
|
77
|
-
|
|
78
|
-
const fields = [
|
|
79
|
-
{ id: 'GITHUB_TOKEN', label: 'GitHub Token', type: 'password', placeholder: 'ghp_...' },
|
|
80
|
-
{ id: 'TARGET_REPO', label: 'Target Repository', type: '
|
|
81
|
-
{ id: '
|
|
82
|
-
{ id: '
|
|
83
|
-
{ id: 'READ_ONLY', label: 'Read Only Mode', type: 'checkbox' }
|
|
84
|
-
];
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
</
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
if (
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
</
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="fr" class="dark">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>GitHub MCP</title>
|
|
7
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
8
|
+
<style>
|
|
9
|
+
body {
|
|
10
|
+
background-color: #0f172a;
|
|
11
|
+
color: #f8fafc;
|
|
12
|
+
}
|
|
13
|
+
</style>
|
|
14
|
+
</head>
|
|
15
|
+
<body class="min-h-screen p-8">
|
|
16
|
+
<div class="max-w-2xl mx-auto bg-slate-800 rounded-xl shadow-2xl p-8 border border-slate-700">
|
|
17
|
+
<h1 class="text-3xl font-bold mb-6 text-blue-400 flex items-center">
|
|
18
|
+
<svg class="w-8 h-8 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
19
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path>
|
|
20
|
+
</svg>
|
|
21
|
+
Configuration MCP GitHub
|
|
22
|
+
</h1>
|
|
23
|
+
|
|
24
|
+
<form id="configForm" class="space-y-6">
|
|
25
|
+
<div class="space-y-4" id="inputs">
|
|
26
|
+
<!-- Inputs will be injected here -->
|
|
27
|
+
<div class="flex justify-center p-8">
|
|
28
|
+
<div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-400"></div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="pt-4 space-y-3">
|
|
33
|
+
<button type="submit" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-4 rounded-lg transition duration-200 shadow-lg flex justify-center items-center">
|
|
34
|
+
<span>Enregistrer la configuration</span>
|
|
35
|
+
</button>
|
|
36
|
+
|
|
37
|
+
<button type="button" id="restartBtn" class="w-full bg-amber-600 hover:bg-amber-700 text-white font-bold py-3 px-4 rounded-lg transition duration-200 shadow-lg flex justify-center items-center">
|
|
38
|
+
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
39
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"></path>
|
|
40
|
+
</svg>
|
|
41
|
+
<span>Redémarrer le serveur MCP</span>
|
|
42
|
+
</button>
|
|
43
|
+
|
|
44
|
+
<button type="button" id="stopBtn" class="w-full bg-red-600 hover:bg-red-700 text-white font-bold py-3 px-4 rounded-lg transition duration-200 shadow-lg flex justify-center items-center">
|
|
45
|
+
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
46
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
|
47
|
+
</svg>
|
|
48
|
+
<span>Arrêter le serveur MCP</span>
|
|
49
|
+
</button>
|
|
50
|
+
</div>
|
|
51
|
+
</form>
|
|
52
|
+
|
|
53
|
+
<div id="status" class="mt-6 p-4 rounded-lg hidden"></div>
|
|
54
|
+
|
|
55
|
+
<div class="mt-8 text-sm text-slate-400 border-t border-slate-700 pt-4 italic">
|
|
56
|
+
Note: Le serveur MCP doit être redémarré pour appliquer les changements.
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<script>
|
|
61
|
+
// Détection automatique du base path pour fonctionner via proxy
|
|
62
|
+
const pathname = window.location.pathname;
|
|
63
|
+
const BASE_PATH = pathname.includes('.')
|
|
64
|
+
? pathname.replace(/\/[^/]*$/, '') // /github-mcp/index.html -> /github-mcp
|
|
65
|
+
: pathname.endsWith('/')
|
|
66
|
+
? pathname.slice(0, -1) // /github-mcp/ -> /github-mcp
|
|
67
|
+
: pathname === '/' ? '' : pathname; // /github-mcp -> /github-mcp, / -> ''
|
|
68
|
+
|
|
69
|
+
// Helper pour construire les URLs d'API
|
|
70
|
+
const api = (endpoint) => `${BASE_PATH}/${endpoint}`.replace(/\/+/g, '/');
|
|
71
|
+
|
|
72
|
+
const form = document.getElementById('configForm');
|
|
73
|
+
const status = document.getElementById('status');
|
|
74
|
+
const inputsContainer = document.getElementById('inputs');
|
|
75
|
+
const restartBtn = document.getElementById('restartBtn');
|
|
76
|
+
const stopBtn = document.getElementById('stopBtn');
|
|
77
|
+
|
|
78
|
+
const fields = [
|
|
79
|
+
{ id: 'GITHUB_TOKEN', label: 'GitHub Token', type: 'password', placeholder: 'ghp_...' },
|
|
80
|
+
{ id: 'TARGET_REPO', label: 'Target Repository', type: 'select', placeholder: 'owner/repo' },
|
|
81
|
+
{ id: 'BASE_BRANCH', label: 'Base Branch', type: 'select', placeholder: 'main' },
|
|
82
|
+
{ id: 'TARGET_BRANCH', label: 'Target Branch', type: 'select', placeholder: 'feature-branch' },
|
|
83
|
+
{ id: 'READ_ONLY', label: 'Read Only Mode', type: 'checkbox' }
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
// État de l'application
|
|
87
|
+
let currentConfig = {};
|
|
88
|
+
const selectState = {
|
|
89
|
+
repos: [],
|
|
90
|
+
branches: {},
|
|
91
|
+
loadingRepos: false,
|
|
92
|
+
loadingBranches: {}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Fetch repositories
|
|
96
|
+
async function fetchRepositories(token) {
|
|
97
|
+
if (!token || token.length < 10) return [];
|
|
98
|
+
|
|
99
|
+
selectState.loadingRepos = true;
|
|
100
|
+
updateSelectUI();
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
const response = await fetch(api('api/repositories'));
|
|
104
|
+
if (response.ok) {
|
|
105
|
+
selectState.repos = await response.json();
|
|
106
|
+
}
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.warn('Error fetching repositories:', error);
|
|
109
|
+
} finally {
|
|
110
|
+
selectState.loadingRepos = false;
|
|
111
|
+
updateSelectUI();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Fetch branches for a repository
|
|
116
|
+
async function fetchBranches(repo, token) {
|
|
117
|
+
if (!repo || !token) return [];
|
|
118
|
+
|
|
119
|
+
selectState.loadingBranches[repo] = true;
|
|
120
|
+
updateSelectUI();
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
const url = api(`api/branches?repo=${encodeURIComponent(repo)}`);
|
|
124
|
+
const response = await fetch(url);
|
|
125
|
+
if (response.ok) {
|
|
126
|
+
selectState.branches[repo] = await response.json();
|
|
127
|
+
}
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error('[fetchBranches] Fetch error:', error);
|
|
130
|
+
selectState.branches[repo] = [];
|
|
131
|
+
} finally {
|
|
132
|
+
selectState.loadingBranches[repo] = false;
|
|
133
|
+
updateSelectUI();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Render select field
|
|
138
|
+
function renderSelectField(field, value, config) {
|
|
139
|
+
let options = '<option value="">-- Sélectionner une option --</option>';
|
|
140
|
+
|
|
141
|
+
if (field.id === 'TARGET_REPO') {
|
|
142
|
+
if (selectState.loadingRepos) {
|
|
143
|
+
return `
|
|
144
|
+
<div class="space-y-1">
|
|
145
|
+
<label for="${field.id}" class="block text-sm font-medium text-slate-300">${field.label}</label>
|
|
146
|
+
<div id="${field.id}_loading" class="w-full px-4 py-2 bg-slate-900 border border-slate-600 rounded-lg text-slate-400 flex items-center">
|
|
147
|
+
<div class="animate-spin rounded-full h-4 w-4 border-b-2 border-blue-400 mr-2"></div>
|
|
148
|
+
Chargement des dépôts...
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
options += selectState.repos.map(repo =>
|
|
155
|
+
`<option value="${repo}" ${value === repo ? 'selected' : ''}>${repo}</option>`
|
|
156
|
+
).join('');
|
|
157
|
+
|
|
158
|
+
if (value && !selectState.repos.includes(value)) {
|
|
159
|
+
options += `<option value="${value}" selected>${value}</option>`;
|
|
160
|
+
}
|
|
161
|
+
} else if (field.id === 'BASE_BRANCH') {
|
|
162
|
+
const currentRepo = config.TARGET_REPO;
|
|
163
|
+
const branches = selectState.branches[currentRepo] || [];
|
|
164
|
+
|
|
165
|
+
if (selectState.loadingBranches[currentRepo]) {
|
|
166
|
+
return `
|
|
167
|
+
<div class="space-y-1">
|
|
168
|
+
<label for="${field.id}" class="block text-sm font-medium text-slate-300">${field.label}</label>
|
|
169
|
+
<div id="${field.id}_loading" class="w-full px-4 py-2 bg-slate-900 border border-slate-600 rounded-lg text-slate-400 flex items-center">
|
|
170
|
+
<div class="animate-spin rounded-full h-4 w-4 border-b-2 border-blue-400 mr-2"></div>
|
|
171
|
+
Chargement des branches...
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
options += branches.map(branch =>
|
|
178
|
+
`<option value="${branch}" ${value === branch ? 'selected' : ''}>${branch}</option>`
|
|
179
|
+
).join('');
|
|
180
|
+
|
|
181
|
+
// Préserver la valeur actuelle si elle n'est pas dans la liste (pendant le chargement ou si elle est custom)
|
|
182
|
+
if (value && !branches.includes(value)) {
|
|
183
|
+
options += `<option value="${value}" selected>${value}</option>`;
|
|
184
|
+
}
|
|
185
|
+
} else if (field.id === 'TARGET_BRANCH') {
|
|
186
|
+
const currentRepo = config.TARGET_REPO;
|
|
187
|
+
const branches = selectState.branches[currentRepo] || [];
|
|
188
|
+
|
|
189
|
+
if (selectState.loadingBranches[currentRepo]) {
|
|
190
|
+
return `
|
|
191
|
+
<div class="space-y-1">
|
|
192
|
+
<label for="${field.id}" class="block text-sm font-medium text-slate-300">${field.label}</label>
|
|
193
|
+
<div id="${field.id}_loading" class="w-full px-4 py-2 bg-slate-900 border border-slate-600 rounded-lg text-slate-400 flex items-center">
|
|
194
|
+
<div class="animate-spin rounded-full h-4 w-4 border-b-2 border-blue-400 mr-2"></div>
|
|
195
|
+
Chargement des branches...
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
`;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
let selectOptions = '<option value="">-- Créer une nouvelle branche --</option>';
|
|
202
|
+
selectOptions += branches.map(branch =>
|
|
203
|
+
`<option value="${branch}" ${value === branch ? 'selected' : ''}>${branch}</option>`
|
|
204
|
+
).join('');
|
|
205
|
+
|
|
206
|
+
const isCustom = value && !branches.includes(value);
|
|
207
|
+
const shouldShowCustom = isCustom || value === '';
|
|
208
|
+
|
|
209
|
+
return `
|
|
210
|
+
<div class="space-y-1">
|
|
211
|
+
<label for="${field.id}" class="block text-sm font-medium text-slate-300">${field.label}</label>
|
|
212
|
+
<div class="space-y-2">
|
|
213
|
+
<select id="${field.id}" class="w-full px-4 py-2 bg-slate-900 border border-slate-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition duration-200 text-slate-100">
|
|
214
|
+
${selectOptions}
|
|
215
|
+
</select>
|
|
216
|
+
<input type="text" id="${field.id}_custom" placeholder="Entrez le nom de la nouvelle branche" value="${isCustom ? value : ''}" class="w-full px-4 py-2 bg-slate-900 border border-slate-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition duration-200 text-slate-100 ${shouldShowCustom ? '' : 'hidden'}">
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
`;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return `
|
|
223
|
+
<div class="space-y-1">
|
|
224
|
+
<label for="${field.id}" class="block text-sm font-medium text-slate-300">${field.label}</label>
|
|
225
|
+
<select id="${field.id}" class="w-full px-4 py-2 bg-slate-900 border border-slate-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition duration-200 text-slate-100">
|
|
226
|
+
${options}
|
|
227
|
+
</select>
|
|
228
|
+
</div>
|
|
229
|
+
`;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Fetch current config
|
|
233
|
+
async function fetchConfig() {
|
|
234
|
+
try {
|
|
235
|
+
const response = await fetch(api('api/config'));
|
|
236
|
+
if (!response.ok) {
|
|
237
|
+
const data = await response.json().catch(() => ({ error: 'Erreur lors du chargement' }));
|
|
238
|
+
throw new Error(data.error || 'Erreur lors du chargement');
|
|
239
|
+
}
|
|
240
|
+
currentConfig = await response.json();
|
|
241
|
+
|
|
242
|
+
if (currentConfig.GITHUB_TOKEN) {
|
|
243
|
+
await fetchRepositories(currentConfig.GITHUB_TOKEN);
|
|
244
|
+
if (currentConfig.TARGET_REPO) {
|
|
245
|
+
await fetchBranches(currentConfig.TARGET_REPO, currentConfig.GITHUB_TOKEN);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
renderInputs(currentConfig);
|
|
250
|
+
} catch (error) {
|
|
251
|
+
showStatus(error.message || 'Erreur lors du chargement de la configuration', 'error');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Render inputs
|
|
256
|
+
function renderInputs(config) {
|
|
257
|
+
inputsContainer.innerHTML = fields.map(field => {
|
|
258
|
+
if (field.type === 'checkbox') {
|
|
259
|
+
return `
|
|
260
|
+
<div class="flex items-center space-x-3 p-3 bg-slate-700/50 rounded-lg">
|
|
261
|
+
<input type="checkbox" id="${field.id}" ${config[field.id] === 'true' || config[field.id] === true ? 'checked' : ''} class="w-5 h-5 text-blue-600 rounded focus:ring-blue-500 bg-slate-900 border-slate-600">
|
|
262
|
+
<label for="${field.id}" class="text-sm font-medium text-slate-200">${field.label}</label>
|
|
263
|
+
</div>
|
|
264
|
+
`;
|
|
265
|
+
}
|
|
266
|
+
if (field.type === 'select') {
|
|
267
|
+
return renderSelectField(field, config[field.id] || '', config);
|
|
268
|
+
}
|
|
269
|
+
return `
|
|
270
|
+
<div class="space-y-1">
|
|
271
|
+
<label for="${field.id}" class="block text-sm font-medium text-slate-300">${field.label}</label>
|
|
272
|
+
<input type="${field.type}" id="${field.id}" value="${config[field.id] || ''}" placeholder="${field.placeholder}" class="w-full px-4 py-2 bg-slate-900 border border-slate-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition duration-200 text-slate-100">
|
|
273
|
+
</div>
|
|
274
|
+
`;
|
|
275
|
+
}).join('');
|
|
276
|
+
|
|
277
|
+
setupEventListeners();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Update select UI
|
|
281
|
+
function updateSelectUI() {
|
|
282
|
+
// Mettre à jour currentConfig à partir du DOM pour les éléments qui existent
|
|
283
|
+
fields.forEach(field => {
|
|
284
|
+
const input = document.getElementById(field.id);
|
|
285
|
+
if (input) {
|
|
286
|
+
if (field.type === 'checkbox') {
|
|
287
|
+
currentConfig[field.id] = input.checked;
|
|
288
|
+
} else if (field.id === 'TARGET_BRANCH') {
|
|
289
|
+
const customInput = document.getElementById('TARGET_BRANCH_custom');
|
|
290
|
+
currentConfig[field.id] = (input.value === '' && customInput && customInput.value) ? customInput.value : input.value;
|
|
291
|
+
} else {
|
|
292
|
+
currentConfig[field.id] = input.value;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
renderInputs(currentConfig);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Setup event listeners - utilise la délégation d'événements pour éviter les problèmes de re-render
|
|
300
|
+
function setupEventListeners() {
|
|
301
|
+
const tokenInput = document.getElementById('GITHUB_TOKEN');
|
|
302
|
+
const repoSelect = document.getElementById('TARGET_REPO');
|
|
303
|
+
const targetBranchSelect = document.getElementById('TARGET_BRANCH');
|
|
304
|
+
|
|
305
|
+
if (tokenInput) {
|
|
306
|
+
// Utiliser 'input' avec debounce serait mieux, mais 'change' suffit ici
|
|
307
|
+
tokenInput.addEventListener('change', async () => {
|
|
308
|
+
const token = tokenInput.value;
|
|
309
|
+
if (token && token.length > 10) {
|
|
310
|
+
selectState.branches = {}; // Reset branches avant de charger les repos
|
|
311
|
+
await fetchRepositories(token);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (repoSelect) {
|
|
317
|
+
repoSelect.addEventListener('change', async () => {
|
|
318
|
+
const repo = repoSelect.value;
|
|
319
|
+
const token = document.getElementById('GITHUB_TOKEN')?.value;
|
|
320
|
+
if (repo && token) {
|
|
321
|
+
await fetchBranches(repo, token);
|
|
322
|
+
|
|
323
|
+
const newBranches = selectState.branches[repo] || [];
|
|
324
|
+
|
|
325
|
+
// Reset des branches invalides
|
|
326
|
+
if (currentConfig.BASE_BRANCH && !newBranches.includes(currentConfig.BASE_BRANCH)) {
|
|
327
|
+
currentConfig.BASE_BRANCH = '';
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (currentConfig.TARGET_BRANCH && !newBranches.includes(currentConfig.TARGET_BRANCH)) {
|
|
331
|
+
const targetSelect = document.getElementById('TARGET_BRANCH');
|
|
332
|
+
if (targetSelect && targetSelect.value !== '') {
|
|
333
|
+
currentConfig.TARGET_BRANCH = '';
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
updateSelectUI();
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (targetBranchSelect) {
|
|
343
|
+
targetBranchSelect.addEventListener('change', () => {
|
|
344
|
+
const customInput = document.getElementById('TARGET_BRANCH_custom');
|
|
345
|
+
if (!customInput) return;
|
|
346
|
+
|
|
347
|
+
const isNewBranch = targetBranchSelect.value === '';
|
|
348
|
+
customInput.classList.toggle('hidden', !isNewBranch);
|
|
349
|
+
if (isNewBranch) {
|
|
350
|
+
customInput.focus();
|
|
351
|
+
} else {
|
|
352
|
+
customInput.value = '';
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function showStatus(message, type) {
|
|
359
|
+
status.textContent = message;
|
|
360
|
+
status.className = `mt-6 p-4 rounded-lg font-medium text-center ${type === 'success' ? 'bg-green-900/50 text-green-300 border border-green-700' : 'bg-red-900/50 text-red-300 border border-red-700'}`;
|
|
361
|
+
status.classList.remove('hidden');
|
|
362
|
+
setTimeout(() => status.classList.add('hidden'), 5000);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Uniformisation: addEventListener au lieu de onsubmit/onclick
|
|
366
|
+
form.addEventListener('submit', async (e) => {
|
|
367
|
+
e.preventDefault();
|
|
368
|
+
const config = {};
|
|
369
|
+
fields.forEach(field => {
|
|
370
|
+
const input = document.getElementById(field.id);
|
|
371
|
+
if (!input) return; // Protection contre les éléments manquants
|
|
372
|
+
if (field.type === 'checkbox') {
|
|
373
|
+
config[field.id] = input.checked;
|
|
374
|
+
} else if (field.id === 'TARGET_BRANCH') {
|
|
375
|
+
const customInput = document.getElementById(`${field.id}_custom`);
|
|
376
|
+
config[field.id] = customInput && customInput.value ? customInput.value : input.value;
|
|
377
|
+
} else {
|
|
378
|
+
config[field.id] = input.value;
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
try {
|
|
383
|
+
const response = await fetch(api('api/config'), {
|
|
384
|
+
method: 'POST',
|
|
385
|
+
headers: { 'Content-Type': 'application/json' },
|
|
386
|
+
body: JSON.stringify(config)
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
if (response.ok) {
|
|
390
|
+
showStatus('Configuration enregistrée avec succès !', 'success');
|
|
391
|
+
} else {
|
|
392
|
+
const data = await response.json().catch(() => ({ error: 'Erreur inconnue' }));
|
|
393
|
+
throw new Error(data.error || 'Erreur lors de l\'enregistrement');
|
|
394
|
+
}
|
|
395
|
+
} catch (error) {
|
|
396
|
+
showStatus(error.message, 'error');
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
restartBtn.addEventListener('click', async () => {
|
|
401
|
+
if (!confirm('Êtes-vous sûr de vouloir redémarrer le serveur MCP ? Cela coupera la connexion actuelle pour appliquer les changements.')) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const originalHTML = restartBtn.innerHTML; // Sauvegarder le HTML original
|
|
406
|
+
try {
|
|
407
|
+
restartBtn.disabled = true;
|
|
408
|
+
restartBtn.innerHTML = '<span>Redémarrage en cours...</span>';
|
|
409
|
+
|
|
410
|
+
const response = await fetch(api('api/restart'), { method: 'POST' });
|
|
411
|
+
|
|
412
|
+
if (response.ok) {
|
|
413
|
+
showStatus('Signal de redémarrage envoyé. Le serveur va se relancer...', 'success');
|
|
414
|
+
setTimeout(() => window.location.reload(), 3000);
|
|
415
|
+
} else {
|
|
416
|
+
throw new Error('Erreur lors de la demande de redémarrage');
|
|
417
|
+
}
|
|
418
|
+
} catch (error) {
|
|
419
|
+
showStatus(error.message, 'error');
|
|
420
|
+
restartBtn.disabled = false;
|
|
421
|
+
restartBtn.innerHTML = originalHTML; // Restaurer le HTML original
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
stopBtn.addEventListener('click', async () => {
|
|
426
|
+
if (!confirm('Êtes-vous sûr de vouloir arrêter COMPLÈTEMENT le serveur MCP ?')) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const originalHTML = stopBtn.innerHTML; // Sauvegarder le HTML original
|
|
431
|
+
try {
|
|
432
|
+
stopBtn.disabled = true;
|
|
433
|
+
stopBtn.innerHTML = '<span>Arrêt en cours...</span>';
|
|
434
|
+
|
|
435
|
+
const response = await fetch(api('api/stop'), { method: 'POST' });
|
|
436
|
+
|
|
437
|
+
if (response.ok) {
|
|
438
|
+
showStatus('Le serveur s\'arrête. Cette page ne sera plus disponible.', 'success');
|
|
439
|
+
} else {
|
|
440
|
+
throw new Error('Erreur lors de la demande d\'arrêt');
|
|
441
|
+
}
|
|
442
|
+
} catch (error) {
|
|
443
|
+
showStatus(error.message, 'error');
|
|
444
|
+
stopBtn.disabled = false;
|
|
445
|
+
stopBtn.innerHTML = originalHTML; // Restaurer le HTML original
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
fetchConfig();
|
|
450
|
+
</script>
|
|
451
|
+
</body>
|
|
452
|
+
</html>
|