From 6a2d079847c4392bd69bc4e38bdcf29579836690 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 21:01:29 +0000 Subject: [PATCH 1/3] Initial plan From 27ff880fbecfc53198a004aaa23c7cd1d3d60cd4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 21:09:01 +0000 Subject: [PATCH 2/3] fix: optimize docs-noob-tester to reduce token usage (~60% reduction) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move deterministic setup (npm install, server start, readiness poll, bridge IP detection) to pre-agent-steps, saving ~600K–900K tokens/run by eliminating ~10–15 agent setup turns - Slim duplicate Playwright connectivity fallback from prompt body (already covered by shared/docs-server-lifecycle.md import) - Reduce timeout-minutes: 45 → 30 (observed run was 25.3min, post- optimization should fit well within 30min) - Agent now reads server URL from /tmp/gh-aw/agent/server-url.txt - Renumber prompt steps 2–6 → 1–5 reflecting removed setup step - Recompile lock file" Agent-Logs-Url: https://github.com/github/gh-aw/sessions/c7cceec6-aeff-4e6a-9099-d878ea038089 Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/docs-noob-tester.lock.yml | 41 +++++--- .github/workflows/docs-noob-tester.md | 109 ++++++++------------ 2 files changed, 70 insertions(+), 80 deletions(-) diff --git a/.github/workflows/docs-noob-tester.lock.yml b/.github/workflows/docs-noob-tester.lock.yml index ebd74c84df3..bcba438dd86 100644 --- a/.github/workflows/docs-noob-tester.lock.yml +++ b/.github/workflows/docs-noob-tester.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"0eb625c4542bfb64a532c897b2d42ffcf1099f60d4ebcdb7800f155b031d39e4","strict":true,"agent_id":"copilot"} +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"cd6b331a9e1ffca4a20184f405baa3c964127cf9d33df698371694b856cd08ff","strict":true,"agent_id":"copilot"} # gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_ENDPOINT","GH_AW_OTEL_HEADERS","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28","digest":"sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28","digest":"sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28","digest":"sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.0"},{"image":"ghcr.io/github/github-mcp-server:v1.0.2"},{"image":"mcr.microsoft.com/playwright/mcp","digest":"sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2","pinned_image":"mcr.microsoft.com/playwright/mcp@sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} # ___ _ _ # / _ \ | | (_) @@ -186,23 +186,23 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF' + cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' - GH_AW_PROMPT_144af8a2cedba836_EOF + GH_AW_PROMPT_2267e89649568e7e_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/playwright_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF' + cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' Tools: create_discussion, upload_asset(max:10), missing_tool, missing_data, noop upload_asset: provide a file path; returns a URL; assets are published after the workflow completes (safeoutputs). - GH_AW_PROMPT_144af8a2cedba836_EOF + GH_AW_PROMPT_2267e89649568e7e_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF' + cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' The following GitHub context information is available for this workflow: {{#if __GH_AW_GITHUB_ACTOR__ }} @@ -231,16 +231,16 @@ jobs: {{/if}} - GH_AW_PROMPT_144af8a2cedba836_EOF + GH_AW_PROMPT_2267e89649568e7e_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" - cat << 'GH_AW_PROMPT_144af8a2cedba836_EOF' + cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' {{#runtime-import .github/workflows/shared/docs-server-lifecycle.md}} {{#runtime-import .github/workflows/shared/keep-it-short.md}} {{#runtime-import .github/workflows/shared/reporting.md}} {{#runtime-import .github/workflows/shared/observability-otlp.md}} {{#runtime-import .github/workflows/docs-noob-tester.md}} - GH_AW_PROMPT_144af8a2cedba836_EOF + GH_AW_PROMPT_2267e89649568e7e_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9 @@ -435,6 +435,17 @@ jobs: GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode" GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md opencode.jsonc" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Install docs dependencies + run: | + cd "${{ github.workspace }}/docs" + npm install + - name: Start documentation server + run: "cd \"${{ github.workspace }}/docs\"\nnohup npm run dev -- --host 0.0.0.0 --port 4321 > /tmp/preview.log 2>&1 &\nPID=$!\necho $PID > /tmp/server.pid\necho \"Server PID: $PID\"\n" + - name: Wait for server readiness + run: "for i in {1..45}; do\n STATUS=$(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:4321/gh-aw/)\n [ \"$STATUS\" = \"200\" ] && echo \"Server ready at http://localhost:4321/gh-aw/!\" && break\n echo \"Waiting for server... ($i/45) (status: $STATUS)\" && sleep 3\ndone\n" + - name: Detect bridge IP and write server URL + run: "SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')\nif [ -z \"$SERVER_IP\" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi\nmkdir -p /tmp/gh-aw/agent\necho \"http://${SERVER_IP}:4321/gh-aw/\" > /tmp/gh-aw/agent/server-url.txt\necho \"Playwright server URL: http://${SERVER_IP}:4321/gh-aw/\"\n" + - name: Download container images run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474 ghcr.io/github/gh-aw-mcpg:v0.3.0 ghcr.io/github/github-mcp-server:v1.0.2 mcr.microsoft.com/playwright/mcp@sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f - name: Write Safe Outputs Config @@ -444,9 +455,9 @@ jobs: mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_904207208c078916_EOF + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF {"create_discussion":{"category":"audits","close_older_discussions":true,"expires":24,"fallback_to_issue":true,"max":1,"title_prefix":"[docs-noob-tester] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{},"upload_asset":{"allowed-exts":[".png",".jpg",".jpeg",".svg"],"branch":"assets/${GITHUB_WORKFLOW}","max":10,"max-size":10240}} - GH_AW_SAFE_OUTPUTS_CONFIG_904207208c078916_EOF + GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF - name: Write Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | @@ -655,7 +666,7 @@ jobs: mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_a05ff7e60f941289_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { "github": { @@ -716,7 +727,7 @@ jobs: } } } - GH_AW_MCP_CONFIG_a05ff7e60f941289_EOF + GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true @@ -737,7 +748,7 @@ jobs: - name: Execute GitHub Copilot CLI id: agentic_execution # Copilot CLI tool arguments (sorted): - timeout-minutes: 45 + timeout-minutes: 30 run: | set -o pipefail touch /tmp/gh-aw/agent-step-summary.md @@ -1077,7 +1088,7 @@ jobs: GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} GH_AW_GROUP_REPORTS: "false" GH_AW_FAILURE_REPORT_AS_ISSUE: "true" - GH_AW_TIMEOUT_MINUTES: "45" + GH_AW_TIMEOUT_MINUTES: "30" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} script: | diff --git a/.github/workflows/docs-noob-tester.md b/.github/workflows/docs-noob-tester.md index 260082c0e90..9de4c19ffb5 100644 --- a/.github/workflows/docs-noob-tester.md +++ b/.github/workflows/docs-noob-tester.md @@ -9,7 +9,7 @@ permissions: issues: read pull-requests: read engine: copilot -timeout-minutes: 45 +timeout-minutes: 30 runtimes: node: version: "22" @@ -36,6 +36,32 @@ imports: expires: 1d - shared/docs-server-lifecycle.md - shared/keep-it-short.md +pre-agent-steps: + - name: Install docs dependencies + run: | + cd "${{ github.workspace }}/docs" + npm install + - name: Start documentation server + run: | + cd "${{ github.workspace }}/docs" + nohup npm run dev -- --host 0.0.0.0 --port 4321 > /tmp/preview.log 2>&1 & + PID=$! + echo $PID > /tmp/server.pid + echo "Server PID: $PID" + - name: Wait for server readiness + run: | + for i in {1..45}; do + STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:4321/gh-aw/) + [ "$STATUS" = "200" ] && echo "Server ready at http://localhost:4321/gh-aw/!" && break + echo "Waiting for server... ($i/45) (status: $STATUS)" && sleep 3 + done + - name: Detect bridge IP and write server URL + run: | + SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}') + if [ -z "$SERVER_IP" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi + mkdir -p /tmp/gh-aw/agent + echo "http://${SERVER_IP}:4321/gh-aw/" > /tmp/gh-aw/agent/server-url.txt + echo "Playwright server URL: http://${SERVER_IP}:4321/gh-aw/" features: mcp-cli: true copilot-requests: true @@ -53,77 +79,30 @@ You are a brand new user trying to get started with GitHub Agentic Workflows for ## Your Mission -Act as a complete beginner who has never used GitHub Agentic Workflows before. Build and navigate the documentation site, follow tutorials step-by-step, and document any issues you encounter. +Act as a complete beginner who has never used GitHub Agentic Workflows before. Navigate the documentation site, follow tutorials step-by-step, and document any issues you encounter. -## Step 1: Build and Serve Documentation Site +> The documentation server is already running. Read the Playwright server URL from `/tmp/gh-aw/agent/server-url.txt`: +> ```bash +> cat /tmp/gh-aw/agent/server-url.txt +> ``` -Navigate to the docs folder and start the documentation site: - -```bash -cd ${{ github.workspace }}/docs -npm install -``` - -Follow the shared **Documentation Server Lifecycle Management** instructions: -1. Start the preview server (section "Starting the Documentation Preview Server") -2. Wait for server readiness (section "Waiting for Server Readiness") - -**Get the bridge IP for Playwright access** (run this after the server is ready): - -```bash -SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}') -if [ -z "$SERVER_IP" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi -echo "Playwright server URL: http://${SERVER_IP}:4321/gh-aw/" -``` - -Use `http://${SERVER_IP}:4321/gh-aw/` (NOT `localhost:4321`) for all Playwright navigation below. - -## Step 2: Navigate Documentation as a Noob +## Step 1: Navigate Documentation as a Noob **IMPORTANT: Using Playwright in gh-aw Workflows** -Playwright is provided through an MCP server interface. Use the bridge IP obtained in Step 1 for all navigation: - - ✅ **Correct**: `browser_run_code` with `page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 })` -- ✅ **Correct**: `browser_navigate` to `http://${SERVER_IP}:4321/gh-aw/` (use the bridge IP, NOT localhost) -- ❌ **Incorrect**: Using `http://localhost:4321/...` — Playwright runs with `--network host` so its localhost is the Docker host, not the agent container - -**⚠️ Playwright Connectivity — If Playwright times out or fails:** -If `browser_navigate` or `browser_run_code` returns `net::ERR_CONNECTION_TIMED_OUT` or a timeout error, **do not attempt to debug the network or install alternative browsers** (chromium, puppeteer, etc.). This is a known network isolation constraint. Instead: -1. Skip the Playwright navigation step immediately -2. Use the following command to fetch and analyze page content via curl: - ```bash - curl -s http://localhost:4321/gh-aw/ | python3 -c " - import sys, re - html = sys.stdin.read() - text = re.sub(r'<[^>]+>', '', html) - print(text[:5000]) - " - ``` -3. Note in the report that visual screenshots were unavailable - -**⚠️ CRITICAL: Navigation Timeout Prevention** - -The Astro development server loads many JavaScript modules per page. Always use `waitUntil: 'domcontentloaded'`: - -```javascript -// ALWAYS use domcontentloaded - replace SERVER_IP with the actual IP from Step 1 -mcp__playwright__browser_run_code({ - code: `async (page) => { - await page.goto('http://SERVER_IP:4321/gh-aw/', { waitUntil: 'domcontentloaded', timeout: 30000 }); - return { url: page.url(), title: await page.title() }; - }` -}) -``` +- ❌ **Incorrect**: Using `http://localhost:4321/...` — use the bridge IP from `/tmp/gh-aw/agent/server-url.txt` + +**⚠️ CRITICAL: Navigation Timeout Prevention** — Always use `waitUntil: 'domcontentloaded'` to prevent timeout on the Vite dev server. If Playwright connectivity fails, see the shared **Documentation Server Lifecycle Management** fallback instructions. -Using Playwright, visit exactly these 3 pages and stop: +Using Playwright, visit exactly these 3 pages and stop (use the Playwright server URL read from `/tmp/gh-aw/agent/server-url.txt`): -1. **Visit the home page** at `http://${SERVER_IP}:4321/gh-aw/` +1. **Visit the home page** (e.g. `http://:4321/gh-aw/`) - Take a screenshot - Note: Is it immediately clear what this tool does? - Note: Can you quickly find the "Get Started" or "Quick Start" link? -2. **Follow the Quick Start Guide** at `http://${SERVER_IP}:4321/gh-aw/setup/quick-start/` +2. **Follow the Quick Start Guide** (e.g. `http://:4321/gh-aw/setup/quick-start/`) - Take screenshots of each major section - Try to understand each step from a beginner's perspective - Questions to consider: @@ -133,14 +112,14 @@ Using Playwright, visit exactly these 3 pages and stop: - Do code examples work as shown? - Are error messages explained? -3. **Check the CLI Commands page** at `http://${SERVER_IP}:4321/gh-aw/setup/cli/` +3. **Check the CLI Commands page** (e.g. `http://:4321/gh-aw/setup/cli/`) - Take a screenshot - Note: Are the most important commands highlighted? - Note: Are examples provided for common use cases? After visiting all 3 pages, immediately proceed to the report. -## Step 3: Identify Pain Points +## Step 2: Identify Pain Points As you navigate, specifically look for: @@ -166,7 +145,7 @@ As you navigate, specifically look for: - Useful screenshots or diagrams - Logical flow -## Step 4: Take Screenshots +## Step 3: Take Screenshots For each confusing or broken area: - Take a screenshot showing the issue @@ -175,7 +154,7 @@ For each confusing or broken area: - Upload the screenshot by calling the `upload_asset` safe-output tool with the absolute file path `path: "/tmp/gh-aw/screenshots/.png"`. Record the returned asset URL. -## Step 5: Create Discussion Report +## Step 4: Create Discussion Report Create a GitHub discussion titled "📚 Documentation Noob Test Report - [Date]" with: @@ -206,7 +185,7 @@ For each uploaded screenshot, include its asset URL. Format: Label the discussion with: `documentation`, `user-experience`, `automated-testing` -## Step 6: Cleanup +## Step 5: Cleanup Follow the shared **Documentation Server Lifecycle Management** instructions for cleanup (section "Stopping the Documentation Server"). From 97e3077ebf8c0fbc6f1f8c151c7bdef48331bbbb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 21:12:41 +0000 Subject: [PATCH 3/3] fix: address code review feedback on docs-noob-tester optimization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add comment explaining the 45-iteration wait loop (135s max wait) - Improve Playwright example to show reading URL from server-url.txt - Fix 'Vite dev server' → 'Astro development server' for accuracy Agent-Logs-Url: https://github.com/github/gh-aw/sessions/c7cceec6-aeff-4e6a-9099-d878ea038089 Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/docs-noob-tester.lock.yml | 28 ++++++++++----------- .github/workflows/docs-noob-tester.md | 6 ++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/docs-noob-tester.lock.yml b/.github/workflows/docs-noob-tester.lock.yml index bcba438dd86..e038a0ffff9 100644 --- a/.github/workflows/docs-noob-tester.lock.yml +++ b/.github/workflows/docs-noob-tester.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"cd6b331a9e1ffca4a20184f405baa3c964127cf9d33df698371694b856cd08ff","strict":true,"agent_id":"copilot"} +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"6d6a148d61f9979dc8ddbb2a7bd055ab2b98a0fd9422d6e55e1a44dc58ee741e","strict":true,"agent_id":"copilot"} # gh-aw-manifest: {"version":1,"secrets":["GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_ENDPOINT","GH_AW_OTEL_HEADERS","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28","digest":"sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28","digest":"sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28","digest":"sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.0"},{"image":"ghcr.io/github/github-mcp-server:v1.0.2"},{"image":"mcr.microsoft.com/playwright/mcp","digest":"sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2","pinned_image":"mcr.microsoft.com/playwright/mcp@sha256:7b82f29c6ef83480a97f612d53ac3fd5f30a32df3fea1e06923d4204d3532bb2"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} # ___ _ _ # / _ \ | | (_) @@ -186,23 +186,23 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' + cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF' - GH_AW_PROMPT_2267e89649568e7e_EOF + GH_AW_PROMPT_f65c908042dcbe78_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/playwright_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' + cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF' Tools: create_discussion, upload_asset(max:10), missing_tool, missing_data, noop upload_asset: provide a file path; returns a URL; assets are published after the workflow completes (safeoutputs). - GH_AW_PROMPT_2267e89649568e7e_EOF + GH_AW_PROMPT_f65c908042dcbe78_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' + cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF' The following GitHub context information is available for this workflow: {{#if __GH_AW_GITHUB_ACTOR__ }} @@ -231,16 +231,16 @@ jobs: {{/if}} - GH_AW_PROMPT_2267e89649568e7e_EOF + GH_AW_PROMPT_f65c908042dcbe78_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" - cat << 'GH_AW_PROMPT_2267e89649568e7e_EOF' + cat << 'GH_AW_PROMPT_f65c908042dcbe78_EOF' {{#runtime-import .github/workflows/shared/docs-server-lifecycle.md}} {{#runtime-import .github/workflows/shared/keep-it-short.md}} {{#runtime-import .github/workflows/shared/reporting.md}} {{#runtime-import .github/workflows/shared/observability-otlp.md}} {{#runtime-import .github/workflows/docs-noob-tester.md}} - GH_AW_PROMPT_2267e89649568e7e_EOF + GH_AW_PROMPT_f65c908042dcbe78_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9 @@ -442,7 +442,7 @@ jobs: - name: Start documentation server run: "cd \"${{ github.workspace }}/docs\"\nnohup npm run dev -- --host 0.0.0.0 --port 4321 > /tmp/preview.log 2>&1 &\nPID=$!\necho $PID > /tmp/server.pid\necho \"Server PID: $PID\"\n" - name: Wait for server readiness - run: "for i in {1..45}; do\n STATUS=$(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:4321/gh-aw/)\n [ \"$STATUS\" = \"200\" ] && echo \"Server ready at http://localhost:4321/gh-aw/!\" && break\n echo \"Waiting for server... ($i/45) (status: $STATUS)\" && sleep 3\ndone\n" + run: "for i in {1..45}; do # 45 attempts × 3s = 135s max wait\n STATUS=$(curl -s -o /dev/null -w \"%{http_code}\" http://localhost:4321/gh-aw/)\n [ \"$STATUS\" = \"200\" ] && echo \"Server ready at http://localhost:4321/gh-aw/!\" && break\n echo \"Waiting for server... ($i/45) (status: $STATUS)\" && sleep 3\ndone\n" - name: Detect bridge IP and write server URL run: "SERVER_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')\nif [ -z \"$SERVER_IP\" ]; then SERVER_IP=$(hostname -I | awk '{print $1}'); fi\nmkdir -p /tmp/gh-aw/agent\necho \"http://${SERVER_IP}:4321/gh-aw/\" > /tmp/gh-aw/agent/server-url.txt\necho \"Playwright server URL: http://${SERVER_IP}:4321/gh-aw/\"\n" @@ -455,9 +455,9 @@ jobs: mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_f2225c1dad1fcafb_EOF {"create_discussion":{"category":"audits","close_older_discussions":true,"expires":24,"fallback_to_issue":true,"max":1,"title_prefix":"[docs-noob-tester] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{},"upload_asset":{"allowed-exts":[".png",".jpg",".jpeg",".svg"],"branch":"assets/${GITHUB_WORKFLOW}","max":10,"max-size":10240}} - GH_AW_SAFE_OUTPUTS_CONFIG_b9f5abac97e75250_EOF + GH_AW_SAFE_OUTPUTS_CONFIG_f2225c1dad1fcafb_EOF - name: Write Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | @@ -666,7 +666,7 @@ jobs: mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_cbb58886828055bc_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { "github": { @@ -727,7 +727,7 @@ jobs: } } } - GH_AW_MCP_CONFIG_09c4f0ef622cdbf6_EOF + GH_AW_MCP_CONFIG_cbb58886828055bc_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true diff --git a/.github/workflows/docs-noob-tester.md b/.github/workflows/docs-noob-tester.md index 9de4c19ffb5..bc9011ff709 100644 --- a/.github/workflows/docs-noob-tester.md +++ b/.github/workflows/docs-noob-tester.md @@ -50,7 +50,7 @@ pre-agent-steps: echo "Server PID: $PID" - name: Wait for server readiness run: | - for i in {1..45}; do + for i in {1..45}; do # 45 attempts × 3s = 135s max wait STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:4321/gh-aw/) [ "$STATUS" = "200" ] && echo "Server ready at http://localhost:4321/gh-aw/!" && break echo "Waiting for server... ($i/45) (status: $STATUS)" && sleep 3 @@ -90,10 +90,10 @@ Act as a complete beginner who has never used GitHub Agentic Workflows before. N **IMPORTANT: Using Playwright in gh-aw Workflows** -- ✅ **Correct**: `browser_run_code` with `page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 })` +- ✅ **Correct**: Read the URL from the file then navigate: `SERVER_URL=$(cat /tmp/gh-aw/agent/server-url.txt)` and use `browser_run_code` with `page.goto(SERVER_URL, { waitUntil: 'domcontentloaded', timeout: 30000 })` - ❌ **Incorrect**: Using `http://localhost:4321/...` — use the bridge IP from `/tmp/gh-aw/agent/server-url.txt` -**⚠️ CRITICAL: Navigation Timeout Prevention** — Always use `waitUntil: 'domcontentloaded'` to prevent timeout on the Vite dev server. If Playwright connectivity fails, see the shared **Documentation Server Lifecycle Management** fallback instructions. +**⚠️ CRITICAL: Navigation Timeout Prevention** — Always use `waitUntil: 'domcontentloaded'` to prevent timeout on the Astro development server. If Playwright connectivity fails, see the shared **Documentation Server Lifecycle Management** fallback instructions. Using Playwright, visit exactly these 3 pages and stop (use the Playwright server URL read from `/tmp/gh-aw/agent/server-url.txt`):