Skip to content

Issues work on every source-control service T3 supports #295

Closed

Description

@tannerpolley

The fork's Issues feature (Issues page, thread details Issues section, issue tools for agents, managed orchestration) only works with GitHub and Forgejo, and the code picks between them by name. The owner wants it to work with any source-control service T3 supports, without being built for one or another (owner, 2026-11-03).

Today:

  • Server: issueHostFor (apps/server/src/issues/IssueHost.ts) returns a registered Forgejo host for a host name, otherwise GitHub. IssueServerLayers.ts wires the GitHub host directly.
  • Client: supportsIssueHost (packages/client-runtime/src/state/issueWork.ts) allows only github and forgejo.
  • T3's source control also covers GitLab, Bitbucket, Azure DevOps and GitCafe (packages/source-control-*), with no issue support.

Plan, as sub-issues:

  1. A shared core: each service's issue host is registered by provider kind and declares what it supports. The UI and agent tools hide what a service doesn't support.
  2. A GitLab issue host, the third adapter that proves the core.
  3. A git-bug prototype: issues stored in the repository itself, with T3 serializing every write.
  4. Follow-ups, not queued: Bitbucket, Azure DevOps, GitCafe.

Done when the sub-issues for 1 to 3 are closed.

Out of scope: mobile, and moving existing projects between hosts.


Was Forgejo issue #303.

