# Work Items

## Update IssueOps request from workflow callback

> Called by the workflow callback flow to update the IssueOps request status.\
> Maps callback events to request statuses:\
> \- \`started\` → \`in\_progress\`\
> \- \`completed\` → \`completed\` (or \`closed\` if work item was closed)\
> \- \`failed\` → \`failed\`\
> \- \`rejected\` → \`completed\`\
> \- \`cancelled\` → \`closed\`\
> \
> Uses findOrCreate reconciliation — if the request was not tracked at creation time, it will be backfilled.

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"IssueOpsCallbackDto":{"type":"object","properties":{"event":{"type":"string","description":"Callback event type","enum":["started","completed","failed","rejected","cancelled"]},"platform":{"type":"string","description":"Callback provider type","enum":["github","azure-devops"]},"workItemKey":{"type":"string","description":"Work item key (issue number for GitHub, work item ID for Azure DevOps)"},"projectIdentifier":{"type":"string","description":"Project identifier (owner/repo)"},"closed":{"type":"boolean","description":"Whether the work item was closed as part of this callback"}},"required":["event","platform","workItemKey","projectIdentifier"]}}},"paths":{"/sfp/api/work-items/requests/callback":{"post":{"operationId":"IssueOpsRequestsController_handleCallback","summary":"Update IssueOps request from workflow callback","description":"Called by the workflow callback flow to update the IssueOps request status.\nMaps callback events to request statuses:\n- `started` → `in_progress`\n- `completed` → `completed` (or `closed` if work item was closed)\n- `failed` → `failed`\n- `rejected` → `completed`\n- `cancelled` → `closed`\n\nUses findOrCreate reconciliation — if the request was not tracked at creation time, it will be backfilled.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueOpsCallbackDto"}}}},"responses":{"200":{"description":"Request status updated"},"403":{"description":"Forbidden - Requires role: owner, application"}},"tags":["Work Items"]}}}}
```

## List IssueOps requests

> List and filter IssueOps requests for a project.\
> \
> \## Key Use Cases\
> \
> \- \*\*In-flight requests\*\*: \`?projectIdentifier=x\&status=open,in\_progress\`\
> \- \*\*Requests for a release candidate\*\*: \`?projectIdentifier=x\&releaseCandidate=core:RC-JAN25-01\`\
> \- \*\*Failed release requests\*\*: \`?projectIdentifier=x\&taskType=execute-release\&status=failed\`\
> \
> The \`status\` parameter supports comma-separated values for filtering multiple statuses at once.

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/work-items/requests":{"get":{"operationId":"IssueOpsRequestsController_listRequests","summary":"List IssueOps requests","description":"List and filter IssueOps requests for a project.\n\n## Key Use Cases\n\n- **In-flight requests**: `?projectIdentifier=x&status=open,in_progress`\n- **Requests for a release candidate**: `?projectIdentifier=x&releaseCandidate=core:RC-JAN25-01`\n- **Failed release requests**: `?projectIdentifier=x&taskType=execute-release&status=failed`\n\nThe `status` parameter supports comma-separated values for filtering multiple statuses at once.","parameters":[{"name":"projectIdentifier","required":true,"in":"query","description":"Project identifier to scope results","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by status. Comma-separated for multiple: open,in_progress","schema":{"type":"string"}},{"name":"platform","required":false,"in":"query","description":"Filter by platform","schema":{"enum":["jira","github","azure-devops"],"type":"string"}},{"name":"taskType","required":false,"in":"query","description":"Filter by task type (e.g., execute-release, request-sandbox-create)","schema":{"type":"string"}},{"name":"releaseCandidate","required":false,"in":"query","description":"Filter by release candidate (e.g., core:RC-JAN25-01). Returns all requests targeting this RC.","schema":{"type":"string"}},{"name":"repositoryIdentifier","required":false,"in":"query","description":"Filter by target repository identifier","schema":{"type":"string"}},{"name":"createdBy","required":false,"in":"query","description":"Filter by actor email","schema":{"type":"string"}},{"name":"since","required":false,"in":"query","description":"Only requests created after this ISO 8601 timestamp","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of results","schema":{"default":50,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Offset for pagination","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":"List of IssueOps requests"},"403":{"description":"Forbidden - Requires role: owner, member, application"}},"tags":["Work Items"]}}}}
```

## Get an IssueOps request by ID

> Get a single IssueOps request by its UUID.

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/work-items/requests/{id}":{"get":{"operationId":"IssueOpsRequestsController_getRequest","summary":"Get an IssueOps request by ID","description":"Get a single IssueOps request by its UUID.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"IssueOps request details"},"403":{"description":"Forbidden - Requires role: owner, member, application"},"404":{"description":"Request not found"}},"tags":["Work Items"]}}}}
```

## Create work item with embedded task payload

> \
> Creates a work item (GitHub Issue or Azure DevOps Work Item) with an embedded task payload for IssueOps automation.\
> \
> \## How It Works\
> \
> 1\. \*\*Provider Detection\*\*: The provider is determined by the project's \`configuration.workItems.provider\` setting\
> 2\. \*\*Authentication\*\*: The user's Personal Access Token (PAT) is used from the \`authToken\` field (required)\
> 3\. \*\*Payload Embedding\*\*: The task payload is embedded in the work item body for later extraction by automation\
> \
> \## Prerequisites\
> \
> \### 1. Project Configuration\
> The project must have \`workItems.provider\` configured:\
> \
> \`\`\`bash\
> \# Set via CLI\
> sfp server project update -r flxbl-io/sf-core \\\
> &#x20; -p configuration.workItems \\\
> &#x20; -v '{"provider": "azure-devops"}'\
> \
> \# Or via API\
> PATCH /projects/flxbl-io%2Fsf-core\
> {\
> &#x20; "property": "configuration.workItems",\
> &#x20; "value": { "provider": "azure-devops" }\
> }\
> \`\`\`\
> \
> \### 2. Authentication - User PAT Required\
> \
> \*\*The \`authToken\` field is mandatory.\*\* Work items are created using the user's Personal Access Token (PAT) to ensure proper attribution and audit trail.\
> \
> \*\*Why PAT is Required\*\*:\
> \- Work items show the actual user as the creator\
> \- Clear audit trail of who initiated each request\
> \- Proper attribution for compliance and tracking\
> \
> \*\*PAT Requirements:\*\*\
> \- \*\*GitHub\*\*: Token with \`repo\` (private) or \`public\_repo\` (public) scope\
> \- \*\*Azure DevOps\*\*: PAT with "Work Items: Read & Write" scope\
> \
> \*\*Note\*\*: Server-stored credentials (service principal or stored PAT) are not used for work item creation to ensure proper user attribution.\
> \
> \## Valid Task Types\
> \
> \| Task Type | Description |\
> \|-----------|-------------|\
> \| \`request-elevated-privileges\` | Request temporary elevated access |\
> \| \`request-freeze-users\` | Freeze users in an environment |\
> \| \`request-unfreeze-users\` | Unfreeze users in an environment |\
> \| \`request-sandbox-create\` | Create a new sandbox |\
> \| \`request-sandbox-refresh\` | Refresh sandbox from source |\
> \| \`request-sandbox-delete\` | Delete a sandbox |\
> \| \`install-packages\` | Install managed/unlocked packages |\
> \| \`install-artifacts\` | Install build artifacts |\
> \| \`create-patch-branch\` | Create a patch branch |\
> \| \`run-apex-tests\` | Execute Apex tests |\
> \
> \## Flow Triggering\
> \
> When \`triggerFlow: true\` is set, the endpoint will:\
> 1\. Create the work item as usual\
> 2\. Trigger the associated Hatchet workflow with the payload\
> 3\. Pass the created work item as the callback destination for flow notifications\
> 4\. Return both work item details and flow trigger results\
> \
> This enables end-to-end IssueOps automation where creating a work item immediately kicks off the associated workflow.\
> \
> \## Payload Embedding\
> \
> The payload is embedded in the work item body in a format that can be extracted by automation:\
> \
> \- \*\*GitHub\*\*: Embedded as HTML comment \`\<!-- {"id": "...", ...} -->\`\
> \- \*\*Azure DevOps\*\*: Embedded in collapsible section (Azure strips HTML comments)<br>

````json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"CreateWorkItemWithPayloadDto":{"type":"object","properties":{"projectIdentifier":{"type":"string","description":"Project identifier as registered in sfp server. Must match the project's `workItems.provider` configuration."},"title":{"type":"string","description":"Work item title. Use a descriptive prefix like [Request] for IssueOps workflows."},"body":{"type":"string","description":"Work item body/description. The task payload will be appended to this."},"payload":{"type":"object","description":"Task payload with `id` matching a registered task type. Valid types:\n- `request-elevated-privileges` - Request temporary elevated access\n- `request-freeze-users` - Freeze users in an environment\n- `request-unfreeze-users` - Unfreeze users\n- `request-sandbox-create` - Create a new sandbox\n- `request-sandbox-refresh` - Refresh sandbox from source\n- `request-sandbox-delete` - Delete a sandbox\n- `install-packages` - Install managed/unlocked packages\n- `install-artifacts` - Install build artifacts\n- `create-patch-branch` - Create a patch branch\n- `run-apex-tests` - Execute Apex tests\n- `request-a-release-to-release-envs` - Request release deployment to environments (orchestrator)\n- `execute-release` - Execute release to a single environment\n- `unbundle-release-candidate` - Remove commits from a release candidate branch"},"authToken":{"type":"string","description":"Personal Access Token (PAT) for authentication. **Required** for proper user attribution.\n\n**Why PAT is Required**: Work items are created on behalf of the actual user for proper audit trail.\nWhen using a PAT, the work item shows the user as the creator, making it clear who initiated the request.\nUsing server-stored credentials would attribute all work items to the integration service account.\n\n**GitHub**: Token with `repo` (private) or `public_repo` (public) scope\n**Azure DevOps**: PAT with \"Work Items: Read & Write\" scope"},"labels":{"description":"Labels/tags to apply to the work item. Used for filtering and automation triggers.","type":"array","items":{"type":"string"}},"assignees":{"description":"Assignees for the work item.\n\n**GitHub**: Array of GitHub usernames\n**Azure DevOps**: Array of email addresses","type":"array","items":{"type":"string"}},"milestone":{"type":"string","description":"**GitHub only**: Milestone number or title to associate with the issue"},"workItemType":{"type":"string","description":"**Azure DevOps only**: Work item type. Common types depend on the process template:\n\n- **Basic**: Issue, Epic, Task\n- **Agile**: Bug, User Story, Task, Epic\n- **Scrum**: Bug, Product Backlog Item, Task, Epic"},"areaPath":{"type":"string","description":"**Azure DevOps only**: Area path for categorization. Use backslashes to separate hierarchy."},"iterationPath":{"type":"string","description":"**Azure DevOps only**: Iteration path for sprint assignment. Use backslashes to separate hierarchy."},"priority":{"type":"number","description":"**Azure DevOps only**: Priority level (1 = highest, 4 = lowest)","minimum":1,"maximum":4},"organizationUrl":{"type":"string","description":"**Azure DevOps only**: Organization URL.\n\n**Optional if configured in project settings.** The server first checks the project's `configuration.workItems.organizationUrl`.\nOnly provide this to override the project configuration or if not configured at the project level.\n\nConfigure at project level via:\n```\nPATCH /projects/{identifier}\n{ \"property\": \"configuration.workItems\", \"value\": { \"organizationUrl\": \"https://dev.azure.com/org\", \"project\": \"proj\" } }\n```"},"project":{"type":"string","description":"**Azure DevOps only**: Project name within the organization.\n\n**Optional if configured in project settings.** The server first checks the project's `configuration.workItems.project`.\nOnly provide this to override the project configuration or if not configured at the project level."},"triggerFlow":{"type":"boolean","description":"Controls whether to trigger the Hatchet workflow immediately after creating the work item.\n\n**When to set `triggerFlow: true`:**\n- You want to trigger the flow immediately without waiting for webhook events\n- The work item is being created programmatically (e.g., from a UI or automation)\n- You don't have IssueOps webhooks configured for label-based triggering\n\n**When to set `triggerFlow: false` (default):**\n- You're using the IssueOps pattern where GitHub/Azure DevOps webhooks trigger flows based on labels\n- You want manual control over when the flow starts (e.g., after review)\n- The work item is for tracking purposes only\n\nWhen `true`:\n- The flow is triggered synchronously after work item creation\n- The work item becomes the callback destination for flow notifications\n- The response includes `flowExecution` details with the execution ID\n\nWhen `false` (default):\n- Only the work item is created\n- Flow must be triggered separately (via webhook, label, or manual API call)","default":false}},"required":["projectIdentifier","title","payload","authToken"]},"WorkItemCreationResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the created work item"},"key":{"type":"string","description":"Human-readable key (issue number for GitHub, work item ID for Azure DevOps)"},"url":{"type":"string","description":"Direct URL to the work item in the provider's UI"},"platform":{"type":"string","description":"Platform where the work item was created","enum":["github","azure-devops","jira"]},"createdAt":{"type":"string","description":"ISO 8601 timestamp of when the work item was created"},"flowExecution":{"description":"Flow execution details (only present when triggerFlow: true was set in the request)","allOf":[{"$ref":"#/components/schemas/FlowExecutionInfoDto"}]}},"required":["id","key","url","platform","createdAt"]},"FlowExecutionInfoDto":{"type":"object","properties":{"id":{"type":"string","description":"Task execution ID (use this to track the flow)"},"taskType":{"type":"string","description":"Task type that was triggered"},"status":{"type":"string","description":"Current status of the flow"},"triggeredAt":{"type":"string","description":"ISO 8601 timestamp of when the flow was triggered"}},"required":["id","taskType","status","triggeredAt"]}}},"paths":{"/sfp/api/work-items/with-payload":{"post":{"operationId":"WorkItemsController_createWorkItemWithPayload","summary":"Create work item with embedded task payload","description":"\nCreates a work item (GitHub Issue or Azure DevOps Work Item) with an embedded task payload for IssueOps automation.\n\n## How It Works\n\n1. **Provider Detection**: The provider is determined by the project's `configuration.workItems.provider` setting\n2. **Authentication**: The user's Personal Access Token (PAT) is used from the `authToken` field (required)\n3. **Payload Embedding**: The task payload is embedded in the work item body for later extraction by automation\n\n## Prerequisites\n\n### 1. Project Configuration\nThe project must have `workItems.provider` configured:\n\n```bash\n# Set via CLI\nsfp server project update -r flxbl-io/sf-core \\\n  -p configuration.workItems \\\n  -v '{\"provider\": \"azure-devops\"}'\n\n# Or via API\nPATCH /projects/flxbl-io%2Fsf-core\n{\n  \"property\": \"configuration.workItems\",\n  \"value\": { \"provider\": \"azure-devops\" }\n}\n```\n\n### 2. Authentication - User PAT Required\n\n**The `authToken` field is mandatory.** Work items are created using the user's Personal Access Token (PAT) to ensure proper attribution and audit trail.\n\n**Why PAT is Required**:\n- Work items show the actual user as the creator\n- Clear audit trail of who initiated each request\n- Proper attribution for compliance and tracking\n\n**PAT Requirements:**\n- **GitHub**: Token with `repo` (private) or `public_repo` (public) scope\n- **Azure DevOps**: PAT with \"Work Items: Read & Write\" scope\n\n**Note**: Server-stored credentials (service principal or stored PAT) are not used for work item creation to ensure proper user attribution.\n\n## Valid Task Types\n\n| Task Type | Description |\n|-----------|-------------|\n| `request-elevated-privileges` | Request temporary elevated access |\n| `request-freeze-users` | Freeze users in an environment |\n| `request-unfreeze-users` | Unfreeze users in an environment |\n| `request-sandbox-create` | Create a new sandbox |\n| `request-sandbox-refresh` | Refresh sandbox from source |\n| `request-sandbox-delete` | Delete a sandbox |\n| `install-packages` | Install managed/unlocked packages |\n| `install-artifacts` | Install build artifacts |\n| `create-patch-branch` | Create a patch branch |\n| `run-apex-tests` | Execute Apex tests |\n\n## Flow Triggering\n\nWhen `triggerFlow: true` is set, the endpoint will:\n1. Create the work item as usual\n2. Trigger the associated Hatchet workflow with the payload\n3. Pass the created work item as the callback destination for flow notifications\n4. Return both work item details and flow trigger results\n\nThis enables end-to-end IssueOps automation where creating a work item immediately kicks off the associated workflow.\n\n## Payload Embedding\n\nThe payload is embedded in the work item body in a format that can be extracted by automation:\n\n- **GitHub**: Embedded as HTML comment `<!-- {\"id\": \"...\", ...} -->`\n- **Azure DevOps**: Embedded in collapsible section (Azure strips HTML comments)\n","parameters":[],"requestBody":{"required":true,"description":"Work item creation parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkItemWithPayloadDto"}}}},"responses":{"201":{"description":"Work item created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemCreationResponseDto"}}}},"400":{"description":"Invalid request - bad task type or missing required fields","content":{"application/json":{}}},"401":{"description":"Authentication failed - invalid or expired token","content":{"application/json":{}}},"403":{"description":"Forbidden - Requires role: owner, member"},"404":{"description":"Project not found","content":{"application/json":{}}}},"tags":["Work Items"]}}}}
````

## Update a work item

> \
> Update a work item on the specified platform.\
> \
> \## Supported Platforms\
> \
> \| Platform | Requirements |\
> \|----------|--------------|\
> \| \`github\` | Requires \`projectIdentifier\` (owner/repo format) |\
> \| \`azure-devops\` | Uses configured integration credentials |\
> \| \`jira\` | Not yet implemented |\
> \
> \## Available Updates\
> \
> \- \*\*title\*\*: Update the work item title\
> \- \*\*body\*\*: Update the description/body\
> \- \*\*state\*\*: Change the state (e.g., "open", "closed" for GitHub)\
> \- \*\*labels\*\*: Set labels/tags\
> \- \*\*assignees\*\*: Set assignees<br>

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"WorkItemPlatform":{"type":"string","enum":["jira","github","azure-devops"]}}},"paths":{"/sfp/api/work-items/{platform}/{id}":{"patch":{"operationId":"WorkItemsController_updateWorkItem","summary":"Update a work item","description":"\nUpdate a work item on the specified platform.\n\n## Supported Platforms\n\n| Platform | Requirements |\n|----------|--------------|\n| `github` | Requires `projectIdentifier` (owner/repo format) |\n| `azure-devops` | Uses configured integration credentials |\n| `jira` | Not yet implemented |\n\n## Available Updates\n\n- **title**: Update the work item title\n- **body**: Update the description/body\n- **state**: Change the state (e.g., \"open\", \"closed\" for GitHub)\n- **labels**: Set labels/tags\n- **assignees**: Set assignees\n","parameters":[{"name":"platform","required":true,"in":"path","description":"Platform where the work item exists","schema":{"$ref":"#/components/schemas/WorkItemPlatform"}},{"name":"id","required":true,"in":"path","description":"Work item ID or key","schema":{"type":"string"}}],"responses":{"200":{"description":"Work item updated successfully"},"400":{"description":"Invalid request or platform not supported"},"403":{"description":"Forbidden - Requires role: owner, application"},"404":{"description":"Work item not found"}},"tags":["Work Items"]}}}}
```

