github-issues
The github-issues extension bidirectionally syncs
GitHub issues
with the Thurbox
task list
: your issues show up as tasks, and marking a task done closes the issue. A
github-issues-tick
automation
(every 15 min,
cron:*/15 * * * *
) runs a deterministic
Exec
command —
{home}/scripts/sync.sh
— that reconciles the repos 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
gh
CLI; no GitHub bot, no webhook.
Experimental. github-issues is new and under active testing — its sync scripts and manifest may change between releases.
Overview #
Pull is the default direction: GitHub issues become Thurbox tasks. GitHub 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=github
and
external_id="owner/repo#<number>"
, 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). -
gh(the GitHub CLI) andjqonPATH.
Authenticate GitHub #
Log in with
gh
(no token env var is needed —
gh
stores the credential itself):
$ gh auth login # GitHub.com → HTTPS → log in via browser
$ gh auth status # confirm
Install #
github-issues is a Thurbox
extension
(a declarative
extension.toml
manifest):
$ thurbox-cli extension install github-issues # or ./extensions/github-issues
$ thurbox-cli extension uninstall github-issues # --purge also deletes ~/.config/thurbox/extensions/github-issues
Installing lays down the
~/.config/thurbox/extensions/github-issues/
home (override with
--home
; it holds
scripts/sync.sh
+ helpers and the seeded
trackers.md
) and activates the
github-issues-tick
automation —
self-healed
by Thurbox if deleted.
Configure trackers.md #
Edit
~/.config/thurbox/extensions/github-issues/trackers.md
— one row per repo or saved filter. The
query
is
owner/repo
plus any
gh issue list
flags (
--state
,
--assignee
,
--label
,
--milestone
, …); open issues are used when
--state
is omitted. Keep
push_back = no
for the first run (pull only — nothing is changed on GitHub).
| name | query | push_back |
|---------|--------------------------------|-----------|
| backend | myorg/backend --assignee @me | no |
| triage | myorg/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
github-issues-tick
→
r
) or headless:
$ thurbox-cli automation run <id> # id from: thurbox-cli automation list
$ ~/.config/thurbox/extensions/github-issues/scripts/sync.sh # or run the script directly
Then inspect the imported tasks:
$ thurbox-cli task list --json | jq -c '.[] | select(.source=="github") | {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)
means unchanged issues are left alone, and the
source=github
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 GitHub 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 GitHub before the pull reads state back. Push acts only
on
push_back=yes
rows.
Files #
See
extensions/github-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
).