Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions docs/safe-outputs.md
Original file line number Diff line number Diff line change
Expand Up @@ -828,6 +828,43 @@ their complete existing lists, and `milestone` selects an existing milestone
by positive number. All requested changes are preflighted before the first
write.

#### Pull request updates (`update-pull-request`)

`update-pull-request` matches gh-aw's front matter configuration for updating
Azure DevOps pull requests. It updates the PR title or description (`body`);
both fields are enabled by default. The `operation` field controls description
updates: `replace` (default), `append`, `prepend`, or `replace-island`.

```yaml
safe-outputs:
update-pull-request:
title: true # enable title updates (default: true)
body: true # enable description updates (default: true)
update-branch: false # must be false; ADO has no equivalent branch-update API
sync-stack: true # accepted for gh-aw front matter parity
footer: false # omit agent stats from body updates (default: true)
operation: replace # replace, append, prepend, or replace-island
max: 1 # maximum updates per run (default: 1)
target: "*" # "triggering" (default), "*", or an ADO PR ID
allowed-repositories: [self]
required-labels: [automated]
required-title-prefix: "[bot] "
```

**Agent parameters:**

- `title` *(optional)* - Replacement PR title.
- `body` *(optional)* - PR description content in Markdown.
- `operation` *(optional)* - Overrides the configured body operation for this
update.
- `update_branch` *(optional)* - Must be omitted or `false`; Azure DevOps does
not expose the gh-aw branch-update behavior.
- `pull_request_id`, `pull_request_number`, `pr_number`, or `pr` - Required
when `target: "*"` is configured. With `target: "triggering"`, any supplied ID
must match the triggering PR.
- `repository` *(optional)* - Target repository alias, constrained by
`allowed-repositories`.

#### Fields, milestones, and assignees