## Close a work item

> \
> Close a work item on the specified platform.\
> \
> \## Supported Platforms\
> \
> \| Platform | Close Behavior |\
> \|----------|---------------|\
> \| \`github\` | Sets issue state to "closed". Optional comment. |\
> \| \`azure-devops\` | Sets state to "Closed" with optional reason. |\
> \| \`jira\` | Not yet implemented |\
> \
> \## Options\
> \
> \- \*\*comment\*\*: Add a comment when closing\
> \- \*\*reason\*\*: Close reason (Azure DevOps only: "Completed", "Resolved", "Removed", etc.)<br>

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"WorkItemPlatform":{"type":"string","enum":["jira","github","azure-devops"]}}},"paths":{"/sfp/api/work-items/{platform}/{id}/close":{"post":{"operationId":"WorkItemsController_closeWorkItem","summary":"Close a work item","description":"\nClose a work item on the specified platform.\n\n## Supported Platforms\n\n| Platform | Close Behavior |\n|----------|---------------|\n| `github` | Sets issue state to \"closed\". Optional comment. |\n| `azure-devops` | Sets state to \"Closed\" with optional reason. |\n| `jira` | Not yet implemented |\n\n## Options\n\n- **comment**: Add a comment when closing\n- **reason**: Close reason (Azure DevOps only: \"Completed\", \"Resolved\", \"Removed\", etc.)\n","parameters":[{"name":"platform","required":true,"in":"path","description":"Platform where the work item exists","schema":{"$ref":"#/components/schemas/WorkItemPlatform"}},{"name":"id","required":true,"in":"path","description":"Work item ID or key","schema":{"type":"string"}}],"responses":{"200":{"description":"Work item closed successfully"},"400":{"description":"Invalid request or platform not supported"},"403":{"description":"Forbidden - Requires role: owner, application"},"404":{"description":"Work item not found"}},"tags":["Work Items"]}}}}
```

