@sentry/junior-github 0.111.0 → 0.112.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +29 -142
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1643,30 +1643,23 @@ var DAY_MS = 24 * 60 * 60 * 1e3;
1643
1643
  var WINDOWS = [7, 30, 90];
1644
1644
  var pullRequestStatsSchema = z10.object({
1645
1645
  closed: z10.number().int().nonnegative(),
1646
- compositionUnknown: z10.number().int().nonnegative(),
1647
1646
  created: z10.number().int().nonnegative(),
1648
1647
  days: z10.number().int().positive(),
1649
- juniorOnly: z10.number().int().nonnegative(),
1650
1648
  medianMergeTimeMs: z10.number().nonnegative().nullable(),
1651
- merged: z10.number().int().nonnegative(),
1652
- mixed: z10.number().int().nonnegative()
1649
+ merged: z10.number().int().nonnegative()
1653
1650
  }).strict().transform((row) => {
1654
1651
  const terminal = row.merged + row.closed;
1655
- const classified = row.juniorOnly + row.mixed;
1656
1652
  return {
1657
1653
  ...row,
1658
1654
  medianMergeTimeMs: row.medianMergeTimeMs ?? void 0,
1659
- mergeRate: terminal > 0 ? row.merged / terminal : void 0,
1660
- juniorOnlyRate: classified > 0 ? row.juniorOnly / classified : void 0
1655
+ mergeRate: terminal > 0 ? row.merged / terminal : void 0
1661
1656
  };
1662
1657
  });
