pr-report-core 0.0.6 → 0.1.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/dist/labels.d.mts CHANGED
@@ -69,4 +69,22 @@ export declare const PRIORITY_MID_LABEL = "priority:mid";
69
69
  * `unblock-prs`: what is held is simply not labelled `merge-queued`.
70
70
  */
71
71
  export declare const PENDING_LABEL = "pending";
72
+ /**
73
+ * The label that says someone has started an issue, before there is a pull
74
+ * request to say so. `start-issue` puts it on, and refuses an issue that
75
+ * already carries it, so that two sessions do not pick up the same one; the
76
+ * Pull Requests Manager page and `pr-report` show a startable issue carrying
77
+ * it as in progress, as they show one an open pull request closes
78
+ * (`start-after.mts`'s `progressOf`). Nothing takes it off when the work
79
+ * merges: the issue closes, and the label with it stops mattering.
80
+ */
81
+ export declare const IN_PROGRESS_LABEL = "in-progress";
82
+ /**
83
+ * The label that says someone means to start an issue next. It holds nothing
84
+ * back — `start-issue` takes it off as it puts {@link IN_PROGRESS_LABEL} on —
85
+ * and only tells whoever is choosing what to start that this one is spoken
86
+ * for; the page and `pr-report` show a startable issue carrying it as
87
+ * planned.
88
+ */
89
+ export declare const PLANNED_LABEL = "planned";
72
90
  //# sourceMappingURL=labels.d.mts.map
@@ -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;;;;;;;;;;;;;;;GAeG;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"}
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;;;;;;;;;;;;;;;GAeG;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;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,YAAY,CAAC"}
package/dist/labels.mjs CHANGED
@@ -69,4 +69,22 @@ export const PRIORITY_MID_LABEL = 'priority:mid';
69
69
 
70
70
 
71
71
  export const PENDING_LABEL = 'pending';
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+ export const IN_PROGRESS_LABEL = 'in-progress';
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+ export const PLANNED_LABEL = 'planned';
72
90
  //# 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;;;;;;;;;;;;;;;GAeG;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"}
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;;;;;;;;;;;;;;;GAeG;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;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.mts","sourceRoot":"","sources":["../src/report.mts"],"names":[],"mappings":"AAAA,yDAAyD;AAOzD,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACP,WAAW,EAEX,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,wJAarB,QAAQ,CAAC;IACV,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACnD,CAAC,KAAG,QAiBQ,CAAC;AAuCd,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;CACxC,CAAC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY,8DAMtB,QAAQ,CAAC;IACV;;;;OAIG;IACH,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC,KAAG,cA6EJ,CAAC"}
1
+ {"version":3,"file":"report.d.mts","sourceRoot":"","sources":["../src/report.mts"],"names":[],"mappings":"AAAA,yDAAyD;AAOzD,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,OAAO,EACP,WAAW,EAEX,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,wJAarB,QAAQ,CAAC;IACV,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;OAGG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACnD,CAAC,KAAG,QAiBQ,CAAC;AAuCd,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;CACxC,CAAC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY,8DAMtB,QAAQ,CAAC;IACV;;;;OAIG;IACH,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC,KAAG,cA6EJ,CAAC"}
package/dist/report.mjs CHANGED
@@ -4,7 +4,7 @@ import { summarizeChecks } from './checks.mjs';
4
4
  import { SKIP_CI_LABEL } from './labels.mjs';
5
5
  import { parseMergeAfter } from './merge-after.mjs';
6
6
  import { findStackParents } from './stack.mjs';
7
- import { decideStartStates, inheritStartAfter, issuesInProgress, withProgress, } from './start-after.mjs';
7
+ import { decideStartStates, inheritStartAfter, issuesInProgress, progressOf, withProgress, } from './start-after.mjs';
8
8
  import { buildMergeAfterForest } from './tree.mjs';
9
9
 
10
10
 
@@ -45,7 +45,7 @@ const reportIssues = (issues, pulls, references) => {
45
45
  const worked = issuesInProgress(pulls);
46
46
  return issues.map((issue) => ({
47
47
  ...issue,
48
- start: withProgress(states.get(issue.number) ?? 'free', worked.has(issue.number)),
48
+ start: withProgress(states.get(issue.number) ?? 'free', progressOf(issue.labels, worked.has(issue.number))),
49
49
  named: issue.startAfter.map((number) => ({
50
50
  number,
51
51
  status: statusOf(number),
@@ -1 +1 @@
1
- {"version":3,"file":"report.mjs","sourceRoot":"","sources":["../src/report.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.mjs","sourceRoot":"","sources":["../src/report.mts"],"names":[],"mappings":"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"}
@@ -38,14 +38,39 @@ export type StartState = 'attention' | 'blocked' | 'cycle' | 'free' | 'ready';
38
38
  */
39
39
  export declare const waitsFor: (body: string, blockedBy: readonly number[]) => readonly number[];
40
40
  /**
41
- * How an issue is shown: its {@link StartState}, or `in-progress` when it is
42
- * startable and an open pull request closes it. Kept apart from the start
43
- * state in the rules (`docs/issue-start-after.md`): one that is blocked or
44
- * on a cycle says so whether or not someone has started it.
41
+ * How an issue is shown: its {@link StartState}, or how far someone has got
42
+ * with it when it is startable ({@link IssueProgress}). Kept apart from the
43
+ * start state in the rules (`docs/issue-start-after.md`): one that is blocked
44
+ * or on a cycle says so whether or not someone has started it.
45
45
  */
46
- export type IssueStartState = StartState | 'in-progress';
47
- /** The {@link IssueStartState} of an issue, given whether it is worked on. */
48
- export declare const withProgress: (state: StartState, worked: boolean) => IssueStartState;
46
+ export type IssueStartState = StartState | 'in-progress' | 'planned';
47
+ /**
48
+ * How far someone has got with an issue, whatever it waits for:
49
+ *
50
+ * - `in-progress` — an open pull request closes it, or it is labelled
51
+ * `in-progress` (`labels.mts`), which is how it says so before there is one.
52
+ * - `planned` — it is labelled `planned`: someone means to start it next.
53
+ * - `none` — neither.
54
+ */
55
+ export type IssueProgress = 'in-progress' | 'none' | 'planned';
56
+ /**
57
+ * The {@link IssueProgress} of an issue carrying `labels`, given whether an
58
+ * open pull request closes it. Being worked on wins over being planned: one
59
+ * carrying both was started without the plan being taken off.
60
+ */
61
+ export declare const progressOf: (labels: readonly Readonly<{
62
+ name: string;
63
+ }>[], closedByOpenPull: boolean) => IssueProgress;
64
+ /**
65
+ * Whether `labels` holds `name`, whatever its case. GitHub's label names
66
+ * are: adding `in-progress` to a repository that has `In-Progress` puts that
67
+ * one on, so an exact match would not see the label it just added.
68
+ */
69
+ export declare const hasLabel: (labels: readonly Readonly<{
70
+ name: string;
71
+ }>[], name: string) => boolean;
72
+ /** The {@link IssueStartState} of an issue, given how far it has got. */
73
+ export declare const withProgress: (state: StartState, progress: IssueProgress) => IssueStartState;
49
74
  /** The issues an open pull request closes: the ones being worked on. */
50
75
  export declare const issuesInProgress: (pulls: readonly Readonly<{
51
76
  linkedIssues: readonly Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"start-after.d.mts","sourceRoot":"","sources":["../src/start-after.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,SACb,MAAM,aACD,SAAS,MAAM,EAAE,KAC3B,SAAS,MAAM,EAAuD,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,aAAa,CAAC;AAEzD,8EAA8E;AAC9E,eAAO,MAAM,YAAY,UAChB,UAAU,UACT,OAAO,KACd,eACwE,CAAC;AAE5E,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,UACpB,SAAS,QAAQ,CAAC;IACvB,YAAY,EAAE,SAAS,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CACvD,CAAC,EAAE,KACH,WAAW,CAAC,MAAM,CAKlB,CAAC;AAEJ;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAClC;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,GACD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAC3D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,UAAW,eAAe,KAAG,eAY1D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,WACpB,SAAS,QAAQ,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC,EAAE,YACM,CAAC,MAAM,EAAE,MAAM,KAAK,eAAe,KAC5C,WAAW,CAAC,MAAM,EAAE,UAAU,CA6BhC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC;;;;OAIG;IACH,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,yCAI3B,QAAQ,CAAC;IACV,KAAK,EAAE,SAAS,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,EAAE,CAAC;IAC1E,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IACrD,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC,KAAG,WAAW,CAAC,MAAM,EAAE,cAAc,CAoCtC,CAAC"}
1
+ {"version":3,"file":"start-after.d.mts","sourceRoot":"","sources":["../src/start-after.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,SACb,MAAM,aACD,SAAS,MAAM,EAAE,KAC3B,SAAS,MAAM,EAAuD,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,UAAU,WACb,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,oBAC3B,OAAO,KACxB,aAKW,CAAC;AAEf;;;;GAIG;AACH,eAAO,MAAM,QAAQ,WACX,SAAS,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,QACvC,MAAM,KACX,OACsE,CAAC;AAE1E,yEAAyE;AACzE,eAAO,MAAM,YAAY,UAChB,UAAU,YACP,aAAa,KACtB,eAGQ,CAAC;AAEZ,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,UACpB,SAAS,QAAQ,CAAC;IACvB,YAAY,EAAE,SAAS,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;CACvD,CAAC,EAAE,KACH,WAAW,CAAC,MAAM,CAKlB,CAAC;AAEJ;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAClC;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,GACD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAC3D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,UAAW,eAAe,KAAG,eAY1D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,WACpB,SAAS,QAAQ,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC,EAAE,YACM,CAAC,MAAM,EAAE,MAAM,KAAK,eAAe,KAC5C,WAAW,CAAC,MAAM,EAAE,UAAU,CA6BhC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC;;;;OAIG;IACH,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,yCAI3B,QAAQ,CAAC;IACV,KAAK,EAAE,SAAS,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,EAAE,CAAC;IAC1E,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IACrD,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC,KAAG,WAAW,CAAC,MAAM,EAAE,cAAc,CAoCtC,CAAC"}
@@ -4,6 +4,7 @@
4
4
 
5
5
 
6
6
  import { Arr } from 'ts-data-forge';
7
+ import { IN_PROGRESS_LABEL, PLANNED_LABEL } from './labels.mjs';
7
8
  import { findMergeAfterCycles, parseStartAfter } from './merge-after.mjs';
8
9
 
9
10
 
@@ -14,7 +15,25 @@ import { findMergeAfterCycles, parseStartAfter } from './merge-after.mjs';
14
15
 
15
16
  export const waitsFor = (body, blockedBy) => Arr.uniq(parseStartAfter(body).concat(blockedBy));
16
17
 
17
- export const withProgress = (state, worked) => worked && (state === 'free' || state === 'ready') ? 'in-progress' : state;
18
+
19
+
20
+
21
+
22
+ export const progressOf = (labels, closedByOpenPull) => closedByOpenPull || hasLabel(labels, IN_PROGRESS_LABEL)
23
+ ? 'in-progress'
24
+ : hasLabel(labels, PLANNED_LABEL)
25
+ ? 'planned'
26
+ : 'none';
27
+
28
+
29
+
30
+
31
+
32
+ export const hasLabel = (labels, name) => labels.some((label) => label.name.toLowerCase() === name.toLowerCase());
33
+
34
+ export const withProgress = (state, progress) => progress !== 'none' && (state === 'free' || state === 'ready')
35
+ ? progress
36
+ : state;
18
37
 
19
38
  export const issuesInProgress = (pulls) => new Set(pulls.flatMap(({ linkedIssues }) => linkedIssues.map(({ number }) => number)));
20
39
 
@@ -1 +1 @@
1
- {"version":3,"file":"start-after.mjs","sourceRoot":"","sources":["../src/start-after.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"start-after.mjs","sourceRoot":"","sources":["../src/start-after.mts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pr-report-core",
3
- "version": "0.0.6",
3
+ "version": "0.1.0",
4
4
  "private": false,
5
5
  "description": "What a GitHub merge queue driven by labels and `Merge-After:` trailers decides about the open pull requests — verdicts, merge order, stacks, owners — with no I/O, shared by the GitHub Pull Requests Manager page and the unblock-prs worker",
6
6
  "keywords": [
@@ -49,10 +49,10 @@
49
49
  "cspell": "10.4.0",
50
50
  "dedent": "1.7.2",
51
51
  "eslint": "10.13.0",
52
- "eslint-config-typed": "5.20.1",
53
- "eslint-plugin-ts-data-forge": "0.10.4",
54
- "eslint-plugin-ts-fortress": "1.3.9",
55
- "eslint-plugin-ts-type-forge": "0.8.14",
52
+ "eslint-config-typed": "7.1.0",
53
+ "eslint-plugin-ts-data-forge": "0.10.5",
54
+ "eslint-plugin-ts-fortress": "1.3.10",
55
+ "eslint-plugin-ts-type-forge": "0.8.15",
56
56
  "jiti": "2.7.0",
57
57
  "npm-run-all2": "9.0.4",
58
58
  "prettier": "3.9.10",
package/src/labels.mts CHANGED
@@ -77,3 +77,23 @@ export const PRIORITY_MID_LABEL = 'priority:mid';
77
77
  * `unblock-prs`: what is held is simply not labelled `merge-queued`.
78
78
  */
79
79
  export const PENDING_LABEL = 'pending';
80
+
81
+ /**
82
+ * The label that says someone has started an issue, before there is a pull
83
+ * request to say so. `start-issue` puts it on, and refuses an issue that
84
+ * already carries it, so that two sessions do not pick up the same one; the
85
+ * Pull Requests Manager page and `pr-report` show a startable issue carrying
86
+ * it as in progress, as they show one an open pull request closes
87
+ * (`start-after.mts`'s `progressOf`). Nothing takes it off when the work
88
+ * merges: the issue closes, and the label with it stops mattering.
89
+ */
90
+ export const IN_PROGRESS_LABEL = 'in-progress';
91
+
92
+ /**
93
+ * The label that says someone means to start an issue next. It holds nothing
94
+ * back — `start-issue` takes it off as it puts {@link IN_PROGRESS_LABEL} on —
95
+ * and only tells whoever is choosing what to start that this one is spoken
96
+ * for; the page and `pr-report` show a startable issue carrying it as
97
+ * planned.
98
+ */
99
+ export const PLANNED_LABEL = 'planned';
package/src/report.mts CHANGED
@@ -9,6 +9,7 @@ import {
9
9
  decideStartStates,
10
10
  inheritStartAfter,
11
11
  issuesInProgress,
12
+ progressOf,
12
13
  withProgress,
13
14
  type ReferenceStatus,
14
15
  } from './start-after.mjs';
@@ -83,8 +84,8 @@ export const buildReport = ({
83
84
 
84
85
  /**
85
86
  * Each open issue with how it stands for being started
86
- * (`docs/issue-start-after.md`): its start state, or `in-progress` when it
87
- * is startable and an open pull request closes it, and where each thing it
87
+ * (`docs/issue-start-after.md`): its start state, or how far someone has
88
+ * got with it when it is startable (`progressOf`), and where each thing it
88
89
  * names stands.
89
90
  */
90
91
  const reportIssues = (
@@ -109,7 +110,7 @@ const reportIssues = (
109
110
  ...issue,
110
111
  start: withProgress(
111
112
  states.get(issue.number) ?? 'free',
112
- worked.has(issue.number),
113
+ progressOf(issue.labels, worked.has(issue.number)),
113
114
  ),
114
115
  named: issue.startAfter.map((number) => ({
115
116
  number,
@@ -379,6 +379,36 @@ describe(buildReport, () => {
379
379
 
380
380
  assert.strictEqual(report.issues[0]?.start, 'attention');
381
381
  });
382
+
383
+ test('reads the in-progress and planned labels of a startable issue', () => {
384
+ const report = buildReport({
385
+ repo: { owner: 'o', name: 'r' },
386
+ defaultBranch: 'main',
387
+ generatedAt: '2026-10-24T00:00:00Z',
388
+ required: [],
389
+ authenticated: true,
390
+ pulls: [],
391
+ merged: [],
392
+ mergedWithinDays: 7,
393
+ issues: [
394
+ labelled(1, [], 'in-progress'),
395
+ labelled(2, [], 'planned'),
396
+ // Blocked says so, whatever is planned for it.
397
+ labelled(3, [1], 'planned'),
398
+ ],
399
+ issuesLimit: 30,
400
+ references: new Map<number, ReferenceStatus>(),
401
+ });
402
+
403
+ assert.deepStrictEqual(
404
+ report.issues.map(({ number, start }) => ({ number, start })),
405
+ [
406
+ { number: 1, start: 'in-progress' },
407
+ { number: 2, start: 'planned' },
408
+ { number: 3, start: 'blocked' },
409
+ ],
410
+ );
411
+ });
382
412
  });
383
413
 
384
414
  const issue = (
@@ -398,3 +428,13 @@ const issue = (
398
428
  startAfter,
399
429
  misplacedMergeAfter,
400
430
  }) as const;
431
+
432
+ const labelled = (
433
+ number: number,
434
+ startAfter: readonly number[],
435
+ name: string,
436
+ ): OpenIssue =>
437
+ ({
438
+ ...issue(number, startAfter),
439
+ labels: [{ name, color: 'cccccc', description: '' }],
440
+ }) as const;
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { Arr } from 'ts-data-forge';
8
+ import { IN_PROGRESS_LABEL, PLANNED_LABEL } from './labels.mjs';
8
9
  import { findMergeAfterCycles, parseStartAfter } from './merge-after.mjs';
9
10
 
10
11
  /**
@@ -48,19 +49,57 @@ export const waitsFor = (
48
49
  ): readonly number[] => Arr.uniq(parseStartAfter(body).concat(blockedBy));
49
50
 
50
51
  /**
51
- * How an issue is shown: its {@link StartState}, or `in-progress` when it is
52
- * startable and an open pull request closes it. Kept apart from the start
53
- * state in the rules (`docs/issue-start-after.md`): one that is blocked or
54
- * on a cycle says so whether or not someone has started it.
52
+ * How an issue is shown: its {@link StartState}, or how far someone has got
53
+ * with it when it is startable ({@link IssueProgress}). Kept apart from the
54
+ * start state in the rules (`docs/issue-start-after.md`): one that is blocked
55
+ * or on a cycle says so whether or not someone has started it.
55
56
  */
56
- export type IssueStartState = StartState | 'in-progress';
57
+ export type IssueStartState = StartState | 'in-progress' | 'planned';
57
58
 
58
- /** The {@link IssueStartState} of an issue, given whether it is worked on. */
59
+ /**
60
+ * How far someone has got with an issue, whatever it waits for:
61
+ *
62
+ * - `in-progress` — an open pull request closes it, or it is labelled
63
+ * `in-progress` (`labels.mts`), which is how it says so before there is one.
64
+ * - `planned` — it is labelled `planned`: someone means to start it next.
65
+ * - `none` — neither.
66
+ */
67
+ export type IssueProgress = 'in-progress' | 'none' | 'planned';
68
+
69
+ /**
70
+ * The {@link IssueProgress} of an issue carrying `labels`, given whether an
71
+ * open pull request closes it. Being worked on wins over being planned: one
72
+ * carrying both was started without the plan being taken off.
73
+ */
74
+ export const progressOf = (
75
+ labels: readonly Readonly<{ name: string }>[],
76
+ closedByOpenPull: boolean,
77
+ ): IssueProgress =>
78
+ closedByOpenPull || hasLabel(labels, IN_PROGRESS_LABEL)
79
+ ? 'in-progress'
80
+ : hasLabel(labels, PLANNED_LABEL)
81
+ ? 'planned'
82
+ : 'none';
83
+
84
+ /**
85
+ * Whether `labels` holds `name`, whatever its case. GitHub's label names
86
+ * are: adding `in-progress` to a repository that has `In-Progress` puts that
87
+ * one on, so an exact match would not see the label it just added.
88
+ */
89
+ export const hasLabel = (
90
+ labels: readonly Readonly<{ name: string }>[],
91
+ name: string,
92
+ ): boolean =>
93
+ labels.some((label) => label.name.toLowerCase() === name.toLowerCase());
94
+
95
+ /** The {@link IssueStartState} of an issue, given how far it has got. */
59
96
  export const withProgress = (
60
97
  state: StartState,
61
- worked: boolean,
98
+ progress: IssueProgress,
62
99
  ): IssueStartState =>
63
- worked && (state === 'free' || state === 'ready') ? 'in-progress' : state;
100
+ progress !== 'none' && (state === 'free' || state === 'ready')
101
+ ? progress
102
+ : state;
64
103
 
65
104
  /** The issues an open pull request closes: the ones being worked on. */
66
105
  export const issuesInProgress = (
@@ -2,6 +2,7 @@ import {
2
2
  decideStartStates,
3
3
  inheritStartAfter,
4
4
  issuesInProgress,
5
+ progressOf,
5
6
  referenceStatusOf,
6
7
  waitsFor,
7
8
  withProgress,
@@ -313,20 +314,66 @@ describe(waitsFor, () => {
313
314
  });
314
315
 
315
316
  describe(withProgress, () => {
316
- test('a startable issue an open pull request closes is in progress', () => {
317
- assert.strictEqual(withProgress('free', true), 'in-progress');
317
+ test('a startable issue someone has got to says how far', () => {
318
+ assert.strictEqual(withProgress('free', 'in-progress'), 'in-progress');
318
319
 
319
- assert.strictEqual(withProgress('ready', true), 'in-progress');
320
+ assert.strictEqual(withProgress('ready', 'in-progress'), 'in-progress');
320
321
 
321
- assert.strictEqual(withProgress('ready', false), 'ready');
322
+ assert.strictEqual(withProgress('free', 'planned'), 'planned');
323
+
324
+ assert.strictEqual(withProgress('ready', 'none'), 'ready');
322
325
  });
323
326
 
324
327
  test('one that is not startable says why, worked on or not', () => {
325
- assert.strictEqual(withProgress('blocked', true), 'blocked');
328
+ assert.strictEqual(withProgress('blocked', 'in-progress'), 'blocked');
329
+
330
+ assert.strictEqual(withProgress('cycle', 'in-progress'), 'cycle');
331
+
332
+ assert.strictEqual(withProgress('attention', 'planned'), 'attention');
333
+ });
334
+ });
335
+
336
+ describe(progressOf, () => {
337
+ test('an open pull request closing it is in progress', () => {
338
+ assert.strictEqual(progressOf([], true), 'in-progress');
339
+ });
340
+
341
+ test('so is the in-progress label, with no pull request yet', () => {
342
+ assert.strictEqual(
343
+ progressOf([{ name: 'bug' }, { name: 'in-progress' }], false),
344
+ 'in-progress',
345
+ );
346
+ });
347
+
348
+ test('the planned label is planned', () => {
349
+ assert.strictEqual(progressOf([{ name: 'planned' }], false), 'planned');
350
+ });
326
351
 
327
- assert.strictEqual(withProgress('cycle', true), 'cycle');
352
+ test('being worked on wins over being planned', () => {
353
+ assert.strictEqual(progressOf([{ name: 'planned' }], true), 'in-progress');
354
+
355
+ assert.strictEqual(
356
+ progressOf([{ name: 'planned' }, { name: 'in-progress' }], false),
357
+ 'in-progress',
358
+ );
359
+ });
360
+
361
+ test('neither, or a label only like them, is none', () => {
362
+ assert.strictEqual(progressOf([], false), 'none');
363
+
364
+ assert.strictEqual(
365
+ progressOf([{ name: 'in-progress-x' }, { name: 'planned-later' }], false),
366
+ 'none',
367
+ );
368
+ });
369
+
370
+ test('reads a label whatever its case, as GitHub does', () => {
371
+ assert.strictEqual(
372
+ progressOf([{ name: 'In-Progress' }], false),
373
+ 'in-progress',
374
+ );
328
375
 
329
- assert.strictEqual(withProgress('attention', true), 'attention');
376
+ assert.strictEqual(progressOf([{ name: 'Planned' }], false), 'planned');
330
377
  });
331
378
  });
332
379