Repository navigation
prow-github-actions 3.2.0
v3.2.0
Prow can now run as a GitHub App (beta) as well as a GitHub Action, and the action picks up
six weeks of features and fixes. Nothing changes for existing action installs: @v3 callers get
it automatically, @v3.0.1 pins move to @v3.2.0.
GitHub App (beta)
The same /commands, OWNERS, labelling and merging code receives webhooks instead of running in a
workflow: one install per organization, no workflow file, fork pull requests are first class, and
the App's writes trigger your workflows (GITHUB_TOKEN's do not). Deploy it as a container or on
Cloudflare Workers; scheduled jobs run for every installation; /label-sync stands in for the
Run workflow button. Details, permissions and limits: Running as a GitHub App.
Internally the handlers now reach the runtime through a Platform interface with a per-event
RunState, which the action adapter implements on @actions/core. The action's behaviour is
unchanged and its bundle is verified byte-equivalent by the end-to-end suite.
Features (action and App)
- GitHub teams in OWNERS —
approvers/reviewersmay list"@org/team"(docs). blunderbuss.delay— wait before requesting reviewers; request only if nobody has yet (docs).approve.github_review(opt in) — mirror theapprovedlabel as a GitHub review.authorizationpolicy (opt in) — who may run label, hold, close and review commands./label-sync— collaborators run the label-sync job from a comment. In the default command list.
Fixes
/meowmatches case-insensitively like every other command.- A 0-byte OWNERS file lists nobody; a comment-only
prow.yamlis an empty configuration. - A label command names the refused values instead of saying "command args missing".
- The
lgtmjob keeps evaluating the remaining pull requests when one evaluation fails. - A comment without a body carries no commands; a command on a payload without an issue or pull
number prints the payload, not[object Object].
Upgrading
Nothing to do for the action. To try the App, see docs/github-app.md and treat it
as beta: the deployment story is settling and feedback is welcome.
Verification
The SBOM, its cosign signature and the SLSA provenance are attached to this release; the commands
are under SBOM and provenance below.
Usage
- uses: cncf/prow-github-actions@v3.2.0SBOM and provenance
An SPDX 2.3 SBOM of the runtime dependencies, generated with
waybill, is attached as
prow-github-actions-3.2.0.spdx.json and signed with
cosign (keyless). SLSA build
provenance covering both dist/index.js and the SBOM is attached as
prow-github-actions-3.2.0.intoto.jsonl.
Verify the SBOM signature:
cosign verify-blob \
--bundle prow-github-actions-3.2.0.spdx.json.bundle \
--certificate-identity-regexp="https://github.com/cncf/prow-github-actions" \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
prow-github-actions-3.2.0.spdx.jsonVerify the provenance of the bundled action:
gh attestation verify dist/index.js --repo cncf/prow-github-actionsWhat's Changed
- test(pullReq): cover onPrLgtm error paths and the lgtm-job rejection handoff by @hivecommons-hive[bot] in #173
- test(issueComment): cover the error branches of assign, unassign, cc, uncc, reopen, close, retitle and lock by @hivecommons-hive[bot] in #175
- test(labels): cover the error branches of remove, hold, lgtm, fixed and prefixed label handlers by @hivecommons-hive[bot] in #177
- test(cronLgtm): cover the pulls.list failure, closed-PR skip and throwing-evaluation paths by @hivecommons-hive[bot] in #179
- test(utils): cover sleep with fake timers by @hivecommons-hive[bot] in #181
- test(issueComment): cover the error branches of the approve and milestone handlers by @hivecommons-hive[bot] in #183
- test(trigger): cover the edge and error branches of /retest, /test, /ok-to-test and okToTestOnPullRequest by @hivecommons-hive[bot] in #185
- test(tide): cover the fork-403 diagnosis failures, the refused explanatory comment and the head-moved skip in the merge-queue path by @hivecommons-hive[bot] in #187
- test(mergeQueue): cover queueState, enqueue, dequeue and enqueuedByBot directly by @hivecommons-hive[bot] in #190
- test(approve): cover the comment/review/notifier error throws, the no-base-ref OWNERS fallback and the notifier ordering by @hivecommons-hive[bot] in #192
- test(auth): cover the getErrorDetails fallback branches for string, empty-object and bare Error rejections by @hivecommons-hive[bot] in #194
- test(issueComment): cover the /check-required-labels sweep dedup and non-Error rejections in handleIssueComment by @hivecommons-hive[bot] in #196
- test(utils): cover the error and edge branches of labelMatch, labeling, comments and config by @hivecommons-hive[bot] in #198
- test(cronJobs): cover the labelSync list failure and the sweep non-Error and absent-field branches by @hivecommons-hive[bot] in #200
- test(plugins): cover the error and fallback branches of lgtmBinding, ownersLabel and requireMatchingLabel by @hivecommons-hive[bot] in #204
- test(meow): cover the missing-issue-number throw and the response-body cancel fallback by @hivecommons-hive[bot] in #206
- test: cover the error branches of run, config fetch paths, createCommentOnce and prefixed labels by @hivecommons-hive[bot] in #208
- test: cover the src/main.ts entry point by @hivecommons-hive[bot] in #212
- chore(coverage): raise vitest coverage thresholds to the current floor by @hivecommons-hive[bot] in #202
- chore(deps-dev): bump the dev-dependencies group across 1 directory with 5 updates by @dependabot[bot] in #188
- test: assert .github/prow.yaml parses and agrees with prow-bot.yml, the label catalogue and the issue templates by @hivecommons-hive[bot] in #256
- test: assert docs/commands.md rows match the handleIssueComment dispatcher and the prow.yml prow-commands default by @hivecommons-hive[bot] in #254
- test(bundle): drive /test and lgtm cancel (/lgtm cancel, /remove-lgtm) through dist/index.js by @hivecommons-hive[bot] in #240
- test(bundle): opt the node --check spawn out of NODE_V8_COVERAGE so the suite survives coverage.autoAttachSubprocess by @hivecommons-hive[bot] in #236
- test: assert the Node runtime major agrees across action.yml, package.json, README and setup-node by @hivecommons-hive[bot] in #234
- test: assert action.yml inputs match the core.getInput names read in src/ by @hivecommons-hive[bot] in #232
- test: cover the residual branch fallbacks of meow, trigger and tide by @hivecommons-hive[bot] in #225
- test: cover the non-Error rejection and empty-config fallbacks of labelSync, lgtm, mergeQueue and issueComment/approve by @hivecommons-hive[bot] in #223
- test(tide): cover evaluateMerge on a queue entry with no position, no entry and no enqueuer by @hivecommons-hive[bot] in #219
- test(auth): cover the rethrow catch blocks of checkCommenterAuth and getOrgCollabCommentUsers by @hivecommons-hive[bot] in #217
- test(bundle): assert dist/index.js requires only node built-ins and inlines every package src/ imports by @hivecommons-hive[bot] in #266
- test: assert docs/configuration.md defaults, field tables and probe order against config.ts and the plugin resolvers by @hivecommons-hive[bot] in #258
- test(bundle): drive /cc /uncc /unassign /retitle /lock /reopen through dist/index.js by @hivecommons-hive[bot] in #238
- test(config): cover the empty sweep mapping and non-Error lookback rethrow branches of normalizeSweep by @hivecommons-hive[bot] in #229
- fix: name the cron and pull request dispatchers in their failure messages by @jeefy in #271
- test: stop approve and lgtm suites leaking state between tests by @jeefy in #272
- test(bundle): share the config-probe, comment and request-sequence helpers across bundle suites by @jeefy in #273
- test: keep the msw server offline on msw 3 and settle the parallel config probe by @hivecommons-hive[bot] in #280
- chore(deps-dev): bump the dev-dependencies group with 3 updates by @dependabot[bot] in #277
- test(bundle): drive the merge queue's failed state read, refused enqueue and refused dequeue through dist/index.js by @hivecommons-hive[bot] in #270
- test(bundle): drive the status event's success path through dist/index.js as a row of the head-sha lookup case by @hivecommons-hive[bot] in #262
- test(bundle): drive ok-to-test on pull_request synchronize and in the sweep through dist/index.js by @hivecommons-hive[bot] in #260
- test(bundle): drive handleIssueComment's prow-commands input arms and per-command error isolation through dist/index.js by @hivecommons-hive[bot] in #252
- test(bundle): drive /assign with argument users and /milestone set-by-title through dist/index.js by @hivecommons-hive[bot] in #250
- test(bundle): drive the dry-run and config inputs of label-sync through dist/index.js by @hivecommons-hive[bot] in #248
- test: assert release.yml and pre-release.yml stay one pipeline and attach the artifacts docs/releasing.md lists by @hivecommons-hive[bot] in #268
- test(plugins): cover the non-Error rejection arm of the requireMatchingLabel error report by @hivecommons-hive[bot] in #227
- test(plugins): cover the /lgtm cancel and null-body notifier arms of approveOnPullRequest by @hivecommons-hive[bot] in #221
- test(coverage): add test:coverage:e2e to report the bundle suite's coverage of src/ by @hivecommons-hive[bot] in #274
- test(bundle): drive /approve cancel on a repository without OWNERS files through dist/index.js by @hivecommons-hive[bot] in #276
- chore(deps-dev): bump msw from 2.15.0 to 3.0.1 by @dependabot[bot] in #278
- chore(deps-dev): bump brace-expansion from 5.0.9 to 5.0.12 by @dependabot[bot] in #281
- feat(approve): opt-in
approve.github_reviewmirrorsapprovedas a GitHub review by @mfahlandt in #263 - test(meow): keep the unit /meow suite off the real network under msw 3 by @hivecommons-hive[bot] in #287
- test(bundle): drive blunderbuss's ready_for_review skip, /auto-cc-on-issue, uncovered-file, no-candidate and refused-request arms through dist/index.js by @hivecommons-hive[bot] in #353
- test(bundle): drive labelIssue's refused label write through dist/index.js by @hivecommons-hive[bot] in #337
- test(bundle): drive /assign's refused writes and empty authorized set through dist/index.js by @hivecommons-hive[bot] in #302
- test(bundle): drive removeFixedLabels' no-op and failed-labels-read arms through dist/index.js by @hivecommons-hive[bot] in #300
- test(bundle): drive the configured blunderbuss section through dist/index.js by @hivecommons-hive[bot] in #291
- test(bundle): drive the push event and a blank jobs input through the cron dispatcher in dist/index.js by @hivecommons-hive[bot] in #242
- test(bundle): drive /cc, /uncc, /lock and /unassign refused writes through dist/index.js by @hivecommons-hive[bot] in #308
- test(bundle): drive /meow through dist/index.js against a stubbed cat api by @hivecommons-hive[bot] in #244
- test(bundle): drive syncApprovalReview's not-open and nothing-to-dismiss short-circuits and withdrawalReason's no-files and lgtm-skip arms through dist/index.js by @hivecommons-hive[bot] in #363
- test(bundle): drive label-sync's custom-section, needs-* and dedup catalog arms through dist/index.js by @hivecommons-hive[bot] in #351
- test(bundle): drive require-matching-label's no-rule, already-correct, grace-period and comment-failure arms through dist/index.js by @hivecommons-hive[bot] in #316
- test(bundle): drive /remove-help, the built-in /lifecycle defaults and the no-config failure through dist/index.js by @hivecommons-hive[bot] in #246
- test(bundle): drive the https:// config source (config.ts fetchUrl) through dist/index.js by @hivecommons-hive[bot] in #359
- test(bundle): drive the approve.github_review refusals, short-circuits and failures through dist/index.js by @hivecommons-hive[bot] in #286
- test(bundle): drive the prefixed label commands' and /remove's failure arms through dist/index.js by @hivecommons-hive[bot] in #341
- test(bundle): drive the lgtm cron's listing-500, closed-pr and evaluation-throw arms through dist/index.js by @hivecommons-hive[bot] in #335
- chore(coverage): emit lcovonly and json-summary reporters from vitest.config.mjs by @hivecommons-hive[bot] in #230
- feat(auth): opt-in authorization policy for label, hold, close and review commands by @jeefy in #367
- fix: treat an issue comment without a body as having no commands by @jeefy in #374
- fix: print the payload, not [object Object], when a command has no issue or pull number by @jeefy in #373
- fix(lgtm): keep evaluating the remaining pull requests when one evaluation fails by @jeefy in #375
- fix(labels): say which values were refused instead of "command args missing" by @jeefy in #376
- chore(deps-dev): bump source-map-js from 1.2.1 to 1.2.2 by @dependabot[bot] in #370
- test(bundle): drive root-OWNERS authorization on an issue and the OWNERS-based /lgtm refusal through dist/index.js by @hivecommons-hive[bot] in #283
- test(bundle): drive the tide merge gate's missing_labels block and labelMatch wildcards through dist/index.js by @hivecommons-hive[bot] in #289
- test(bundle): drive the configured hold and sweep sections through dist/index.js by @hivecommons-hive[bot] in #293
- test(bundle): drive plain /close, its write failure and the /milestone refusals through dist/index.js by @hivecommons-hive[bot] in #296
- test(bundle): drive /retest's no-failed and already-re-running arms and /ok-to-test's author, already-trusted and approval-failure arms through dist/index.js by @hivecommons-hive[bot] in #304
- test(bundle): drive /reopen's and /retitle's collaborator-read 500 and refused-write arms through dist/index.js by @hivecommons-hive[bot] in #306
- test(bundle): drive handlePullReq's unsupported-job and failed-lgtm-read arms through dist/index.js by @hivecommons-hive[bot] in #310
- test(bundle): drive label-sync's refused-write and description-drift arms through dist/index.js by @hivecommons-hive[bot] in #312
- test(bundle): drive lgtmBinding's failure arms and /lgtm cancel's failed reads and writes through dist/index.js by @hivecommons-hive[bot] in #318
- test(bundle): drive owners.ts' truncated-tree probes and the base-branch OWNERS probe's arms through dist/index.js by @hivecommons-hive[bot] in #320
- test(bundle): drive tide's merge-queue skip and enqueue-refusal arms through dist/index.js by @hivecommons-hive[bot] in #322
- test(bundle): drive commandLines' fence-closer, indented-code and info-string guards through dist/index.js by @hivecommons-hive[bot] in #324
- test(bundle): drive /hold cancel's no-label, failed-read, failed-removal and already-gone arms through dist/index.js by @hivecommons-hive[bot] in #326
- test(bundle): drive pullRequestOwners' rename and base-tip-fallback arms and tide's fork 403 diagnosis arms through dist/index.js by @hivecommons-hive[bot] in #328
- test(bundle): drive the issue-side OWNERS fallback and the membership probes' 500 arms through dist/index.js by @hivecommons-hive[bot] in #331
- test(bundle): drive parseProwConfig's schema rejections through dist/index.js by @hivecommons-hive[bot] in #339
- test(bundle): drive the missing issue/pull number guards of every command handler and onPrLgtm through dist/index.js by @hivecommons-hive[bot] in #343
- test(bundle): drive /approve's membership-mode review failures and no-review cancel through dist/index.js by @hivecommons-hive[bot] in #355
- test(bundle): drive the prow-commands alias canonicalization and unsupported-command arms through dist/index.js by @hivecommons-hive[bot] in #357
- test(bundle): drive the OWNERS filters-ignored arm (owners.ts parseOwners) through dist/index.js by @hivecommons-hive[bot] in #365
- test(bundle): drive the repoHasOwners/defaultBranch fallback of approve and the tide gate through dist/index.js by @hivecommons-hive[bot] in #369
- test(bundle): drive the cron dispatcher's unknown-job arm through dist/index.js by @hivecommons-hive[bot] in #371
- test(bundle): drive /meow's parseCatImage refusals and dropped-connection retry through dist/index.js by @hivecommons-hive[bot] in #372
- test(bundle): drive the 'could not list the repository labels' arms of labelIssue and label-sync through dist/index.js by @hivecommons-hive[bot] in #388
- test(bundle): drive the plugin payload guards (requireMatchingLabel.ts:184, blunderbuss.ts:94, trigger.ts:188, tide.ts:489) through dist/index.js by @hivecommons-hive[bot] in #399
- chore(deps): move js-yaml to dependencies by @mrbobbytables in #411
- ci: run test.yml once per commit and keep a main baseline after bot merges by @mrbobbytables in #389
- fix(config): treat a comment-only prow.yaml as an empty configuration by @mrbobbytables in #415
- fix(owners): read a 0-byte OWNERS file as listing nobody by @mrbobbytables in #416
- test(bundle): drive the pull-request OWNERS fail-closed arm (auth.ts:426, no OWNERS file covers README.md) through dist/index.js by @hivecommons-hive[bot] in #401
- test(bundle): drive blunderbuss's assignee exclusion (pullRequestOwners.ts:96) through dist/index.js by @hivecommons-hive[bot] in #403
- test(bundle): drive parseOwners's content-shape arms (owners.ts:39/41/83) through dist/index.js by @hivecommons-hive[bot] in #406
- test(bundle): drive withdrawalReason's 'and N more' tail and no-withdrawer arm (approveReview.ts:105/120) through dist/index.js by @hivecommons-hive[bot] in #408
- test(bundle): drive the lgtm removal no-op arms (onPrLgtm.ts:33, labels/lgtm.ts:106) through dist/index.js by @hivecommons-hive[bot] in #410
- test(bundle): drive react()'s missing comment.id arm (trigger.ts:293) through dist/index.js by @hivecommons-hive[bot] in #413
- chore: remove unused getArgumentLabels and anyLabelMatches by @mrbobbytables in #421
- test(bundle): drive /test's empty-head none row (trigger.ts:286) and null-name run path fallback (trigger.ts:272) through dist/index.js by @hivecommons-hive[bot] in #418
- test(bundle): drive the prefixed label refusal's 'allowed: none' arm (prefixed.ts:251) through dist/index.js by @hivecommons-hive[bot] in #420
- ci: repack dist/ on dependabot branches without exposing a write token by @mrbobbytables in #390
- test(bundle): drive owners-label's early-return and failure arms through dist/index.js by @hivecommons-hive[bot] in #298
- test(bundle): drive the config input's explicit source and the loader's tier read failures through dist/index.js by @hivecommons-hive[bot] in #314
- test(bundle): drive the approve plugin's evaluation arms through dist/index.js by @hivecommons-hive[bot] in #333
- test(bundle): drive the sweep cron's empty-window, failed-listing and blunderbuss-freshness arms through dist/index.js by @hivecommons-hive[bot] in #345
- test(bundle): drive tide's verdict arms (unknown-retry exhaustion, moved head, 405/409 refusals, merged/closed/locked, check_suite guards, once-per-run) through dist/index.js by @hivecommons-hive[bot] in #347
- test(bundle): drive the authorization policy arms of auth.ts (members/collaborators/root-OWNERS admits, trusted refusal, config-load failures, empty login) through dist/index.js by @hivecommons-hive[bot] in #378
- test(bundle): drive the authorization section's schema rejections and the cross-tier users union through dist/index.js by @hivecommons-hive[bot] in #381
- test(bundle): drive loadOwnersTree's failure arms (owners.ts L164/L197/L229) through dist/index.js by @hivecommons-hive[bot] in #383
- test(bundle): drive the sweep cron's enqueued outcome (sweep.ts:75) through dist/index.js by @hivecommons-hive[bot] in #385
- test(bundle): drive parseProwConfig's empty-document arm (config.ts:373) through dist/index.js by @hivecommons-hive[bot] in #395
- test(bundle): drive meow.ts:28 (strict /meow re-check after the dispatcher's generic match) through dist/index.js by @hivecommons-hive[bot] in #397
- test(bundle): stop the acceptance harness from loading src/ into the vitest worker by @hivecommons-hive[bot] in #427
- test(coverage): give the e2e coverage bundle map columns so lines tsc flattens report their hits by @hivecommons-hive[bot] in #425
- test(bundle): drive loadExplicitConfig's not-found arm (config.ts:305) through dist/index.js by @hivecommons-hive[bot] in #423
- test(bundle): drive handleIssueComment's bodiless-comment fold (handleIssueComment.ts:117) through dist/index.js by @hivecommons-hive[bot] in #429
- test(bundle): drive recentlyUpdatedPulls' full-page paging arm (sweep.ts:179) through dist/index.js by @hivecommons-hive[bot] in #431
- test(bundle): drive getCurrentLabels' bare-string label arm (labeling.ts:148) through dist/index.js by @hivecommons-hive[bot] in #433
- test(bundle): drive labelSync's null label description arm (labelSync.ts:133) through dist/index.js by @hivecommons-hive[bot] in #435
- test(bundle): drive run()'s last-resort catch (run.ts:40) through dist/index.js by @hivecommons-hive[bot] in #437
- test(bundle): drive pullRequestOwners.load's null-field folds (pullRequestOwners.ts:92-97) through dist/index.js by @hivecommons-hive[bot] in #439
- test(bundle): drive the sweep's alreadyChecked skip (handleIssueComment.ts:164,180) through dist/index.js by @hivecommons-hive[bot] in #445
- test(bundle): drive checkOrgMember's missing payload.repository guard (auth.ts:43-45) through dist/index.js by @hivecommons-hive[bot] in #447
- test(bundle): drive labelCatalog.ts:80 (the /label allowlist's empty prefix) through dist/index.js by @hivecommons-hive[bot] in #448
- chore(deps-dev): bump the dev-dependencies group with 3 updates by @dependabot[bot] in #441
- chore(deps): bump actions/setup-node from 7.0.0 to 7.1.0 by @dependabot[bot] in #442
- chore(deps): bump actions/upload-artifact from 7.0.1 to 7.0.2 by @dependabot[bot] in #443
- refactor(auth): drop the 14 unreachable commenter-auth catch wrappers by @mrbobbytables in #449
- refactor(pullReq): drop the unreachable 'None found' setFailed arm in handlePullReq by @hivecommons-hive[bot] in #451
- chore(deps): bump js-yaml from 5.4.2 to 5.4.3 in the production-dependencies group by @dependabot[bot] in #440
- fix(meow): match /meow case-insensitively like every other command by @jeefy in #453
- test(bundle): drive /uncc's non-collaborator self arm (uncc.ts:79) and /milestone's empty listing (milestone.ts:66) through dist/index.js by @hivecommons-hive[bot] in #455
- test(bundle): drive meow.ts:112 (cancelResponseBody's rejected cancel) through dist/index.js by @hivecommons-hive[bot] in #457
- test(bundle): drive selfAssign's unauthorized no-op arm (assign.ts:100) by @hivecommons-hive[bot] in #460
- test(bundle): drive queueState's once-per-run warning suppression (mergeQueue.ts:87) through dist/index.js by @hivecommons-hive[bot] in #461
- chore(e2e-coverage): give the bundle coverage run its own coverage-e2e/ report directory by @hivecommons-hive[bot] in #463
- test(bundle): drive /lgtm on a PR by a reviewer the covering OWNERS file lists (auth.ts:397 success arm) by @hivecommons-hive[bot] in #464
- refactor: drop defensive arms unreachable from dist/index.js by @mrbobbytables in #462
- test(bundle): drive the merge-queue null answers (no entry, no enqueuer, errors: []) through dist/index.js by @hivecommons-hive[bot] in #471
- test(bundle): drive rootOwnersIncludes' approvers arm and the trusted-policy refusal after an OWNERS read (auth.ts:423) through dist/index.js by @hivecommons-hive[bot] in #474
- test(bundle): drive organization-only authorization.users (config.ts:751 over.users ?? [] arm) through dist/index.js by @hivecommons-hive[bot] in #475
- test(bundle): drive fileList's
and N moretruncation (tide.ts:291) through dist/index.js by @hivecommons-hive[bot] in #476 - test(bundle): drive isTrustedImageSource's s3 bucket arm (meow.ts:156-157) through dist/index.js by @hivecommons-hive[bot] in #477
- test(bundle): drive checkIssueComments' non-matching comment arm (auth.ts:129) through dist/index.js by @hivecommons-hive[bot] in #478
- test(bundle): drive require-matching-label's no-applicable-rule arm for pull requests (requireMatchingLabel.ts:149) through dist/index.js by @hivecommons-hive[bot] in #479
- test(bundle): drive fetchMergeability's known-on-last-retry arm (tide.ts:108) through dist/index.js by @hivecommons-hive[bot] in #480
- test(bundle): drive the sweep section's default and 24h-capped lookback (config.ts:646) through dist/index.js by @hivecommons-hive[bot] in #481
- test(bundle): drive the sweep's shared identity and base-tip memos (approveReview.ts:33, pullRequestOwners.ts:109) through dist/index.js by @hivecommons-hive[bot] in #482
- test(bundle): drive isOwnReview's user-token arm through dist/index.js (approveReview.ts:63) by @hivecommons-hive[bot] in #467
- test(bundle): drive approve.ignore_review_state through dist/index.js (approve.ts:380-381) by @hivecommons-hive[bot] in #468
- test(bundle): drive approvalEvents' COMMENTED/DISMISSED review arm through dist/index.js (approve.ts:125) by @hivecommons-hive[bot] in #469
- test(bundle): drive canonicalCommand's dynamic remove-form arm (handleIssueComment.ts:91) through dist/index.js by @hivecommons-hive[bot] in #470
- test(bundle): drive suggestApprovers' second greedy round (approve.ts:260) through dist/index.js by @hivecommons-hive[bot] in #472
- test(bundle): drive loadTide's configured tide.labels arm (tide.ts:542) through dist/index.js by @hivecommons-hive[bot] in #473
- chore(prow): add kind/feature label by @mrbobbytables in #487
- feat(owners): support GitHub groups in OWNERS by @mrbobbytables in #486
- ci(test): run the bundle e2e coverage suite in its own job by @mrbobbytables in #488
- chore(coverage): v8-ignore the six reset*() isolation hooks so coverage-e2e names only bundle-reachable code by @hivecommons-hive[bot] in #483
- chore(coverage): give the bundle e2e coverage run a regression floor (99/95/98/99) instead of zeroed thresholds by @hivecommons-hive[bot] in #484
- ci(test): drop the Dependabot dist/ repack jobs by @jeefy in #489
- test(bundle): drop three bundle cases that add no coverage or guard by @jeefy in #490
- test(bundle): fold the sweep memo case into sweepArms, drop the root OWNERS approver case by @jeefy in #491
- test(bundle): drive the remaining unit-only arms in sweep, trigger and lgtmBinding through dist/index.js by @mrbobbytables in #496
- refactor(tide): require fetchMergeability's initial read, drop the unreachable getPull fallback by @hivecommons-hive[bot] in #492
- chore(deps-dev): bump the dev-dependencies group with 4 updates by @dependabot[bot] in #503
- chore(coverage): raise the unit coverage floor to 99/99/99/99 and fix the documented values by @hivecommons-hive[bot] in #500
- chore(coverage): raise the e2e coverage floor to 99/97/99/99 to match what main reaches by @hivecommons-hive[bot] in #502
- refactor(approve, meow): drop the three dead arms left open on #466 by @hivecommons-hive[bot] in #497
- test(docs): parse every prow.yaml and OWNERS example in the guides against the config and OWNERS parsers by @hivecommons-hive[bot] in #501
- test(bundle): serve comment.body and label.name absent to drive the '?? ""' folds through dist/index.js by @hivecommons-hive[bot] in #508
- test(bundle): drive /close, /reopen and /approve on an issue whose user is null through dist/index.js by @hivecommons-hive[bot] in #505
- test(bundle): drive tide's draft/files folds and sweep's labels fold through dist/index.js by @hivecommons-hive[bot] in #498
- test(bundle): drive newOctokit's api.github.com fallback through dist/index.js with an empty GITHUB_API_URL by @hivecommons-hive[bot] in #504
- test(bundle): serve a bodyless comment to approvalEvents through dist/index.js by @hivecommons-hive[bot] in #509
- chore(deps-dev): bump vite from 8.3.1 to 8.3.4 by @dependabot[bot] in #546
- test(remove): assert every DELETE the /remove happy paths issue; enable test/expect-expect by @hivecommons-hive[bot] in #512
- test(utils): pin matchesLabelPattern's suffix/overlap arm and commandLines' fence-close boundary by @hivecommons-hive[bot] in #514
- test(tide): pin the merge_queue:off no-GraphQL rule, the draft-without-field refusal, and the fork-403 path boundaries by @hivecommons-hive[bot] in #518
- test(approve): pin the any-Bot comment and user-token review skips, the require_self_approval continue, approver ordering, label casing and isBot's notifier match by @hivecommons-hive[bot] in #522
- test(approveReview): pin the user-token-not-author submit, withdrawalReason's five-file bound, lgtm skip, user casing and withdrawer order by @hivecommons-hive[bot] in #527
- test(assign,cc): pin that /assign and /cc write only the authorized subset of a mixed argument list by @hivecommons-hive[bot] in #545
- test(sweep): pin blunderbuss ignore_authors on the sweep and the since-window edge by @hivecommons-hive[bot] in #516
- test(require-matching-label): pin the withGracePeriod default, the graceMs > 0 guard, isBot's || and the no-rule debug text by @hivecommons-hive[bot] in #520
- test(trigger): pin /test's case-insensitive name and path match, the OK-To-Test label already present, and the green non-PR arm of /test and /ok-to-test by @hivecommons-hive[bot] in #524
- test(mergeQueue): pin each classify alternative and enqueuedByBot's ^ anchor individually by @hivecommons-hive[bot] in #529
- test(owners): pin parseGroup's segment limit, loadOwnersTree's OWNERS-directory and encoding-less blob arms, probeOwners' empty hasOwners and the empty default_branch fallback by @hivecommons-hive[bot] in #525
- test(pullRequestOwners): omit draft/state/labels for real, pin the rename dedupe and the repository-keyed pull and tip memos by @hivecommons-hive[bot] in #533
- test(config): pin org-tier lgtm/sweep survival in mergeProwConfig, object values without color, values without exclusive, and the no-unknown-keys debug silence by @hivecommons-hive[bot] in #535
- test(bundle): cover non-Error rejection paths including auth by @hivecommons-hive[bot] in #528
- test(label-sync): pin the case-insensitive name and color folds, the null-description fold, the dry-run counts and per_page by @hivecommons-hive[bot] in #531
- test(prefixed): pin /stage and /status exclusive replacement, two-value /remove-lifecycle, mixed-case allowlist values and the first protected offender by @hivecommons-hive[bot] in #539
- test(lgtmBinding): pin hasLgtmLabel's .some and case fold, unbindLgtm's pending body and 140-char bound, and isLgtmBound's per_page=100 by @hivecommons-hive[bot] in #540
- test(hold): pin cancelHold's case fold on the issue's labels and on hold.label (Hold, DO-NOT-MERGE/HOLD) by @hivecommons-hive[bot] in #541
- test(utils): pin parseDuration's whitespace trim and millisecond rounding, and desiredLabels' case-insensitive needs- color by @hivecommons-hive[bot] in #542
- test(labeling): pin removeLabels continuing past an already-gone label and stopping at a real failure by @hivecommons-hive[bot] in #543
- test(errorPaths): pin the GitHub refusal in every wrapped issue-comment failure by @hivecommons-hive[bot] in #547
- docs(contributing): record the four negative-count BRDA branches as a v8 await artifact, not a gap by @hivecommons-hive[bot] in #511
- test(bundle): drive the non-Error String(e) arms of tide, mergeQueue, sweep, trigger and approveReview through dist/index.js by @hivecommons-hive[bot] in #548
- chore(coverage): v8-ignore lgtm.ts's unreachable String(e) arm after bindLgtm (bindLgtm only ever throws Error) by @hivecommons-hive[bot] in #537
- chore(coverage): v8-ignore the bundle-unreachable fallback arms in run.ts:40, command.ts:23 and config.ts:657 by @hivecommons-hive[bot] in #544
- chore(coverage): v8-ignore requireMatchingLabel's bundle-unreachable non-Error arm at the rule loop's catch by @hivecommons-hive[bot] in #549
- Add optional delay for blunderbuss by @katcosgrove in #530
- docs(coverage): link upstream negative-count branch report by @mrbobbytables in #552
- chore(deps-dev): bump the dev-dependencies group with 3 updates by @dependabot[bot] in #577
- chore(deps): bump js-yaml from 5.4.3 to 5.5.0 in the production-dependencies group by @dependabot[bot] in #576
- chore(coverage): raise the e2e branch floor to 98 after the pending coverage work landed by @hivecommons-hive[bot] in #556
- test(tide): pin the lgtm gate re-check after an unknown-mergeability retry (evaluateMerge, tide.ts:198-206) by @hivecommons-hive[bot] in #557
- test(mutation): add a bounded Stryker harness for the merge-decision code by @hivecommons-hive[bot] in #572
- test(config): pin normalizeBlunderbuss' non-Error parseDuration arm and v8-ignore it for the bundle by @hivecommons-hive[bot] in #563
- test(bundle): record the fake GitHub API's unmatched requests and assert on them outside the application by @hivecommons-hive[bot] in #569
- test(harness): fail a unit test on any msw request no handler served; serve the merge-queue state and base-branch tip the exposed tests were falling back from by @hivecommons-hive[bot] in #571
- chore(coverage): v8-ignore getErrorDetails' bundle-unreachable object folds by @mrbobbytables in #587
- test: pin the Stryker survivors of nine modules (consolidates #573, #575, #578-#583, #585) by @mrbobbytables in #588
- test: pin the delayed-blunderbuss and paginated-OWNERS contracts (consolidates #555, #558, #559, #561, #562, #564-#567) by @mrbobbytables in #589
- chore(deps): bump undici from 6.28.1 to 6.29.1 by @dependabot[bot] in #586
- refactor: route the handlers through a Platform seam (GitHub Actions remains the only adapter) by @jeefy in #606
- refactor: per-event RunState on the platform; scope platform() per run by @jeefy in #607
- feat: run as a GitHub App — webhook adapter and Node server (beta) by @jeefy in #608
- feat(app): scheduled jobs for every installation; /label-sync command by @jeefy in #614
- feat(app): run on Cloudflare Workers; Platform.defer() for the grace period by @jeefy in #615
- test(plugins): pin blunderbuss' file-count tier preference, requireMatchingLabel's unlabeled arm and withdrawalReason's event ordering by @hivecommons-hive[bot] in #591
- test(sweep,meow,command,approve): pin the delayed-reviewer guards, image validation edges, tilde-fence opener and /approve cancel's review author by @hivecommons-hive[bot] in #593
- test(prefixed,tide): pin a do-not-merge label section's own command past the /label protected guard, and the position-less enqueued verdict by @hivecommons-hive[bot] in #597
- test(adapters/app): pin receiveWebhook's refusal texts and header guard, dedupe's capacity boundary and settings' unset-input omission (webhook.ts:35-56, dedupe.ts:15, settings.ts:37) by @hivecommons-hive[bot] in #612
- test(bundle): drive decodeContent's non-base64 refusal through dist/index.js by @hivecommons-hive[bot] in #613
- test(platform): pin platform()'s no-platform throw and installed-scope fall-back (src/platform/index.ts:49,51) by @hivecommons-hive[bot] in #609
- test(coverage): guard the v8-ignore hints in src/ so each ignored arm keeps the unit test it names by @hivecommons-hive[bot] in #601
- test(sweep): drive the delayed-reviewer pass's failure arm end-to-end and raise the e2e branch floor to 99 by @hivecommons-hive[bot] in #596
- test(runtime): pin CI's Node major to action.yml's node24 via package.json devEngines.runtime by @hivecommons-hive[bot] in #603
- test(config): pin the type-guard, 24h-bound and fetch-timeout survivors and fail toThrow on a nullish throw by @hivecommons-hive[bot] in #595
- test(adapters/app): expect the jobs default next to an empty dry-run by @jeefy in #616
- test(harness): silence the :: runner-command output of the unit suite's call-through @actions/core spies by @hivecommons-hive[bot] in #605
- test(harness): make the unit suite order-independent under vitest --sequence.shuffle (fixtures, config-probe chains, module memos) by @hivecommons-hive[bot] in #598
- test(typecheck): type-check tests/ with tsc -p tsconfig.test.json and fix the 29 errors it finds by @hivecommons-hive[bot] in #599
- chore: pin npm to the public registry in a project .npmrc by @jeefy in #618
- test(server,app): execute src/server's entry point and bundle, pin #614's cron arms, and gate src/adapters/app/** + src/server/** at 100% (main.ts, node.ts:24/67/82, webhook.ts:65, cron.ts:85, vitest.config.mjs) by @hivecommons-hive[bot] in #611
- chore: release v3.2.0 by @jeefy in #619
New Contributors
- @hivecommons-hive[bot] made their first contribution in #173
- @mrbobbytables made their first contribution in #411
- @katcosgrove made their first contribution in #530
Full Changelog: v3.0.1...v3.2.0