From d68c5fabea5626fb5ce8054438bbc0d2ef72d98f Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 13:48:26 +0100 Subject: [PATCH 01/12] test pr title agent --- .github/workflows/pr-title.yml | 122 +++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 .github/workflows/pr-title.yml diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml new file mode 100644 index 0000000..ec42f82 --- /dev/null +++ b/.github/workflows/pr-title.yml @@ -0,0 +1,122 @@ +name: "Validate PR Title" + +on: + pull_request: + types: [opened, edited, reopened, ready_for_review, synchronize] + +jobs: + validate-pr-title: + runs-on: ubuntu-latest + continue-on-error: true + permissions: + contents: read + checks: write + pull-requests: write + + steps: + - name: Validate PR title and create check + shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REPO: ${{ github.repository }} + SHA: ${{ github.event.pull_request.head.sha }} + run: | + set -euo pipefail + + TITLE="${{ github.event.pull_request.title }}" + echo "PR title: $TITLE" + + # Skip validation for renovate + if [[ "$TITLE" == *"chore(deps)"* ]]; then + echo "⚠️ Skipping validation for renovate PRs." + OUTPUT_TITLE="⚠️ Skipping validation for Renovate PRs." + OUTPUT_SUMMARY="⚠️ Skipping validation for Renovate PRs." + CONCLUSION="success" + else + # Full pattern: + # [category/subcategory] type(scope?): description (#123) + FULL_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: [a-z].*( \(#[0-9]+\))$' + + if [[ "$TITLE" =~ $FULL_PATTERN ]]; then + echo "✅ PR title is valid." + OUTPUT_TITLE="✅ PR title is valid." + OUTPUT_SUMMARY="✅ PR title is valid." + CONCLUSION="success" + else + # Diagnose common failures + + # 1) Check category block: [category/category] + CATEGORY_PATTERN='^\[([a-z]+(/[a-z]+)*)\]' + if ! [[ "$TITLE" =~ $CATEGORY_PATTERN ]]; then + REASON="Bad [category] block. Expected: [category] or [category/category]" + fi + + # 2) Check type + optional scope + TYPE_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: ' + if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $TYPE_PATTERN ]]; then + REASON="Bad type(scope): block. Expected type: feat, fix, chore, docs, style, refactor, perf, test, build, ci, revert (optionally with scope: type(scope):)" + fi + + # 3) Check description starts with lowercase letter + DESC_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: [a-z]' + if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $DESC_PATTERN ]]; then + REASON="Bad description. Must start with a lowercase letter after ': '" + fi + + # 4) Check issue reference at the end: (#XXX) + ISSUE_PATTERN='\(#[0-9]+\)$' + if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $ISSUE_PATTERN ]]; then + REASON="Bad (#XXX) ending block. Missing issue reference" + fi + + if [[ -z "${REASON:-}" ]]; then + REASON="Bad title. Does not match the required pattern" + fi + + echo "❌ Invalid PR title: $REASON" + echo "Required format:" + echo "[category] type(scope?): description (#123)" + + OUTPUT_TITLE="$REASON" + OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. Required: [category] type(scope?): description (#123)" + CONCLUSION="failure" + fi + fi + + # Create custom check run + CHECK_RUN=$( + curl -sS -X POST \ + -H "Authorization: Bearer $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/$REPO/check-runs \ + -d @- < Date: Mon, 1 Dec 2025 16:53:05 +0100 Subject: [PATCH 02/12] test pr title agent --- .github/workflows/pr-title.yml | 82 ++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 18 deletions(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index ec42f82..0272b8e 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -1,9 +1,7 @@ name: "Validate PR Title" - on: pull_request: types: [opened, edited, reopened, ready_for_review, synchronize] - jobs: validate-pr-title: runs-on: ubuntu-latest @@ -12,20 +10,80 @@ jobs: contents: read checks: write pull-requests: write - steps: + # NEW: tools for JWT + JSON + - name: Install dependencies for GitHub App auth + run: | + sudo apt-get update -y + sudo apt-get install -y jq openssl + + # NEW: get GitHub App installation token (no Python) + - name: Get GitHub App installation token + id: app-token + env: + APP_ID: ${{ secrets.OPENAEV_PR_CHECKS_APP_ID }} + PRIVATE_KEY: ${{ secrets.OPENAEV_PR_CHECKS_PRIVATE_KEY }} + shell: bash + run: | + set -euo pipefail + + # Write private key to file + printf '%s\n' "$PRIVATE_KEY" > app-private-key.pem + + # Create JWT header+payload (base64url, no padding) + header_base64=$(printf '{"alg":"RS256","typ":"JWT"}' | openssl base64 -e | tr '+/' '-_' | tr -d '=') + + now=$(date +%s) + iat=$((now - 60)) + exp=$((now + 600)) + payload=$(printf '{"iat":%s,"exp":%s,"iss":"%s"}' "$iat" "$exp" "$APP_ID") + payload_base64=$(printf '%s' "$payload" | openssl base64 -e | tr '+/' '-_' | tr -d '=') + + header_payload="${header_base64}.${payload_base64}" + + # Sign header.payload with app private key (RS256), then base64url encode + signature=$(printf '%s' "$header_payload" | \ + openssl dgst -sha256 -sign app-private-key.pem | \ + openssl base64 -e | tr '+/' '-_' | tr -d '=') + + APP_JWT="${header_payload}.${signature}" + + # Get installations for this app + INSTALLATIONS=$(curl -sS \ + -H "Authorization: Bearer $APP_JWT" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/app/installations) + + INSTALLATION_ID=$(echo "$INSTALLATIONS" | jq -r '.[0].id') + + if [ -z "$INSTALLATION_ID" ] || [ "$INSTALLATION_ID" = "null" ]; then + echo "Could not determine installation id. Response:" + echo "$INSTALLATIONS" + exit 1 + fi + + # Create installation access token + INSTALLATION_TOKEN_RESPONSE=$(curl -sS -X POST \ + -H "Authorization: Bearer $APP_JWT" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/app/installations/$INSTALLATION_ID/access_tokens) + + INSTALLATION_TOKEN=$(echo "$INSTALLATION_TOKEN_RESPONSE" | jq -r '.token') + + echo "::add-mask::$INSTALLATION_TOKEN" + echo "token=$INSTALLATION_TOKEN" >> "$GITHUB_OUTPUT" + + # ORIGINAL STEP: only change is GITHUB_TOKEN value - name: Validate PR title and create check shell: bash env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} # CHANGED: app installation token REPO: ${{ github.repository }} SHA: ${{ github.event.pull_request.head.sha }} run: | set -euo pipefail - TITLE="${{ github.event.pull_request.title }}" echo "PR title: $TITLE" - # Skip validation for renovate if [[ "$TITLE" == *"chore(deps)"* ]]; then echo "⚠️ Skipping validation for renovate PRs." @@ -36,7 +94,6 @@ jobs: # Full pattern: # [category/subcategory] type(scope?): description (#123) FULL_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: [a-z].*( \(#[0-9]+\))$' - if [[ "$TITLE" =~ $FULL_PATTERN ]]; then echo "✅ PR title is valid." OUTPUT_TITLE="✅ PR title is valid." @@ -44,45 +101,37 @@ jobs: CONCLUSION="success" else # Diagnose common failures - # 1) Check category block: [category/category] CATEGORY_PATTERN='^\[([a-z]+(/[a-z]+)*)\]' if ! [[ "$TITLE" =~ $CATEGORY_PATTERN ]]; then REASON="Bad [category] block. Expected: [category] or [category/category]" fi - # 2) Check type + optional scope TYPE_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: ' if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $TYPE_PATTERN ]]; then REASON="Bad type(scope): block. Expected type: feat, fix, chore, docs, style, refactor, perf, test, build, ci, revert (optionally with scope: type(scope):)" fi - # 3) Check description starts with lowercase letter DESC_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: [a-z]' if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $DESC_PATTERN ]]; then REASON="Bad description. Must start with a lowercase letter after ': '" fi - # 4) Check issue reference at the end: (#XXX) ISSUE_PATTERN='\(#[0-9]+\)$' if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $ISSUE_PATTERN ]]; then REASON="Bad (#XXX) ending block. Missing issue reference" fi - if [[ -z "${REASON:-}" ]]; then REASON="Bad title. Does not match the required pattern" fi - echo "❌ Invalid PR title: $REASON" echo "Required format:" echo "[category] type(scope?): description (#123)" - OUTPUT_TITLE="$REASON" OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. Required: [category] type(scope?): description (#123)" CONCLUSION="failure" fi fi - # Create custom check run CHECK_RUN=$( curl -sS -X POST \ @@ -97,10 +146,8 @@ jobs: } EOF ) - CHECK_RUN_ID=$(echo "$CHECK_RUN" | jq -r '.id') echo "Created check run ID: $CHECK_RUN_ID" - # Complete the check run with conclusion + detailed summary curl -sS -X PATCH \ -H "Authorization: Bearer $GITHUB_TOKEN" \ @@ -117,6 +164,5 @@ jobs: } } EOF - # Do not fail job (continue-on-error is true) exit 0 \ No newline at end of file From d293ba633ed77121444ed40bbb667d9c86ecede3 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 16:55:53 +0100 Subject: [PATCH 03/12] test pr title agent --- .github/workflows/pr-title.yml | 36 ++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 0272b8e..60dfd62 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -10,19 +10,18 @@ jobs: contents: read checks: write pull-requests: write + steps: - # NEW: tools for JWT + JSON - name: Install dependencies for GitHub App auth run: | sudo apt-get update -y sudo apt-get install -y jq openssl - # NEW: get GitHub App installation token (no Python) - name: Get GitHub App installation token id: app-token env: - APP_ID: ${{ secrets.OPENAEV_PR_CHECKS_APP_ID }} - PRIVATE_KEY: ${{ secrets.OPENAEV_PR_CHECKS_PRIVATE_KEY }} + APP_ID: ${{ secrets.PR_TITLE_APP_ID }} + PRIVATE_KEY: ${{ secrets.PR_TITLE_APP_PRIVATE_KEY }} shell: bash run: | set -euo pipefail @@ -30,21 +29,23 @@ jobs: # Write private key to file printf '%s\n' "$PRIVATE_KEY" > app-private-key.pem - # Create JWT header+payload (base64url, no padding) - header_base64=$(printf '{"alg":"RS256","typ":"JWT"}' | openssl base64 -e | tr '+/' '-_' | tr -d '=') + # Header + header='{"alg":"RS256","typ":"JWT"}' + header_base64=$(printf '%s' "$header" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=') + # Payload now=$(date +%s) iat=$((now - 60)) exp=$((now + 600)) payload=$(printf '{"iat":%s,"exp":%s,"iss":"%s"}' "$iat" "$exp" "$APP_ID") - payload_base64=$(printf '%s' "$payload" | openssl base64 -e | tr '+/' '-_' | tr -d '=') + payload_base64=$(printf '%s' "$payload" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=') header_payload="${header_base64}.${payload_base64}" - # Sign header.payload with app private key (RS256), then base64url encode - signature=$(printf '%s' "$header_payload" | \ - openssl dgst -sha256 -sign app-private-key.pem | \ - openssl base64 -e | tr '+/' '-_' | tr -d '=') + # Signature (RS256) + signature=$(printf '%s' "$header_payload" \ + | openssl dgst -sha256 -sign app-private-key.pem \ + | openssl base64 -e -A | tr '+/' '-_' | tr -d '=') APP_JWT="${header_payload}.${signature}" @@ -70,20 +71,26 @@ jobs: INSTALLATION_TOKEN=$(echo "$INSTALLATION_TOKEN_RESPONSE" | jq -r '.token') + if [ -z "$INSTALLATION_TOKEN" ] || [ "$INSTALLATION_TOKEN" = "null" ]; then + echo "Failed to get installation token. Response:" + echo "$INSTALLATION_TOKEN_RESPONSE" + exit 1 + fi + echo "::add-mask::$INSTALLATION_TOKEN" echo "token=$INSTALLATION_TOKEN" >> "$GITHUB_OUTPUT" - # ORIGINAL STEP: only change is GITHUB_TOKEN value - name: Validate PR title and create check shell: bash env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} # CHANGED: app installation token + GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} REPO: ${{ github.repository }} SHA: ${{ github.event.pull_request.head.sha }} run: | set -euo pipefail TITLE="${{ github.event.pull_request.title }}" echo "PR title: $TITLE" + # Skip validation for renovate if [[ "$TITLE" == *"chore(deps)"* ]]; then echo "⚠️ Skipping validation for renovate PRs." @@ -132,6 +139,7 @@ jobs: CONCLUSION="failure" fi fi + # Create custom check run CHECK_RUN=$( curl -sS -X POST \ @@ -148,6 +156,7 @@ jobs: ) CHECK_RUN_ID=$(echo "$CHECK_RUN" | jq -r '.id') echo "Created check run ID: $CHECK_RUN_ID" + # Complete the check run with conclusion + detailed summary curl -sS -X PATCH \ -H "Authorization: Bearer $GITHUB_TOKEN" \ @@ -164,5 +173,6 @@ jobs: } } EOF + # Do not fail job (continue-on-error is true) exit 0 \ No newline at end of file From 9b8d956b50aab01afa0c507c5c0f268756aca27b Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 17:09:10 +0100 Subject: [PATCH 04/12] test pr title agent --- .github/workflows/pr-title.yml | 89 ++++++++-------------------------- 1 file changed, 19 insertions(+), 70 deletions(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 60dfd62..4e917d3 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -1,7 +1,9 @@ name: "Validate PR Title" + on: pull_request: types: [opened, edited, reopened, ready_for_review, synchronize] + jobs: validate-pr-title: runs-on: ubuntu-latest @@ -9,85 +11,23 @@ jobs: permissions: contents: read checks: write - pull-requests: write steps: - - name: Install dependencies for GitHub App auth - run: | - sudo apt-get update -y - sudo apt-get install -y jq openssl - - - name: Get GitHub App installation token - id: app-token - env: - APP_ID: ${{ secrets.PR_TITLE_APP_ID }} - PRIVATE_KEY: ${{ secrets.PR_TITLE_APP_PRIVATE_KEY }} - shell: bash - run: | - set -euo pipefail - - # Write private key to file - printf '%s\n' "$PRIVATE_KEY" > app-private-key.pem - - # Header - header='{"alg":"RS256","typ":"JWT"}' - header_base64=$(printf '%s' "$header" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=') - - # Payload - now=$(date +%s) - iat=$((now - 60)) - exp=$((now + 600)) - payload=$(printf '{"iat":%s,"exp":%s,"iss":"%s"}' "$iat" "$exp" "$APP_ID") - payload_base64=$(printf '%s' "$payload" | openssl base64 -e -A | tr '+/' '-_' | tr -d '=') - - header_payload="${header_base64}.${payload_base64}" - - # Signature (RS256) - signature=$(printf '%s' "$header_payload" \ - | openssl dgst -sha256 -sign app-private-key.pem \ - | openssl base64 -e -A | tr '+/' '-_' | tr -d '=') - - APP_JWT="${header_payload}.${signature}" - - # Get installations for this app - INSTALLATIONS=$(curl -sS \ - -H "Authorization: Bearer $APP_JWT" \ - -H "Accept: application/vnd.github+json" \ - https://api.github.com/app/installations) - - INSTALLATION_ID=$(echo "$INSTALLATIONS" | jq -r '.[0].id') - - if [ -z "$INSTALLATION_ID" ] || [ "$INSTALLATION_ID" = "null" ]; then - echo "Could not determine installation id. Response:" - echo "$INSTALLATIONS" - exit 1 - fi - - # Create installation access token - INSTALLATION_TOKEN_RESPONSE=$(curl -sS -X POST \ - -H "Authorization: Bearer $APP_JWT" \ - -H "Accept: application/vnd.github+json" \ - https://api.github.com/app/installations/$INSTALLATION_ID/access_tokens) - - INSTALLATION_TOKEN=$(echo "$INSTALLATION_TOKEN_RESPONSE" | jq -r '.token') - - if [ -z "$INSTALLATION_TOKEN" ] || [ "$INSTALLATION_TOKEN" = "null" ]; then - echo "Failed to get installation token. Response:" - echo "$INSTALLATION_TOKEN_RESPONSE" - exit 1 - fi - - echo "::add-mask::$INSTALLATION_TOKEN" - echo "token=$INSTALLATION_TOKEN" >> "$GITHUB_OUTPUT" - + - name: Generate a token + id: generate-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ vars.OPENAEV_PR_CHECKS_APP_ID }} + private-key: ${{ secrets.OPENAEV_PR_CHECKS_PRIVATE_KEY }} - name: Validate PR title and create check shell: bash env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} REPO: ${{ github.repository }} SHA: ${{ github.event.pull_request.head.sha }} run: | set -euo pipefail + TITLE="${{ github.event.pull_request.title }}" echo "PR title: $TITLE" @@ -101,6 +41,7 @@ jobs: # Full pattern: # [category/subcategory] type(scope?): description (#123) FULL_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: [a-z].*( \(#[0-9]+\))$' + if [[ "$TITLE" =~ $FULL_PATTERN ]]; then echo "✅ PR title is valid." OUTPUT_TITLE="✅ PR title is valid." @@ -108,32 +49,39 @@ jobs: CONCLUSION="success" else # Diagnose common failures + # 1) Check category block: [category/category] CATEGORY_PATTERN='^\[([a-z]+(/[a-z]+)*)\]' if ! [[ "$TITLE" =~ $CATEGORY_PATTERN ]]; then REASON="Bad [category] block. Expected: [category] or [category/category]" fi + # 2) Check type + optional scope TYPE_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: ' if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $TYPE_PATTERN ]]; then REASON="Bad type(scope): block. Expected type: feat, fix, chore, docs, style, refactor, perf, test, build, ci, revert (optionally with scope: type(scope):)" fi + # 3) Check description starts with lowercase letter DESC_PATTERN='^\[([a-z]+(/[a-z]+)*)\] (feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([a-z-]+\))?: [a-z]' if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $DESC_PATTERN ]]; then REASON="Bad description. Must start with a lowercase letter after ': '" fi + # 4) Check issue reference at the end: (#XXX) ISSUE_PATTERN='\(#[0-9]+\)$' if [[ -z "${REASON:-}" ]] && ! [[ "$TITLE" =~ $ISSUE_PATTERN ]]; then REASON="Bad (#XXX) ending block. Missing issue reference" fi + if [[ -z "${REASON:-}" ]]; then REASON="Bad title. Does not match the required pattern" fi + echo "❌ Invalid PR title: $REASON" echo "Required format:" echo "[category] type(scope?): description (#123)" + OUTPUT_TITLE="$REASON" OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. Required: [category] type(scope?): description (#123)" CONCLUSION="failure" @@ -154,6 +102,7 @@ jobs: } EOF ) + CHECK_RUN_ID=$(echo "$CHECK_RUN" | jq -r '.id') echo "Created check run ID: $CHECK_RUN_ID" From 51223780323ec96b5e0b93d9beb2f0c9e0a99020 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 17:20:28 +0100 Subject: [PATCH 05/12] test pr title agent --- .github/workflows/pr-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 4e917d3..9050bc9 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -17,7 +17,7 @@ jobs: id: generate-token uses: actions/create-github-app-token@v2 with: - app-id: ${{ vars.OPENAEV_PR_CHECKS_APP_ID }} + app-id: ${{ secrets.OPENAEV_PR_CHECKS_APP_ID }} private-key: ${{ secrets.OPENAEV_PR_CHECKS_PRIVATE_KEY }} - name: Validate PR title and create check shell: bash From caec71d81cd99e02fc7599887c68c2dbb958dd21 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 17:21:56 +0100 Subject: [PATCH 06/12] test pr title agent --- .github/workflows/pr-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 9050bc9..cc73796 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -113,7 +113,7 @@ jobs: https://api.github.com/repos/$REPO/check-runs/$CHECK_RUN_ID \ -d @- < Date: Mon, 1 Dec 2025 17:22:58 +0100 Subject: [PATCH 07/12] test pr title agent --- .github/workflows/pr-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index cc73796..e19be0d 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -83,7 +83,7 @@ jobs: echo "[category] type(scope?): description (#123)" OUTPUT_TITLE="$REASON" - OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. Required: [category] type(scope?): description (#123)" + OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. \nRequired: [category] type(scope?): description (#123)" CONCLUSION="failure" fi fi From e15556c6638df6c5749069ad8abcc43826cad19a Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 17:28:12 +0100 Subject: [PATCH 08/12] test pr title agent --- .github/workflows/pr-title.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index e19be0d..0340e34 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -83,8 +83,8 @@ jobs: echo "[category] type(scope?): description (#123)" OUTPUT_TITLE="$REASON" - OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. \nRequired: [category] type(scope?): description (#123)" - CONCLUSION="failure" + OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. \nRequired: [category] type(scope?): description (#XXX)" + CONCLUSION="neutral" fi fi From 4e517a69460579bf5e7ac36067e286d3d96db565 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 17:28:57 +0100 Subject: [PATCH 09/12] test pr title agent --- .github/workflows/pr-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 0340e34..8c94e9d 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -84,7 +84,7 @@ jobs: OUTPUT_TITLE="$REASON" OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. \nRequired: [category] type(scope?): description (#XXX)" - CONCLUSION="neutral" + CONCLUSION="action_required" fi fi From a476a65cef4599f8092276ea698a245c43370c21 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 17:30:48 +0100 Subject: [PATCH 10/12] test pr title agent --- .github/workflows/pr-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 8c94e9d..0340e34 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -84,7 +84,7 @@ jobs: OUTPUT_TITLE="$REASON" OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. \nRequired: [category] type(scope?): description (#XXX)" - CONCLUSION="action_required" + CONCLUSION="neutral" fi fi From cac6549001ad7c8483efa11150dc451121e4b856 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 21:29:11 +0100 Subject: [PATCH 11/12] test pr title agent --- .github/workflows/pr-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 0340e34..7c374ad 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -84,7 +84,7 @@ jobs: OUTPUT_TITLE="$REASON" OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. \nRequired: [category] type(scope?): description (#XXX)" - CONCLUSION="neutral" + CONCLUSION="error" fi fi From c6169e7eababdaa9ad59571fef44076ea80841d1 Mon Sep 17 00:00:00 2001 From: Guillaume Paris Date: Mon, 1 Dec 2025 21:31:30 +0100 Subject: [PATCH 12/12] test pr title agent --- .github/workflows/pr-title.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 7c374ad..d17d348 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -84,7 +84,7 @@ jobs: OUTPUT_TITLE="$REASON" OUTPUT_SUMMARY="❌ Invalid PR title: $REASON. \nRequired: [category] type(scope?): description (#XXX)" - CONCLUSION="error" + CONCLUSION="failure" fi fi @@ -96,7 +96,7 @@ jobs: https://api.github.com/repos/$REPO/check-runs \ -d @- <