diff --git a/.github/workflows/tend-ci-fix.yaml b/.github/workflows/tend-ci-fix.yaml index 517bb410..8f89ebcd 100644 --- a/.github/workflows/tend-ci-fix.yaml +++ b/.github/workflows/tend-ci-fix.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -32,7 +32,7 @@ jobs: fetch-tags: true token: ${{ secrets.TEND_BOT_TOKEN }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 with: github_token: ${{ secrets.TEND_BOT_TOKEN }} claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} diff --git a/.github/workflows/tend-mention.yaml b/.github/workflows/tend-mention.yaml index 4ae8bddf..8f6ca61c 100644 --- a/.github/workflows/tend-mention.yaml +++ b/.github/workflows/tend-mention.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -341,26 +341,6 @@ jobs: PAYLOAD_PR: ${{ github.event.client_payload.pr }} PAYLOAD_ID: ${{ github.event.client_payload.id }} - # The dispatch arm covers a relayed inline comment, whose id the check - # step verified belongs to this PR; a review *submission* has no single - # comment to react to, so it gets no eyes — same as when the events - # arrived directly. - - name: React with eyes - if: | - steps.check.outputs.should_run == 'true' - && ((github.event.comment && contains(github.event.comment.body, '@dormouse-bot')) - || (github.event.client_payload.kind == 'pull_request_review_comment' - && steps.check.outputs.reason == 'mention')) - run: | - gh api "repos/$REPO/$TARGET/reactions" -f content=eyes --silent \ - || echo "::warning::could not add the eyes reaction" - env: - REPO: ${{ github.repository }} - TARGET: ${{ github.event_name == 'issue_comment' - && format('issues/comments/{0}', github.event.comment.id) - || format('pulls/comments/{0}', github.event.comment.id || github.event.client_payload.id) }} - GITHUB_TOKEN: ${{ secrets.TEND_BOT_TOKEN }} - handle: needs: verify if: needs.verify.outputs.should_run == 'true' @@ -377,6 +357,32 @@ jobs: actions: read issues: write steps: + # Both halves of the reaction belong to this job, so the eyes can only + # go on once the job that takes them off has started. Put them in + # `verify` and `handle` respectively and the routine burst case strands + # them: a third mention on one thread evicts the second's pending + # `handle` — a job cancelled while queued allocates no runner and runs + # no steps, `always()` included — while its `verify` already reacted. + # + # The dispatch arm covers a relayed inline comment, whose id the check + # step verified belongs to this PR; a review *submission* has no single + # comment to react to, so it gets no eyes — same as when the events + # arrived directly. The job's own `if` already carries `should_run`. + - name: React with eyes + if: | + ((github.event.comment && contains(github.event.comment.body, '@dormouse-bot')) + || (github.event.client_payload.kind == 'pull_request_review_comment' + && needs.verify.outputs.reason == 'mention')) + run: | + gh api "repos/$REPO/$TARGET/reactions" -f content=eyes --silent \ + || echo "::warning::could not add the eyes reaction" + env: + REPO: ${{ github.repository }} + TARGET: ${{ github.event_name == 'issue_comment' + && format('issues/comments/{0}', github.event.comment.id) + || format('pulls/comments/{0}', github.event.comment.id || github.event.client_payload.id) }} + GITHUB_TOKEN: ${{ secrets.TEND_BOT_TOKEN }} + - uses: actions/checkout@v7 with: fetch-depth: 0 @@ -412,7 +418,7 @@ jobs: # the API record — the dispatch payload never carries one to spoof. EVENT_TS: ${{ github.event.comment.updated_at || needs.verify.outputs.ts || github.event.issue.updated_at }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 with: github_token: ${{ secrets.TEND_BOT_TOKEN }} claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} @@ -448,7 +454,8 @@ jobs: || (github.event.client_payload.kind == 'pull_request_review_comment' && needs.verify.outputs.reason == 'mention')) run: | - REACTION_ID=$(gh api "repos/$REPO/$TARGET/reactions?content=eyes" \ + REACTION_ID=$(gh api --paginate \ + "repos/$REPO/$TARGET/reactions?content=eyes&per_page=100" \ --jq ".[] | select(.user.login == \"$BOT_NAME\") | .id" | head -n1) if [ -n "$REACTION_ID" ]; then gh api -X DELETE "repos/$REPO/$TARGET/reactions/$REACTION_ID" --silent \ diff --git a/.github/workflows/tend-nightly.yaml b/.github/workflows/tend-nightly.yaml index 404500e6..11bee848 100644 --- a/.github/workflows/tend-nightly.yaml +++ b/.github/workflows/tend-nightly.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -32,7 +32,7 @@ jobs: fetch-tags: true token: ${{ secrets.TEND_BOT_TOKEN }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 with: github_token: ${{ secrets.TEND_BOT_TOKEN }} claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} diff --git a/.github/workflows/tend-notifications.yaml b/.github/workflows/tend-notifications.yaml index 17bde21b..70e8cdf2 100644 --- a/.github/workflows/tend-notifications.yaml +++ b/.github/workflows/tend-notifications.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -145,7 +145,7 @@ jobs: fetch-depth: 0 fetch-tags: true token: ${{ secrets.TEND_BOT_TOKEN }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 if: steps.check.outputs.count != '0' || github.event_name == 'workflow_dispatch' with: github_token: ${{ secrets.TEND_BOT_TOKEN }} diff --git a/.github/workflows/tend-review-runs.yaml b/.github/workflows/tend-review-runs.yaml index b153b0ef..b0aef480 100644 --- a/.github/workflows/tend-review-runs.yaml +++ b/.github/workflows/tend-review-runs.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -32,7 +32,7 @@ jobs: fetch-tags: true token: ${{ secrets.TEND_BOT_TOKEN }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 with: github_token: ${{ secrets.TEND_BOT_TOKEN }} claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} diff --git a/.github/workflows/tend-review.yaml b/.github/workflows/tend-review.yaml index 33a99e0e..beef6851 100644 --- a/.github/workflows/tend-review.yaml +++ b/.github/workflows/tend-review.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -134,7 +134,7 @@ jobs: fetch-tags: true token: ${{ secrets.TEND_BOT_TOKEN }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 if: steps.gate.outputs.should_run == 'true' with: github_token: ${{ secrets.TEND_BOT_TOKEN }} @@ -148,7 +148,8 @@ jobs: - name: Remove the eyes reaction if: always() && (steps.gate.outputs.should_run == 'true') run: | - REACTION_ID=$(gh api "repos/$REPO/$TARGET/reactions?content=eyes" \ + REACTION_ID=$(gh api --paginate \ + "repos/$REPO/$TARGET/reactions?content=eyes&per_page=100" \ --jq ".[] | select(.user.login == \"$BOT_NAME\") | .id" | head -n1) if [ -n "$REACTION_ID" ]; then gh api -X DELETE "repos/$REPO/$TARGET/reactions/$REACTION_ID" --silent \ diff --git a/.github/workflows/tend-triage.yaml b/.github/workflows/tend-triage.yaml index 6a04549f..9e8452bb 100644 --- a/.github/workflows/tend-triage.yaml +++ b/.github/workflows/tend-triage.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -44,7 +44,7 @@ jobs: fetch-tags: true token: ${{ secrets.TEND_BOT_TOKEN }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 with: github_token: ${{ secrets.TEND_BOT_TOKEN }} claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} @@ -57,7 +57,8 @@ jobs: - name: Remove the eyes reaction if: always() run: | - REACTION_ID=$(gh api "repos/$REPO/$TARGET/reactions?content=eyes" \ + REACTION_ID=$(gh api --paginate \ + "repos/$REPO/$TARGET/reactions?content=eyes&per_page=100" \ --jq ".[] | select(.user.login == \"$BOT_NAME\") | .id" | head -n1) if [ -n "$REACTION_ID" ]; then gh api -X DELETE "repos/$REPO/$TARGET/reactions/$REACTION_ID" --silent \ diff --git a/.github/workflows/tend-weekly.yaml b/.github/workflows/tend-weekly.yaml index 2eb75913..f0c95d2c 100644 --- a/.github/workflows/tend-weekly.yaml +++ b/.github/workflows/tend-weekly.yaml @@ -1,4 +1,4 @@ -# Generated by tend 0.1.17. Regenerate with: uvx tend@latest init +# Generated by tend 0.1.18. Regenerate with: uvx tend@latest init # # Do not edit this file directly — it will be overwritten on regeneration. # To customize behavior, edit the relevant skill (for example, @@ -32,7 +32,7 @@ jobs: fetch-tags: true token: ${{ secrets.TEND_BOT_TOKEN }} - - uses: max-sixty/tend/claude@0.1.17 + - uses: max-sixty/tend/claude@0.1.18 with: github_token: ${{ secrets.TEND_BOT_TOKEN }} claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}