UNPKG

gaunt-sloth-assistant

Version:

[![Tests and Lint](https://github.com/Galvanized-Pukeko/gaunt-sloth-assistant/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/Galvanized-Pukeko/gaunt-sloth-assistant/actions/workflows/unit-tests.yml) [![Integration Tests](https://github.co

63 lines 3.6 kB
import { Option } from 'commander'; import { getContentFromProvider, getRequirementsFromProvider, REQUIREMENTS_PROVIDERS, } from './commandUtils.js'; import jiraLogWork from '#src/helpers/jira/jiraLogWork.js'; import { readBackstory, readGuidelines, readReviewInstructions, readSystemPrompt, wrapContent, } from '#src/utils/llmUtils.js'; import { readMultipleFilesFromProjectDir } from '#src/utils/fileUtils.js'; export function prCommand(program, commandLineConfigOverrides) { program .command('pr') .description('Review provided Pull Request in current directory. ' + 'This command is similar to `review`, but default content provider is `github`. ' + '(assuming that GitHub CLI is installed and authenticated for current project') .argument('<prId>', 'Pull request ID to review.') .argument('[requirementsId]', 'Optional requirements ID argument to retrieve requirements with requirements provider') .addOption(new Option('-p, --requirements-provider <requirementsProvider>', 'Requirements provider for this review.').choices(Object.keys(REQUIREMENTS_PROVIDERS))) .option('-f, --file [files...]', 'Input files. Content of these files will be added BEFORE the diff, but after requirements') .option('-m, --message <message>', 'Extra message to provide just before the content') .action(async (prId, requirementsId, options) => { const { initConfig } = await import('#src/config.js'); const config = await initConfig(commandLineConfigOverrides); // Initialize and get config const systemPrompt = readSystemPrompt(config); const systemMessage = [ readBackstory(config), readGuidelines(config), readReviewInstructions(config), ]; if (systemPrompt) { systemMessage.push(systemPrompt); } const content = []; const requirementsProvider = options.requirementsProvider ?? config?.commands?.pr?.requirementsProvider ?? config?.requirementsProvider; const contentProvider = config?.commands?.pr?.contentProvider ?? config?.contentProvider ?? 'github'; if (options.file) { content.push(readMultipleFilesFromProjectDir(options.file)); } // Handle requirements const requirements = await getRequirementsFromProvider(requirementsProvider, requirementsId, config); if (requirements) { content.push(requirements); } // Get PR diff using the provider content.push(await getContentFromProvider(contentProvider, prId, config)); if (options.message) { content.push(wrapContent(options.message, 'message', 'user message')); } const { review } = await import('#src/modules/reviewModule.js'); // TODO consider including requirements id // TODO sanitize prId await review(`PR-${prId}`, systemMessage.join('\n'), content.join('\n'), config, 'pr'); if (requirementsId && (config.commands?.pr?.requirementsProvider ?? config.requirementsProvider) === 'jira' && config.commands?.pr?.logWorkForReviewInSeconds) { // TODO we need to figure out some sort of post-processors let jiraConfig = config.builtInToolsConfig?.jira || config.requirementsProviderConfig?.jira; await jiraLogWork(jiraConfig, requirementsId, config.commands?.pr?.logWorkForReviewInSeconds, 'code review'); } }); } //# sourceMappingURL=prCommand.js.map