gitlab-issues
The gitlab-issues extension bidirectionally syncs
GitLab issues
with the Thurbox
task list
: your issues show up as tasks, and marking a task done closes the issue. A
gitlab-issues-tick
automation
(every 15 min,
cron:*/15 * * * *
) runs a deterministic
Exec
command —
{home}/scripts/sync.sh
— that reconciles the projects in
trackers.md
with the task list. There is
no agent, no LLM, no tokens
: Thurbox's scheduler runs the script (TUI or headless heartbeat) and records its output
in the automation run history. The script only calls
thurbox-cli
and the
glab
CLI; no GitLab bot, no webhook.
Experimental. gitlab-issues is new and under active testing — its sync scripts and manifest may change between releases.
Overview #
Pull is the default direction: GitLab issues become Thurbox tasks. GitLab is
authoritative for an issue's
title, URL, and open-vs-done state
; your local
todo
↔
in_progress
distinction is preserved. Imported tasks carry
source=gitlab
and
external_id="group/project#<iid>"
, so re-syncing never duplicates them — dedup is by
(source, external_id)
. The sync is a plain shell script run as a deterministic
Exec
automation — no coding agent is involved.
Requirements #
-
thurbox-cli≥ 0.141 onPATH— the sync uses thetask --source/--external-id/--external-urlflags added there (check withthurbox-cli version). -
glab(the GitLab CLI) andjqonPATH.
Authenticate GitLab #
Log in with
glab
— the token needs the
api
scope. No token env var is needed (
glab
stores the credential;
GITLAB_HOST
/
GITLAB_TOKEN
also work if you prefer):
$ glab auth login # gitlab.com or your self-managed host; token needs `api` scope
$ glab auth status # confirm "Logged in"
Install #
gitlab-issues is a Thurbox
extension
(a declarative
extension.toml
manifest):
$ thurbox-cli extension install gitlab-issues # or ./extensions/gitlab-issues
$ thurbox-cli extension uninstall gitlab-issues # --purge also deletes ~/.config/thurbox/extensions/gitlab-issues
Installing lays down the
~/.config/thurbox/extensions/gitlab-issues/
home (override with
--home
; it holds
scripts/sync.sh
+ helpers and the seeded
trackers.md
) and activates the
gitlab-issues-tick
automation —
self-healed
by Thurbox if deleted.
Configure trackers.md #
Edit
~/.config/thurbox/extensions/gitlab-issues/trackers.md
— one row per project or saved filter. The
query
is
group/project
plus any
glab issue list
flags. Open issues are the default; pass
--all
to include closed,
--assignee=@me
,
--label=…
,
--milestone=…
, etc. (There is
no
--state
flag for
glab issue list
.) Keep
push_back = no
for the first run.
| name | query | push_back |
|---------|----------------------------------|-----------|
| backend | mygroup/backend --assignee=@me | no |
| triage | mygroup/web --label=needs-triage | no |
First sync & verify #
The automation fires every 15 min. To run it now, trigger it from the
Automations
pane (
Ctrl+P
→ select
gitlab-issues-tick
→
r
) or headless:
$ thurbox-cli automation run <id> # id from: thurbox-cli automation list
$ ~/.config/thurbox/extensions/gitlab-issues/scripts/sync.sh # or run the script directly
Then inspect the imported tasks:
$ thurbox-cli task list --json | jq -c '.[] | select(.source=="gitlab") | {id,status,external_id,title}'
Open issues import as
todo
(or
in_progress
if assigned), closed as
done
. Re-running is
idempotent
— dedup by
(source, external_id)
leaves unchanged issues alone, and the
source=gitlab
tag keeps these tasks distinct from any other tracker's. The run's output
(created/updated/unchanged counts) shows in the automation run history.
Two-way sync #
Once the pull looks right, set
push_back = yes
on a tracker row. Now marking an imported task
done
closes its GitLab issue, and moving it back to
todo
reopens it — only the
open↔done axis
is pushed, so
in_progress
stays open. The sync runs
push-then-pull
(
push-status.sh
then per-tracker
fetch.sh | upsert.sh
), so your local change reaches GitLab before the pull reads state back. Push acts only
on
push_back=yes
rows.
Files #
See
extensions/gitlab-issues
for the
extension.toml
manifest, the seeded
trackers.md
, the
README.md
, and the sync scripts (
scripts/sync.sh
,
scripts/fetch.sh
,
scripts/upsert.sh
,
scripts/push-status.sh
).