#!/usr/bin/env ruby require_relative 'bugsnag_helper' class BugsnagCLI def initialize @helper = BugsnagHelper.new rescue StandardError => e puts "❌ Ошибка инициализации: #{e.message}" puts "" puts "Убедитесь что установлены переменные окружения:" puts "export BUGSNAG_DATA_API_KEY='your_api_key' # Обязательно для всех команд" puts "export BUGSNAG_PROJECT_ID='your_project_id' # Обязательно только для команд работы с ошибками" puts "" puts "💡 Команды 'organizations' и 'projects' работают без BUGSNAG_PROJECT_ID" exit 1 end def run(args = []) if args.empty? puts show_help return end command = args[0].downcase case command when 'list', 'errors', 'show', 'показать', 'список' list_errors(args[1..-1]) when 'open', 'открыть', 'opened', 'открытые' show_open_errors(args[1..-1]) when 'details', 'error', 'детали' show_error_details(args[1]) when 'resolve', 'close', 'resolve-error', 'отметить', 'решить' resolve_error(args[1]) when 'events', 'события' show_events(args[1], args[2]) when 'analyze', 'analysis', 'анализ', 'проанализировать' analyze_errors when 'organizations', 'orgs', 'организации' list_organizations when 'projects', 'проекты' list_projects when 'comment', 'комментарий' add_error_comment(args[1], args[2..-1].join(' ')) when 'comments', 'комментарии' show_error_comments(args[1]) when 'help', 'помощь', 'h' puts show_help else puts "❌ Неизвестная команда: #{command}" puts show_help end rescue StandardError => e puts "❌ Ошибка выполнения: #{e.message}" end private def list_errors(options = []) limit = extract_option('--limit', options) || 20 status = extract_option('--status', options) severity = extract_option('--severity', options) puts "📋 Получение списка ошибок..." puts "" result = @helper.list_errors(limit: limit.to_i, status: status, severity: severity) puts result end def show_open_errors(options = []) limit = extract_option('--limit', options) || 20 severity = extract_option('--severity', options) puts "📋 Получение списка **открытых** ошибок..." puts "" result = @helper.list_errors(limit: limit.to_i, status: 'open', severity: severity) puts result end def show_error_details(error_id) unless error_id puts "❌ Укажите ID ошибки" puts "Пример: bugsnag-lookuper details 5f8a9b2c" return end puts "🔍 Получение деталей ошибки #{error_id}..." puts "" result = @helper.get_error_details(error_id) puts result # Также покажем последние события puts "" puts "📊 **Последние события:**" events_result = @helper.get_error_events(error_id, 3) puts events_result end def resolve_error(error_id) unless error_id puts "❌ Укажите ID ошибки для пометки как выполненной" puts "Пример: bugsnag-lookuper resolve 5f8a9b2c" return end puts "🔄 Пометка ошибки #{error_id} как выполненной..." result = @helper.resolve_error(error_id) puts result end def show_events(error_id, limit = nil) unless error_id puts "❌ Укажите ID ошибки" puts "Пример: bugsnag-lookuper events 5f8a9b2c 5" return end event_limit = limit&.to_i || 10 puts "📊 Получение событий ошибки #{error_id} (лимит: #{event_limit})..." puts "" result = @helper.get_error_events(error_id, limit: event_limit) puts result end def analyze_errors puts "📈 Анализ ошибок в проекте..." puts "" result = @helper.analyze_errors puts result end def list_organizations puts "🏢 Получение списка организаций..." puts "" result = @helper.list_organizations puts result end def list_projects puts "📦 Получение списка проектов..." puts "" result = @helper.list_projects puts result end def add_error_comment(error_id, message) unless error_id && !message.empty? puts "❌ Укажите ID ошибки и текст комментария" puts "Пример: bugsnag.rb comment 5f8a9b2c 'Investigating this issue'" return end puts "💬 Добавление комментария к ошибке #{error_id}..." result = @helper.add_comment(error_id, message) puts result end def show_error_comments(error_id) unless error_id puts "❌ Укажите ID ошибки" puts "Пример: bugsnag.rb comments 5f8a9b2c" return end puts "💬 Получение комментариев для ошибки #{error_id}..." puts "" result = @helper.list_comments(error_id) puts result end def show_help <<~HELP 🚀 **Bugsnag** - Инструмент для работы с Bugsnag API **Использование:** `skill: "bugsnag" "<команда> [аргументы]"` **Команды:** 📋 **Просмотр ошибок:** • `list` / `show` / `показать` - Список всех ошибок • `open` / `открыть` / `открытые` - Только **открытые** ошибки • `list --limit 50` - Показать до 50 ошибок • `list --status open` - Только открытые ошибки • `list --severity error` - Только ошибки (не предупреждения) 🔍 **Детали ошибки:** • `details ` / `детали ` - Полная информация об ошибке • Пример: `details 5f8a9b2c` ✅ **Управление статусами:** • `resolve ` / `resolve-error ` / `отметить ` - Отметить как выполненную • Пример: `resolve 5f8a9b2c` 📊 **События ошибки:** • `events [limit]` / `события [лимит]` - Показать события • Пример: `events 5f8a9b2c 5` 📈 **Анализ:** • `analyze` / `analysis` / `анализ` - Анализ паттернов ошибок 💬 **Комментарии:** • `comment "message"` / `комментарий "текст"` - Добавить комментарий • `comments ` / `комментарии ` - Показать все комментарии 🏢 **Организации:** • `organizations` / `orgs` / `организации` - Список всех организаций 📦 **Проекты:** • `projects` / `проекты` - Список всех проектов ❓ **Справка:** • `help` / `помощь` / `h` - Показать эту справку **Настройка:** ```bash export BUGSNAG_DATA_API_KEY="your_api_key" # Обязательно для всех команд export BUGSNAG_PROJECT_ID="your_project_id" # Обязательно для команд работы с ошибками ``` 💡 **Важно:** Команды `organizations` и `projects` работают **БЕЗ** BUGSNAG_PROJECT_ID. Используйте их для получения списка доступных проектов и их ID. HELP end def extract_option(option_name, options) index = options.find_index { |opt| opt.start_with?(option_name) } return nil unless index option = options[index] value = nil if option.include?('=') value = option.split('=', 2)[1] options.delete_at(index) elsif options[index + 1] && !options[index + 1].start_with?('--') value = options.delete_at(index + 1) options.delete_at(index) else options.delete_at(index) end value end end # Handle execution through MCP or direct CLI cli = BugsnagCLI.new cli.run(ARGV)