@andrebuzeli/git-mcp 5.0.5 → 5.0.6
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/LICENSE +21 -0
- package/README.md +143 -89
- package/dist/config.d.ts +72 -71
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +226 -139
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +15 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +133 -128
- package/dist/index.js.map +1 -1
- package/dist/providers/base-provider.d.ts +42 -153
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +42 -302
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/gitea-provider.d.ts +67 -118
- package/dist/providers/gitea-provider.d.ts.map +1 -1
- package/dist/providers/gitea-provider.js +487 -1161
- package/dist/providers/gitea-provider.js.map +1 -1
- package/dist/providers/github-provider.d.ts +70 -81
- package/dist/providers/github-provider.d.ts.map +1 -1
- package/dist/providers/github-provider.js +641 -278
- package/dist/providers/github-provider.js.map +1 -1
- package/dist/providers/index.d.ts +9 -9
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -19
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/provider-factory.d.ts +29 -59
- package/dist/providers/provider-factory.d.ts.map +1 -1
- package/dist/providers/provider-factory.js +134 -265
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/providers/provider-operation-handler.d.ts +93 -0
- package/dist/providers/provider-operation-handler.d.ts.map +1 -0
- package/dist/providers/provider-operation-handler.js +280 -0
- package/dist/providers/provider-operation-handler.js.map +1 -0
- package/dist/providers/types.d.ts +201 -355
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +3 -2
- package/dist/providers/types.js.map +1 -1
- package/dist/server.d.ts +34 -8
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +436 -494
- package/dist/server.js.map +1 -1
- package/dist/tools/git-analytics.d.ts +239 -16
- package/dist/tools/git-analytics.d.ts.map +1 -1
- package/dist/tools/git-analytics.js +737 -25
- package/dist/tools/git-analytics.js.map +1 -1
- package/dist/tools/git-archive.d.ts +109 -15
- package/dist/tools/git-archive.d.ts.map +1 -1
- package/dist/tools/git-archive.js +462 -10
- package/dist/tools/git-archive.js.map +1 -1
- package/dist/tools/git-backup.d.ts +101 -15
- package/dist/tools/git-backup.d.ts.map +1 -1
- package/dist/tools/git-backup.js +410 -10
- package/dist/tools/git-backup.js.map +1 -1
- package/dist/tools/git-branches.d.ts +141 -15
- package/dist/tools/git-branches.d.ts.map +1 -1
- package/dist/tools/git-branches.js +466 -11
- package/dist/tools/git-branches.js.map +1 -1
- package/dist/tools/git-config.d.ts +115 -15
- package/dist/tools/git-config.d.ts.map +1 -1
- package/dist/tools/git-config.js +446 -11
- package/dist/tools/git-config.js.map +1 -1
- package/dist/tools/git-files.d.ts +179 -59
- package/dist/tools/git-files.d.ts.map +1 -1
- package/dist/tools/git-files.js +682 -222
- package/dist/tools/git-files.js.map +1 -1
- package/dist/tools/git-issues.d.ts +158 -15
- package/dist/tools/git-issues.d.ts.map +1 -1
- package/dist/tools/git-issues.js +323 -11
- package/dist/tools/git-issues.js.map +1 -1
- package/dist/tools/git-monitor.d.ts +149 -14
- package/dist/tools/git-monitor.d.ts.map +1 -1
- package/dist/tools/git-monitor.js +528 -11
- package/dist/tools/git-monitor.js.map +1 -1
- package/dist/tools/git-packages.d.ts +163 -15
- package/dist/tools/git-packages.d.ts.map +1 -1
- package/dist/tools/git-packages.js +526 -11
- package/dist/tools/git-packages.js.map +1 -1
- package/dist/tools/git-pulls.d.ts +174 -15
- package/dist/tools/git-pulls.d.ts.map +1 -1
- package/dist/tools/git-pulls.js +352 -11
- package/dist/tools/git-pulls.js.map +1 -1
- package/dist/tools/git-release.d.ts +167 -15
- package/dist/tools/git-release.d.ts.map +1 -1
- package/dist/tools/git-release.js +465 -11
- package/dist/tools/git-release.js.map +1 -1
- package/dist/tools/git-remote.d.ts +124 -15
- package/dist/tools/git-remote.d.ts.map +1 -1
- package/dist/tools/git-remote.js +539 -11
- package/dist/tools/git-remote.js.map +1 -1
- package/dist/tools/git-reset.d.ts +100 -15
- package/dist/tools/git-reset.d.ts.map +1 -1
- package/dist/tools/git-reset.js +409 -11
- package/dist/tools/git-reset.js.map +1 -1
- package/dist/tools/git-stash.d.ts +120 -15
- package/dist/tools/git-stash.d.ts.map +1 -1
- package/dist/tools/git-stash.js +503 -11
- package/dist/tools/git-stash.js.map +1 -1
- package/dist/tools/git-sync.d.ts +160 -16
- package/dist/tools/git-sync.d.ts.map +1 -1
- package/dist/tools/git-sync.js +462 -113
- package/dist/tools/git-sync.js.map +1 -1
- package/dist/tools/git-tags.d.ts +142 -15
- package/dist/tools/git-tags.d.ts.map +1 -1
- package/dist/tools/git-tags.js +471 -11
- package/dist/tools/git-tags.js.map +1 -1
- package/dist/tools/git-workflow.d.ts +151 -80
- package/dist/tools/git-workflow.d.ts.map +1 -1
- package/dist/tools/git-workflow.js +407 -912
- package/dist/tools/git-workflow.js.map +1 -1
- package/dist/utils/credential-manager.d.ts +119 -0
- package/dist/utils/credential-manager.d.ts.map +1 -0
- package/dist/utils/credential-manager.js +450 -0
- package/dist/utils/credential-manager.js.map +1 -0
- package/dist/utils/git-command-executor.d.ts +326 -0
- package/dist/utils/git-command-executor.d.ts.map +1 -0
- package/dist/utils/git-command-executor.js +877 -0
- package/dist/utils/git-command-executor.js.map +1 -0
- package/dist/utils/logger.d.ts +143 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +473 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operation-error-handler.d.ts +54 -41
- package/dist/utils/operation-error-handler.d.ts.map +1 -1
- package/dist/utils/operation-error-handler.js +211 -227
- package/dist/utils/operation-error-handler.js.map +1 -1
- package/dist/utils/parameter-validator.d.ts +41 -0
- package/dist/utils/parameter-validator.d.ts.map +1 -0
- package/dist/utils/parameter-validator.js +464 -0
- package/dist/utils/parameter-validator.js.map +1 -0
- package/dist/utils/repository-detector.d.ts +128 -0
- package/dist/utils/repository-detector.d.ts.map +1 -0
- package/dist/utils/repository-detector.js +422 -0
- package/dist/utils/repository-detector.js.map +1 -0
- package/dist/utils/response-formatter.d.ts +146 -0
- package/dist/utils/response-formatter.d.ts.map +1 -0
- package/dist/utils/response-formatter.js +378 -0
- package/dist/utils/response-formatter.js.map +1 -0
- package/dist/utils/retry.d.ts +12 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +28 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/terminal-controller.d.ts +73 -139
- package/dist/utils/terminal-controller.d.ts.map +1 -1
- package/dist/utils/terminal-controller.js +234 -459
- package/dist/utils/terminal-controller.js.map +1 -1
- package/package.json +79 -60
- package/dist/providers/error-handler.d.ts +0 -51
- package/dist/providers/error-handler.d.ts.map +0 -1
- package/dist/providers/error-handler.js +0 -176
- package/dist/providers/error-handler.js.map +0 -1
- package/dist/providers/github-provider-backup.d.ts +0 -81
- package/dist/providers/github-provider-backup.d.ts.map +0 -1
- package/dist/providers/github-provider-backup.js +0 -1179
- package/dist/providers/github-provider-backup.js.map +0 -1
- package/dist/providers/github-provider-complete.d.ts +0 -1
- package/dist/providers/github-provider-complete.d.ts.map +0 -1
- package/dist/providers/github-provider-complete.js +0 -2
- package/dist/providers/github-provider-complete.js.map +0 -1
- package/dist/tools/git-init.d.ts +0 -50
- package/dist/tools/git-init.d.ts.map +0 -1
- package/dist/tools/git-init.js +0 -258
- package/dist/tools/git-init.js.map +0 -1
- package/dist/tools/git-log.d.ts +0 -67
- package/dist/tools/git-log.d.ts.map +0 -1
- package/dist/tools/git-log.js +0 -320
- package/dist/tools/git-log.js.map +0 -1
- package/dist/tools/git-status.d.ts +0 -29
- package/dist/tools/git-status.d.ts.map +0 -1
- package/dist/tools/git-status.js +0 -182
- package/dist/tools/git-status.js.map +0 -1
- package/dist/tools/git-update.d.ts +0 -34
- package/dist/tools/git-update.d.ts.map +0 -1
- package/dist/tools/git-update.js +0 -191
- package/dist/tools/git-update.js.map +0 -1
- package/dist/utils/auto-detection.d.ts +0 -120
- package/dist/utils/auto-detection.d.ts.map +0 -1
- package/dist/utils/auto-detection.js +0 -259
- package/dist/utils/auto-detection.js.map +0 -1
- package/dist/utils/configuration-error-generator.d.ts +0 -41
- package/dist/utils/configuration-error-generator.d.ts.map +0 -1
- package/dist/utils/configuration-error-generator.js +0 -168
- package/dist/utils/configuration-error-generator.js.map +0 -1
- package/dist/utils/configuration-validator.d.ts +0 -67
- package/dist/utils/configuration-validator.d.ts.map +0 -1
- package/dist/utils/configuration-validator.js +0 -257
- package/dist/utils/configuration-validator.js.map +0 -1
- package/dist/utils/error-handler.d.ts +0 -107
- package/dist/utils/error-handler.d.ts.map +0 -1
- package/dist/utils/error-handler.js +0 -331
- package/dist/utils/error-handler.js.map +0 -1
- package/dist/utils/git-operations.d.ts +0 -200
- package/dist/utils/git-operations.d.ts.map +0 -1
- package/dist/utils/git-operations.js +0 -836
- package/dist/utils/git-operations.js.map +0 -1
- package/dist/utils/multi-provider-error-handler.d.ts +0 -75
- package/dist/utils/multi-provider-error-handler.d.ts.map +0 -1
- package/dist/utils/multi-provider-error-handler.js +0 -276
- package/dist/utils/multi-provider-error-handler.js.map +0 -1
- package/dist/utils/multi-provider-operation-handler.d.ts +0 -113
- package/dist/utils/multi-provider-operation-handler.d.ts.map +0 -1
- package/dist/utils/multi-provider-operation-handler.js +0 -303
- package/dist/utils/multi-provider-operation-handler.js.map +0 -1
- package/dist/utils/provider-operation-handler.d.ts +0 -80
- package/dist/utils/provider-operation-handler.d.ts.map +0 -1
- package/dist/utils/provider-operation-handler.js +0 -201
- package/dist/utils/provider-operation-handler.js.map +0 -1
- package/dist/utils/response-helper.d.ts +0 -57
- package/dist/utils/response-helper.d.ts.map +0 -1
- package/dist/utils/response-helper.js +0 -54
- package/dist/utils/response-helper.js.map +0 -1
- package/dist/utils/user-detection.d.ts +0 -25
- package/dist/utils/user-detection.d.ts.map +0 -1
- package/dist/utils/user-detection.js +0 -54
- package/dist/utils/user-detection.js.map +0 -1
package/dist/config.js
CHANGED
|
@@ -1,159 +1,246 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.config = void 0;
|
|
4
|
-
const zod_1 = require("zod");
|
|
5
2
|
/**
|
|
6
|
-
*
|
|
3
|
+
* Configuration Management
|
|
4
|
+
*
|
|
5
|
+
* Handles environment variable configuration for GitHub and Gitea providers.
|
|
6
|
+
* Provides validation and auto-detection utilities.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (val) {
|
|
24
|
-
try {
|
|
25
|
-
return JSON.parse(val);
|
|
26
|
-
}
|
|
27
|
-
catch (e) {
|
|
28
|
-
console.error("Error parsing PROVIDERS_JSON:", e);
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return undefined;
|
|
33
|
-
}),
|
|
34
|
-
// Configurações gerais
|
|
35
|
-
debug: zod_1.z.boolean().default(false),
|
|
36
|
-
timeout: zod_1.z.number().positive().default(30000),
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
37
23
|
});
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.configManager = exports.ConfigManager = void 0;
|
|
43
|
+
exports.getProviderConfig = getProviderConfig;
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
41
46
|
class ConfigManager {
|
|
42
|
-
static instance;
|
|
43
47
|
config;
|
|
44
48
|
constructor() {
|
|
45
|
-
this.config = this.
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// Configuração legacy para Gitea
|
|
56
|
-
giteaUrl: process.env.GITEA_URL,
|
|
57
|
-
giteaToken: process.env.GITEA_TOKEN,
|
|
58
|
-
giteaUsername: process.env.GITEA_USERNAME,
|
|
59
|
-
// Configuração para GitHub
|
|
60
|
-
githubToken: process.env.GITHUB_TOKEN,
|
|
61
|
-
githubUsername: process.env.GITHUB_USERNAME,
|
|
62
|
-
// Configuração genérica para multi-provider
|
|
63
|
-
provider: process.env.PROVIDER,
|
|
64
|
-
apiUrl: process.env.API_URL,
|
|
65
|
-
apiToken: process.env.API_TOKEN,
|
|
66
|
-
// Configuração multi-provider
|
|
67
|
-
defaultProvider: process.env.DEFAULT_PROVIDER,
|
|
68
|
-
providersJson: process.env.PROVIDERS_JSON,
|
|
69
|
-
// Configurações gerais
|
|
70
|
-
debug: process.env.DEBUG === 'true',
|
|
71
|
-
timeout: parseInt(process.env.TIMEOUT || '30000'),
|
|
72
|
-
};
|
|
73
|
-
// Auto-detectar configuração multi-provider se ambos Gitea e GitHub estão configurados
|
|
74
|
-
if (config.giteaUrl && config.giteaToken && config.githubToken && !config.providersJson) {
|
|
75
|
-
config.providersJson = JSON.stringify({
|
|
76
|
-
defaultProvider: 'gitea',
|
|
77
|
-
providers: [
|
|
78
|
-
{
|
|
79
|
-
name: 'gitea',
|
|
80
|
-
type: 'gitea',
|
|
81
|
-
apiUrl: config.giteaUrl,
|
|
82
|
-
token: config.giteaToken,
|
|
83
|
-
username: config.giteaUsername
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
name: 'github',
|
|
87
|
-
type: 'github',
|
|
88
|
-
apiUrl: 'https://api.github.com',
|
|
89
|
-
token: config.githubToken,
|
|
90
|
-
username: config.githubUsername
|
|
91
|
-
}
|
|
92
|
-
]
|
|
93
|
-
});
|
|
49
|
+
this.config = this.loadConfiguration();
|
|
50
|
+
}
|
|
51
|
+
loadConfiguration() {
|
|
52
|
+
const config = {};
|
|
53
|
+
// GitHub configuration
|
|
54
|
+
if (process.env.GITHUB_TOKEN && process.env.GITHUB_USERNAME) {
|
|
55
|
+
config.github = {
|
|
56
|
+
token: process.env.GITHUB_TOKEN,
|
|
57
|
+
username: process.env.GITHUB_USERNAME,
|
|
58
|
+
};
|
|
94
59
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
throw error;
|
|
60
|
+
// Gitea configuration
|
|
61
|
+
if (process.env.GITEA_URL && process.env.GITEA_TOKEN && process.env.GITEA_USERNAME) {
|
|
62
|
+
config.gitea = {
|
|
63
|
+
url: process.env.GITEA_URL,
|
|
64
|
+
token: process.env.GITEA_TOKEN,
|
|
65
|
+
username: process.env.GITEA_USERNAME,
|
|
66
|
+
};
|
|
104
67
|
}
|
|
68
|
+
return config;
|
|
105
69
|
}
|
|
106
70
|
getConfig() {
|
|
107
71
|
return this.config;
|
|
108
72
|
}
|
|
109
|
-
|
|
110
|
-
return this.config.
|
|
111
|
-
}
|
|
112
|
-
getGiteaToken() {
|
|
113
|
-
return this.config.giteaToken;
|
|
114
|
-
}
|
|
115
|
-
getGiteaUsername() {
|
|
116
|
-
return this.config.giteaUsername;
|
|
117
|
-
}
|
|
118
|
-
isDebug() {
|
|
119
|
-
return this.config.debug;
|
|
120
|
-
}
|
|
121
|
-
getTimeout() {
|
|
122
|
-
return this.config.timeout;
|
|
123
|
-
}
|
|
124
|
-
getProvider() {
|
|
125
|
-
return this.config.provider;
|
|
126
|
-
}
|
|
127
|
-
getApiUrl() {
|
|
128
|
-
return this.config.apiUrl;
|
|
129
|
-
}
|
|
130
|
-
getApiToken() {
|
|
131
|
-
return this.config.apiToken;
|
|
132
|
-
}
|
|
133
|
-
getGitHubToken() {
|
|
134
|
-
return this.config.githubToken;
|
|
135
|
-
}
|
|
136
|
-
getGitHubUsername() {
|
|
137
|
-
return this.config.githubUsername;
|
|
73
|
+
isGitHubConfigured() {
|
|
74
|
+
return !!this.config.github;
|
|
138
75
|
}
|
|
139
|
-
|
|
140
|
-
return this.config.
|
|
76
|
+
isGiteaConfigured() {
|
|
77
|
+
return !!this.config.gitea;
|
|
141
78
|
}
|
|
142
|
-
|
|
143
|
-
return
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
79
|
+
getConfigurationStatus() {
|
|
80
|
+
return {
|
|
81
|
+
github: this.isGitHubConfigured() ? 'configured' : 'not configured',
|
|
82
|
+
gitea: this.isGiteaConfigured() ? 'configured' : 'not configured',
|
|
83
|
+
};
|
|
147
84
|
}
|
|
148
|
-
|
|
149
|
-
|
|
85
|
+
/**
|
|
86
|
+
* Validates GitHub and Gitea credentials
|
|
87
|
+
*/
|
|
88
|
+
validateCredentials() {
|
|
89
|
+
const result = {
|
|
90
|
+
isValid: true,
|
|
91
|
+
errors: [],
|
|
92
|
+
warnings: [],
|
|
93
|
+
missingEnvVars: [],
|
|
94
|
+
};
|
|
95
|
+
// Check GitHub configuration
|
|
96
|
+
if (process.env.GITHUB_TOKEN && !process.env.GITHUB_USERNAME) {
|
|
97
|
+
result.errors.push('GITHUB_TOKEN is set but GITHUB_USERNAME is missing');
|
|
98
|
+
result.missingEnvVars.push('GITHUB_USERNAME');
|
|
99
|
+
result.isValid = false;
|
|
100
|
+
}
|
|
101
|
+
if (process.env.GITHUB_USERNAME && !process.env.GITHUB_TOKEN) {
|
|
102
|
+
result.errors.push('GITHUB_USERNAME is set but GITHUB_TOKEN is missing');
|
|
103
|
+
result.missingEnvVars.push('GITHUB_TOKEN');
|
|
104
|
+
result.isValid = false;
|
|
105
|
+
}
|
|
106
|
+
// Check Gitea configuration
|
|
107
|
+
const giteaVars = ['GITEA_URL', 'GITEA_TOKEN', 'GITEA_USERNAME'];
|
|
108
|
+
const setGiteaVars = giteaVars.filter(varName => !!process.env[varName]);
|
|
109
|
+
if (setGiteaVars.length > 0 && setGiteaVars.length < 3) {
|
|
110
|
+
const missingGiteaVars = giteaVars.filter(varName => !process.env[varName]);
|
|
111
|
+
result.errors.push(`Partial Gitea configuration detected. Missing: ${missingGiteaVars.join(', ')}`);
|
|
112
|
+
result.missingEnvVars.push(...missingGiteaVars);
|
|
113
|
+
result.isValid = false;
|
|
114
|
+
}
|
|
115
|
+
// Validate Gitea URL format
|
|
116
|
+
if (process.env.GITEA_URL) {
|
|
117
|
+
try {
|
|
118
|
+
new URL(process.env.GITEA_URL);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
result.errors.push('GITEA_URL is not a valid URL format');
|
|
122
|
+
result.isValid = false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Check if at least one provider is configured
|
|
126
|
+
if (!this.isGitHubConfigured() && !this.isGiteaConfigured()) {
|
|
127
|
+
result.warnings.push('No providers are configured. At least one provider (GitHub or Gitea) should be configured for remote operations.');
|
|
128
|
+
result.configurationGuide = {
|
|
129
|
+
requiredEnvVars: ['GITHUB_TOKEN', 'GITHUB_USERNAME', 'GITEA_URL', 'GITEA_TOKEN', 'GITEA_USERNAME'],
|
|
130
|
+
exampleConfig: {
|
|
131
|
+
'GITHUB_TOKEN': 'ghp_xxxxxxxxxxxxxxxxxxxx',
|
|
132
|
+
'GITHUB_USERNAME': 'your-github-username',
|
|
133
|
+
'GITEA_URL': 'https://gitea.example.com',
|
|
134
|
+
'GITEA_TOKEN': 'your-gitea-token',
|
|
135
|
+
'GITEA_USERNAME': 'your-gitea-username'
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Auto-detects project context from projectPath
|
|
143
|
+
*/
|
|
144
|
+
detectProjectContext(projectPath) {
|
|
145
|
+
const context = {
|
|
146
|
+
projectPath,
|
|
147
|
+
repositoryName: path.basename(projectPath),
|
|
148
|
+
isGitRepository: false,
|
|
149
|
+
};
|
|
150
|
+
try {
|
|
151
|
+
// Check if it's a Git repository
|
|
152
|
+
const gitDir = path.join(projectPath, '.git');
|
|
153
|
+
context.isGitRepository = fs.existsSync(gitDir);
|
|
154
|
+
if (context.isGitRepository) {
|
|
155
|
+
// Try to detect remote origin
|
|
156
|
+
const gitConfigPath = path.join(gitDir, 'config');
|
|
157
|
+
if (fs.existsSync(gitConfigPath)) {
|
|
158
|
+
const gitConfig = fs.readFileSync(gitConfigPath, 'utf8');
|
|
159
|
+
const remoteMatch = gitConfig.match(/\[remote "origin"\][\s\S]*?url = (.+)/);
|
|
160
|
+
if (remoteMatch) {
|
|
161
|
+
context.remoteOrigin = remoteMatch[1].trim();
|
|
162
|
+
// Detect provider from remote URL
|
|
163
|
+
if (context.remoteOrigin.includes('github.com')) {
|
|
164
|
+
context.detectedProvider = 'github';
|
|
165
|
+
}
|
|
166
|
+
else if (context.remoteOrigin.includes('gitea') ||
|
|
167
|
+
(this.config.gitea && context.remoteOrigin.includes(new URL(this.config.gitea.url).hostname))) {
|
|
168
|
+
context.detectedProvider = 'gitea';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Try to detect current branch
|
|
173
|
+
const headPath = path.join(gitDir, 'HEAD');
|
|
174
|
+
if (fs.existsSync(headPath)) {
|
|
175
|
+
const headContent = fs.readFileSync(headPath, 'utf8').trim();
|
|
176
|
+
const branchMatch = headContent.match(/ref: refs\/heads\/(.+)/);
|
|
177
|
+
if (branchMatch) {
|
|
178
|
+
context.currentBranch = branchMatch[1];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
// Silently handle errors in detection
|
|
185
|
+
}
|
|
186
|
+
return context;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Auto-detects username/owner from environment variables
|
|
190
|
+
*/
|
|
191
|
+
autoDetectUsername(provider) {
|
|
192
|
+
if (provider === 'github' && this.config.github) {
|
|
193
|
+
return this.config.github.username;
|
|
194
|
+
}
|
|
195
|
+
if (provider === 'gitea' && this.config.gitea) {
|
|
196
|
+
return this.config.gitea.username;
|
|
197
|
+
}
|
|
198
|
+
return undefined;
|
|
150
199
|
}
|
|
151
|
-
|
|
152
|
-
|
|
200
|
+
/**
|
|
201
|
+
* Gets provider configuration for a specific provider
|
|
202
|
+
*/
|
|
203
|
+
getProviderConfig(provider) {
|
|
204
|
+
return provider === 'github' ? this.config.github : this.config.gitea;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Checks if a provider is supported for operations
|
|
208
|
+
*/
|
|
209
|
+
isProviderSupported(provider) {
|
|
210
|
+
if (provider === 'both') {
|
|
211
|
+
return this.isGitHubConfigured() && this.isGiteaConfigured();
|
|
212
|
+
}
|
|
213
|
+
return provider === 'github' ? this.isGitHubConfigured() : this.isGiteaConfigured();
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Gets configuration guidance for missing setup
|
|
217
|
+
*/
|
|
218
|
+
getConfigurationGuidance() {
|
|
219
|
+
return {
|
|
220
|
+
requiredEnvVars: [
|
|
221
|
+
'GITHUB_TOKEN', 'GITHUB_USERNAME',
|
|
222
|
+
'GITEA_URL', 'GITEA_TOKEN', 'GITEA_USERNAME'
|
|
223
|
+
],
|
|
224
|
+
exampleConfig: {
|
|
225
|
+
'GITHUB_TOKEN': 'ghp_xxxxxxxxxxxxxxxxxxxx',
|
|
226
|
+
'GITHUB_USERNAME': 'your-github-username',
|
|
227
|
+
'GITEA_URL': 'https://gitea.example.com',
|
|
228
|
+
'GITEA_TOKEN': 'your-gitea-token',
|
|
229
|
+
'GITEA_USERNAME': 'your-gitea-username'
|
|
230
|
+
},
|
|
231
|
+
setupInstructions: [
|
|
232
|
+
'1. For GitHub: Create a personal access token at https://github.com/settings/tokens',
|
|
233
|
+
'2. For Gitea: Create an access token in your Gitea instance settings',
|
|
234
|
+
'3. Set the environment variables before running the MCP server',
|
|
235
|
+
'4. At least one provider (GitHub or Gitea) must be configured for remote operations'
|
|
236
|
+
]
|
|
237
|
+
};
|
|
153
238
|
}
|
|
154
239
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
240
|
+
exports.ConfigManager = ConfigManager;
|
|
241
|
+
// Export singleton instance and convenience functions
|
|
242
|
+
exports.configManager = new ConfigManager();
|
|
243
|
+
function getProviderConfig() {
|
|
244
|
+
return exports.configManager.getConfig();
|
|
245
|
+
}
|
|
159
246
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* GIT MCP Server - Entry Point
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Professional MCP server for Git operations with multi-provider support.
|
|
6
|
+
* Supports GitHub and Gitea providers with unified interface.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* - Local development: node dist/index.js
|
|
10
|
+
* - NPM package: npx @andrebuzeli/git-mcp@latest
|
|
11
|
+
* - Direct execution: git-mcp (after npm install -g)
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* - 18 tools Git completas conforme design
|
|
19
|
-
* - Auto-detecção universal
|
|
20
|
-
* - Suporte multi-provider
|
|
21
|
-
* - Interface universal para IA
|
|
13
|
+
* Environment Variables:
|
|
14
|
+
* - GITHUB_TOKEN: GitHub personal access token
|
|
15
|
+
* - GITHUB_USERNAME: GitHub username
|
|
16
|
+
* - GITEA_URL: Gitea instance URL
|
|
17
|
+
* - GITEA_TOKEN: Gitea access token
|
|
18
|
+
* - GITEA_USERNAME: Gitea username
|
|
22
19
|
*/
|
|
23
|
-
export {};
|
|
20
|
+
export { GitMCPServer } from './server.js';
|
|
21
|
+
export { getProviderConfig } from './config.js';
|
|
24
22
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;GAiBG;AAqJH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|