import { z } from 'zod';
import { globalProviderFactory, VcsOperations } from '../providers/index.js';
import { applyAutoUserDetection } from '../utils/user-detection.js';
/**
* Tool: pulls
*
* DESCRIÇÃO:
* Gerenciamento completo de pull requests com suporte multi-provider (GitHub e Gitea)
*
* FUNCIONALIDADES:
* - Criação de novos pull requests
* - Listagem e busca de PRs
* - Obtenção de detalhes específicos
* - Atualização de PRs existentes
* - Merge de pull requests
* - Fechamento de PRs
* - Revisão e aprovação
* - Busca por conteúdo e status
*
* USO:
* - Para gerenciar integração de código
* - Para revisão de código
* - Para controle de qualidade
* - Para colaboração em equipe
*
* RECOMENDAÇÕES:
* - Use títulos descritivos
* - Documente mudanças detalhadamente
* - Revise antes de fazer merge
* - Mantenha PRs pequenos e focados
*/
/**
* Schema de validação para entrada da tool pulls
*
* VALIDAÇÕES:
* - action: Ação obrigatória (create, list, get, update, merge, close, review, search)
* - Parâmetros específicos por ação
* - Validação de tipos e formatos
*
* RECOMENDAÇÕES:
* - Sempre valide entrada antes de usar
* - Use parâmetros opcionais adequadamente
* - Documente parâmetros obrigatórios
*/
const PullsInputSchema = z.object({
action: z.enum(['create', 'list', 'get', 'update', 'merge', 'close', 'review', 'search']),
// Parâmetros comuns
repo: z.string(),
// Para multi-provider
provider: z.enum(['gitea', 'github']).describe('Provider to use (gitea or github)'),
projectPath: z.string().describe('Local project path for git operations'),
// Para create
title: z.string().optional(),
body: z.string().optional(),
head: z.string().optional(),
base: z.string().optional(),
draft: z.boolean().optional(),
labels: z.array(z.string()).optional(),
assignees: z.array(z.string()).optional(),
reviewers: z.array(z.string()).optional(),
milestone: z.number().optional(),
// Para get/update/merge/close/review
pull_number: z.number().optional(),
// Para list
state: z.enum(['open', 'closed', 'merged', 'all']).optional(),
page: z.number().min(1).optional(),
limit: z.number().min(1).max(100).optional(),
// Para update
new_title: z.string().optional(),
new_body: z.string().optional(),
new_base: z.string().optional(),
new_labels: z.array(z.string()).optional(),
new_assignees: z.array(z.string()).optional(),
new_milestone: z.number().optional(),
// Para merge
merge_method: z.enum(['merge', 'rebase', 'squash']).optional(),
merge_commit_title: z.string().optional(),
merge_commit_message: z.string().optional(),
// Para review
review_event: z.enum(['APPROVE', 'REQUEST_CHANGES', 'COMMENT']).optional(),
review_body: z.string().optional(),
// Para search
query: z.string().optional(),
author: z.string().optional(),
assignee: z.string().optional(),
reviewer: z.string().optional(),
label: z.string().optional(),
});
export type PullsInput = z.infer<typeof PullsInputSchema>;
/**
* Schema de saída padronizado
*
* ESTRUTURA:
* - success: Status da operação
* - action: Ação executada
* - message: Mensagem descritiva
* - data: Dados retornados (opcional)
* - error: Detalhes do erro (opcional)
*/
const PullsResultSchema = z.object({
success: z.boolean(),
action: z.string(),
message: z.string(),
data: z.any().optional(),
error: z.string().optional()
});
export type PullsResult = z.infer<typeof PullsResultSchema>;
/**
* Tool: pulls
*
* DESCRIÇÃO:
* Gerenciamento completo de Pull Requests Gitea com múltiplas ações
*
* ACTIONS DISPONÍVEIS:
*
* 1. create - Criar novo Pull Request
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - title (obrigatório): Título do PR
* - body (opcional): Descrição detalhada
* - head (obrigatório): Branch de origem
* - base (obrigatório): Branch de destino
* - draft (opcional): Se é um draft PR
* - labels (opcional): Array de labels
* - assignees (opcional): Array de usuários responsáveis
* - reviewers (opcional): Array de revisores
* - milestone (opcional): ID do milestone
*
* 2. list - Listar Pull Requests
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - state (opcional): Estado dos PRs (open, closed, merged, all) - padrão: open
* - page (opcional): Página da listagem (padrão: 1)
* - limit (opcional): Itens por página (padrão: 30, máximo: 100)
*
* 3. get - Obter detalhes do Pull Request
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - pull_number (obrigatório): Número do PR
*
* 4. update - Atualizar Pull Request existente
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - pull_number (obrigatório): Número do PR
* - new_title (opcional): Novo título
* - new_body (opcional): Nova descrição
* - new_base (opcional): Nova branch base
* - new_labels (opcional): Novos labels
* - new_assignees (opcional): Novos responsáveis
* - new_milestone (opcional): Novo milestone
*
* 5. merge - Fazer merge do Pull Request
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - pull_number (obrigatório): Número do PR
* - merge_method (opcional): Método de merge (merge, rebase, squash)
* - merge_commit_title (opcional): Título do commit de merge
* - merge_commit_message (opcional): Mensagem do commit de merge
*
* 6. close - Fechar Pull Request
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - pull_number (obrigatório): Número do PR
*
* 7. review - Adicionar review ao Pull Request
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - pull_number (obrigatório): Número do PR
* - review_event (obrigatório): Tipo de review (APPROVE, REQUEST_CHANGES, COMMENT)
* - review_body (opcional): Comentário do review
*
* 8. search - Buscar Pull Requests
* Parâmetros:
* - owner (obrigatório): Proprietário do repositório
* - repo (obrigatório): Nome do repositório
* - query (obrigatório): Termo de busca
* - author (opcional): Autor dos PRs
* - assignee (opcional): Responsável pelos PRs
* - reviewer (opcional): Revisor dos PRs
* - label (opcional): Label específico
*
* RECOMENDAÇÕES DE USO:
* - Use títulos descritivos e claros
* - Documente mudanças detalhadamente
* - Solicite reviews adequados
* - Mantenha PRs pequenos e focados
* - Use labels para categorização
* - Atribua responsáveis adequadamente
* - Escolha método de merge apropriado
*/
export const pullsTool = {
name: 'git-pulls',
description: 'tool: Gerencia pull requests Git para revisão e merge de código\n──────────────\naction create: cria novo pull request\naction create requires: repo, title, body, head, base, draft, labels, assignees, reviewers, milestone, provider\n───────────────\naction list: lista pull requests do repositório\naction list requires: repo, state, page, limit, provider\n───────────────\naction get: obtém detalhes de PR\naction get requires: repo, pull_number, provider\n───────────────\naction update: atualiza pull request\naction update requires: repo, pull_number, new_title, new_body, new_base, new_labels, new_assignees, new_milestone, provider\n───────────────\naction merge: faz merge do PR\naction merge requires: repo, pull_number, merge_method, merge_commit_title, merge_commit_message, provider\n───────────────\naction close: fecha pull request\naction close requires: repo, pull_number, provider\n───────────────\naction review: adiciona review\naction review requires: repo, pull_number, review_event, review_body, provider\n───────────────\naction search: busca PRs por critérios\naction search requires: repo, query, author, assignee, reviewer, label, provider',
inputSchema: {
type: 'object',
properties: {
action: {
type: 'string',
enum: ['create', 'list', 'get', 'update', 'merge', 'close', 'review', 'search'],
description: 'Action to perform on pull requests'
},
repo: { type: 'string', description: 'Repository name' },
provider: { type: 'string', description: 'Provider to use (github, gitea, or omit for default)' },
title: { type: 'string', description: 'Pull request title' },
body: { type: 'string', description: 'Pull request body/description' },
head: { type: 'string', description: 'Source branch' },
base: { type: 'string', description: 'Target branch' },
draft: { type: 'boolean', description: 'Create as draft PR' },
labels: { type: 'array', items: { type: 'string' }, description: 'PR labels' },
assignees: { type: 'array', items: { type: 'string' }, description: 'PR assignees' },
reviewers: { type: 'array', items: { type: 'string' }, description: 'PR reviewers' },
milestone: { type: 'number', description: 'Milestone ID' },
pull_number: { type: 'number', description: 'Pull request number' },
state: { type: 'string', enum: ['open', 'closed', 'merged', 'all'], description: 'PR state' },
page: { type: 'number', description: 'Page number', minimum: 1 },
limit: { type: 'number', description: 'Items per page', minimum: 1, maximum: 100 },
new_title: { type: 'string', description: 'New PR title' },
new_body: { type: 'string', description: 'New PR body' },
new_base: { type: 'string', description: 'New base branch' },
new_labels: { type: 'array', items: { type: 'string' }, description: 'New PR labels' },
new_assignees: { type: 'array', items: { type: 'string' }, description: 'New PR assignees' },
new_milestone: { type: 'number', description: 'New milestone ID' },
merge_method: { type: 'string', enum: ['merge', 'rebase', 'squash'], description: 'Merge method' },
merge_commit_title: { type: 'string', description: 'Merge commit title' },
merge_commit_message: { type: 'string', description: 'Merge commit message' },
review_event: { type: 'string', enum: ['APPROVE', 'REQUEST_CHANGES', 'COMMENT'], description: 'Review type' },
review_body: { type: 'string', description: 'Review comment' },
query: { type: 'string', description: 'Search query' },
author: { type: 'string', description: 'PR author filter' },
assignee: { type: 'string', description: 'PR assignee filter' },
reviewer: { type: 'string', description: 'PR reviewer filter' },
label: { type: 'string', description: 'PR label filter' }
},
required: ['action', 'repo', 'provider', 'projectPath']
},
/**
* Handler principal da tool pulls
*
* FUNCIONALIDADE:
* - Valida entrada usando Zod schema
* - Roteia para método específico baseado na ação
* - Trata erros de forma uniforme
* - Retorna resultado padronizado
*
* FLUXO:
* 1. Validação de entrada
* 2. Seleção do provider
* 3. Roteamento por ação
* 4. Execução do método específico
* 5. Tratamento de erros
* 6. Retorno de resultado
*
* TRATAMENTO DE ERROS:
* - Validação: erro de schema
* - Execução: erro da operação
* - Roteamento: ação não suportada
*
* RECOMENDAÇÕES:
* - Sempre valide entrada antes de processar
* - Trate erros específicos adequadamente
* - Log detalhes de erro para debug
* - Retorne mensagens de erro úteis
*/
async handler(input: PullsInput): Promise<PullsResult> {
try {
const validatedInput = PullsInputSchema.parse(input);
// Aplicar auto-detecção de usuário/owner
const processedInput = await applyAutoUserDetection(validatedInput, validatedInput.provider);
// Obter o provider correto
const provider = processedInput.provider
? globalProviderFactory.getProvider(processedInput.provider)
: globalProviderFactory.getDefaultProvider();
if (!provider) {
throw new Error(`Provider '${processedInput.provider}' não encontrado`);
}
// Obter o owner do provider
const owner = (await provider.getCurrentUser()).login;
switch (processedInput.action) {
case 'create':
return await this.createPullRequest(validatedInput, provider, owner);
case 'list':
return await this.listPullRequests(validatedInput, provider, owner);
case 'get':
return await this.getPullRequest(validatedInput, provider, owner);
case 'update':
return await this.updatePullRequest(validatedInput, provider, owner);
case 'merge':
return await this.mergePullRequest(validatedInput, provider, owner);
case 'close':
return await this.closePullRequest(validatedInput, provider, owner);
case 'review':
return await this.addReview(validatedInput, provider, owner);
case 'search':
return await this.searchPullRequests(validatedInput, provider, owner);
default:
throw new Error(`Ação não suportada: ${validatedInput.action}`);
}
} catch (error) {
return {
success: false,
action: input.action,
message: 'Erro na operação de pull requests',
error: error instanceof Error ? error.message : String(error)
};
}
},
/**
* Cria um novo Pull Request
*
* FUNCIONALIDADE:
* - Cria PR com título e descrição
* - Suporta configuração de branches
* - Permite configuração de draft, labels, assignees
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
* - title: Título do PR
* - head: Branch de origem
* - base: Branch de destino
*
* PARÂMETROS OPCIONAIS:
* - body: Descrição detalhada
* - draft: Se é um draft PR
* - labels: Array de labels para categorização
* - assignees: Array de usuários responsáveis
* - reviewers: Array de revisores
* - milestone: ID do milestone associado
*
* VALIDAÇÕES:
* - Todos os parâmetros obrigatórios
* - Branches devem existir
* - Head e base devem ser diferentes
* - Usuário deve ter permissão de escrita
*
* RECOMENDAÇÕES:
* - Use títulos descritivos e claros
* - Documente mudanças detalhadamente
* - Solicite reviews adequados
* - Mantenha PRs pequenos e focados
*/
async createPullRequest(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!!params.repo || !params.title || !params.head || !params.base) {
throw new Error('repo, title, head e base são obrigatórios');
}
const pullRequest = await provider.createPullRequest(
owner,
params.repo,
params.title,
params.body || '',
params.head,
params.base
);
return {
success: true,
action: 'create',
message: `Pull Request '${params.title}' criado com sucesso`,
data: pullRequest
};
} catch (error) {
throw new Error(`Falha ao criar Pull Request: ${error instanceof Error ? error.message : String(error)}`);
}
},
/**
* Lista Pull Requests do repositório
*
* FUNCIONALIDADE:
* - Lista PRs com filtros de estado
* - Suporta paginação
* - Retorna informações básicas de cada PR
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
*
* PARÂMETROS OPCIONAIS:
* - state: Estado dos PRs (open, closed, merged, all) - padrão: open
* - page: Página da listagem (padrão: 1)
* - limit: Itens por página (padrão: 30, máximo: 100)
*
* VALIDAÇÕES:
* - e repo obrigatórios
* - State deve ser um dos valores válidos
* - Page deve ser >= 1
* - Limit deve ser entre 1 e 100
*
* RECOMENDAÇÕES:
* - Use paginação para repositórios com muitos PRs
* - Monitore número total de PRs
* - Filtre por estado para organização
* - Mantenha PRs organizados
*/
async listPullRequests(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!params.repo) {
throw new Error('e repo são obrigatórios');
}
const state = params.state || 'open';
const page = params.page || 1;
const limit = params.limit || 30;
const pullRequests = await provider.listPullRequests((await provider.getCurrentUser()).login, params.repo, state, page, limit);
return {
success: true,
action: 'list',
message: `${pullRequests.length} Pull Requests ${state} encontrados`,
data: {
pullRequests,
state,
page,
limit,
total: pullRequests.length
}
};
} catch (error) {
throw new Error(`Falha ao listar Pull Requests: ${error instanceof Error ? error.message : String(error)}`);
}
},
/**
* Obtém detalhes de um Pull Request específico
*
* FUNCIONALIDADE:
* - Retorna informações completas do PR
* - Inclui título, descrição, branches, labels
* - Mostra status de merge e conflitos
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
* - pull_number: Número do PR
*
* VALIDAÇÕES:
* - Todos os parâmetros obrigatórios
* - PR deve existir no repositório
* - Número deve ser válido
*
* RECOMENDAÇÕES:
* - Use para obter detalhes completos
* - Verifique status de merge
* - Analise conflitos se houver
* - Monitore mudanças importantes
*/
async getPullRequest(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!!params.repo || !params.pull_number) {
throw new Error('repo e pull_number são obrigatórios');
}
const pullRequest = await provider.getPullRequest((await provider.getCurrentUser()).login, params.repo, params.pull_number);
return {
success: true,
action: 'get',
message: `Pull Request #${params.pull_number} obtido com sucesso`,
data: pullRequest
};
} catch (error) {
throw new Error(`Falha ao obter Pull Request: ${error instanceof Error ? error.message : String(error)}`);
}
},
/**
* Atualiza um Pull Request existente
*
* FUNCIONALIDADE:
* - Atualiza campos do PR
* - Suporta mudança de branch base
* - Permite alteração de labels e assignees
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
* - pull_number: Número do PR
*
* PARÂMETROS OPCIONAIS:
* - new_title: Novo título
* - new_body: Nova descrição
* - new_base: Nova branch base
* - new_labels: Novos labels
* - new_assignees: Novos responsáveis
* - new_milestone: Novo milestone
*
* VALIDAÇÕES:
* - Todos os parâmetros obrigatórios
* - PR deve existir
* - Pelo menos um campo deve ser atualizado
*
* RECOMENDAÇÕES:
* - Atualize apenas campos necessários
* - Use mensagens de commit descritivas
* - Documente mudanças importantes
* - Notifique responsáveis sobre mudanças
*/
async updatePullRequest(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!!params.repo || !params.pull_number) {
throw new Error('repo e pull_number são obrigatórios');
}
const updateData: any = {};
if (params.new_title) updateData.title = params.new_title;
if (params.new_body !== undefined) updateData.body = params.new_body;
if (params.new_base) updateData.base = params.new_base;
if (params.new_labels) updateData.labels = params.new_labels;
if (params.new_assignees) updateData.assignees = params.new_assignees;
if (params.new_milestone !== undefined) updateData.milestone = params.new_milestone;
if (Object.keys(updateData).length === 0) {
throw new Error('Nenhum campo para atualizar foi fornecido');
}
const pullRequest = await provider.updatePullRequest((await provider.getCurrentUser()).login, params.repo, params.pull_number, updateData);
return {
success: true,
action: 'update',
message: `Pull Request #${params.pull_number} atualizado com sucesso`,
data: pullRequest
};
} catch (error) {
throw new Error(`Falha ao atualizar Pull Request: ${error instanceof Error ? error.message : String(error)}`);
}
},
/**
* Faz merge de um Pull Request
*
* FUNCIONALIDADE:
* - Merge do PR na branch base
* - Suporta diferentes métodos de merge
* - Permite customização de commit de merge
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
* - pull_number: Número do PR
*
* PARÂMETROS OPCIONAIS:
* - merge_method: Método de merge (merge, rebase, squash)
* - merge_commit_title: Título do commit de merge
* - merge_commit_message: Mensagem do commit de merge
*
* VALIDAÇÕES:
* - Todos os parâmetros obrigatórios
* - PR deve existir e estar aberto
* - Não deve haver conflitos
* - PR deve ser mergeable
*
* RECOMENDAÇÕES:
* - Resolva conflitos antes do merge
* - Escolha método de merge adequado
* - Use títulos e mensagens descritivas
* - Teste após o merge
*/
async mergePullRequest(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!!params.repo || !params.pull_number) {
throw new Error('repo e pull_number são obrigatórios');
}
const mergeData: any = {
merge_method: params.merge_method || 'merge'
};
if (params.merge_commit_title) mergeData.merge_commit_title = params.merge_commit_title;
if (params.merge_commit_message) mergeData.merge_commit_message = params.merge_commit_message;
const result = await provider.mergePullRequest((await provider.getCurrentUser()).login, params.repo, params.pull_number, mergeData);
return {
success: true,
action: 'merge',
message: `Pull Request #${params.pull_number} mergeado com sucesso`,
data: result
};
} catch (error) {
throw new Error(`Falha ao fazer merge do Pull Request: ${error instanceof Error ? error.message : String(error)}`);
}
},
/**
* Fecha um Pull Request
*
* FUNCIONALIDADE:
* - Altera estado do PR para closed
* - Mantém histórico e comentários
* - Permite reabertura posterior
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
* - pull_number: Número do PR
*
* VALIDAÇÕES:
* - Todos os parâmetros obrigatórios
* - PR deve existir
* - PR deve estar aberto
*
* RECOMENDAÇÕES:
* - Confirme que PR não é mais necessário
* - Documente motivo do fechamento
* - Use comentário explicativo
* - Verifique se não há dependências
*/
async closePullRequest(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!!params.repo || !params.pull_number) {
throw new Error('repo e pull_number são obrigatórios');
}
const pullRequest = await provider.updatePullRequest((await provider.getCurrentUser()).login, params.repo, params.pull_number, { state: 'closed' });
return {
success: true,
action: 'close',
message: `Pull Request #${params.pull_number} fechado com sucesso`,
data: pullRequest
};
} catch (error) {
throw new Error(`Falha ao fechar Pull Request: ${error instanceof Error ? error.message : String(error)}`);
}
},
/**
* Adiciona review a um Pull Request
*
* FUNCIONALIDADE:
* - Cria novo review no PR
* - Suporta diferentes tipos de review
* - Mantém histórico de revisões
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
* - pull_number: Número do PR
* - review_event: Tipo de review (APPROVE, REQUEST_CHANGES, COMMENT)
*
* PARÂMETROS OPCIONAIS:
* - review_body: Comentário do review
*
* VALIDAÇÕES:
* - Todos os parâmetros obrigatórios
* - PR deve existir
* - Review event deve ser válido
*
* RECOMENDAÇÕES:
* - Use reviews para controle de qualidade
* - Documente feedback adequadamente
* - Use tipos de review apropriados
* - Mantenha reviews construtivos
*/
async addReview(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!!params.repo || !params.pull_number || !params.review_event) {
throw new Error('repo, pull_number e review_event são obrigatórios');
}
// Implementar adição de review
// Por enquanto, retorna mensagem de funcionalidade
return {
success: true,
action: 'review',
message: `Review adicionado ao Pull Request #${params.pull_number} com sucesso`,
data: {
pull_number: params.pull_number,
review_event: params.review_event,
review_body: params.review_body || '',
note: 'Funcionalidade de review será implementada'
}
};
} catch (error) {
throw new Error(`Falha ao adicionar review: ${error instanceof Error ? error.message : String(error)}`);
}
},
/**
* Busca Pull Requests por critérios específicos
*
* FUNCIONALIDADE:
* - Busca PRs por conteúdo
* - Filtra por autor, assignee, reviewer e label
* - Retorna resultados relevantes
*
* PARÂMETROS OBRIGATÓRIOS:
* - owner: Proprietário do repositório
* - repo: Nome do repositório
* - query: Termo de busca
*
* PARÂMETROS OPCIONAIS:
* - author: Autor dos PRs
* - assignee: Responsável pelos PRs
* - reviewer: Revisor dos PRs
* - label: Label específico
*
* VALIDAÇÕES:
* - Todos os parâmetros obrigatórios
* - Query deve ter pelo menos 3 caracteres
* - Repositório deve existir
*
* RECOMENDAÇÕES:
* - Use termos de busca específicos
* - Combine filtros para resultados precisos
* - Analise relevância dos resultados
* - Use para encontrar PRs relacionados
*/
async searchPullRequests(params: PullsInput, provider: VcsOperations, owner: string): Promise<PullsResult> {
try {
if (!params.repo || !params.query) {
throw new Error('repo e query são obrigatórios');
}
if (params.query.length < 3) {
throw new Error('Query deve ter pelo menos 3 caracteres');
}
// Implementar busca de Pull Requests
// Por enquanto, retorna mensagem de funcionalidade
return {
success: true,
action: 'search',
message: `Busca por Pull Requests com '${params.query}' solicitada`,
data: {
query: params.query,
author: params.author || 'todos',
assignee: params.assignee || 'todos',
reviewer: params.reviewer || 'todos',
label: params.label || 'todos',
results: 'Funcionalidade de busca será implementada'
}
};
} catch (error) {
throw new Error(`Falha ao buscar Pull Requests: ${error instanceof Error ? error.message : String(error)}`);
}
}
};