Skip to content

Hybrid mode: GitHub repo + Azure DevOps work items for Ralph watch #991

Closed as not planned

Description

@PolyphonyRequiem

Summary

Ralph's watch mode has platform abstraction (PlatformAdapter) and a working AzureDevOpsAdapter, but there's no way to use hybrid mode — where code lives on GitHub but work items live in Azure DevOps. The HybridPlatformConfig type exists in platform/types.ts but isn't wired into the watch loop.

Context

I'm evaluating Squad for a .NET CLI project where:

  • Code is hosted on GitHub (PolyphonyRequiem/twig)
  • Backlog is tracked in Azure DevOps (Epic → Issue → Task)

This is a common pattern in Microsoft-adjacent and enterprise teams — GitHub for source, ADO for project management.

What already works

The SDK has excellent platform abstractions:

  • PlatformAdapter interface with listWorkItems(), addTag(), addComment(), etc.
  • AzureDevOpsAdapter — full implementation using az boards CLI
  • createPlatformAdapter() — auto-detects from git remote URL
  • HybridPlatformConfig type — { repo: 'github', workItems: 'azure-devops' }
  • detectWorkItemSource() — reads config to determine work item source
  • Watch loop already maps GitHub labels → ADO tags via toWatchWorkItem() / editWorkItem()

What's missing

  1. Watch loop doesn't use hybrid config. createPlatformAdapter() returns a single adapter based on the git remote. The watch loop needs to use two adapters when hybrid mode is configured — one for PRs (GitHub) and one for work items (ADO).

  2. No config surface for hybrid mode. Users need a way to declare hybrid mode in .squad/config.json:
    json { "version": 1, "platform": { "repo": "github", "workItems": "azure-devops" }, "ado": { "org": "my-org", "project": "my-project", "defaultWorkItemType": "Issue" } }

  3. Triage tag format for ADO. The squad:{member} label convention works as ADO tags (freeform strings), but this should be explicitly documented and tested.

Proposed approach

  • In the watch loop, split the single adapter into workItemAdapter and repoAdapter
  • When config.platform.workItems !== config.platform.repo, create two adapters
  • listWatchWorkItems() and editWorkItem() use workItemAdapter
  • listWatchPullRequests() uses repoAdapter
  • Default behavior (single platform) is unchanged — both point to the same adapter

Related

Environment

  • Squad CLI: v0.9.1
  • Platform: Windows 11
  • Use case: .NET CLI project with GitHub repo + ADO backlog

Activity

  1. PolyphonyRequiem commented on Apr 16, 2026

    @PolyphonyRequiem
    Author

    One major reason this hybrid scenario exists is because Twig itself is an ADO work management tool, so it makes sense to dogfood work tracking in ADO with Twig to drive Twig development

  2. bradygaster commented on Jun 24, 2026

    @bradygaster
    Collaborator

    Closing candidate — stale issue with no activity in 4+ months and unclear current relevance. Reopen if this is still needed.

  3. bradygaster commented on Aug 3, 2026

    @bradygaster
    Collaborator

    Consolidating the hybrid GitHub/Azure DevOps scenario described here into the broader ADO PRD tracked by #581. All relevant context from this issue should be folded into that work item. Closing as not planned here.

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

    close:staleCandidate for closing as staletriagedIssue has been triaged

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions