Initial commit
This commit is contained in:
250
skills/bugsnag/bugsnag.rb
Executable file
250
skills/bugsnag/bugsnag.rb
Executable file
@@ -0,0 +1,250 @@
|
||||
#!/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 <error_id>` / `детали <id>` - Полная информация об ошибке
|
||||
• Пример: `details 5f8a9b2c`
|
||||
|
||||
✅ **Управление статусами:**
|
||||
• `resolve <error_id>` / `resolve-error <id>` / `отметить <id>` - Отметить как выполненную
|
||||
• Пример: `resolve 5f8a9b2c`
|
||||
|
||||
📊 **События ошибки:**
|
||||
• `events <error_id> [limit]` / `события <id> [лимит]` - Показать события
|
||||
• Пример: `events 5f8a9b2c 5`
|
||||
|
||||
📈 **Анализ:**
|
||||
• `analyze` / `analysis` / `анализ` - Анализ паттернов ошибок
|
||||
|
||||
💬 **Комментарии:**
|
||||
• `comment <error_id> "message"` / `комментарий <id> "текст"` - Добавить комментарий
|
||||
• `comments <error_id>` / `комментарии <id>` - Показать все комментарии
|
||||
|
||||
🏢 **Организации:**
|
||||
• `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)
|
||||
Reference in New Issue
Block a user