45 lines
2.0 KiB
JavaScript
45 lines
2.0 KiB
JavaScript
import { z } from 'zod';
|
|
import { config } from '../../config.js';
|
|
import { runCommand } from '../../lib/runCommand.js';
|
|
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
|
|
import { dockerManager } from './dockerManager.js';
|
|
export function registerDockerPushImageTool(server) {
|
|
server.registerTool('docker_push_image', {
|
|
title: 'Docker Push Image',
|
|
description: 'Push a locally built or allow-listed Docker image to a registry (`docker push`). Requires confirm: true. ' +
|
|
'Credentials must already be available via the Docker credential store / environment — never pass secrets as tool args.',
|
|
inputSchema: {
|
|
image: z
|
|
.string()
|
|
.min(1)
|
|
.describe('Image reference to push, e.g. "ghcr.io/org/app:latest" or "my-app:1.0".'),
|
|
confirm: z.boolean().optional().describe('Required as true to push an image.'),
|
|
},
|
|
}, async ({ image, confirm }) => {
|
|
try {
|
|
if (confirm !== true) {
|
|
return errorResult('docker_push_image requires confirm: true.');
|
|
}
|
|
if (image.includes('--force') || /\s/.test(image)) {
|
|
return errorResult('Invalid image reference.');
|
|
}
|
|
await dockerManager.ensureReachable();
|
|
const result = await runCommand('docker', ['push', image], {
|
|
cwd: config.workspaceRoot,
|
|
timeoutMs: config.scaffoldCommandTimeoutMs,
|
|
});
|
|
return jsonResult({
|
|
image,
|
|
exitCode: result.exitCode,
|
|
failed: result.failed,
|
|
timedOut: result.timedOut,
|
|
output: result.output,
|
|
note: 'Auth must come from `docker login` / credential helpers / env — not from this tool.',
|
|
});
|
|
}
|
|
catch (error) {
|
|
return errorResult(toErrorMessage(error));
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=pushImage.js.map
|