## Get work item by ID

> \
> Fetch a work item by its ID. The platform is automatically determined from the project's \`configuration.workItems.provider\` setting.\
> \
> \## ID Formats by Platform\
> \
> \| Platform | ID Format | Example |\
> \|----------|-----------|---------|\
> \| \`jira\` | Project key + number | \`DP-6\`, \`PROJ-123\` |\
> \| \`github\` | Issue number | \`42\`, \`123\` |\
> \| \`azure-devops\` | Work item ID | \`456\`, \`789\` |\
> \
> \## Prerequisites\
> \
> The project must have \`workItems.provider\` configured:\
> \
> \`\`\`bash\
> sfp server project update -r owner/repo \\\
> &#x20; -p configuration.workItems \\\
> &#x20; -v '{"provider": "jira"}'\
> \`\`\`<br>

````json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/work-items/{id}":{"get":{"operationId":"WorkItemsController_getWorkItem","summary":"Get work item by ID","description":"\nFetch a work item by its ID. The platform is automatically determined from the project's `configuration.workItems.provider` setting.\n\n## ID Formats by Platform\n\n| Platform | ID Format | Example |\n|----------|-----------|---------|\n| `jira` | Project key + number | `DP-6`, `PROJ-123` |\n| `github` | Issue number | `42`, `123` |\n| `azure-devops` | Work item ID | `456`, `789` |\n\n## Prerequisites\n\nThe project must have `workItems.provider` configured:\n\n```bash\nsfp server project update -r owner/repo \\\n  -p configuration.workItems \\\n  -v '{\"provider\": \"jira\"}'\n```\n","parameters":[{"name":"id","required":true,"in":"path","description":"Work item ID or key","schema":{"type":"string"}},{"name":"projectIdentifier","required":true,"in":"query","description":"Project identifier (e.g., owner/repo)","schema":{"type":"string"}}],"responses":{"200":{"description":"Work item retrieved successfully","content":{"application/json":{"schema":{}}}},"403":{"description":"Forbidden - Requires role: owner, member, application"},"404":{"description":"Work item or project not found","content":{"application/json":{"schema":{}}}}},"tags":["Work Items"]}}}}
````

