@hypnosis/docker-mcp-server 1.0.4 → 1.3.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/README.md +99 -28
- package/dist/adapters/database-adapter.d.ts +9 -5
- package/dist/adapters/database-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql.d.ts +14 -5
- package/dist/adapters/postgresql.d.ts.map +1 -1
- package/dist/adapters/postgresql.js +36 -23
- package/dist/adapters/postgresql.js.map +1 -1
- package/dist/adapters/redis.d.ts +10 -1
- package/dist/adapters/redis.d.ts.map +1 -1
- package/dist/adapters/redis.js +28 -13
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +11 -1
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +11 -7
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/types.d.ts +7 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/discovery/compose-parser.d.ts +4 -0
- package/dist/discovery/compose-parser.d.ts.map +1 -1
- package/dist/discovery/compose-parser.js +27 -5
- package/dist/discovery/compose-parser.js.map +1 -1
- package/dist/discovery/project-discovery.d.ts.map +1 -1
- package/dist/discovery/project-discovery.js +28 -2
- package/dist/discovery/project-discovery.js.map +1 -1
- package/dist/discovery/remote-discovery.d.ts +99 -0
- package/dist/discovery/remote-discovery.d.ts.map +1 -0
- package/dist/discovery/remote-discovery.js +410 -0
- package/dist/discovery/remote-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +4 -0
- package/dist/discovery/types.d.ts.map +1 -1
- package/dist/index.js +76 -24
- package/dist/index.js.map +1 -1
- package/dist/managers/compose-manager.d.ts +3 -1
- package/dist/managers/compose-manager.d.ts.map +1 -1
- package/dist/managers/compose-manager.js +10 -1
- package/dist/managers/compose-manager.js.map +1 -1
- package/dist/managers/container-manager.d.ts +11 -1
- package/dist/managers/container-manager.d.ts.map +1 -1
- package/dist/managers/container-manager.js +75 -76
- package/dist/managers/container-manager.js.map +1 -1
- package/dist/tools/container-tools.d.ts +1 -3
- package/dist/tools/container-tools.d.ts.map +1 -1
- package/dist/tools/container-tools.js +142 -28
- package/dist/tools/container-tools.js.map +1 -1
- package/dist/tools/database-tools.d.ts +15 -1
- package/dist/tools/database-tools.d.ts.map +1 -1
- package/dist/tools/database-tools.js +152 -16
- package/dist/tools/database-tools.js.map +1 -1
- package/dist/tools/discovery-tools.d.ts +22 -0
- package/dist/tools/discovery-tools.d.ts.map +1 -0
- package/dist/tools/discovery-tools.js +137 -0
- package/dist/tools/discovery-tools.js.map +1 -0
- package/dist/tools/env-tools.d.ts +1 -2
- package/dist/tools/env-tools.d.ts.map +1 -1
- package/dist/tools/env-tools.js +123 -22
- package/dist/tools/env-tools.js.map +1 -1
- package/dist/tools/executor-tool.d.ts +0 -2
- package/dist/tools/executor-tool.d.ts.map +1 -1
- package/dist/tools/executor-tool.js +27 -9
- package/dist/tools/executor-tool.js.map +1 -1
- package/dist/tools/mcp-health-tool.d.ts +9 -0
- package/dist/tools/mcp-health-tool.d.ts.map +1 -1
- package/dist/tools/mcp-health-tool.js +34 -7
- package/dist/tools/mcp-health-tool.js.map +1 -1
- package/dist/tools/profile-tool.d.ts +39 -0
- package/dist/tools/profile-tool.d.ts.map +1 -0
- package/dist/tools/profile-tool.js +70 -0
- package/dist/tools/profile-tool.js.map +1 -0
- package/dist/utils/compose-exec.d.ts +28 -3
- package/dist/utils/compose-exec.d.ts.map +1 -1
- package/dist/utils/compose-exec.js +100 -26
- package/dist/utils/compose-exec.js.map +1 -1
- package/dist/utils/docker-client.d.ts +81 -8
- package/dist/utils/docker-client.d.ts.map +1 -1
- package/dist/utils/docker-client.js +520 -17
- package/dist/utils/docker-client.js.map +1 -1
- package/dist/utils/profile-resolver.d.ts +58 -0
- package/dist/utils/profile-resolver.d.ts.map +1 -0
- package/dist/utils/profile-resolver.js +218 -0
- package/dist/utils/profile-resolver.js.map +1 -0
- package/dist/utils/profiles-file.d.ts +57 -0
- package/dist/utils/profiles-file.d.ts.map +1 -0
- package/dist/utils/profiles-file.js +167 -0
- package/dist/utils/profiles-file.js.map +1 -0
- package/dist/utils/remote-compose.d.ts +32 -0
- package/dist/utils/remote-compose.d.ts.map +1 -0
- package/dist/utils/remote-compose.js +69 -0
- package/dist/utils/remote-compose.js.map +1 -0
- package/dist/utils/retry.d.ts +49 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +120 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/schema-helpers.d.ts +96 -0
- package/dist/utils/schema-helpers.d.ts.map +1 -0
- package/dist/utils/schema-helpers.js +61 -0
- package/dist/utils/schema-helpers.js.map +1 -0
- package/dist/utils/ssh-config.d.ts +104 -0
- package/dist/utils/ssh-config.d.ts.map +1 -0
- package/dist/utils/ssh-config.js +346 -0
- package/dist/utils/ssh-config.js.map +1 -0
- package/dist/utils/ssh-exec.d.ts +59 -0
- package/dist/utils/ssh-exec.d.ts.map +1 -0
- package/dist/utils/ssh-exec.js +159 -0
- package/dist/utils/ssh-exec.js.map +1 -0
- package/package.json +21 -3
package/README.md
CHANGED
|
@@ -7,10 +7,12 @@ Universal Docker MCP server for AI assistants (Cursor, Claude Desktop). Manage D
|
|
|
7
7
|
|
|
8
8
|
## ✨ Features
|
|
9
9
|
|
|
10
|
-
- ✅ **
|
|
10
|
+
- ✅ **20 MCP Commands** — Container management, database operations, environment handling, resource monitoring, project discovery
|
|
11
11
|
- ✅ **Database Support** — PostgreSQL, Redis, SQLite with extensible adapter pattern
|
|
12
12
|
- ✅ **Resource Monitoring** — Container stats (CPU, Memory, Network, Block I/O), images, volumes, networks
|
|
13
|
-
- ✅ **Auto-Discovery** — Automatically finds and parses `docker-compose.yml` files
|
|
13
|
+
- ✅ **Auto-Discovery** — Automatically finds and parses `docker-compose.yml` files (local and remote)
|
|
14
|
+
- ✅ **Remote Docker** — SSH support for managing remote Docker hosts
|
|
15
|
+
- ✅ **Remote Project Discovery** — Automatically find all Docker projects on remote servers
|
|
14
16
|
- ✅ **Security** — Automatic secrets masking in environment variables
|
|
15
17
|
- ✅ **Follow Logs** — Real-time log streaming with `follow` mode
|
|
16
18
|
- ✅ **Type-Safe** — Written in TypeScript with full type definitions
|
|
@@ -42,6 +44,21 @@ npm install @hypnosis/docker-mcp-server
|
|
|
42
44
|
|
|
43
45
|
Add to `~/.cursor/mcp.json` (or `~/.config/cursor/mcp.json`):
|
|
44
46
|
|
|
47
|
+
**Local Docker (simplest - no configuration needed!):**
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"mcpServers": {
|
|
51
|
+
"docker": {
|
|
52
|
+
"command": "npx",
|
|
53
|
+
"args": ["-y", "@hypnosis/docker-mcp-server"]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
That's it! The server will automatically detect and use your local Docker installation.
|
|
60
|
+
|
|
61
|
+
**Optional: Enable auto-discovery and secret masking:**
|
|
45
62
|
```json
|
|
46
63
|
{
|
|
47
64
|
"mcpServers": {
|
|
@@ -57,6 +74,41 @@ Add to `~/.cursor/mcp.json` (or `~/.config/cursor/mcp.json`):
|
|
|
57
74
|
}
|
|
58
75
|
```
|
|
59
76
|
|
|
77
|
+
**Remote Docker (with profiles file):**
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"mcpServers": {
|
|
81
|
+
"docker": {
|
|
82
|
+
"command": "npx",
|
|
83
|
+
"args": ["-y", "@hypnosis/docker-mcp-server"],
|
|
84
|
+
"env": {
|
|
85
|
+
"DOCKER_MCP_PROFILES_FILE": "~/.docker-mcp/profiles.json"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Create `~/.docker-mcp/profiles.json`:
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"default": "production",
|
|
96
|
+
"profiles": {
|
|
97
|
+
"production": {
|
|
98
|
+
"host": "prod.example.com",
|
|
99
|
+
"username": "deployer",
|
|
100
|
+
"port": 22,
|
|
101
|
+
"privateKeyPath": "~/.ssh/id_rsa",
|
|
102
|
+
"projectsPath": "/var/www"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Note:** `projectsPath` specifies where to search for Docker projects on remote server (default: `/var/www`).
|
|
109
|
+
|
|
110
|
+
**Note:** If the profiles file doesn't exist or is invalid, the server will gracefully fall back to local Docker — no errors, no configuration needed!
|
|
111
|
+
|
|
60
112
|
### Configuration for Claude Desktop
|
|
61
113
|
|
|
62
114
|
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
@@ -83,53 +135,57 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
|
|
|
83
135
|
|
|
84
136
|
## 📚 Available Commands
|
|
85
137
|
|
|
86
|
-
### Container Management (
|
|
138
|
+
### Container Management (9 commands)
|
|
87
139
|
|
|
88
140
|
| Command | Description | Example |
|
|
89
141
|
|---------|-------------|---------|
|
|
90
|
-
| `docker_container_list` | List all containers
|
|
91
|
-
| `docker_container_start` | Start a container | `docker_container_start("web")` |
|
|
92
|
-
| `docker_container_stop` | Stop a container | `docker_container_stop("web")` |
|
|
93
|
-
| `docker_container_restart` | Restart a container | `docker_container_restart("web")` |
|
|
94
|
-
| `docker_container_logs` | View container logs | `docker_container_logs("web",
|
|
142
|
+
| `docker_container_list` | List all containers (grouped by project) | `docker_container_list()` |
|
|
143
|
+
| `docker_container_start` | Start a container | `docker_container_start({service: "web"})` |
|
|
144
|
+
| `docker_container_stop` | Stop a container | `docker_container_stop({service: "web"})` |
|
|
145
|
+
| `docker_container_restart` | Restart a container | `docker_container_restart({service: "web"})` |
|
|
146
|
+
| `docker_container_logs` | View container logs | `docker_container_logs({service: "web", follow: true, lines: 100})` |
|
|
147
|
+
| `docker_container_stats` | Get container resource usage | `docker_container_stats({service: "web"})` |
|
|
95
148
|
| `docker_compose_up` | Start entire stack | `docker_compose_up({build: true})` |
|
|
96
149
|
| `docker_compose_down` | Stop entire stack | `docker_compose_down({volumes: false})` |
|
|
150
|
+
| `docker_resource_list` | List Docker images, volumes, or networks | `docker_resource_list({type: "images"})` |
|
|
97
151
|
|
|
98
152
|
### Database Operations (4 commands)
|
|
99
153
|
|
|
100
154
|
| Command | Description | Example |
|
|
101
155
|
|---------|-------------|---------|
|
|
102
|
-
| `docker_db_query` | Execute SQL query | `docker_db_query("postgres", "SELECT * FROM users LIMIT 5;")` |
|
|
103
|
-
| `docker_db_backup` | Create database backup | `docker_db_backup("postgres",
|
|
104
|
-
| `docker_db_restore` | Restore from backup | `docker_db_restore("postgres", "./backup.sql")` |
|
|
105
|
-
| `docker_db_status` | Show database status | `docker_db_status("postgres")` |
|
|
156
|
+
| `docker_db_query` | Execute SQL query or database command | `docker_db_query({service: "postgres", query: "SELECT * FROM users LIMIT 5;"})` |
|
|
157
|
+
| `docker_db_backup` | Create database backup | `docker_db_backup({service: "postgres", compress: true})` |
|
|
158
|
+
| `docker_db_restore` | Restore from backup | `docker_db_restore({service: "postgres", backupPath: "./backup.sql"})` |
|
|
159
|
+
| `docker_db_status` | Show database status | `docker_db_status({service: "postgres"})` |
|
|
106
160
|
|
|
107
161
|
### Environment & Config (3 commands)
|
|
108
162
|
|
|
109
163
|
| Command | Description | Example |
|
|
110
164
|
|---------|-------------|---------|
|
|
111
|
-
| `docker_env_list` | List environment variables | `docker_env_list()` |
|
|
165
|
+
| `docker_env_list` | List environment variables (with secret masking) | `docker_env_list({service: "web", maskSecrets: true})` |
|
|
112
166
|
| `docker_compose_config` | Show parsed compose config | `docker_compose_config()` |
|
|
113
167
|
| `docker_healthcheck` | Check health of all services | `docker_healthcheck()` |
|
|
114
168
|
|
|
115
|
-
###
|
|
169
|
+
### Universal Executor (1 command)
|
|
116
170
|
|
|
117
171
|
| Command | Description | Example |
|
|
118
172
|
|---------|-------------|---------|
|
|
119
|
-
| `
|
|
120
|
-
| `docker_resource_list` | List Docker resources | `docker_resource_list("images")` |
|
|
173
|
+
| `docker_exec` | Execute any command in container | `docker_exec({service: "web", command: "npm test"})` |
|
|
121
174
|
|
|
122
|
-
###
|
|
175
|
+
### Project Discovery (1 command)
|
|
123
176
|
|
|
124
177
|
| Command | Description | Example |
|
|
125
178
|
|---------|-------------|---------|
|
|
126
|
-
| `
|
|
179
|
+
| `docker_projects` | List all Docker projects with status (fast, ~2s) | `docker_projects()` |
|
|
127
180
|
|
|
128
|
-
|
|
181
|
+
**Note:** For detailed container info, use `docker_container_list({project: "project-name"})`.
|
|
182
|
+
|
|
183
|
+
### Utility Tools (2 commands)
|
|
129
184
|
|
|
130
185
|
| Command | Description | Example |
|
|
131
186
|
|---------|-------------|---------|
|
|
132
|
-
| `docker_mcp_health` | Server diagnostics | `docker_mcp_health()` |
|
|
187
|
+
| `docker_mcp_health` | Server diagnostics and health check | `docker_mcp_health()` |
|
|
188
|
+
| `docker_profile_info` | Show current profile and available profiles | `docker_profile_info()` |
|
|
133
189
|
|
|
134
190
|
## 💡 Usage Examples
|
|
135
191
|
|
|
@@ -143,32 +199,32 @@ docker_compose_up({build: true, detach: true})
|
|
|
143
199
|
docker_healthcheck()
|
|
144
200
|
|
|
145
201
|
// View logs in real-time
|
|
146
|
-
docker_container_logs("web",
|
|
202
|
+
docker_container_logs({service: "web", follow: true, lines: 50})
|
|
147
203
|
|
|
148
204
|
// Check Redis cache
|
|
149
|
-
docker_db_query("redis", "KEYS *")
|
|
205
|
+
docker_db_query({service: "redis", query: "KEYS *"})
|
|
150
206
|
|
|
151
207
|
// Run tests
|
|
152
|
-
docker_exec("web", "npm test")
|
|
208
|
+
docker_exec({service: "web", command: "npm test"})
|
|
153
209
|
```
|
|
154
210
|
|
|
155
211
|
### Example 2: Backend Development (Django + PostgreSQL)
|
|
156
212
|
|
|
157
213
|
```typescript
|
|
158
214
|
// Restart backend after code changes
|
|
159
|
-
docker_container_restart("web")
|
|
215
|
+
docker_container_restart({service: "web"})
|
|
160
216
|
|
|
161
217
|
// Run database migrations
|
|
162
|
-
docker_exec("web", "python manage.py migrate")
|
|
218
|
+
docker_exec({service: "web", command: "python manage.py migrate"})
|
|
163
219
|
|
|
164
220
|
// Query database
|
|
165
|
-
docker_db_query("postgres", "SELECT COUNT(*) FROM auth_user;")
|
|
221
|
+
docker_db_query({service: "postgres", query: "SELECT COUNT(*) FROM auth_user;"})
|
|
166
222
|
|
|
167
223
|
// Create backup before deployment
|
|
168
|
-
docker_db_backup("postgres",
|
|
224
|
+
docker_db_backup({service: "postgres", compress: true})
|
|
169
225
|
|
|
170
226
|
// View application logs
|
|
171
|
-
docker_container_logs("web",
|
|
227
|
+
docker_container_logs({service: "web", lines: 100, timestamps: true})
|
|
172
228
|
```
|
|
173
229
|
|
|
174
230
|
## 🏗️ How It Works
|
|
@@ -214,12 +270,27 @@ Keywords that trigger masking: `PASSWORD`, `TOKEN`, `KEY`, `SECRET`, `API_KEY`
|
|
|
214
270
|
|
|
215
271
|
- **[Quick Start Guide](docs/QUICK_START.md)** — Detailed setup instructions
|
|
216
272
|
- **[API Reference](docs/API_REFERENCE.md)** — Complete command documentation
|
|
273
|
+
- **[Remote Docker Guide](docs/REMOTE_DOCKER.md)** — SSH-based remote Docker management
|
|
274
|
+
- **[Remote Discovery Guide](docs/REMOTE_DISCOVERY.md)** — Automatic project discovery on remote servers
|
|
217
275
|
- **[Examples](docs/EXAMPLES.md)** — Real-world usage scenarios
|
|
276
|
+
- **[Testing System](docs/testing/README.md)** — Complete testing guide (E2E, Unit, Manual)
|
|
218
277
|
- **[Troubleshooting](docs/TROUBLESHOOTING.md)** — Common issues and solutions
|
|
219
278
|
- **[FAQ](docs/FAQ.md)** — Frequently asked questions
|
|
279
|
+
- **[Roadmap](docs/ROADMAP.md)** — Future development plans and upcoming features
|
|
220
280
|
|
|
221
281
|
For developer documentation, see [docs/DEV/README.md](docs/DEV/README.md)
|
|
222
282
|
|
|
283
|
+
### Roadmap Overview
|
|
284
|
+
|
|
285
|
+
The project roadmap outlines planned features and releases. Key upcoming features include:
|
|
286
|
+
|
|
287
|
+
- **v1.4.0 (Q1 2026)**: MySQL and MongoDB adapters
|
|
288
|
+
- **v1.5.0 (Q2 2026)**: Enhanced monitoring and analytics
|
|
289
|
+
- **v2.0.0 (Q3 2026)**: Plugin system and major architecture update
|
|
290
|
+
- **v2.1.0 (Q4 2026)**: Network, volume, and image management
|
|
291
|
+
|
|
292
|
+
See [docs/ROADMAP.md](docs/ROADMAP.md) for detailed information about future plans, priorities, and how to contribute to the roadmap.
|
|
293
|
+
|
|
223
294
|
## 🤝 Contributing
|
|
224
295
|
|
|
225
296
|
We welcome contributions! This is an open-source project built for the community.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Database Adapter Interface
|
|
3
3
|
* Interface for working with different database types
|
|
4
4
|
*/
|
|
5
|
-
import type { ServiceConfig } from '../discovery/types.js';
|
|
5
|
+
import type { ServiceConfig, ProjectConfig } from '../discovery/types.js';
|
|
6
6
|
import type { QueryOptions, BackupOptions, RestoreOptions, DBStatus, ConnectionInfo } from './types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Interface for Database Adapters
|
|
@@ -11,20 +11,24 @@ import type { QueryOptions, BackupOptions, RestoreOptions, DBStatus, ConnectionI
|
|
|
11
11
|
export interface DatabaseAdapter {
|
|
12
12
|
/**
|
|
13
13
|
* Execute query or command
|
|
14
|
+
* @param projectConfig - Optional pre-loaded project (for remote mode)
|
|
14
15
|
*/
|
|
15
|
-
query(service: string, query: string, options?: QueryOptions): Promise<string>;
|
|
16
|
+
query(service: string, query: string, options?: QueryOptions, projectConfig?: ProjectConfig): Promise<string>;
|
|
16
17
|
/**
|
|
17
18
|
* Create backup
|
|
19
|
+
* @param projectConfig - Optional pre-loaded project (for remote mode)
|
|
18
20
|
*/
|
|
19
|
-
backup(service: string, options: BackupOptions): Promise<string>;
|
|
21
|
+
backup(service: string, options: BackupOptions, projectConfig?: ProjectConfig): Promise<string>;
|
|
20
22
|
/**
|
|
21
23
|
* Restore from backup
|
|
24
|
+
* @param projectConfig - Optional pre-loaded project (for remote mode)
|
|
22
25
|
*/
|
|
23
|
-
restore(service: string, backupPath: string, options?: RestoreOptions): Promise<void>;
|
|
26
|
+
restore(service: string, backupPath: string, options?: RestoreOptions, projectConfig?: ProjectConfig): Promise<void>;
|
|
24
27
|
/**
|
|
25
28
|
* Get database status
|
|
29
|
+
* @param projectConfig - Optional pre-loaded project (for remote mode)
|
|
26
30
|
*/
|
|
27
|
-
status(service: string): Promise<DBStatus>;
|
|
31
|
+
status(service: string, projectConfig?: ProjectConfig): Promise<DBStatus>;
|
|
28
32
|
/**
|
|
29
33
|
* Get connection info from environment
|
|
30
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/database-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"database-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/database-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,CACH,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,YAAY,EACtB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhG;;;OAGG;IACH,OAAO,CACL,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,EACxB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE1E;;OAEG;IACH,iBAAiB,CACf,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,cAAc,CAAC;CACnB"}
|
|
@@ -4,20 +4,29 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { DatabaseAdapter } from './database-adapter.js';
|
|
6
6
|
import type { QueryOptions, BackupOptions, RestoreOptions, DBStatus, ConnectionInfo } from './types.js';
|
|
7
|
-
import type { ServiceConfig } from '../discovery/types.js';
|
|
7
|
+
import type { ServiceConfig, ProjectConfig } from '../discovery/types.js';
|
|
8
|
+
import { ContainerManager } from '../managers/container-manager.js';
|
|
9
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
10
|
+
import { EnvManager } from '../managers/env-manager.js';
|
|
8
11
|
export declare class PostgreSQLAdapter implements DatabaseAdapter {
|
|
9
12
|
private containerManager;
|
|
10
13
|
private projectDiscovery;
|
|
11
14
|
private envManager;
|
|
12
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Constructor with Dependency Injection
|
|
17
|
+
* @param containerManager - ContainerManager instance (with or without SSH config)
|
|
18
|
+
* @param projectDiscovery - ProjectDiscovery instance
|
|
19
|
+
* @param envManager - EnvManager instance
|
|
20
|
+
*/
|
|
21
|
+
constructor(containerManager: ContainerManager, projectDiscovery: ProjectDiscovery, envManager: EnvManager);
|
|
13
22
|
/**
|
|
14
23
|
* Execute SQL query
|
|
15
24
|
*/
|
|
16
|
-
query(service: string, query: string, options?: QueryOptions): Promise<string>;
|
|
25
|
+
query(service: string, query: string, options?: QueryOptions, projectConfig?: ProjectConfig): Promise<string>;
|
|
17
26
|
/**
|
|
18
27
|
* Create backup
|
|
19
28
|
*/
|
|
20
|
-
backup(service: string, options: BackupOptions): Promise<string>;
|
|
29
|
+
backup(service: string, options: BackupOptions, projectConfig?: ProjectConfig): Promise<string>;
|
|
21
30
|
/**
|
|
22
31
|
* Restore from backup
|
|
23
32
|
*/
|
|
@@ -25,7 +34,7 @@ export declare class PostgreSQLAdapter implements DatabaseAdapter {
|
|
|
25
34
|
/**
|
|
26
35
|
* Get database status
|
|
27
36
|
*/
|
|
28
|
-
status(service: string): Promise<DBStatus>;
|
|
37
|
+
status(service: string, projectConfig?: ProjectConfig): Promise<DBStatus>;
|
|
29
38
|
/**
|
|
30
39
|
* Get connection info from environment
|
|
31
40
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../src/adapters/postgresql.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../src/adapters/postgresql.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIxD,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,UAAU,CAAa;IAE/B;;;;;OAKG;gBAED,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,UAAU;IAOxB;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA4CnH;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAgDrG;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IA8ChB;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoD/E;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc;IAUtF;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAuBzB"}
|
|
@@ -2,27 +2,31 @@
|
|
|
2
2
|
* PostgreSQL Adapter
|
|
3
3
|
* DatabaseAdapter implementation for PostgreSQL
|
|
4
4
|
*/
|
|
5
|
-
import { ContainerManager } from '../managers/container-manager.js';
|
|
6
|
-
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
7
|
-
import { EnvManager } from '../managers/env-manager.js';
|
|
8
5
|
import { sqlValidator } from '../security/sql-validator.js';
|
|
9
6
|
import { logger } from '../utils/logger.js';
|
|
10
7
|
export class PostgreSQLAdapter {
|
|
11
8
|
containerManager;
|
|
12
9
|
projectDiscovery;
|
|
13
10
|
envManager;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Constructor with Dependency Injection
|
|
13
|
+
* @param containerManager - ContainerManager instance (with or without SSH config)
|
|
14
|
+
* @param projectDiscovery - ProjectDiscovery instance
|
|
15
|
+
* @param envManager - EnvManager instance
|
|
16
|
+
*/
|
|
17
|
+
constructor(containerManager, projectDiscovery, envManager) {
|
|
18
|
+
this.containerManager = containerManager;
|
|
19
|
+
this.projectDiscovery = projectDiscovery;
|
|
20
|
+
this.envManager = envManager;
|
|
18
21
|
}
|
|
19
22
|
/**
|
|
20
23
|
* Execute SQL query
|
|
21
24
|
*/
|
|
22
|
-
async query(service, query, options) {
|
|
25
|
+
async query(service, query, options, projectConfig) {
|
|
23
26
|
// SQL validation (if enabled)
|
|
24
27
|
sqlValidator.validate(query);
|
|
25
|
-
|
|
28
|
+
// ✅ FIX BUG-007: Use provided project or find local project
|
|
29
|
+
const project = projectConfig || await this.projectDiscovery.findProject();
|
|
26
30
|
const serviceConfig = project.services[service];
|
|
27
31
|
if (!serviceConfig) {
|
|
28
32
|
throw new Error(`Service '${service}' not found in project`);
|
|
@@ -46,15 +50,16 @@ export class PostgreSQLAdapter {
|
|
|
46
50
|
// Password via PGPASSWORD env var
|
|
47
51
|
const envVars = conn.password ? [`PGPASSWORD=${conn.password}`] : [];
|
|
48
52
|
logger.debug(`Executing PostgreSQL query in ${service}: ${query}`);
|
|
53
|
+
// ✅ FIX BUG-007: Pass composeFile and projectDir for remote mode
|
|
49
54
|
const output = await this.containerManager.exec(service, project.name, cmd, {
|
|
50
55
|
env: envVars,
|
|
51
|
-
});
|
|
56
|
+
}, project.composeFile, project.projectDir);
|
|
52
57
|
return output;
|
|
53
58
|
}
|
|
54
59
|
/**
|
|
55
60
|
* Create backup
|
|
56
61
|
*/
|
|
57
|
-
async backup(service, options) {
|
|
62
|
+
async backup(service, options, projectConfig) {
|
|
58
63
|
const project = await this.projectDiscovery.findProject();
|
|
59
64
|
const serviceConfig = project.services[service];
|
|
60
65
|
if (!serviceConfig) {
|
|
@@ -136,25 +141,26 @@ export class PostgreSQLAdapter {
|
|
|
136
141
|
/**
|
|
137
142
|
* Get database status
|
|
138
143
|
*/
|
|
139
|
-
async status(service) {
|
|
140
|
-
|
|
144
|
+
async status(service, projectConfig) {
|
|
145
|
+
// ✅ FIX BUG-007: Use provided project or find local project
|
|
146
|
+
const project = projectConfig || await this.projectDiscovery.findProject();
|
|
141
147
|
const serviceConfig = project.services[service];
|
|
142
148
|
if (!serviceConfig) {
|
|
143
149
|
throw new Error(`Service '${service}' not found in project`);
|
|
144
150
|
}
|
|
145
151
|
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
146
152
|
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
147
|
-
// Get version
|
|
148
|
-
const versionOutput = await this.query(service, 'SELECT version();');
|
|
153
|
+
// Get version - pass projectConfig to query
|
|
154
|
+
const versionOutput = await this.query(service, 'SELECT version();', undefined, projectConfig);
|
|
149
155
|
const version = this.parseVersion(versionOutput);
|
|
150
156
|
// Get database size
|
|
151
|
-
const sizeOutput = await this.query(service, "SELECT pg_size_pretty(pg_database_size(current_database())) as size;");
|
|
157
|
+
const sizeOutput = await this.query(service, "SELECT pg_size_pretty(pg_database_size(current_database())) as size;", undefined, projectConfig);
|
|
152
158
|
const size = this.parseSingleValue(sizeOutput);
|
|
153
159
|
// Get connection count
|
|
154
|
-
const connectionsOutput = await this.query(service, "SELECT count(*) as connections FROM pg_stat_activity WHERE datname = current_database();");
|
|
160
|
+
const connectionsOutput = await this.query(service, "SELECT count(*) as connections FROM pg_stat_activity WHERE datname = current_database();", undefined, projectConfig);
|
|
155
161
|
const connections = parseInt(this.parseSingleValue(connectionsOutput) || '0');
|
|
156
162
|
// Get uptime
|
|
157
|
-
const uptimeOutput = await this.query(service, "SELECT date_trunc('second', current_timestamp - pg_postmaster_start_time()) as uptime;");
|
|
163
|
+
const uptimeOutput = await this.query(service, "SELECT date_trunc('second', current_timestamp - pg_postmaster_start_time()) as uptime;", undefined, projectConfig);
|
|
158
164
|
const uptime = this.parseSingleValue(uptimeOutput);
|
|
159
165
|
return {
|
|
160
166
|
type: 'postgresql',
|
|
@@ -188,15 +194,22 @@ export class PostgreSQLAdapter {
|
|
|
188
194
|
* Parse single value from SQL output (first row, first column)
|
|
189
195
|
*/
|
|
190
196
|
parseSingleValue(output) {
|
|
191
|
-
|
|
197
|
+
logger.debug(`Parsing single value from ${output.length} chars output`);
|
|
192
198
|
const lines = output.split('\n').filter((line) => line.trim().length > 0);
|
|
193
199
|
if (lines.length < 2) {
|
|
200
|
+
logger.warn('Not enough lines in SQL output');
|
|
194
201
|
return '';
|
|
195
202
|
}
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
//
|
|
199
|
-
|
|
203
|
+
// psql table format:
|
|
204
|
+
// Line 0: column header (e.g., " size ")
|
|
205
|
+
// Line 1: separator (e.g., "-------")
|
|
206
|
+
// Line 2: actual data (e.g., " 11 MB")
|
|
207
|
+
// Line 3: row count (e.g., "(1 row)")
|
|
208
|
+
// Skip header and separator, take data row
|
|
209
|
+
const dataLine = lines.length >= 3 ? lines[2] : lines[1];
|
|
210
|
+
const value = dataLine.trim();
|
|
211
|
+
logger.debug(`Parsed value: "${value}"`);
|
|
212
|
+
return value;
|
|
200
213
|
}
|
|
201
214
|
}
|
|
202
215
|
//# sourceMappingURL=postgresql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../src/adapters/postgresql.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../src/adapters/postgresql.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/redis.d.ts
CHANGED
|
@@ -5,11 +5,20 @@
|
|
|
5
5
|
import type { DatabaseAdapter } from './database-adapter.js';
|
|
6
6
|
import type { QueryOptions, BackupOptions, RestoreOptions, DBStatus, ConnectionInfo } from './types.js';
|
|
7
7
|
import type { ServiceConfig } from '../discovery/types.js';
|
|
8
|
+
import { ContainerManager } from '../managers/container-manager.js';
|
|
9
|
+
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
10
|
+
import { EnvManager } from '../managers/env-manager.js';
|
|
8
11
|
export declare class RedisAdapter implements DatabaseAdapter {
|
|
9
12
|
private containerManager;
|
|
10
13
|
private projectDiscovery;
|
|
11
14
|
private envManager;
|
|
12
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Constructor with Dependency Injection
|
|
17
|
+
* @param containerManager - ContainerManager instance (with or without SSH config)
|
|
18
|
+
* @param projectDiscovery - ProjectDiscovery instance
|
|
19
|
+
* @param envManager - EnvManager instance
|
|
20
|
+
*/
|
|
21
|
+
constructor(containerManager: ContainerManager, projectDiscovery: ProjectDiscovery, envManager: EnvManager);
|
|
13
22
|
/**
|
|
14
23
|
* Execute Redis command
|
|
15
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD,qBAAa,YAAa,YAAW,eAAe;IAClD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,UAAU,CAAa;IAE/B;;;;;OAKG;gBAED,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,UAAU;IAOxB;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAwCpF;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCtE;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2BhD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc;IAUtF;;OAEG;YACW,aAAa;IAsC3B;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;IACH,OAAO,CAAC,YAAY;CAYrB"}
|
package/dist/adapters/redis.js
CHANGED
|
@@ -2,18 +2,21 @@
|
|
|
2
2
|
* Redis Adapter
|
|
3
3
|
* DatabaseAdapter implementation for Redis
|
|
4
4
|
*/
|
|
5
|
-
import { ContainerManager } from '../managers/container-manager.js';
|
|
6
|
-
import { ProjectDiscovery } from '../discovery/project-discovery.js';
|
|
7
|
-
import { EnvManager } from '../managers/env-manager.js';
|
|
8
5
|
import { logger } from '../utils/logger.js';
|
|
9
6
|
export class RedisAdapter {
|
|
10
7
|
containerManager;
|
|
11
8
|
projectDiscovery;
|
|
12
9
|
envManager;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Constructor with Dependency Injection
|
|
12
|
+
* @param containerManager - ContainerManager instance (with or without SSH config)
|
|
13
|
+
* @param projectDiscovery - ProjectDiscovery instance
|
|
14
|
+
* @param envManager - EnvManager instance
|
|
15
|
+
*/
|
|
16
|
+
constructor(containerManager, projectDiscovery, envManager) {
|
|
17
|
+
this.containerManager = containerManager;
|
|
18
|
+
this.projectDiscovery = projectDiscovery;
|
|
19
|
+
this.envManager = envManager;
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
22
|
* Execute Redis command
|
|
@@ -27,14 +30,26 @@ export class RedisAdapter {
|
|
|
27
30
|
const env = this.envManager.loadEnv(project.projectDir, service, serviceConfig);
|
|
28
31
|
const conn = this.getConnectionInfo(serviceConfig, env);
|
|
29
32
|
// Build redis-cli command
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
// Use echo with pipe to pass the command, preserving quotes and spaces
|
|
34
|
+
let cmd;
|
|
35
|
+
// Escape the query for shell (escape single quotes)
|
|
36
|
+
const escapedQuery = query.replace(/'/g, "'\"'\"'");
|
|
32
37
|
if (conn.password) {
|
|
33
|
-
|
|
38
|
+
// Use sh -c to execute: echo "query" | redis-cli -a password
|
|
39
|
+
cmd = [
|
|
40
|
+
'sh',
|
|
41
|
+
'-c',
|
|
42
|
+
`echo '${escapedQuery}' | redis-cli -a '${conn.password}'`
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Use sh -c to execute: echo "query" | redis-cli
|
|
47
|
+
cmd = [
|
|
48
|
+
'sh',
|
|
49
|
+
'-c',
|
|
50
|
+
`echo '${escapedQuery}' | redis-cli`
|
|
51
|
+
];
|
|
34
52
|
}
|
|
35
|
-
// Redis command
|
|
36
|
-
const commandParts = query.trim().split(/\s+/);
|
|
37
|
-
cmd.push(...commandParts);
|
|
38
53
|
logger.debug(`Executing Redis command in ${service}: ${query}`);
|
|
39
54
|
const output = await this.containerManager.exec(service, project.name, cmd);
|
|
40
55
|
return output;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/adapters/redis.ts"],"names":[],"mappings":"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"}
|