diff --git a/.github/workflows/daily-performance-summary.lock.yml b/.github/workflows/daily-performance-summary.lock.yml index 73038243190..f28e1445aee 100644 --- a/.github/workflows/daily-performance-summary.lock.yml +++ b/.github/workflows/daily-performance-summary.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"7b1510550596476e3309a3f7caeb8deb94a4cbd499aae25cf221c366c24fbb06","body_hash":"590b2de7fbb850bb76b6c720b7e5c0a17f018f56e813a3a919b66f93bfeaff3d","strict":true,"agent_id":"codex","agent_model":"copilot/mai-code-1-flash-picker","engine_versions":{"codex":"0.148.0"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"f417f3b672d971a11adc5f7039aaa7a48cb4f9db397a971fa9446d8c34a69ade","body_hash":"590b2de7fbb850bb76b6c720b7e5c0a17f018f56e813a3a919b66f93bfeaff3d","strict":true,"agent_id":"codex","agent_model":"copilot/mai-code-1-flash-picker","engine_versions":{"codex":"0.148.0"}} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/setup-python","sha":"5fda3b95a4ea91299a34e894583c3862153e4b97","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"astral-sh/setup-uv","sha":"20cfd1bf945f4377ade1205e4dbc17946fc9a30d","version":"v10.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7","digest":"sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7@sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7","digest":"sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7@sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7","digest":"sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7@sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7","digest":"sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7@sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.10","digest":"sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.10@sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e","pinned_image":"ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e"},{"image":"ghcr.io/github/github-mcp-server:v1.10.0","digest":"sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.0@sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c"}],"mcp_servers":[{"name":"mcpscripts","tools":["github-discussion-query","github-issue-query","github-pr-query"]},{"name":"safeoutputs","tools":["close_discussion","create_discussion","missing_data","missing_tool","noop","upload_asset"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -902,7 +902,7 @@ jobs: - name: Write MCP Scripts Tool Files run: | - cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF' + cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF' #!/bin/bash # Auto-generated mcp-script tool: github-discussion-query # Query GitHub discussions with jq filtering support. Without --jq, returns schema and data size info. Use --jq '.' to get all data, or specific jq expressions to filter. @@ -985,22 +985,36 @@ jobs: PAGE_SIZE="$LIMIT" [[ -n "$SINCE" ]] && PAGE_SIZE=100 CURSOR="" - OUTPUT="[]" + OUTPUT_FILE=$(mktemp) + PAGE_NODES_FILE="" + MERGED_OUTPUT_FILE="" + FILTERED_OUTPUT_FILE="" + echo '[]' > "$OUTPUT_FILE" + cleanup() { + rm -f "$OUTPUT_FILE" "$PAGE_NODES_FILE" "$MERGED_OUTPUT_FILE" "$FILTERED_OUTPUT_FILE" + } + trap cleanup EXIT while :; do GRAPHQL_ARGS=(graphql -f query="$GRAPHQL_QUERY" -f owner="$OWNER" -f name="$NAME" -F first="$PAGE_SIZE") [[ -n "$CURSOR" ]] && GRAPHQL_ARGS+=(-f after="$CURSOR") GRAPHQL_OUTPUT=$(gh api "${GRAPHQL_ARGS[@]}") - PAGE_NODES=$(jq '.data.repository.discussions.nodes' <<< "$GRAPHQL_OUTPUT") - [[ "$(jq 'length' <<< "$PAGE_NODES")" -eq 0 ]] && break - OUTPUT=$(jq -cn --argjson all "$OUTPUT" --argjson page "$PAGE_NODES" '$all + $page') + PAGE_NODES_FILE=$(mktemp) + echo "$GRAPHQL_OUTPUT" | jq '.data.repository.discussions.nodes' > "$PAGE_NODES_FILE" + [[ "$(jq 'length' < "$PAGE_NODES_FILE")" -eq 0 ]] && { rm -f "$PAGE_NODES_FILE"; break; } + MERGED_OUTPUT_FILE=$(mktemp) + jq -s '.[0] + .[1]' "$OUTPUT_FILE" "$PAGE_NODES_FILE" > "$MERGED_OUTPUT_FILE" + mv "$MERGED_OUTPUT_FILE" "$OUTPUT_FILE" + MERGED_OUTPUT_FILE="" + [[ -n "$SINCE" && "$(jq -r '.[-1].updatedAt // empty' < "$PAGE_NODES_FILE")" < "$SINCE" ]] && { rm -f "$PAGE_NODES_FILE"; break; } + rm -f "$PAGE_NODES_FILE" [[ -z "$SINCE" ]] && break - [[ "$(jq -r '.[-1].updatedAt // empty' <<< "$PAGE_NODES")" < "$SINCE" ]] && break [[ "$(jq -r '.data.repository.discussions.pageInfo.hasNextPage' <<< "$GRAPHQL_OUTPUT")" == "true" ]] || break CURSOR=$(jq -r '.data.repository.discussions.pageInfo.endCursor' <<< "$GRAPHQL_OUTPUT") done # Transform GraphQL output to match gh discussion list format - OUTPUT=$(echo "$OUTPUT" | jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { + FILTERED_OUTPUT_FILE=$(mktemp) + jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { number: .number, title: .title, author: .author, @@ -1012,15 +1026,19 @@ jobs: comments: .comments, answer: .answer, url: .url - }]') + }]' "$OUTPUT_FILE" > "$FILTERED_OUTPUT_FILE" + mv "$FILTERED_OUTPUT_FILE" "$OUTPUT_FILE" # Apply jq filter if specified if [[ -n "$JQ_FILTER" ]]; then - jq "$JQ_FILTER" <<< "$OUTPUT" + jq "$JQ_FILTER" "$OUTPUT_FILE" else # Return schema and size instead of full data - ITEM_COUNT=$(jq 'length' <<< "$OUTPUT") - DATA_SIZE=${#OUTPUT} + ITEM_COUNT=$(jq 'length' < "$OUTPUT_FILE") + DATA_SIZE=$(wc -c < "$OUTPUT_FILE" | tr -d '[:space:]') + if [[ "$DATA_SIZE" -gt 0 ]]; then + DATA_SIZE=$((DATA_SIZE - 1)) + fi # Validate values are numeric if ! [[ "$ITEM_COUNT" =~ ^[0-9]+$ ]]; then @@ -1066,7 +1084,7 @@ jobs: fi - GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF + GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF chmod +x "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-issue-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-ISSUE-QUERY_98491dc3061cd8ef_EOF' #!/bin/bash diff --git a/.github/workflows/daily-regulatory.lock.yml b/.github/workflows/daily-regulatory.lock.yml index 8974d524854..6945a1de660 100644 --- a/.github/workflows/daily-regulatory.lock.yml +++ b/.github/workflows/daily-regulatory.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"90b60d13dda61ec2854c56129a99995a0f8c65c3f51b4500f959bca19b6d15b1","body_hash":"5caa571ea407069cff2fa2aaa72b445c773f90c82c69aefcfcf031a23827c303","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"a2463cb1ab2b81a49cfd2eb087234297db6b6e53764a8af4e5cd508e69c4ca71","body_hash":"5caa571ea407069cff2fa2aaa72b445c773f90c82c69aefcfcf031a23827c303","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7","digest":"sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7@sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7","digest":"sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7@sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7","digest":"sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7@sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.10","digest":"sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.10@sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e","pinned_image":"ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e"},{"image":"ghcr.io/github/github-mcp-server:v1.10.0","digest":"sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.0@sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c"}],"mcp_servers":[{"name":"github","tools":["get_commit","get_discussion","get_discussion_comments","get_file_contents","get_latest_release","get_me","get_pull_request","get_pull_request_comments","get_pull_request_diff","get_pull_request_files","get_pull_request_review_comments","get_pull_request_reviews","get_pull_request_status","get_release_by_tag","get_tag","issue_read","list_branches","list_commits","list_discussion_categories","list_discussions","list_issue_types","list_issues","list_pull_requests","list_releases","list_starred_repositories","list_tags","pull_request_read","search_code","search_issues","search_pull_requests","search_repositories"]},{"name":"mcpscripts","tools":["github-discussion-query","github-issue-query","github-pr-query"]},{"name":"safeoutputs","tools":["close_discussion","create_discussion","missing_data","missing_tool","noop"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -843,7 +843,7 @@ jobs: - name: Write MCP Scripts Tool Files run: | - cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF' + cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF' #!/bin/bash # Auto-generated mcp-script tool: github-discussion-query # Query GitHub discussions with jq filtering support. Without --jq, returns schema and data size info. Use --jq '.' to get all data, or specific jq expressions to filter. @@ -926,22 +926,36 @@ jobs: PAGE_SIZE="$LIMIT" [[ -n "$SINCE" ]] && PAGE_SIZE=100 CURSOR="" - OUTPUT="[]" + OUTPUT_FILE=$(mktemp) + PAGE_NODES_FILE="" + MERGED_OUTPUT_FILE="" + FILTERED_OUTPUT_FILE="" + echo '[]' > "$OUTPUT_FILE" + cleanup() { + rm -f "$OUTPUT_FILE" "$PAGE_NODES_FILE" "$MERGED_OUTPUT_FILE" "$FILTERED_OUTPUT_FILE" + } + trap cleanup EXIT while :; do GRAPHQL_ARGS=(graphql -f query="$GRAPHQL_QUERY" -f owner="$OWNER" -f name="$NAME" -F first="$PAGE_SIZE") [[ -n "$CURSOR" ]] && GRAPHQL_ARGS+=(-f after="$CURSOR") GRAPHQL_OUTPUT=$(gh api "${GRAPHQL_ARGS[@]}") - PAGE_NODES=$(jq '.data.repository.discussions.nodes' <<< "$GRAPHQL_OUTPUT") - [[ "$(jq 'length' <<< "$PAGE_NODES")" -eq 0 ]] && break - OUTPUT=$(jq -cn --argjson all "$OUTPUT" --argjson page "$PAGE_NODES" '$all + $page') + PAGE_NODES_FILE=$(mktemp) + echo "$GRAPHQL_OUTPUT" | jq '.data.repository.discussions.nodes' > "$PAGE_NODES_FILE" + [[ "$(jq 'length' < "$PAGE_NODES_FILE")" -eq 0 ]] && { rm -f "$PAGE_NODES_FILE"; break; } + MERGED_OUTPUT_FILE=$(mktemp) + jq -s '.[0] + .[1]' "$OUTPUT_FILE" "$PAGE_NODES_FILE" > "$MERGED_OUTPUT_FILE" + mv "$MERGED_OUTPUT_FILE" "$OUTPUT_FILE" + MERGED_OUTPUT_FILE="" + [[ -n "$SINCE" && "$(jq -r '.[-1].updatedAt // empty' < "$PAGE_NODES_FILE")" < "$SINCE" ]] && { rm -f "$PAGE_NODES_FILE"; break; } + rm -f "$PAGE_NODES_FILE" [[ -z "$SINCE" ]] && break - [[ "$(jq -r '.[-1].updatedAt // empty' <<< "$PAGE_NODES")" < "$SINCE" ]] && break [[ "$(jq -r '.data.repository.discussions.pageInfo.hasNextPage' <<< "$GRAPHQL_OUTPUT")" == "true" ]] || break CURSOR=$(jq -r '.data.repository.discussions.pageInfo.endCursor' <<< "$GRAPHQL_OUTPUT") done # Transform GraphQL output to match gh discussion list format - OUTPUT=$(echo "$OUTPUT" | jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { + FILTERED_OUTPUT_FILE=$(mktemp) + jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { number: .number, title: .title, author: .author, @@ -953,15 +967,19 @@ jobs: comments: .comments, answer: .answer, url: .url - }]') + }]' "$OUTPUT_FILE" > "$FILTERED_OUTPUT_FILE" + mv "$FILTERED_OUTPUT_FILE" "$OUTPUT_FILE" # Apply jq filter if specified if [[ -n "$JQ_FILTER" ]]; then - jq "$JQ_FILTER" <<< "$OUTPUT" + jq "$JQ_FILTER" "$OUTPUT_FILE" else # Return schema and size instead of full data - ITEM_COUNT=$(jq 'length' <<< "$OUTPUT") - DATA_SIZE=${#OUTPUT} + ITEM_COUNT=$(jq 'length' < "$OUTPUT_FILE") + DATA_SIZE=$(wc -c < "$OUTPUT_FILE" | tr -d '[:space:]') + if [[ "$DATA_SIZE" -gt 0 ]]; then + DATA_SIZE=$((DATA_SIZE - 1)) + fi # Validate values are numeric if ! [[ "$ITEM_COUNT" =~ ^[0-9]+$ ]]; then @@ -1007,7 +1025,7 @@ jobs: fi - GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF + GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF chmod +x "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-issue-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-ISSUE-QUERY_98491dc3061cd8ef_EOF' #!/bin/bash diff --git a/.github/workflows/shared/github-queries-mcp-script.md b/.github/workflows/shared/github-queries-mcp-script.md index efd17ac19b1..87e81e64c65 100644 --- a/.github/workflows/shared/github-queries-mcp-script.md +++ b/.github/workflows/shared/github-queries-mcp-script.md @@ -354,22 +354,36 @@ mcp-scripts: PAGE_SIZE="$LIMIT" [[ -n "$SINCE" ]] && PAGE_SIZE=100 CURSOR="" - OUTPUT="[]" + OUTPUT_FILE=$(mktemp) + PAGE_NODES_FILE="" + MERGED_OUTPUT_FILE="" + FILTERED_OUTPUT_FILE="" + echo '[]' > "$OUTPUT_FILE" + cleanup() { + rm -f "$OUTPUT_FILE" "$PAGE_NODES_FILE" "$MERGED_OUTPUT_FILE" "$FILTERED_OUTPUT_FILE" + } + trap cleanup EXIT while :; do GRAPHQL_ARGS=(graphql -f query="$GRAPHQL_QUERY" -f owner="$OWNER" -f name="$NAME" -F first="$PAGE_SIZE") [[ -n "$CURSOR" ]] && GRAPHQL_ARGS+=(-f after="$CURSOR") GRAPHQL_OUTPUT=$(gh api "${GRAPHQL_ARGS[@]}") - PAGE_NODES=$(jq '.data.repository.discussions.nodes' <<< "$GRAPHQL_OUTPUT") - [[ "$(jq 'length' <<< "$PAGE_NODES")" -eq 0 ]] && break - OUTPUT=$(jq -cn --argjson all "$OUTPUT" --argjson page "$PAGE_NODES" '$all + $page') + PAGE_NODES_FILE=$(mktemp) + echo "$GRAPHQL_OUTPUT" | jq '.data.repository.discussions.nodes' > "$PAGE_NODES_FILE" + [[ "$(jq 'length' < "$PAGE_NODES_FILE")" -eq 0 ]] && { rm -f "$PAGE_NODES_FILE"; break; } + MERGED_OUTPUT_FILE=$(mktemp) + jq -s '.[0] + .[1]' "$OUTPUT_FILE" "$PAGE_NODES_FILE" > "$MERGED_OUTPUT_FILE" + mv "$MERGED_OUTPUT_FILE" "$OUTPUT_FILE" + MERGED_OUTPUT_FILE="" + [[ -n "$SINCE" && "$(jq -r '.[-1].updatedAt // empty' < "$PAGE_NODES_FILE")" < "$SINCE" ]] && { rm -f "$PAGE_NODES_FILE"; break; } + rm -f "$PAGE_NODES_FILE" [[ -z "$SINCE" ]] && break - [[ "$(jq -r '.[-1].updatedAt // empty' <<< "$PAGE_NODES")" < "$SINCE" ]] && break [[ "$(jq -r '.data.repository.discussions.pageInfo.hasNextPage' <<< "$GRAPHQL_OUTPUT")" == "true" ]] || break CURSOR=$(jq -r '.data.repository.discussions.pageInfo.endCursor' <<< "$GRAPHQL_OUTPUT") done # Transform GraphQL output to match gh discussion list format - OUTPUT=$(echo "$OUTPUT" | jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { + FILTERED_OUTPUT_FILE=$(mktemp) + jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { number: .number, title: .title, author: .author, @@ -381,15 +395,19 @@ mcp-scripts: comments: .comments, answer: .answer, url: .url - }]') + }]' "$OUTPUT_FILE" > "$FILTERED_OUTPUT_FILE" + mv "$FILTERED_OUTPUT_FILE" "$OUTPUT_FILE" # Apply jq filter if specified if [[ -n "$JQ_FILTER" ]]; then - jq "$JQ_FILTER" <<< "$OUTPUT" + jq "$JQ_FILTER" "$OUTPUT_FILE" else # Return schema and size instead of full data - ITEM_COUNT=$(jq 'length' <<< "$OUTPUT") - DATA_SIZE=${#OUTPUT} + ITEM_COUNT=$(jq 'length' < "$OUTPUT_FILE") + DATA_SIZE=$(wc -c < "$OUTPUT_FILE" | tr -d '[:space:]') + if [[ "$DATA_SIZE" -gt 0 ]]; then + DATA_SIZE=$((DATA_SIZE - 1)) + fi # Validate values are numeric if ! [[ "$ITEM_COUNT" =~ ^[0-9]+$ ]]; then diff --git a/.github/workflows/smoke-copilot-aoai-apikey.lock.yml b/.github/workflows/smoke-copilot-aoai-apikey.lock.yml index 00b7a75776b..17ff9a62b8c 100644 --- a/.github/workflows/smoke-copilot-aoai-apikey.lock.yml +++ b/.github/workflows/smoke-copilot-aoai-apikey.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"d92c03ab9a5b33f6786bd60b5d8d0e1fdd1d05cc24d39e6dc04751a4fc3a0f25","body_hash":"b6a99112f7584dd539ecf8000668ffcd2ae1569e074e15266362f5d3c366790b","strict":true,"engine_base_url_customized":true,"agent_id":"copilot","agent_model":"o4-mini-aw","engine_versions":{"copilot":"1.0.80"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"ea83bcc91c61912714206e793979de78cde98ad09fd54078a7630ea684efea71","body_hash":"b6a99112f7584dd539ecf8000668ffcd2ae1569e074e15266362f5d3c366790b","strict":true,"engine_base_url_customized":true,"agent_id":"copilot","agent_model":"o4-mini-aw","engine_versions":{"copilot":"1.0.80"}} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","FOUNDRY_API_KEY","FOUNDRY_OPENAI_ENDPOINT","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-go","sha":"b7ad1dad31e06c5925ef5d2fc7ad053ef454303e","version":"v7.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"docker/build-push-action","sha":"53b7df96c91f9c12dcc8a07bcb9ccacbed38856a","version":"v7.3.0"},{"repo":"docker/setup-buildx-action","sha":"37fe631027851001ddb9b187196cc803df7f5f0e","version":"v4.3.0"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7","digest":"sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7@sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7","digest":"sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7@sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7","digest":"sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7@sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7","digest":"sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7@sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.10","digest":"sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.10@sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e","pinned_image":"ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e"},{"image":"ghcr.io/github/github-mcp-server:v1.10.0","digest":"sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.0@sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c"},{"image":"ghcr.io/oraios/serena:1.7.0","digest":"sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730","pinned_image":"ghcr.io/oraios/serena:1.7.0@sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730"}],"mcp_servers":[{"name":"agenticworkflows","tools":["*"]},{"name":"mcpscripts","tools":["github-discussion-query","github-issue-query","github-pr-query"]},{"name":"safeoutputs","tools":["add_comment","add_labels","create_check_run","create_discussion","create_issue","create_pull_request_review_comment","dispatch_workflow","haiku_printer","missing_data","missing_tool","noop","remove_labels","reply_to_pull_request_review_comment","send_slack_message","set_issue_type","submit_pull_request_review","upload_artifact"]},{"name":"serena","tools":["*"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -370,7 +370,7 @@ jobs: GH_AW_EXPERIMENT_SPEC: '{"caveman":{"variants":["yes","no"]},"subagent_model":{"variants":["small","large"]}}' GH_AW_EXPERIMENT_STATE_FILE: /tmp/gh-aw/experiments/state.jsonl GH_AW_EXPERIMENT_STATE_DIR: /tmp/gh-aw/experiments - GH_AW_HARNESS_VERSION: d92c03ab9a5b33f6786bd60b5d8d0e1fdd1d05cc24d39e6dc04751a4fc3a0f25:b6a99112f7584dd539ecf8000668ffcd2ae1569e074e15266362f5d3c366790b + GH_AW_HARNESS_VERSION: ea83bcc91c61912714206e793979de78cde98ad09fd54078a7630ea684efea71:b6a99112f7584dd539ecf8000668ffcd2ae1569e074e15266362f5d3c366790b with: script: | const path = require('path'); @@ -1473,7 +1473,7 @@ jobs: - name: Write MCP Scripts Tool Files run: | - cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF' + cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF' #!/bin/bash # Auto-generated mcp-script tool: github-discussion-query # Query GitHub discussions with jq filtering support. Without --jq, returns schema and data size info. Use --jq '.' to get all data, or specific jq expressions to filter. @@ -1556,22 +1556,36 @@ jobs: PAGE_SIZE="$LIMIT" [[ -n "$SINCE" ]] && PAGE_SIZE=100 CURSOR="" - OUTPUT="[]" + OUTPUT_FILE=$(mktemp) + PAGE_NODES_FILE="" + MERGED_OUTPUT_FILE="" + FILTERED_OUTPUT_FILE="" + echo '[]' > "$OUTPUT_FILE" + cleanup() { + rm -f "$OUTPUT_FILE" "$PAGE_NODES_FILE" "$MERGED_OUTPUT_FILE" "$FILTERED_OUTPUT_FILE" + } + trap cleanup EXIT while :; do GRAPHQL_ARGS=(graphql -f query="$GRAPHQL_QUERY" -f owner="$OWNER" -f name="$NAME" -F first="$PAGE_SIZE") [[ -n "$CURSOR" ]] && GRAPHQL_ARGS+=(-f after="$CURSOR") GRAPHQL_OUTPUT=$(gh api "${GRAPHQL_ARGS[@]}") - PAGE_NODES=$(jq '.data.repository.discussions.nodes' <<< "$GRAPHQL_OUTPUT") - [[ "$(jq 'length' <<< "$PAGE_NODES")" -eq 0 ]] && break - OUTPUT=$(jq -cn --argjson all "$OUTPUT" --argjson page "$PAGE_NODES" '$all + $page') + PAGE_NODES_FILE=$(mktemp) + echo "$GRAPHQL_OUTPUT" | jq '.data.repository.discussions.nodes' > "$PAGE_NODES_FILE" + [[ "$(jq 'length' < "$PAGE_NODES_FILE")" -eq 0 ]] && { rm -f "$PAGE_NODES_FILE"; break; } + MERGED_OUTPUT_FILE=$(mktemp) + jq -s '.[0] + .[1]' "$OUTPUT_FILE" "$PAGE_NODES_FILE" > "$MERGED_OUTPUT_FILE" + mv "$MERGED_OUTPUT_FILE" "$OUTPUT_FILE" + MERGED_OUTPUT_FILE="" + [[ -n "$SINCE" && "$(jq -r '.[-1].updatedAt // empty' < "$PAGE_NODES_FILE")" < "$SINCE" ]] && { rm -f "$PAGE_NODES_FILE"; break; } + rm -f "$PAGE_NODES_FILE" [[ -z "$SINCE" ]] && break - [[ "$(jq -r '.[-1].updatedAt // empty' <<< "$PAGE_NODES")" < "$SINCE" ]] && break [[ "$(jq -r '.data.repository.discussions.pageInfo.hasNextPage' <<< "$GRAPHQL_OUTPUT")" == "true" ]] || break CURSOR=$(jq -r '.data.repository.discussions.pageInfo.endCursor' <<< "$GRAPHQL_OUTPUT") done # Transform GraphQL output to match gh discussion list format - OUTPUT=$(echo "$OUTPUT" | jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { + FILTERED_OUTPUT_FILE=$(mktemp) + jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { number: .number, title: .title, author: .author, @@ -1583,15 +1597,19 @@ jobs: comments: .comments, answer: .answer, url: .url - }]') + }]' "$OUTPUT_FILE" > "$FILTERED_OUTPUT_FILE" + mv "$FILTERED_OUTPUT_FILE" "$OUTPUT_FILE" # Apply jq filter if specified if [[ -n "$JQ_FILTER" ]]; then - jq "$JQ_FILTER" <<< "$OUTPUT" + jq "$JQ_FILTER" "$OUTPUT_FILE" else # Return schema and size instead of full data - ITEM_COUNT=$(jq 'length' <<< "$OUTPUT") - DATA_SIZE=${#OUTPUT} + ITEM_COUNT=$(jq 'length' < "$OUTPUT_FILE") + DATA_SIZE=$(wc -c < "$OUTPUT_FILE" | tr -d '[:space:]') + if [[ "$DATA_SIZE" -gt 0 ]]; then + DATA_SIZE=$((DATA_SIZE - 1)) + fi # Validate values are numeric if ! [[ "$ITEM_COUNT" =~ ^[0-9]+$ ]]; then @@ -1637,7 +1655,7 @@ jobs: fi - GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF + GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF chmod +x "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-issue-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-ISSUE-QUERY_98491dc3061cd8ef_EOF' #!/bin/bash diff --git a/.github/workflows/smoke-copilot-aoai-entra.lock.yml b/.github/workflows/smoke-copilot-aoai-entra.lock.yml index 057fdd07102..bca6de81efe 100644 --- a/.github/workflows/smoke-copilot-aoai-entra.lock.yml +++ b/.github/workflows/smoke-copilot-aoai-entra.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b47fcaeb1db1cd02e74b772e4d24c78d5400b9a74f14196cc91636b4a3094d57","body_hash":"82e14f6429d21faf3948e53f0ca2f5afe0985627b5dd8c0b751b5dd7e3502bc3","strict":true,"engine_base_url_customized":true,"agent_id":"copilot","agent_model":"o4-mini-aw","engine_versions":{"copilot":"1.0.80"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"2955c17492edc29b463ef7cabedd2566b6a7df08bd879cb600a801f20b91af10","body_hash":"82e14f6429d21faf3948e53f0ca2f5afe0985627b5dd8c0b751b5dd7e3502bc3","strict":true,"engine_base_url_customized":true,"agent_id":"copilot","agent_model":"o4-mini-aw","engine_versions":{"copilot":"1.0.80"}} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","FOUNDRY_OPENAI_ENDPOINT","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-go","sha":"b7ad1dad31e06c5925ef5d2fc7ad053ef454303e","version":"v7.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"docker/build-push-action","sha":"53b7df96c91f9c12dcc8a07bcb9ccacbed38856a","version":"v7.3.0"},{"repo":"docker/setup-buildx-action","sha":"37fe631027851001ddb9b187196cc803df7f5f0e","version":"v4.3.0"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7","digest":"sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7@sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7","digest":"sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7@sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7","digest":"sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7@sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7","digest":"sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7@sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.10","digest":"sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.10@sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e","pinned_image":"ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e"},{"image":"ghcr.io/github/github-mcp-server:v1.10.0","digest":"sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.0@sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c"},{"image":"ghcr.io/oraios/serena:1.7.0","digest":"sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730","pinned_image":"ghcr.io/oraios/serena:1.7.0@sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730"}],"mcp_servers":[{"name":"agenticworkflows","tools":["*"]},{"name":"mcpscripts","tools":["github-discussion-query","github-issue-query","github-pr-query"]},{"name":"safeoutputs","tools":["add_comment","add_labels","create_check_run","create_discussion","create_issue","create_pull_request_review_comment","dispatch_workflow","haiku_printer","missing_data","missing_tool","noop","remove_labels","reply_to_pull_request_review_comment","send_slack_message","set_issue_type","submit_pull_request_review","upload_artifact"]},{"name":"serena","tools":["*"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -374,7 +374,7 @@ jobs: GH_AW_EXPERIMENT_SPEC: '{"caveman":{"variants":["yes","no"]},"subagent_model":{"variants":["small","large"]}}' GH_AW_EXPERIMENT_STATE_FILE: /tmp/gh-aw/experiments/state.jsonl GH_AW_EXPERIMENT_STATE_DIR: /tmp/gh-aw/experiments - GH_AW_HARNESS_VERSION: b47fcaeb1db1cd02e74b772e4d24c78d5400b9a74f14196cc91636b4a3094d57:82e14f6429d21faf3948e53f0ca2f5afe0985627b5dd8c0b751b5dd7e3502bc3 + GH_AW_HARNESS_VERSION: 2955c17492edc29b463ef7cabedd2566b6a7df08bd879cb600a801f20b91af10:82e14f6429d21faf3948e53f0ca2f5afe0985627b5dd8c0b751b5dd7e3502bc3 with: script: | const path = require('path'); @@ -1489,7 +1489,7 @@ jobs: - name: Write MCP Scripts Tool Files run: | - cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF' + cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF' #!/bin/bash # Auto-generated mcp-script tool: github-discussion-query # Query GitHub discussions with jq filtering support. Without --jq, returns schema and data size info. Use --jq '.' to get all data, or specific jq expressions to filter. @@ -1572,22 +1572,36 @@ jobs: PAGE_SIZE="$LIMIT" [[ -n "$SINCE" ]] && PAGE_SIZE=100 CURSOR="" - OUTPUT="[]" + OUTPUT_FILE=$(mktemp) + PAGE_NODES_FILE="" + MERGED_OUTPUT_FILE="" + FILTERED_OUTPUT_FILE="" + echo '[]' > "$OUTPUT_FILE" + cleanup() { + rm -f "$OUTPUT_FILE" "$PAGE_NODES_FILE" "$MERGED_OUTPUT_FILE" "$FILTERED_OUTPUT_FILE" + } + trap cleanup EXIT while :; do GRAPHQL_ARGS=(graphql -f query="$GRAPHQL_QUERY" -f owner="$OWNER" -f name="$NAME" -F first="$PAGE_SIZE") [[ -n "$CURSOR" ]] && GRAPHQL_ARGS+=(-f after="$CURSOR") GRAPHQL_OUTPUT=$(gh api "${GRAPHQL_ARGS[@]}") - PAGE_NODES=$(jq '.data.repository.discussions.nodes' <<< "$GRAPHQL_OUTPUT") - [[ "$(jq 'length' <<< "$PAGE_NODES")" -eq 0 ]] && break - OUTPUT=$(jq -cn --argjson all "$OUTPUT" --argjson page "$PAGE_NODES" '$all + $page') + PAGE_NODES_FILE=$(mktemp) + echo "$GRAPHQL_OUTPUT" | jq '.data.repository.discussions.nodes' > "$PAGE_NODES_FILE" + [[ "$(jq 'length' < "$PAGE_NODES_FILE")" -eq 0 ]] && { rm -f "$PAGE_NODES_FILE"; break; } + MERGED_OUTPUT_FILE=$(mktemp) + jq -s '.[0] + .[1]' "$OUTPUT_FILE" "$PAGE_NODES_FILE" > "$MERGED_OUTPUT_FILE" + mv "$MERGED_OUTPUT_FILE" "$OUTPUT_FILE" + MERGED_OUTPUT_FILE="" + [[ -n "$SINCE" && "$(jq -r '.[-1].updatedAt // empty' < "$PAGE_NODES_FILE")" < "$SINCE" ]] && { rm -f "$PAGE_NODES_FILE"; break; } + rm -f "$PAGE_NODES_FILE" [[ -z "$SINCE" ]] && break - [[ "$(jq -r '.[-1].updatedAt // empty' <<< "$PAGE_NODES")" < "$SINCE" ]] && break [[ "$(jq -r '.data.repository.discussions.pageInfo.hasNextPage' <<< "$GRAPHQL_OUTPUT")" == "true" ]] || break CURSOR=$(jq -r '.data.repository.discussions.pageInfo.endCursor' <<< "$GRAPHQL_OUTPUT") done # Transform GraphQL output to match gh discussion list format - OUTPUT=$(echo "$OUTPUT" | jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { + FILTERED_OUTPUT_FILE=$(mktemp) + jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { number: .number, title: .title, author: .author, @@ -1599,15 +1613,19 @@ jobs: comments: .comments, answer: .answer, url: .url - }]') + }]' "$OUTPUT_FILE" > "$FILTERED_OUTPUT_FILE" + mv "$FILTERED_OUTPUT_FILE" "$OUTPUT_FILE" # Apply jq filter if specified if [[ -n "$JQ_FILTER" ]]; then - jq "$JQ_FILTER" <<< "$OUTPUT" + jq "$JQ_FILTER" "$OUTPUT_FILE" else # Return schema and size instead of full data - ITEM_COUNT=$(jq 'length' <<< "$OUTPUT") - DATA_SIZE=${#OUTPUT} + ITEM_COUNT=$(jq 'length' < "$OUTPUT_FILE") + DATA_SIZE=$(wc -c < "$OUTPUT_FILE" | tr -d '[:space:]') + if [[ "$DATA_SIZE" -gt 0 ]]; then + DATA_SIZE=$((DATA_SIZE - 1)) + fi # Validate values are numeric if ! [[ "$ITEM_COUNT" =~ ^[0-9]+$ ]]; then @@ -1653,7 +1671,7 @@ jobs: fi - GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF + GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF chmod +x "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-issue-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-ISSUE-QUERY_98491dc3061cd8ef_EOF' #!/bin/bash diff --git a/.github/workflows/smoke-copilot-arm.lock.yml b/.github/workflows/smoke-copilot-arm.lock.yml index aedfcb06520..d0d2b10dc6b 100644 --- a/.github/workflows/smoke-copilot-arm.lock.yml +++ b/.github/workflows/smoke-copilot-arm.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"7dcce1440c006de096b5b2a83ce364e84a3f3f6290b9e1d0741c67bcbdd36553","body_hash":"3bc68c5fc2f246f87363da8c36a45534f9d28fee249531293eca7c875bcf178c","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"},"agent_image_runner":"ubuntu-24.04-arm"} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"689fb87be6a07e318f79efe565c80b04cfc828915a4fbd9fbad507e4ac88e0ba","body_hash":"3bc68c5fc2f246f87363da8c36a45534f9d28fee249531293eca7c875bcf178c","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"},"agent_image_runner":"ubuntu-24.04-arm"} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-go","sha":"b7ad1dad31e06c5925ef5d2fc7ad053ef454303e","version":"v7.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"docker/build-push-action","sha":"53b7df96c91f9c12dcc8a07bcb9ccacbed38856a","version":"v7.3.0"},{"repo":"docker/setup-buildx-action","sha":"37fe631027851001ddb9b187196cc803df7f5f0e","version":"v4.3.0"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7","digest":"sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7@sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7","digest":"sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7@sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7","digest":"sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7@sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.10","digest":"sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.10@sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e","pinned_image":"ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e"},{"image":"ghcr.io/github/github-mcp-server:v1.10.0","digest":"sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.0@sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c"},{"image":"ghcr.io/oraios/serena:1.7.0","digest":"sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730","pinned_image":"ghcr.io/oraios/serena:1.7.0@sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730"}],"has_pull_request":true,"mcp_servers":[{"name":"agenticworkflows","tools":["*"]},{"name":"github","tools":["get_commit","get_file_contents","get_latest_release","get_me","get_pull_request","get_pull_request_comments","get_pull_request_diff","get_pull_request_files","get_pull_request_review_comments","get_pull_request_reviews","get_pull_request_status","get_release_by_tag","get_tag","issue_read","list_branches","list_commits","list_issue_types","list_issues","list_pull_requests","list_releases","list_starred_repositories","list_tags","pull_request_read","search_code","search_issues","search_pull_requests","search_repositories"]},{"name":"mcpscripts","tools":["github-discussion-query","github-issue-query","github-pr-query"]},{"name":"safeoutputs","tools":["add_comment","add_labels","create_discussion","create_issue","create_pull_request_review_comment","dispatch_workflow","haiku_printer","missing_data","missing_tool","noop","remove_labels","send_slack_message","submit_pull_request_review"]},{"name":"serena","tools":["*"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -1235,7 +1235,7 @@ jobs: - name: Write MCP Scripts Tool Files run: | - cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF' + cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF' #!/bin/bash # Auto-generated mcp-script tool: github-discussion-query # Query GitHub discussions with jq filtering support. Without --jq, returns schema and data size info. Use --jq '.' to get all data, or specific jq expressions to filter. @@ -1318,22 +1318,36 @@ jobs: PAGE_SIZE="$LIMIT" [[ -n "$SINCE" ]] && PAGE_SIZE=100 CURSOR="" - OUTPUT="[]" + OUTPUT_FILE=$(mktemp) + PAGE_NODES_FILE="" + MERGED_OUTPUT_FILE="" + FILTERED_OUTPUT_FILE="" + echo '[]' > "$OUTPUT_FILE" + cleanup() { + rm -f "$OUTPUT_FILE" "$PAGE_NODES_FILE" "$MERGED_OUTPUT_FILE" "$FILTERED_OUTPUT_FILE" + } + trap cleanup EXIT while :; do GRAPHQL_ARGS=(graphql -f query="$GRAPHQL_QUERY" -f owner="$OWNER" -f name="$NAME" -F first="$PAGE_SIZE") [[ -n "$CURSOR" ]] && GRAPHQL_ARGS+=(-f after="$CURSOR") GRAPHQL_OUTPUT=$(gh api "${GRAPHQL_ARGS[@]}") - PAGE_NODES=$(jq '.data.repository.discussions.nodes' <<< "$GRAPHQL_OUTPUT") - [[ "$(jq 'length' <<< "$PAGE_NODES")" -eq 0 ]] && break - OUTPUT=$(jq -cn --argjson all "$OUTPUT" --argjson page "$PAGE_NODES" '$all + $page') + PAGE_NODES_FILE=$(mktemp) + echo "$GRAPHQL_OUTPUT" | jq '.data.repository.discussions.nodes' > "$PAGE_NODES_FILE" + [[ "$(jq 'length' < "$PAGE_NODES_FILE")" -eq 0 ]] && { rm -f "$PAGE_NODES_FILE"; break; } + MERGED_OUTPUT_FILE=$(mktemp) + jq -s '.[0] + .[1]' "$OUTPUT_FILE" "$PAGE_NODES_FILE" > "$MERGED_OUTPUT_FILE" + mv "$MERGED_OUTPUT_FILE" "$OUTPUT_FILE" + MERGED_OUTPUT_FILE="" + [[ -n "$SINCE" && "$(jq -r '.[-1].updatedAt // empty' < "$PAGE_NODES_FILE")" < "$SINCE" ]] && { rm -f "$PAGE_NODES_FILE"; break; } + rm -f "$PAGE_NODES_FILE" [[ -z "$SINCE" ]] && break - [[ "$(jq -r '.[-1].updatedAt // empty' <<< "$PAGE_NODES")" < "$SINCE" ]] && break [[ "$(jq -r '.data.repository.discussions.pageInfo.hasNextPage' <<< "$GRAPHQL_OUTPUT")" == "true" ]] || break CURSOR=$(jq -r '.data.repository.discussions.pageInfo.endCursor' <<< "$GRAPHQL_OUTPUT") done # Transform GraphQL output to match gh discussion list format - OUTPUT=$(echo "$OUTPUT" | jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { + FILTERED_OUTPUT_FILE=$(mktemp) + jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { number: .number, title: .title, author: .author, @@ -1345,15 +1359,19 @@ jobs: comments: .comments, answer: .answer, url: .url - }]') + }]' "$OUTPUT_FILE" > "$FILTERED_OUTPUT_FILE" + mv "$FILTERED_OUTPUT_FILE" "$OUTPUT_FILE" # Apply jq filter if specified if [[ -n "$JQ_FILTER" ]]; then - jq "$JQ_FILTER" <<< "$OUTPUT" + jq "$JQ_FILTER" "$OUTPUT_FILE" else # Return schema and size instead of full data - ITEM_COUNT=$(jq 'length' <<< "$OUTPUT") - DATA_SIZE=${#OUTPUT} + ITEM_COUNT=$(jq 'length' < "$OUTPUT_FILE") + DATA_SIZE=$(wc -c < "$OUTPUT_FILE" | tr -d '[:space:]') + if [[ "$DATA_SIZE" -gt 0 ]]; then + DATA_SIZE=$((DATA_SIZE - 1)) + fi # Validate values are numeric if ! [[ "$ITEM_COUNT" =~ ^[0-9]+$ ]]; then @@ -1399,7 +1417,7 @@ jobs: fi - GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF + GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF chmod +x "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-issue-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-ISSUE-QUERY_98491dc3061cd8ef_EOF' #!/bin/bash diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 60c4ef67615..00b1966534d 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"06390e12679769a31f1d72df44f7fc4d2da76d9b1b71d8a9be68391d377b1571","body_hash":"d898822925fb95367583fe71f057b05989a03914d233576bcf26c4ce897fad5e","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"ec168acb93626218699467bdd713943db41cf25e4fb8e0ed9bc613354c498967","body_hash":"d898822925fb95367583fe71f057b05989a03914d233576bcf26c4ce897fad5e","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-go","sha":"b7ad1dad31e06c5925ef5d2fc7ad053ef454303e","version":"v7.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"docker/build-push-action","sha":"53b7df96c91f9c12dcc8a07bcb9ccacbed38856a","version":"v7.3.0"},{"repo":"docker/setup-buildx-action","sha":"37fe631027851001ddb9b187196cc803df7f5f0e","version":"v4.3.0"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7","digest":"sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.7@sha256:40a1e30b1b8d70642d4292485146cd5af612730d7a6a2e12706ddd13df375059"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7","digest":"sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.7@sha256:4f209dd4cbc74d47a6c7379956143de293429d1b1b2fb2647776cdcbf65836a1"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7","digest":"sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.7@sha256:ebc8758c9b085ca244234e3e3ee22300d150095f9bfe7312ca8a61c5acb34a78"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7","digest":"sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.7@sha256:fb362a08d4d2f0da6c036e3f5d3b2fd87931e857fec3ca4a241cd2f2b61131f9"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.10","digest":"sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.10@sha256:08bb5fa417aed94b40a14e2b7b3ae457531a5f22b143a32fe58317139d9b8f42"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e","pinned_image":"ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e"},{"image":"ghcr.io/github/github-mcp-server:v1.10.0","digest":"sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c","pinned_image":"ghcr.io/github/github-mcp-server:v1.10.0@sha256:097512ddf58af80a620c177ae9cad93448f9a2a55c70ee8fde5cec6714522a8c"},{"image":"ghcr.io/oraios/serena:1.7.0","digest":"sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730","pinned_image":"ghcr.io/oraios/serena:1.7.0@sha256:6c9459e4246a39c9deaa4f23fb05a526ac6e237b24c8e84a927a098fa1ab6730"}],"mcp_servers":[{"name":"agenticworkflows","tools":["*"]},{"name":"mcpscripts","tools":["github-discussion-query","github-issue-query","github-pr-query"]},{"name":"safeoutputs","tools":["add_comment","add_labels","create_check_run","create_discussion","create_issue","create_pull_request_review_comment","dispatch_workflow","haiku_printer","missing_data","missing_tool","noop","remove_labels","reply_to_pull_request_review_comment","send_slack_message","set_issue_type","submit_pull_request_review","upload_artifact"]},{"name":"serena","tools":["*"]}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -376,7 +376,7 @@ jobs: GH_AW_EXPERIMENT_SPEC: '{"caveman":{"variants":["yes","no"]},"subagent_model":{"variants":["small","large"]}}' GH_AW_EXPERIMENT_STATE_FILE: /tmp/gh-aw/experiments/state.jsonl GH_AW_EXPERIMENT_STATE_DIR: /tmp/gh-aw/experiments - GH_AW_HARNESS_VERSION: 06390e12679769a31f1d72df44f7fc4d2da76d9b1b71d8a9be68391d377b1571:d898822925fb95367583fe71f057b05989a03914d233576bcf26c4ce897fad5e + GH_AW_HARNESS_VERSION: ec168acb93626218699467bdd713943db41cf25e4fb8e0ed9bc613354c498967:d898822925fb95367583fe71f057b05989a03914d233576bcf26c4ce897fad5e with: script: | const path = require('path'); @@ -1489,7 +1489,7 @@ jobs: - name: Write MCP Scripts Tool Files run: | - cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF' + cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF' #!/bin/bash # Auto-generated mcp-script tool: github-discussion-query # Query GitHub discussions with jq filtering support. Without --jq, returns schema and data size info. Use --jq '.' to get all data, or specific jq expressions to filter. @@ -1572,22 +1572,36 @@ jobs: PAGE_SIZE="$LIMIT" [[ -n "$SINCE" ]] && PAGE_SIZE=100 CURSOR="" - OUTPUT="[]" + OUTPUT_FILE=$(mktemp) + PAGE_NODES_FILE="" + MERGED_OUTPUT_FILE="" + FILTERED_OUTPUT_FILE="" + echo '[]' > "$OUTPUT_FILE" + cleanup() { + rm -f "$OUTPUT_FILE" "$PAGE_NODES_FILE" "$MERGED_OUTPUT_FILE" "$FILTERED_OUTPUT_FILE" + } + trap cleanup EXIT while :; do GRAPHQL_ARGS=(graphql -f query="$GRAPHQL_QUERY" -f owner="$OWNER" -f name="$NAME" -F first="$PAGE_SIZE") [[ -n "$CURSOR" ]] && GRAPHQL_ARGS+=(-f after="$CURSOR") GRAPHQL_OUTPUT=$(gh api "${GRAPHQL_ARGS[@]}") - PAGE_NODES=$(jq '.data.repository.discussions.nodes' <<< "$GRAPHQL_OUTPUT") - [[ "$(jq 'length' <<< "$PAGE_NODES")" -eq 0 ]] && break - OUTPUT=$(jq -cn --argjson all "$OUTPUT" --argjson page "$PAGE_NODES" '$all + $page') + PAGE_NODES_FILE=$(mktemp) + echo "$GRAPHQL_OUTPUT" | jq '.data.repository.discussions.nodes' > "$PAGE_NODES_FILE" + [[ "$(jq 'length' < "$PAGE_NODES_FILE")" -eq 0 ]] && { rm -f "$PAGE_NODES_FILE"; break; } + MERGED_OUTPUT_FILE=$(mktemp) + jq -s '.[0] + .[1]' "$OUTPUT_FILE" "$PAGE_NODES_FILE" > "$MERGED_OUTPUT_FILE" + mv "$MERGED_OUTPUT_FILE" "$OUTPUT_FILE" + MERGED_OUTPUT_FILE="" + [[ -n "$SINCE" && "$(jq -r '.[-1].updatedAt // empty' < "$PAGE_NODES_FILE")" < "$SINCE" ]] && { rm -f "$PAGE_NODES_FILE"; break; } + rm -f "$PAGE_NODES_FILE" [[ -z "$SINCE" ]] && break - [[ "$(jq -r '.[-1].updatedAt // empty' <<< "$PAGE_NODES")" < "$SINCE" ]] && break [[ "$(jq -r '.data.repository.discussions.pageInfo.hasNextPage' <<< "$GRAPHQL_OUTPUT")" == "true" ]] || break CURSOR=$(jq -r '.data.repository.discussions.pageInfo.endCursor' <<< "$GRAPHQL_OUTPUT") done # Transform GraphQL output to match gh discussion list format - OUTPUT=$(echo "$OUTPUT" | jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { + FILTERED_OUTPUT_FILE=$(mktemp) + jq --arg since "$SINCE" '[.[] | select($since == "" or .updatedAt >= $since) | { number: .number, title: .title, author: .author, @@ -1599,15 +1613,19 @@ jobs: comments: .comments, answer: .answer, url: .url - }]') + }]' "$OUTPUT_FILE" > "$FILTERED_OUTPUT_FILE" + mv "$FILTERED_OUTPUT_FILE" "$OUTPUT_FILE" # Apply jq filter if specified if [[ -n "$JQ_FILTER" ]]; then - jq "$JQ_FILTER" <<< "$OUTPUT" + jq "$JQ_FILTER" "$OUTPUT_FILE" else # Return schema and size instead of full data - ITEM_COUNT=$(jq 'length' <<< "$OUTPUT") - DATA_SIZE=${#OUTPUT} + ITEM_COUNT=$(jq 'length' < "$OUTPUT_FILE") + DATA_SIZE=$(wc -c < "$OUTPUT_FILE" | tr -d '[:space:]') + if [[ "$DATA_SIZE" -gt 0 ]]; then + DATA_SIZE=$((DATA_SIZE - 1)) + fi # Validate values are numeric if ! [[ "$ITEM_COUNT" =~ ^[0-9]+$ ]]; then @@ -1653,7 +1671,7 @@ jobs: fi - GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_247853ccdeeb38ac_EOF + GH_AW_MCP_SCRIPTS_SH_GITHUB-DISCUSSION-QUERY_b198e86dc6d829e6_EOF chmod +x "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-discussion-query.sh" cat > "${RUNNER_TEMP}/gh-aw/mcp-scripts/github-issue-query.sh" << 'GH_AW_MCP_SCRIPTS_SH_GITHUB-ISSUE-QUERY_98491dc3061cd8ef_EOF' #!/bin/bash diff --git a/{outname}.f b/{outname}.f new file mode 100644 index 00000000000..e69de29bb2d