@cesar-richard/git-connector-sdk 4.4.0 → 4.6.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 CHANGED
@@ -81,6 +81,39 @@ Tokens with the `gck_` prefix are immutable once minted; revoke and reissue via
81
81
 
82
82
  The `/v1/*` surface is designed to power activity reports (CRA, billable-time sheets, "what did I do this month"). The primitives below let you slice your data per-user, per-day, per-type.
83
83
 
84
+ ### Issues, tasks, incidents: you filter, we don't
85
+
86
+ git-connector collects and labels; **it does not decide what belongs in your report**. GitLab tasks, incidents and test cases come back from the same project endpoint as ordinary issues, so they are all ingested and all returned. If your CRA should only count real issues, filter on your side:
87
+
88
+ ```ts
89
+ const { data } = await client.GET("/v1/work-items", {
90
+ params: { query: { from, to } },
91
+ });
92
+ const issuesOnly = data.items.filter((w) => w.issueType === "issue");
93
+ ```
94
+
95
+ Two fields carry the kind, on `/v1/work-items`, `/v1/activities` and `/v1/deliverables`:
96
+
97
+ - **`issueType`** — normalised: `issue`, `task`, `incident`, `test_case`, or `other`. It is `null` on a PR/MR, which is not an issue-like item.
98
+ - **`originalType`** — the provider's own word, unmapped: `"task"` on GitLab, `"Feature"` on a GitHub org that defined it. `null` when the provider said nothing.
99
+
100
+ `other` is **not** a parse failure: it means the provider named a kind outside the normalised vocabulary. Read `originalType` then. This matters most on GitHub, whose issue types are defined per organisation — one org's `Epic` or `Spike` cannot be mapped onto a cross-provider taxonomy without inventing one, so it is deliberately left native. Branch on `source` if you need the raw values.
101
+
102
+ ### Closure, hierarchy, time tracking
103
+
104
+ The same three shapes carry what the providers say about an item beyond its labels. Everything is nullable, and **null means the provider said nothing — never zero, never "no"**.
105
+
106
+ - **`closedAt` / `closedBy`** — when, and by whom. Distinct from `mergedAt`: a PR/MR can be closed without merging, and an issue is never merged. `closedBy` is a login, joinable against `?author`.
107
+ - **`stateReason`** (GitHub) — `completed`, `not_planned` or `reopened`. **`not_planned` means the issue was closed without being done.** A delivery report that ignores it counts abandoned work as delivered. GitLab has no equivalent, so it is always null there.
108
+ - **`parentEpic`** (GitLab) — `{ id, iid, title, url }`, read from the issue's own payload. Epics themselves are *not* ingested (they live at group level), but this is enough to walk PR → issue → epic.
109
+ - **`parentIssueUrl` / `subIssues`** (GitHub) — the same hierarchy on the other provider, plus sub-issue progress.
110
+ - **`blockingCount` / `blockedByCount`** — two directions, reported separately on purpose: GitLab only counts what an issue *blocks*, so `blockedByCount` is null there. Do not read one as the inverse of the other.
111
+ - **`timeStats`** (GitLab) — `{ estimateSeconds, spentSeconds }`, straight from the project's time tracking.
112
+ - **`taskCompletion`** — checklist progress in the description.
113
+ - **`weight`, `dueDate`, `startDate`, `healthStatus`, `severity`** (GitLab) — planning metadata, verbatim. No scale is imposed; `severity` is meaningful when `issueType === "incident"`.
114
+
115
+ On PR/MR shapes (`/v1/activities` and `linkedActivities[]`): **`mergedBy`** and **`targetBranch`**. `mergedBy` is GitLab-only — GitHub's list payload omits it, so null there means unknown.
116
+
84
117
  ### What did I do today?
85
118
 
