Squad Squad
Back to Blog

What’s New: Azure DevOps Adapter, CommunicationAdapter, SubSquads, and Security Hardening

⚠️ Experimental — Squad is alpha software. APIs, commands, and behavior may change between releases.

This batch adds first-class Azure DevOps support, a pluggable communication layer, the community-voted SubSquads rename, and security fixes that prevent shell injection, WIQL injection, and bearer token exposure. 5 PRs merged, 153 new tests, 4 issues closed.


What Shipped

1. Azure DevOps Platform Adapter — The Enterprise Feature

Squad now works natively with Azure DevOps. When your git remote points to dev.azure.com or *.visualstudio.com, Squad auto-detects the platform and adapts everything.

PlatformAdapter interface — unified API for GitHub, ADO, and Planner:

interface PlatformAdapter {
  listWorkItems(options): Promise<WorkItem[]>;
  createWorkItem(options): Promise<WorkItem>;
  createPullRequest(options): Promise<PullRequest>;
  mergePullRequest(id): Promise<void>;
  createBranch(name, fromBranch?): Promise<void>;
  // ... addTag, removeTag, addComment
}

Three adapters ship with the same interface:

Configurable work items via .squad/config.json:

{
  "platform": "azure-devops",
  "ado": {
    "org": "my-org",
    "project": "planning-project",
    "defaultWorkItemType": "Scenario",
    "areaPath": "MyProject\\Team Alpha",
    "iterationPath": "MyProject\\Sprint 5"
  }
}

All fields are optional. Cross-project support means your work items can live in a completely different ADO org/project than your git repo.

Ralph on ADO — the governance file (squad.agent.md) now includes a Platform Detection section, ADO WIQL commands for Ralph’s scan cycle, and instructions to read .squad/config.json before any ADO command.

Docs: Enterprise Platforms Guide | Blog #025

2. CommunicationAdapter — Agent-Human Messaging

A new pluggable interface for agent-human communication. Scribe can post session summaries, Ralph can post board status, agents can escalate when blocked — all through a platform-appropriate channel.

interface CommunicationAdapter {
  postUpdate(options): Promise<{ id: string; url?: string }>;
  pollForReplies(options): Promise<CommunicationReply[]>;
  getNotificationUrl(threadId): string | undefined;
}

Four adapters:

AdapterPhone-capableSetup
FileLogVia gitZero-config fallback
GitHub Discussions✅ BrowserAuto-detected
ADO Work Item Discussions✅ ADO mobileAuto-detected
Teams Webhook✅ Teams mobileStubbed (Phase 2)

Factory auto-detects platform: createCommunicationAdapter(repoRoot).

3. SubSquads — The Community-Voted Rename

Workstreams → SubSquads. The community decided.

4. Security Hardening

Every platform adapter went through a community-driven 5-model security review (thanks @wiisaacs):

FixWhat it prevents
execSyncexecFileSyncShell injection via user input
escapeWiql() helperWIQL injection (SQL-style) in ADO queries
curl --config stdinBearer token invisible to ps aux
Case-insensitive detectionMixed-case ADO URLs now detected correctly
Cross-platform draft filterfindstr → JMESPath (macOS/Linux compat)
PR status mappingactiveopen for gh CLI compatibility
gh issue create fixNo --json flag — parse URL from stdout

5. ESM Runtime Patch + Secret Guardrails (Brady)


Quick Stats


Breaking Changes

None. All changes are additive. Repos without ADO remotes work exactly as before. Old workstreams/streams names still work as deprecated aliases.


Contributors


What’s Next