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

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