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 todoin_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 on PATH — the sync uses the task --source/--external-id/--external-url flags added there (check with thurbox-cli version ).
  • glab (the GitLab CLI) and jq on PATH .

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-tickr ) 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 ).