Skip to content

Repository files navigation

⚡ glw

Задачи GitLab, не выходя из терминала

Создавайте задачи из markdown-файлов, редактируйте любые поля одной строкой,
ведите учёт времени и закрывайте десятки задач разом.

ReleaseBunTypeScriptZero DependenciesTestsGitLab GraphQLAgent Skill

Быстрый стартВозможностиМассовые операцииAI-агентыСправочник


$ glw update --search "refactor:" --status "In progress" --dry-runFound 4 work item(s): #38 [opened] refactor: вынести API-клиент в отдельный модуль (backend) @alice #41 [opened] refactor: упростить конфигурацию окружений (devops) @bob #45 [opened] refactor: убрать дублирование в тестах (tests) #47 [opened] refactor: типизация ответов GraphQL (backend) @alice
$ glw update --search "refactor:" --status "In progress" --yesUpdated #38 refactor: вынести API-клиент в отдельный модульUpdated #41 refactor: упростить конфигурацию окруженийUpdated #45 refactor: убрать дублирование в тестахUpdated #47 refactor: типизация ответов GraphQL

✨ Возможности

📝 Задачи из markdownПишете обычный .md с YAML-шапкой — получаете оформленную задачу
🔧 Все поля задачиНазвание, описание, статус, исполнитель, метки, вес, даты, время
🔗 Связи и иерархияРодитель/дети и связи related / blocks / blocked-by между задачами
🔥 Массовые операцииВыборка фильтром → превью → одно подтверждение → готово
⏱️ Учёт времениglw estimate 42 2h, glw spend 42 1h30m --summary "ревью"
🔍 Умный поискПо названию, описанию, датам — фильтры комбинируются
🌍 Глобальное окружениеОдин конфиг в %APPDATA%/glw — работает из любой папки
⌨️ Автодополнениеbash / zsh / PowerShell, включая пути проектов
🤖 Agent Skill в комплектеAI-агенты управляют вашим бэклогом по навыку из коробки
🚀 Ноль зависимостейBun + TypeScript, нативный fetch — нечему ломаться
📊 Статусы Work ItemsGraphQL API: To do / In progress / Done — то, чего нет в REST

🚀 Быстрый старт

# 1. Установить
bun install && bun link
# 2. Подключить GitLab (токен: Settings → Access Tokens, scope "api")
glw config url https://gitlab.example.com
glw config token glpat-xxxxxxxxxxxxxxxx
# 3. Выбрать проект
glw projects # что мне доступно?
glw use backend-api # достаточно короткого имени# 4. Поехали
glw whoami
glw list
💡 Хочу один конфиг для всех папок
glw global on # включить глобальный режим
glw init glpat-xxx # конфиг и токен лягут в %APPDATA%/glw (~/.config/glw на POSIX)

Теперь glw работает из любой директории. Локальные конфиги в папках проектов по-прежнему главнее (как у git: local > global). Подробности — в справочнике.

📋 Повседневная работа

Создать задачу из файла:

---title: Реализовать авторизациюlabels: backend, securityassignee: @meweight: 8estimate: 3hdue: 2026-07-31status: To do---## Описание
Нужно реализовать JWT-авторизацию.
glw create issue.md

Нет шапки? Заголовком станет первый # заголовок. Подойдёт и .txt, и .json.

Смотреть, менять, закрывать:

glw list --assignee @me # мои открытые задачи
glw view 42 # всё о задаче #42
glw update 42 --status "In progress" --weight 5
glw update 42 --due none # "none" очищает поле
glw comment 42 "Проверено, работает"
glw close 42 --comment "Реализовано в MR !123"

Учёт времени:

glw estimate 42 2h
glw spend 42 1h30m --summary "code review"

Связи и иерархия:

# Иерархия (родитель/дети) — nest issues под эпик/родителя
glw parent 4 --to 3 # сделать #4 потомком #3
glw parent 4 5 6 --to 3 # добавить #4, #5, #6 как детей #3
glw parent 4 --to none # отвязать #4 от родителя# Связи между задачами
glw link 42 43 # #42 связана с #43 (related)
glw link 42 43 44 --type blocks # #42 блокирует #43 и #44
glw link 42 43 --type blocked-by # #42 заблокирована задачей #43
glw link 42 43 --remove # убрать связь между #42 и #43

glw view 42 показывает родителя, детей и счётчики блокировок.

