pr-report-core 0.2.1 → 0.3.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/README.md +5 -2
- package/dist/branch-rules.d.mts +30 -0
- package/dist/branch-rules.d.mts.map +1 -0
- package/dist/branch-rules.mjs +71 -0
- package/dist/branch-rules.mjs.map +1 -0
- package/dist/claim.d.mts +15 -8
- package/dist/claim.d.mts.map +1 -1
- package/dist/claim.mjs +2 -1
- package/dist/claim.mjs.map +1 -1
- package/dist/index.d.mts +3 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -1
- package/dist/issue-claim.d.mts +56 -0
- package/dist/issue-claim.d.mts.map +1 -0
- package/dist/issue-claim.mjs +87 -0
- package/dist/issue-claim.mjs.map +1 -0
- package/dist/issue-priority.d.mts +44 -0
- package/dist/issue-priority.d.mts.map +1 -0
- package/dist/issue-priority.mjs +91 -0
- package/dist/issue-priority.mjs.map +1 -0
- package/dist/labels.d.mts +6 -3
- package/dist/labels.d.mts.map +1 -1
- package/dist/labels.mjs +3 -0
- package/dist/labels.mjs.map +1 -1
- package/dist/queue-owner.d.mts +1 -1
- package/dist/queue-owner.d.mts.map +1 -1
- package/dist/queue-owner.mjs +18 -0
- package/dist/queue-owner.mjs.map +1 -1
- package/dist/ruleset.d.mts +6 -6
- package/dist/set-aside.d.mts +2 -1
- package/dist/set-aside.d.mts.map +1 -1
- package/dist/set-aside.mjs +2 -0
- package/dist/set-aside.mjs.map +1 -1
- package/package.json +9 -9
- package/src/branch-rules.mts +105 -0
- package/src/branch-rules.test.mts +221 -0
- package/src/claim.mts +10 -9
- package/src/index.mts +3 -0
- package/src/issue-claim.mts +138 -0
- package/src/issue-claim.test.mts +149 -0
- package/src/issue-priority.mts +116 -0
- package/src/issue-priority.test.mts +71 -0
- package/src/labels.mts +6 -3
- package/src/queue-owner.mts +21 -0
- package/src/queue-owner.test.mts +2 -0
- package/src/ruleset.mts +6 -6
- package/src/set-aside.mts +3 -1
- package/src/set-aside.test.mts +22 -0
package/README.md
CHANGED
|
@@ -57,8 +57,11 @@ assert.deepStrictEqual(cycles, [[12, 14]]);
|
|
|
57
57
|
forest they describe, and everything read arranged into a report.
|
|
58
58
|
- **`summarize.mts`** — the counts a report leads with.
|
|
59
59
|
- **`ruleset.mts`** — what a ruleset requires: the contexts, and whether code
|
|
60
|
-
owners have to approve. **`
|
|
61
|
-
|
|
60
|
+
owners have to approve. **`branch-rules.mts`** — the same read off GitHub for
|
|
61
|
+
a branch, its rulesets and a classic branch protection rule together, through
|
|
62
|
+
whatever transport the reader hands over. **`code-owners.mts`**,
|
|
63
|
+
**`review-hold.mts`** — who owns a change, and whether a review holds a pull
|
|
64
|
+
request.
|
|
62
65
|
- **`queue-owner.mts`**, **`queue-order.mts`** — who moves each queued pull
|
|
63
66
|
request next, and the order the queue picks them in.
|
|
64
67
|
- **`set-aside.mts`**, **`claim.mts`** — the comments `unblock-prs` and a
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What GitHub enforces on a branch, read the one way every reader reads it:
|
|
3
|
+
* every ruleset that applies to the branch
|
|
4
|
+
* (`GET /repos/{owner}/{repo}/rules/branches/{branch}`), and the contexts a
|
|
5
|
+
* classic branch protection rule requires
|
|
6
|
+
* (`GET /repos/{owner}/{repo}/branches/{branch}`). Neither wants more than
|
|
7
|
+
* reading the repository, where the endpoints that list a ruleset's own
|
|
8
|
+
* settings or a protection rule's whole want an admin.
|
|
9
|
+
*
|
|
10
|
+
* What a classic rule says about reviews is not among what the second answers,
|
|
11
|
+
* so a code owner's approval is waited for only where a ruleset asks for it.
|
|
12
|
+
*
|
|
13
|
+
* Nothing here talks to GitHub: the reader hands over its own way of asking.
|
|
14
|
+
*/
|
|
15
|
+
import { Result } from 'ts-data-forge';
|
|
16
|
+
import * as t from 'ts-fortress';
|
|
17
|
+
import { type RulesetRequirements } from './ruleset.mjs';
|
|
18
|
+
/**
|
|
19
|
+
* One `GET`, by the reader's own transport. `path` is relative to
|
|
20
|
+
* `/repos/{owner}/{repo}` and may carry a query string; `what` names the
|
|
21
|
+
* request for a message.
|
|
22
|
+
*/
|
|
23
|
+
export type BranchRulesGet = <A>(path: string, schema: t.Type<A>, what: string) => Promise<Result<A, string>>;
|
|
24
|
+
/**
|
|
25
|
+
* The requirements on `branch`, or why they could not be read. Either request
|
|
26
|
+
* failing fails it: a list of required contexts missing half of them would be
|
|
27
|
+
* read as the whole.
|
|
28
|
+
*/
|
|
29
|
+
export declare const readBranchRequirements: (branch: string, get: BranchRulesGet) => Promise<Result<RulesetRequirements, string>>;
|
|
30
|
+
//# sourceMappingURL=branch-rules.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-rules.d.mts","sourceRoot":"","sources":["../src/branch-rules.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAO,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AACjC,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE9E;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EACjB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhC;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,WACzB,MAAM,OACT,cAAc,KAClB,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CA2C7C,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
import { Arr, Result } from 'ts-data-forge';
|
|
16
|
+
import * as t from 'ts-fortress';
|
|
17
|
+
import { requirementsOfRules } from './ruleset.mjs';
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
export const readBranchRequirements = async (branch, get) => {
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
const segment = encodeURIComponent(branch);
|
|
28
|
+
const [rules, branchAnswer] = await Promise.all([
|
|
29
|
+
get(`/rules/branches/${segment}?per_page=${RULES_PER_PAGE}`, RulesSchema, `the rules on ${branch}`),
|
|
30
|
+
get(`/branches/${segment}`, BranchSchema, `the protection of ${branch}`),
|
|
31
|
+
]);
|
|
32
|
+
if (Result.isErr(rules)) {
|
|
33
|
+
return rules;
|
|
34
|
+
}
|
|
35
|
+
if (Result.isErr(branchAnswer)) {
|
|
36
|
+
return branchAnswer;
|
|
37
|
+
}
|
|
38
|
+
const fromRulesets = requirementsOfRules(rules.value);
|
|
39
|
+
const protection = branchAnswer.value.protection;
|
|
40
|
+
const classic = protection?.enabled === false
|
|
41
|
+
? undefined
|
|
42
|
+
: protection?.required_status_checks;
|
|
43
|
+
return Result.ok({
|
|
44
|
+
...fromRulesets,
|
|
45
|
+
requiredContexts: Arr.uniq([
|
|
46
|
+
...fromRulesets.requiredContexts,
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
...(classic === undefined || classic.enforcement_level === 'off'
|
|
50
|
+
? []
|
|
51
|
+
: classic.contexts),
|
|
52
|
+
]),
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
const RULES_PER_PAGE = 100;
|
|
61
|
+
const RulesSchema = t.array(t.unknown());
|
|
62
|
+
const BranchSchema = t.record({
|
|
63
|
+
protection: t.optional(t.record({
|
|
64
|
+
enabled: t.optional(t.boolean()),
|
|
65
|
+
required_status_checks: t.optional(t.record({
|
|
66
|
+
enforcement_level: t.optional(t.string()),
|
|
67
|
+
contexts: t.array(t.string()),
|
|
68
|
+
})),
|
|
69
|
+
})),
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=branch-rules.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-rules.mjs","sourceRoot":"","sources":["../src/branch-rules.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAA4B,MAAM,eAAe,CAAC;AAa9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EACzC,MAAc,EACd,GAAmB,EAC2B,EAAE;IAChD,yEAAyE;IACzE,gEAAgE;IAChE,iDAAiD;IACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,GAAG,CACD,mBAAmB,OAAO,aAAa,cAAc,EAAE,EACvD,WAAW,EACX,gBAAgB,MAAM,EAAE,CACzB;QACD,GAAG,CAAC,aAAa,OAAO,EAAE,EAAE,YAAY,EAAE,qBAAqB,MAAM,EAAE,CAAC;KACzE,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC;IAEjD,MAAM,OAAO,GACX,UAAU,EAAE,OAAO,KAAK,KAAK;QAC3B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAEzC,OAAO,MAAM,CAAC,EAAE,CAAC;QACf,GAAG,YAAY;QACf,gBAAgB,EAAE,GAAG,CAAC,IAAI,CAAC;YACzB,GAAG,YAAY,CAAC,gBAAgB;YAChC,wEAAwE;YACxE,mCAAmC;YACnC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,iBAAiB,KAAK,KAAK;gBAC9D,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;SACtB,CAAC;KACH,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAEzC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,UAAU,EAAE,CAAC,CAAC,QAAQ,CACpB,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAChC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAChC,CAAC,CAAC,MAAM,CAAC;YACP,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACzC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC9B,CAAC,CACH;KACF,CAAC,CACH;CACF,CAAC,CAAC"}
|
package/dist/claim.d.mts
CHANGED
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
* writer of the queue can read it.
|
|
4
4
|
*
|
|
5
5
|
* `unblock-prs` leaves a set-aside pull request alone until its head moves —
|
|
6
|
-
* or, for every reason but `checks-failed
|
|
7
|
-
* base does, when it tries the rebase again. A
|
|
8
|
-
* is then racing the script, and a second
|
|
9
|
-
*
|
|
10
|
-
* failure. The leases on every push
|
|
11
|
-
* work, but not from doing it
|
|
12
|
-
*
|
|
13
|
-
*
|
|
6
|
+
* or, for every reason but `checks-failed`, `awaiting-bypass` and
|
|
7
|
+
* `head-out-of-sync`, until the base does, when it tries the rebase again. A
|
|
8
|
+
* session fixing that pull request is then racing the script, and a second
|
|
9
|
+
* session, or the one that opened the pull request and is woken by the
|
|
10
|
+
* set-aside comment, may be fixing the same failure. The leases on every push
|
|
11
|
+
* keep any of them from overwriting another's work, but not from doing it
|
|
12
|
+
* twice. So whoever starts on one says so first in a comment whose first line
|
|
13
|
+
* is a hidden record this module writes and reads, and everyone else — the
|
|
14
|
+
* script included — leaves that pull request to it.
|
|
14
15
|
*
|
|
15
16
|
* **It lasts while the head is the one it claimed**, and for at most
|
|
16
17
|
* {@link CLAIM_LIFETIME_MINUTES}. The push that carries the fix moves the head
|
|
@@ -59,4 +60,10 @@ export declare const parseClaimComment: (body: string) => ClaimComment | undefin
|
|
|
59
60
|
* `headTip`, at `nowEpochMs`.
|
|
60
61
|
*/
|
|
61
62
|
export declare const claimApplies: (claim: Claim, headTip: string, nowEpochMs: number) => boolean;
|
|
63
|
+
/**
|
|
64
|
+
* How far ahead of the reader's clock a claim may be dated and still count.
|
|
65
|
+
* Further than that is a clock that would otherwise stretch the lifetime by
|
|
66
|
+
* however far ahead it ran.
|
|
67
|
+
*/
|
|
68
|
+
export declare const CLOCK_SKEW_MINUTES = 5;
|
|
62
69
|
//# sourceMappingURL=claim.d.mts.map
|
package/dist/claim.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim.d.mts","sourceRoot":"","sources":["../src/claim.mts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claim.d.mts","sourceRoot":"","sources":["../src/claim.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,CACjC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAC1D,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,UAAU,OAAQ,MAAM,KAAG,OAA4B,CAAC;AAErE,qCAAqC;AACrC,eAAO,MAAM,iBAAiB,UAAW,KAAK,SAAS,MAAM,KAAG,MAKlD,CAAC;AAEf,kEAAkE;AAClE,eAAO,MAAM,yBAAyB,UAAW,MAAM,KAAG,MACD,CAAC;AAE1D,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,YAAY,GAAG,SAsB/D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,UAChB,KAAK,WACH,MAAM,cACH,MAAM,KACjB,OASF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC"}
|
package/dist/claim.mjs
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
+
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
import { epochMsOf } from './timestamp.mjs';
|
|
@@ -73,7 +74,7 @@ export const claimApplies = (claim, headTip, nowEpochMs) => {
|
|
|
73
74
|
|
|
74
75
|
|
|
75
76
|
|
|
76
|
-
const CLOCK_SKEW_MINUTES = 5;
|
|
77
|
+
export const CLOCK_SKEW_MINUTES = 5;
|
|
77
78
|
const MS_PER_MINUTE = 60_000;
|
|
78
79
|
|
|
79
80
|
const MARKER = '<!-- unblock-prs:claim';
|
package/dist/claim.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim.mjs","sourceRoot":"","sources":["../src/claim.mts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claim.mjs","sourceRoot":"","sources":["../src/claim.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,gEAAgE;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAkB1C,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAErE,qCAAqC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAE,KAAa,EAAU,EAAE,CACvE;IACE,GAAG,MAAM,SAAS,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM;IACnE,EAAE;IACF,KAAK,CAAC,IAAI,EAAE;CACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEf,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAU,EAAE,CACjE,CAAC,GAAG,MAAM,eAAe,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE1D,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAA4B,EAAE;IAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAExD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEjD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAE1B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,OAAO,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;QAClE,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACvD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAY,EACZ,OAAe,EACf,UAAkB,EACT,EAAE;IACX,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE/B,OAAO,CACL,KAAK,CAAC,OAAO,KAAK,OAAO;QACzB,EAAE,KAAK,SAAS;QAChB,EAAE,GAAG,kBAAkB,GAAG,aAAa,IAAI,UAAU;QACrD,UAAU,GAAG,EAAE,GAAG,sBAAsB,GAAG,aAAa,CACzD,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,sEAAsE;AACtE,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAExC,qFAAqF;AACrF,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,aAAa,GACjB,8HAA8H,CAAC"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
export * from './branch-rules.mjs';
|
|
1
2
|
export * from './checks.mjs';
|
|
2
3
|
export * from './claim.mjs';
|
|
3
4
|
export * from './closing-issues.mjs';
|
|
4
5
|
export * from './code-owners.mjs';
|
|
6
|
+
export * from './issue-claim.mjs';
|
|
7
|
+
export * from './issue-priority.mjs';
|
|
5
8
|
export * from './labels.mjs';
|
|
6
9
|
export * from './merge-after.mjs';
|
|
7
10
|
export * from './queue-comments.mjs';
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
export * from './branch-rules.mjs';
|
|
1
2
|
export * from './checks.mjs';
|
|
2
3
|
export * from './claim.mjs';
|
|
3
4
|
export * from './closing-issues.mjs';
|
|
4
5
|
export * from './code-owners.mjs';
|
|
6
|
+
export * from './issue-claim.mjs';
|
|
7
|
+
export * from './issue-priority.mjs';
|
|
5
8
|
export * from './labels.mjs';
|
|
6
9
|
export * from './merge-after.mjs';
|
|
7
10
|
export * from './queue-comments.mjs';
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who has started an issue, or means to, written where every session can read
|
|
3
|
+
* it.
|
|
4
|
+
*
|
|
5
|
+
* The `in-progress` and `planned` labels (`labels.mts`) say that someone is on
|
|
6
|
+
* an issue, not who: every session writes as the same account, so neither the
|
|
7
|
+
* labels nor the assignees tell two of them apart, and a session refused by a
|
|
8
|
+
* label cannot say whose it is. So `start-issue` also writes a comment whose
|
|
9
|
+
* first line is a hidden record this module writes and reads, naming the
|
|
10
|
+
* claimant (a session URL, or any other word unique to it; `claim.mts`'s
|
|
11
|
+
* `isClaimant`).
|
|
12
|
+
*
|
|
13
|
+
* **A start lasts until it is released**, as the label always has: the pull
|
|
14
|
+
* request that closes the issue is what ends it. **A plan lapses** after
|
|
15
|
+
* {@link PLANNED_CLAIM_LIFETIME_HOURS}, since it holds nothing back and a
|
|
16
|
+
* session that meant to start next may never get there; a claimant still
|
|
17
|
+
* meaning to writes it again.
|
|
18
|
+
*
|
|
19
|
+
* **One comment per issue, edited in place**, as for the pull request claim; of
|
|
20
|
+
* several, the oldest is the one, so two claimants writing at once both read
|
|
21
|
+
* back the same answer — which a label cannot give, having no order to read.
|
|
22
|
+
*
|
|
23
|
+
* **Only the comments the reader's own account wrote count**: the repository is
|
|
24
|
+
* public.
|
|
25
|
+
*/
|
|
26
|
+
import type { OwnComment, QueueComment } from './queue-comments.mjs';
|
|
27
|
+
/** How long a plan lasts when it is not written again. */
|
|
28
|
+
export declare const PLANNED_CLAIM_LIFETIME_HOURS = 24;
|
|
29
|
+
export type IssueClaim = Readonly<{
|
|
30
|
+
/** Started (`in-progress`) or meant to be started next (`planned`). */
|
|
31
|
+
state: 'planned' | 'started';
|
|
32
|
+
/** Who claimed it: a session URL, or any other word unique to the claimant. */
|
|
33
|
+
by: string;
|
|
34
|
+
/** When, as a UTC instant to the second (`2026-10-12T01:00:00Z`). */
|
|
35
|
+
at: string;
|
|
36
|
+
}>;
|
|
37
|
+
export type IssueClaimComment = Readonly<{
|
|
38
|
+
kind: 'released';
|
|
39
|
+
} | {
|
|
40
|
+
kind: 'standing';
|
|
41
|
+
claim: IssueClaim;
|
|
42
|
+
}>;
|
|
43
|
+
/** The record line, then `prose`. */
|
|
44
|
+
export declare const writeIssueClaimComment: (claim: IssueClaim, prose: string) => string;
|
|
45
|
+
/** The record line saying the claim was given up, and `prose`. */
|
|
46
|
+
export declare const writeReleasedIssueClaimComment: (prose: string) => string;
|
|
47
|
+
/** What the comment says, or `undefined` for a comment this module did not write. */
|
|
48
|
+
export declare const parseIssueClaimComment: (body: string) => IssueClaimComment | undefined;
|
|
49
|
+
/** Whether `claim` still holds the issue at `nowEpochMs`. */
|
|
50
|
+
export declare const issueClaimApplies: (claim: IssueClaim, nowEpochMs: number) => boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Reads `comments`, oldest first, for the oldest claim comment, and whether it
|
|
53
|
+
* still holds; `undefined` when there is none.
|
|
54
|
+
*/
|
|
55
|
+
export declare const readIssueClaim: (comments: readonly OwnComment[], nowEpochMs: number) => QueueComment<IssueClaimComment> | undefined;
|
|
56
|
+
//# sourceMappingURL=issue-claim.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-claim.d.mts","sourceRoot":"","sources":["../src/issue-claim.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGrE,0DAA0D;AAC1D,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,uEAAuE;IACvE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,+EAA+E;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CACtC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAC/D,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,sBAAsB,UAC1B,UAAU,SACV,MAAM,KACZ,MAKW,CAAC;AAEf,kEAAkE;AAClE,eAAO,MAAM,8BAA8B,UAAW,MAAM,KAAG,MACN,CAAC;AAE1D,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,SAC3B,MAAM,KACX,iBAAiB,GAAG,SAwBtB,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,UACrB,UAAU,cACL,MAAM,KACjB,OASF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,aACf,SAAS,UAAU,EAAE,cACnB,MAAM,KACjB,YAAY,CAAC,iBAAiB,CAAC,GAAG,SAepC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
import { CLOCK_SKEW_MINUTES } from './claim.mjs';
|
|
27
|
+
import { epochMsOf } from './timestamp.mjs';
|
|
28
|
+
|
|
29
|
+
export const PLANNED_CLAIM_LIFETIME_HOURS = 24;
|
|
30
|
+
|
|
31
|
+
export const writeIssueClaimComment = (claim, prose) => [
|
|
32
|
+
`${MARKER} state=${claim.state} by=${claim.by} at=${claim.at} -->`,
|
|
33
|
+
'',
|
|
34
|
+
prose.trim(),
|
|
35
|
+
].join('\n');
|
|
36
|
+
|
|
37
|
+
export const writeReleasedIssueClaimComment = (prose) => [`${MARKER} released -->`, '', prose.trim()].join('\n');
|
|
38
|
+
|
|
39
|
+
export const parseIssueClaimComment = (body) => {
|
|
40
|
+
const first = body.trim().split(/\r?\n/u, 1)[0]?.trim();
|
|
41
|
+
if (first === undefined) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
if (first === `${MARKER} released -->`) {
|
|
45
|
+
return { kind: 'released' };
|
|
46
|
+
}
|
|
47
|
+
const groups = STANDING_LINE.exec(first)?.groups;
|
|
48
|
+
const state = groups?.['state'];
|
|
49
|
+
const by = groups?.['by'];
|
|
50
|
+
const at = groups?.['at'];
|
|
51
|
+
return by === undefined ||
|
|
52
|
+
at === undefined ||
|
|
53
|
+
(state !== 'planned' && state !== 'started')
|
|
54
|
+
? undefined
|
|
55
|
+
: { kind: 'standing', claim: { state, by, at } };
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const issueClaimApplies = (claim, nowEpochMs) => {
|
|
59
|
+
const at = epochMsOf(claim.at);
|
|
60
|
+
return (at !== undefined &&
|
|
61
|
+
at - CLOCK_SKEW_MINUTES * MS_PER_MINUTE <= nowEpochMs &&
|
|
62
|
+
(claim.state === 'started' ||
|
|
63
|
+
nowEpochMs < at + PLANNED_CLAIM_LIFETIME_HOURS * MS_PER_HOUR));
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
export const readIssueClaim = (comments, nowEpochMs) => {
|
|
70
|
+
for (const { id, body } of comments) {
|
|
71
|
+
const says = parseIssueClaimComment(body);
|
|
72
|
+
if (says !== undefined) {
|
|
73
|
+
return {
|
|
74
|
+
commentId: id,
|
|
75
|
+
says,
|
|
76
|
+
applies: says.kind === 'standing' && issueClaimApplies(says.claim, nowEpochMs),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
};
|
|
82
|
+
const MS_PER_MINUTE = 60_000;
|
|
83
|
+
const MS_PER_HOUR = 60 * MS_PER_MINUTE;
|
|
84
|
+
|
|
85
|
+
const MARKER = '<!-- start-issue:claim';
|
|
86
|
+
const STANDING_LINE = /^<!-- start-issue:claim state=(?<state>planned|started) by=(?<by>[^\s>]+) at=(?<at>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z) -->$/u;
|
|
87
|
+
//# sourceMappingURL=issue-claim.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-claim.mjs","sourceRoot":"","sources":["../src/issue-claim.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How soon an open issue should be started: one `priority:<tier>` label each,
|
|
3
|
+
* decided when the issue is filed. What each tier means, and how an issue is
|
|
4
|
+
* placed in one, is `docs/issue-priority.md`.
|
|
5
|
+
*
|
|
6
|
+
* These are issue labels. A pull request's place in the merge queue is
|
|
7
|
+
* `priority:high` / `priority:low` (`labels.mts`), which no issue carries.
|
|
8
|
+
*/
|
|
9
|
+
/** The tier the one `priority:<tier>` label names, `none`, or `several`. */
|
|
10
|
+
export declare const issuePriorityOfLabels: (labels: readonly string[]) => IssuePriority | 'none' | 'several';
|
|
11
|
+
/**
|
|
12
|
+
* Where an issue goes in the order it is started in, as a sort key: `S` first,
|
|
13
|
+
* then `A`, `B` and `C`, then one with no tier or several, then `D`. What
|
|
14
|
+
* nobody has placed is not known to matter less than what was placed last.
|
|
15
|
+
* `hold` and `close` rank with no tier here; whoever takes issues in this order
|
|
16
|
+
* leaves them out first.
|
|
17
|
+
*/
|
|
18
|
+
export declare const issueStartRank: (labels: readonly string[]) => number;
|
|
19
|
+
/** The tier as written on a command line, or `undefined` for anything else. */
|
|
20
|
+
export declare const parseIssuePriority: (raw: string) => IssuePriority | undefined;
|
|
21
|
+
export declare const issuePriorityLabel: (priority: IssuePriority) => `priority:${IssuePriority}`;
|
|
22
|
+
/**
|
|
23
|
+
* Every tier, the order `docs/issue-priority.md` lists them in.
|
|
24
|
+
*
|
|
25
|
+
* - `S` — speeds up the work on everything else now: CI, `check-changed`, the
|
|
26
|
+
* merge queue, the review loop, a step a person does by hand most days.
|
|
27
|
+
* - `A` — what the rest of that stands on, a step a person does by hand on
|
|
28
|
+
* every release or deploy, a security issue, or a bug real users meet that
|
|
29
|
+
* stops what they came to do.
|
|
30
|
+
* - `B` — the other bugs in an app with users or in a published package, and
|
|
31
|
+
* smaller gains in speed.
|
|
32
|
+
* - `C` — documents, refactoring, small improvements and features.
|
|
33
|
+
* - `D` — an app nobody uses but its author, and large features.
|
|
34
|
+
* - `hold` — not to be started as things stand: code about to be replaced, or
|
|
35
|
+
* work waiting on a decision.
|
|
36
|
+
* - `close` — to be closed or folded into another issue at the next triage.
|
|
37
|
+
*
|
|
38
|
+
* `pr-manager`'s tier tooltips (`issue-tier-group.tsx`) repeat this list.
|
|
39
|
+
*/
|
|
40
|
+
export declare const ISSUE_PRIORITIES: readonly ['S', 'A', 'B', 'C', 'D', 'hold', 'close'];
|
|
41
|
+
export type IssuePriority = (typeof ISSUE_PRIORITIES)[number];
|
|
42
|
+
/** The tiers a new issue may be filed under: `close` is a verdict on one. */
|
|
43
|
+
export declare const FILING_PRIORITIES: readonly ["S", "A", "B", "C", "D", "hold"];
|
|
44
|
+
//# sourceMappingURL=issue-priority.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-priority.d.mts","sourceRoot":"","sources":["../src/issue-priority.mts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,WACxB,SAAS,MAAM,EAAE,KACxB,aAAa,GAAG,MAAM,GAAG,SAe3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,WAAY,SAAS,MAAM,EAAE,KAAG,MAM1D,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,QAAS,MAAM,KAAG,aAAa,GAAG,SACV,CAAC;AAExD,eAAO,MAAM,kBAAkB,aACnB,aAAa,KACtB,YAAY,aAAa,EAAqC,CAAC;AAElE;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gBAAgB,YAC3B,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,MAAM,EACN,OAAO,CACC,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,4CAOe,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export const issuePriorityOfLabels = (labels) => {
|
|
11
|
+
const carried = ISSUE_PRIORITIES.filter((priority) => labels.includes(issuePriorityLabel(priority)));
|
|
12
|
+
switch (carried.length) {
|
|
13
|
+
case 0:
|
|
14
|
+
return 'none';
|
|
15
|
+
case 1:
|
|
16
|
+
return carried[0] ?? 'none';
|
|
17
|
+
default:
|
|
18
|
+
return 'several';
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
export const issueStartRank = (labels) => {
|
|
29
|
+
const priority = issuePriorityOfLabels(labels);
|
|
30
|
+
return priority === 'none' || priority === 'several'
|
|
31
|
+
? UNPLACED_RANK
|
|
32
|
+
: rankOf(priority);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const parseIssuePriority = (raw) => ISSUE_PRIORITIES.find((priority) => priority === raw);
|
|
36
|
+
export const issuePriorityLabel = (priority) => `priority:${priority}`;
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
export const ISSUE_PRIORITIES = [
|
|
56
|
+
'S',
|
|
57
|
+
'A',
|
|
58
|
+
'B',
|
|
59
|
+
'C',
|
|
60
|
+
'D',
|
|
61
|
+
'hold',
|
|
62
|
+
'close',
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
export const FILING_PRIORITIES = [
|
|
66
|
+
'S',
|
|
67
|
+
'A',
|
|
68
|
+
'B',
|
|
69
|
+
'C',
|
|
70
|
+
'D',
|
|
71
|
+
'hold',
|
|
72
|
+
];
|
|
73
|
+
const UNPLACED_RANK = 4;
|
|
74
|
+
const rankOf = (priority) => {
|
|
75
|
+
switch (priority) {
|
|
76
|
+
case 'S':
|
|
77
|
+
return 0;
|
|
78
|
+
case 'A':
|
|
79
|
+
return 1;
|
|
80
|
+
case 'B':
|
|
81
|
+
return 2;
|
|
82
|
+
case 'C':
|
|
83
|
+
return 3;
|
|
84
|
+
case 'D':
|
|
85
|
+
return 5;
|
|
86
|
+
case 'hold':
|
|
87
|
+
case 'close':
|
|
88
|
+
return UNPLACED_RANK;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=issue-priority.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-priority.mjs","sourceRoot":"","sources":["../src/issue-priority.mts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAAyB,EACW,EAAE;IACtC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAC9C,CAAC;IAEF,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC;QAEhB,KAAK,CAAC;YACJ,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAE9B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAyB,EAAU,EAAE;IAClE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,SAAS;QAClD,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAA6B,EAAE,CAC3E,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAAuB,EACM,EAAE,CAAC,YAAY,QAAQ,EAAW,CAAC;AAElE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,MAAM;IACN,OAAO;CACC,CAAC;AAIX,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,MAAM;CACqC,CAAC;AAE9C,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,MAAM,GAAG,CAAC,QAAuB,EAAU,EAAE;IACjD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,GAAG;YACN,OAAO,CAAC,CAAC;QAEX,KAAK,GAAG;YACN,OAAO,CAAC,CAAC;QAEX,KAAK,GAAG;YACN,OAAO,CAAC,CAAC;QAEX,KAAK,GAAG;YACN,OAAO,CAAC,CAAC;QAEX,KAAK,GAAG;YACN,OAAO,CAAC,CAAC;QAEX,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC,CAAC"}
|
package/dist/labels.d.mts
CHANGED
|
@@ -50,7 +50,8 @@ export declare const AUTO_REBASE_LABEL = "auto-rebase";
|
|
|
50
50
|
* labelled `priority:low` last, the version pull request included.
|
|
51
51
|
* They decide nothing else — what `Merge-After:`, a stack or `blocks-release`
|
|
52
52
|
* holds back stays held, and a pull request already in flight is watched
|
|
53
|
-
* whatever it carries. One carrying both counts as neither.
|
|
53
|
+
* whatever it carries. One carrying both counts as neither. They are pull
|
|
54
|
+
* request labels: an issue's is a tier (`issue-priority.mts`).
|
|
54
55
|
* {@link PRIORITY_MID_LABEL} is not read there: it is the same as carrying
|
|
55
56
|
* neither.
|
|
56
57
|
*/
|
|
@@ -70,8 +71,9 @@ export declare const PRIORITY_MID_LABEL = "priority:mid";
|
|
|
70
71
|
export declare const PENDING_LABEL = "pending";
|
|
71
72
|
/**
|
|
72
73
|
* The label that says someone has started an issue, before there is a pull
|
|
73
|
-
* request to say so. `start-issue` puts it on,
|
|
74
|
-
*
|
|
74
|
+
* request to say so. `start-issue` puts it on, with a claim comment saying who
|
|
75
|
+
* (`issue-claim.mts`), and refuses an issue someone else claimed or that
|
|
76
|
+
* carries it unclaimed, so that two sessions do not pick up the same one; the
|
|
75
77
|
* Pull Requests Manager page and `pr-report` show a startable issue carrying it
|
|
76
78
|
* as in progress, as they show one an open pull request closes
|
|
77
79
|
* (`start-after.mts`'s `progressOf`). Nothing takes it off when the work
|
|
@@ -82,6 +84,7 @@ export declare const IN_PROGRESS_LABEL = "in-progress";
|
|
|
82
84
|
* The label that says someone means to start an issue next. It holds nothing
|
|
83
85
|
* back — `start-issue` takes it off as it puts {@link IN_PROGRESS_LABEL} on —
|
|
84
86
|
* and only tells whoever is choosing what to start that this one is spoken for;
|
|
87
|
+
* `start-issue --plan` puts it on with a claim comment saying by whom;
|
|
85
88
|
* the page and `pr-report` show a startable issue carrying it as planned.
|
|
86
89
|
*/
|
|
87
90
|
export declare const PLANNED_LABEL = "planned";
|
package/dist/labels.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labels.d.mts","sourceRoot":"","sources":["../src/labels.mts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"labels.d.mts","sourceRoot":"","sources":["../src/labels.mts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAEnD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,YAAY,CAAC"}
|
package/dist/labels.mjs
CHANGED
|
@@ -54,6 +54,7 @@ export const AUTO_REBASE_LABEL = 'auto-rebase';
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
|
|
57
|
+
|
|
57
58
|
export const PRIORITY_HIGH_LABEL = 'priority:high';
|
|
58
59
|
export const PRIORITY_LOW_LABEL = 'priority:low';
|
|
59
60
|
|
|
@@ -77,6 +78,7 @@ export const PENDING_LABEL = 'pending';
|
|
|
77
78
|
|
|
78
79
|
|
|
79
80
|
|
|
81
|
+
|
|
80
82
|
export const IN_PROGRESS_LABEL = 'in-progress';
|
|
81
83
|
|
|
82
84
|
|
|
@@ -84,5 +86,6 @@ export const IN_PROGRESS_LABEL = 'in-progress';
|
|
|
84
86
|
|
|
85
87
|
|
|
86
88
|
|
|
89
|
+
|
|
87
90
|
export const PLANNED_LABEL = 'planned';
|
|
88
91
|
//# sourceMappingURL=labels.mjs.map
|
package/dist/labels.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labels.mjs","sourceRoot":"","sources":["../src/labels.mts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"labels.mjs","sourceRoot":"","sources":["../src/labels.mts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC"}
|
package/dist/queue-owner.d.mts
CHANGED
|
@@ -39,7 +39,7 @@ export type QueueOwner = Readonly<{
|
|
|
39
39
|
reason: string;
|
|
40
40
|
}>;
|
|
41
41
|
/** Every reason the worker writes into a set-aside comment. */
|
|
42
|
-
export declare const SET_ASIDE_REASONS: readonly ['already-in-base', 'arm-failed', 'awaiting-bypass', 'checks-failed', 'not-merging', 'push-failed', 'rebase-failed', 'unlabel-failed', 'watch-timeout'];
|
|
42
|
+
export declare const SET_ASIDE_REASONS: readonly ['already-in-base', 'arm-failed', 'awaiting-bypass', 'checks-failed', 'checks-not-started', 'head-out-of-sync', 'not-merging', 'push-failed', 'read-failed', 'rebase-failed', 'unlabel-failed', 'watch-timeout'];
|
|
43
43
|
export type SetAsideReason = (typeof SET_ASIDE_REASONS)[number];
|
|
44
44
|
/**
|
|
45
45
|
* Who moves `pr` next, or `undefined` for a pull request the queue does not
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-owner.d.mts","sourceRoot":"","sources":["../src/queue-owner.mts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAM9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,YAAY,YAAI,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,YAC5B,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,CACP,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,UAAU,OAAQ,eAAe,KAAG,UAAU,GAAG,SAoE7D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UACrB,WAAW,YACR,aAAa,WACd,QAAQ,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,KACD,UAAU,GAAG,SAeZ,CAAC;AAEL,eAAO,MAAM,gBAAgB,WAAY,MAAM,KAAG,MAAM,IAAI,cACjC,CAAC;
|
|
1
|
+
{"version":3,"file":"queue-owner.d.mts","sourceRoot":"","sources":["../src/queue-owner.mts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAM9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,YAAY,YAAI,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,YAC5B,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,CACP,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,UAAU,OAAQ,eAAe,KAAG,UAAU,GAAG,SAoE7D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,UACrB,WAAW,YACR,aAAa,WACd,QAAQ,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,KACD,UAAU,GAAG,SAeZ,CAAC;AAEL,eAAO,MAAM,gBAAgB,WAAY,MAAM,KAAG,MAAM,IAAI,cACjC,CAAC;AAgF5B,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC;IACtC,wDAAwD;IACxD,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC"}
|