From 7fec36c2289ebf53455660a30ae8e329575adc32 Mon Sep 17 00:00:00 2001 From: stain lu <109842185+stainlu@users.noreply.github.com> Date: Thu, 7 May 2026 06:49:17 +0800 Subject: [PATCH] fix: sort recent closures before dashboard limit Sort archived closed records by close timestamp before applying the dashboard limit, and add CI coverage for the dashboard scripts.\n\nThanks @stainlu. --- .github/workflows/ci.yml | 36 +++++++++++++++++++++ scripts/sweep-dashboard.mjs | 5 ++- test/sweep-dashboard.test.mjs | 59 +++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci.yml create mode 100644 test/sweep-dashboard.test.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..38873361fe --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: 24 + + - name: Enable pnpm + run: corepack enable + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Check + run: pnpm run check diff --git a/scripts/sweep-dashboard.mjs b/scripts/sweep-dashboard.mjs index a29405d997..a777bf9df6 100644 --- a/scripts/sweep-dashboard.mjs +++ b/scripts/sweep-dashboard.mjs @@ -161,7 +161,10 @@ function sweepSnapshot(root, profile) { .filter((item) => item.reviewedAt) .sort((a, b) => Date.parse(b.reviewedAt) - Date.parse(a.reviewedAt)) .slice(0, 15), - closed: closedItems.filter((item) => item.closedAt).slice(0, 15), + closed: closedItems + .filter((item) => item.closedAt) + .sort((a, b) => Date.parse(b.closedAt) - Date.parse(a.closedAt)) + .slice(0, 15), work, }; } diff --git a/test/sweep-dashboard.test.mjs b/test/sweep-dashboard.test.mjs new file mode 100644 index 0000000000..e103a083ff --- /dev/null +++ b/test/sweep-dashboard.test.mjs @@ -0,0 +1,59 @@ +import assert from "node:assert/strict"; +import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { renderSweepDashboard } from "../scripts/sweep-dashboard.mjs"; + +test("recently closed records are sorted before limiting", () => { + const root = mkdtempSync(path.join(tmpdir(), "clawsweeper-state-test-")); + try { + const closedDir = path.join(root, "records", "openclaw-openclaw", "closed"); + mkdirSync(closedDir, { recursive: true }); + + for (let index = 0; index < 15; index += 1) { + writeClosedRecord({ + dir: closedDir, + number: 100 + index, + title: `Older close ${index}`, + appliedAt: `2026-05-01T00:${String(index).padStart(2, "0")}:00.000Z`, + }); + } + writeClosedRecord({ + dir: closedDir, + number: 999, + title: "Newest close", + appliedAt: "2026-05-02T00:00:00.000Z", + }); + + const dashboard = renderSweepDashboard(root); + + assert.match( + dashboard, + /\[#999\]\(https:\/\/github\.com\/openclaw\/openclaw\/pull\/999\)/, + ); + } finally { + rmSync(root, { force: true, recursive: true }); + } +}); + +function writeClosedRecord({ dir, number, title, appliedAt }) { + writeFileSync( + path.join(dir, `${number}.md`), + `--- +number: ${number} +repository: openclaw/openclaw +type: pull_request +title: ${JSON.stringify(title)} +url: https://github.com/openclaw/openclaw/pull/${number} +applied_at: ${appliedAt} +decision: close +action_taken: closed +close_reason: implemented_on_main +--- + +# ${title} +`, + "utf8", + ); +}