pr-merge-queue 0.0.0-stage → 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +125 -2
- package/dist/claim-pr/claim-pr.d.mts +45 -0
- package/dist/claim-pr/claim-pr.d.mts.map +1 -0
- package/dist/claim-pr/claim-pr.mjs +217 -0
- package/dist/claim-pr/claim-pr.mjs.map +1 -0
- package/dist/claim-pr/index.d.mts +2 -0
- package/dist/claim-pr/index.d.mts.map +1 -0
- package/dist/claim-pr/index.mjs +2 -0
- package/dist/claim-pr/index.mjs.map +1 -0
- package/dist/cmd/claim-pr.d.mts +3 -0
- package/dist/cmd/claim-pr.d.mts.map +1 -0
- package/dist/cmd/claim-pr.mjs +20 -0
- package/dist/cmd/claim-pr.mjs.map +1 -0
- package/dist/cmd/open-pr.d.mts +3 -0
- package/dist/cmd/open-pr.d.mts.map +1 -0
- package/dist/cmd/open-pr.mjs +20 -0
- package/dist/cmd/open-pr.mjs.map +1 -0
- package/dist/cmd/pr-report.d.mts +3 -0
- package/dist/cmd/pr-report.d.mts.map +1 -0
- package/dist/cmd/pr-report.mjs +20 -0
- package/dist/cmd/pr-report.mjs.map +1 -0
- package/dist/cmd/push-fixed-pr.d.mts +3 -0
- package/dist/cmd/push-fixed-pr.d.mts.map +1 -0
- package/dist/cmd/push-fixed-pr.mjs +20 -0
- package/dist/cmd/push-fixed-pr.mjs.map +1 -0
- package/dist/cmd/report-unowned-prs.d.mts +3 -0
- package/dist/cmd/report-unowned-prs.d.mts.map +1 -0
- package/dist/cmd/report-unowned-prs.mjs +20 -0
- package/dist/cmd/report-unowned-prs.mjs.map +1 -0
- package/dist/cmd/unblock-prs.d.mts +3 -0
- package/dist/cmd/unblock-prs.d.mts.map +1 -0
- package/dist/cmd/unblock-prs.mjs +19 -0
- package/dist/cmd/unblock-prs.mjs.map +1 -0
- package/dist/entry-point.d.mts +3 -0
- package/dist/entry-point.d.mts.map +1 -0
- package/dist/entry-point.mjs +3 -0
- package/dist/entry-point.mjs.map +1 -0
- package/dist/lib/cli-args.d.mts +27 -0
- package/dist/lib/cli-args.d.mts.map +1 -0
- package/dist/lib/cli-args.mjs +55 -0
- package/dist/lib/cli-args.mjs.map +1 -0
- package/dist/lib/github-api.d.mts +153 -0
- package/dist/lib/github-api.d.mts.map +1 -0
- package/dist/lib/github-api.mjs +291 -0
- package/dist/lib/github-api.mjs.map +1 -0
- package/dist/lib/index.d.mts +7 -0
- package/dist/lib/index.d.mts.map +1 -0
- package/dist/lib/index.mjs +7 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/json.d.mts +12 -0
- package/dist/lib/json.d.mts.map +1 -0
- package/dist/lib/json.mjs +28 -0
- package/dist/lib/json.mjs.map +1 -0
- package/dist/lib/log.d.mts +10 -0
- package/dist/lib/log.d.mts.map +1 -0
- package/dist/lib/log.mjs +13 -0
- package/dist/lib/log.mjs.map +1 -0
- package/dist/lib/shell.d.mts +18 -0
- package/dist/lib/shell.d.mts.map +1 -0
- package/dist/lib/shell.mjs +42 -0
- package/dist/lib/shell.mjs.map +1 -0
- package/dist/lib/time.d.mts +17 -0
- package/dist/lib/time.d.mts.map +1 -0
- package/dist/lib/time.mjs +35 -0
- package/dist/lib/time.mjs.map +1 -0
- package/dist/open-pr/github.d.mts +72 -0
- package/dist/open-pr/github.d.mts.map +1 -0
- package/dist/open-pr/github.mjs +249 -0
- package/dist/open-pr/github.mjs.map +1 -0
- package/dist/open-pr/index.d.mts +6 -0
- package/dist/open-pr/index.d.mts.map +1 -0
- package/dist/open-pr/index.mjs +6 -0
- package/dist/open-pr/index.mjs.map +1 -0
- package/dist/open-pr/main.d.mts +36 -0
- package/dist/open-pr/main.d.mts.map +1 -0
- package/dist/open-pr/main.mjs +204 -0
- package/dist/open-pr/main.mjs.map +1 -0
- package/dist/open-pr/options.d.mts +20 -0
- package/dist/open-pr/options.d.mts.map +1 -0
- package/dist/open-pr/options.mjs +66 -0
- package/dist/open-pr/options.mjs.map +1 -0
- package/dist/open-pr/steps.d.mts +23 -0
- package/dist/open-pr/steps.d.mts.map +1 -0
- package/dist/open-pr/steps.mjs +38 -0
- package/dist/open-pr/steps.mjs.map +1 -0
- package/dist/open-pr/types.d.mts +179 -0
- package/dist/open-pr/types.d.mts.map +1 -0
- package/dist/open-pr/types.mjs +20 -0
- package/dist/open-pr/types.mjs.map +1 -0
- package/dist/pr-report/github.d.mts +59 -0
- package/dist/pr-report/github.d.mts.map +1 -0
- package/dist/pr-report/github.mjs +561 -0
- package/dist/pr-report/github.mjs.map +1 -0
- package/dist/pr-report/index.d.mts +8 -0
- package/dist/pr-report/index.d.mts.map +1 -0
- package/dist/pr-report/index.mjs +8 -0
- package/dist/pr-report/index.mjs.map +1 -0
- package/dist/pr-report/linked-issues.d.mts +15 -0
- package/dist/pr-report/linked-issues.d.mts.map +1 -0
- package/dist/pr-report/linked-issues.mjs +39 -0
- package/dist/pr-report/linked-issues.mjs.map +1 -0
- package/dist/pr-report/main.d.mts +42 -0
- package/dist/pr-report/main.d.mts.map +1 -0
- package/dist/pr-report/main.mjs +163 -0
- package/dist/pr-report/main.mjs.map +1 -0
- package/dist/pr-report/options.d.mts +36 -0
- package/dist/pr-report/options.d.mts.map +1 -0
- package/dist/pr-report/options.mjs +90 -0
- package/dist/pr-report/options.mjs.map +1 -0
- package/dist/pr-report/queue.d.mts +28 -0
- package/dist/pr-report/queue.d.mts.map +1 -0
- package/dist/pr-report/queue.mjs +74 -0
- package/dist/pr-report/queue.mjs.map +1 -0
- package/dist/pr-report/render.d.mts +14 -0
- package/dist/pr-report/render.d.mts.map +1 -0
- package/dist/pr-report/render.mjs +318 -0
- package/dist/pr-report/render.mjs.map +1 -0
- package/dist/pr-report/repo-settings.d.mts +12 -0
- package/dist/pr-report/repo-settings.d.mts.map +1 -0
- package/dist/pr-report/repo-settings.mjs +22 -0
- package/dist/pr-report/repo-settings.mjs.map +1 -0
- package/dist/push-fixed-pr/index.d.mts +2 -0
- package/dist/push-fixed-pr/index.d.mts.map +1 -0
- package/dist/push-fixed-pr/index.mjs +2 -0
- package/dist/push-fixed-pr/index.mjs.map +1 -0
- package/dist/push-fixed-pr/push-fixed-pr.d.mts +54 -0
- package/dist/push-fixed-pr/push-fixed-pr.d.mts.map +1 -0
- package/dist/push-fixed-pr/push-fixed-pr.mjs +172 -0
- package/dist/push-fixed-pr/push-fixed-pr.mjs.map +1 -0
- package/dist/report-unowned-prs/index.d.mts +2 -0
- package/dist/report-unowned-prs/index.d.mts.map +1 -0
- package/dist/report-unowned-prs/index.mjs +2 -0
- package/dist/report-unowned-prs/index.mjs.map +1 -0
- package/dist/report-unowned-prs/report-unowned-prs.d.mts +49 -0
- package/dist/report-unowned-prs/report-unowned-prs.d.mts.map +1 -0
- package/dist/report-unowned-prs/report-unowned-prs.mjs +127 -0
- package/dist/report-unowned-prs/report-unowned-prs.mjs.map +1 -0
- package/dist/tsconfig.json +1 -0
- package/dist/unblock-prs/auto-fix.d.mts +45 -0
- package/dist/unblock-prs/auto-fix.d.mts.map +1 -0
- package/dist/unblock-prs/auto-fix.mjs +207 -0
- package/dist/unblock-prs/auto-fix.mjs.map +1 -0
- package/dist/unblock-prs/checks.d.mts +307 -0
- package/dist/unblock-prs/checks.d.mts.map +1 -0
- package/dist/unblock-prs/checks.mjs +372 -0
- package/dist/unblock-prs/checks.mjs.map +1 -0
- package/dist/unblock-prs/claims.d.mts +21 -0
- package/dist/unblock-prs/claims.d.mts.map +1 -0
- package/dist/unblock-prs/claims.mjs +23 -0
- package/dist/unblock-prs/claims.mjs.map +1 -0
- package/dist/unblock-prs/config.d.mts +487 -0
- package/dist/unblock-prs/config.d.mts.map +1 -0
- package/dist/unblock-prs/config.mjs +119 -0
- package/dist/unblock-prs/config.mjs.map +1 -0
- package/dist/unblock-prs/constants.d.mts +28 -0
- package/dist/unblock-prs/constants.d.mts.map +1 -0
- package/dist/unblock-prs/constants.mjs +28 -0
- package/dist/unblock-prs/constants.mjs.map +1 -0
- package/dist/unblock-prs/demotions.d.mts +42 -0
- package/dist/unblock-prs/demotions.d.mts.map +1 -0
- package/dist/unblock-prs/demotions.mjs +50 -0
- package/dist/unblock-prs/demotions.mjs.map +1 -0
- package/dist/unblock-prs/github.d.mts +739 -0
- package/dist/unblock-prs/github.d.mts.map +1 -0
- package/dist/unblock-prs/github.mjs +626 -0
- package/dist/unblock-prs/github.mjs.map +1 -0
- package/dist/unblock-prs/index.d.mts +25 -0
- package/dist/unblock-prs/index.d.mts.map +1 -0
- package/dist/unblock-prs/index.mjs +25 -0
- package/dist/unblock-prs/index.mjs.map +1 -0
- package/dist/unblock-prs/labels.d.mts +49 -0
- package/dist/unblock-prs/labels.d.mts.map +1 -0
- package/dist/unblock-prs/labels.mjs +49 -0
- package/dist/unblock-prs/labels.mjs.map +1 -0
- package/dist/unblock-prs/main.d.mts +179 -0
- package/dist/unblock-prs/main.d.mts.map +1 -0
- package/dist/unblock-prs/main.mjs +640 -0
- package/dist/unblock-prs/main.mjs.map +1 -0
- package/dist/unblock-prs/merge-after.d.mts +46 -0
- package/dist/unblock-prs/merge-after.d.mts.map +1 -0
- package/dist/unblock-prs/merge-after.mjs +65 -0
- package/dist/unblock-prs/merge-after.mjs.map +1 -0
- package/dist/unblock-prs/options.d.mts +35 -0
- package/dist/unblock-prs/options.d.mts.map +1 -0
- package/dist/unblock-prs/options.mjs +88 -0
- package/dist/unblock-prs/options.mjs.map +1 -0
- package/dist/unblock-prs/owner.d.mts +32 -0
- package/dist/unblock-prs/owner.d.mts.map +1 -0
- package/dist/unblock-prs/owner.mjs +63 -0
- package/dist/unblock-prs/owner.mjs.map +1 -0
- package/dist/unblock-prs/quiet.d.mts +21 -0
- package/dist/unblock-prs/quiet.d.mts.map +1 -0
- package/dist/unblock-prs/quiet.mjs +42 -0
- package/dist/unblock-prs/quiet.mjs.map +1 -0
- package/dist/unblock-prs/rebase.d.mts +120 -0
- package/dist/unblock-prs/rebase.d.mts.map +1 -0
- package/dist/unblock-prs/rebase.mjs +576 -0
- package/dist/unblock-prs/rebase.mjs.map +1 -0
- package/dist/unblock-prs/release.d.mts +62 -0
- package/dist/unblock-prs/release.d.mts.map +1 -0
- package/dist/unblock-prs/release.mjs +94 -0
- package/dist/unblock-prs/release.mjs.map +1 -0
- package/dist/unblock-prs/set-aside-comment.d.mts +20 -0
- package/dist/unblock-prs/set-aside-comment.d.mts.map +1 -0
- package/dist/unblock-prs/set-aside-comment.mjs +93 -0
- package/dist/unblock-prs/set-aside-comment.mjs.map +1 -0
- package/dist/unblock-prs/set-aside-detail.d.mts +41 -0
- package/dist/unblock-prs/set-aside-detail.d.mts.map +1 -0
- package/dist/unblock-prs/set-aside-detail.mjs +56 -0
- package/dist/unblock-prs/set-aside-detail.mjs.map +1 -0
- package/dist/unblock-prs/skips.d.mts +85 -0
- package/dist/unblock-prs/skips.d.mts.map +1 -0
- package/dist/unblock-prs/skips.mjs +141 -0
- package/dist/unblock-prs/skips.mjs.map +1 -0
- package/dist/unblock-prs/stack.d.mts +98 -0
- package/dist/unblock-prs/stack.d.mts.map +1 -0
- package/dist/unblock-prs/stack.mjs +141 -0
- package/dist/unblock-prs/stack.mjs.map +1 -0
- package/dist/unblock-prs/triage.d.mts +28 -0
- package/dist/unblock-prs/triage.d.mts.map +1 -0
- package/dist/unblock-prs/triage.mjs +396 -0
- package/dist/unblock-prs/triage.mjs.map +1 -0
- package/dist/unblock-prs/types.d.mts +793 -0
- package/dist/unblock-prs/types.d.mts.map +1 -0
- package/dist/unblock-prs/types.mjs +26 -0
- package/dist/unblock-prs/types.mjs.map +1 -0
- package/dist/unblock-prs/util.d.mts +23 -0
- package/dist/unblock-prs/util.d.mts.map +1 -0
- package/dist/unblock-prs/util.mjs +60 -0
- package/dist/unblock-prs/util.mjs.map +1 -0
- package/dist/unblock-prs/version-pr.d.mts +57 -0
- package/dist/unblock-prs/version-pr.d.mts.map +1 -0
- package/dist/unblock-prs/version-pr.mjs +79 -0
- package/dist/unblock-prs/version-pr.mjs.map +1 -0
- package/dist/unblock-prs/watch.d.mts +17 -0
- package/dist/unblock-prs/watch.d.mts.map +1 -0
- package/dist/unblock-prs/watch.mjs +128 -0
- package/dist/unblock-prs/watch.mjs.map +1 -0
- package/package.json +118 -3
- package/src/claim-pr/claim-pr.mts +380 -0
- package/src/claim-pr/claim-pr.test.mts +176 -0
- package/src/claim-pr/index.mts +1 -0
- package/src/cmd/claim-pr.mts +32 -0
- package/src/cmd/open-pr.mts +28 -0
- package/src/cmd/pr-report.mts +28 -0
- package/src/cmd/push-fixed-pr.mts +36 -0
- package/src/cmd/report-unowned-prs.mts +37 -0
- package/src/cmd/unblock-prs.mts +24 -0
- package/src/entry-point.mts +3 -0
- package/src/lib/cli-args.mts +86 -0
- package/src/lib/cli-args.test.mts +92 -0
- package/src/lib/github-api.mts +463 -0
- package/src/lib/github-api.test.mts +40 -0
- package/src/lib/index.mts +6 -0
- package/src/lib/json.mts +43 -0
- package/src/lib/json.test.mts +34 -0
- package/src/lib/log.mts +19 -0
- package/src/lib/log.test.mts +45 -0
- package/src/lib/shell.mts +52 -0
- package/src/lib/time.mts +49 -0
- package/src/open-pr/README.md +237 -0
- package/src/open-pr/github.mts +444 -0
- package/src/open-pr/index.mts +5 -0
- package/src/open-pr/main.mts +327 -0
- package/src/open-pr/options.mts +101 -0
- package/src/open-pr/options.test.mts +67 -0
- package/src/open-pr/steps.mts +57 -0
- package/src/open-pr/steps.test.mts +59 -0
- package/src/open-pr/types.mts +42 -0
- package/src/pr-report/README.md +244 -0
- package/src/pr-report/github.mts +911 -0
- package/src/pr-report/index.mts +7 -0
- package/src/pr-report/linked-issues.mts +51 -0
- package/src/pr-report/linked-issues.test.mts +65 -0
- package/src/pr-report/main.mts +257 -0
- package/src/pr-report/options.mts +140 -0
- package/src/pr-report/queue.mts +125 -0
- package/src/pr-report/render.mts +428 -0
- package/src/pr-report/render.test.mts +379 -0
- package/src/pr-report/repo-settings.mts +34 -0
- package/src/push-fixed-pr/index.mts +1 -0
- package/src/push-fixed-pr/push-fixed-pr.mts +276 -0
- package/src/push-fixed-pr/push-fixed-pr.test.mts +228 -0
- package/src/report-unowned-prs/index.mts +1 -0
- package/src/report-unowned-prs/report-unowned-prs.mts +190 -0
- package/src/report-unowned-prs/report-unowned-prs.test.mts +87 -0
- package/src/unblock-prs/README.md +1616 -0
- package/src/unblock-prs/auto-fix.mts +334 -0
- package/src/unblock-prs/auto-fix.test.mts +159 -0
- package/src/unblock-prs/checks.mts +538 -0
- package/src/unblock-prs/checks.test.mts +507 -0
- package/src/unblock-prs/claims.mts +33 -0
- package/src/unblock-prs/claims.test.mts +64 -0
- package/src/unblock-prs/config.mts +187 -0
- package/src/unblock-prs/config.schema.json +71 -0
- package/src/unblock-prs/config.test.mts +139 -0
- package/src/unblock-prs/constants.mts +33 -0
- package/src/unblock-prs/demotions.mts +73 -0
- package/src/unblock-prs/demotions.test.mts +100 -0
- package/src/unblock-prs/github.mts +1042 -0
- package/src/unblock-prs/github.test.mts +84 -0
- package/src/unblock-prs/index.mts +24 -0
- package/src/unblock-prs/labels.mts +70 -0
- package/src/unblock-prs/main.mts +1051 -0
- package/src/unblock-prs/merge-after.mts +117 -0
- package/src/unblock-prs/merge-after.test.mts +120 -0
- package/src/unblock-prs/options.mts +157 -0
- package/src/unblock-prs/owner.mts +91 -0
- package/src/unblock-prs/owner.test.mts +114 -0
- package/src/unblock-prs/quiet.mts +62 -0
- package/src/unblock-prs/quiet.test.mts +175 -0
- package/src/unblock-prs/rebase.mts +962 -0
- package/src/unblock-prs/release.mts +149 -0
- package/src/unblock-prs/release.test.mts +209 -0
- package/src/unblock-prs/set-aside-comment.mts +143 -0
- package/src/unblock-prs/set-aside-comment.test.mts +148 -0
- package/src/unblock-prs/set-aside-detail.mts +82 -0
- package/src/unblock-prs/set-aside-detail.test.mts +131 -0
- package/src/unblock-prs/skips.mts +215 -0
- package/src/unblock-prs/skips.test.mts +280 -0
- package/src/unblock-prs/stack.mts +220 -0
- package/src/unblock-prs/stack.test.mts +449 -0
- package/src/unblock-prs/triage.mts +669 -0
- package/src/unblock-prs/triage.test.mts +100 -0
- package/src/unblock-prs/types.mts +358 -0
- package/src/unblock-prs/util.mts +78 -0
- package/src/unblock-prs/util.test.mts +26 -0
- package/src/unblock-prs/version-pr.mts +112 -0
- package/src/unblock-prs/version-pr.test.mts +78 -0
- package/src/unblock-prs/watch.mts +219 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { QueueComments, QueueOwner, ReportEntry } from 'pr-report-core';
|
|
2
|
+
import { Result } from 'ts-data-forge';
|
|
3
|
+
/** What `report-unowned-prs --help` prints. */
|
|
4
|
+
export declare const REPORT_UNOWNED_PRS_HELP: string;
|
|
5
|
+
/**
|
|
6
|
+
* Files an issue for each queued pull request nobody owns.
|
|
7
|
+
*
|
|
8
|
+
* Every pull request in the queue is the worker's, a skill's or a person's
|
|
9
|
+
* (`pr-report-core`'s `queue-owner.mts`); `none` means the rules met a state
|
|
10
|
+
* they do not cover, and a pull request in it waits for nothing that will
|
|
11
|
+
* come. That is a bug in the queue's tooling, not in the pull request, so it
|
|
12
|
+
* is reported as one — once per pull request, found again by a hidden line
|
|
13
|
+
* in the body of an open issue this account wrote — rather than left for
|
|
14
|
+
* someone to notice the queue has stopped.
|
|
15
|
+
*
|
|
16
|
+
* ```sh
|
|
17
|
+
* report-unowned-prs # file what is not filed yet
|
|
18
|
+
* report-unowned-prs --dry-run # say what it would file
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* The `/unblock-prs` skill runs it on every round. It reads the owners as
|
|
22
|
+
* every other command does (`pr-report/queue.mts`) and writes as the token's
|
|
23
|
+
* account, which has to be the one `unblock-prs` runs as.
|
|
24
|
+
*/
|
|
25
|
+
export declare const reportUnownedPrs: (dryRun: boolean) => Promise<Result<string, string>>;
|
|
26
|
+
/**
|
|
27
|
+
* What to file for each pull request nobody owns, given the open issues this
|
|
28
|
+
* account wrote: one already carrying the pull request's marker is reported
|
|
29
|
+
* and not filed again.
|
|
30
|
+
*/
|
|
31
|
+
export declare const planUnownedReports: (unowned: readonly Readonly<{
|
|
32
|
+
entry: ReportEntry;
|
|
33
|
+
owner: QueueOwner | undefined;
|
|
34
|
+
comments: QueueComments | undefined;
|
|
35
|
+
}>[], openIssues: readonly Readonly<{
|
|
36
|
+
number: number;
|
|
37
|
+
body: string;
|
|
38
|
+
}>[]) => Readonly<{
|
|
39
|
+
toFile: readonly Readonly<{
|
|
40
|
+
pr: number;
|
|
41
|
+
title: string;
|
|
42
|
+
body: string;
|
|
43
|
+
}>[];
|
|
44
|
+
reported: readonly Readonly<{
|
|
45
|
+
pr: number;
|
|
46
|
+
issue: number;
|
|
47
|
+
}>[];
|
|
48
|
+
}>;
|
|
49
|
+
//# sourceMappingURL=report-unowned-prs.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-unowned-prs.d.mts","sourceRoot":"","sources":["../../src/report-unowned-prs/report-unowned-prs.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAO,MAAM,EAAE,MAAM,eAAe,CAAC;AAK5C,+CAA+C;AAC/C,eAAO,MAAM,uBAAuB,QAUxB,CAAC;AAEb;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,gBAAgB,WACnB,OAAO,KACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2EhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,YACpB,SAAS,QAAQ,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;CACrC,CAAC,EAAE,cACQ,SAAS,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,KAChE,QAAQ,CAAC;IACV,MAAM,EAAE,SAAS,QAAQ,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IACzE,QAAQ,EAAE,SAAS,QAAQ,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CAC9D,CAsBA,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Arr, Result } from 'ts-data-forge';
|
|
2
|
+
import * as t from 'ts-fortress';
|
|
3
|
+
import { resolveApiContext, rest, viewerLogin } from '../lib/index.mjs';
|
|
4
|
+
import { readQueueState } from '../pr-report/index.mjs';
|
|
5
|
+
|
|
6
|
+
export const REPORT_UNOWNED_PRS_HELP = [
|
|
7
|
+
'Usage: report-unowned-prs [--dry-run]',
|
|
8
|
+
'',
|
|
9
|
+
'Files an issue for each queued pull request nobody owns: one the',
|
|
10
|
+
'worker, a skill and a person are all waiting on someone else for.',
|
|
11
|
+
'Once per pull request; an open issue this account filed is not filed again.',
|
|
12
|
+
'',
|
|
13
|
+
'Options:',
|
|
14
|
+
' --dry-run say what it would file, and file nothing',
|
|
15
|
+
' -h, --help show this help',
|
|
16
|
+
].join('\n');
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
export const reportUnownedPrs = async (dryRun) => {
|
|
38
|
+
const state = await readQueueState();
|
|
39
|
+
if (Result.isErr(state)) {
|
|
40
|
+
return Result.err(`cannot read the queue: ${state.value}`);
|
|
41
|
+
}
|
|
42
|
+
const { decided, owners, queue } = state.value;
|
|
43
|
+
const unowned = decided.entries.filter((entry) => owners.get(entry.number)?.owner === 'none');
|
|
44
|
+
if (!Arr.isNonEmpty(unowned)) {
|
|
45
|
+
return Result.ok('Every queued pull request has an owner.');
|
|
46
|
+
}
|
|
47
|
+
const api = await resolveApiContext();
|
|
48
|
+
if (Result.isErr(api)) {
|
|
49
|
+
return api;
|
|
50
|
+
}
|
|
51
|
+
const viewer = await viewerLogin(api.value.token);
|
|
52
|
+
if (Result.isErr(viewer)) {
|
|
53
|
+
return Result.err(`cannot read who the token is: ${viewer.value}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
const listed = await rest(api.value, 'GET', '/issues', IssueListSchema, {
|
|
58
|
+
query: { state: 'open', creator: viewer.value, per_page: '100' },
|
|
59
|
+
});
|
|
60
|
+
if (Result.isErr(listed)) {
|
|
61
|
+
return Result.err(`cannot list the open issues: ${listed.value}`);
|
|
62
|
+
}
|
|
63
|
+
const plan = planUnownedReports(unowned.map((entry) => ({
|
|
64
|
+
entry,
|
|
65
|
+
owner: owners.get(entry.number),
|
|
66
|
+
comments: queue.get(entry.number),
|
|
67
|
+
})), listed.value.map(({ number, body }) => ({ number, body: body ?? '' })));
|
|
68
|
+
const mut_lines = plan.reported.map(({ pr, issue }) => `#${pr}: already reported in #${issue}.`);
|
|
69
|
+
for (const report of plan.toFile) {
|
|
70
|
+
if (dryRun) {
|
|
71
|
+
mut_lines.push(`#${report.pr}: would file "${report.title}".`);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const filed = await rest(api.value, 'POST', '/issues', t.record({ number: t.number() }), { body: { title: report.title, body: report.body } });
|
|
75
|
+
mut_lines.push(Result.isErr(filed)
|
|
76
|
+
? `#${report.pr}: could not file an issue: ${filed.value}`
|
|
77
|
+
: `#${report.pr}: filed #${filed.value.number}.`);
|
|
78
|
+
}
|
|
79
|
+
return Result.ok(mut_lines.join('\n'));
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
export const planUnownedReports = (unowned, openIssues) => {
|
|
87
|
+
const issueOf = (pr) => openIssues.find(({ body }) => body.includes(markerOf(pr)))?.number;
|
|
88
|
+
return {
|
|
89
|
+
reported: Arr.generate(function* () {
|
|
90
|
+
for (const { entry } of unowned) {
|
|
91
|
+
const issue = issueOf(entry.number);
|
|
92
|
+
if (issue !== undefined) {
|
|
93
|
+
yield { pr: entry.number, issue };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}),
|
|
97
|
+
toFile: unowned
|
|
98
|
+
.filter(({ entry }) => issueOf(entry.number) === undefined)
|
|
99
|
+
.map(({ entry, owner, comments }) => ({
|
|
100
|
+
pr: entry.number,
|
|
101
|
+
title: `unblock-prs: #${entry.number} is in the queue with no owner`,
|
|
102
|
+
body: reportBody(entry, owner, comments),
|
|
103
|
+
})),
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
const markerOf = (pr) => `<!-- unblock-prs:unowned pr=${pr} -->`;
|
|
107
|
+
const reportBody = (entry, owner, comments) => [
|
|
108
|
+
markerOf(entry.number),
|
|
109
|
+
'',
|
|
110
|
+
`#${entry.number} is in the merge queue, and \`queueOwner\` (\`libs/pr-report-core/src/queue-owner.mts\`) gives it to nobody: the worker, the skills and the people working the queue each leave it to the others.`,
|
|
111
|
+
'',
|
|
112
|
+
`- Why: ${owner?.reason ?? 'no owner was returned'}`,
|
|
113
|
+
`- Labels: ${Arr.isNonEmpty(entry.labels) ? entry.labels.map(({ name }) => `\`${name}\``).join(', ') : 'none'}`,
|
|
114
|
+
`- Head: \`${entry.headRef}\` at \`${entry.headSha}\`, onto \`${entry.baseRef}\`${entry.stackedOn === undefined ? '' : ` (stacked on #${entry.stackedOn})`}`,
|
|
115
|
+
`- Set-aside comment: ${describeComment(comments?.setAside?.says)}`,
|
|
116
|
+
`- Claim: ${describeComment(comments?.claim?.says)}`,
|
|
117
|
+
'',
|
|
118
|
+
'Give the state an owner in `queue-owner.mts` (with a test), or make the writer that produced it stop producing it. Then the pull request needs whatever its new owner does; until then a person moves it by hand.',
|
|
119
|
+
'',
|
|
120
|
+
'Filed by `report-unowned-prs`.',
|
|
121
|
+
].join('\n');
|
|
122
|
+
const describeComment = (says) => says === undefined ? 'none' : `\`${JSON.stringify(says)}\``;
|
|
123
|
+
const IssueListSchema = t.array(t.record({
|
|
124
|
+
number: t.number(),
|
|
125
|
+
body: t.union([t.string(), t.nullType]),
|
|
126
|
+
}));
|
|
127
|
+
//# sourceMappingURL=report-unowned-prs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-unowned-prs.mjs","sourceRoot":"","sources":["../../src/report-unowned-prs/report-unowned-prs.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"include":["."]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type ContextState } from 'pr-report-core';
|
|
2
|
+
import { Result } from 'ts-data-forge';
|
|
3
|
+
import { type ApiContext } from '../lib/index.mjs';
|
|
4
|
+
import { type AutoFixConfig } from './config.mjs';
|
|
5
|
+
import type { AutoFixed, PullRequest } from './types.mjs';
|
|
6
|
+
/**
|
|
7
|
+
* Tries once to fix the checks that failed on `head` by running the fixers
|
|
8
|
+
* their matrix entries name, and pushes the result when there is one.
|
|
9
|
+
*
|
|
10
|
+
* Only when **every** failed job is such an entry: one real failure beside
|
|
11
|
+
* them means the push would put the pull request through a matrix that fails
|
|
12
|
+
* anyway, so the whole of it is left to whoever fixes the real one.
|
|
13
|
+
*
|
|
14
|
+
* The fixers run in a throwaway worktree, installed and built as CI installs
|
|
15
|
+
* and builds, so the checkout this runs from is never touched. Where it goes
|
|
16
|
+
* is {@link WORKTREE_ROOT}'s to say.
|
|
17
|
+
*
|
|
18
|
+
* The branch has to be exactly one commit on top of the base, and the fix is
|
|
19
|
+
* amended onto it — a pull request is one commit (`Validate commit count`), and
|
|
20
|
+
* squashing several means writing the message that lands on `main`, which is
|
|
21
|
+
* not a mechanical act.
|
|
22
|
+
*/
|
|
23
|
+
export declare const autoFix: (api: ApiContext, pr: PullRequest, head: string, defaultBranch: string, config: AutoFixConfig | undefined) => Promise<AutoFixed>;
|
|
24
|
+
/**
|
|
25
|
+
* What to run for the jobs that failed, or why nothing is to be run.
|
|
26
|
+
*
|
|
27
|
+
* `states` is every context on the head commit. A failed context the
|
|
28
|
+
* configuration ignores (an aggregate, only the echo of a job that failed
|
|
29
|
+
* under it) is not read; every other failure has to match one of its fixers,
|
|
30
|
+
* whose command is the whole of what reproduces the job — a job that runs a
|
|
31
|
+
* command and then asserts a clean tree. `config` is the repository's
|
|
32
|
+
* (`config.mts`); without one nothing is fixed.
|
|
33
|
+
*/
|
|
34
|
+
export declare const planAutoFix: (states: ReadonlyMap<string, ContextState>, config: AutoFixConfig | undefined) => Result<AutoFixPlan, string>;
|
|
35
|
+
export type AutoFixPlan = Readonly<{
|
|
36
|
+
/** What runs first, always. */
|
|
37
|
+
before: readonly string[];
|
|
38
|
+
/** What the failed jobs were given before they ran, each once. */
|
|
39
|
+
prepare: readonly string[];
|
|
40
|
+
/** The fixers, by stage. */
|
|
41
|
+
commands: readonly string[];
|
|
42
|
+
/** What settles their output. */
|
|
43
|
+
after: readonly string[];
|
|
44
|
+
}>;
|
|
45
|
+
//# sourceMappingURL=auto-fix.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-fix.d.mts","sourceRoot":"","sources":["../../src/unblock-prs/auto-fix.mts"],"names":[],"mappings":"AAiBA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAY,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,QACb,UAAU,MACX,WAAW,QACT,MAAM,iBACG,MAAM,UACb,aAAa,GAAG,SAAS,KAChC,OAAO,CAAC,SAAS,CA6DnB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,WACd,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,UACjC,aAAa,GAAG,SAAS,KAChC,MAAM,CAAC,WAAW,EAAE,MAAM,CAsD5B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,+BAA+B;IAC/B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,kEAAkE;IAClE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,4BAA4B;IAC5B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,iCAAiC;IACjC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC,CAAC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import { statesFromCheckRuns } from 'pr-report-core';
|
|
17
|
+
import { Arr, Num, Result } from 'ts-data-forge';
|
|
18
|
+
import { git, log, sh } from '../lib/index.mjs';
|
|
19
|
+
import { CONFIG_PATH } from './config.mjs';
|
|
20
|
+
import { listCheckRuns, remoteSha, removeWorktree } from './github.mjs';
|
|
21
|
+
import { lastLines, stopRequested } from './util.mjs';
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
export const autoFix = async (api, pr, head, defaultBranch, config) => {
|
|
40
|
+
const runs = await listCheckRuns(api, head);
|
|
41
|
+
if (Result.isErr(runs)) {
|
|
42
|
+
return declined(`cannot read the check runs: ${runs.value}`);
|
|
43
|
+
}
|
|
44
|
+
const plan = planAutoFix(statesFromCheckRuns(runs.value), config);
|
|
45
|
+
if (Result.isErr(plan)) {
|
|
46
|
+
return declined(plan.value);
|
|
47
|
+
}
|
|
48
|
+
const worktreeDir = path.join(WORKTREE_ROOT, `auto-fix-pr-${pr.number}`);
|
|
49
|
+
|
|
50
|
+
await removeWorktree(worktreeDir);
|
|
51
|
+
const branch = pr.headRefName;
|
|
52
|
+
const fetched = await git(`git fetch --quiet origin ${sh(defaultBranch)} ${sh(branch)}`);
|
|
53
|
+
if (Result.isErr(fetched)) {
|
|
54
|
+
return declined(`fetch failed: ${fetched.value}`);
|
|
55
|
+
}
|
|
56
|
+
const remoteHead = await git(`git rev-parse ${sh(`origin/${branch}`)}`);
|
|
57
|
+
if (Result.isErr(remoteHead)) {
|
|
58
|
+
return declined(`cannot resolve origin/${branch}: ${remoteHead.value}`);
|
|
59
|
+
}
|
|
60
|
+
if (remoteHead.value.trim() !== head) {
|
|
61
|
+
return { kind: 'moved' };
|
|
62
|
+
}
|
|
63
|
+
const added = await git(`git worktree add --detach ${sh(worktreeDir)} ${sh(head)}`);
|
|
64
|
+
if (Result.isErr(added)) {
|
|
65
|
+
return declined(`checkout failed: ${added.value}`);
|
|
66
|
+
}
|
|
67
|
+
log(`#${pr.number}: every failed job is a fixer's diff; running ${plan.value.commands.join(', ')} in ${worktreeDir}.`);
|
|
68
|
+
const result = await fixInWorktree(pr, head, defaultBranch, plan.value, worktreeDir);
|
|
69
|
+
await removeWorktree(worktreeDir);
|
|
70
|
+
return result;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
export const planAutoFix = (states, config) => {
|
|
83
|
+
if (config === undefined) {
|
|
84
|
+
return Result.err(`the repository has no autoFix in ${CONFIG_PATH}`);
|
|
85
|
+
}
|
|
86
|
+
const failed = Array.from(states)
|
|
87
|
+
.filter(([name, state]) => state === 'failed' &&
|
|
88
|
+
config.ignore.every((pattern) => !pattern.test(name)))
|
|
89
|
+
.map(([name]) => name);
|
|
90
|
+
if (!Arr.isNonEmpty(failed)) {
|
|
91
|
+
return Result.err('no job failed apart from the ignored ones');
|
|
92
|
+
}
|
|
93
|
+
const entries = failed.map((name) => ({
|
|
94
|
+
name,
|
|
95
|
+
fixer: fixerFor(name, config),
|
|
96
|
+
}));
|
|
97
|
+
const others = entries
|
|
98
|
+
.filter(({ fixer }) => fixer === undefined)
|
|
99
|
+
.map(({ name }) => name);
|
|
100
|
+
if (Arr.isNonEmpty(others)) {
|
|
101
|
+
return Result.err(`${others.join(', ')} failed, which is not a fixer's diff`);
|
|
102
|
+
}
|
|
103
|
+
const fixers = entries
|
|
104
|
+
.map(({ fixer }) => fixer)
|
|
105
|
+
.filter((fixer) => fixer !== undefined);
|
|
106
|
+
return Result.ok({
|
|
107
|
+
before: config.before,
|
|
108
|
+
prepare: Arr.uniq(config.prepare
|
|
109
|
+
.filter(({ context }) => failed.some((name) => context.test(name)))
|
|
110
|
+
.map(({ run }) => run)),
|
|
111
|
+
commands: Arr.uniq(fixers
|
|
112
|
+
.toSorted((a, b) => a.stage === b.stage
|
|
113
|
+
? a.command.localeCompare(b.command)
|
|
114
|
+
: a.stage - b.stage)
|
|
115
|
+
.map(({ command }) => command)),
|
|
116
|
+
after: config.after,
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
const WORKTREE_ROOT = path.join(os.homedir(), '.local', 'state', 'unblock-prs');
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
const fixerFor = (name, config) => {
|
|
134
|
+
const matched = config.fixers
|
|
135
|
+
.map((candidate) => ({ candidate, groups: candidate.context.exec(name) }))
|
|
136
|
+
.find((entry) => entry.groups !== null);
|
|
137
|
+
const fixer = matched?.candidate;
|
|
138
|
+
const groups = matched?.groups ?? undefined;
|
|
139
|
+
if (fixer === undefined || groups === undefined) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
command: fixer.run.replaceAll(/\$([1-9])/gu, (_, index) => sh(groups[Result.unwrapOkOr(Num.safeParseInt(index ?? ''), Number.NaN)] ??
|
|
144
|
+
'')),
|
|
145
|
+
stage: fixer.stage,
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
const declined = (detail) => ({ kind: 'declined', detail });
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
const fixInWorktree = async (pr, head, defaultBranch, plan, worktreeDir) => {
|
|
155
|
+
const commits = await git(`git rev-list --count ${sh(`origin/${defaultBranch}..HEAD`)}`, worktreeDir);
|
|
156
|
+
if (Result.isErr(commits)) {
|
|
157
|
+
return declined(`cannot count the commits: ${commits.value}`);
|
|
158
|
+
}
|
|
159
|
+
if (commits.value.trim() !== '1') {
|
|
160
|
+
return declined(`the branch is ${commits.value.trim()} commits on ${defaultBranch}, and only one is amended`);
|
|
161
|
+
}
|
|
162
|
+
const steps = [
|
|
163
|
+
...plan.before,
|
|
164
|
+
...plan.prepare,
|
|
165
|
+
...plan.commands,
|
|
166
|
+
...plan.after,
|
|
167
|
+
];
|
|
168
|
+
for (const step of steps) {
|
|
169
|
+
if (stopRequested()) {
|
|
170
|
+
return declined('stopped before it finished');
|
|
171
|
+
}
|
|
172
|
+
log(`#${pr.number}: ${step}`);
|
|
173
|
+
const ran = await git(step, worktreeDir);
|
|
174
|
+
if (Result.isErr(ran)) {
|
|
175
|
+
return declined(`\`${step}\` failed: ${lastLines(ran.value, 5)}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const status = await git('git status --porcelain', worktreeDir);
|
|
179
|
+
if (Result.isErr(status)) {
|
|
180
|
+
return declined(`cannot read what changed: ${status.value}`);
|
|
181
|
+
}
|
|
182
|
+
if (status.value.trim() === '') {
|
|
183
|
+
return declined(`${plan.commands.join(', ')} changed nothing here, so the failure is not the diff`);
|
|
184
|
+
}
|
|
185
|
+
const committed = await git('git add --all && git commit --quiet --amend --no-edit', worktreeDir);
|
|
186
|
+
if (Result.isErr(committed)) {
|
|
187
|
+
return declined(`cannot amend: ${lastLines(committed.value, 5)}`);
|
|
188
|
+
}
|
|
189
|
+
const newHead = await git('git rev-parse HEAD', worktreeDir);
|
|
190
|
+
if (Result.isErr(newHead)) {
|
|
191
|
+
return declined(`cannot read the amended head: ${newHead.value}`);
|
|
192
|
+
}
|
|
193
|
+
if (stopRequested()) {
|
|
194
|
+
return declined('stopped before pushing');
|
|
195
|
+
}
|
|
196
|
+
const sha = newHead.value.trim();
|
|
197
|
+
const branch = pr.headRefName;
|
|
198
|
+
const pushed = await git(`git push --force-with-lease=${sh(`${branch}:${head}`)} origin ${sh(`${sha}:refs/heads/${branch}`)}`, worktreeDir);
|
|
199
|
+
if (Result.isErr(pushed)) {
|
|
200
|
+
const remoteHeadNow = await remoteSha(branch);
|
|
201
|
+
return Result.isOk(remoteHeadNow) && remoteHeadNow.value !== head
|
|
202
|
+
? { kind: 'moved' }
|
|
203
|
+
: declined(`push refused: ${lastLines(pushed.value, 5)}`);
|
|
204
|
+
}
|
|
205
|
+
return { kind: 'pushed', head: sha, commands: plan.commands };
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=auto-fix.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-fix.mjs","sourceRoot":"","sources":["../../src/unblock-prs/auto-fix.mts"],"names":[],"mappings":"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"}
|