Activity

  1. tannerpolley commented on Nov 3, 2026

    @tannerpolley
    OwnerAuthor

    T3 Code status: Done

    Issue: #303 Issues work on every source-control service T3 supports

    Thread: thread:delegated-task:command%3Amcp%3A18e0e778-4b3f-4080-aeab-b30cb7922463%3Adelegate-task%3Adelegate-303-owner-2026-11-03

    Model: claude-opus-5-5

    Branch: issue-303-issues-work-on-every-source-control

    Updated: 2026-11-03T23:48:11.449Z

  2. tannerpolley commented on Nov 3, 2026

    @tannerpolley
    OwnerAuthor

    T3 Code closeout: done

    Issue: #303 Issues work on every source-control service T3 supports
    Thread: thread:delegated-task:command%3Amcp%3A18e0e778-4b3f-4080-aeab-b30cb7922463%3Adelegate-task%3Adelegate-303-owner-2026-11-03
    Model: claude-opus-5-5
    Branch: issue-303-issues-work-on-every-source-control
    Completed: 2026-11-03T22:45:12.775Z

    The #304 implementor is checking whether one IssueQueue SQLite test also fails on main. It saved its changes in a work-in-progress commit and is running that test against main's code in the background, then restoring the commit. That shows whether the failure comes from its changes or was already on main.

    I'll start the Checker review once it reports a PR link.

  3. tannerpolley commented on Nov 3, 2026

    @tannerpolley
    OwnerAuthor

    T3 Code closeout: queued_preparing

    Issue: #303 Issues work on every source-control service T3 supports
    Thread: thread:delegated-task:command%3Amcp%3A18e0e778-4b3f-4080-aeab-b30cb7922463%3Adelegate-task%3Adelegate-303-owner-2026-11-03
    Model: claude-opus-5-5
    Branch: issue-303-issues-work-on-every-source-control
    Completed: 2026-11-03T22:46:01.210Z

    I sent the Node trap to the #304 implementor (its thread), and a new turn has started on it. It will rerun the IssueQueue test with vite-plus's bundled Node first on PATH. If the test passes that way, it skips the comparison against main, restores its saved commit, and opens the PR. I'll start the Checker review after that.

  4. tannerpolley commented on Nov 3, 2026

    @tannerpolley
    OwnerAuthor

    T3 Code closeout: waiting_on_sub_issues

    Issue: #303 Issues work on every source-control service T3 supports
    Thread: thread:delegated-task:command%3Amcp%3A18e0e778-4b3f-4080-aeab-b30cb7922463%3Adelegate-task%3Adelegate-303-owner-2026-11-03
    Model: claude-opus-5-5
    Branch: issue-303-issues-work-on-every-source-control
    Completed: 2026-11-03T23:40:32.077Z

    The test is what's wrong, not threadIssueRepository. That row means "a provider with no issue host returns null", and it used GitLab, which now has an issue host. The fixture's github.com host is just its default, which is why the error shows github.com.

    The fix is to change that row's provider to one that's still unsupported, such as bitbucket. I've added it to the #306 implementor's current fix round (its thread). It's already rebasing and changing client issue gating, so that's the natural place. If PR #319 lands on main before the implementor pushes, it rebases onto #319 first.

    I missed this failure because I merged #305 on the Checker's run plus my own read of the fix commit. That test file wasn't among the ones run.

    The #306 fix round is still running.

  5. tannerpolley commented on Nov 3, 2026

    @tannerpolley
    OwnerAuthor

    T3 Code closeout: done

    Issue: #303 Issues work on every source-control service T3 supports
    Thread: thread:delegated-task:command%3Amcp%3A18e0e778-4b3f-4080-aeab-b30cb7922463%3Adelegate-task%3Adelegate-303-owner-2026-11-03
    Model: claude-opus-5-5
    Branch: issue-303-issues-work-on-every-source-control
    Completed: 2026-11-03T23:44:18.598Z

    I'll use fj pr merge from now on. My implementors don't land their own PRs (I do), so there's nothing to pass on. When I update local main afterwards, I'll first check which branch the main checkout is on, after this morning's slip. If it isn't on main, I'll move the main reference without touching that checkout.

  6. tannerpolley commented on Nov 3, 2026

    @tannerpolley
    OwnerAuthor

    T3 Code closeout: done

    Issue: #303 Issues work on every source-control service T3 supports
    Thread: thread:delegated-task:command%3Amcp%3A18e0e778-4b3f-4080-aeab-b30cb7922463%3Adelegate-task%3Adelegate-303-owner-2026-11-03
    Model: claude-opus-5-5
    Branch: issue-303-issues-work-on-every-source-control
    Completed: 2026-11-03T23:48:11.500Z

    #303: Issues now work on GitHub, Forgejo, GitLab and git-bug

    #304, #305 and #306 are landed on main (f95c452888) and closed on Forgejo, so #303's done-when list is met. #303 itself is still open, because closing it needs your approval. #307 to #309 (Bitbucket, Azure DevOps, GitCafe) were not started.

    What landed

    Issue PR Commits on main
    #304 shared core #313 d954f91695, 02462ac34c
    #305 GitLab #316 88f69f2425, 5b2cd9e28a
    Follow-up: #305 broke the server typecheck #324 6b0a041000
    #306 git-bug prototype #323 (replaces #317) 38761e9b3e, f95c452888

    One mistake while landing #305: another agent had switched the main checkout to its branch fix/issues-roadmap-only, and my fast-forward moved that branch. I put it straight back on its previous commit; its working tree was clean, so none of that agent's work was touched. I now check the branch before every merge.

    Capability list

    One table, ISSUE_HOSTS in packages/contracts/src/issueHost.ts. The Issues page, the thread details Issues section, the agent issue tools and managed work all read it, and refuse what a host lacks with a clear message.

    Capability GitHub Forgejo GitLab git-bug
    subIssues (parent and child issues) yes yes, body markers yes, body markers no
    blockers ("blocked by") yes yes no: T3 can't tell the project's GitLab tier no
    milestones yes yes yes, using GitLab's per-project number no
    labels yes yes yes yes
    assignees yes yes yes no
    closesFromMergedChangeRequests yes, by GitHub yes, by T3 yes: GitLab closes what it can, T3 the rest no
    liveChanges (T3 polls for new activity) yes yes no, not built yet no

    A new service needs one adapter file, one line in IssueHostRegistry.ts and one row in that table.

    git-bug prototype write-up (#306)

    • Turning it on: run git config t3.issues git-bug in the repository, then restart T3. Linked worktrees share the setting. That repository's issues go to a host named git-bug; pull requests and other projects on the same Forgejo or GitHub host keep their usual host.
    • What worked:
      • Linked worktrees share one issue store.
      • T3 runs each repository's git-bug commands one at a time, keyed by the shared .git. That removes lock failures for T3's own writes, and a test of 8 parallel creates fails without it.
      • git-bug's JSON output was easy to translate.
      • Forgejo accepts refs/bugs/* with a plain git push origin 'refs/bugs/*:refs/bugs/*' 'refs/identities/*:refs/identities/*'. GitHub was not tested.
    • What didn't:
      • git-bug has no issue numbers, so T3 builds one from git-bug's 7-character ID, giving numbers like #93101908. If two IDs start alike, git-bug refuses the command rather than picking one.
      • git-bug's own push and pull can't log in to HTTPS Forgejo.
      • After a fetch, git-bug's cache (.git/git-bug/cache) must be deleted before it sees the new issues.
      • Reading the body from a file drops lines starting with #, so T3 passes it as an argument. That caps a body at Linux's 128 KiB limit for one argument.
      • An unknown ID falls back to the last selected issue, so every write checks the ID first.
      • Your own git bug commands can still hit the lock while T3 holds it.
    • Worth taking further? Not as a main issue host. It only suits offline notes for a project on one machine. The blocker is syncing between machines, and only git-bug can fix that.

    Still open

    • Effort bars: max is the top bar, so Claude and Codex both show five #303: close it once you've looked this over (it needs your approval).
    • GitLab live check: not done, as you chose. Also not done: honoring a project's own auto-close setting, a test for closing issues in other GitLab projects, larger GitLab page sizes, and a possible startup delay in GitLab host discovery.
    • git-bug testing:
      • git-bug isn't installed on this machine; its tests ran with a downloaded copy, and they skip wherever it's missing, including CI. I didn't install it system-wide without asking.
      • Neither git-bug nor GitLab has had a pass in a running web client.
    • Smaller items:
      • The Issues page shows every filter for a repository with no local project.
      • The issue detail panel falls back to GitHub-style links when no local project matches.
    • Already failing on main:
      • The IssueQueue test "hands SQLite connections to waiting queue calls before new borrows".
      • Three mobile typecheck errors.
      • Two useEffects in IssueBrowser.tsx that lint flags whenever that file changes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions