azure-devops-mcp

by RyanCardin15
Verified
import { AzureDevOpsConfig } from "../Interfaces/AzureDevOps"; import { AzureDevOpsService } from "./AzureDevOpsService"; import { ListArtifactFeedsParams, GetPackageVersionsParams, PublishPackageParams, PromotePackageParams, DeletePackageVersionParams, ListContainerImagesParams, GetContainerImageTagsParams, ScanContainerImageParams, ManageContainerPoliciesParams, ManageUniversalPackagesParams, CreatePackageDownloadReportParams, CheckPackageDependenciesParams } from "../Interfaces/ArtifactManagement"; export class ArtifactManagementService extends AzureDevOpsService { constructor(config: AzureDevOpsConfig) { super(config); } async listArtifactFeeds(params: ListArtifactFeedsParams) { // This would contain actual implementation // For now, we're returning a mock response const feedType = params.feedType || 'all'; return { feeds: [ { id: "feed-npm-1", name: "npm-packages", description: "NPM packages for the organization", type: "npm", visibility: "organization", url: "https://feeds.dev.azure.com/organization/project/_packaging/npm-packages/npm", createdDate: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString() }, { id: "feed-nuget-1", name: "nuget-packages", description: "NuGet packages for .NET projects", type: "nuget", visibility: "project", url: "https://feeds.dev.azure.com/organization/project/_packaging/nuget-packages/nuget", createdDate: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString() }, { id: "feed-universal-1", name: "universal-packages", description: "Universal packages for deployments", type: "universal", visibility: "organization", url: "https://feeds.dev.azure.com/organization/project/_packaging/universal-packages/universal", createdDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString() } ].filter(feed => feedType === 'all' || feed.type === feedType), count: 3, includeDeleted: params.includeDeleted || false }; } async getPackageVersions(params: GetPackageVersionsParams) { const versions = [ { version: "1.0.0", publishedDate: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(), views: ["release", "prerelease"], downloadsCount: 1250, isLatest: false }, { version: "1.1.0", publishedDate: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString(), views: ["release", "prerelease"], downloadsCount: 945, isLatest: false }, { version: "1.2.0", publishedDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(), views: ["release", "prerelease"], downloadsCount: 1587, isLatest: true } ]; return { feedId: params.feedId, packageName: params.packageName, totalVersions: versions.length, versions: params.top ? versions.slice(0, params.top) : versions }; } async publishPackage(params: PublishPackageParams) { return { feedId: params.feedId, packageType: params.packageType, packageName: params.packagePath.split('/').pop()?.split('.')[0] || 'unknown', packageVersion: params.packageVersion || '1.0.0', publishDate: new Date().toISOString(), status: "published", packageUrl: `https://feeds.dev.azure.com/organization/project/_packaging/${params.feedId}/npm/registry/${params.packagePath.split('/').pop()?.split('.')[0]}/v/${params.packageVersion || '1.0.0'}` }; } async promotePackage(params: PromotePackageParams) { return { feedId: params.feedId, packageName: params.packageName, packageVersion: params.packageVersion, sourceView: params.sourceView, targetView: params.targetView, promotionDate: new Date().toISOString(), status: "promoted", promotedBy: "user@example.com" }; } async deletePackageVersion(params: DeletePackageVersionParams) { return { feedId: params.feedId, packageName: params.packageName, packageVersion: params.packageVersion, deletionDate: new Date().toISOString(), permanent: params.permanent || false, status: "deleted", deletedBy: "user@example.com" }; } async listContainerImages(params: ListContainerImagesParams) { return { repositoryName: params.repositoryName || "all", images: [ { name: "api-service", tags: ["latest", "v1.0.0", "v1.1.0"], size: "256MB", lastUpdated: new Date(Date.now() - 15 * 24 * 60 * 60 * 1000).toISOString(), pullCount: 1250, manifest: params.includeManifests ? { schemaVersion: 2, mediaType: "application/vnd.docker.distribution.manifest.v2+json", layers: [ { digest: "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4", size: 32456234 } ] } : undefined }, { name: "web-frontend", tags: ["latest", "v2.0.0", "v2.1.0", "v2.2.0"], size: "124MB", lastUpdated: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), pullCount: 2189, manifest: params.includeManifests ? { schemaVersion: 2, mediaType: "application/vnd.docker.distribution.manifest.v2+json", layers: [ { digest: "sha256:b3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d5", size: 24567890 } ] } : undefined } ], count: 2, includeDeleted: params.includeDeleted || false }; } async getContainerImageTags(params: GetContainerImageTagsParams) { const tags = [ { tag: "latest", createdDate: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), size: "256MB", digest: "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4", pullCount: 523 }, { tag: "v1.0.0", createdDate: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(), size: "245MB", digest: "sha256:b3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d5", pullCount: 412 }, { tag: "v1.1.0", createdDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(), size: "255MB", digest: "sha256:c3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d6", pullCount: 315 } ]; return { repositoryName: params.repositoryName, imageName: params.imageName, totalTags: tags.length, tags: params.top ? tags.slice(0, params.top) : tags }; } async scanContainerImage(params: ScanContainerImageParams) { return { repositoryName: params.repositoryName, imageTag: params.imageTag, scanType: params.scanType || "both", scanDate: new Date().toISOString(), vulnerabilities: params.scanType === "compliance" ? [] : [ { id: "CVE-2023-1234", severity: "high", description: "Vulnerability in base image affecting OpenSSL", package: "openssl", installedVersion: "1.1.1k", fixedVersion: "1.1.1l", remediation: "Update to latest base image" }, { id: "CVE-2023-5678", severity: "medium", description: "Vulnerability in package manager", package: "apt", installedVersion: "2.2.4", fixedVersion: "2.2.5", remediation: "Run apt-get update && apt-get upgrade" } ], complianceIssues: params.scanType === "vulnerability" ? [] : [ { id: "COMP-1", severity: "high", description: "Root user used for application execution", standard: "CIS Docker Benchmark 4.1", remediation: "Use non-root user in Dockerfile" }, { id: "COMP-2", severity: "medium", description: "No healthcheck defined", standard: "CIS Docker Benchmark 4.6", remediation: "Add HEALTHCHECK instruction to Dockerfile" } ], overallRisk: "high", scanStatus: "completed" }; } async manageContainerPolicies(params: ManageContainerPoliciesParams) { let policyDetails; if (params.policyType === "retention") { policyDetails = { daysToKeep: 90, maxImagesPerRepository: 50, keepLatestImage: true }; } else if (params.policyType === "security") { policyDetails = { blockHighVulnerabilities: true, requireVulnerabilityScan: true, complianceStandards: ["CIS", "NIST"] }; } else { policyDetails = { allowedUsers: ["project-admins", "project-contributors"], allowAnonymousPull: false, requireAuthentication: true }; } return { repositoryName: params.repositoryName, policyType: params.policyType, action: params.action, status: "success", appliedDate: new Date().toISOString(), appliedBy: "user@example.com", policySettings: params.action === "get" ? policyDetails : (params.policySettings || policyDetails) }; } async manageUniversalPackages(params: ManageUniversalPackagesParams) { return { packageName: params.packageName, action: params.action, packageVersion: params.packageVersion || "1.0.0", status: "success", timestamp: new Date().toISOString(), size: "45MB", packagePath: params.packagePath || `/path/to/${params.packageName}_${params.packageVersion || '1.0.0'}.zip`, packageUrl: `https://feeds.dev.azure.com/organization/_packaging/universal-packages/universal/download/${params.packageName}/${params.packageVersion || '1.0.0'}` }; } async createPackageDownloadReport(params: CreatePackageDownloadReportParams) { return { feedId: params.feedId || "all-feeds", packageName: params.packageName || "all-packages", timeRange: params.timeRange || "30d", format: params.format || "csv", reportDate: new Date().toISOString(), totalDownloads: 5782, reportUrl: `https://dev.azure.com/organization/project/_apis/packaging/reports/${params.feedId || 'all'}-${Date.now()}.${params.format || 'csv'}`, packages: [ { name: "core-library", version: "3.2.1", downloads: 2345, lastDownloaded: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString() }, { name: "ui-components", version: "2.0.0", downloads: 1897, lastDownloaded: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString() }, { name: "data-access", version: "1.5.0", downloads: 1540, lastDownloaded: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString() } ], topConsumers: [ { name: "API Project", downloads: 1250 }, { name: "Frontend Project", downloads: 986 }, { name: "Mobile App", downloads: 754 } ] }; } async checkPackageDependencies(params: CheckPackageDependenciesParams) { return { packageName: params.packageName, packageVersion: params.packageVersion || "latest", directDependencies: [ { name: "lodash", version: "4.17.21", isVulnerable: false }, { name: "axios", version: "0.21.1", isVulnerable: true } ], transitiveDependencies: params.includeTransitive ? [ { name: "follow-redirects", version: "1.14.1", isVulnerable: true, parentPackage: "axios" }, { name: "debug", version: "4.3.2", isVulnerable: false, parentPackage: "axios" } ] : [], vulnerabilities: params.checkVulnerabilities ? [ { id: "CVE-2021-3749", packageName: "axios", severity: "medium", description: "Server-Side Request Forgery vulnerability", fixedVersion: "0.21.2", references: ["https://nvd.nist.gov/vuln/detail/CVE-2021-3749"] }, { id: "CVE-2021-26500", packageName: "follow-redirects", severity: "high", description: "Memory consumption DoS vulnerability", fixedVersion: "1.14.2", references: ["https://nvd.nist.gov/vuln/detail/CVE-2021-26500"] } ] : [], summary: { totalDependencies: params.includeTransitive ? 4 : 2, vulnerableDependencies: params.checkVulnerabilities ? 2 : 0, riskLevel: params.checkVulnerabilities ? "medium" : "unknown" } }; } }