@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/adapters/adapter-registry.d.ts +29 -0
  4. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  5. package/dist/adapters/adapter-registry.js +47 -0
  6. package/dist/adapters/adapter-registry.js.map +1 -0
  7. package/dist/adapters/database-adapter.d.ts +33 -0
  8. package/dist/adapters/database-adapter.d.ts.map +1 -0
  9. package/dist/adapters/database-adapter.js +6 -0
  10. package/dist/adapters/database-adapter.js.map +1 -0
  11. package/dist/adapters/postgresql.d.ts +42 -0
  12. package/dist/adapters/postgresql.d.ts.map +1 -0
  13. package/dist/adapters/postgresql.js +202 -0
  14. package/dist/adapters/postgresql.js.map +1 -0
  15. package/dist/adapters/redis.d.ts +46 -0
  16. package/dist/adapters/redis.d.ts.map +1 -0
  17. package/dist/adapters/redis.js +202 -0
  18. package/dist/adapters/redis.js.map +1 -0
  19. package/dist/adapters/sqlite.d.ts +34 -0
  20. package/dist/adapters/sqlite.d.ts.map +1 -0
  21. package/dist/adapters/sqlite.js +126 -0
  22. package/dist/adapters/sqlite.js.map +1 -0
  23. package/dist/adapters/types.d.ts +53 -0
  24. package/dist/adapters/types.d.ts.map +1 -0
  25. package/dist/adapters/types.js +5 -0
  26. package/dist/adapters/types.js.map +1 -0
  27. package/dist/cli.d.ts +7 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +319 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/discovery/compose-parser.d.ts +35 -0
  32. package/dist/discovery/compose-parser.d.ts.map +1 -0
  33. package/dist/discovery/compose-parser.js +126 -0
  34. package/dist/discovery/compose-parser.js.map +1 -0
  35. package/dist/discovery/config-merger.d.ts +19 -0
  36. package/dist/discovery/config-merger.d.ts.map +1 -0
  37. package/dist/discovery/config-merger.js +60 -0
  38. package/dist/discovery/config-merger.js.map +1 -0
  39. package/dist/discovery/project-discovery.d.ts +53 -0
  40. package/dist/discovery/project-discovery.d.ts.map +1 -0
  41. package/dist/discovery/project-discovery.js +252 -0
  42. package/dist/discovery/project-discovery.js.map +1 -0
  43. package/dist/discovery/types.d.ts +47 -0
  44. package/dist/discovery/types.d.ts.map +1 -0
  45. package/dist/discovery/types.js +6 -0
  46. package/dist/discovery/types.js.map +1 -0
  47. package/dist/index.d.ts +6 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +109 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/managers/compose-manager.d.ts +30 -0
  52. package/dist/managers/compose-manager.d.ts.map +1 -0
  53. package/dist/managers/compose-manager.js +70 -0
  54. package/dist/managers/compose-manager.js.map +1 -0
  55. package/dist/managers/container-manager.d.ts +81 -0
  56. package/dist/managers/container-manager.d.ts.map +1 -0
  57. package/dist/managers/container-manager.js +278 -0
  58. package/dist/managers/container-manager.js.map +1 -0
  59. package/dist/managers/env-manager.d.ts +37 -0
  60. package/dist/managers/env-manager.d.ts.map +1 -0
  61. package/dist/managers/env-manager.js +124 -0
  62. package/dist/managers/env-manager.js.map +1 -0
  63. package/dist/security/sql-validator.d.ts +23 -0
  64. package/dist/security/sql-validator.d.ts.map +1 -0
  65. package/dist/security/sql-validator.js +44 -0
  66. package/dist/security/sql-validator.js.map +1 -0
  67. package/dist/tools/container-tools.d.ts +31 -0
  68. package/dist/tools/container-tools.d.ts.map +1 -0
  69. package/dist/tools/container-tools.js +366 -0
  70. package/dist/tools/container-tools.js.map +1 -0
  71. package/dist/tools/database-tools.d.ts +22 -0
  72. package/dist/tools/database-tools.d.ts.map +1 -0
  73. package/dist/tools/database-tools.js +264 -0
  74. package/dist/tools/database-tools.js.map +1 -0
  75. package/dist/tools/env-tools.d.ts +52 -0
  76. package/dist/tools/env-tools.d.ts.map +1 -0
  77. package/dist/tools/env-tools.js +318 -0
  78. package/dist/tools/env-tools.js.map +1 -0
  79. package/dist/tools/executor-tool.d.ts +18 -0
  80. package/dist/tools/executor-tool.d.ts.map +1 -0
  81. package/dist/tools/executor-tool.js +95 -0
  82. package/dist/tools/executor-tool.js.map +1 -0
  83. package/dist/tools/mcp-health-tool.d.ts +65 -0
  84. package/dist/tools/mcp-health-tool.d.ts.map +1 -0
  85. package/dist/tools/mcp-health-tool.js +126 -0
  86. package/dist/tools/mcp-health-tool.js.map +1 -0
  87. package/dist/utils/cache.d.ts +43 -0
  88. package/dist/utils/cache.d.ts.map +1 -0
  89. package/dist/utils/cache.js +77 -0
  90. package/dist/utils/cache.js.map +1 -0
  91. package/dist/utils/compose-exec.d.ts +13 -0
  92. package/dist/utils/compose-exec.d.ts.map +1 -0
  93. package/dist/utils/compose-exec.js +33 -0
  94. package/dist/utils/compose-exec.js.map +1 -0
  95. package/dist/utils/docker-client.d.ts +33 -0
  96. package/dist/utils/docker-client.d.ts.map +1 -0
  97. package/dist/utils/docker-client.js +59 -0
  98. package/dist/utils/docker-client.js.map +1 -0
  99. package/dist/utils/logger.d.ts +18 -0
  100. package/dist/utils/logger.d.ts.map +1 -0
  101. package/dist/utils/logger.js +38 -0
  102. package/dist/utils/logger.js.map +1 -0
  103. 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
@@ -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"}