Azure DevOps
Full Azure DevOps integration using OAuth or PAT authentication and REST API v7.1.
First-Time Setup
Option 1: OAuth (Recommended)
Login with OAuth device code flow (shows "Visual Studio Code" prompt):
python scripts/auth.py login --org MyOrganization
Follow the URL and enter the device code to authorize. Tokens auto-refresh.
Option 2: PAT
Login with a Personal Access Token:
python scripts/auth.py login --org MyOrganization --pat YOUR_PAT
Create a PAT at https://dev.azure.com/{org}/_usersSettings/tokens with these scopes:
- Work Items: Read & Write
- Code: Read & Write (for repos/PRs)
- Build: Read & Execute (for pipelines)
- Wiki: Read & Write
- Test Management: Read & Write
- Advanced Security: Read (for security alerts)
- Project and Team: Read
- Identity: Read (for user search)
Common Commands
Check authentication status:
python scripts/auth.py status
Logout:
python scripts/auth.py logout
Core (scripts/core.py)
# List all projects
python scripts/core.py list-projects
python scripts/core.py list-projects --top 10
# List teams in a project
python scripts/core.py list-teams --project MyProject
# Search for a user identity
python scripts/core.py get-identity --search "john@example.com"
Work Items (scripts/work_items.py)
# Get a work item
python scripts/work_items.py get --project MyProject --id 123
python scripts/work_items.py get --project MyProject --id 123 --expand relations
# Create a work item
python scripts/work_items.py create --project MyProject --type "User Story" --title "New feature"
python scripts/work_items.py create --project MyProject --type Bug --title "Fix login" \
--field System.Description "Login fails on timeout" \
--field System.AssignedTo "user@example.com"
# Update a work item
python scripts/work_items.py update --project MyProject --id 123 \
--field System.State "Active" \
--field System.AssignedTo "user@example.com"
# Batch get multiple work items
python scripts/work_items.py batch-get --project MyProject --ids 1,2,3
# Add children to a parent
python scripts/work_items.py add-children --project MyProject --parent-id 100 --child-ids 101,102
# Link work items
python scripts/work_items.py link --project MyProject --source-id 100 --target-id 200
python scripts/work_items.py link --project MyProject --source-id 100 --target-id 200 \
--link-type "System.LinkTypes.Dependency-Forward"
# Remove a link
python scripts/work_items.py unlink --project MyProject --source-id 100 --relation-index 0
# Comments
python scripts/work_items.py add-comment --project MyProject --id 123 --text "Working on this"
python scripts/work_items.py list-comments --project MyProject --id 123
# History
python scripts/work_items.py get-revisions --project MyProject --id 123
# List work item types
python scripts/work_items.py list-types --project MyProject
# My assigned items
python scripts/work_items.py my-items --project MyProject
# Items in an iteration
python scripts/work_items.py iteration-items --project MyProject --iteration-path "MyProject\\Sprint 1"
# Backlogs
python scripts/work_items.py list-backlogs --project MyProject --team "MyProject Team"
# Saved queries
python scripts/work_items.py list-queries --project MyProject
python scripts/work_items.py get-query --project MyProject --path "Shared Queries/Active Bugs"
python scripts/work_items.py run-query --project MyProject --query-id "guid-here"
# WIQL query
python scripts/work_items.py run-wiql --project MyProject \
--query "SELECT [System.Id], [System.Title] FROM WorkItems WHERE [System.State] = 'Active'"
# Delete / recycle bin
python scripts/work_items.py delete --project MyProject --id 999
python scripts/work_items.py recycle-bin --project MyProject
Git Repos & PRs (scripts/repos.py)
# List repositories
python scripts/repos.py list --project MyProject
# Get repo details
python scripts/repos.py get --project MyProject --repo my-repo
# Branches
python scripts/repos.py list-branches --project MyProject --repo my-repo
python scripts/repos.py create-branch --project MyProject --repo my-repo --name feature/new --source main
# Commits
python scripts/repos.py search-commits --project MyProject --repo my-repo --path /src --author "john" --top 10
# Pull requests
python scripts/repos.py list-prs --project MyProject --repo my-repo
python scripts/repos.py list-prs --project MyProject --status completed --top 5
python scripts/repos.py create-pr --project MyProject --repo my-repo \
--source feature/new --target main --title "Add new feature" --description "Details here"
python scripts/repos.py get-pr --project MyProject --repo my-repo --pr-id 42
python scripts/repos.py update-pr --project MyProject --repo my-repo --pr-id 42 --title "Updated title"
# Reviewers
python scripts/repos.py list-reviewers --project MyProject --repo my-repo --pr-id 42
python scripts/repos.py add-reviewer --project MyProject --repo my-repo --pr-id 42 \
--reviewer-id "guid" --vote 10
# PR comments
python scripts/repos.py list-threads --project MyProject --repo my-repo --pr-id 42
python scripts/repos.py create-thread --project MyProject --repo my-repo --pr-id 42 \
--content "Looks good!" --file-path "/src/main.py" --line 25
python scripts/repos.py add-thread-comment --project MyProject --repo my-repo --pr-id 42 \
--thread-id 1 --content "Fixed"
# Complete or abandon PR
python scripts/repos.py complete-pr --project MyProject --repo my-repo --pr-id 42
python scripts/repos.py complete-pr --project MyProject --repo my-repo --pr-id 42 \
--merge-strategy rebase --keep-source
python scripts/repos.py abandon-pr --project MyProject --repo my-repo --pr-id 42
# Diff
python scripts/repos.py get-diff --project MyProject --repo my-repo --base main --target feature/new
# Browse files
python scripts/repos.py list-files --project MyProject --repo my-repo --path /src --branch main
Iterations & Capacity (scripts/work.py)
# List iterations
python scripts/work.py list-iterations --project MyProject
# Create iteration
python scripts/work.py create-iteration --project MyProject --name "Sprint 5" \
--start-date 2026-03-01 --finish-date 2026-03-14
# Get iteration details
python scripts/work.py get-iteration --project MyProject --iteration-id "guid"
# Team iterations
python scripts/work.py team-iterations --project MyProject --team "MyTeam" --timeframe current
# Assign iteration to team
python scripts/work.py assign-iteration --project MyProject --team "MyTeam" --iteration-id "guid"
# Capacities
python scripts/work.py get-capacities --project MyProject --team "MyTeam" --iteration-id "guid"
python scripts/work.py set-capacity --project MyProject --team "MyTeam" --iteration-id "guid" \
--member-id "user-guid" --activity Development --capacity-per-day 6
Pipelines & Builds (scripts/pipelines.py)
# Create pipeline
python scripts/pipelines.py create --project MyProject --name "CI" \
--repo-id "repo-guid" --yaml-path "/azure-pipelines.yml"
# List builds
python scripts/pipelines.py list-builds --project MyProject --top 5
python scripts/pipelines.py list-builds --project MyProject --status completed --branch main
# Get build details and logs
python scripts/pipelines.py get-build --project MyProject --build-id 100
python scripts/pipelines.py build-logs --project MyProject --build-id 100
python scripts/pipelines.py build-logs --project MyProject --build-id 100 --log-id 3
python scripts/pipelines.py build-changes --project MyProject --build-id 100
# Pipeline definitions
python scripts/pipelines.py list-definitions --project MyProject
python scripts/pipelines.py list-definitions --project MyProject --name "CI"
# Run a pipeline
python scripts/pipelines.py run --project MyProject --pipeline-id 5 --branch develop
python scripts/pipelines.py run --project MyProject --pipeline-id 5 \
--variable ENV production --variable