UNPKG

remcode

Version:

Turn your AI assistant into a codebase expert. Intelligent code analysis, semantic search, and software engineering guidance through MCP integration.

146 lines (145 loc) 5.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GitHubRepository = void 0; const logger_1 = require("../utils/logger"); const logger = (0, logger_1.getLogger)('GitHubRepository'); class GitHubRepository { constructor(client) { this.client = client; } /** * Validate if a repository exists and is accessible */ async validateRepository(owner, repo) { try { const repoData = await this.client.getRepository(owner, repo); return !!repoData; } catch (error) { if (error instanceof Error) { logger.error(`Repository validation failed: ${error.message}`); } else { logger.error(`Repository validation failed: ${String(error)}`); } return false; } } /** * Get detailed repository information */ async getRepositoryInfo(owner, repo) { logger.info(`Getting repository info for ${owner}/${repo}`); return this.client.getRepository(owner, repo); } /** * Create a new repository */ async createRepository(options) { logger.info(`Creating repository: ${options.name}`); return this.client.createRepository(options.name, options); } /** * List repositories for the authenticated user */ async listUserRepositories(type = 'all', sort = 'full_name', direction = 'asc', perPage = 30, page = 1) { logger.info(`Listing user repositories (type: ${type}, sort: ${sort}, direction: ${direction})`); const params = new URLSearchParams({ type, sort, direction, per_page: perPage.toString(), page: page.toString() }); return this.client.makeRequest(`/user/repos?${params.toString()}`); } /** * List repositories for a specific organization */ async listOrganizationRepositories(org, type = 'all', sort = 'full_name', direction = 'asc') { logger.info(`Listing repositories for org: ${org} (type: ${type}, sort: ${sort}, direction: ${direction})`); const params = new URLSearchParams({ type, sort, direction }); return this.client.makeRequest(`/orgs/${org}/repos?${params.toString()}`); } /** * Fork a repository */ async forkRepository(owner, repo, options = {}) { logger.info(`Forking repository: ${owner}/${repo}${options.organization ? ` to organization ${options.organization}` : ''}`); return this.client.forkRepository(owner, repo, options); } /** * List branches for a repository */ async listBranches(owner, repo, protected_only = false) { logger.info(`Listing branches for ${owner}/${repo}${protected_only ? ' (protected only)' : ''}`); const params = protected_only ? '?protected=true' : ''; return this.client.makeRequest(`/repos/${owner}/${repo}/branches${params}`); } /** * Get a specific branch */ async getBranch(owner, repo, branch) { logger.info(`Getting branch ${branch} for ${owner}/${repo}`); return this.client.makeRequest(`/repos/${owner}/${repo}/branches/${branch}`); } /** * Create a new branch */ async createBranch(owner, repo, branchName, sha) { logger.info(`Creating branch ${branchName} for ${owner}/${repo} from SHA ${sha}`); await this.client.makeRequest(`/repos/${owner}/${repo}/git/refs`, 'POST', { ref: `refs/heads/${branchName}`, sha }); } /** * List contributors for a repository */ async listContributors(owner, repo, includeAnonymous = false) { logger.info(`Listing contributors for ${owner}/${repo}${includeAnonymous ? ' (including anonymous)' : ''}`); const params = includeAnonymous ? '?anon=1' : ''; return this.client.makeRequest(`/repos/${owner}/${repo}/contributors${params}`); } /** * Create or update a file in a repository */ async createOrUpdateFile(owner, repo, path, message, content, branch, sha) { logger.info(`${sha ? 'Updating' : 'Creating'} file ${path} in ${owner}/${repo}${branch ? ` on branch ${branch}` : ''}`); return this.client.createOrUpdateFile(owner, repo, path, message, content, sha, branch); } /** * Delete a file from a repository */ async deleteFile(owner, repo, path, message, sha, branch) { logger.info(`Deleting file ${path} from ${owner}/${repo}${branch ? ` on branch ${branch}` : ''}`); const data = { message, sha }; if (branch) { data.branch = branch; } return this.client.makeRequest(`/repos/${owner}/${repo}/contents/${path}`, 'DELETE', data); } /** * Get repository contents */ async getContents(owner, repo, path = '', ref) { logger.info(`Getting contents for ${owner}/${repo}/${path}${ref ? ` at ref ${ref}` : ''}`); const params = ref ? `?ref=${ref}` : ''; return this.client.makeRequest(`/repos/${owner}/${repo}/contents/${path}${params}`); } /** * Add collaborator to a repository */ async addCollaborator(owner, repo, username, permission = 'push') { logger.info(`Adding collaborator ${username} to ${owner}/${repo} with ${permission} permission`); return this.client.makeRequest(`/repos/${owner}/${repo}/collaborators/${username}`, 'PUT', { permission }); } } exports.GitHubRepository = GitHubRepository;