zammy 1.2.1 → 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 +322 -239
- package/assets/zammy.gif +0 -0
- package/dist/index.js +2418 -200
- package/package.json +9 -2
- package/packages/plugins/docker/README.md +141 -0
- package/packages/plugins/docker/dist/index.d.ts +46 -0
- package/packages/plugins/docker/dist/index.d.ts.map +1 -0
- package/packages/plugins/docker/dist/index.js +402 -0
- package/packages/plugins/docker/dist/index.js.map +1 -0
- package/packages/plugins/docker/package.json +28 -0
- package/packages/plugins/docker/zammy-plugin.json +16 -0
- package/packages/plugins/faker/README.md +65 -0
- package/packages/plugins/faker/dist/index.d.ts +43 -0
- package/packages/plugins/faker/dist/index.d.ts.map +1 -0
- package/packages/plugins/faker/dist/index.js +349 -0
- package/packages/plugins/faker/dist/index.js.map +1 -0
- package/packages/plugins/faker/package.json +28 -0
- package/packages/plugins/faker/zammy-plugin.json +14 -0
- package/packages/plugins/network/README.md +126 -0
- package/packages/plugins/network/dist/index.d.ts +45 -0
- package/packages/plugins/network/dist/index.d.ts.map +1 -0
- package/packages/plugins/network/dist/index.js +406 -0
- package/packages/plugins/network/dist/index.js.map +1 -0
- package/packages/plugins/network/package.json +28 -0
- package/packages/plugins/network/zammy-plugin.json +17 -0
- package/packages/plugins/port/README.md +74 -0
- package/packages/plugins/port/dist/index.d.ts +47 -0
- package/packages/plugins/port/dist/index.d.ts.map +1 -0
- package/packages/plugins/port/dist/index.js +331 -0
- package/packages/plugins/port/dist/index.js.map +1 -0
- package/packages/plugins/port/package.json +28 -0
- package/packages/plugins/port/zammy-plugin.json +16 -0
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zammy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "A feature-packed CLI with utilities, dev tools, and a bit of fun",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"workspaces": [
|
|
7
|
+
"packages/plugins/*"
|
|
8
|
+
],
|
|
6
9
|
"bin": {
|
|
7
10
|
"zammy": "./dist/index.js"
|
|
8
11
|
},
|
|
@@ -18,8 +21,12 @@
|
|
|
18
21
|
"keywords": [
|
|
19
22
|
"cli",
|
|
20
23
|
"terminal",
|
|
24
|
+
"developer-tools",
|
|
25
|
+
"productivity",
|
|
21
26
|
"ascii-art",
|
|
22
|
-
"
|
|
27
|
+
"interactive",
|
|
28
|
+
"cross-platform",
|
|
29
|
+
"utilities"
|
|
23
30
|
],
|
|
24
31
|
"author": "Aayush Adhikari",
|
|
25
32
|
"license": "MIT",
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# zammy-plugin-docker
|
|
2
|
+
|
|
3
|
+
Docker container management with pretty output.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
/plugin install zammy-plugin-docker
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
- Docker must be installed and running
|
|
14
|
+
- Docker daemon must be accessible (may require sudo on Linux)
|
|
15
|
+
|
|
16
|
+
## Commands
|
|
17
|
+
|
|
18
|
+
### `/docker ps`
|
|
19
|
+
|
|
20
|
+
List running containers. Use `-a` flag to show all containers.
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
/docker ps
|
|
24
|
+
|
|
25
|
+
RUNNING CONTAINERS
|
|
26
|
+
|
|
27
|
+
ID NAME IMAGE STATUS
|
|
28
|
+
──────────────────────────────────────────────────────────────────────
|
|
29
|
+
abc123def456 my-app node:18 ✔ Up 2 hours
|
|
30
|
+
789xyz012abc postgres postgres:15 ✔ Up 3 days
|
|
31
|
+
|
|
32
|
+
Total: 2 containers
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### `/docker images`
|
|
36
|
+
|
|
37
|
+
List all Docker images.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
/docker images
|
|
41
|
+
|
|
42
|
+
DOCKER IMAGES
|
|
43
|
+
|
|
44
|
+
REPOSITORY TAG SIZE AGE
|
|
45
|
+
─────────────────────────────────────────────────────────────────
|
|
46
|
+
node 18 950MB 2 days ago
|
|
47
|
+
postgres 15 380MB 1 month ago
|
|
48
|
+
nginx latest 140MB 3 days ago
|
|
49
|
+
|
|
50
|
+
Total: 3 images
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### `/docker logs <container>`
|
|
54
|
+
|
|
55
|
+
View container logs (last 20 lines by default).
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
/docker logs my-app
|
|
59
|
+
|
|
60
|
+
Logs for my-app (last 20 lines)
|
|
61
|
+
──────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
[INFO] Server starting on port 3000
|
|
64
|
+
[INFO] Database connected
|
|
65
|
+
[WARN] Cache miss for user:123
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### `/docker stats`
|
|
69
|
+
|
|
70
|
+
Show real-time resource usage for running containers.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
/docker stats
|
|
74
|
+
|
|
75
|
+
CONTAINER STATS
|
|
76
|
+
|
|
77
|
+
NAME CPU MEMORY NET I/O
|
|
78
|
+
────────────────────────────────────────────────────────────
|
|
79
|
+
my-app 2.5% 125MiB / 8GiB 1.2MB / 500KB
|
|
80
|
+
postgres 0.8% 250MiB / 8GiB 800KB / 1.5MB
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `/docker prune`
|
|
84
|
+
|
|
85
|
+
Clean up unused Docker resources.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
/docker prune
|
|
89
|
+
|
|
90
|
+
✔ Cleanup complete
|
|
91
|
+
|
|
92
|
+
Space reclaimed: 2.5GB
|
|
93
|
+
|
|
94
|
+
Tip: Use /docker prune -a to remove unused images too
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Flags:
|
|
98
|
+
- `-a` or `--all` - Remove all unused images, not just dangling ones
|
|
99
|
+
- `--volumes` - Also remove unused volumes
|
|
100
|
+
|
|
101
|
+
### `/docker inspect <container>`
|
|
102
|
+
|
|
103
|
+
Show detailed information about a container.
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
/docker inspect my-app
|
|
107
|
+
|
|
108
|
+
CONTAINER DETAILS
|
|
109
|
+
|
|
110
|
+
Name: my-app
|
|
111
|
+
ID: abc123def456
|
|
112
|
+
Image: node:18
|
|
113
|
+
Status: running
|
|
114
|
+
Created: 2024-01-15T10:30:00Z
|
|
115
|
+
IP: 172.17.0.2
|
|
116
|
+
|
|
117
|
+
Ports:
|
|
118
|
+
3000/tcp → 3000
|
|
119
|
+
|
|
120
|
+
Environment: (5 vars)
|
|
121
|
+
NODE_ENV
|
|
122
|
+
PORT
|
|
123
|
+
DATABASE_URL
|
|
124
|
+
... and 2 more
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Error Handling
|
|
128
|
+
|
|
129
|
+
The plugin gracefully handles:
|
|
130
|
+
- Docker not installed
|
|
131
|
+
- Docker daemon not running
|
|
132
|
+
- Container not found
|
|
133
|
+
- Permission issues
|
|
134
|
+
|
|
135
|
+
## Permissions
|
|
136
|
+
|
|
137
|
+
This plugin requires shell access to run Docker commands.
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
MIT
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
interface PluginAPI {
|
|
2
|
+
registerCommand(command: Command): void;
|
|
3
|
+
ui: {
|
|
4
|
+
theme: {
|
|
5
|
+
primary: (text: string) => string;
|
|
6
|
+
secondary: (text: string) => string;
|
|
7
|
+
success: (text: string) => string;
|
|
8
|
+
warning: (text: string) => string;
|
|
9
|
+
error: (text: string) => string;
|
|
10
|
+
dim: (text: string) => string;
|
|
11
|
+
gradient: (text: string) => string;
|
|
12
|
+
};
|
|
13
|
+
symbols: {
|
|
14
|
+
check: string;
|
|
15
|
+
cross: string;
|
|
16
|
+
warning: string;
|
|
17
|
+
info: string;
|
|
18
|
+
sparkles: string;
|
|
19
|
+
arrow: string;
|
|
20
|
+
rocket: string;
|
|
21
|
+
};
|
|
22
|
+
progressBar: (current: number, total: number, width?: number) => string;
|
|
23
|
+
};
|
|
24
|
+
log: {
|
|
25
|
+
info: (message: string) => void;
|
|
26
|
+
error: (message: string) => void;
|
|
27
|
+
};
|
|
28
|
+
shell?: {
|
|
29
|
+
spawn: (command: string, args?: string[]) => Promise<{
|
|
30
|
+
stdout: string;
|
|
31
|
+
stderr: string;
|
|
32
|
+
code: number;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
interface Command {
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
usage: string;
|
|
40
|
+
execute: (args: string[]) => Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
declare const plugin: {
|
|
43
|
+
activate(api: PluginAPI): void;
|
|
44
|
+
};
|
|
45
|
+
export default plugin;
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,UAAU,SAAS;IACjB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,EAAE,EAAE;QACF,KAAK,EAAE;YACL,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;YAClC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;YACpC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;YAClC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;YAClC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;YAChC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;YAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;SACpC,CAAC;QACF,OAAO,EAAE;YACP,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;KACzE,CAAC;IACF,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACxG,CAAC;CACH;AAED,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAuND,QAAA,MAAM,MAAM;kBACI,SAAS;CAkSxB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
// Zammy Plugin: Docker
|
|
2
|
+
// Docker container management with pretty output
|
|
3
|
+
// ============ HELPERS ============
|
|
4
|
+
async function checkDockerInstalled(shell) {
|
|
5
|
+
try {
|
|
6
|
+
const result = await shell.spawn('docker', ['--version']);
|
|
7
|
+
if (result.code !== 0) {
|
|
8
|
+
return { installed: false };
|
|
9
|
+
}
|
|
10
|
+
const match = result.stdout.match(/Docker version ([\d.]+)/);
|
|
11
|
+
const version = match?.[1];
|
|
12
|
+
// Check if Docker daemon is running
|
|
13
|
+
const infoResult = await shell.spawn('docker', ['info']);
|
|
14
|
+
const running = infoResult.code === 0;
|
|
15
|
+
return { installed: true, version, running };
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return { installed: false };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function getContainers(shell, all = false) {
|
|
22
|
+
const args = [
|
|
23
|
+
'ps',
|
|
24
|
+
'--format', '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.CreatedAt}}'
|
|
25
|
+
];
|
|
26
|
+
if (all)
|
|
27
|
+
args.push('-a');
|
|
28
|
+
const result = await shell.spawn('docker', args);
|
|
29
|
+
if (result.code !== 0)
|
|
30
|
+
return [];
|
|
31
|
+
const containers = [];
|
|
32
|
+
const lines = result.stdout.trim().split('\n').filter(Boolean);
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
const [id, name, image, status, ports, created] = line.split('\t');
|
|
35
|
+
containers.push({
|
|
36
|
+
id: id || '',
|
|
37
|
+
name: name || '',
|
|
38
|
+
image: image || '',
|
|
39
|
+
status: status || '',
|
|
40
|
+
ports: ports || '-',
|
|
41
|
+
created: created || '',
|
|
42
|
+
running: status?.toLowerCase().includes('up') ?? false
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return containers;
|
|
46
|
+
}
|
|
47
|
+
async function getImages(shell) {
|
|
48
|
+
const result = await shell.spawn('docker', [
|
|
49
|
+
'images',
|
|
50
|
+
'--format', '{{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}'
|
|
51
|
+
]);
|
|
52
|
+
if (result.code !== 0)
|
|
53
|
+
return [];
|
|
54
|
+
const images = [];
|
|
55
|
+
const lines = result.stdout.trim().split('\n').filter(Boolean);
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
const [id, repository, tag, size, created] = line.split('\t');
|
|
58
|
+
images.push({
|
|
59
|
+
id: id || '',
|
|
60
|
+
repository: repository || '',
|
|
61
|
+
tag: tag || '',
|
|
62
|
+
size: size || '',
|
|
63
|
+
created: created || ''
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return images;
|
|
67
|
+
}
|
|
68
|
+
async function getContainerStats(shell) {
|
|
69
|
+
const result = await shell.spawn('docker', [
|
|
70
|
+
'stats',
|
|
71
|
+
'--no-stream',
|
|
72
|
+
'--format', '{{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}'
|
|
73
|
+
]);
|
|
74
|
+
if (result.code !== 0)
|
|
75
|
+
return [];
|
|
76
|
+
const stats = [];
|
|
77
|
+
const lines = result.stdout.trim().split('\n').filter(Boolean);
|
|
78
|
+
for (const line of lines) {
|
|
79
|
+
const [id, name, cpu, memory, netIO, blockIO] = line.split('\t');
|
|
80
|
+
stats.push({
|
|
81
|
+
id: id || '',
|
|
82
|
+
name: name || '',
|
|
83
|
+
cpu: cpu || '0%',
|
|
84
|
+
memory: memory || '0B / 0B',
|
|
85
|
+
netIO: netIO || '0B / 0B',
|
|
86
|
+
blockIO: blockIO || '0B / 0B'
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return stats;
|
|
90
|
+
}
|
|
91
|
+
async function getContainerLogs(shell, container, lines = 20) {
|
|
92
|
+
const result = await shell.spawn('docker', ['logs', '--tail', lines.toString(), container]);
|
|
93
|
+
if (result.code !== 0) {
|
|
94
|
+
return { logs: '', error: result.stderr || 'Failed to get logs' };
|
|
95
|
+
}
|
|
96
|
+
// Docker logs can be in stdout or stderr depending on the container
|
|
97
|
+
return { logs: result.stdout || result.stderr };
|
|
98
|
+
}
|
|
99
|
+
async function inspectContainer(shell, container) {
|
|
100
|
+
const result = await shell.spawn('docker', ['inspect', container]);
|
|
101
|
+
if (result.code !== 0) {
|
|
102
|
+
return { info: null, error: result.stderr || 'Container not found' };
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const data = JSON.parse(result.stdout);
|
|
106
|
+
return { info: data[0] };
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return { info: null, error: 'Failed to parse container info' };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function pruneDocker(shell, options) {
|
|
113
|
+
try {
|
|
114
|
+
// System prune
|
|
115
|
+
const args = ['system', 'prune', '-f'];
|
|
116
|
+
if (options.all)
|
|
117
|
+
args.push('-a');
|
|
118
|
+
if (options.volumes)
|
|
119
|
+
args.push('--volumes');
|
|
120
|
+
const result = await shell.spawn('docker', args);
|
|
121
|
+
if (result.code !== 0) {
|
|
122
|
+
return { success: false, error: result.stderr };
|
|
123
|
+
}
|
|
124
|
+
// Extract space reclaimed
|
|
125
|
+
const match = result.stdout.match(/Total reclaimed space:\s*([\d.]+\s*\w+)/i);
|
|
126
|
+
const spaceReclaimed = match?.[1] || 'Unknown';
|
|
127
|
+
return { success: true, spaceReclaimed };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return { success: false, error: String(error) };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function formatAge(dateStr) {
|
|
134
|
+
try {
|
|
135
|
+
const date = new Date(dateStr);
|
|
136
|
+
const now = new Date();
|
|
137
|
+
const diffMs = now.getTime() - date.getTime();
|
|
138
|
+
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
139
|
+
if (diffDays === 0)
|
|
140
|
+
return 'Today';
|
|
141
|
+
if (diffDays === 1)
|
|
142
|
+
return '1 day ago';
|
|
143
|
+
if (diffDays < 30)
|
|
144
|
+
return `${diffDays} days ago`;
|
|
145
|
+
if (diffDays < 365)
|
|
146
|
+
return `${Math.floor(diffDays / 30)} months ago`;
|
|
147
|
+
return `${Math.floor(diffDays / 365)} years ago`;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return dateStr;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ============ PLUGIN ============
|
|
154
|
+
const plugin = {
|
|
155
|
+
activate(api) {
|
|
156
|
+
const { theme, symbols } = api.ui;
|
|
157
|
+
if (!api.shell) {
|
|
158
|
+
api.log.error('Docker plugin requires shell permission');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const shell = api.shell;
|
|
162
|
+
api.registerCommand({
|
|
163
|
+
name: 'docker',
|
|
164
|
+
description: 'Docker container management',
|
|
165
|
+
usage: '/docker <action> [args]\n\n Actions: ps, images, logs, stats, prune, inspect',
|
|
166
|
+
async execute(args) {
|
|
167
|
+
// Check Docker installation first
|
|
168
|
+
const docker = await checkDockerInstalled(shell);
|
|
169
|
+
if (!docker.installed) {
|
|
170
|
+
console.log('');
|
|
171
|
+
console.log(` ${symbols.cross} ${theme.error('Docker is not installed')}`);
|
|
172
|
+
console.log('');
|
|
173
|
+
console.log(` ${theme.dim('Install Docker:')} https://docker.com/get-started`);
|
|
174
|
+
console.log('');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!docker.running) {
|
|
178
|
+
console.log('');
|
|
179
|
+
console.log(` ${symbols.warning} ${theme.warning('Docker daemon is not running')}`);
|
|
180
|
+
console.log('');
|
|
181
|
+
console.log(` ${theme.dim('Start Docker Desktop or run:')} sudo systemctl start docker`);
|
|
182
|
+
console.log('');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const action = args[0]?.toLowerCase();
|
|
186
|
+
if (!action) {
|
|
187
|
+
console.log('');
|
|
188
|
+
console.log(` ${symbols.rocket} ${theme.gradient('DOCKER')} ${theme.dim(`v${docker.version}`)}`);
|
|
189
|
+
console.log('');
|
|
190
|
+
console.log(` ${theme.dim('Usage:')} /docker <action> [args]`);
|
|
191
|
+
console.log('');
|
|
192
|
+
console.log(` ${theme.dim('Actions:')}`);
|
|
193
|
+
console.log(` ${theme.primary('ps')} ${theme.dim('List containers (use -a for all)')}`);
|
|
194
|
+
console.log(` ${theme.primary('images')} ${theme.dim('List images')}`);
|
|
195
|
+
console.log(` ${theme.primary('logs <id>')} ${theme.dim('View container logs')}`);
|
|
196
|
+
console.log(` ${theme.primary('stats')} ${theme.dim('Show resource usage')}`);
|
|
197
|
+
console.log(` ${theme.primary('prune')} ${theme.dim('Clean up unused resources')}`);
|
|
198
|
+
console.log(` ${theme.primary('inspect <id>')} ${theme.dim('Show container details')}`);
|
|
199
|
+
console.log('');
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
console.log('');
|
|
203
|
+
switch (action) {
|
|
204
|
+
case 'ps': {
|
|
205
|
+
const showAll = args.includes('-a') || args.includes('--all');
|
|
206
|
+
const containers = await getContainers(shell, showAll);
|
|
207
|
+
console.log(` ${symbols.rocket} ${theme.gradient(showAll ? 'ALL CONTAINERS' : 'RUNNING CONTAINERS')}`);
|
|
208
|
+
console.log('');
|
|
209
|
+
if (containers.length === 0) {
|
|
210
|
+
console.log(` ${theme.dim(showAll ? 'No containers found' : 'No running containers')}`);
|
|
211
|
+
if (!showAll) {
|
|
212
|
+
console.log(` ${theme.dim('Use')} /docker ps -a ${theme.dim('to show all containers')}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
console.log(` ${theme.dim('ID'.padEnd(14))}${theme.dim('NAME'.padEnd(20))}${theme.dim('IMAGE'.padEnd(25))}${theme.dim('STATUS')}`);
|
|
217
|
+
console.log(` ${theme.dim('─'.repeat(70))}`);
|
|
218
|
+
for (const c of containers) {
|
|
219
|
+
const statusColor = c.running ? theme.success : theme.warning;
|
|
220
|
+
const statusIcon = c.running ? symbols.check : symbols.warning;
|
|
221
|
+
const shortStatus = c.status.split(' ').slice(0, 2).join(' ');
|
|
222
|
+
console.log(` ${theme.primary(c.id.slice(0, 12).padEnd(14))}` +
|
|
223
|
+
`${theme.secondary(c.name.slice(0, 18).padEnd(20))}` +
|
|
224
|
+
`${c.image.slice(0, 23).padEnd(25)}` +
|
|
225
|
+
`${statusIcon} ${statusColor(shortStatus)}`);
|
|
226
|
+
}
|
|
227
|
+
console.log('');
|
|
228
|
+
console.log(` ${theme.dim(`Total: ${containers.length} containers`)}`);
|
|
229
|
+
}
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
case 'images': {
|
|
233
|
+
const images = await getImages(shell);
|
|
234
|
+
console.log(` ${symbols.rocket} ${theme.gradient('DOCKER IMAGES')}`);
|
|
235
|
+
console.log('');
|
|
236
|
+
if (images.length === 0) {
|
|
237
|
+
console.log(` ${theme.dim('No images found')}`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.log(` ${theme.dim('REPOSITORY'.padEnd(30))}${theme.dim('TAG'.padEnd(15))}${theme.dim('SIZE'.padEnd(12))}${theme.dim('AGE')}`);
|
|
241
|
+
console.log(` ${theme.dim('─'.repeat(65))}`);
|
|
242
|
+
for (const img of images) {
|
|
243
|
+
const repoDisplay = img.repository.length > 28
|
|
244
|
+
? img.repository.slice(0, 25) + '...'
|
|
245
|
+
: img.repository;
|
|
246
|
+
console.log(` ${theme.primary(repoDisplay.padEnd(30))}` +
|
|
247
|
+
`${theme.secondary(img.tag.slice(0, 13).padEnd(15))}` +
|
|
248
|
+
`${img.size.padEnd(12)}` +
|
|
249
|
+
`${theme.dim(formatAge(img.created))}`);
|
|
250
|
+
}
|
|
251
|
+
console.log('');
|
|
252
|
+
console.log(` ${theme.dim(`Total: ${images.length} images`)}`);
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
case 'logs': {
|
|
257
|
+
const container = args[1];
|
|
258
|
+
if (!container) {
|
|
259
|
+
console.log(` ${symbols.warning} ${theme.warning('Usage:')} /docker logs <container-id>`);
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
const lineCount = parseInt(args[2]) || 20;
|
|
263
|
+
console.log(` ${theme.dim(`Logs for`)} ${theme.primary(container)} ${theme.dim(`(last ${lineCount} lines)`)}`);
|
|
264
|
+
console.log(` ${theme.dim('─'.repeat(50))}`);
|
|
265
|
+
console.log('');
|
|
266
|
+
const { logs, error } = await getContainerLogs(shell, container, lineCount);
|
|
267
|
+
if (error) {
|
|
268
|
+
console.log(` ${symbols.cross} ${theme.error(error)}`);
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
if (!logs.trim()) {
|
|
272
|
+
console.log(` ${theme.dim('No logs available')}`);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
const logLines = logs.trim().split('\n');
|
|
276
|
+
for (const line of logLines) {
|
|
277
|
+
// Color code log levels
|
|
278
|
+
let coloredLine = line;
|
|
279
|
+
if (line.includes('ERROR') || line.includes('error')) {
|
|
280
|
+
coloredLine = theme.error(line);
|
|
281
|
+
}
|
|
282
|
+
else if (line.includes('WARN') || line.includes('warn')) {
|
|
283
|
+
coloredLine = theme.warning(line);
|
|
284
|
+
}
|
|
285
|
+
else if (line.includes('INFO') || line.includes('info')) {
|
|
286
|
+
coloredLine = theme.dim(line);
|
|
287
|
+
}
|
|
288
|
+
console.log(` ${coloredLine}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
case 'stats': {
|
|
294
|
+
console.log(` ${symbols.rocket} ${theme.gradient('CONTAINER STATS')}`);
|
|
295
|
+
console.log('');
|
|
296
|
+
const stats = await getContainerStats(shell);
|
|
297
|
+
if (stats.length === 0) {
|
|
298
|
+
console.log(` ${theme.dim('No running containers')}`);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
console.log(` ${theme.dim('NAME'.padEnd(20))}${theme.dim('CPU'.padEnd(10))}${theme.dim('MEMORY'.padEnd(20))}${theme.dim('NET I/O')}`);
|
|
302
|
+
console.log(` ${theme.dim('─'.repeat(60))}`);
|
|
303
|
+
for (const s of stats) {
|
|
304
|
+
const cpuValue = parseFloat(s.cpu);
|
|
305
|
+
const cpuColor = cpuValue > 80 ? theme.error :
|
|
306
|
+
cpuValue > 50 ? theme.warning :
|
|
307
|
+
theme.success;
|
|
308
|
+
console.log(` ${theme.primary(s.name.slice(0, 18).padEnd(20))}` +
|
|
309
|
+
`${cpuColor(s.cpu.padEnd(10))}` +
|
|
310
|
+
`${s.memory.slice(0, 18).padEnd(20)}` +
|
|
311
|
+
`${theme.dim(s.netIO)}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
case 'prune': {
|
|
317
|
+
const pruneAll = args.includes('-a') || args.includes('--all');
|
|
318
|
+
const pruneVolumes = args.includes('--volumes');
|
|
319
|
+
console.log(` ${theme.dim('Cleaning up Docker resources...')}`);
|
|
320
|
+
const result = await pruneDocker(shell, { all: pruneAll, volumes: pruneVolumes });
|
|
321
|
+
if (result.success) {
|
|
322
|
+
console.log(` ${symbols.check} ${theme.success('Cleanup complete')}`);
|
|
323
|
+
console.log('');
|
|
324
|
+
console.log(` ${theme.dim('Space reclaimed:')} ${theme.primary(result.spaceReclaimed || '0B')}`);
|
|
325
|
+
if (!pruneAll) {
|
|
326
|
+
console.log('');
|
|
327
|
+
console.log(` ${theme.dim('Tip: Use')} /docker prune -a ${theme.dim('to remove unused images too')}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
console.log(` ${symbols.cross} ${theme.error(result.error || 'Prune failed')}`);
|
|
332
|
+
}
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
case 'inspect': {
|
|
336
|
+
const container = args[1];
|
|
337
|
+
if (!container) {
|
|
338
|
+
console.log(` ${symbols.warning} ${theme.warning('Usage:')} /docker inspect <container-id>`);
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
const { info, error } = await inspectContainer(shell, container);
|
|
342
|
+
if (error || !info) {
|
|
343
|
+
console.log(` ${symbols.cross} ${theme.error(error || 'Container not found')}`);
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
console.log(` ${symbols.rocket} ${theme.gradient('CONTAINER DETAILS')}`);
|
|
347
|
+
console.log('');
|
|
348
|
+
// Extract useful info
|
|
349
|
+
const name = info['Name']?.replace('/', '') || 'Unknown';
|
|
350
|
+
const id = info['Id']?.slice(0, 12) || 'Unknown';
|
|
351
|
+
const state = info['State'] || {};
|
|
352
|
+
const config = info['Config'] || {};
|
|
353
|
+
const networkSettings = info['NetworkSettings'] || {};
|
|
354
|
+
console.log(` ${theme.dim('Name:')} ${theme.primary(name)}`);
|
|
355
|
+
console.log(` ${theme.dim('ID:')} ${id}`);
|
|
356
|
+
console.log(` ${theme.dim('Image:')} ${config['Image'] || 'Unknown'}`);
|
|
357
|
+
console.log(` ${theme.dim('Status:')} ${state['Status'] ? theme.success(String(state['Status'])) : theme.warning('Unknown')}`);
|
|
358
|
+
console.log(` ${theme.dim('Created:')} ${info['Created'] || 'Unknown'}`);
|
|
359
|
+
if (networkSettings['IPAddress']) {
|
|
360
|
+
console.log(` ${theme.dim('IP:')} ${networkSettings['IPAddress']}`);
|
|
361
|
+
}
|
|
362
|
+
const ports = networkSettings['Ports'] || {};
|
|
363
|
+
if (Object.keys(ports).length > 0) {
|
|
364
|
+
console.log('');
|
|
365
|
+
console.log(` ${theme.dim('Ports:')}`);
|
|
366
|
+
for (const [containerPort, bindings] of Object.entries(ports)) {
|
|
367
|
+
if (bindings && bindings.length > 0) {
|
|
368
|
+
const binding = bindings[0];
|
|
369
|
+
console.log(` ${theme.secondary(containerPort)} ${symbols.arrow} ${binding['HostPort'] || 'none'}`);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
console.log(` ${theme.secondary(containerPort)} ${symbols.arrow} ${theme.dim('not bound')}`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const env = config['Env'] || [];
|
|
377
|
+
if (env.length > 0) {
|
|
378
|
+
console.log('');
|
|
379
|
+
console.log(` ${theme.dim('Environment:')} ${theme.dim(`(${env.length} vars)`)}`);
|
|
380
|
+
// Show first 5 env vars
|
|
381
|
+
for (const e of env.slice(0, 5)) {
|
|
382
|
+
const [key] = e.split('=');
|
|
383
|
+
console.log(` ${theme.dim(key)}`);
|
|
384
|
+
}
|
|
385
|
+
if (env.length > 5) {
|
|
386
|
+
console.log(` ${theme.dim(`... and ${env.length - 5} more`)}`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
default:
|
|
392
|
+
console.log(` ${symbols.cross} ${theme.error(`Unknown action: ${action}`)}`);
|
|
393
|
+
console.log(` ${theme.dim('Run /docker to see available actions')}`);
|
|
394
|
+
}
|
|
395
|
+
console.log('');
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
api.log.info('Docker plugin activated');
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
export default plugin;
|
|
402
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|