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.
Files changed (49) hide show
  1. package/README.md +5 -2
  2. package/dist/branch-rules.d.mts +30 -0
  3. package/dist/branch-rules.d.mts.map +1 -0
  4. package/dist/branch-rules.mjs +71 -0
  5. package/dist/branch-rules.mjs.map +1 -0
  6. package/dist/claim.d.mts +15 -8
  7. package/dist/claim.d.mts.map +1 -1
  8. package/dist/claim.mjs +2 -1
  9. package/dist/claim.mjs.map +1 -1
  10. package/dist/index.d.mts +3 -0
  11. package/dist/index.d.mts.map +1 -1
  12. package/dist/index.mjs +3 -0
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/issue-claim.d.mts +56 -0
  15. package/dist/issue-claim.d.mts.map +1 -0
  16. package/dist/issue-claim.mjs +87 -0
  17. package/dist/issue-claim.mjs.map +1 -0
  18. package/dist/issue-priority.d.mts +44 -0
  19. package/dist/issue-priority.d.mts.map +1 -0
  20. package/dist/issue-priority.mjs +91 -0
  21. package/dist/issue-priority.mjs.map +1 -0
  22. package/dist/labels.d.mts +6 -3
  23. package/dist/labels.d.mts.map +1 -1
  24. package/dist/labels.mjs +3 -0
  25. package/dist/labels.mjs.map +1 -1
  26. package/dist/queue-owner.d.mts +1 -1
  27. package/dist/queue-owner.d.mts.map +1 -1
  28. package/dist/queue-owner.mjs +18 -0
  29. package/dist/queue-owner.mjs.map +1 -1
  30. package/dist/ruleset.d.mts +6 -6
  31. package/dist/set-aside.d.mts +2 -1
  32. package/dist/set-aside.d.mts.map +1 -1
  33. package/dist/set-aside.mjs +2 -0
  34. package/dist/set-aside.mjs.map +1 -1
  35. package/package.json +9 -9
  36. package/src/branch-rules.mts +105 -0
  37. package/src/branch-rules.test.mts +221 -0
  38. package/src/claim.mts +10 -9
  39. package/src/index.mts +3 -0
  40. package/src/issue-claim.mts +138 -0
  41. package/src/issue-claim.test.mts +149 -0
  42. package/src/issue-priority.mts +116 -0
  43. package/src/issue-priority.test.mts +71 -0
  44. package/src/labels.mts +6 -3
  45. package/src/queue-owner.mts +21 -0
  46. package/src/queue-owner.test.mts +2 -0
  47. package/src/ruleset.mts +6 -6
  48. package/src/set-aside.mts +3 -1
  49. 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. **`code-owners.mts`**, **`review-hold.mts`** — who
61
- owns a change, and whether a review holds a pull request.
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` and `awaiting-bypass`, until the
7
- * base does, when it tries the rebase again. A session fixing that pull request
8
- * is then racing the script, and a second session, or the one that opened the
9
- * pull request and is woken by the set-aside comment, may be fixing the same
10
- * failure. The leases on every push keep any of them from overwriting another's
11
- * work, but not from doing it twice. So whoever starts on one says so first in
12
- * a comment whose first line is a hidden record this module writes and reads,
13
- * and everyone else — the script included — leaves that pull request to it.
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
@@ -1 +1 @@
1
- {"version":3,"file":"claim.d.mts","sourceRoot":"","sources":["../src/claim.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;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"}
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';
@@ -1 +1 @@
1
- {"version":3,"file":"claim.mjs","sourceRoot":"","sources":["../src/claim.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;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,kBAAkB,GAAG,CAAC,CAAC;AAE7B,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"}
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';
@@ -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';
@@ -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, and refuses an issue that
74
- * already carries it, so that two sessions do not pick up the same one; the
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";
@@ -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;;;;;;;;;GASG;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;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,YAAY,CAAC"}
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
@@ -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;;;;;;;;;GASG;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;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC"}
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"}
@@ -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;AA8D5B,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"}
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"}