GoTickets - это простой и эффективный менеджер тикетов с интерактивным терминальным интерфейсом, написанный на Go.
GoTickets позволяет:
- Создавать и управлять тикетами с названием и ссылкой прямо из терминала
- Искать тикеты по названию и URL
- Удалять тикеты с подтверждением
- Открывать тикеты в браузере по ссылке
- Сохранять данные локально в формате JSON
- Работать с красивым интерактивным интерфейсом
Приложение использует библиотеку Bubble Tea для создания современного TUI интерфейса и Lipgloss для стилизации.
# Добавить tap
brew tap curkan/homebrew-public
# Установить gotickets
brew install gotickets# Клонируйте репозиторий
git clone <url-репозитория>
cd gotickets
# Установите зависимости
go mod tidy
# Соберите приложение
go build -o gotickets ./cmd/gotickets
# Или запустите напрямую
go run ./cmd/gotickets- Go 1.21 или выше
- Терминал с поддержкой ANSI цветов
# Если собрали бинарник
./gotickets
# Или запуск из исходников
go run .Приложение имеет семь основных режимов:
Навигация по тикетам:
↑/k- переместить курсор вверх↓/j- переместить курсор вниз
Навигация по списку:
PgUp/Ctrl+B- страница вверхPgDn/Ctrl+F- страница внизHome/Ctrl+A- к началу спискаEnd/Ctrl+E- к концу списка
Управление тикетами:
a- добавить новый тикет/- поиск тикетовr- сбросить фильтры и показать все тикетыd- удалить выбранный тикет (с подтверждением)o- открыть ссылку выбранного тикета в браузереi- импорт тикетов из текстового файлаb- управление резервными копиямиqилиCtrl+C- выход из приложения
Добавление тикета происходит в два этапа:
Шаг 1 - Ввод ссылки:
- Введите URL/ссылку для тикета
Enter- продолжить к вводу названияEsc- отменить и вернуться к спискуBackspace- удалить последний символ
Шаг 2 - Ввод названия:
- Введите название тикета
Enter- сохранить тикетEsc- отменить и вернуться к спискуBackspace- удалить последний символ
- Введите поисковый запрос (поиск происходит в реальном времени)
- Поиск ищет совпадения в названии и URL тикетов
Enter- применить фильтр и вернуться к спискуEsc- отменить поиск и вернуться к полному спискуBackspace- удалить последний символ
- Отображается информация о тикете для удаления
yилиEnter- подтвердить удалениеnилиEsc- отменить удаление
- Введите полный путь к .txt файлу
Enter- начать импортEsc- отменить импорт
- Отображается список доступных резервных копий
Enter- выбрать резервную копию для восстановленияEsc- вернуться к списку тикетов
- Отображается информация о выбранной резервной копии
yилиEnter- подтвердить восстановлениеnилиEsc- отменить восстановление
Каждая строка в файле должна содержать:
URL - Название тикета
Примеры правильного формата:
https://tracker.egamings.com/issues/424846 - [Fundist] большой отступ от Iframe angular снизу
https://github.com/user/repo/issues/123 - Исправить баг с авторизацией
https://example.com/task/456 - Добавить новую функцию
Особенности импорта:
- Дубликаты определяются по URL - если тикет с такой ссылкой уже существует, он не будет добавлен повторно
- Строки с неверным форматом (без " - " разделителя) будут пропущены и отмечены как ошибки
- Пустые строки игнорируются
- После импорта отображается детальная статистика:
- Количество добавленных тикетов
- Количество пропущенных дубликатов
- Количество ошибок формата
- Список конкретных ошибок
Приложение использует встроенный компонент списка Bubble Tea для удобной навигации:
- Навигация: используйте стрелки
↑/↓,j/k,PgUp/PgDn,Home/Endдля перемещения по списку - Автоскролл: список автоматически прокручивается при навигации
- Встроенная фильтрация: компонент списка поддерживает встроенные возможности фильтрации
- Производительность: эффективная обработка больших списков тикетов
Все тикеты сохраняются в файле ~/.gotickets/tickets.json. Приложение автоматически:
- Создает директорию при первом запуске
- Сохраняет изменения после добавления тикетов
- Загружает данные при запуске
Приложение автоматически создает резервные копии перед критическими операциями:
- Добавление тикета - создается бекап перед добавлением
- Удаление тикета - создается бекап перед удалением
- Импорт тикетов - создается бекап перед импортом
Особенности системы бекапов:
- Бекапы сохраняются в формате
tickets_backup_YYYY-MM-DD_HH-MM-SS.json - Бекапы содержат полную копию данных на момент создания
- Восстановление из бекапа заменяет все текущие тикеты
- Бекапы можно просматривать и восстанавливать через интерфейс приложения (клавиша
b)
Безопасность:
- Тесты не влияют на реальные данные пользователя
- Все тесты используют изолированные временные директории
- Система бекапов защищает от случайной потери данных
gotickets/
├── cmd/
│ └── gotickets/
│ └── main.go # Точка входа в приложение
├── pkg/
│ └── gotickets/ # Публичный API пакет
│ ├── ticket.go # Обертки для работы с тикетами
│ └── ui.go # UI обертки и модель
├── internal/ # Внутренние пакеты
│ ├── storage/ # Пакет для работы с данными
│ │ └── storage.go # Модели данных и файловые операции
│ └── ui/ # Пакет пользовательского интерфейса
│ ├── model.go # Основная модель UI
│ ├── list.go # Управление списком тикетов
│ ├── input.go # Компоненты ввода
│ ├── handlers.go # Обработчики событий
│ ├── search.go # Функциональность поиска
│ ├── confirm.go # Диалоги подтверждения
│ ├── import.go # Импорт тикетов
│ ├── backup.go # Управление резервными копиями
│ ├── browser.go # Интеграция с браузером
│ └── view.go # Рендеринг представлений
├── test/ # Тестовые пакеты
│ ├── mocks/ # Моки для тестирования
│ │ └── filesystem.go # Mock файловой системы
│ ├── unit/ # Unit тесты
│ │ ├── storage_test.go # Тесты storage пакета
│ │ └── ui_test.go # Тесты UI пакета
│ └── integration/ # Интеграционные тесты
│ └── ticket_types_test.go # Тесты типов данных
├── go.mod # Зависимости Go
├── go.sum # Контрольные суммы зависимостей
└── README.md # Документация
# Запустить все тесты
go test ./test/...
# Запустить только unit тесты
go test ./test/unit/ -v
# Запустить только интеграционные тесты
go test ./test/integration/ -v
# Запустить тесты несколько раз для проверки стабильности
go test ./test/... -v -count=3Все тесты полностью изолированы от реальной среды выполнения:
- MockFileSystem: Создается мок файловой системы, который эмулирует все операции с файлами
- Временные директории: Каждый тест использует
t.TempDir()для создания изолированной временной директории - Подмена глобальной переменной: Глобальная переменная
fileSystemзаменяется на мок для каждого теста - Автоматическая очистка: Все временные файлы и директории автоматически удаляются после завершения тестов
- Безопасность: Тесты никогда не взаимодействуют с реальными данными пользователя
Архитектура изоляции:
- FileSystem interface: Определяет интерфейс для операций с файлами
- RealFileSystem: Реальная реализация для production
- MockFileSystem: Мок-реализация для тестов с полным контролем над файловыми операциями
- Глобальная переменная fileSystem: Позволяет подменять реализацию в тестах
Особенности изоляции:
- Тесты могут выполняться параллельно без конфликтов
- Каждый тест получает чистую среду выполнения
- Файлы создаются только во временных директориях через мок
- Реальные данные пользователя полностью защищены
- Мок позволяет контролировать ошибки файловых операций для тестирования edge cases
# Сборка для текущей платформы
go build -o gotickets ./cmd/gotickets
# Кросс-компиляция для разных платформ
GOOS=linux GOARCH=amd64 go build -o gotickets-linux-amd64 ./cmd/gotickets
GOOS=windows GOARCH=amd64 go build -o gotickets-windows-amd64.exe ./cmd/gotickets
GOOS=darwin GOARCH=amd64 go build -o gotickets-darwin-amd64 ./cmd/goticketsПриложение построено на модульной архитектуре с разделением обязанностей:
- cmd/gotickets: Точка входа в приложение (main пакет)
- pkg/gotickets: Публичный API пакет с обертками для внешнего использования
- internal/storage: Управление данными и файловыми операциями
Ticket- структура отдельного тикета (ID, название, URL, время создания)TicketStorage- хранилище тикетов с методами CRUD и поискаFileSystem- интерфейс для абстракции файловых операций
- internal/ui: Пользовательский интерфейс
Model- состояние приложения для Bubble TeaViewMode- перечисление режимов интерфейса- Модульная система обработчиков для разных режимов
- test/: Организованная структура тестов
mocks/- Моки для тестированияunit/- Unit тестыintegration/- Интеграционные тесты
- Разделение обязанностей: Каждый модуль отвечает за свою область
- Dependency Injection: Использование интерфейсов для тестируемости
- Модульность: UI разбит на логические компоненты
- Инкапсуляция: Приватные методы и состояние в internal пакетах
- Обратная совместимость: Публичные обертки для существующего API
- ✅ Поддержка URL: Теперь каждый тикет содержит ссылку
- ✅ Двухэтапное создание: Сначала вводится URL, затем название
- ✅ Удаление с подтверждением: Безопасное удаление тикетов
- ✅ Открытие в браузере: Клавиша 'o' открывает ссылку тикета
- ✅ Расширенный поиск: Поиск по названию и URL
- ✅ Импорт тикетов: Массовый импорт из .txt файлов
- ✅ Обнаружение дубликатов: Автоматическая проверка по URL
- ✅ Детальная статистика: Полный отчет о результатах импорта
- ✅ Обработка ошибок: Информативные сообщения об ошибках формата
- ✅ Компонент списка Bubble Tea: Использование встроенного list компонента для лучшей производительности
- ✅ Встроенная навигация: Навигация по списку с помощью стрелок, j/k, Page Up/Page Down
- ✅ Встроенная фильтрация: Поддержка встроенного поиска/фильтрации списка
- ✅ Улучшенный UI: Более стабильный и отзывчивый интерфейс
- ✅ Система резервных копий: Автоматическое создание бекапов перед критическими операциями
- ✅ Управление бекапами: Просмотр и восстановление из резервных копий через интерфейс
- ✅ Автоматические бекапы: Создание бекапов перед добавлением, удалением и импортом тикетов
- ✅ Безопасное восстановление: Подтверждение перед восстановлением из бекапа
- ✅ Формат бекапов: Сохранение в формате
tickets_backup_YYYY-MM-DD_HH-MM-SS.json - ✅ Полная изоляция тестов: Все тесты работают в изолированной среде без влияния на реальные данные
- ✅ Модульная архитектура: Код разделен на логические модули в internal пакетах
- ✅ Улучшенная тестируемость: Полное внедрение зависимостей и интерфейсов
- ✅ Разделение обязанностей: UI и storage логика четко разделены
- ✅ Чистый код: Следование лучшим практикам Go
- ✅ Инкапсуляция: Приватные методы и поля защищены от внешнего доступа
- ✅ Обратная совместимость: Все публичные API остались неизменными
- ✅ Модульные тесты: Упрощенные и более надежные тесты
- ✅ Организованная структура тестов: Разделение на unit, integration и mocks
- ✅ Улучшенная архитектура: Single Responsibility Principle и SOLID принципы
- ✅ Стандартная структура Go проекта: cmd/, pkg/, internal/, test/
- Внедрение зависимостей: FileSystem интерфейс для моков в тестах
- Модульные handlers: Каждый режим UI имеет отдельный обработчик
- Компонентизация UI: Разделение на логические компоненты (list, input, view)
- Чистые интерфейсы: Минимальные публичные API
- Улучшенная архитектура пакетов: internal/ структура для инкапсуляции
MIT License