`set-github-issue-field` rejects built-in fields and limits repository-defined
Expand Down
3 changes: 3 additions & 0 deletions src/compile/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2455,6 +2455,9 @@ pub fn validate_github_issue_outputs_config(front_matter: &FrontMatter) -> Resul
_ => {}
}
}
if let Some(config) = front_matter.update_pull_request_config()? {
crate::safe_outputs::validate_update_pull_request_config(&config)?;
}
if let Some(config) = front_matter.create_github_issue_config()? {
if let Some(prefix) = config.title_prefix.as_deref() {
crate::validate::reject_pipeline_injection(
Expand Down
6 changes: 6 additions & 0 deletions src/compile/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2297,6 +2297,12 @@ impl FrontMatter {
self.typed_safe_output_config("update-github-issue")
}

pub fn update_pull_request_config(
&self,
) -> anyhow::Result<Option<crate::safe_outputs::UpdatePullRequestConfig>> {
self.typed_safe_output_config("update-pull-request")
}

pub fn set_github_issue_field_config(
&self,
) -> anyhow::Result<Option<crate::safe_outputs::SetGithubIssueFieldConfig>> {
Expand Down
6 changes: 4 additions & 2 deletions src/execute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ use crate::safe_outputs::{
ReplyToPrCommentResult, ReportIncompleteResult, ResolvePrThreadResult,
SetGithubIssueFieldResult, SetGithubIssueTypeResult, SubmitPrReviewResult, ToolResult,
UnassignGithubIssueFromUserResult, UpdateGithubIssueResult, UpdatePrResult,
UpdateWikiPageResult, UpdateWorkItemResult, UploadBuildAttachmentResult,
UploadPipelineArtifactResult, UploadWorkitemAttachmentResult,
UpdatePullRequestResult, UpdateWikiPageResult, UpdateWorkItemResult,
UploadBuildAttachmentResult, UploadPipelineArtifactResult, UploadWorkitemAttachmentResult,
};
use crate::sanitize::neutralize_pipeline_commands;

Expand Down Expand Up @@ -259,6 +259,7 @@ pub async fn execute_safe_outputs(
AddGithubIssueLabelsResult,
RemoveGithubIssueLabelsResult,
CloseGithubIssueResult,
UpdatePullRequestResult,
UpdateGithubIssueResult,
SetGithubIssueFieldResult,
AssignGithubIssueMilestoneResult,
Expand Down Expand Up @@ -739,6 +740,7 @@ async fn dispatch_pr_tools(
"create-pull-request" => CreatePrResult,
"add-pr-comment" => AddPrCommentResult,
"update-pr" => UpdatePrResult,
"update-pull-request" => UpdatePullRequestResult,
"submit-pr-review" => SubmitPrReviewResult,
"reply-to-pr-comment" => ReplyToPrCommentResult,
"resolve-pr-thread" => ResolvePrThreadResult,
Expand Down
1 change: 1 addition & 0 deletions src/inspect/catalog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@ fn safe_output_description(name: &str) -> &'static str {
"set-github-issue-field" => "Sets a repository-defined field on a GitHub issue",
"submit-pr-review" => "Parameters for submitting a pull request review",
"update-pr" => "Parameters for updating a pull request",
"update-pull-request" => "Updates an Azure DevOps pull request title or description",
"unassign-github-issue-from-user" => {
"Removes operator-permitted GitHub users from an issue"
}
Expand Down
21 changes: 17 additions & 4 deletions src/mcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ use crate::safe_outputs::{
SetGithubIssueFieldResult, SetGithubIssueTypeParams, SetGithubIssueTypeResult,
SubmitPrReviewParams, SubmitPrReviewResult, ToolResult, UnassignGithubIssueFromUserParams,
UnassignGithubIssueFromUserResult, UpdateGithubIssueParams, UpdateGithubIssueResult,
UpdatePrParams, UpdatePrResult, UpdateWikiPageParams, UpdateWikiPageResult,
UpdateWorkItemParams, UpdateWorkItemResult, UploadBuildAttachmentParams,
UploadBuildAttachmentResult, UploadPipelineArtifactParams, UploadPipelineArtifactResult,
UploadWorkitemAttachmentParams, UploadWorkitemAttachmentResult, Validate, anyhow_to_mcp_error,
UpdatePrParams, UpdatePrResult, UpdatePullRequestParams, UpdatePullRequestResult,
UpdateWikiPageParams, UpdateWikiPageResult, UpdateWorkItemParams, UpdateWorkItemResult,
UploadBuildAttachmentParams, UploadBuildAttachmentResult, UploadPipelineArtifactParams,
UploadPipelineArtifactResult, UploadWorkitemAttachmentParams, UploadWorkitemAttachmentResult,
Validate, anyhow_to_mcp_error,
};
use crate::sanitize::{SanitizeContent, sanitize as sanitize_text, sanitize_markdown};
use crate::secure::WorkItemTemporaryId;
Expand Down Expand Up @@ -957,6 +958,18 @@ issue_number may be a positive number or a temporary_id from create-github-issue
self.queue_sanitized_output(result).await
}

#[tool(
name = "update-pull-request",
description = "Update an Azure DevOps pull request title or description. Uses gh-aw-style title/body/operation inputs."
)]
async fn update_pull_request(
&self,
params: Parameters<UpdatePullRequestParams>,
) -> Result<CallToolResult, McpError> {
let result: UpdatePullRequestResult = params.0.try_into()?;
self.queue_sanitized_output(result).await
}

#[tool(
name = "set-github-issue-field",
description = "Set an operator-permitted repository-defined field on a configured GitHub issue."
Expand Down
3 changes: 3 additions & 0 deletions src/safe_outputs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ pub const ALL_KNOWN_SAFE_OUTPUTS: &[&str] = all_safe_output_names![
ReplyToPrCommentResult,
ResolvePrThreadResult,
CreateGithubIssueResult,
UpdatePullRequestResult,
SetGithubIssueTypeResult,
CommentOnGithubIssueResult,
HideGithubIssueCommentResult,
Expand Down Expand Up @@ -797,6 +798,7 @@ mod submit_pr_review;
mod unassign_github_issue_from_user;
mod update_github_issue;
mod update_pr;
mod update_pull_request;
mod update_wiki_page;
mod update_work_item;
mod upload_build_attachment;
Expand Down Expand Up @@ -841,6 +843,7 @@ pub use submit_pr_review::*;
pub use unassign_github_issue_from_user::*;
pub use update_github_issue::*;
pub use update_pr::*;
pub use update_pull_request::*;
pub use update_wiki_page::*;
pub use update_work_item::*;
pub use upload_build_attachment::*;
Expand Down
Loading
Loading