| name | azure-devops |
| description | Manage Azure DevOps boards, work items, sprints, and queries. Use when working with Azure DevOps tickets, creating/updating work items, viewing backlogs, managing sprints, or querying boards. |
| allowed-tools | Bash |
Azure DevOps Boards Management
This skill provides a CLI tool to manage Azure DevOps boards, work items, sprints, and queries.
CRITICAL: Board URL Required for Creating Work Items
IMPORTANT: When creating User Stories, Tasks, or any work items, you MUST:
- Request a board URL from the user (e.g.,
https://dev.azure.com/ORG/PROJECT/_boards/board/t/TEAM/Stories)
- Parse the URL to extract the team name
- Fetch the team's area path before creating any work items
- Use that area path for all work items to ensure they appear on the correct board
Workflow for Creating Work Items
node ~/.claude/skills/azure-devops/src/cli.js area list --depth 2
node ~/.claude/skills/azure-devops/src/cli.js wi create "User Story" \
--title "My Story" \
--areaPath "ArtificialIntelligence\\Dev Team" \
--iterationPath "ArtificialIntelligence\\Sprint 1"
Why This Matters
- Work items appear on a team's board based on their Area Path, NOT the team name in configuration
- Each team is configured to track specific area paths
- If you use the wrong area path, the work item will appear on a different team's board or not at all
Common Mistake to Avoid
❌ WRONG: Using the project root as area path
--areaPath "ArtificialIntelligence"
✅ CORRECT: Using the team-specific area path
--areaPath "ArtificialIntelligence\\Dev Team"
Configuration
Option 1: .env file (Recommended)
Create a .env file in the skill directory:
cp ~/.claude/skills/azure-devops/.env.example ~/.claude/skills/azure-devops/.env
Edit ~/.claude/skills/azure-devops/.env:
AZDO_ORGANIZATION=your-org-name
AZDO_PROJECT=your-project
AZDO_PAT=your-personal-access-token
AZDO_TEAM=Your Team Name
Option 2: Environment Variables
Alternatively, set these environment variables:
export AZDO_ORGANIZATION="your-org-name"
export AZDO_PROJECT="your-project"
export AZDO_PAT="your-personal-access-token"
export AZDO_TEAM="Your Team Name"
Note: The .env file takes precedence over environment variables.
CLI Location
~/.claude/skills/azure-devops/src/cli.js
Quick Reference
Work Items
node ~/.claude/skills/azure-devops/src/cli.js wi list
node ~/.claude/skills/azure-devops/src/cli.js wi list --type Bug --state Active
node ~/.claude/skills/azure-devops/src/cli.js wi list --assignedTo "user@example.com"
node ~/.claude/skills/azure-devops/src/cli.js wi list --iterationPath "Project\\Sprint 1"
node ~/.claude/skills/azure-devops/src/cli.js wi get 123
node ~/.claude/skills/azure-devops/src/cli.js wi get 123 --expand Relations
node ~/.claude/skills/azure-devops/src/cli.js wi create Task --title "Fix login bug"
node ~/.claude/skills/azure-devops/src/cli.js wi create Bug --title "Crash on startup" --description "App crashes when..." --assignedTo "user@example.com"
node ~/.claude/skills/azure-devops/src/cli.js wi create "User Story" --title "As a user I want to..." --tags "frontend,priority"
node ~/.claude/skills/azure-devops/src/cli.js wi create "User Story" --title "Feature X" \
--description "## Overview
User needs to do X.
## Details
- Point 1
- Point 2" \
--acceptanceCriteria "- [ ] Criterion 1
- [ ] Criterion 2
- [ ] Criterion 3"
node ~/.claude/skills/azure-devops/src/cli.js wi create "User Story" --title "Feature Y" \
--areaPath "Project\\Team Name" \
--iterationPath "Project\\Sprint 1"
node ~/.claude/skills/azure-devops/src/cli.js wi update 123 --state "In Progress"
node ~/.claude/skills/azure-devops/src/cli.js wi update 123 --title "New title" --assignedTo "other@example.com"
node ~/.claude/skills/azure-devops/src/cli.js wi update 123 --acceptanceCriteria "- [ ] Updated criterion 1
- [ ] Updated criterion 2"
node ~/.claude/skills/azure-devops/src/cli.js wi 456 123
node ~/.claude/skills/azure-devops/src/cli.js wi 456 123 --
node ~/.claude/skills/azure-devops/src/cli.js wi 456 789 --
node ~/.claude/skills/azure-devops/src/cli.js wi delete 123
node ~/.claude/skills/azure-devops/src/cli.js wi comment 123 --add
node ~/.claude/skills/azure-devops/src/cli.js wi comment 123
node ~/.claude/skills/azure-devops/src/cli.js wi types
node ~/.claude/skills/azure-devops/src/cli.js wi states Bug
node ~/.claude/skills/azure-devops/src/cli.js wi attach 123 ./technical-design.md
node ~/.claude/skills/azure-devops/src/cli.js wi attach 123 ./design.md --name --comment
node ~/.claude/skills/azure-devops/src/cli.js wi attachments 123
WIQL Queries
node ~/.claude/skills/azure-devops/src/cli.js wi query "SELECT [System.Id], [System.Title] FROM WorkItems WHERE [System.State] = 'New'"
node ~/.claude/skills/azure-devops/src/cli.js wi query "SELECT [System.Id] FROM WorkItems WHERE [System.AssignedTo] = @Me AND [System.State] <> 'Closed' ORDER BY [System.ChangedDate] DESC"
Boards
node ~/.claude/skills/azure-devops/src/cli.js board list
node ~/.claude/skills/azure-devops/src/cli.js board get Stories
node ~/.claude/skills/azure-devops/src/cli.js board columns Stories
node ~/.claude/skills/azure-devops/src/cli.js board rows Stories
Iterations (Sprints)
node ~/.claude/skills/azure-devops/src/cli.js iteration list
node ~/.claude/skills/azure-devops/src/cli.js iteration list --timeframe current
node ~/.claude/skills/azure-devops/src/cli.js iteration list --timeframe future
node ~/.claude/skills/azure-devops/src/cli.js iteration current
node ~/.claude/skills/azure-devops/src/cli.js iteration work-items <iteration-id>
node ~/.claude/skills/azure-devops/src/cli.js iteration create --name "Sprint 1" --startDate 2025-01-07 --finishDate 2025-01-20
node ~/.claude/skills/azure-devops/src/cli.js iteration create --name "Sprint 1" --startDate 2025-01-07 --finishDate 2025-01-20 --path "Release 1"
node ~/.claude/skills/azure-devops/src/cli.js iteration generate
node ~/.claude/skills/azure-devops/src/cli.js iteration generate --startDate 2025-01-07 --endDate 2026-01-07
node ~/.claude/skills/azure-devops/src/cli.js iteration generate --weeks 2 --prefix "Sprint" --startNumber 1
node ~/.claude/skills/azure-devops/src/cli.js iteration generate --weeks 3 --prefix "Iteration" --path "2025"
node ~/.claude/skills/azure-devops/src/cli.js iteration generate --noTeam
node ~/.claude/skills/azure-devops/src/cli.js iteration add-to-team <iteration-id>
node ~/.claude/skills/azure-devops/src/cli.js iteration remove-from-team <iteration-id>
Areas
node ~/.claude/skills/azure-devops/src/cli.js area list
node ~/.claude/skills/azure-devops/src/cli.js area list --depth 3
Saved Queries
node ~/.claude/skills/azure-devops/src/cli.js query list
node ~/.claude/skills/azure-devops/src/cli.js query shared
node ~/.claude/skills/azure-devops/src/cli.js query my
node ~/.claude/skills/azure-devops/src/cli.js query run "Shared Queries/Active Bugs"
node ~/.claude/skills/azure-devops/src/cli.js query run <query-guid>
Team
node ~/.claude/skills/azure-devops/src/cli.js team members
node ~/.claude/skills/azure-devops/src/cli.js team settings
Common Work Item Types
- Epic - Large feature or initiative
- Feature - Product feature
- User Story - User-facing functionality
- Task - Development task
- Bug - Defect to fix
- Issue - Problem or impediment
Common States
- New - Not started
- Active / In Progress - Being worked on
- Resolved - Completed, awaiting verification
- Closed - Done
- Removed - Deleted/cancelled
WIQL Reference
WIQL (Work Item Query Language) is similar to SQL:
SELECT [System.Id], [System.Title], [System.State]
FROM WorkItems
WHERE [System.TeamProject] = 'MyProject'
AND [System.WorkItemType] = 'Bug'
AND [System.State] <> 'Closed'
AND [System.AssignedTo] = @Me
ORDER BY [System.CreatedDate] DESC
Common Fields
| Field | Description |
|---|
System.Id | Work item ID |
System.Title | Title |
System.State | Current state |
System.AssignedTo | Assigned user |
System.WorkItemType | Type (Bug, Task, etc.) |
System.AreaPath | Area path |
System.IterationPath | Sprint/iteration |
System.CreatedDate | Creation date |
System.ChangedDate | Last modified date |
System.Tags | Tags |
System.Description | Description (supports Markdown) |
Microsoft.VSTS.Common.AcceptanceCriteria | Acceptance criteria (supports Markdown, User Stories) |
WIQL Operators
=, <>, <, >, <=, >=
CONTAINS, NOT CONTAINS
IN, NOT IN
UNDER (for paths)
@Me - Current user
@Today - Today's date
Output Format
All commands output JSON for easy parsing. Work items are formatted as:
{
"id": 123,
"type": "User Story",
"title": "Fix login issue",
"state": "Active",
"assignedTo": "John Doe",
"areaPath": "Project\\Area",
"iterationPath": "Project\\Sprint 1",
"createdDate": "2024-01-15T10:00:00Z",
"changedDate": "2024-01-16T14:30:00Z",
"description": "## Overview\nUser story description...",
"acceptanceCriteria": "- [ ] Criterion 1\n- [ ] Criterion 2",
"tags": "frontend; priority"
}
Markdown Formatting
Always use Markdown for description and acceptance criteria fields. Azure DevOps renders Markdown properly.
Description Example
## Summary
Brief overview of the feature.
## Details
- Key point 1
- Key point 2
## Context
Background information if needed.
Acceptance Criteria Example
- [ ] User can perform action X
- [ ] System displays confirmation message
- [ ] Error is shown when validation fails
- [ ] Data is persisted correctly
Troubleshooting
Work Item Not Visible on Board
For a work item to appear on a team's board, it must have:
- Area Path: Set to the team's area (e.g.,
Project\Team Name)
- Iteration Path: Set to an iteration the team is tracking (e.g.,
Project\Sprint 1)
Use area list and iteration list to find valid paths for your team.
Authentication Error
Ensure your PAT has the correct scopes:
- Work Items: Read & Write
- Project and Team: Read
404 Not Found
- Check organization and project names are correct
- Verify the work item ID exists
- Ensure team name matches (case-sensitive)
Permission Denied
- Your PAT may have expired
- You may not have access to the project/area