zammy 1.2.0 → 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.
Files changed (33) hide show
  1. package/README.md +328 -214
  2. package/SECURITY.md +57 -0
  3. package/assets/zammy.gif +0 -0
  4. package/dist/index.js +3257 -450
  5. package/package.json +10 -3
  6. package/packages/plugins/docker/README.md +141 -0
  7. package/packages/plugins/docker/dist/index.d.ts +46 -0
  8. package/packages/plugins/docker/dist/index.d.ts.map +1 -0
  9. package/packages/plugins/docker/dist/index.js +402 -0
  10. package/packages/plugins/docker/dist/index.js.map +1 -0
  11. package/packages/plugins/docker/package.json +28 -0
  12. package/packages/plugins/docker/zammy-plugin.json +16 -0
  13. package/packages/plugins/faker/README.md +65 -0
  14. package/packages/plugins/faker/dist/index.d.ts +43 -0
  15. package/packages/plugins/faker/dist/index.d.ts.map +1 -0
  16. package/packages/plugins/faker/dist/index.js +349 -0
  17. package/packages/plugins/faker/dist/index.js.map +1 -0
  18. package/packages/plugins/faker/package.json +28 -0
  19. package/packages/plugins/faker/zammy-plugin.json +14 -0
  20. package/packages/plugins/network/README.md +126 -0
  21. package/packages/plugins/network/dist/index.d.ts +45 -0
  22. package/packages/plugins/network/dist/index.d.ts.map +1 -0
  23. package/packages/plugins/network/dist/index.js +406 -0
  24. package/packages/plugins/network/dist/index.js.map +1 -0
  25. package/packages/plugins/network/package.json +28 -0
  26. package/packages/plugins/network/zammy-plugin.json +17 -0
  27. package/packages/plugins/port/README.md +74 -0
  28. package/packages/plugins/port/dist/index.d.ts +47 -0
  29. package/packages/plugins/port/dist/index.d.ts.map +1 -0
  30. package/packages/plugins/port/dist/index.js +331 -0
  31. package/packages/plugins/port/dist/index.js.map +1 -0
  32. package/packages/plugins/port/package.json +28 -0
  33. 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.2.0",
4
- "description": "Your slice-of-life terminal companion",
3
+ "version": "1.3.0",
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
- "utility"
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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"}