ado-workflows
Azure DevOps workflow automation library — PR review analysis, comment lifecycle, repository discovery, and Python SDK wrappers.
Install
pip install ado-workflows
Quick Start
from ado_workflows import ConnectionFactory, AdoClient
# Authenticate (uses DefaultAzureCredential — Azure CLI, managed identity, etc.)
factory = ConnectionFactory()
connection = factory.get_connection("https://dev.azure.com/MyOrg")
client = AdoClient(connection)
PR Review Status
from ado_workflows import get_review_status
status = get_review_status(client, "MyProject", "MyRepo", pr_id=12345)
print(status.approval_status) # ApprovalStatus.APPROVED / PENDING / REJECTED
print(status.total_reviewers) # 3
print(status.required_approvals) # 2
for vs in status.vote_statuses:
print(f"{vs.name}: {vs.vote_text} (stale: {vs.vote_invalidated})")
Pending Review Analysis
from ado_workflows import analyze_pending_reviews
result = analyze_pending_reviews(
client, "MyProject", "MyRepo",
max_days_old=14,
creator_filter="alice",
)
for pr in result.pending_prs: # sorted by days_open descending
print(f"PR #{pr.pr_id} ({pr.days_open}d): {pr.title}")
print(f" Needs {pr.needs_approvals_count} more approvals")
for r in pr.pending_reviewers:
print(f" - {r.display_name}")
Comment Operations
from ado_workflows import (
analyze_pr_comments,
post_comment,
reply_to_comment,
resolve_comments,
)
# Analyze threads
analysis = analyze_pr_comments(client, "MyProject", "MyRepo", pr_id=12345)
print(f"{analysis.summary.active_count} active, {analysis.summary.resolved_count} resolved")
# Post, reply, resolve
thread_id = post_comment(client, "MyProject", "MyRepo", pr_id=12345, content="LGTM")
reply_to_comment(client, "MyProject", "MyRepo", pr_id=12345, thread_id=thread_id, content="Thanks!")
result = resolve_comments(client, "MyProject", "MyRepo", pr_id=12345, thread_ids=[thread_id])
print(f"Resolved: {result.resolved}, Failed: {result.failed}")
Repository Discovery
from ado_workflows import discover_repositories, parse_ado_url
# Parse any Azure DevOps URL
org, project, repo, pr_id = parse_ado_url(
"https://dev.azure.com/MyOrg/MyProject/_git/MyRepo/pullrequest/42"
)
# Discover git repos in a workspace
repos = discover_repositories("/path/to/workspace")
for r in repos:
print(f"{r['name']} → {r['remote_url']}")
PR Context
from ado_workflows import establish_pr_context
# From a URL
ctx = establish_pr_context("https://dev.azure.com/MyOrg/MyProject/_git/MyRepo/pullrequest/42")
# From a PR ID (requires RepositoryContext to be set)
ctx = establish_pr_context(42, working_directory="/path/to/repo")
print(ctx.org_url) # https://dev.azure.com/MyOrg
print(ctx.pr_id) # 42
Architecture
Three-layer API:
| Layer | Purpose | State | SDK dependency |
|---|---|---|---|
| 1 — Primitives | URL parsing, git inspection, date parsing | None | None |
| 2 — Context | Repository context caching | Thread-safe | None |
| 3 — PR Operations | Review, comments, lifecycle, pending analysis | Composes L1+L2 | azure-devops |
See docs/ARCHITECTURE.md for full design rationale.
Error Handling
All errors are ActionableError instances (from actionable-errors) with structured context:
from actionable_errors import ActionableError
try:
status = get_review_status(client, "MyProject", "MyRepo", pr_id=99999)
except ActionableError as e:
print(e.error_type) # ErrorType.CONNECTION
print(e.service) # "AzureDevOps"
print(e.suggestion) # "Verify the PR ID exists and you have read access..."
Development
uv sync --extra dev
task check # lint + type-check + test
See CONTRIBUTING.md for full development setup and coding standards.
License
MIT
Metadata
Release files for ado-workflows 0.13.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ado_workflows-0.13.0.tar.gz | 216.2 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ado_workflows-0.13.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 273.6 kB
Release files / ado_workflows-0.13.0.tar.gz
| Download URL | ado_workflows-0.13.0.tar.gz |
|---|---|
| Size | 216.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d5f00a2a0b26aa8d65ea6d5a4ccb2e7a5c8c6473d7e35fa9c118bf3aede80103
|
|
BLAKE2b-256 checksum How to use checksums |
234e4e15c6ec5d8044972697bc70151069a468345c1410fabcf773cf6ade21f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logRelease files / ado_workflows-0.13.0-py3-none-any.whl
| Download URL | ado_workflows-0.13.0-py3-none-any.whl |
|---|---|
| Size | 57.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1985aa363a05fefdc4bfb5713fd8d38bee6e21eac8ca63a9194cf6b0cb1e0342
|
|
BLAKE2b-256 checksum How to use checksums |
4797b36d58a5c374378c985ecfec496bb4c1999615e6518e7e402e6f713e1851
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logSecurity for ado-workflows 0.13.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for ado_workflows-0.13.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 4, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.