From sprint-ado
Maps raw Azure DevOps work item objects to the internal InternalTicket format used by the sprint-coding-agent routing skills. Extracts id, title, description (HTML to plain text), type, labels (from tags), components (from area path segments), links, priority, and assignee. Populates domainSignals as an empty array for tag-classifier to fill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sprint-ado:workitem-normalizerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Transforms raw Azure DevOps work item objects into the normalised `InternalTicket` format consumed by `domain-router` and `dependency-mapper`. Runs after `iteration-fetcher`, before `tag-classifier`.
Transforms raw Azure DevOps work item objects into the normalised InternalTicket format consumed by domain-router and dependency-mapper. Runs after iteration-fetcher, before tag-classifier.
{
"id": "4721",
"title": "Add login endpoint",
"description": "Plain text, max 500 chars",
"type": "User Story",
"labels": ["api", "auth"],
"components": ["MyProject", "Backend", "Auth"],
"links": [
{ "type": "blocks", "targetId": "4722" }
],
"priority": "2",
"assignee": "[email protected]",
"domainSignals": []
}
| InternalTicket field | ADO source |
|---|---|
id | workItem.id as string (e.g. "4721") |
title | fields["System.Title"] |
description | fields["System.Description"] — HTML to plain text (see below), truncated to 500 chars |
type | fields["System.WorkItemType"] |
labels | fields["System.Tags"] split on "; " (semicolon + space), each segment trimmed. If null or empty, use [] |
components | fields["System.AreaPath"] split on \ — all segments included. If null or empty, use [] |
links | workItem.relations — see link normalisation below. If relations is null or empty, use [] |
priority | fields["Microsoft.VSTS.Common.Priority"] converted to string ("1", "2", "3", "4"). If null, use null |
assignee | fields["System.AssignedTo"].uniqueName. If null or unassigned, use null |
domainSignals | Empty array [] — populated by tag-classifier |
ADO work item descriptions are HTML. Convert to plain text:
<[^>]+>)& → &< → <> → > → (space)' → '" → "If description is null or not a string, use "".
Map ADO rel values to internal link types:
ADO rel | Internal type |
|---|---|
System.LinkTypes.Dependency-Forward | blocks |
System.LinkTypes.Dependency-Reverse | is blocked by |
System.LinkTypes.Related | relates to |
| All others | relates to |
For each relation in workItem.relations:
url field
(e.g. https://dev.azure.com/org/proj/_apis/wit/workitems/4722 → "4722")url does not point to a work item (e.g. hyperlinks, commits){ type, targetId } object per valid relationArray of InternalTicket objects, one per raw ADO work item.
[
{
"id": "4721",
"title": "Add login endpoint",
"description": "Implement JWT-based auth on the /login endpoint using the existing user service.",
"type": "User Story",
"labels": ["api", "auth"],
"components": ["MyProject", "Backend", "Auth"],
"links": [
{ "type": "blocks", "targetId": "4722" }
],
"priority": "2",
"assignee": "[email protected]",
"domainSignals": []
}
]
Guides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Enforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
npx claudepluginhub gagandeepp/software-agent-teams --plugin sprint-ado