## List work items

> \
> List work items with optional filters. The platform is automatically determined from the project's \`configuration.workItems.provider\` setting.\
> \
> \## Prerequisites\
> \
> The project must have \`workItems.provider\` configured. Optionally configure \`boards\` to filter by specific boards/projects:\
> \
> \`\`\`bash\
> \# Configure provider and boards (Jira project keys)\
> sfp server project update -r owner/repo \\\
> &#x20; -p configuration.workItems \\\
> &#x20; -v '{"provider": "jira", "boards": \["DP", "PROJ"]}'\
> \
> \# Configure provider and boards (Azure DevOps area paths)\
> sfp server project update -r owner/repo \\\
> &#x20; -p configuration.workItems \\\
> &#x20; -v '{"provider": "azure-devops", "boards": \["MyProject\\\Team1"]}'\
> \`\`\`\
> \
> \## Filter Examples\
> \
> \`\`\`\
> \# List work items (uses boards from project config)\
> GET /work-items?projectIdentifier=owner/repo\
> \
> \# Filter by status\
> GET /work-items?projectIdentifier=owner/repo\&status=In Progress\
> \
> \# Filter by assignee\
> GET /work-items?projectIdentifier=owner/repo\&assignee=john.doe\
> \
> \# Filter by type with limit\
> GET /work-items?projectIdentifier=owner/repo\&type=bug\&maxResults=10\
> \`\`\`<br>