Искать:

glw search "авторизация"# по названию и описанию
glw s --name auth --state all # алиас + только название

🔥 Массовые операции

Выбор фильтром, превью перед изменением, подтверждение — случайно снести полбэклога не выйдет:

# Что попадёт под изменение? (ничего не меняет)
glw update --search "refactor:" --status Done --dry-run
# Перевести все "refactor:" в In Progress
glw update --search "refactor:" --status "In progress"# Закрыть всё, что назначено на меня
glw close --filter-assignee @me
# Для скриптов и CI — пропустить подтверждение
glw close --filter-label obsolete --yes

Без TTY (CI, скрипты) команда без --yes безопасно отменится сама.

🤖 Для AI-агентов

В комплекте — готовый Agent Skill (skills/glw/): Claude Code, Cursor, Codex и другие агенты управляют вашим бэклогом по естественно-языковым запросам — «закрой все мои задачи», «поставь 2 часа на #42».

npx skills add Aver005/gitlab-worker

Навык учит агента проверять окружение, безопасно выполнять массовые операции (превью → подтверждение) и разбирать ошибки. Технические детали для разработки — в CLAUDE.md.

📖 Шпаргалка

КомандаАлиасЧто делает
glw init [token]iСоздать конфиг; с токеном — записать его в .env
glw config [key] [value]cfgПоказать/изменить настройки (url, project, tokenEnv, token)
glw global on|offОбщее окружение из %APPDATA%/glw для всех папок
glw whoamiКто я (проверка подключения)
glw projectspМои проекты
glw use <проект>Выбрать проект по умолчанию
glw listllsСписок задач
glw view <iid>vПодробности задачи
glw search <...>sПоиск задач по фильтрам
glw create <файл>crСоздать задачу из файла
glw update <iid...>uИзменить поля задач(и)
glw comment <iid>coДобавить комментарий
glw close [iid...]Закрыть задачи
glw reopen <iid...>Переоткрыть задачи
glw link <iid> <tgt...>lnСвязи между задачами (related/blocks/blocked-by)
glw parent <iid...> --toРодитель/дети (иерархия)
glw estimate <iid> <dur>Оценка времени
glw spend <iid> <dur>Залогировать время
glw completion <shell>Скрипт автодополнения

У каждой команды есть --help с полным списком флагов.

📚 Справочник

⚙️ Настройка и приоритет параметров

Откуда берутся параметры (по убыванию приоритета):

  1. Флаг --project у конкретной команды
  2. Переменные окружения: GITLAB_URL, GITLAB_TOKEN, GITLAB_PROJECT
  3. Файл .env в текущей директории
  4. glw.config.json в текущей директории
  5. Глобальные .env и glw.config.json из %APPDATA%/glw/ — если включён глобальный режим

Пример glw.config.json:

{
"url": "https://gitlab.example.com",
"project": "acme/internal/backend-api",
"tokenEnv": "GITLAB_TOKEN"
}

glw init [token] создаёт этот файл (существующий не трогает), а с аргументом-токеном записывает GITLAB_TOKEN=<token> в .env. Токен нужен с областью доступа api: https://ваш-gitlab/-/user_settings/personal_access_tokens.

Просмотр и правкаglw config (алиас cfg):

glw config # показать итоговую конфигурацию (токен замаскирован)
glw config url https://gitlab.example.com # задать значение
glw config token glpat-xxx # токен уходит в .env, а не в json
glw cfg url # прочитать одно значение
glw config project --unset # удалить ключ

Выбор проекта: везде, где принимается проект (glw use, --project), можно передавать полный путь (acme/internal/backend-api) или уникальное короткое имя (backend-api) — оно ищется среди ваших проектов: точный путь → точное имя → последний сегмент пути → уникальная подстрока. При неоднозначности glw покажет кандидатов.

🌍 Глобальное окружение — glw global
glw global on # включить; локальный конфиг из текущей папки скопируется в %APPDATA%/glw/, если там пусто
glw init glpat-xxx # при включённом режиме init пишет сразу в %APPDATA%/glw/
glw global status # что включено и какие файлы есть
glw global off # вернуться к локальным конфигам

При включённом режиме glw работает из любой директории. Локальные файлы по-прежнему главнее: если в папке проекта лежит свой glw.config.json или .env — используются они (как у git: local > global). glw use без локального конфига сохраняет проект в глобальный. Команды init и config пишут в глобальную папку автоматически (--local/--global задают цель явно). На POSIX-системах глобальная папка — ~/.config/glw/.

