Skip to content

Platform Bridge API Reference

Complete API documentation fer the platform bridge module.

Module: claude.tools.platform_bridge

Public API

__all__ = [
    "PlatformBridge",
    "detect_platform",
    "Platform",
    "PlatformDetectionError",
    "CLIToolMissingError"
]

Classes

PlatformBridge

Main entry point fer platform-agnostic git operations.

Constructor:

PlatformBridge(repo_path: str = ".") -> PlatformBridge

Parameters:

  • repo_path (str, optional): Path to git repository. Defaults to current directory.

Raises:

  • PlatformDetectionError: If platform cannot be determined from git remotes
  • NotAGitRepositoryError: If repo_path not be a git repository

Example:

from claude.tools.platform_bridge import PlatformBridge

# Use current directory
bridge = PlatformBridge()

# Use specific repository
bridge = PlatformBridge("/path/to/repo")

Attributes:

  • platform (Platform): Detected platform (GitHub or AzureDevOps)
  • repo_path (Path): Absolute path to repository

PlatformBridge.create_issue()

Create an issue (GitHub) or work item (Azure DevOps).

Signature:

def create_issue(
    self,
    title: str,
    body: str,
    labels: Optional[List[str]] = None
) -> Dict[str, Any]

Parameters:

  • title (str): Issue/work item title (required, max 256 characters)
  • body (str): Issue/work item description (required)
  • labels (List[str], optional): Labels/tags to apply (GitHub only)

Returns:

{
    "number": 42,                    # Issue/work item number
    "url": "https://...",            # Web URL to issue
    "title": "Issue title",          # Created title
    "state": "open"                  # Current state
}

Raises:

  • CLIToolMissingError: If gh/az CLI not installed
  • subprocess.CalledProcessError: If CLI command fails

Example:

issue = bridge.create_issue(
    title="Add authentication",
    body="Implement JWT authentication\n\n## Requirements\n- Token validation\n- Refresh tokens",
    labels=["enhancement", "security"]  # GitHub only
)

print(f"Created issue #{issue['number']}: {issue['url']}")

GitHub Command:

gh issue create --title "..." --body "..." --label "enhancement,security"

Azure DevOps Command:

az boards work-item create --type "User Story" --title "..." --description "..."

PlatformBridge.create_draft_pr()

Create a draft pull request on both platforms.

Signature:

def create_draft_pr(
    self,
    title: str,
    body: str,
    source_branch: str,
    target_branch: str = "main"
) -> Dict[str, Any]

Parameters:

  • title (str): PR title (required, max 256 characters)
  • body (str): PR description in markdown (required)
  • source_branch (str): Source branch name (required)
  • target_branch (str): Target branch name (default: "main")

Returns:

{
    "number": 123,                   # PR number
    "url": "https://...",            # Web URL to PR
    "title": "PR title",             # Created title
    "state": "draft",                # Initial state
    "source_branch": "feat/auth",    # Source branch
    "target_branch": "main"          # Target branch
}

Raises:

  • CLIToolMissingError: If gh/az CLI not installed
  • BranchNotFoundError: If source branch doesn't exist
  • subprocess.CalledProcessError: If CLI command fails

Example:

pr = bridge.create_draft_pr(
    title="feat: Add JWT authentication",
    body="## Summary\n\nImplements JWT authentication\n\n## Test Plan\n- Unit tests\n- Integration tests",
    source_branch="feat/auth",
    target_branch="main"
)

print(f"Draft PR #{pr['number']}: {pr['url']}")

GitHub Command:

gh pr create --draft --title "..." --body "..." --head feat/auth --base main

Azure DevOps Command:

az repos pr create --draft true --title "..." --description "..." --source-branch feat/auth --target-branch main

PlatformBridge.mark_pr_ready()

Mark a draft PR as ready fer review.

Signature:

def mark_pr_ready(self, pr_number: int) -> Dict[str, Any]

Parameters:

  • pr_number (int): Pull request number (required)

Returns:

{
    "number": 123,              # PR number
    "state": "open",            # New state (no longer draft)
    "success": True             # Operation succeeded
}

Raises:

  • CLIToolMissingError: If gh/az CLI not installed
  • PRNotFoundError: If PR number doesn't exist
  • subprocess.CalledProcessError: If CLI command fails

Example:

result = bridge.mark_pr_ready(pr_number=123)

if result['success']:
    print(f"PR #{result['number']} be ready fer review!")

GitHub Command:

gh pr ready 123

Azure DevOps Command:

az repos pr update --id 123 --status Active

PlatformBridge.add_pr_comment()

Add a comment to a pull request.

Signature:

def add_pr_comment(
    self,
    pr_number: int,
    comment: str
) -> Dict[str, Any]

Parameters:

  • pr_number (int): Pull request number (required)
  • comment (str): Comment text in markdown (required)

Returns:

{
    "comment_id": "456",         # Comment identifier
    "pr_number": 123,            # PR number
    "body": "Comment text",      # Created comment
    "url": "https://..."         # Web URL to comment
}

Raises:

  • CLIToolMissingError: If gh/az CLI not installed
  • PRNotFoundError: If PR number doesn't exist
  • subprocess.CalledProcessError: If CLI command fails

Example:

comment = bridge.add_pr_comment(
    pr_number=123,
    comment="All tests be passin'! Ready fer merge. 🚢"
)

print(f"Added comment: {comment['url']}")

GitHub Command:

gh pr comment 123 --body "All tests be passin'! Ready fer merge. 🚢"

Azure DevOps Command:

az repos pr create-thread --id 123 --comment-text "All tests be passin'! Ready fer merge. 🚢"

PlatformBridge.check_ci_status()

