diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index 4394ad9947c..00000000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,155 +0,0 @@ -name: Stale - -on: - schedule: - - cron: "17 3 * * *" - workflow_dispatch: - -permissions: {} - -jobs: - stale: - permissions: - issues: write - pull-requests: write - runs-on: blacksmith-16vcpu-ubuntu-2404 - steps: - - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 - id: app-token - continue-on-error: true - with: - app-id: "2729701" - private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} - - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 - id: app-token-fallback - if: steps.app-token.outcome == 'failure' - with: - app-id: "2971289" - private-key: ${{ secrets.GH_APP_PRIVATE_KEY_FALLBACK }} - - name: Mark stale issues and pull requests - uses: actions/stale@v9 - with: - repo-token: ${{ steps.app-token.outputs.token || steps.app-token-fallback.outputs.token }} - days-before-issue-stale: 7 - days-before-issue-close: 5 - days-before-pr-stale: 5 - days-before-pr-close: 3 - stale-issue-label: stale - stale-pr-label: stale - exempt-issue-labels: enhancement,maintainer,pinned,security,no-stale - exempt-pr-labels: maintainer,no-stale - operations-per-run: 10000 - exempt-all-assignees: true - remove-stale-when-updated: true - stale-issue-message: | - This issue has been automatically marked as stale due to inactivity. - Please add updates or it will be closed. - stale-pr-message: | - This pull request has been automatically marked as stale due to inactivity. - Please add updates or it will be closed. - close-issue-message: | - Closing due to inactivity. - If this is still an issue, please retry on the latest OpenClaw release and share updated details. - If you are absolutely sure it still happens on the latest release, open a new issue with fresh repro steps. - close-issue-reason: not_planned - close-pr-message: | - Closing due to inactivity. - If you believe this PR should be revived, post in #pr-thunderdome-dangerzone on Discord to talk to a maintainer. - That channel is the escape hatch for high-quality PRs that get auto-closed. - - lock-closed-issues: - permissions: - issues: write - runs-on: blacksmith-16vcpu-ubuntu-2404 - steps: - - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 - id: app-token - with: - app-id: "2729701" - private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} - - name: Lock closed issues after 48h of no comments - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 - with: - github-token: ${{ steps.app-token.outputs.token }} - script: | - const lockAfterHours = 48; - const lockAfterMs = lockAfterHours * 60 * 60 * 1000; - const perPage = 100; - const cutoffMs = Date.now() - lockAfterMs; - const { owner, repo } = context.repo; - - let locked = 0; - let inspected = 0; - - let page = 1; - while (true) { - const { data: issues } = await github.rest.issues.listForRepo({ - owner, - repo, - state: "closed", - sort: "updated", - direction: "desc", - per_page: perPage, - page, - }); - - if (issues.length === 0) { - break; - } - - for (const issue of issues) { - if (issue.pull_request) { - continue; - } - if (issue.locked) { - continue; - } - if (!issue.closed_at) { - continue; - } - - inspected += 1; - const closedAtMs = Date.parse(issue.closed_at); - if (!Number.isFinite(closedAtMs)) { - continue; - } - if (closedAtMs > cutoffMs) { - continue; - } - - let lastCommentMs = 0; - if (issue.comments > 0) { - const { data: comments } = await github.rest.issues.listComments({ - owner, - repo, - issue_number: issue.number, - per_page: 1, - page: 1, - sort: "created", - direction: "desc", - }); - - if (comments.length > 0) { - lastCommentMs = Date.parse(comments[0].created_at); - } - } - - const lastActivityMs = Math.max(closedAtMs, lastCommentMs || 0); - if (lastActivityMs > cutoffMs) { - continue; - } - - await github.rest.issues.lock({ - owner, - repo, - issue_number: issue.number, - lock_reason: "resolved", - }); - - locked += 1; - } - - page += 1; - } - - core.info(`Inspected ${inspected} closed issues; locked ${locked}.`);