86
119
  ```ts
package/dist/schema.d.ts CHANGED
@@ -238,6 +238,56 @@ export interface components {
238
238
  source: "github" | "gitlab";
239
239
  repo: string;
240
240
  type: "pr" | "mr" | "issue";
241
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
242
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
243
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
244
+ originalType: string | null;
245
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
246
+ closedAt: string | null;
247
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
248
+ closedBy: string | null;
249
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
250
+ stateReason: "completed" | "not_planned" | "reopened" | null;
251
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
252
+ parentEpic: {
253
+ id: (string | number) | null;
254
+ iid: (string | number) | null;
255
+ title: string | null;
256
+ url: string | null;
257
+ } | null;
258
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
259
+ parentIssueUrl: string | null;
260
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
261
+ subIssues: {
262
+ total: string | number;
263
+ completed: string | number;
264
+ } | null;
265
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
266
+ blockingCount: (string | number) | null;
267
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
268
+ blockedByCount: (string | number) | null;
269
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
270
+ timeStats: {
271
+ estimateSeconds: string | number;
272
+ spentSeconds: string | number;
273
+ } | null;
274
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
275
+ taskCompletion: {
276
+ total: string | number;
277
+ completed: string | number;
278
+ } | null;
279
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
280
+ weight: (string | number) | null;
281
+ dueDate: string | null;
282
+ startDate: string | null;
283
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
284
+ healthStatus: string | null;
285
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
286
+ severity: string | null;
287
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
288
+ mergedBy: string | null;
289
+ /** @description Branch merged INTO. The source side is `branch`. */
290
+ targetBranch: string | null;
241
291
  number: string | number;
242
292
  title: string;
243
293
  body: string | null;
@@ -293,6 +343,56 @@ export interface components {
293
343
  source: "github" | "gitlab";
294
344
  repo: string;
295
345
  type: "pr" | "mr" | "issue";
346
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
347
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
348
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
349
+ originalType: string | null;
350
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
351
+ closedAt: string | null;
352
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
353
+ closedBy: string | null;
354
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
355
+ stateReason: "completed" | "not_planned" | "reopened" | null;
356
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
357
+ parentEpic: {
358
+ id: (string | number) | null;
359
+ iid: (string | number) | null;
360
+ title: string | null;
361
+ url: string | null;
362
+ } | null;
363
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
364
+ parentIssueUrl: string | null;
365
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
366
+ subIssues: {
367
+ total: string | number;
368
+ completed: string | number;
369
+ } | null;
370
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
371
+ blockingCount: (string | number) | null;
372
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
373
+ blockedByCount: (string | number) | null;
374
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
375
+ timeStats: {
376
+ estimateSeconds: string | number;
377
+ spentSeconds: string | number;
378
+ } | null;
379
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
380
+ taskCompletion: {
381
+ total: string | number;
382
+ completed: string | number;
383
+ } | null;
384
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
385
+ weight: (string | number) | null;
386
+ dueDate: string | null;
387
+ startDate: string | null;
388
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
389
+ healthStatus: string | null;
390
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
391
+ severity: string | null;
392
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
393
+ mergedBy: string | null;
394
+ /** @description Branch merged INTO. The source side is `branch`. */
395
+ targetBranch: string | null;
296
396
  number: string | number;
297
397
  title: string;
298
398
  body: string | null;
@@ -513,6 +613,10 @@ export interface components {
513
613
  }[];
514
614
  updatedAt: string;
515
615
  mergedAt: string | null;
616
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
617
+ mergedBy: string | null;
618
+ /** @description Branch merged INTO. The source side is `branch`. */
619
+ targetBranch: string | null;
516
620
  reviewRequestedAt: string | null;
517
621
  volume: {
518
622
  additions: string | number;
@@ -631,6 +735,52 @@ export interface components {
631
735
  author: string | null;
632
736
  createdAt: string;
633
737
  updatedAt: string;
738
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
739
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
740
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
741
+ originalType: string | null;
742
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
743
+ closedAt: string | null;
744
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
745
+ closedBy: string | null;
746
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
747
+ stateReason: "completed" | "not_planned" | "reopened" | null;
748
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
749
+ parentEpic: {
750
+ id: (string | number) | null;
751
+ iid: (string | number) | null;
752
+ title: string | null;
753
+ url: string | null;
754
+ } | null;
755
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
756
+ parentIssueUrl: string | null;
757
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
758
+ subIssues: {
759
+ total: string | number;
760
+ completed: string | number;
761
+ } | null;
762
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
763
+ blockingCount: (string | number) | null;
764
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
765
+ blockedByCount: (string | number) | null;
766
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
767
+ timeStats: {
768
+ estimateSeconds: string | number;
769
+ spentSeconds: string | number;
770
+ } | null;
771
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
772
+ taskCompletion: {
773
+ total: string | number;
774
+ completed: string | number;
775
+ } | null;
776
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
777
+ weight: (string | number) | null;
778
+ dueDate: string | null;
779
+ startDate: string | null;
780
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
781
+ healthStatus: string | null;
782
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
783
+ severity: string | null;
634
784
  iteration: {
635
785
  id: string | number;
636
786
  title: string;
@@ -734,6 +884,10 @@ export interface components {
734
884
  }[];
735
885
  updatedAt: string;
736
886
  mergedAt: string | null;
887
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
888
+ mergedBy: string | null;
889
+ /** @description Branch merged INTO. The source side is `branch`. */
890
+ targetBranch: string | null;
737
891
  reviewRequestedAt: string | null;
738
892
  volume: {
739
893
  additions: string | number;
@@ -852,6 +1006,52 @@ export interface components {
852
1006
  author: string | null;
853
1007
  createdAt: string;
854
1008
  updatedAt: string;
1009
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
1010
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
1011
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
1012
+ originalType: string | null;
1013
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
1014
+ closedAt: string | null;
1015
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
1016
+ closedBy: string | null;
1017
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
1018
+ stateReason: "completed" | "not_planned" | "reopened" | null;
1019
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
1020
+ parentEpic: {
1021
+ id: (string | number) | null;
1022
+ iid: (string | number) | null;
1023
+ title: string | null;
1024
+ url: string | null;
1025
+ } | null;
1026
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
1027
+ parentIssueUrl: string | null;
1028
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
1029
+ subIssues: {
1030
+ total: string | number;
1031
+ completed: string | number;
1032
+ } | null;
1033
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
1034
+ blockingCount: (string | number) | null;
1035
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
1036
+ blockedByCount: (string | number) | null;
1037
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
1038
+ timeStats: {
1039
+ estimateSeconds: string | number;
1040
+ spentSeconds: string | number;
1041
+ } | null;
1042
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
1043
+ taskCompletion: {
1044
+ total: string | number;
1045
+ completed: string | number;
1046
+ } | null;
1047
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
1048
+ weight: (string | number) | null;
1049
+ dueDate: string | null;
1050
+ startDate: string | null;
1051
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
1052
+ healthStatus: string | null;
1053
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
1054
+ severity: string | null;
855
1055
  iteration: {
856
1056
  id: string | number;
857
1057
  title: string;
@@ -1494,6 +1694,10 @@ export interface components {
1494
1694
  }[];
1495
1695
  updatedAt: string;
1496
1696
  mergedAt: string | null;
1697
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
1698
+ mergedBy: string | null;
1699
+ /** @description Branch merged INTO. The source side is `branch`. */
1700
+ targetBranch: string | null;
1497
1701
  reviewRequestedAt: string | null;
1498
1702
  volume: {
1499
1703
  additions: string | number;
@@ -1578,6 +1782,16 @@ export interface components {
1578
1782
  number: string | number;
1579
1783
  }[];
1580
1784
  };
1785
+ ParentEpic: {
1786
+ id: (string | number) | null;
1787
+ iid: (string | number) | null;
1788
+ title: string | null;
1789
+ url: string | null;
1790
+ };
1791
+ Progress: {
1792
+ total: string | number;
1793
+ completed: string | number;
1794
+ };
1581
1795
  ProjectLabel: {
1582
1796
  name: string;
1583
1797
  color: string;
@@ -1675,6 +1889,10 @@ export interface components {
1675
1889
  firstNoteCreatedAt: string;
1676
1890
  url: string | null;
1677
1891
  };
1892
+ TimeStats: {
1893
+ estimateSeconds: string | number;
1894
+ spentSeconds: string | number;
1895
+ };
1678
1896
  TrackedProject: {
1679
1897
  source: "github" | "gitlab";
1680
1898
  /** @description Provider-side project path, verbatim from the operator config (`owner/repo` on GitHub, `group/sub/project` on GitLab). Pair with `source` to call /v1/projects/{source}/{projectKey}/labels. */
@@ -1714,6 +1932,52 @@ export interface components {
1714
1932
  author: string | null;
1715
1933
  createdAt: string;
1716
1934
  updatedAt: string;
1935
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
1936
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
1937
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
1938
+ originalType: string | null;
1939
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
1940
+ closedAt: string | null;
1941
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
1942
+ closedBy: string | null;
1943
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
1944
+ stateReason: "completed" | "not_planned" | "reopened" | null;
1945
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
1946
+ parentEpic: {
1947
+ id: (string | number) | null;
1948
+ iid: (string | number) | null;
1949
+ title: string | null;
1950
+ url: string | null;
1951
+ } | null;
1952
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
1953
+ parentIssueUrl: string | null;
1954
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
1955
+ subIssues: {
1956
+ total: string | number;
1957
+ completed: string | number;
1958
+ } | null;
1959
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
1960
+ blockingCount: (string | number) | null;
1961
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
1962
+ blockedByCount: (string | number) | null;
1963
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
1964
+ timeStats: {
1965
+ estimateSeconds: string | number;
1966
+ spentSeconds: string | number;
1967
+ } | null;
1968
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
1969
+ taskCompletion: {
1970
+ total: string | number;
1971
+ completed: string | number;
1972
+ } | null;
1973
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
1974
+ weight: (string | number) | null;
1975
+ dueDate: string | null;
1976
+ startDate: string | null;
1977
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
1978
+ healthStatus: string | null;
1979
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
1980
+ severity: string | null;
1717
1981
  iteration: {
1718
1982
  id: string | number;
1719
1983
  title: string;
@@ -1778,6 +2042,10 @@ export interface components {
1778
2042
  }[];
1779
2043
  updatedAt: string;
1780
2044
  mergedAt: string | null;
2045
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
2046
+ mergedBy: string | null;
2047
+ /** @description Branch merged INTO. The source side is `branch`. */
2048
+ targetBranch: string | null;
1781
2049
  reviewRequestedAt: string | null;
1782
2050
  volume: {
1783
2051
  additions: string | number;
@@ -1899,6 +2167,52 @@ export interface components {
1899
2167
  author: string | null;
1900
2168
  createdAt: string;
1901
2169
  updatedAt: string;
2170
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
2171
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
2172
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
2173
+ originalType: string | null;
2174
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
2175
+ closedAt: string | null;
2176
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
2177
+ closedBy: string | null;
2178
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
2179
+ stateReason: "completed" | "not_planned" | "reopened" | null;
2180
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
2181
+ parentEpic: {
2182
+ id: (string | number) | null;
2183
+ iid: (string | number) | null;
2184
+ title: string | null;
2185
+ url: string | null;
2186
+ } | null;
2187
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
2188
+ parentIssueUrl: string | null;
2189
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
2190
+ subIssues: {
2191
+ total: string | number;
2192
+ completed: string | number;
2193
+ } | null;
2194
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
2195
+ blockingCount: (string | number) | null;
2196
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
2197
+ blockedByCount: (string | number) | null;
2198
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
2199
+ timeStats: {
2200
+ estimateSeconds: string | number;
2201
+ spentSeconds: string | number;
2202
+ } | null;
2203
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
2204
+ taskCompletion: {
2205
+ total: string | number;
2206
+ completed: string | number;
2207
+ } | null;
2208
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
2209
+ weight: (string | number) | null;
2210
+ dueDate: string | null;
2211
+ startDate: string | null;
2212
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
2213
+ healthStatus: string | null;
2214
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
2215
+ severity: string | null;
1902
2216
  iteration: {
1903
2217
  id: string | number;
1904
2218
  title: string;
@@ -1963,6 +2277,10 @@ export interface components {
1963
2277
  }[];
1964
2278
  updatedAt: string;
1965
2279
  mergedAt: string | null;
2280
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
2281
+ mergedBy: string | null;
2282
+ /** @description Branch merged INTO. The source side is `branch`. */
2283
+ targetBranch: string | null;
1966
2284
  reviewRequestedAt: string | null;
1967
2285
  volume: {
1968
2286
  additions: string | number;
@@ -2137,6 +2455,52 @@ export interface operations {
2137
2455
  author: string | null;
2138
2456
  createdAt: string;
2139
2457
  updatedAt: string;
2458
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
2459
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
2460
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
2461
+ originalType: string | null;
2462
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
2463
+ closedAt: string | null;
2464
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
2465
+ closedBy: string | null;
2466
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
2467
+ stateReason: "completed" | "not_planned" | "reopened" | null;
2468
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
2469
+ parentEpic: {
2470
+ id: (string | number) | null;
2471
+ iid: (string | number) | null;
2472
+ title: string | null;
2473
+ url: string | null;
2474
+ } | null;
2475
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
2476
+ parentIssueUrl: string | null;
2477
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
2478
+ subIssues: {
2479
+ total: string | number;
2480
+ completed: string | number;
2481
+ } | null;
2482
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
2483
+ blockingCount: (string | number) | null;
2484
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
2485
+ blockedByCount: (string | number) | null;
2486
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
2487
+ timeStats: {
2488
+ estimateSeconds: string | number;
2489
+ spentSeconds: string | number;
2490
+ } | null;
2491
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
2492
+ taskCompletion: {
2493
+ total: string | number;
2494
+ completed: string | number;
2495
+ } | null;
2496
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
2497
+ weight: (string | number) | null;
2498
+ dueDate: string | null;
2499
+ startDate: string | null;
2500
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
2501
+ healthStatus: string | null;
2502
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
2503
+ severity: string | null;
2140
2504
  iteration: {
2141
2505
  id: string | number;
2142
2506
  title: string;
@@ -2201,6 +2565,10 @@ export interface operations {
2201
2565
  }[];
2202
2566
  updatedAt: string;
2203
2567
  mergedAt: string | null;
2568
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
2569
+ mergedBy: string | null;
2570
+ /** @description Branch merged INTO. The source side is `branch`. */
2571
+ targetBranch: string | null;
2204
2572
  reviewRequestedAt: string | null;
2205
2573
  volume: {
2206
2574
  additions: string | number;
@@ -2326,6 +2694,52 @@ export interface operations {
2326
2694
  author: string | null;
2327
2695
  createdAt: string;
2328
2696
  updatedAt: string;
2697
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
2698
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
2699
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
2700
+ originalType: string | null;
2701
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
2702
+ closedAt: string | null;
2703
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
2704
+ closedBy: string | null;
2705
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
2706
+ stateReason: "completed" | "not_planned" | "reopened" | null;
2707
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
2708
+ parentEpic: {
2709
+ id: (string | number) | null;
2710
+ iid: (string | number) | null;
2711
+ title: string | null;
2712
+ url: string | null;
2713
+ } | null;
2714
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
2715
+ parentIssueUrl: string | null;
2716
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
2717
+ subIssues: {
2718
+ total: string | number;
2719
+ completed: string | number;
2720
+ } | null;
2721
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
2722
+ blockingCount: (string | number) | null;
2723
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
2724
+ blockedByCount: (string | number) | null;
2725
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
2726
+ timeStats: {
2727
+ estimateSeconds: string | number;
2728
+ spentSeconds: string | number;
2729
+ } | null;
2730
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
2731
+ taskCompletion: {
2732
+ total: string | number;
2733
+ completed: string | number;
2734
+ } | null;
2735
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
2736
+ weight: (string | number) | null;
2737
+ dueDate: string | null;
2738
+ startDate: string | null;
2739
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
2740
+ healthStatus: string | null;
2741
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
2742
+ severity: string | null;
2329
2743
  iteration: {
2330
2744
  id: string | number;
2331
2745
  title: string;
@@ -2390,6 +2804,10 @@ export interface operations {
2390
2804
  }[];
2391
2805
  updatedAt: string;
2392
2806
  mergedAt: string | null;
2807
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
2808
+ mergedBy: string | null;
2809
+ /** @description Branch merged INTO. The source side is `branch`. */
2810
+ targetBranch: string | null;
2393
2811
  reviewRequestedAt: string | null;
2394
2812
  volume: {
2395
2813
  additions: string | number;
@@ -2515,6 +2933,52 @@ export interface operations {
2515
2933
  author: string | null;
2516
2934
  createdAt: string;
2517
2935
  updatedAt: string;
2936
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
2937
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
2938
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
2939
+ originalType: string | null;
2940
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
2941
+ closedAt: string | null;
2942
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
2943
+ closedBy: string | null;
2944
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
2945
+ stateReason: "completed" | "not_planned" | "reopened" | null;
2946
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
2947
+ parentEpic: {
2948
+ id: (string | number) | null;
2949
+ iid: (string | number) | null;
2950
+ title: string | null;
2951
+ url: string | null;
2952
+ } | null;
2953
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
2954
+ parentIssueUrl: string | null;
2955
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
2956
+ subIssues: {
2957
+ total: string | number;
2958
+ completed: string | number;
2959
+ } | null;
2960
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
2961
+ blockingCount: (string | number) | null;
2962
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
2963
+ blockedByCount: (string | number) | null;
2964
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
2965
+ timeStats: {
2966
+ estimateSeconds: string | number;
2967
+ spentSeconds: string | number;
2968
+ } | null;
2969
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
2970
+ taskCompletion: {
2971
+ total: string | number;
2972
+ completed: string | number;
2973
+ } | null;
2974
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
2975
+ weight: (string | number) | null;
2976
+ dueDate: string | null;
2977
+ startDate: string | null;
2978
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
2979
+ healthStatus: string | null;
2980
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
2981
+ severity: string | null;
2518
2982
  iteration: {
2519
2983
  id: string | number;
2520
2984
  title: string;
@@ -2579,6 +3043,10 @@ export interface operations {
2579
3043
  }[];
2580
3044
  updatedAt: string;
2581
3045
  mergedAt: string | null;
3046
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
3047
+ mergedBy: string | null;
3048
+ /** @description Branch merged INTO. The source side is `branch`. */
3049
+ targetBranch: string | null;
2582
3050
  reviewRequestedAt: string | null;
2583
3051
  volume: {
2584
3052
  additions: string | number;
@@ -2760,6 +3228,52 @@ export interface operations {
2760
3228
  author: string | null;
2761
3229
  createdAt: string;
2762
3230
  updatedAt: string;
3231
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
3232
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
3233
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
3234
+ originalType: string | null;
3235
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
3236
+ closedAt: string | null;
3237
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
3238
+ closedBy: string | null;
3239
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
3240
+ stateReason: "completed" | "not_planned" | "reopened" | null;
3241
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
3242
+ parentEpic: {
3243
+ id: (string | number) | null;
3244
+ iid: (string | number) | null;
3245
+ title: string | null;
3246
+ url: string | null;
3247
+ } | null;
3248
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
3249
+ parentIssueUrl: string | null;
3250
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
3251
+ subIssues: {
3252
+ total: string | number;
3253
+ completed: string | number;
3254
+ } | null;
3255
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
3256
+ blockingCount: (string | number) | null;
3257
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
3258
+ blockedByCount: (string | number) | null;
3259
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
3260
+ timeStats: {
3261
+ estimateSeconds: string | number;
3262
+ spentSeconds: string | number;
3263
+ } | null;
3264
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
3265
+ taskCompletion: {
3266
+ total: string | number;
3267
+ completed: string | number;
3268
+ } | null;
3269
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
3270
+ weight: (string | number) | null;
3271
+ dueDate: string | null;
3272
+ startDate: string | null;
3273
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
3274
+ healthStatus: string | null;
3275
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
3276
+ severity: string | null;
2763
3277
  iteration: {
2764
3278
  id: string | number;
2765
3279
  title: string;
@@ -2824,6 +3338,10 @@ export interface operations {
2824
3338
  }[];
2825
3339
  updatedAt: string;
2826
3340
  mergedAt: string | null;
3341
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
3342
+ mergedBy: string | null;
3343
+ /** @description Branch merged INTO. The source side is `branch`. */
3344
+ targetBranch: string | null;
2827
3345
  reviewRequestedAt: string | null;
2828
3346
  volume: {
2829
3347
  additions: string | number;
@@ -2944,6 +3462,52 @@ export interface operations {
2944
3462
  author: string | null;
2945
3463
  createdAt: string;
2946
3464
  updatedAt: string;
3465
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
3466
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
3467
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
3468
+ originalType: string | null;
3469
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
3470
+ closedAt: string | null;
3471
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
3472
+ closedBy: string | null;
3473
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
3474
+ stateReason: "completed" | "not_planned" | "reopened" | null;
3475
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
3476
+ parentEpic: {
3477
+ id: (string | number) | null;
3478
+ iid: (string | number) | null;
3479
+ title: string | null;
3480
+ url: string | null;
3481
+ } | null;
3482
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
3483
+ parentIssueUrl: string | null;
3484
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
3485
+ subIssues: {
3486
+ total: string | number;
3487
+ completed: string | number;
3488
+ } | null;
3489
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
3490
+ blockingCount: (string | number) | null;
3491
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
3492
+ blockedByCount: (string | number) | null;
3493
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
3494
+ timeStats: {
3495
+ estimateSeconds: string | number;
3496
+ spentSeconds: string | number;
3497
+ } | null;
3498
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
3499
+ taskCompletion: {
3500
+ total: string | number;
3501
+ completed: string | number;
3502
+ } | null;
3503
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
3504
+ weight: (string | number) | null;
3505
+ dueDate: string | null;
3506
+ startDate: string | null;
3507
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
3508
+ healthStatus: string | null;
3509
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
3510
+ severity: string | null;
2947
3511
  iteration: {
2948
3512
  id: string | number;
2949
3513
  title: string;
@@ -3008,6 +3572,10 @@ export interface operations {
3008
3572
  }[];
3009
3573
  updatedAt: string;
3010
3574
  mergedAt: string | null;
3575
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
3576
+ mergedBy: string | null;
3577
+ /** @description Branch merged INTO. The source side is `branch`. */
3578
+ targetBranch: string | null;
3011
3579
  reviewRequestedAt: string | null;
3012
3580
  volume: {
3013
3581
  additions: string | number;
@@ -3128,6 +3696,52 @@ export interface operations {
3128
3696
  author: string | null;
3129
3697
  createdAt: string;
3130
3698
  updatedAt: string;
3699
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
3700
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
3701
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
3702
+ originalType: string | null;
3703
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
3704
+ closedAt: string | null;
3705
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
3706
+ closedBy: string | null;
3707
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
3708
+ stateReason: "completed" | "not_planned" | "reopened" | null;
3709
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
3710
+ parentEpic: {
3711
+ id: (string | number) | null;
3712
+ iid: (string | number) | null;
3713
+ title: string | null;
3714
+ url: string | null;
3715
+ } | null;
3716
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
3717
+ parentIssueUrl: string | null;
3718
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
3719
+ subIssues: {
3720
+ total: string | number;
3721
+ completed: string | number;
3722
+ } | null;
3723
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
3724
+ blockingCount: (string | number) | null;
3725
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
3726
+ blockedByCount: (string | number) | null;
3727
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
3728
+ timeStats: {
3729
+ estimateSeconds: string | number;
3730
+ spentSeconds: string | number;
3731
+ } | null;
3732
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
3733
+ taskCompletion: {
3734
+ total: string | number;
3735
+ completed: string | number;
3736
+ } | null;
3737
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
3738
+ weight: (string | number) | null;
3739
+ dueDate: string | null;
3740
+ startDate: string | null;
3741
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
3742
+ healthStatus: string | null;
3743
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
3744
+ severity: string | null;
3131
3745
  iteration: {
3132
3746
  id: string | number;
3133
3747
  title: string;
@@ -3192,6 +3806,10 @@ export interface operations {
3192
3806
  }[];
3193
3807
  updatedAt: string;
3194
3808
  mergedAt: string | null;
3809
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
3810
+ mergedBy: string | null;
3811
+ /** @description Branch merged INTO. The source side is `branch`. */
3812
+ targetBranch: string | null;
3195
3813
  reviewRequestedAt: string | null;
3196
3814
  volume: {
3197
3815
  additions: string | number;
@@ -4206,6 +4824,56 @@ export interface operations {
4206
4824
  source: "github" | "gitlab";
4207
4825
  repo: string;
4208
4826
  type: "pr" | "mr" | "issue";
4827
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
4828
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
4829
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
4830
+ originalType: string | null;
4831
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
4832
+ closedAt: string | null;
4833
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
4834
+ closedBy: string | null;
4835
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
4836
+ stateReason: "completed" | "not_planned" | "reopened" | null;
4837
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
4838
+ parentEpic: {
4839
+ id: (string | number) | null;
4840
+ iid: (string | number) | null;
4841
+ title: string | null;
4842
+ url: string | null;
4843
+ } | null;
4844
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
4845
+ parentIssueUrl: string | null;
4846
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
4847
+ subIssues: {
4848
+ total: string | number;
4849
+ completed: string | number;
4850
+ } | null;
4851
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
4852
+ blockingCount: (string | number) | null;
4853
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
4854
+ blockedByCount: (string | number) | null;
4855
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
4856
+ timeStats: {
4857
+ estimateSeconds: string | number;
4858
+ spentSeconds: string | number;
4859
+ } | null;
4860
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
4861
+ taskCompletion: {
4862
+ total: string | number;
4863
+ completed: string | number;
4864
+ } | null;
4865
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
4866
+ weight: (string | number) | null;
4867
+ dueDate: string | null;
4868
+ startDate: string | null;
4869
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
4870
+ healthStatus: string | null;
4871
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
4872
+ severity: string | null;
4873
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
4874
+ mergedBy: string | null;
4875
+ /** @description Branch merged INTO. The source side is `branch`. */
4876
+ targetBranch: string | null;
4209
4877
  number: string | number;
4210
4878
  title: string;
4211
4879
  body: string | null;
@@ -4262,6 +4930,56 @@ export interface operations {
4262
4930
  source: "github" | "gitlab";
4263
4931
  repo: string;
4264
4932
  type: "pr" | "mr" | "issue";
4933
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
4934
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
4935
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
4936
+ originalType: string | null;
4937
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
4938
+ closedAt: string | null;
4939
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
4940
+ closedBy: string | null;
4941
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
4942
+ stateReason: "completed" | "not_planned" | "reopened" | null;
4943
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
4944
+ parentEpic: {
4945
+ id: (string | number) | null;
4946
+ iid: (string | number) | null;
4947
+ title: string | null;
4948
+ url: string | null;
4949
+ } | null;
4950
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
4951
+ parentIssueUrl: string | null;
4952
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
4953
+ subIssues: {
4954
+ total: string | number;
4955
+ completed: string | number;
4956
+ } | null;
4957
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
4958
+ blockingCount: (string | number) | null;
4959
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
4960
+ blockedByCount: (string | number) | null;
4961
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
4962
+ timeStats: {
4963
+ estimateSeconds: string | number;
4964
+ spentSeconds: string | number;
4965
+ } | null;
4966
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
4967
+ taskCompletion: {
4968
+ total: string | number;
4969
+ completed: string | number;
4970
+ } | null;
4971
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
4972
+ weight: (string | number) | null;
4973
+ dueDate: string | null;
4974
+ startDate: string | null;
4975
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
4976
+ healthStatus: string | null;
4977
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
4978
+ severity: string | null;
4979
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
4980
+ mergedBy: string | null;
4981
+ /** @description Branch merged INTO. The source side is `branch`. */
4982
+ targetBranch: string | null;
4265
4983
  number: string | number;
4266
4984
  title: string;
4267
4985
  body: string | null;
@@ -4318,6 +5036,56 @@ export interface operations {
4318
5036
  source: "github" | "gitlab";
4319
5037
  repo: string;
4320
5038
  type: "pr" | "mr" | "issue";
5039
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
5040
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
5041
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
5042
+ originalType: string | null;
5043
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
5044
+ closedAt: string | null;
5045
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
5046
+ closedBy: string | null;
5047
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
5048
+ stateReason: "completed" | "not_planned" | "reopened" | null;
5049
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
5050
+ parentEpic: {
5051
+ id: (string | number) | null;
5052
+ iid: (string | number) | null;
5053
+ title: string | null;
5054
+ url: string | null;
5055
+ } | null;
5056
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
5057
+ parentIssueUrl: string | null;
5058
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
5059
+ subIssues: {
5060
+ total: string | number;
5061
+ completed: string | number;
5062
+ } | null;
5063
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
5064
+ blockingCount: (string | number) | null;
5065
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
5066
+ blockedByCount: (string | number) | null;
5067
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
5068
+ timeStats: {
5069
+ estimateSeconds: string | number;
5070
+ spentSeconds: string | number;
5071
+ } | null;
5072
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
5073
+ taskCompletion: {
5074
+ total: string | number;
5075
+ completed: string | number;
5076
+ } | null;
5077
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
5078
+ weight: (string | number) | null;
5079
+ dueDate: string | null;
5080
+ startDate: string | null;
5081
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
5082
+ healthStatus: string | null;
5083
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
5084
+ severity: string | null;
5085
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
5086
+ mergedBy: string | null;
5087
+ /** @description Branch merged INTO. The source side is `branch`. */
5088
+ targetBranch: string | null;
4321
5089
  number: string | number;
4322
5090
  title: string;
4323
5091
  body: string | null;
@@ -4507,6 +5275,10 @@ export interface operations {
4507
5275
  }[];
4508
5276
  updatedAt: string;
4509
5277
  mergedAt: string | null;
5278
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
5279
+ mergedBy: string | null;
5280
+ /** @description Branch merged INTO. The source side is `branch`. */
5281
+ targetBranch: string | null;
4510
5282
  reviewRequestedAt: string | null;
4511
5283
  volume: {
4512
5284
  additions: string | number;
@@ -4625,6 +5397,52 @@ export interface operations {
4625
5397
  author: string | null;
4626
5398
  createdAt: string;
4627
5399
  updatedAt: string;
5400
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
5401
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
5402
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
5403
+ originalType: string | null;
5404
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
5405
+ closedAt: string | null;
5406
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
5407
+ closedBy: string | null;
5408
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
5409
+ stateReason: "completed" | "not_planned" | "reopened" | null;
5410
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
5411
+ parentEpic: {
5412
+ id: (string | number) | null;
5413
+ iid: (string | number) | null;
5414
+ title: string | null;
5415
+ url: string | null;
5416
+ } | null;
5417
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
5418
+ parentIssueUrl: string | null;
5419
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
5420
+ subIssues: {
5421
+ total: string | number;
5422
+ completed: string | number;
5423
+ } | null;
5424
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
5425
+ blockingCount: (string | number) | null;
5426
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
5427
+ blockedByCount: (string | number) | null;
5428
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
5429
+ timeStats: {
5430
+ estimateSeconds: string | number;
5431
+ spentSeconds: string | number;
5432
+ } | null;
5433
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
5434
+ taskCompletion: {
5435
+ total: string | number;
5436
+ completed: string | number;
5437
+ } | null;
5438
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
5439
+ weight: (string | number) | null;
5440
+ dueDate: string | null;
5441
+ startDate: string | null;
5442
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
5443
+ healthStatus: string | null;
5444
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
5445
+ severity: string | null;
4628
5446
  iteration: {
4629
5447
  id: string | number;
4630
5448
  title: string;
@@ -4729,6 +5547,10 @@ export interface operations {
4729
5547
  }[];
4730
5548
  updatedAt: string;
4731
5549
  mergedAt: string | null;
5550
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
5551
+ mergedBy: string | null;
5552
+ /** @description Branch merged INTO. The source side is `branch`. */
5553
+ targetBranch: string | null;
4732
5554
  reviewRequestedAt: string | null;
4733
5555
  volume: {
4734
5556
  additions: string | number;
@@ -4847,6 +5669,52 @@ export interface operations {
4847
5669
  author: string | null;
4848
5670
  createdAt: string;
4849
5671
  updatedAt: string;
5672
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
5673
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
5674
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
5675
+ originalType: string | null;
5676
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
5677
+ closedAt: string | null;
5678
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
5679
+ closedBy: string | null;
5680
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
5681
+ stateReason: "completed" | "not_planned" | "reopened" | null;
5682
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
5683
+ parentEpic: {
5684
+ id: (string | number) | null;
5685
+ iid: (string | number) | null;
5686
+ title: string | null;
5687
+ url: string | null;
5688
+ } | null;
5689
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
5690
+ parentIssueUrl: string | null;
5691
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
5692
+ subIssues: {
5693
+ total: string | number;
5694
+ completed: string | number;
5695
+ } | null;
5696
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
5697
+ blockingCount: (string | number) | null;
5698
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
5699
+ blockedByCount: (string | number) | null;
5700
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
5701
+ timeStats: {
5702
+ estimateSeconds: string | number;
5703
+ spentSeconds: string | number;
5704
+ } | null;
5705
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
5706
+ taskCompletion: {
5707
+ total: string | number;
5708
+ completed: string | number;
5709
+ } | null;
5710
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
5711
+ weight: (string | number) | null;
5712
+ dueDate: string | null;
5713
+ startDate: string | null;
5714
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
5715
+ healthStatus: string | null;
5716
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
5717
+ severity: string | null;
4850
5718
  iteration: {
4851
5719
  id: string | number;
4852
5720
  title: string;
@@ -4951,6 +5819,10 @@ export interface operations {
4951
5819
  }[];
4952
5820
  updatedAt: string;
4953
5821
  mergedAt: string | null;
5822
+ /** @description Login of whoever merged. GitLab only — GitHub's list payload omits it, so null there means unknown, not 'nobody'. */
5823
+ mergedBy: string | null;
5824
+ /** @description Branch merged INTO. The source side is `branch`. */
5825
+ targetBranch: string | null;
4954
5826
  reviewRequestedAt: string | null;
4955
5827
  volume: {
4956
5828
  additions: string | number;
@@ -5069,6 +5941,52 @@ export interface operations {
5069
5941
  author: string | null;
5070
5942
  createdAt: string;
5071
5943
  updatedAt: string;
5944
+ /** @description Normalised work item kind. `null` on a PR/MR, which is not an issue-like item. `other` means the provider named a kind outside this vocabulary — read `originalType` then, never treat `other` as a parse failure. */
5945
+ issueType: "issue" | "task" | "incident" | "test_case" | "other" | null;
5946
+ /** @description The provider's own word for the kind, unmapped: `task` on GitLab, `Feature` on a GitHub org that defined it. `null` when the provider said nothing. GitHub issue types are org-defined, so this is deliberately NOT normalised across providers — branch on `source` if you need the raw taxonomy. */
5947
+ originalType: string | null;
5948
+ /** @description When the item was closed. Distinct from `mergedAt` — a PR/MR can be closed without merging, and an issue is never merged. */
5949
+ closedAt: string | null;
5950
+ /** @description Login of whoever closed it. A LOGIN, never a display name — same strict rule as `author`, so it can be joined against `?author`. */
5951
+ closedBy: string | null;
5952
+ /** @description GitHub only. `not_planned` means the issue was closed WITHOUT being done — a delivery report that ignores this counts abandoned work as delivered. Always null on GitLab, which has no equivalent. */
5953
+ stateReason: "completed" | "not_planned" | "reopened" | null;
5954
+ /** @description GitLab parent epic, read from the issue's own payload. Epics themselves are NOT ingested (they are group-level), but this is enough to walk PR → issue → epic. Always null on GitHub. */
5955
+ parentEpic: {
5956
+ id: (string | number) | null;
5957
+ iid: (string | number) | null;
5958
+ title: string | null;
5959
+ url: string | null;
5960
+ } | null;
5961
+ /** @description GitHub parent issue, as an API url — the payload carries no id. Always null on GitLab, which expresses the same idea through `parentEpic`. */
5962
+ parentIssueUrl: string | null;
5963
+ /** @description GitHub sub-issue progress. Null when the issue has none. */
5964
+ subIssues: {
5965
+ total: string | number;
5966
+ completed: string | number;
5967
+ } | null;
5968
+ /** @description How many items THIS one blocks. Not the inverse of `blockedByCount` — the two directions are reported separately because GitLab only counts this one. */
5969
+ blockingCount: (string | number) | null;
5970
+ /** @description How many items block THIS one. GitHub only; GitLab's payload does not say, so null there means unknown, not zero. */
5971
+ blockedByCount: (string | number) | null;
5972
+ /** @description GitLab time tracking, in seconds. Null when the project does not use it. */
5973
+ timeStats: {
5974
+ estimateSeconds: string | number;
5975
+ spentSeconds: string | number;
5976
+ } | null;
5977
+ /** @description Checklist progress in the description ('3 of 5 tasks'). */
5978
+ taskCompletion: {
5979
+ total: string | number;
5980
+ completed: string | number;
5981
+ } | null;
5982
+ /** @description GitLab issue weight, passed through unchanged — no scale is imposed here. */
5983
+ weight: (string | number) | null;
5984
+ dueDate: string | null;
5985
+ startDate: string | null;
5986
+ /** @description GitLab health status (`on_track`, `needs_attention`, `at_risk`), verbatim. */
5987
+ healthStatus: string | null;
5988
+ /** @description Incident severity. Meaningful when `issueType === 'incident'`. */
5989
+ severity: string | null;
5072
5990
  iteration: {
5073
5991
  id: string | number;
5074
5992
  title: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cesar-richard/git-connector-sdk",
3
- "version": "4.4.0",
3
+ "version": "4.6.0",
4
4
  "description": "TypeScript SDK for the git-connector v1 API (work items + iterations aggregated from GitHub/GitLab). Version published on npm tracks server releases.",
5
5
  "license": "MIT",
6
6
  "repository": {