@hypnosis/docker-mcp-server 1.0.0
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 +242 -0
- package/dist/adapters/adapter-registry.d.ts +29 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +47 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/database-adapter.d.ts +33 -0
- package/dist/adapters/database-adapter.d.ts.map +1 -0
- package/dist/adapters/database-adapter.js +6 -0
- package/dist/adapters/database-adapter.js.map +1 -0
- package/dist/adapters/postgresql.d.ts +42 -0
- package/dist/adapters/postgresql.d.ts.map +1 -0
- package/dist/adapters/postgresql.js +202 -0
- package/dist/adapters/postgresql.js.map +1 -0
- package/dist/adapters/redis.d.ts +46 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +202 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/sqlite.d.ts +34 -0
- package/dist/adapters/sqlite.d.ts.map +1 -0
- package/dist/adapters/sqlite.js +126 -0
- package/dist/adapters/sqlite.js.map +1 -0
- package/dist/adapters/types.d.ts +53 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +5 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +319 -0
- package/dist/cli.js.map +1 -0
- package/dist/discovery/compose-parser.d.ts +35 -0
- package/dist/discovery/compose-parser.d.ts.map +1 -0
- package/dist/discovery/compose-parser.js +126 -0
- package/dist/discovery/compose-parser.js.map +1 -0
- package/dist/discovery/config-merger.d.ts +19 -0
- package/dist/discovery/config-merger.d.ts.map +1 -0
- package/dist/discovery/config-merger.js +60 -0
- package/dist/discovery/config-merger.js.map +1 -0
- package/dist/discovery/project-discovery.d.ts +53 -0
- package/dist/discovery/project-discovery.d.ts.map +1 -0
- package/dist/discovery/project-discovery.js +252 -0
- package/dist/discovery/project-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +47 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +6 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/compose-manager.d.ts +30 -0
- package/dist/managers/compose-manager.d.ts.map +1 -0
- package/dist/managers/compose-manager.js +70 -0
- package/dist/managers/compose-manager.js.map +1 -0
- package/dist/managers/container-manager.d.ts +81 -0
- package/dist/managers/container-manager.d.ts.map +1 -0
- package/dist/managers/container-manager.js +278 -0
- package/dist/managers/container-manager.js.map +1 -0
- package/dist/managers/env-manager.d.ts +37 -0
- package/dist/managers/env-manager.d.ts.map +1 -0
- package/dist/managers/env-manager.js +124 -0
- package/dist/managers/env-manager.js.map +1 -0
- package/dist/security/sql-validator.d.ts +23 -0
- package/dist/security/sql-validator.d.ts.map +1 -0
- package/dist/security/sql-validator.js +44 -0
- package/dist/security/sql-validator.js.map +1 -0
- package/dist/tools/container-tools.d.ts +31 -0
- package/dist/tools/container-tools.d.ts.map +1 -0
- package/dist/tools/container-tools.js +366 -0
- package/dist/tools/container-tools.js.map +1 -0
- package/dist/tools/database-tools.d.ts +22 -0
- package/dist/tools/database-tools.d.ts.map +1 -0
- package/dist/tools/database-tools.js +264 -0
- package/dist/tools/database-tools.js.map +1 -0
- package/dist/tools/env-tools.d.ts +52 -0
- package/dist/tools/env-tools.d.ts.map +1 -0
- package/dist/tools/env-tools.js +318 -0
- package/dist/tools/env-tools.js.map +1 -0
- package/dist/tools/executor-tool.d.ts +18 -0
- package/dist/tools/executor-tool.d.ts.map +1 -0
- package/dist/tools/executor-tool.js +95 -0
- package/dist/tools/executor-tool.js.map +1 -0
- package/dist/tools/mcp-health-tool.d.ts +65 -0
- package/dist/tools/mcp-health-tool.d.ts.map +1 -0
- package/dist/tools/mcp-health-tool.js +126 -0
- package/dist/tools/mcp-health-tool.js.map +1 -0
- package/dist/utils/cache.d.ts +43 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +77 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/compose-exec.d.ts +13 -0
- package/dist/utils/compose-exec.d.ts.map +1 -0
- package/dist/utils/compose-exec.js +33 -0
- package/dist/utils/compose-exec.js.map +1 -0
- package/dist/utils/docker-client.d.ts +33 -0
- package/dist/utils/docker-client.d.ts.map +1 -0
- package/dist/utils/docker-client.js +59 -0
- package/dist/utils/docker-client.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +65 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI Interface for Docker MCP Server
|
|
4
|
+
* Allows direct command execution without MCP protocol
|
|
5
|
+
*/
|
|
6
|
+
import { ContainerTools } from './tools/container-tools.js';
|
|
7
|
+
import { ExecutorTool } from './tools/executor-tool.js';
|
|
8
|
+
import { DatabaseTools } from './tools/database-tools.js';
|
|
9
|
+
import { EnvTools } from './tools/env-tools.js';
|
|
10
|
+
import { MCPHealthTool } from './tools/mcp-health-tool.js';
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
if (args.length === 0) {
|
|
13
|
+
showHelp();
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
16
|
+
const command = args[0];
|
|
17
|
+
async function main() {
|
|
18
|
+
try {
|
|
19
|
+
switch (command) {
|
|
20
|
+
// Container commands
|
|
21
|
+
case 'container-list':
|
|
22
|
+
case 'ps':
|
|
23
|
+
await containerList();
|
|
24
|
+
break;
|
|
25
|
+
case 'container-start':
|
|
26
|
+
await containerStart(args[1]);
|
|
27
|
+
break;
|
|
28
|
+
case 'container-stop':
|
|
29
|
+
await containerStop(args[1]);
|
|
30
|
+
break;
|
|
31
|
+
case 'container-restart':
|
|
32
|
+
await containerRestart(args[1]);
|
|
33
|
+
break;
|
|
34
|
+
case 'container-logs':
|
|
35
|
+
case 'logs':
|
|
36
|
+
await containerLogs(args[1], parseLogsOptions(args.slice(2)));
|
|
37
|
+
break;
|
|
38
|
+
case 'compose-up':
|
|
39
|
+
case 'up':
|
|
40
|
+
await composeUp();
|
|
41
|
+
break;
|
|
42
|
+
case 'compose-down':
|
|
43
|
+
case 'down':
|
|
44
|
+
await composeDown();
|
|
45
|
+
break;
|
|
46
|
+
// Executor
|
|
47
|
+
case 'exec':
|
|
48
|
+
await exec(args[1], args.slice(2).join(' '));
|
|
49
|
+
break;
|
|
50
|
+
// Database
|
|
51
|
+
case 'db-query':
|
|
52
|
+
await dbQuery(args[1], args.slice(2).join(' '));
|
|
53
|
+
break;
|
|
54
|
+
case 'db-backup':
|
|
55
|
+
await dbBackup(args[1], args[2]);
|
|
56
|
+
break;
|
|
57
|
+
case 'db-restore':
|
|
58
|
+
await dbRestore(args[1], args[2]);
|
|
59
|
+
break;
|
|
60
|
+
case 'db-status':
|
|
61
|
+
await dbStatus(args[1]);
|
|
62
|
+
break;
|
|
63
|
+
// Environment
|
|
64
|
+
case 'env-list':
|
|
65
|
+
case 'env':
|
|
66
|
+
await envList();
|
|
67
|
+
break;
|
|
68
|
+
case 'compose-config':
|
|
69
|
+
case 'config':
|
|
70
|
+
await composeConfig();
|
|
71
|
+
break;
|
|
72
|
+
case 'healthcheck':
|
|
73
|
+
case 'health':
|
|
74
|
+
await healthcheck();
|
|
75
|
+
break;
|
|
76
|
+
// MCP Health
|
|
77
|
+
case 'mcp-health':
|
|
78
|
+
await mcpHealth();
|
|
79
|
+
break;
|
|
80
|
+
case 'help':
|
|
81
|
+
case '--help':
|
|
82
|
+
case '-h':
|
|
83
|
+
showHelp();
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
console.error(`Unknown command: ${command}`);
|
|
87
|
+
console.error('Run "docker-mcp-server help" for usage');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
console.error('Error:', error.message);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Container commands
|
|
97
|
+
async function containerList() {
|
|
98
|
+
const tools = new ContainerTools();
|
|
99
|
+
const result = await tools.handleCall({
|
|
100
|
+
method: 'tools/call',
|
|
101
|
+
params: { name: 'docker_container_list', arguments: {} }
|
|
102
|
+
});
|
|
103
|
+
console.log(result.content[0].text);
|
|
104
|
+
}
|
|
105
|
+
async function containerStart(service) {
|
|
106
|
+
if (!service) {
|
|
107
|
+
console.error('Error: service name required');
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
const tools = new ContainerTools();
|
|
111
|
+
const result = await tools.handleCall({
|
|
112
|
+
params: { name: 'docker_container_start', arguments: { service } }
|
|
113
|
+
});
|
|
114
|
+
console.log(result.content[0].text);
|
|
115
|
+
}
|
|
116
|
+
async function containerStop(service) {
|
|
117
|
+
if (!service) {
|
|
118
|
+
console.error('Error: service name required');
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
const tools = new ContainerTools();
|
|
122
|
+
const result = await tools.handleCall({
|
|
123
|
+
params: { name: 'docker_container_stop', arguments: { service } }
|
|
124
|
+
});
|
|
125
|
+
console.log(result.content[0].text);
|
|
126
|
+
}
|
|
127
|
+
async function containerRestart(service) {
|
|
128
|
+
if (!service) {
|
|
129
|
+
console.error('Error: service name required');
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const tools = new ContainerTools();
|
|
133
|
+
const result = await tools.handleCall({
|
|
134
|
+
params: { name: 'docker_container_restart', arguments: { service } }
|
|
135
|
+
});
|
|
136
|
+
console.log(result.content[0].text);
|
|
137
|
+
}
|
|
138
|
+
async function containerLogs(service, options) {
|
|
139
|
+
if (!service) {
|
|
140
|
+
console.error('Error: service name required');
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
const tools = new ContainerTools();
|
|
144
|
+
const result = await tools.handleCall({
|
|
145
|
+
params: {
|
|
146
|
+
name: 'docker_container_logs',
|
|
147
|
+
arguments: {
|
|
148
|
+
service,
|
|
149
|
+
...options
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
console.log(result.content[0].text);
|
|
154
|
+
}
|
|
155
|
+
async function composeUp() {
|
|
156
|
+
const tools = new ContainerTools();
|
|
157
|
+
const result = await tools.handleCall({
|
|
158
|
+
params: { name: 'docker_compose_up', arguments: { detach: true } }
|
|
159
|
+
});
|
|
160
|
+
console.log(result.content[0].text);
|
|
161
|
+
}
|
|
162
|
+
async function composeDown() {
|
|
163
|
+
const tools = new ContainerTools();
|
|
164
|
+
const result = await tools.handleCall({
|
|
165
|
+
params: { name: 'docker_compose_down', arguments: {} }
|
|
166
|
+
});
|
|
167
|
+
console.log(result.content[0].text);
|
|
168
|
+
}
|
|
169
|
+
// Executor
|
|
170
|
+
async function exec(service, command) {
|
|
171
|
+
if (!service || !command) {
|
|
172
|
+
console.error('Error: service and command required');
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
const tool = new ExecutorTool();
|
|
176
|
+
const result = await tool.handleCall({
|
|
177
|
+
params: { name: 'docker_exec', arguments: { service, command } }
|
|
178
|
+
});
|
|
179
|
+
console.log(result.content[0].text);
|
|
180
|
+
}
|
|
181
|
+
// Database
|
|
182
|
+
async function dbQuery(service, query) {
|
|
183
|
+
if (!service || !query) {
|
|
184
|
+
console.error('Error: service and query required');
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
const tools = new DatabaseTools();
|
|
188
|
+
const result = await tools.handleCall({
|
|
189
|
+
params: { name: 'docker_db_query', arguments: { service, query } }
|
|
190
|
+
});
|
|
191
|
+
console.log(result.content[0].text);
|
|
192
|
+
}
|
|
193
|
+
async function dbBackup(service, output) {
|
|
194
|
+
if (!service) {
|
|
195
|
+
console.error('Error: service name required');
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
const tools = new DatabaseTools();
|
|
199
|
+
const result = await tools.handleCall({
|
|
200
|
+
params: { name: 'docker_db_backup', arguments: { service, output } }
|
|
201
|
+
});
|
|
202
|
+
console.log(result.content[0].text);
|
|
203
|
+
}
|
|
204
|
+
async function dbRestore(service, backupPath) {
|
|
205
|
+
if (!service || !backupPath) {
|
|
206
|
+
console.error('Error: service and backup path required');
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
const tools = new DatabaseTools();
|
|
210
|
+
const result = await tools.handleCall({
|
|
211
|
+
params: { name: 'docker_db_restore', arguments: { service, backupPath } }
|
|
212
|
+
});
|
|
213
|
+
console.log(result.content[0].text);
|
|
214
|
+
}
|
|
215
|
+
async function dbStatus(service) {
|
|
216
|
+
if (!service) {
|
|
217
|
+
console.error('Error: service name required');
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
const tools = new DatabaseTools();
|
|
221
|
+
const result = await tools.handleCall({
|
|
222
|
+
params: { name: 'docker_db_status', arguments: { service } }
|
|
223
|
+
});
|
|
224
|
+
console.log(result.content[0].text);
|
|
225
|
+
}
|
|
226
|
+
// Environment
|
|
227
|
+
async function envList() {
|
|
228
|
+
const tools = new EnvTools();
|
|
229
|
+
const result = await tools.handleCall({
|
|
230
|
+
params: { name: 'docker_env_list', arguments: { maskSecrets: true } }
|
|
231
|
+
});
|
|
232
|
+
console.log(result.content[0].text);
|
|
233
|
+
}
|
|
234
|
+
async function composeConfig() {
|
|
235
|
+
const tools = new EnvTools();
|
|
236
|
+
const result = await tools.handleCall({
|
|
237
|
+
params: { name: 'docker_compose_config', arguments: {} }
|
|
238
|
+
});
|
|
239
|
+
console.log(result.content[0].text);
|
|
240
|
+
}
|
|
241
|
+
async function healthcheck() {
|
|
242
|
+
const tools = new EnvTools();
|
|
243
|
+
const result = await tools.handleCall({
|
|
244
|
+
params: { name: 'docker_healthcheck', arguments: {} }
|
|
245
|
+
});
|
|
246
|
+
console.log(result.content[0].text);
|
|
247
|
+
}
|
|
248
|
+
// MCP Health
|
|
249
|
+
async function mcpHealth() {
|
|
250
|
+
const tool = new MCPHealthTool();
|
|
251
|
+
const result = await tool.handleCall({
|
|
252
|
+
params: { name: 'docker_mcp_health', arguments: {} }
|
|
253
|
+
});
|
|
254
|
+
console.log(result.content[0].text);
|
|
255
|
+
}
|
|
256
|
+
// Helpers
|
|
257
|
+
function parseLogsOptions(args) {
|
|
258
|
+
const options = {};
|
|
259
|
+
for (let i = 0; i < args.length; i++) {
|
|
260
|
+
if (args[i] === '--lines' || args[i] === '-n') {
|
|
261
|
+
options.lines = parseInt(args[++i]);
|
|
262
|
+
}
|
|
263
|
+
else if (args[i] === '--follow' || args[i] === '-f') {
|
|
264
|
+
options.follow = true;
|
|
265
|
+
}
|
|
266
|
+
else if (args[i] === '--timestamps' || args[i] === '-t') {
|
|
267
|
+
options.timestamps = true;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return options;
|
|
271
|
+
}
|
|
272
|
+
function showHelp() {
|
|
273
|
+
console.log(`
|
|
274
|
+
Docker MCP Server CLI v1.0.0
|
|
275
|
+
|
|
276
|
+
Usage: docker-mcp-server <command> [options]
|
|
277
|
+
|
|
278
|
+
CONTAINER COMMANDS:
|
|
279
|
+
ps, container-list List all containers
|
|
280
|
+
container-start <service> Start a container
|
|
281
|
+
container-stop <service> Stop a container
|
|
282
|
+
container-restart <service> Restart a container
|
|
283
|
+
logs <service> [options] View container logs
|
|
284
|
+
--lines, -n <number> Number of lines to show
|
|
285
|
+
--follow, -f Follow log output
|
|
286
|
+
--timestamps, -t Show timestamps
|
|
287
|
+
|
|
288
|
+
COMPOSE COMMANDS:
|
|
289
|
+
up, compose-up Start all services
|
|
290
|
+
down, compose-down Stop all services
|
|
291
|
+
config, compose-config Show compose configuration
|
|
292
|
+
|
|
293
|
+
EXECUTOR:
|
|
294
|
+
exec <service> <command> Execute command in container
|
|
295
|
+
|
|
296
|
+
DATABASE COMMANDS:
|
|
297
|
+
db-query <service> <query> Execute database query
|
|
298
|
+
db-backup <service> [output] Backup database
|
|
299
|
+
db-restore <service> <path> Restore database
|
|
300
|
+
db-status <service> Show database status
|
|
301
|
+
|
|
302
|
+
ENVIRONMENT:
|
|
303
|
+
env, env-list List environment variables
|
|
304
|
+
health, healthcheck Check services health
|
|
305
|
+
|
|
306
|
+
OTHER:
|
|
307
|
+
mcp-health Check MCP server health
|
|
308
|
+
help Show this help
|
|
309
|
+
|
|
310
|
+
Examples:
|
|
311
|
+
docker-mcp-server ps
|
|
312
|
+
docker-mcp-server logs web --lines 50 --follow
|
|
313
|
+
docker-mcp-server exec python "python --version"
|
|
314
|
+
docker-mcp-server db-query postgres "SELECT * FROM users LIMIT 5"
|
|
315
|
+
docker-mcp-server up
|
|
316
|
+
`);
|
|
317
|
+
}
|
|
318
|
+
main();
|
|
319
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML Parser для docker-compose.yml
|
|
3
|
+
*/
|
|
4
|
+
import type { ProjectConfig } from './types.js';
|
|
5
|
+
export declare class ComposeParser {
|
|
6
|
+
/**
|
|
7
|
+
* Парсит docker-compose.yml
|
|
8
|
+
*/
|
|
9
|
+
parse(composeFile: string): ProjectConfig;
|
|
10
|
+
/**
|
|
11
|
+
* Парсит raw YAML (для merge нескольких файлов)
|
|
12
|
+
*/
|
|
13
|
+
parseRaw(composeFile: string): any;
|
|
14
|
+
/**
|
|
15
|
+
* Извлекает имя проекта
|
|
16
|
+
*/
|
|
17
|
+
private extractProjectName;
|
|
18
|
+
/**
|
|
19
|
+
* Парсит секцию services
|
|
20
|
+
*/
|
|
21
|
+
private parseServices;
|
|
22
|
+
/**
|
|
23
|
+
* Парсит ports (может быть array строк или объектов)
|
|
24
|
+
*/
|
|
25
|
+
private parsePorts;
|
|
26
|
+
/**
|
|
27
|
+
* Парсит environment (может быть array или object)
|
|
28
|
+
*/
|
|
29
|
+
private parseEnvironment;
|
|
30
|
+
/**
|
|
31
|
+
* Определяет тип сервиса по image
|
|
32
|
+
*/
|
|
33
|
+
private detectServiceType;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=compose-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-parser.d.ts","sourceRoot":"","sources":["../../src/discovery/compose-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAE/D,qBAAa,aAAa;IACxB;;OAEG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa;IAyBzC;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG;IAKlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAW1B"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML Parser для docker-compose.yml
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
import { dirname, basename } from 'path';
|
|
6
|
+
import { parse as parseYaml } from 'yaml';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
export class ComposeParser {
|
|
9
|
+
/**
|
|
10
|
+
* Парсит docker-compose.yml
|
|
11
|
+
*/
|
|
12
|
+
parse(composeFile) {
|
|
13
|
+
logger.debug(`Parsing compose file: ${composeFile}`);
|
|
14
|
+
try {
|
|
15
|
+
const parsed = this.parseRaw(composeFile);
|
|
16
|
+
if (!parsed || !parsed.services) {
|
|
17
|
+
throw new Error('Invalid docker-compose.yml: missing services');
|
|
18
|
+
}
|
|
19
|
+
const projectDir = dirname(composeFile);
|
|
20
|
+
const projectName = this.extractProjectName(composeFile, parsed);
|
|
21
|
+
return {
|
|
22
|
+
name: projectName,
|
|
23
|
+
composeFile,
|
|
24
|
+
projectDir,
|
|
25
|
+
services: this.parseServices(parsed.services),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.error('Failed to parse compose file:', error);
|
|
30
|
+
throw new Error(`Failed to parse ${composeFile}: ${error.message}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Парсит raw YAML (для merge нескольких файлов)
|
|
35
|
+
*/
|
|
36
|
+
parseRaw(composeFile) {
|
|
37
|
+
const content = readFileSync(composeFile, 'utf-8');
|
|
38
|
+
return parseYaml(content);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Извлекает имя проекта
|
|
42
|
+
*/
|
|
43
|
+
extractProjectName(composeFile, parsed) {
|
|
44
|
+
// 1. Из parsed.name (Compose v2)
|
|
45
|
+
if (parsed.name)
|
|
46
|
+
return parsed.name;
|
|
47
|
+
// 2. Из имени директории
|
|
48
|
+
const dir = dirname(composeFile);
|
|
49
|
+
return basename(dir);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Парсит секцию services
|
|
53
|
+
*/
|
|
54
|
+
parseServices(services) {
|
|
55
|
+
const result = {};
|
|
56
|
+
for (const [name, config] of Object.entries(services)) {
|
|
57
|
+
result[name] = {
|
|
58
|
+
name,
|
|
59
|
+
image: config.image,
|
|
60
|
+
build: config.build,
|
|
61
|
+
ports: this.parsePorts(config.ports),
|
|
62
|
+
environment: this.parseEnvironment(config.environment),
|
|
63
|
+
type: this.detectServiceType(config),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Парсит ports (может быть array строк или объектов)
|
|
70
|
+
*/
|
|
71
|
+
parsePorts(ports) {
|
|
72
|
+
if (!ports)
|
|
73
|
+
return undefined;
|
|
74
|
+
if (Array.isArray(ports)) {
|
|
75
|
+
return ports.map((port) => {
|
|
76
|
+
if (typeof port === 'string') {
|
|
77
|
+
return port;
|
|
78
|
+
}
|
|
79
|
+
// Object format: "8000:8000"
|
|
80
|
+
if (port.published && port.target) {
|
|
81
|
+
return `${port.published}:${port.target}`;
|
|
82
|
+
}
|
|
83
|
+
return String(port);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Парсит environment (может быть array или object)
|
|
90
|
+
*/
|
|
91
|
+
parseEnvironment(env) {
|
|
92
|
+
if (!env)
|
|
93
|
+
return undefined;
|
|
94
|
+
if (Array.isArray(env)) {
|
|
95
|
+
// ["KEY=value", "KEY2=value2"]
|
|
96
|
+
const result = {};
|
|
97
|
+
for (const item of env) {
|
|
98
|
+
const [key, ...valueParts] = item.split('=');
|
|
99
|
+
if (key) {
|
|
100
|
+
result[key] = valueParts.join('=');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
// {KEY: "value", KEY2: "value2"}
|
|
106
|
+
return env;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Определяет тип сервиса по image
|
|
110
|
+
*/
|
|
111
|
+
detectServiceType(config) {
|
|
112
|
+
const image = (config.image || '').toLowerCase();
|
|
113
|
+
if (image.includes('postgres'))
|
|
114
|
+
return 'postgresql';
|
|
115
|
+
if (image.includes('redis'))
|
|
116
|
+
return 'redis';
|
|
117
|
+
if (image.includes('mysql'))
|
|
118
|
+
return 'mysql';
|
|
119
|
+
if (image.includes('mongo'))
|
|
120
|
+
return 'mongodb';
|
|
121
|
+
if (image.includes('sqlite'))
|
|
122
|
+
return 'sqlite';
|
|
123
|
+
return 'generic';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=compose-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose-parser.js","sourceRoot":"","sources":["../../src/discovery/compose-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Merger
|
|
3
|
+
* Deep merge для docker-compose конфигов (как docker-compose делает)
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConfigMerger {
|
|
6
|
+
/**
|
|
7
|
+
* Deep merge нескольких compose конфигов
|
|
8
|
+
* Правила (как docker-compose):
|
|
9
|
+
* - Объекты мержатся рекурсивно
|
|
10
|
+
* - Массивы конкатенируются (для ports, volumes, depends_on)
|
|
11
|
+
* - Примитивы перезаписываются (последний побеждает)
|
|
12
|
+
*/
|
|
13
|
+
merge(configs: any[]): any;
|
|
14
|
+
/**
|
|
15
|
+
* Рекурсивный deep merge
|
|
16
|
+
*/
|
|
17
|
+
private deepMerge;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=config-merger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-merger.d.ts","sourceRoot":"","sources":["../../src/discovery/config-merger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,qBAAa,YAAY;IACvB;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG;IAgB1B;;OAEG;IACH,OAAO,CAAC,SAAS;CAqClB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Merger
|
|
3
|
+
* Deep merge для docker-compose конфигов (как docker-compose делает)
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
export class ConfigMerger {
|
|
7
|
+
/**
|
|
8
|
+
* Deep merge нескольких compose конфигов
|
|
9
|
+
* Правила (как docker-compose):
|
|
10
|
+
* - Объекты мержатся рекурсивно
|
|
11
|
+
* - Массивы конкатенируются (для ports, volumes, depends_on)
|
|
12
|
+
* - Примитивы перезаписываются (последний побеждает)
|
|
13
|
+
*/
|
|
14
|
+
merge(configs) {
|
|
15
|
+
if (configs.length === 0) {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
if (configs.length === 1) {
|
|
19
|
+
return configs[0];
|
|
20
|
+
}
|
|
21
|
+
logger.debug(`Merging ${configs.length} compose configs`);
|
|
22
|
+
return configs.reduce((acc, config) => {
|
|
23
|
+
return this.deepMerge(acc, config);
|
|
24
|
+
}, {});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Рекурсивный deep merge
|
|
28
|
+
*/
|
|
29
|
+
deepMerge(target, source) {
|
|
30
|
+
// Если source undefined/null → возвращаем target
|
|
31
|
+
if (source === null || source === undefined) {
|
|
32
|
+
return target;
|
|
33
|
+
}
|
|
34
|
+
// Если target undefined/null → возвращаем source
|
|
35
|
+
if (target === null || target === undefined) {
|
|
36
|
+
return source;
|
|
37
|
+
}
|
|
38
|
+
// Массивы → конкатенация (для ports, volumes, depends_on)
|
|
39
|
+
if (Array.isArray(target) && Array.isArray(source)) {
|
|
40
|
+
return [...target, ...source];
|
|
41
|
+
}
|
|
42
|
+
// Если один массив, другой нет → source побеждает
|
|
43
|
+
if (Array.isArray(source) && !Array.isArray(target)) {
|
|
44
|
+
return source;
|
|
45
|
+
}
|
|
46
|
+
// Объекты → рекурсивный merge
|
|
47
|
+
if (typeof target === 'object' && typeof source === 'object' && !Array.isArray(target) && !Array.isArray(source)) {
|
|
48
|
+
const result = { ...target };
|
|
49
|
+
for (const key in source) {
|
|
50
|
+
if (source.hasOwnProperty(key)) {
|
|
51
|
+
result[key] = this.deepMerge(target[key], source[key]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
// Примитивы → перезапись (последний побеждает)
|
|
57
|
+
return source;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config-merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-merger.js","sourceRoot":"","sources":["../../src/discovery/config-merger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,YAAY;IACvB;;;;;;OAMG;IACH,KAAK,CAAC,OAAc;QAClB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAE1D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACpC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,MAAW,EAAE,MAAW;QACxC,iDAAiD;QACjD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,iDAAiD;QACjD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,0DAA0D;QAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,kDAAkD;QAClD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACjH,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;YAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,+CAA+C;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Discovery
|
|
3
|
+
* Автоматическое обнаружение и парсинг docker-compose.yml
|
|
4
|
+
*/
|
|
5
|
+
import type { ProjectConfig, DiscoveryOptions } from './types.js';
|
|
6
|
+
export declare class ProjectDiscovery {
|
|
7
|
+
private readonly COMPOSE_FILENAMES;
|
|
8
|
+
private parser;
|
|
9
|
+
private merger;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Находит и парсит docker-compose проект
|
|
13
|
+
*/
|
|
14
|
+
findProject(options?: DiscoveryOptions): Promise<ProjectConfig>;
|
|
15
|
+
/**
|
|
16
|
+
* Генерирует ключ кеша для опций discovery
|
|
17
|
+
*/
|
|
18
|
+
private getCacheKey;
|
|
19
|
+
/**
|
|
20
|
+
* Рекурсивный поиск вверх по дереву
|
|
21
|
+
*/
|
|
22
|
+
private findComposeFile;
|
|
23
|
+
/**
|
|
24
|
+
* Auto-detect compose файлов (base + env + override)
|
|
25
|
+
*/
|
|
26
|
+
private autoDetectFiles;
|
|
27
|
+
/**
|
|
28
|
+
* Загружает и парсит compose file(s)
|
|
29
|
+
* Поддерживает как один файл, так и несколько (для merge)
|
|
30
|
+
*/
|
|
31
|
+
private loadProject;
|
|
32
|
+
/**
|
|
33
|
+
* Извлекает имя проекта из конфига
|
|
34
|
+
*/
|
|
35
|
+
private extractProjectName;
|
|
36
|
+
/**
|
|
37
|
+
* Парсит секцию services (из merged config)
|
|
38
|
+
*/
|
|
39
|
+
private parseServices;
|
|
40
|
+
/**
|
|
41
|
+
* Парсит ports
|
|
42
|
+
*/
|
|
43
|
+
private parsePorts;
|
|
44
|
+
/**
|
|
45
|
+
* Парсит environment
|
|
46
|
+
*/
|
|
47
|
+
private parseEnvironment;
|
|
48
|
+
/**
|
|
49
|
+
* Определяет тип сервиса
|
|
50
|
+
*/
|
|
51
|
+
private detectServiceType;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=project-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/discovery/project-discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAiB,MAAM,YAAY,CAAC;AAEjF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAKhC;IAEF,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAe;;IAO7B;;OAEG;IACG,WAAW,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;IAkDzE;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqCvB;;;OAGG;YACW,WAAW;IAoCzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAW1B"}
|