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
JavaScript
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;
;