Conversation
Implements a new `edit-wiki-page` safe output that allows agents to create or update Azure DevOps wiki pages. Stage 1 (MCP server): - `edit-wiki-page` tool registered on the SafeOutputs MCP server - Validates path (no `..`, non-empty), content (≥10 chars) - Strips control characters from path; full sanitize_text() on content/comment - Queues result to safe_outputs.ndjson Stage 2 (executor): - Dispatches `edit-wiki-page` to EditWikiPageResult::execute_sanitized() - GET wiki page to check existence and obtain ETag - PUT to create/update with If-Match header for optimistic concurrency - Enforces path-prefix restriction configured in front matter - Applies title-prefix to final path segment if configured Front-matter configuration (safe-outputs.edit-wiki-page): - wiki-name: wiki identifier (required) - wiki-project: ADO project override (optional) - path-prefix: restrict writes to pages under this path (optional) - title-prefix: prepend text to each page title (optional) - comment: default commit message (optional) - create-if-missing: allow creating new pages (default: true) Compiler: - edit-wiki-page added to WRITE_REQUIRING_SAFE_OUTPUTS so compilation fails if no permissions.write service connection is configured Co-authored-by: jamesadevine <4742697+jamesadevine@users.noreply.github.com>
|
@copilot implement the executor step too. Align with other executor implementations that use the devops api |
The Stage 2 executor is already implemented in commit 4ccf0b2 inside
|
|
/rust-review |
|
✅ Rust PR Reviewer completed successfully! |
🔍 Rust PR ReviewSummary: Looks good overall — solid new safe-output tool with good test coverage, but has two correctness issues worth addressing. Findings🐛 Bugs / Logic Issues
✅ What Looks Good
|
|
@copilot src/tools/edit_wiki_page.rs:239-244 — wiki_name (and project) are interpolated raw into the URL path let base_url = format!( |
Co-authored-by: jamesadevine <4742697+jamesadevine@users.noreply.github.com>
Fixed in 8e1106e. Both Warning Firewall rules blocked me from connecting to one or more addresses (expand for details)I tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
|
/rust-review |
|
✅ Rust PR Reviewer completed successfully! |
🔍 Rust PR ReviewSummary: Solid implementation with good security fundamentals — one weak test and one code-quality issue worth addressing before merge. Findings🐛 Bugs / Logic Issues
|
Adds
edit-wiki-pageas a new safe output, enabling agents to create or update Azure DevOps wiki pages through the standard two-stage safe output pipeline.Agent parameters
path— wiki page path (e.g./Overview/Architecture); must not contain..content— markdown content (≥10 chars)comment— optional commit messageFront-matter configuration
Implementation
.., non-empty) and content length; strips control chars from path; applies fullsanitize_text()to content and comment before writing tosafe_outputs.ndjsonpath-prefix→ applytitle-prefix→ PUT to ADO Wiki REST API 7.0 withIf-Matchfor optimistic concurrencyedit-wiki-pageadded toWRITE_REQUIRING_SAFE_OUTPUTS— compilation fails without apermissions.writeservice connection..check in both Stage 1 and Stage 2Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
api.github.com (HTTP Only)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com -z relro 282f9.04ys10cas81d8l5zktauyxl6k.12os18v.rcgu.o 282f9.0f7osk7u4kohtd36hmj1ckb8i.12os18v.rcgu.o 282f9.0o5rfzu380rlxqqbz17syrsqf.12os18v.rcgu.o 282f9.0yxhou4h03rc34xfgwb3ycjol.12os18v.rcgu.o 282f9.1kguf4195hs9940mk1dm0ggzz.12os18v.rcgu.o 282f9.1mpyvdv7pyxf3ng8yipyk525t.12os18v.rcgu.o 282f9.1nhqb1ozrjlvfoy7fjlhcb73n.12os18v.rcgu.o 282f9.1vv2t69d0488go0yafes2x70i.12os18v.rcgu.o 282f9.1y9ifn86zes848os8kg1vriyy.12os18v.rcgu.o 282f9.35ht4wuid56kfcqz3us8mrudk.12os18v.rcgu.o 282f9.37d5q5eh66ez0d8t579jzdj7r.12os18v.rcgu.o 282f9.3chzns1ewigd37fx2u2u3i0yy.12os18v.rcgu.o 282f9.3gooohxjhqsvqsv72zcoin4pf.12os18v.rcgu.o 282f9.3gysfdn2shg5iuu7drfrw41jg.12os18v.rcgu.o(packet block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com g/de�� lib/rustlib/x86_--error-format=json lib/rustlib/x86_--json=diagnostic-rendered-ansi,artifacts,future-incompat mbols.o -3723d82190d9318/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw -3723d82190d9318compile -3723d82190d9318/home/REDACTED/work/ado-aw/ado-aw/tests/fixtures/minimal-agent.md -3723d82190d9318-o -372�� -3723d82190d9318-C -3723d82190d9318debuginfo=2 -3723d82190d9318--check-cfg -3723d82190d9318bash -3723d82190d9318--norc -3723d82190d9318--noprofile -3723d82190d9318-C(packet block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com 4.2h�� 4.2n53465ez0tip3gmgghhqx15y.18oqtqx.rcgu.o 4.2rmm7e11at3uonx71pkfb3yl3.18oqtqx.rcgu.o mbols.o ddf4723054b4c8.rbash ddf4723054b4c8.r--norc ddf4723054b4c8.r--noprofile ddf4723054b4c8.rmcp_macros.3372feaf42b34d35-cgu.3.rcgu.o ddf4�� mbols.o -980ba44bd5631a04.0e9n4tn2jsjz770vkg9u9zkj3.18oqtqx.rcgu.o -980ba44bd5631a04.0fo4o8mez4ycvnf3o20q2znp3.18oqtqx.rcgu.o -980ba44bd5631a0bash -980ba44bd5631a0--norc -980ba44bd5631a0--noprofile -980ba44bd5631a04.180vyceco4m9eb5c6ddlkj9i2.18oqtqx.rcgu.o(packet block)dev.azure.com/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com --allow dev.azure.com --allow *.visualstudio.com 282f9.0o5rfzu380rlxqqbz17syrsqf.12os18v.rcgu.o 282f9.0yxhou4h03rc34xfgwb3ycjol.12os18v.rcgu.o 282f9.1kguf4195hs9940mk1dm0ggzz.12os18v.rcgu.o 282f9.1mpyvdv7pyxf3ng8yipyk525t.12os18v.rcgu.o 282f9.1nhqb1ozrjlvfoy7fjlhcb73n.12os18v.rcgu.o 282f9.1vv2t69d0488go0yafes2x70i.12os18v.rcgu.o 282f9.1y9ifn86zes848os8kg1vriyy.12os18v.rcgu.o 282f9.35ht4wuid56kfcqz3us8mrudk.12os18v.rcgu.o 282f9.37d5q5eh66ez0d8t579jzdj7r.12os18v.rcgu.o 282f9.3chzns1ewigd37fx2u2u3i0yy.12os18v.rcgu.o 282f9.3gooohxjhqsvqsv72zcoin4pf.12os18v.rcgu.o 282f9.3gysfdn2shg5iuu7drfrw41jg.12os18v.rcgu.o(dns block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com --allow dev.azure.com --allow *.visualstudio.com lib/rustlib/x86_/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw lib/rustlib/x86_compile lib/rustlib/x86_/home/REDACTED/work/ado-aw/ado-aw/tests/fixtures/pipeline-trigger-agent.md lib/rustlib/x86_-o lib/�� lib/rustlib/x86_-C lib/rustlib/x86_debuginfo=2 known-linux-gnu/--check-cfg known-linux-gnu/bash build.c70f956276--norc eof6poe84onc.rcg--noprofile mpl-3723d82190d9-C(dns block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com --allow dev.azure.com --allow *.visualstudio.com ddf4723054b4c8.rbash ddf4723054b4c8.r--norc ddf4723054b4c8.r--noprofile ddf4723054b4c8.rmcp_macros.3372feaf42b34d35-cgu.3.rcgu.o ddf4�� mbols.o -980ba44bd5631a04.0e9n4tn2jsjz770vkg9u9zkj3.18oqtqx.rcgu.o bin/cargo -980ba44bd5631a0bash -980ba44bd5631a0--norc -980ba44bd5631a0--noprofile bin/cargo(dns block)msazuresphere.visualstudio.com/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com --allow dev.azure.com --allow *.visualstudio.com 282f9.0o5rfzu380rlxqqbz17syrsqf.12os18v.rcgu.o 282f9.0yxhou4h03rc34xfgwb3ycjol.12os18v.rcgu.o 282f9.1kguf4195hs9940mk1dm0ggzz.12os18v.rcgu.o 282f9.1mpyvdv7pyxf3ng8yipyk525t.12os18v.rcgu.o 282f9.1nhqb1ozrjlvfoy7fjlhcb73n.12os18v.rcgu.o 282f9.1vv2t69d0488go0yafes2x70i.12os18v.rcgu.o 282f9.1y9ifn86zes848os8kg1vriyy.12os18v.rcgu.o 282f9.35ht4wuid56kfcqz3us8mrudk.12os18v.rcgu.o 282f9.37d5q5eh66ez0d8t579jzdj7r.12os18v.rcgu.o 282f9.3chzns1ewigd37fx2u2u3i0yy.12os18v.rcgu.o 282f9.3gooohxjhqsvqsv72zcoin4pf.12os18v.rcgu.o 282f9.3gysfdn2shg5iuu7drfrw41jg.12os18v.rcgu.o(dns block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com --allow dev.azure.com --allow *.visualstudio.com lib/rustlib/x86_/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw lib/rustlib/x86_compile lib/rustlib/x86_/home/REDACTED/work/ado-aw/ado-aw/tests/fixtures/pipeline-trigger-agent.md lib/rustlib/x86_-o lib/�� lib/rustlib/x86_-C lib/rustlib/x86_debuginfo=2 known-linux-gnu/--check-cfg known-linux-gnu/bash build.c70f956276--norc eof6poe84onc.rcg--noprofile mpl-3723d82190d9-C(dns block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow api.github.com --allow dev.azure.com --allow *.visualstudio.com ddf4723054b4c8.rbash ddf4723054b4c8.r--norc ddf4723054b4c8.r--noprofile ddf4723054b4c8.rmcp_macros.3372feaf42b34d35-cgu.3.rcgu.o ddf4�� mbols.o -980ba44bd5631a04.0e9n4tn2jsjz770vkg9u9zkj3.18oqtqx.rcgu.o bin/cargo -980ba44bd5631a0bash -980ba44bd5631a0--norc -980ba44bd5631a0--noprofile bin/cargo(dns block)raw.github.com/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow *.github.com /home/REDACTED/work/ado-aw/ado-aw/target/debug/deps/async_trait-0d9946b44b5e2a43.a/home/REDACTED/work/ado-aw/ado-aw/target/debug/deps/proxy_tests-bdf3f3fa375db968.277xkoqd5bwrczxu1godtun7e.09h86zq.rcgu.o /home/REDACTED/work/ado-aw/ado-aw/target/debug/deps/async_trait-0d9946b44b5e2a43.a/home/REDACTED/work/ado-aw/ado-aw/target/debug/deps/proxy_tests-bdf3f3fa375db968.2ggbp88eaerqa2hprceyhcpyc.09h86zq.rcgu.o 282f9.04ys10cas81d8l5zktauyxl6k.12os18v.rcgu.o 282f9.0f7osk7u4kohtd36hmj1ckb8i.12os18v.rcgu.o 282f9.0o5rfzu380rlxqqbz17syrsqf.12os18v.rcgu.o 282f9.0yxhou4h03rc34xfgwb3ycjol.12os18v.rcgu.o 282f9.1kguf4195hs9940mk1dm0ggzz.12os18v.rcgu.o 282f9.1mpyvdv7pyxf3ng8yipyk525t.12os18v.rcgu.o 282f9.1nhqb1ozrjlvfoy7fjlhcb73n.12os18v.rcgu.o 282f9.1vv2t69d0488go0yafes2x70i.12os18v.rcgu.o 282f9.1y9ifn86zes848os8kg1vriyy.12os18v.rcgu.o 282f9.35ht4wuid56kfcqz3us8mrudk.12os18v.rcgu.o 282f9.37d5q5eh66ez0d8t579jzdj7r.12os18v.rcgu.o 282f9.3chzns1ewigd37fx2u2u3i0yy.12os18v.rcgu.o 282f9.3gooohxjhqsvqsv72zcoin4pf.12os18v.rcgu.o 282f9.3gysfdn2shg5iuu7drfrw41jg.12os18v.rcgu.o(dns block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow *.github.com g/de�� lib/rustlib/x86_--error-format=json lib/rustlib/x86_--json=diagnostic-rendered-ansi,artifacts,future-incompat mbols.o -3723d82190d9318/home/REDACTED/.rustup/toolchains/stable-x86_64-REDACTED-linux-gnu/-o -3723d82190d9318-flavor -3723d82190d9318gnu -3723d82190d9318-plugin -372�� -3723d82190d9318-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -3723d82190d9318-plugin-opt=-fresolution=/tmp/cck1yKtD.res -3723d82190d9318--build-id -3723d82190d9318/home/REDACTED/work/ado-aw/ado-aw/target/debug/deps/compiler_tests-980ba44bd5631a0-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -3723d82190d9318execute::tests -3723d82190d9318elf_x86_64 -3723d82190d9318--hash-style=gnu(dns block)/home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw /home/REDACTED/work/ado-aw/ado-aw/target/debug/ado-aw proxy --allow *.github.com 4.2h�� 4.2n53465ez0tip3gmgghhqx15y.18oqtqx.rcgu.o 4.2rmm7e11at3uonx71pkfb3yl3.18oqtqx.rcgu.o mbols.o ddf4723054b4c8.rbash ddf4723054b4c8.r--norc ddf4723054b4c8.r--noprofile ddf4723054b4c8.r--hash-style=gnu ddf4�� mbols.o -980ba44bd5631a04.0e9n4tn2jsjz770vkg9u9zkj3.18oqtqx.rcgu.o -980ba44bd5631a04.0fo4o8mez4ycvnf3o20q2znp3.18oqtqx.rcgu.o -980ba44bd5631a0bash -980ba44bd5631a0--norc -980ba44bd5631a0--noprofile -980ba44bd5631a04.180vyceco4m9eb5c6ddlkj9i2.18oqtqx.rcgu.o(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.