From da129731f2d944f1b988401603f5c233209e0b95 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:45:30 +0000 Subject: [PATCH 1/9] Initial plan From c8eb552e546d24eed793d1d0eddace9e4ccbbc3e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:52:02 +0000 Subject: [PATCH 2/9] Update release workflow to create draft release and publish after highlights - Add --draft flag to gh release create command - Create custom safe-output job publish-release - Update agent prompt to call both update_release and publish_release - The release now stays draft until AI agent completes highlights Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 75 +++++++++++++++++++++++++++--- .github/workflows/release.md | 46 ++++++++++++++++-- 2 files changed, 109 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index c9659322..010c432a 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -180,7 +180,7 @@ jobs: mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs cat > /opt/gh-aw/safeoutputs/config.json << 'EOF' - {"missing_data":{},"missing_tool":{},"noop":{"max":1},"update_release":{"max":1}} + {"missing_data":{},"missing_tool":{},"noop":{"max":1},"publish-release":{"description":"Publish the draft release","inputs":{"tag":{"default":null,"description":"Release tag to publish","required":true,"type":"string"}},"output":"Release published successfully!"},"update_release":{"max":1}} EOF cat > /opt/gh-aw/safeoutputs/tools.json << 'EOF' [ @@ -258,6 +258,23 @@ jobs: "type": "object" }, "name": "noop" + }, + { + "description": "Publish the draft release", + "inputSchema": { + "additionalProperties": false, + "properties": { + "tag": { + "description": "Release tag to publish", + "type": "string" + } + }, + "required": [ + "tag" + ], + "type": "object" + }, + "name": "publish_release" } ] EOF @@ -607,14 +624,20 @@ jobs: ## Output Format - **CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights: + **CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights, then call `publish_release` to make it public: ```javascript + // Step 1: Update the release with highlights update_release({ tag: "${RELEASE_TAG}", operation: "prepend", body: "## 🌟 Release Highlights\n\n[Your complete markdown highlights here]" }) + + // Step 2: Publish the release (remove draft status) + publish_release({ + tag: "${RELEASE_TAG}" + }) ``` **Required Parameters:** @@ -622,7 +645,7 @@ jobs: - `operation` - Must be `"prepend"` to add before existing notes - `body` - Complete markdown content (include all formatting, emojis, links) - **WARNING**: If you don't call the `update_release` tool, the release notes will NOT be updated! + **WARNING**: If you don't call both `update_release` and `publish_release` tools, the release will remain in draft status! **Documentation Base URL:** - Repository docs: `https://github.com/githubnext/gh-aw-mcpg/blob/main/docs/` @@ -674,7 +697,7 @@ jobs: To create or modify GitHub resources (issues, discussions, pull requests, etc.), you MUST call the appropriate safe output tool. Simply writing content will NOT work - the workflow requires actual tool calls. - **Available tools**: missing_tool, noop, update_release + **Available tools**: missing_tool, noop, publish-release, update_release **Critical**: Tool calls write structured data that downstream jobs process. Without tool calls, follow-up actions will be skipped. @@ -895,6 +918,7 @@ jobs: - activation - agent - detection + - publish_release - safe_outputs if: (always()) && (needs.agent.result != 'skipped') runs-on: ubuntu-slim @@ -1307,6 +1331,42 @@ jobs: const { main } = require('/opt/gh-aw/actions/check_membership.cjs'); await main(); + publish_release: + needs: + - agent + - detection + if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'publish_release')) + runs-on: ubuntu-latest + steps: + - name: Download agent output artifact + continue-on-error: true + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 + with: + name: agent-output + path: /opt/gh-aw/safe-jobs/ + - name: Setup Safe Job Environment Variables + run: | + find "/opt/gh-aw/safe-jobs/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/opt/gh-aw/safe-jobs/agent-output" >> "$GITHUB_ENV" + - name: Publish release + run: | + # Read the tag from agent output + RELEASE_TAG=$(jq -r '.tag' "$GH_AW_AGENT_OUTPUT" || echo "") + + if [ -z "$RELEASE_TAG" ]; then + echo "Error: Release tag not provided" + exit 1 + fi + + echo "Publishing release: $RELEASE_TAG" + + # Remove draft status from release + gh release edit "$RELEASE_TAG" --draft=false + + echo "✓ Release $RELEASE_TAG published successfully" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + release: needs: - activation @@ -1385,15 +1445,16 @@ jobs: ./scripts/build-release.sh "$RELEASE_TAG" - name: Upload binaries to release run: | - echo "Creating release for tag: $RELEASE_TAG" + echo "Creating draft release for tag: $RELEASE_TAG" - # Create release with all binaries and checksums + # Create draft release with all binaries and checksums gh release create "$RELEASE_TAG" \ + --draft \ --title "$RELEASE_TAG" \ --generate-notes \ dist/* - echo "✓ Release created with all platform binaries and checksums" + echo "✓ Draft release created with all platform binaries and checksums" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Get release ID diff --git a/.github/workflows/release.md b/.github/workflows/release.md index b0f7db94..f75bcf5b 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -38,6 +38,35 @@ tools: edit: safe-outputs: update-release: + jobs: + publish-release: + description: "Publish the draft release" + runs-on: ubuntu-latest + output: "Release published successfully!" + inputs: + tag: + description: "Release tag to publish" + required: true + type: string + steps: + - name: Publish release + run: | + # Read the tag from agent output + RELEASE_TAG=$(jq -r '.tag' "$GH_AW_AGENT_OUTPUT" || echo "") + + if [ -z "$RELEASE_TAG" ]; then + echo "Error: Release tag not provided" + exit 1 + fi + + echo "Publishing release: $RELEASE_TAG" + + # Remove draft status from release + gh release edit "$RELEASE_TAG" --draft=false + + echo "✓ Release $RELEASE_TAG published successfully" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: create-tag: if: github.event_name == 'workflow_dispatch' @@ -183,15 +212,16 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - echo "Creating release for tag: $RELEASE_TAG" + echo "Creating draft release for tag: $RELEASE_TAG" - # Create release with all binaries and checksums + # Create draft release with all binaries and checksums gh release create "$RELEASE_TAG" \ + --draft \ --title "$RELEASE_TAG" \ --generate-notes \ dist/* - echo "✓ Release created with all platform binaries and checksums" + echo "✓ Draft release created with all platform binaries and checksums" - name: Get release ID id: get_release @@ -534,14 +564,20 @@ Supported platforms: `linux/amd64`, `linux/arm64` ## Output Format -**CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights: +**CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights, then call `publish_release` to make it public: ```javascript +// Step 1: Update the release with highlights update_release({ tag: "${RELEASE_TAG}", operation: "prepend", body: "## 🌟 Release Highlights\n\n[Your complete markdown highlights here]" }) + +// Step 2: Publish the release (remove draft status) +publish_release({ + tag: "${RELEASE_TAG}" +}) ``` **Required Parameters:** @@ -549,7 +585,7 @@ update_release({ - `operation` - Must be `"prepend"` to add before existing notes - `body` - Complete markdown content (include all formatting, emojis, links) -**WARNING**: If you don't call the `update_release` tool, the release notes will NOT be updated! +**WARNING**: If you don't call both `update_release` and `publish_release` tools, the release will remain in draft status! **Documentation Base URL:** - Repository docs: `https://github.com/githubnext/gh-aw-mcpg/blob/main/docs/` From 47b4ecb7e2e0cd7878178d6843beb938a8e99125 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:53:44 +0000 Subject: [PATCH 3/9] Improve publish-release job to properly parse agent output - Handle JSONL format for agent output file - Filter for publish_release type entries - Add better error handling for missing file/data Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 11 ++++++++--- .github/workflows/release.md | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 010c432a..5ce1f969 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -1350,11 +1350,16 @@ jobs: echo "GH_AW_AGENT_OUTPUT=/opt/gh-aw/safe-jobs/agent-output" >> "$GITHUB_ENV" - name: Publish release run: | - # Read the tag from agent output - RELEASE_TAG=$(jq -r '.tag' "$GH_AW_AGENT_OUTPUT" || echo "") + # Read the tag from agent output (JSONL format, find publish_release entries) + if [ ! -f "$GH_AW_AGENT_OUTPUT" ]; then + echo "Error: Agent output file not found" + exit 1 + fi + + RELEASE_TAG=$(jq -r 'select(.type == "publish_release") | .tag' "$GH_AW_AGENT_OUTPUT" | head -1) if [ -z "$RELEASE_TAG" ]; then - echo "Error: Release tag not provided" + echo "Error: Release tag not provided in agent output" exit 1 fi diff --git a/.github/workflows/release.md b/.github/workflows/release.md index f75bcf5b..3a0d60d5 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -51,11 +51,16 @@ safe-outputs: steps: - name: Publish release run: | - # Read the tag from agent output - RELEASE_TAG=$(jq -r '.tag' "$GH_AW_AGENT_OUTPUT" || echo "") + # Read the tag from agent output (JSONL format, find publish_release entries) + if [ ! -f "$GH_AW_AGENT_OUTPUT" ]; then + echo "Error: Agent output file not found" + exit 1 + fi + + RELEASE_TAG=$(jq -r 'select(.type == "publish_release") | .tag' "$GH_AW_AGENT_OUTPUT" | head -1) if [ -z "$RELEASE_TAG" ]; then - echo "Error: Release tag not provided" + echo "Error: Release tag not provided in agent output" exit 1 fi From 5d3dfabf0f447f3318d657e8c551030f6f2f4682 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:02:29 +0000 Subject: [PATCH 4/9] Get release tag from needs.release.outputs instead of agent output - Add 'release' to publish-release job needs dependency - Use needs.release.outputs.release_tag directly in the script - Remove tag input parameter from publish-release tool - Update agent prompt to call publish_release() without parameters - Simplifies workflow by using job outputs instead of parsing agent data Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 37 +++++++++++------------------- .github/workflows/release.md | 30 +++++++++--------------- 2 files changed, 24 insertions(+), 43 deletions(-) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 5ce1f969..b99dc948 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -180,7 +180,7 @@ jobs: mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs cat > /opt/gh-aw/safeoutputs/config.json << 'EOF' - {"missing_data":{},"missing_tool":{},"noop":{"max":1},"publish-release":{"description":"Publish the draft release","inputs":{"tag":{"default":null,"description":"Release tag to publish","required":true,"type":"string"}},"output":"Release published successfully!"},"update_release":{"max":1}} + {"missing_data":{},"missing_tool":{},"noop":{"max":1},"publish-release":{"description":"Publish the draft release","output":"Release published successfully!"},"update_release":{"max":1}} EOF cat > /opt/gh-aw/safeoutputs/tools.json << 'EOF' [ @@ -263,15 +263,7 @@ jobs: "description": "Publish the draft release", "inputSchema": { "additionalProperties": false, - "properties": { - "tag": { - "description": "Release tag to publish", - "type": "string" - } - }, - "required": [ - "tag" - ], + "properties": {}, "type": "object" }, "name": "publish_release" @@ -635,15 +627,16 @@ jobs: }) // Step 2: Publish the release (remove draft status) - publish_release({ - tag: "${RELEASE_TAG}" - }) + // Note: The release tag is automatically retrieved from the release job output + publish_release() ``` **Required Parameters:** - - `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") - - `operation` - Must be `"prepend"` to add before existing notes - - `body` - Complete markdown content (include all formatting, emojis, links) + - For `update_release`: + - `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") + - `operation` - Must be `"prepend"` to add before existing notes + - `body` - Complete markdown content (include all formatting, emojis, links) + - For `publish_release`: No parameters required (tag is automatically retrieved) **WARNING**: If you don't call both `update_release` and `publish_release` tools, the release will remain in draft status! @@ -1335,6 +1328,7 @@ jobs: needs: - agent - detection + - release if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'publish_release')) runs-on: ubuntu-latest steps: @@ -1350,16 +1344,11 @@ jobs: echo "GH_AW_AGENT_OUTPUT=/opt/gh-aw/safe-jobs/agent-output" >> "$GITHUB_ENV" - name: Publish release run: | - # Read the tag from agent output (JSONL format, find publish_release entries) - if [ ! -f "$GH_AW_AGENT_OUTPUT" ]; then - echo "Error: Agent output file not found" - exit 1 - fi - - RELEASE_TAG=$(jq -r 'select(.type == "publish_release") | .tag' "$GH_AW_AGENT_OUTPUT" | head -1) + # Get the release tag from the release job output + RELEASE_TAG="${{ needs.release.outputs.release_tag }}" if [ -z "$RELEASE_TAG" ]; then - echo "Error: Release tag not provided in agent output" + echo "Error: Release tag not available from release job output" exit 1 fi diff --git a/.github/workflows/release.md b/.github/workflows/release.md index 3a0d60d5..862d5302 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -43,24 +43,15 @@ safe-outputs: description: "Publish the draft release" runs-on: ubuntu-latest output: "Release published successfully!" - inputs: - tag: - description: "Release tag to publish" - required: true - type: string + needs: ["release"] steps: - name: Publish release run: | - # Read the tag from agent output (JSONL format, find publish_release entries) - if [ ! -f "$GH_AW_AGENT_OUTPUT" ]; then - echo "Error: Agent output file not found" - exit 1 - fi - - RELEASE_TAG=$(jq -r 'select(.type == "publish_release") | .tag' "$GH_AW_AGENT_OUTPUT" | head -1) + # Get the release tag from the release job output + RELEASE_TAG="${{ needs.release.outputs.release_tag }}" if [ -z "$RELEASE_TAG" ]; then - echo "Error: Release tag not provided in agent output" + echo "Error: Release tag not available from release job output" exit 1 fi @@ -580,15 +571,16 @@ update_release({ }) // Step 2: Publish the release (remove draft status) -publish_release({ - tag: "${RELEASE_TAG}" -}) +// Note: The release tag is automatically retrieved from the release job output +publish_release() ``` **Required Parameters:** -- `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") -- `operation` - Must be `"prepend"` to add before existing notes -- `body` - Complete markdown content (include all formatting, emojis, links) +- For `update_release`: + - `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") + - `operation` - Must be `"prepend"` to add before existing notes + - `body` - Complete markdown content (include all formatting, emojis, links) +- For `publish_release`: No parameters required (tag is automatically retrieved) **WARNING**: If you don't call both `update_release` and `publish_release` tools, the release will remain in draft status! From 18bed4d9e76e622ef1b13d88873db5ca9d678da2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:12:29 +0000 Subject: [PATCH 5/9] Add safe_outputs to publish-release job dependencies - Added safe_outputs to needs array so publish-release runs after release is updated - Agent and detection are automatically added by the compiler - Cannot add conclusion as it would create a circular dependency (conclusion depends on publish_release) Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 1 + .github/workflows/release.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index b99dc948..04e85b7f 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -1329,6 +1329,7 @@ jobs: - agent - detection - release + - safe_outputs if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'publish_release')) runs-on: ubuntu-latest steps: diff --git a/.github/workflows/release.md b/.github/workflows/release.md index 862d5302..9bf43ecf 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -43,7 +43,7 @@ safe-outputs: description: "Publish the draft release" runs-on: ubuntu-latest output: "Release published successfully!" - needs: ["release"] + needs: ["release", "safe_outputs"] steps: - name: Publish release run: | From f6f3212b909e36e901a433e8260dc6d37fa879d3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 00:01:11 +0000 Subject: [PATCH 6/9] Rename release job to draft_release - Renamed job definition from 'release' to 'draft_release' - Updated all needs dependencies to reference 'draft_release' - Updated all job output references to use needs.draft_release.outputs.* - Better reflects the job's purpose of creating a draft release Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 236 ++++++++++++++--------------- .github/workflows/release.md | 24 +-- 2 files changed, 130 insertions(+), 130 deletions(-) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 04e85b7f..566cc912 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -79,8 +79,8 @@ jobs: - activation - create-tag - docker + - draft_release - generate-sbom - - release runs-on: ubuntu-latest permissions: actions: read @@ -110,10 +110,10 @@ jobs: run: bash /opt/gh-aw/actions/create_gh_aw_tmp_dir.sh - env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_ID: ${{ needs.release.outputs.release_id }} - RELEASE_TAG: ${{ needs.release.outputs.release_tag }} + RELEASE_ID: ${{ needs.draft_release.outputs.release_id }} + RELEASE_TAG: ${{ needs.draft_release.outputs.release_tag }} name: Setup environment and fetch release data - run: "set -e\nmkdir -p /tmp/gh-aw-mcpg/release-data\n\n# Use the release ID and tag from the release job\necho \"Release ID from release job: $RELEASE_ID\"\necho \"Release tag from release job: $RELEASE_TAG\"\n\necho \"Processing release: $RELEASE_TAG\"\n\necho \"RELEASE_TAG=$RELEASE_TAG\" >> \"$GITHUB_ENV\"\n\n# Get the current release information\ngh release view \"$RELEASE_TAG\" --json name,tagName,createdAt,publishedAt,url,body > /tmp/gh-aw-mcpg/release-data/current_release.json\necho \"✓ Fetched current release information\"\n\n# Get the previous release to determine the range\nPREV_RELEASE_TAG=$(gh release list --limit 2 --json tagName --jq '.[1].tagName // empty')\n\nif [ -z \"$PREV_RELEASE_TAG\" ]; then\n echo \"No previous release found. This appears to be the first release.\"\n echo \"PREV_RELEASE_TAG=\" >> \"$GITHUB_ENV\"\n touch /tmp/gh-aw-mcpg/release-data/pull_requests.json\n echo \"[]\" > /tmp/gh-aw-mcpg/release-data/pull_requests.json\nelse\n echo \"Previous release: $PREV_RELEASE_TAG\"\n echo \"PREV_RELEASE_TAG=$PREV_RELEASE_TAG\" >> \"$GITHUB_ENV\"\n \n # Get commits between releases\n echo \"Fetching commits between $PREV_RELEASE_TAG and $RELEASE_TAG...\"\n git fetch --unshallow 2>/dev/null || git fetch --depth=1000\n \n # Get all merged PRs between the two releases\n echo \"Fetching pull requests merged between releases...\"\n PREV_PUBLISHED_AT=$(gh release view \"$PREV_RELEASE_TAG\" --json publishedAt --jq .publishedAt)\n CURR_PUBLISHED_AT=$(gh release view \"$RELEASE_TAG\" --json publishedAt --jq .publishedAt)\n gh pr list \\\n --state merged \\\n --limit 1000 \\\n --json number,title,author,labels,mergedAt,url,body \\\n --jq \"[.[] | select(.mergedAt >= \\\"$PREV_PUBLISHED_AT\\\" and .mergedAt <= \\\"$CURR_PUBLISHED_AT\\\")]\" \\\n > /tmp/gh-aw-mcpg/release-data/pull_requests.json\n \n PR_COUNT=$(jq length \"/tmp/gh-aw-mcpg/release-data/pull_requests.json\")\n echo \"✓ Fetched $PR_COUNT pull requests\"\nfi\n\n# Get the README.md content for context about the project\nif [ -f \"README.md\" ]; then\n cp README.md /tmp/gh-aw-mcpg/release-data/README.md\n echo \"✓ Copied README.md for reference\"\nfi\n\n# List documentation files for linking\nfind docs -type f -name \"*.md\" 2>/dev/null > /tmp/gh-aw-mcpg/release-data/docs_files.txt || echo \"No docs directory found\"\n\necho \"✓ Setup complete. Data available in /tmp/gh-aw-mcpg/release-data/\"" + run: "set -e\nmkdir -p /tmp/gh-aw-mcpg/release-data\n\n# Use the release ID and tag from the draft_release job\necho \"Release ID from release job: $RELEASE_ID\"\necho \"Release tag from release job: $RELEASE_TAG\"\n\necho \"Processing release: $RELEASE_TAG\"\n\necho \"RELEASE_TAG=$RELEASE_TAG\" >> \"$GITHUB_ENV\"\n\n# Get the current release information\ngh release view \"$RELEASE_TAG\" --json name,tagName,createdAt,publishedAt,url,body > /tmp/gh-aw-mcpg/release-data/current_release.json\necho \"✓ Fetched current release information\"\n\n# Get the previous release to determine the range\nPREV_RELEASE_TAG=$(gh release list --limit 2 --json tagName --jq '.[1].tagName // empty')\n\nif [ -z \"$PREV_RELEASE_TAG\" ]; then\n echo \"No previous release found. This appears to be the first release.\"\n echo \"PREV_RELEASE_TAG=\" >> \"$GITHUB_ENV\"\n touch /tmp/gh-aw-mcpg/release-data/pull_requests.json\n echo \"[]\" > /tmp/gh-aw-mcpg/release-data/pull_requests.json\nelse\n echo \"Previous release: $PREV_RELEASE_TAG\"\n echo \"PREV_RELEASE_TAG=$PREV_RELEASE_TAG\" >> \"$GITHUB_ENV\"\n \n # Get commits between releases\n echo \"Fetching commits between $PREV_RELEASE_TAG and $RELEASE_TAG...\"\n git fetch --unshallow 2>/dev/null || git fetch --depth=1000\n \n # Get all merged PRs between the two releases\n echo \"Fetching pull requests merged between releases...\"\n PREV_PUBLISHED_AT=$(gh release view \"$PREV_RELEASE_TAG\" --json publishedAt --jq .publishedAt)\n CURR_PUBLISHED_AT=$(gh release view \"$RELEASE_TAG\" --json publishedAt --jq .publishedAt)\n gh pr list \\\n --state merged \\\n --limit 1000 \\\n --json number,title,author,labels,mergedAt,url,body \\\n --jq \"[.[] | select(.mergedAt >= \\\"$PREV_PUBLISHED_AT\\\" and .mergedAt <= \\\"$CURR_PUBLISHED_AT\\\")]\" \\\n > /tmp/gh-aw-mcpg/release-data/pull_requests.json\n \n PR_COUNT=$(jq length \"/tmp/gh-aw-mcpg/release-data/pull_requests.json\")\n echo \"✓ Fetched $PR_COUNT pull requests\"\nfi\n\n# Get the README.md content for context about the project\nif [ -f \"README.md\" ]; then\n cp README.md /tmp/gh-aw-mcpg/release-data/README.md\n echo \"✓ Copied README.md for reference\"\nfi\n\n# List documentation files for linking\nfind docs -type f -name \"*.md\" 2>/dev/null > /tmp/gh-aw-mcpg/release-data/docs_files.txt || echo \"No docs directory found\"\n\necho \"✓ Setup complete. Data available in /tmp/gh-aw-mcpg/release-data/\"" - name: Configure Git credentials env: @@ -452,7 +452,7 @@ jobs: GH_AW_SAFE_OUTPUTS: ${{ env.GH_AW_SAFE_OUTPUTS }} GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} GH_AW_GITHUB_SERVER_URL: ${{ github.server_url }} - GH_AW_NEEDS_RELEASE_OUTPUTS_RELEASE_ID: ${{ needs.release.outputs.release_id }} + GH_AW_NEEDS_DRAFT_RELEASE_OUTPUTS_RELEASE_ID: ${{ needs.draft_release.outputs.release_id }} run: | bash /opt/gh-aw/actions/create_prompt_first.sh cat << 'PROMPT_EOF' > "$GH_AW_PROMPT" @@ -460,7 +460,7 @@ jobs: Generate an engaging release highlights summary for **__GH_AW_GITHUB_REPOSITORY__** (MCP Gateway) release `${RELEASE_TAG}`. - **Release ID**: __GH_AW_NEEDS_RELEASE_OUTPUTS_RELEASE_ID__ + **Release ID**: __GH_AW_NEEDS_DRAFT_RELEASE_OUTPUTS_RELEASE_ID__ ## Data Available @@ -653,7 +653,7 @@ jobs: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} GH_AW_GITHUB_SERVER_URL: ${{ github.server_url }} - GH_AW_NEEDS_RELEASE_OUTPUTS_RELEASE_ID: ${{ needs.release.outputs.release_id }} + GH_AW_NEEDS_DRAFT_RELEASE_OUTPUTS_RELEASE_ID: ${{ needs.draft_release.outputs.release_id }} with: script: | const substitutePlaceholders = require('/opt/gh-aw/actions/substitute_placeholders.cjs'); @@ -664,7 +664,7 @@ jobs: substitutions: { GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, GH_AW_GITHUB_SERVER_URL: process.env.GH_AW_GITHUB_SERVER_URL, - GH_AW_NEEDS_RELEASE_OUTPUTS_RELEASE_ID: process.env.GH_AW_NEEDS_RELEASE_OUTPUTS_RELEASE_ID + GH_AW_NEEDS_DRAFT_RELEASE_OUTPUTS_RELEASE_ID: process.env.GH_AW_NEEDS_DRAFT_RELEASE_OUTPUTS_RELEASE_ID } }); - name: Append XPIA security instructions to prompt @@ -774,7 +774,7 @@ jobs: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} GH_AW_GITHUB_SERVER_URL: ${{ github.server_url }} - GH_AW_NEEDS_RELEASE_OUTPUTS_RELEASE_ID: ${{ needs.release.outputs.release_id }} + GH_AW_NEEDS_DRAFT_RELEASE_OUTPUTS_RELEASE_ID: ${{ needs.draft_release.outputs.release_id }} with: script: | const { setupGlobals } = require('/opt/gh-aw/actions/setup_globals.cjs'); @@ -1209,7 +1209,7 @@ jobs: if-no-files-found: ignore docker: - needs: release + needs: draft_release runs-on: ubuntu-latest permissions: contents: read @@ -1231,7 +1231,7 @@ jobs: - name: Extract tag version id: tag_version run: | - RELEASE_TAG="${{ needs.release.outputs.release_tag }}" + RELEASE_TAG="${{ needs.draft_release.outputs.release_tag }}" echo "version=$RELEASE_TAG" >> "$GITHUB_OUTPUT" echo "✓ Version: $RELEASE_TAG" - name: Build and push (multi-arch) @@ -1249,8 +1249,110 @@ jobs: ghcr.io/${{ github.repository }}:${{ steps.tag_version.outputs.version }} ghcr.io/${{ github.repository }}:${{ github.sha }} + draft_release: + needs: + - activation + - create-tag + if: > + always() && needs.activation.result == 'success' && (needs.create-tag.result == 'success' || needs.create-tag.result == 'skipped') + runs-on: ubuntu-latest + permissions: + attestations: write + contents: write + id-token: write + packages: write + + outputs: + release_id: ${{ steps.get_release.outputs.release_id }} + release_tag: ${{ steps.get_release.outputs.release_tag }} + steps: + - name: Checkout + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + persist-credentials: false + ref: ${{ needs.create-tag.outputs.new_tag || github.ref }} + - name: Set release tag + id: set_tag + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + RELEASE_TAG="${{ needs.create-tag.outputs.new_tag }}" + else + RELEASE_TAG="${GITHUB_REF#refs/tags/}" + fi + + # Sanity check: ensure release tag is set + if [ -z "$RELEASE_TAG" ]; then + echo "Error: RELEASE_TAG is not set" + exit 1 + fi + + # Sanity check: validate format is v.. + if ! echo "$RELEASE_TAG" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$'; then + echo "Error: RELEASE_TAG '$RELEASE_TAG' does not match required format v.." + echo "Example valid format: v1.2.3" + exit 1 + fi + + echo "RELEASE_TAG=$RELEASE_TAG" >> "$GITHUB_ENV" + echo "release_tag=$RELEASE_TAG" >> "$GITHUB_OUTPUT" + echo "✓ Using release tag: $RELEASE_TAG" + - name: Set up Go + uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6 + with: + cache: false + go-version-file: go.mod + - name: Download Go modules + run: go mod download + - name: Run unit tests + run: | + echo "Running unit tests (excluding integration tests)..." + make test-unit + echo "✓ Unit tests passed" + - name: Build binary + run: | + echo "Building binary for integration tests..." + echo "Release tag: $RELEASE_TAG" + make build + echo "✓ Binary built successfully" + - name: Run integration tests + run: | + echo "Running integration tests with built binary..." + make test-integration + echo "✓ Integration tests passed" + - name: Build release binaries + run: | + echo "Building multi-platform binaries for: $RELEASE_TAG" + chmod +x scripts/build-release.sh + ./scripts/build-release.sh "$RELEASE_TAG" + - name: Upload binaries to release + run: | + echo "Creating draft release for tag: $RELEASE_TAG" + + # Create draft release with all binaries and checksums + gh release create "$RELEASE_TAG" \ + --draft \ + --title "$RELEASE_TAG" \ + --generate-notes \ + dist/* + + echo "✓ Draft release created with all platform binaries and checksums" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Get release ID + id: get_release + run: | + echo "Getting release ID for tag: $RELEASE_TAG" + RELEASE_ID=$(gh release view "$RELEASE_TAG" --json databaseId --jq '.databaseId') + echo "release_id=$RELEASE_ID" >> "$GITHUB_OUTPUT" + echo "release_tag=$RELEASE_TAG" >> "$GITHUB_OUTPUT" + echo "✓ Release ID: $RELEASE_ID" + echo "✓ Release Tag: $RELEASE_TAG" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + generate-sbom: - needs: release + needs: draft_release runs-on: ubuntu-latest permissions: contents: write @@ -1300,7 +1402,7 @@ jobs: echo "✓ SBOM files attached to release" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_TAG: ${{ needs.release.outputs.release_tag }} + RELEASE_TAG: ${{ needs.draft_release.outputs.release_tag }} pre_activation: runs-on: ubuntu-slim @@ -1328,7 +1430,7 @@ jobs: needs: - agent - detection - - release + - draft_release - safe_outputs if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'publish_release')) runs-on: ubuntu-latest @@ -1345,8 +1447,8 @@ jobs: echo "GH_AW_AGENT_OUTPUT=/opt/gh-aw/safe-jobs/agent-output" >> "$GITHUB_ENV" - name: Publish release run: | - # Get the release tag from the release job output - RELEASE_TAG="${{ needs.release.outputs.release_tag }}" + # Get the release tag from the draft_release job output + RELEASE_TAG="${{ needs.draft_release.outputs.release_tag }}" if [ -z "$RELEASE_TAG" ]; then echo "Error: Release tag not available from release job output" @@ -1362,108 +1464,6 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - release: - needs: - - activation - - create-tag - if: > - always() && needs.activation.result == 'success' && (needs.create-tag.result == 'success' || needs.create-tag.result == 'skipped') - runs-on: ubuntu-latest - permissions: - attestations: write - contents: write - id-token: write - packages: write - - outputs: - release_id: ${{ steps.get_release.outputs.release_id }} - release_tag: ${{ steps.get_release.outputs.release_tag }} - steps: - - name: Checkout - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - with: - fetch-depth: 0 - persist-credentials: false - ref: ${{ needs.create-tag.outputs.new_tag || github.ref }} - - name: Set release tag - id: set_tag - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - RELEASE_TAG="${{ needs.create-tag.outputs.new_tag }}" - else - RELEASE_TAG="${GITHUB_REF#refs/tags/}" - fi - - # Sanity check: ensure release tag is set - if [ -z "$RELEASE_TAG" ]; then - echo "Error: RELEASE_TAG is not set" - exit 1 - fi - - # Sanity check: validate format is v.. - if ! echo "$RELEASE_TAG" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$'; then - echo "Error: RELEASE_TAG '$RELEASE_TAG' does not match required format v.." - echo "Example valid format: v1.2.3" - exit 1 - fi - - echo "RELEASE_TAG=$RELEASE_TAG" >> "$GITHUB_ENV" - echo "release_tag=$RELEASE_TAG" >> "$GITHUB_OUTPUT" - echo "✓ Using release tag: $RELEASE_TAG" - - name: Set up Go - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6 - with: - cache: false - go-version-file: go.mod - - name: Download Go modules - run: go mod download - - name: Run unit tests - run: | - echo "Running unit tests (excluding integration tests)..." - make test-unit - echo "✓ Unit tests passed" - - name: Build binary - run: | - echo "Building binary for integration tests..." - echo "Release tag: $RELEASE_TAG" - make build - echo "✓ Binary built successfully" - - name: Run integration tests - run: | - echo "Running integration tests with built binary..." - make test-integration - echo "✓ Integration tests passed" - - name: Build release binaries - run: | - echo "Building multi-platform binaries for: $RELEASE_TAG" - chmod +x scripts/build-release.sh - ./scripts/build-release.sh "$RELEASE_TAG" - - name: Upload binaries to release - run: | - echo "Creating draft release for tag: $RELEASE_TAG" - - # Create draft release with all binaries and checksums - gh release create "$RELEASE_TAG" \ - --draft \ - --title "$RELEASE_TAG" \ - --generate-notes \ - dist/* - - echo "✓ Draft release created with all platform binaries and checksums" - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Get release ID - id: get_release - run: | - echo "Getting release ID for tag: $RELEASE_TAG" - RELEASE_ID=$(gh release view "$RELEASE_TAG" --json databaseId --jq '.databaseId') - echo "release_id=$RELEASE_ID" >> "$GITHUB_OUTPUT" - echo "release_tag=$RELEASE_TAG" >> "$GITHUB_OUTPUT" - echo "✓ Release ID: $RELEASE_ID" - echo "✓ Release Tag: $RELEASE_TAG" - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - safe_outputs: needs: - agent diff --git a/.github/workflows/release.md b/.github/workflows/release.md index 9bf43ecf..c583242b 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -43,12 +43,12 @@ safe-outputs: description: "Publish the draft release" runs-on: ubuntu-latest output: "Release published successfully!" - needs: ["release", "safe_outputs"] + needs: ["draft_release", "safe_outputs"] steps: - name: Publish release run: | - # Get the release tag from the release job output - RELEASE_TAG="${{ needs.release.outputs.release_tag }}" + # Get the release tag from the draft_release job output + RELEASE_TAG="${{ needs.draft_release.outputs.release_tag }}" if [ -z "$RELEASE_TAG" ]; then echo "Error: Release tag not available from release job output" @@ -124,7 +124,7 @@ jobs: echo "new_tag=$NEW_TAG" >> "$GITHUB_OUTPUT" echo "✓ Tag $NEW_TAG created and pushed" - release: + draft_release: needs: ["activation", "create-tag"] if: always() && needs.activation.result == 'success' && (needs.create-tag.result == 'success' || needs.create-tag.result == 'skipped') runs-on: ubuntu-latest @@ -232,7 +232,7 @@ jobs: echo "✓ Release Tag: $RELEASE_TAG" docker: - needs: ["release"] + needs: ["draft_release"] runs-on: ubuntu-latest permissions: contents: read @@ -258,7 +258,7 @@ jobs: - name: Extract tag version id: tag_version run: | - RELEASE_TAG="${{ needs.release.outputs.release_tag }}" + RELEASE_TAG="${{ needs.draft_release.outputs.release_tag }}" echo "version=$RELEASE_TAG" >> "$GITHUB_OUTPUT" echo "✓ Version: $RELEASE_TAG" @@ -278,7 +278,7 @@ jobs: cache-to: type=gha,mode=max generate-sbom: - needs: ["release"] + needs: ["draft_release"] runs-on: ubuntu-latest permissions: contents: write @@ -330,7 +330,7 @@ jobs: - name: Attach SBOM to release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_TAG: ${{ needs.release.outputs.release_tag }} + RELEASE_TAG: ${{ needs.draft_release.outputs.release_tag }} run: | echo "Attaching SBOM files to release: $RELEASE_TAG" gh release upload "$RELEASE_TAG" sbom.spdx.json sbom.cdx.json --clobber @@ -338,14 +338,14 @@ jobs: steps: - name: Setup environment and fetch release data env: - RELEASE_ID: ${{ needs.release.outputs.release_id }} - RELEASE_TAG: ${{ needs.release.outputs.release_tag }} + RELEASE_ID: ${{ needs.draft_release.outputs.release_id }} + RELEASE_TAG: ${{ needs.draft_release.outputs.release_tag }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -e mkdir -p /tmp/gh-aw-mcpg/release-data - # Use the release ID and tag from the release job + # Use the release ID and tag from the draft_release job echo "Release ID from release job: $RELEASE_ID" echo "Release tag from release job: $RELEASE_TAG" @@ -404,7 +404,7 @@ steps: Generate an engaging release highlights summary for **${{ github.repository }}** (MCP Gateway) release `${RELEASE_TAG}`. -**Release ID**: ${{ needs.release.outputs.release_id }} +**Release ID**: ${{ needs.draft_release.outputs.release_id }} ## Data Available From 265f3fc92a91ee007d1a83a8dfcbd3e58a57790e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 00:22:16 +0000 Subject: [PATCH 7/9] Remove manual tool call instructions from agent prompt - Removed instructions to call update_release and publish_release tools - These actions are handled automatically by the workflow - Simplified the Output Format section to just describe what the agent should generate - The workflow automatically prepends highlights and publishes the release Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 24 +----------------------- .github/workflows/release.md | 24 +----------------------- 2 files changed, 2 insertions(+), 46 deletions(-) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 566cc912..2b4a4676 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -616,29 +616,7 @@ jobs: ## Output Format - **CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights, then call `publish_release` to make it public: - - ```javascript - // Step 1: Update the release with highlights - update_release({ - tag: "${RELEASE_TAG}", - operation: "prepend", - body: "## 🌟 Release Highlights\n\n[Your complete markdown highlights here]" - }) - - // Step 2: Publish the release (remove draft status) - // Note: The release tag is automatically retrieved from the release job output - publish_release() - ``` - - **Required Parameters:** - - For `update_release`: - - `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") - - `operation` - Must be `"prepend"` to add before existing notes - - `body` - Complete markdown content (include all formatting, emojis, links) - - For `publish_release`: No parameters required (tag is automatically retrieved) - - **WARNING**: If you don't call both `update_release` and `publish_release` tools, the release will remain in draft status! + Generate the release highlights in markdown format as described above. The highlights will be automatically prepended to the release notes, and the release will be published once complete. **Documentation Base URL:** - Repository docs: `https://github.com/githubnext/gh-aw-mcpg/blob/main/docs/` diff --git a/.github/workflows/release.md b/.github/workflows/release.md index c583242b..243f976b 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -560,29 +560,7 @@ Supported platforms: `linux/amd64`, `linux/arm64` ## Output Format -**CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights, then call `publish_release` to make it public: - -```javascript -// Step 1: Update the release with highlights -update_release({ - tag: "${RELEASE_TAG}", - operation: "prepend", - body: "## 🌟 Release Highlights\n\n[Your complete markdown highlights here]" -}) - -// Step 2: Publish the release (remove draft status) -// Note: The release tag is automatically retrieved from the release job output -publish_release() -``` - -**Required Parameters:** -- For `update_release`: - - `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") - - `operation` - Must be `"prepend"` to add before existing notes - - `body` - Complete markdown content (include all formatting, emojis, links) -- For `publish_release`: No parameters required (tag is automatically retrieved) - -**WARNING**: If you don't call both `update_release` and `publish_release` tools, the release will remain in draft status! +Generate the release highlights in markdown format as described above. The highlights will be automatically prepended to the release notes, and the release will be published once complete. **Documentation Base URL:** - Repository docs: `https://github.com/githubnext/gh-aw-mcpg/blob/main/docs/` From 1e1370d80a19d8ceb27bcada657aa19ef8b8ed32 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 00:28:27 +0000 Subject: [PATCH 8/9] Restore update_release instructions, keep publish_release automatic - Agent needs to call update_release tool to add highlights - Removed publish_release call - handled automatically by workflow - Added note that release will be published automatically after highlights - The publish-release job triggers automatically without agent intervention Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 17 ++++++++++++++++- .github/workflows/release.md | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 2b4a4676..cfee32fd 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -616,7 +616,22 @@ jobs: ## Output Format - Generate the release highlights in markdown format as described above. The highlights will be automatically prepended to the release notes, and the release will be published once complete. + **CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights: + + ```javascript + update_release({ + tag: "${RELEASE_TAG}", + operation: "prepend", + body: "## 🌟 Release Highlights\n\n[Your complete markdown highlights here]" + }) + ``` + + **Required Parameters:** + - `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") + - `operation` - Must be `"prepend"` to add before existing notes + - `body` - Complete markdown content (include all formatting, emojis, links) + + **Note**: The release will be automatically published after the highlights are added. **Documentation Base URL:** - Repository docs: `https://github.com/githubnext/gh-aw-mcpg/blob/main/docs/` diff --git a/.github/workflows/release.md b/.github/workflows/release.md index 243f976b..addadb60 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -560,7 +560,22 @@ Supported platforms: `linux/amd64`, `linux/arm64` ## Output Format -Generate the release highlights in markdown format as described above. The highlights will be automatically prepended to the release notes, and the release will be published once complete. +**CRITICAL**: You MUST call the `update_release` tool to update the release with the generated highlights: + +```javascript +update_release({ + tag: "${RELEASE_TAG}", + operation: "prepend", + body: "## 🌟 Release Highlights\n\n[Your complete markdown highlights here]" +}) +``` + +**Required Parameters:** +- `tag` - Release tag from `${RELEASE_TAG}` environment variable (e.g., "v0.1.0") +- `operation` - Must be `"prepend"` to add before existing notes +- `body` - Complete markdown content (include all formatting, emojis, links) + +**Note**: The release will be automatically published after the highlights are added. **Documentation Base URL:** - Repository docs: `https://github.com/githubnext/gh-aw-mcpg/blob/main/docs/` From fb2394031f5973d73d272f4ad6d176e8440e4062 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 12 Jan 2026 00:38:24 +0000 Subject: [PATCH 9/9] Add contents: write permission to publish-release job - The publish-release job needs contents: write to edit the release - Added permissions section to the custom safe-output job - This allows gh release edit --draft=false to work properly Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/release.lock.yml | 2 ++ .github/workflows/release.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index cfee32fd..f1534d01 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -1427,6 +1427,8 @@ jobs: - safe_outputs if: ((!cancelled()) && (needs.agent.result != 'skipped')) && (contains(needs.agent.outputs.output_types, 'publish_release')) runs-on: ubuntu-latest + permissions: + contents: write steps: - name: Download agent output artifact continue-on-error: true diff --git a/.github/workflows/release.md b/.github/workflows/release.md index addadb60..0698f022 100644 --- a/.github/workflows/release.md +++ b/.github/workflows/release.md @@ -44,6 +44,8 @@ safe-outputs: runs-on: ubuntu-latest output: "Release published successfully!" needs: ["draft_release", "safe_outputs"] + permissions: + contents: write steps: - name: Publish release run: |