Check CI/CD pipeline status fer a pull request.

Signature:

def check_ci_status(self, pr_number: int) -> Dict[str, Any]

Parameters:

  • pr_number (int): Pull request number (required)

Returns:

{
    "all_passing": True,           # All checks passed
    "total_checks": 5,             # Total number of checks
    "passed": 5,                   # Number passed
    "failed": 0,                   # Number failed
    "pending": 0,                  # Number still runnin'
    "checks": [                    # List of individual checks
        {
            "name": "build",
            "status": "success",
            "url": "https://..."
        },
        {
            "name": "test",
            "status": "success",
            "url": "https://..."
        }
    ]
}

Raises:

  • CLIToolMissingError: If gh/az CLI not installed
  • PRNotFoundError: If PR number doesn't exist
  • subprocess.CalledProcessError: If CLI command fails

Example:

status = bridge.check_ci_status(pr_number=123)

if status['all_passing']:
    print("All checks passed! Ready to merge.")
elif status['pending'] > 0:
    print(f"Waitin' on {status['pending']} checks...")
else:
    print(f"Failed checks: {status['failed']}")
    for check in status['checks']:
        if check['status'] == 'failure':
            print(f"  - {check['name']}: {check['url']}")

GitHub Command:

gh pr checks 123

Azure DevOps Command:

az pipelines runs list --branch refs/pull/123/merge

Functions

detect_platform()

Standalone function to detect platform from git remotes without creatin' a PlatformBridge instance.

Signature:

def detect_platform(repo_path: str = ".") -> Platform

Parameters:

  • repo_path (str, optional): Path to git repository. Defaults to current directory.

Returns:

  • Platform.GITHUB - Repository hosted on GitHub
  • Platform.AZDO - Repository hosted on Azure DevOps

Raises:

  • PlatformDetectionError: If platform cannot be determined
  • NotAGitRepositoryError: If repo_path not be a git repository

Example:

from claude.tools.platform_bridge import detect_platform, Platform

platform = detect_platform()

if platform == Platform.GITHUB:
    print("This be a GitHub repository")
elif platform == Platform.AZDO:
    print("This be an Azure DevOps repository")

Detection Logic:

  1. Run git remote -v in repo_path
  2. Extract URLs from output
  3. Check origin remote first
  4. Fall back to first available remote
  5. Match URL patterns:
  6. github.com → Platform.GITHUB
  7. dev.azure.com or visualstudio.com → Platform.AZDO
  8. Raise PlatformDetectionError if no match

Enums

Platform

Enumeration of supported platforms.

class Platform(Enum):
    GITHUB = "github"
    AZDO = "azdo"

Members:

  • Platform.GITHUB - GitHub platform
  • Platform.AZDO - Azure DevOps platform

Example:

from claude.tools.platform_bridge import Platform

if bridge.platform == Platform.GITHUB:
    print("Using GitHub operations")

Exceptions

PlatformDetectionError

Raised when platform cannot be determined from git remotes.

Inheritance: Exception

Common Causes:

  • No git remotes configured
  • Remote URL doesn't match known patterns
  • Not a git repository

Example:

from claude.tools.platform_bridge import PlatformBridge, PlatformDetectionError

try:
    bridge = PlatformBridge()
except PlatformDetectionError as e:
    print(f"Could not detect platform: {e}")
    print("Add a remote: git remote add origin <url>")

CLIToolMissingError

Raised when required CLI tool (gh or az) not be installed.

Inheritance: Exception

Attributes:

  • tool_name (str): Name of missing tool ("gh" or "az")
  • install_command (str): Platform-specific installation command

Example:

from claude.tools.platform_bridge import PlatformBridge, CLIToolMissingError

try:
    bridge = PlatformBridge()
    issue = bridge.create_issue(title="Test", body="Body")
except CLIToolMissingError as e:
    print(f"Missing: {e.tool_name}")
    print(f"Install with: {e.install_command}")

PRNotFoundError

Raised when specified PR number doesn't exist.

Inheritance: Exception

Attributes:

  • pr_number (int): PR number that wasn't found

Example:

from claude.tools.platform_bridge import PRNotFoundError

try:
    bridge.mark_pr_ready(pr_number=999)
except PRNotFoundError as e:
    print(f"PR #{e.pr_number} doesn't exist")

BranchNotFoundError

Raised when specified branch doesn't exist in repository.

Inheritance: Exception

Attributes:

  • branch_name (str): Branch name that wasn't found

Example:

from claude.tools.platform_bridge import BranchNotFoundError

try:
    pr = bridge.create_draft_pr(
        title="Test",
        body="Body",
        source_branch="nonexistent-branch"
    )
except BranchNotFoundError as e:
    print(f"Branch '{e.branch_name}' doesn't exist")

Type Hints

All functions use proper type hints:

from typing import Dict, List, Optional, Any
from pathlib import Path

class PlatformBridge:
    def __init__(self, repo_path: str = ".") -> None: ...

    def create_issue(
        self,
        title: str,
        body: str,
        labels: Optional[List[str]] = None
    ) -> Dict[str, Any]: ...

    def create_draft_pr(
        self,
        title: str,
        body: str,
        source_branch: str,
        target_branch: str = "main"
    ) -> Dict[str, Any]: ...

Thread Safety

The platform bridge be thread-safe fer read operations but not thread-safe fer write operations:

Safe (multiple threads):

# Multiple threads can check CI status simultaneously
status1 = bridge.check_ci_status(pr_number=123)
status2 = bridge.check_ci_status(pr_number=456)

Unsafe (avoid):

# Don't create multiple PRs from different threads
# Results be unpredictable

Fer concurrent operations, create separate PlatformBridge instances per thread.


See Also