````json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/work-items":{"get":{"operationId":"WorkItemsController_listWorkItems","summary":"List work items","description":"\nList work items with optional filters. The platform is automatically determined from the project's `configuration.workItems.provider` setting.\n\n## Prerequisites\n\nThe project must have `workItems.provider` configured. Optionally configure `boards` to filter by specific boards/projects:\n\n```bash\n# Configure provider and boards (Jira project keys)\nsfp server project update -r owner/repo \\\n  -p configuration.workItems \\\n  -v '{\"provider\": \"jira\", \"boards\": [\"DP\", \"PROJ\"]}'\n\n# Configure provider and boards (Azure DevOps area paths)\nsfp server project update -r owner/repo \\\n  -p configuration.workItems \\\n  -v '{\"provider\": \"azure-devops\", \"boards\": [\"MyProject\\\\Team1\"]}'\n```\n\n## Filter Examples\n\n```\n# List work items (uses boards from project config)\nGET /work-items?projectIdentifier=owner/repo\n\n# Filter by status\nGET /work-items?projectIdentifier=owner/repo&status=In Progress\n\n# Filter by assignee\nGET /work-items?projectIdentifier=owner/repo&assignee=john.doe\n\n# Filter by type with limit\nGET /work-items?projectIdentifier=owner/repo&type=bug&maxResults=10\n```\n","parameters":[{"name":"projectIdentifier","required":true,"in":"query","description":"Project identifier (e.g., owner/repo)","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by work item status (e.g., \"To Do\", \"In Progress\", \"Done\")","schema":{"type":"string"}},{"name":"assignee","required":false,"in":"query","description":"Filter by assignee username or email","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","description":"Filter by work item type (e.g., \"bug\", \"story\", \"task\", \"epic\")","schema":{"type":"string"}},{"name":"maxResults","required":false,"in":"query","description":"Maximum number of results to return (1-100, default: 50)","schema":{"type":"number"}}],"responses":{"200":{"description":"Work items retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"key":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"platform":{"type":"string"},"url":{"type":"string"}}}}}}},"403":{"description":"Forbidden - Requires role: owner, member, application"}},"tags":["Work Items"]}}}}
````