📃 glw projects — пагинация и сортировка
ФлагПо умолчаниюОписание
--search <q>Фильтр по имени
--limit <n>100Сколько проектов загрузить максимум
--per-page <n>30Размер страницы интерактивной пагинации
--sort az|zaazСортировка по пути (принимает и asc/desc)
--paginate / --no-paginateавтоПринудительно включить/выключить пагинацию
--jsonJSON-вывод (без пагинации)

Пагинация включается автоматически, когда вывод — терминал и результатов больше --per-page. Текущий проект помечен *. Успешный вызов обновляет кэш путей для автодополнения (%APPDATA%/glw/projects.json).

🔍 glw search — фильтры

Требуется хотя бы один фильтр; все условия объединяются через AND.

ФлагПо умолчаниюОписание
text (позиционный)Вхождение в заголовок или описание
--name <q>Заголовок содержит строку (без учёта регистра)
--body <q>Описание содержит строку
--start_time <d> / --start <d>Дата начала ≥ YYYY-MM-DD
--state <s>openedopened | closed | all
--limit <n>200Максимум загружаемых задач
glw search --name "auth" --body "JWT" --start_time 2026-01-01
glw s "bug" --state all --json
✏️ glw update / glw close — выборка и поля

Выборка: явные номера (glw update 42 43) или фильтры --search <q>, --filter-assignee <u|@me>, --filter-label <l>, --state <s>. При выборке фильтрами показывается список совпадений и запрашивается подтверждение (пропускается с --yes); --dry-run — только показать.

Поля: --title, --body / --body-file <f>, --status <имя>, --assignee <u|@me|none>, --labels <csv> (заменить все), --add-label / --remove-label (повторяемые), --weight <n|none>, --start <дата|none>, --due <дата|none>, --estimate <dur>, --spend <dur> (+ --summary). Значение none очищает поле.

При ошибке на отдельной задаче массовая операция продолжается, код выхода будет ненулевым.

glw close использует те же фильтры; --comment "<текст>" добавит комментарий перед закрытием. glw list: --state, --search, --assignee, --label, --limit (по умолчанию 50), --json.

📄 Форматы: файлы задач, длительности, статусы

Длительности (estimate/spend): 2h, 30m, 1h30m, 3d, 1w2d3h.

Статусы: To do, In progress, Done, Won't do, Duplicate (регистр не важен; проект может определять свои — при опечатке glw покажет доступные).

Файл задачи (glw create).md/.txt с YAML-шапкой между ---. Ключи: title, labels, assignees/assignee, weight, estimate, start/start_date, due/due_date, status, confidential, type. Если в шапке нет ни одного известного ключа (например, это шаблон GitLab с name:/about:) — весь файл, включая ----блок, станет описанием задачи.

.json-файл: те же поля плюс description/body:

{
"title": "Название задачи",
"description": "Описание",
"labels": ["bug", "v2"],
"assignees": ["alice"],
"weight": 5,
"estimate": "2h",
"due": "2026-07-31",
"status": "To do"
}
⌨️ Автодополнение в шелле
# bash — в ~/.bashrc:eval"$(glw completion bash)"# zsh — в ~/.zshrc:eval"$(glw completion zsh)"
# PowerShell — в $PROFILE:
glw completion powershell |Out-String|Invoke-Expression

Дополняются имена команд/алиасов и пути проектов после use и --project (из кэша %APPDATA%/glw/projects.json, который наполняется командами glw projects и glw use).

🌐 Переменные окружения и глобальные флаги
ПеременнаяОписание
GITLAB_URLURL GitLab-инстанса
GITLAB_TOKENPersonal Access Token (имя переменной настраивается через tokenEnv)
GITLAB_PROJECTПуть к проекту по умолчанию
NO_COLORОтключить цветной вывод

Глобальные флаги: --project <ref> (путь или короткое имя), --json, --help/-h.


⬆ Наверх

Сделано на Bun · GraphQL Work Items API · Ноль зависимостей

About

⚡ Zero-dependency Bun CLI for GitLab issues: create from markdown, edit any field, track time, bulk-edit with one command. 🤖 Ships with an Agent Skill for Claude Code & Cursor.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages