.claude/skills/ado-assign-testing/SKILL.md
Distribute reviewed work items to team members for testing
npx skillsauth add Vvanlaar/orch ado-assign-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Assign reviewed ADO work items to team members for testing. Distributes items evenly while respecting the rule: never assign to the person who resolved or reviewed the item.
--users "email1,email2,..." - Comma-separated list of team member emails to receive assignmentscurl -s http://localhost:3010/api/sprint/reviewed-items
Returns JSON with sprintName and items[] containing:
id, title, state, type, urlassignedTo - current assignee (skip if already set)resolvedBy - display name of resolverreviewedBy - display name of reviewerRead C:\dev\ai\orch\.env for:
ADO_ORG - Azure DevOps organizationADO_PAT - Personal access tokenADO_PROJECT - Project name (e.g., BBNew)const nameToEmail = {
'Guido Hultink': '[email protected]',
'Martijn Bots': '[email protected]',
'Janroel Koppen': '[email protected]',
'Vincent van Laar': '[email protected]',
'Jan ten Haaf': '[email protected]',
'Max Mulder': '[email protected]',
'Simon Smulders': '[email protected]',
'Peter van der Spek': '[email protected]',
'Olaf Timme': '[email protected]'
};
Write a Node.js script in scratchpad:
// Track assignments per user
const userCounts = {};
users.forEach(u => userCounts[u] = 0);
const assignments = [];
const skipped = [];
items.forEach(item => {
// Skip items already assigned
if (item.assignedTo) {
skipped.push({id: item.id, reason: 'Already assigned to ' + item.assignedTo});
return;
}
const resolverEmail = nameToEmail[item.resolvedBy] || '';
const reviewerEmail = nameToEmail[item.reviewedBy] || '';
// Filter eligible users (not resolver, not reviewer)
const eligible = users.filter(u => u !== resolverEmail && u !== reviewerEmail);
if (eligible.length === 0) {
skipped.push({id: item.id, reason: 'No eligible users'});
return;
}
// Pick user with fewest assignments
eligible.sort((a, b) => userCounts[a] - userCounts[b]);
const assignee = eligible[0];
userCounts[assignee]++;
assignments.push({id: item.id, assignee});
});
ADO API to update AssignedTo:
async function assignItem(id, assignee) {
const url = `https://dev.azure.com/${ADO_ORG}/${PROJECT}/_apis/wit/workitems/${id}?api-version=7.1`;
const auth = Buffer.from(':' + ADO_PAT).toString('base64');
const body = [{ op: 'replace', path: '/fields/System.AssignedTo', value: assignee }];
const response = await fetch(url, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json-patch+json',
'Authorization': `Basic ${auth}`
},
body: JSON.stringify(body)
});
return response.ok;
}
Output markdown table:
## Testing Assignment Complete
**Sprint:** [Sprint Name]
**Total Items:** N assigned
**Skipped:** N
**Users:** N
### Assignments by User
| User | Items | Work Item IDs |
|------|-------|---------------|
| [email protected] | 5 | #123, #456, ... |
resolvedBy should not test their own workreviewedBy already reviewed itassignedTo set are skippedreviewedBy field requires ADO_REVIEWED_BY_FIELD=Microsoft.VSTS.Common.ReviewedBy in .env (NOT Custom.ReviewedBy)/ado-assign-testing --users "[email protected],[email protected],[email protected]"
tools
Sync GitHub repos from bluebillywig org to an ADO "Repository" picklist field on all work item types
development
Build a new desktop app release (Electron). Triggers on "build desktop", "new release", "desktop release", "build the app"
development
Generic Azure DevOps operations — edit tickets, query work items, add comments, change fields, move sprints, assign users, link items, and more. Triggers on "ado", "edit ticket", "update ticket", "move ticket", "assign ticket", "link ticket", "query ado", "search ado", "add comment to ticket", or ticket number mentions with edit/update intent.
testing
Use when testing and verifying a bug fix or feature for an ADO ticket. Triggers on /ado-test, "test ticket", or requests to test a ticket number.