1663
1658
  var pullRequestRepositoryStatsSchema = z10.object({
1664
1659
  closed: z10.number().int().nonnegative(),
1665
- compositionUnknown: z10.number().int().nonnegative(),
1666
1660
  created: z10.number().int().nonnegative(),
1667
1661
  juniorOnly: z10.number().int().nonnegative(),
1668
1662
  merged: z10.number().int().nonnegative(),
1669
- mixed: z10.number().int().nonnegative(),
1670
1663
  repository: z10.string().min(1)
1671
1664
  }).strict().transform((row) => {
1672
1665
  const terminal = row.merged + row.closed;
@@ -1688,16 +1681,10 @@ var issueStatsSchema = z10.object({
1688
1681
  medianCloseTimeMs: row.medianCloseTimeMs ?? void 0
1689
1682
  }));
1690
1683
  var pullRequestDaySchema = z10.object({
1691
- closed: z10.number().int().nonnegative(),
1692
1684
  created: z10.number().int().nonnegative(),
1693
- date: z10.string().date(),
1694
- merged: z10.number().int().nonnegative()
1685
+ date: z10.string().date()
1695
1686
  }).strict();
1696
1687
  var issueDaySchema = z10.object({
1697
- closedCompleted: z10.number().int().nonnegative(),
1698
- closedDuplicate: z10.number().int().nonnegative(),
1699
- closedNotPlanned: z10.number().int().nonnegative(),
1700
- closedUnknown: z10.number().int().nonnegative(),
1701
1688
  created: z10.number().int().nonnegative(),
1702
1689
  date: z10.string().date()
1703
1690
  }).strict();
@@ -1731,7 +1718,6 @@ async function aggregatePullRequestWindows(args) {
1731
1718
  SELECT
1732
1719
  ${table.pullRequestId},
1733
1720
  ${table.state},
1734
- ${table.commitComposition},
1735
1721
  ${table.openedAt},
1736
1722
  ${table.mergedAt},
1737
1723
  ${table.closedAt}
@@ -1755,24 +1741,6 @@ async function aggregatePullRequestWindows(args) {
1755
1741
  WHERE recent_pull_requests.state = 'closed_unmerged'
1756
1742
  AND recent_pull_requests.closed_at >= windows.start_at
1757
1743
  )::integer AS "closed",
1758
- count(recent_pull_requests.pull_request_id)
1759
- FILTER (
1760
- WHERE recent_pull_requests.state = 'merged'
1761
- AND recent_pull_requests.merged_at >= windows.start_at
1762
- AND recent_pull_requests.commit_composition = 'junior_only'
1763
- )::integer AS "juniorOnly",
1764
- count(recent_pull_requests.pull_request_id)
1765
- FILTER (
1766
- WHERE recent_pull_requests.state = 'merged'
1767
- AND recent_pull_requests.merged_at >= windows.start_at
1768
- AND recent_pull_requests.commit_composition = 'mixed'
1769
- )::integer AS "mixed",
1770
- count(recent_pull_requests.pull_request_id)
1771
- FILTER (
1772
- WHERE recent_pull_requests.state = 'merged'
1773
- AND recent_pull_requests.merged_at >= windows.start_at
1774
- AND recent_pull_requests.commit_composition IS NULL
1775
- )::integer AS "compositionUnknown",
1776
1744
  (
1777
1745
  percentile_cont(0.5) WITHIN GROUP (
1778
1746
  ORDER BY extract(
@@ -1803,38 +1771,17 @@ async function aggregatePullRequestDays(args) {
1803
1771
  date_trunc('day', ${end}::timestamptz AT TIME ZONE 'UTC'),
1804
1772
  interval '1 day'
1805
1773
  ) AS day
1806
- ), events AS (
1774
+ ), daily AS (
1807
1775
  SELECT
1808
1776
  date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC') AS day,
1809
- 'created' AS kind
1777
+ count(*)::integer AS created
1810
1778
  FROM ${table}
1811
1779
  WHERE ${table.openedAt} >= ${start}
1812
- UNION ALL
1813
- SELECT
1814
- date_trunc('day', ${table.mergedAt} AT TIME ZONE 'UTC') AS day,
1815
- 'merged' AS kind
1816
- FROM ${table}
1817
- WHERE ${table.state} = 'merged' AND ${table.mergedAt} >= ${start}
1818
- UNION ALL
1819
- SELECT
1820
- date_trunc('day', ${table.closedAt} AT TIME ZONE 'UTC') AS day,
1821
- 'closed' AS kind
1822
- FROM ${table}
1823
- WHERE ${table.state} = 'closed_unmerged' AND ${table.closedAt} >= ${start}
1824
- ), daily AS (
1825
- SELECT
1826
- events.day,
1827
- count(*) FILTER (WHERE events.kind = 'created')::integer AS created,
1828
- count(*) FILTER (WHERE events.kind = 'merged')::integer AS merged,
1829
- count(*) FILTER (WHERE events.kind = 'closed')::integer AS closed
1830
- FROM events
1831
- GROUP BY events.day
1780
+ GROUP BY date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC')
1832
1781
  )
1833
1782
  SELECT
1834
1783
  to_char(days.day, 'YYYY-MM-DD') AS "date",
1835
- coalesce(daily.created, 0)::integer AS "created",
1836
- coalesce(daily.merged, 0)::integer AS "merged",
1837
- coalesce(daily.closed, 0)::integer AS "closed"
1784
+ coalesce(daily.created, 0)::integer AS "created"
1838
1785
  FROM days
1839
1786
  LEFT JOIN daily ON daily.day = days.day
1840
1787
  ORDER BY days.day
@@ -1860,17 +1807,7 @@ async function aggregatePullRequestRepositories(args) {
1860
1807
  WHERE ${table.state} = 'merged'
1861
1808
  AND ${table.mergedAt} >= ${start}
1862
1809
  AND ${table.commitComposition} = 'junior_only'
1863
- )::integer AS "juniorOnly",
1864
- count(*) FILTER (
1865
- WHERE ${table.state} = 'merged'
1866
- AND ${table.mergedAt} >= ${start}
1867
- AND ${table.commitComposition} = 'mixed'
1868
- )::integer AS "mixed",
1869
- count(*) FILTER (
1870
- WHERE ${table.state} = 'merged'
1871
- AND ${table.mergedAt} >= ${start}
1872
- AND ${table.commitComposition} IS NULL
1873
- )::integer AS "compositionUnknown"
1810
+ )::integer AS "juniorOnly"
1874
1811
  FROM ${table}
1875
1812
  WHERE ${table.openedAt} >= ${start}
1876
1813
  OR ${table.mergedAt} >= ${start}
@@ -1961,40 +1898,17 @@ async function aggregateIssueDays(args) {
1961
1898
  date_trunc('day', ${end}::timestamptz AT TIME ZONE 'UTC'),
1962
1899
  interval '1 day'
1963
1900
  ) AS day
1964
- ), events AS (
1901
+ ), daily AS (
1965
1902
  SELECT
1966
1903
  date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC') AS day,
1967
- 'created' AS kind
1904
+ count(*)::integer AS created
1968
1905
  FROM ${table}
1969
1906
  WHERE ${table.openedAt} >= ${start}
1970
- UNION ALL
1971
- SELECT
1972
- date_trunc('day', ${table.closedAt} AT TIME ZONE 'UTC') AS day,
1973
- coalesce(${table.stateReason}, 'unknown') AS kind
1974
- FROM ${table}
1975
- WHERE ${table.state} = 'closed' AND ${table.closedAt} >= ${start}
1976
- ), daily AS (
1977
- SELECT
1978
- events.day,
1979
- count(*) FILTER (WHERE events.kind = 'created')::integer AS created,
1980
- count(*) FILTER (WHERE events.kind = 'completed')::integer
1981
- AS closed_completed,
1982
- count(*) FILTER (WHERE events.kind = 'duplicate')::integer
1983
- AS closed_duplicate,
1984
- count(*) FILTER (WHERE events.kind = 'not_planned')::integer
1985
- AS closed_not_planned,
1986
- count(*) FILTER (WHERE events.kind = 'unknown')::integer
1987
- AS closed_unknown
1988
- FROM events
1989
- GROUP BY events.day
1907
+ GROUP BY date_trunc('day', ${table.openedAt} AT TIME ZONE 'UTC')
1990
1908
  )
1991
1909
  SELECT
1992
1910
  to_char(days.day, 'YYYY-MM-DD') AS "date",
1993
- coalesce(daily.created, 0)::integer AS "created",
1994
- coalesce(daily.closed_completed, 0)::integer AS "closedCompleted",
1995
- coalesce(daily.closed_duplicate, 0)::integer AS "closedDuplicate",
1996
- coalesce(daily.closed_not_planned, 0)::integer AS "closedNotPlanned",
1997
- coalesce(daily.closed_unknown, 0)::integer AS "closedUnknown"
1911
+ coalesce(daily.created, 0)::integer AS "created"
1998
1912
  FROM days
1999
1913
  LEFT JOIN daily ON daily.day = days.day
2000
1914
  ORDER BY days.day
@@ -2048,9 +1962,6 @@ function formatDuration(value) {
2048
1962
  if (hours < 24) return `${Math.round(hours * 10) / 10}h`;
2049
1963
  return `${Math.round(hours / 24 * 10) / 10}d`;
2050
1964
  }
2051
- function formatCommitComposition(stats) {
2052
- return `${stats.juniorOnly} Junior-only \xB7 ${stats.mixed} mixed \xB7 ${stats.compositionUnknown} unknown`;
2053
- }
2054
1965
  function startOfUtcDay(timestampMs) {
2055
1966
  const date = new Date(timestampMs);
2056
1967
  date.setUTCHours(0, 0, 0, 0);
@@ -2076,70 +1987,46 @@ async function buildGitHubOutcomeReport(args) {
2076
1987
  const issueThirtyDays = issueWindows.find((window) => window.days === 30);
2077
1988
  return {
2078
1989
  generatedAt: new Date(args.nowMs).toISOString(),
2079
- title: "GitHub work delivered",
1990
+ title: "GitHub activity",
2080
1991
  metrics: [
2081
1992
  {
2082
- label: "Junior-only merge rate \xB7 30d",
2083
- value: formatPercent(thirtyDays.juniorOnlyRate)
2084
- },
2085
- {
2086
- label: "PR merge rate \xB7 30d",
1993
+ label: "PR closure merge rate \xB7 30d",
2087
1994
  value: formatPercent(thirtyDays.mergeRate)
2088
1995
  },
2089
1996
  {
2090
- label: "median PR merge time \xB7 30d",
1997
+ label: "Median PR merge time \xB7 merged in 30d",
2091
1998
  value: formatDuration(thirtyDays.medianMergeTimeMs)
2092
1999
  },
2093
2000
  {
2094
- label: "median issue close time \xB7 30d",
2001
+ label: "Median issue close time \xB7 closed in 30d",
2095
2002
  value: formatDuration(issueThirtyDays.medianCloseTimeMs)
2096
2003
  }
2097
2004
  ],
2098
2005
  widgets: [
2099
2006
  {
2100
- id: "pull-request-outcomes",
2007
+ id: "pull-requests-created",
2101
2008
  type: "bar_chart",
2102
- title: "Pull request outcomes",
2103
- description: "Daily outcomes",
2009
+ title: "Pull requests created",
2010
+ description: "Junior-owned pull requests opened per day",
2104
2011
  timeRangeDays: [...WINDOWS],
2105
- series: [
2106
- { key: "created", label: "Created" },
2107
- { key: "merged", label: "Merged", tone: "good" },
2108
- { key: "closed", label: "Closed unmerged", tone: "danger" }
2109
- ],
2012
+ series: [{ key: "created", label: "Created" }],
2110
2013
  categories: pullRequestDays.map((stats) => ({
2111
2014
  id: stats.date,
2112
2015
  label: stats.date,
2113
- values: {
2114
- created: stats.created,
2115
- merged: stats.merged,
2116
- closed: stats.closed
2117
- }
2016
+ values: { created: stats.created }
2118
2017
  }))
2119
2018
  },
2120
2019
  {
2121
- id: "issue-outcomes",
2020
+ id: "issues-created",
2122
2021
  type: "bar_chart",
2123
- title: "Issue outcomes",
2124
- description: "Daily outcomes",
2022
+ title: "Issues created",
2023
+ description: "Junior-owned issues opened per day",
2125
2024
  timeRangeDays: [...WINDOWS],
2126
- series: [
2127
- { key: "created", label: "Created" },
2128
- { key: "completed", label: "Completed", tone: "good" },
2129
- { key: "duplicate", label: "Duplicate", tone: "warning" },
2130
- { key: "notPlanned", label: "Not planned", tone: "danger" },
2131
- { key: "unknown", label: "Unknown" }
2132
- ],
2025
+ series: [{ key: "created", label: "Created" }],
2133
2026
  categories: issueDays.map((stats) => ({
2134
2027
  id: stats.date,
2135
2028
  label: stats.date,
2136
- values: {
2137
- created: stats.created,
2138
- completed: stats.closedCompleted,
2139
- duplicate: stats.closedDuplicate,
2140
- notPlanned: stats.closedNotPlanned,
2141
- unknown: stats.closedUnknown
2142
- }
2029
+ values: { created: stats.created }
2143
2030
  }))
2144
2031
  }
2145
2032
  ],
@@ -2150,10 +2037,10 @@ async function buildGitHubOutcomeReport(args) {
2150
2037
  fields: [
2151
2038
  { key: "repository", label: "Repository" },
2152
2039
  { key: "created", label: "Created" },
2040
+ { key: "juniorOnly", label: "Junior-only merges" },
2153
2041
  { key: "merged", label: "Merged" },
2154
2042
  { key: "closed", label: "Closed unmerged" },
2155
- { key: "commitComposition", label: "Merged commit composition" },
2156
- { key: "mergeRate", label: "Merge rate" }
2043
+ { key: "mergeRate", label: "Closure merge rate" }
2157
2044
  ],
2158
2045
  records: repositories.map(({ repository, ...stats }) => ({
2159
2046
  id: repository,
@@ -2162,7 +2049,7 @@ async function buildGitHubOutcomeReport(args) {
2162
2049
  created: String(stats.created),
2163
2050
  merged: String(stats.merged),
2164
2051
  closed: String(stats.closed),
2165
- commitComposition: formatCommitComposition(stats),
2052
+ juniorOnly: String(stats.juniorOnly),
2166
2053
  mergeRate: formatPercent(stats.mergeRate)
2167
2054
  }
2168
2055
  }))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/junior-github",
3
- "version": "0.111.0",
3
+ "version": "0.112.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -31,7 +31,7 @@
31
31
  "@sinclair/typebox": "^0.34.49",
32
32
  "drizzle-orm": "^0.45.2",
33
33
  "zod": "^4.4.3",
34
- "@sentry/junior-plugin-api": "0.111.0"
34
+ "@sentry/junior-plugin-api": "0.112.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "^25.9.1",