Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
206 commits
Select commit Hold shift + click to select a range
ab5adc3
Generated with Hive: Add recursive pagination to useRepoBranches and …
tomastiminskas Mar 17, 2026
a2ec37a
Merge remote-tracking branch 'origin/master' into feature/cmmuous5r00…
tomastiminskas Mar 17, 2026
5a34f9c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 17, 2026
417a442
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
38805c9
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
73bc158
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
85018ad
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
0ca7fe9
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
ef3751c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
992eb42
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
074da6c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
19044d3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 18, 2026
90d8662
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
5033ee3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
acb04f3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
41ef832
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
948efa7
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
67785e4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
74a2870
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
7e9f3eb
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
8d087e8
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
2c5c820
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
87d44fb
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 19, 2026
ac6fac1
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
0b8a212
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
d98392d
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
ad53475
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
895f952
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
907a957
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
1eb00b2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
477ccbb
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
7658dc5
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
06ad2cb
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
53087b5
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
ab98d8d
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
bba2fa9
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
8622b79
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
55940f9
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 20, 2026
8985af9
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 21, 2026
0f2f15f
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 22, 2026
21ccbd5
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 22, 2026
991d58f
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 23, 2026
d46e3ea
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 23, 2026
f52b50e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 24, 2026
ecc2cb2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 24, 2026
6d6ff1a
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 24, 2026
2fae4d4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 25, 2026
29bf6fa
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 25, 2026
eb75dd8
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 26, 2026
d9103f3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Mar 26, 2026
f9b019f
Generated with Hive: Add retry logic to GitHub deployment step in dep…
tomsmith8 Apr 1, 2026
425568f
Merge remote-tracking branch 'origin/master' into feature/cmmuous5r00…
tomsmith8 Apr 1, 2026
73858f6
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
900607d
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
b8cc524
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
8c34927
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
3f1620a
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
6cd9d52
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
4ad4e16
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
68ff5f2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
003d83c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 1, 2026
e1a5e14
Generated with Hive: Handle Neon endpoint deletion during deploy prev…
tomastiminskas Apr 1, 2026
f69af5c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
419c2b2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
bd67df5
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
67423ab
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
a9021a3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
77748fb
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
b8d9678
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
0d4b5d2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
f92a41d
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
5695e77
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
39e7d98
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
03bde00
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 2, 2026
e9e6fb4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
1b2dee5
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
c36fb68
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
8a56f09
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
8f02080
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
b6be030
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
8b58760
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
cc234a7
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
3bbc57e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 3, 2026
6db7d35
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 4, 2026
9a6da41
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 4, 2026
e1c9e61
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 4, 2026
091be01
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 5, 2026
4a340e0
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 5, 2026
e5e2f13
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 5, 2026
6db027e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
a212c7d
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
a36fda2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
75aef01
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
a139d58
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
4ba7c3c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
c48a915
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
500807c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
e919383
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
f263f95
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
07e3306
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
3b04162
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
ac6862b
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
ced6777
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
59f5add
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 6, 2026
085b902
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
f00b8e8
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
608c82c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
f9ce9d9
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
552651e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
26cfc17
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
4387436
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
cc343b1
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
7a217a4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
432aed8
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
67d7fe5
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 7, 2026
19daa46
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
025161e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
447fa2f
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
ca7247c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
890e92e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
bde2afc
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
7a37776
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
418f68f
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
b3e6572
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 8, 2026
62e0157
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
a50c51f
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
a9130cb
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
2db21df
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
fc788bb
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
b41f891
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
1f3e777
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
a85e3c4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
b7f0fdc
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 9, 2026
304dec3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
2ba473a
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
ef84684
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
e9329a8
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
9a8ede3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
9a0661c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
6e3e65e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
5583d5c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 10, 2026
253cfc2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 11, 2026
29fa7f3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 12, 2026
a52acee
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 12, 2026
da15a87
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 12, 2026
d16d295
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
01233bd
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
c9e7176
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
f8c2e88
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
6bef271
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
108400a
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
e24d7b9
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
33f464d
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 13, 2026
30727bd
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
1cefed1
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
611f23e
Generated with Hive: Handle Neon API permanent not found errors and a…
tomastiminskas Apr 14, 2026
6a118f4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
1d77557
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
6bcf729
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
4d63cc0
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
651b6b3
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
5e1c3dc
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
b01449a
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
5c52f89
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
06947f0
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
d2b98aa
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
ccb0993
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
aafa691
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
4bb2b78
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
527f53e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
7dda46e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
a4b52ea
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
4f9dc5f
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
37e14a0
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
753f943
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
4293f11
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
ca826e0
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
af0c59d
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
ff649d1
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 14, 2026
a9b88f4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 15, 2026
f591ec4
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 15, 2026
2e6b379
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 15, 2026
e536b08
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 15, 2026
bf51a0c
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 15, 2026
3763718
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 16, 2026
d65ff7e
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 16, 2026
70380cf
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 16, 2026
592a1da
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 16, 2026
614f7d1
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 16, 2026
198c549
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 16, 2026
de71629
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 16, 2026
24b2c15
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 17, 2026
38d5dde
Generated with Hive: Set sendAfter atomically when creating deferred …
tomastiminskas Apr 17, 2026
781d6ff
Generated with Hive: Refactor notification test to check atomic defer…
tomastiminskas Apr 17, 2026
317ca37
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 17, 2026
e154e76
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 17, 2026
63f4af0
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 17, 2026
ee8df72
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 17, 2026
b2ce5a2
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 20, 2026
f2aacd1
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 20, 2026
cfcf444
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 20, 2026
36303fd
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 20, 2026
89af175
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 20, 2026
9c6554a
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 20, 2026
2c1214e
Generated with Hive: Fix CI download-artifact action version to resto…
tomastiminskas Apr 20, 2026
e0646b1
Merge branch 'master' into feature/cmmuous5r0005jv04ba9nxu2h-recursiv…
tomsmith8 Apr 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 113 additions & 11 deletions .github/workflows/deployPR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,12 @@ jobs:
echo "$response"
return 0
fi
# Fast-fail on permanent "not found" errors — retrying will not help
if echo "$response" | jq -r '.message // empty' 2>/dev/null | grep -qi "not found"; then
echo "⚠️ Neon API permanent error for $url — got: ${response:0:120}" >&2
echo "$response"
return 1
fi
echo "⚠️ Neon API bad/empty response (attempt $attempt/5) for $url — got: ${response:0:120}" >&2
sleep 10
done
Expand Down Expand Up @@ -192,7 +198,16 @@ jobs:

# Wait until endpoint is ready (GET endpoint does not return credentials)
for i in {1..30}; do
STATUS=$(neon_curl "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/endpoints/$ENDPOINT_ID" "endpoint")
STATUS=$(neon_curl "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/endpoints/$ENDPOINT_ID" "endpoint") || {
# Endpoint may have been deleted externally (race condition / concurrent run)
if echo "$STATUS" | grep -q "not found"; then
echo "⚠️ Endpoint $ENDPOINT_ID was deleted mid-wait, will recreate..."
ENDPOINT_ID=""
break
fi
echo "❌ Failed to poll endpoint status after retries"
exit 1
}
STATE=$(echo "$STATUS" | jq -r '.endpoint.current_state')
DB_HOST=$(echo "$STATUS" | jq -r '.endpoint.host')
if [ "$STATE" = "ready" ] && [ -n "$DB_HOST" ] && [ "$DB_HOST" != "null" ]; then
Expand All @@ -202,6 +217,82 @@ jobs:
sleep 3
done

# If endpoint disappeared during the wait loop, find or create a replacement
if [ -z "$ENDPOINT_ID" ] || [ "$ENDPOINT_ID" = "null" ]; then
echo "🔄 Re-fetching branches and endpoints to find/create a replacement..."

# The branch itself may have been deleted — re-verify and recreate if needed
BRANCHES_JSON=$(neon_curl "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches" "branches")
BRANCH_ID=$(echo "$BRANCHES_JSON" | jq -r ".branches[] | select(.name==\"$BRANCH_NAME\") | .id")

if [ -z "$BRANCH_ID" ] || [ "$BRANCH_ID" = "null" ]; then
echo "⚠️ Branch $BRANCH_NAME no longer exists — recreating..."
RESPONSE=$(neon_curl "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches" "branch" \
-X POST \
-H "Content-Type: application/json" \
-d "{\"branch\":{\"name\":\"$BRANCH_NAME\",\"parent_id\":\"$PARENT_BRANCH_ID\",\"expires_at\":\"$EXPIRY\"}}")
BRANCH_ID=$(echo "$RESPONSE" | jq -r '.branch.id')
if [ -z "$BRANCH_ID" ] || [ "$BRANCH_ID" = "null" ]; then
echo "❌ Failed to recreate branch $BRANCH_NAME"
exit 1
fi
echo "✅ Branch recreated: $BRANCH_ID"
# Wait for the new branch to be ready
for i in {1..20}; do
BRANCH_STATUS=$(neon_curl "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches/$BRANCH_ID" "branch")
STATE=$(echo "$BRANCH_STATUS" | jq -r '.branch.current_state')
if [ "$STATE" = "ready" ]; then break; fi
echo "Waiting for recreated branch... ($i)"
sleep 3
done
fi

ENDPOINTS_JSON=$(neon_curl "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/endpoints" "endpoints")
ENDPOINT_ID=$(echo "$ENDPOINTS_JSON" | jq -r ".endpoints[] | select(.branch_id==\"$BRANCH_ID\") | .id")

if [ -z "$ENDPOINT_ID" ] || [ "$ENDPOINT_ID" = "null" ]; then
RESPONSE=$(curl -s -H "Authorization: Bearer $NEON_API_KEY" \
-X POST -H "Content-Type: application/json" \
-d "{\"endpoint\":{\"branch_id\":\"$BRANCH_ID\",\"type\":\"read_write\"}}" \
"https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/endpoints")

if echo "$RESPONSE" | jq -e '.endpoint' > /dev/null 2>&1; then
ENDPOINT_ID=$(echo "$RESPONSE" | jq -r '.endpoint.id')
else
echo "⚠️ Endpoint creation failed: $(echo "$RESPONSE" | jq -r '.message // .code // empty')"
echo "♻️ Looking for a stale endpoint to reassign..."
STALE_ENDPOINT_ID=$(echo "$ENDPOINTS_JSON" | jq -r \
--arg bid "$BRANCH_ID" \
--arg pbid "$PARENT_BRANCH_ID" \
'.endpoints[] | select(.branch_id != $bid and .branch_id != $pbid and .type == "read_write") | .id' \
| head -1)
if [ -z "$STALE_ENDPOINT_ID" ] || [ "$STALE_ENDPOINT_ID" = "null" ]; then
echo "❌ No stale endpoint available to reassign"
exit 1
fi
echo "♻️ Reassigning endpoint $STALE_ENDPOINT_ID to branch $BRANCH_ID..."
RESPONSE=$(neon_curl \
"https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/endpoints/$STALE_ENDPOINT_ID" "endpoint" \
-X PATCH \
-H "Content-Type: application/json" \
-d "{\"endpoint\":{\"branch_id\":\"$BRANCH_ID\"}}")
ENDPOINT_ID=$(echo "$RESPONSE" | jq -r '.endpoint.id')
fi
fi

# Wait for the replacement endpoint to be ready
for i in {1..30}; do
STATUS=$(neon_curl "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/endpoints/$ENDPOINT_ID" "endpoint")
STATE=$(echo "$STATUS" | jq -r '.endpoint.current_state')
DB_HOST=$(echo "$STATUS" | jq -r '.endpoint.host')
if [ "$STATE" = "ready" ] && [ -n "$DB_HOST" ] && [ "$DB_HOST" != "null" ]; then
break
fi
echo "Waiting for replacement endpoint... ($i)"
sleep 3
done
fi

if [ -z "$DB_HOST" ] || [ "$DB_HOST" = "null" ]; then
echo "❌ Endpoint never became ready"
exit 1
Expand Down Expand Up @@ -426,16 +517,27 @@ jobs:
uses: actions/github-script@v7
with:
script: |
const deployment = await github.rest.repos.createDeployment({
owner: context.repo.owner,
repo: context.repo.repo,
ref: context.sha,
environment: `preview-${{ github.event.pull_request.number }}`,
auto_merge: false,
required_contexts: [],
description: 'PR preview deployment'
});
return deployment.data.id;
const maxAttempts = 5;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
const deployment = await github.rest.repos.createDeployment({
owner: context.repo.owner,
repo: context.repo.repo,
ref: context.sha,
environment: `preview-${{ github.event.pull_request.number }}`,
auto_merge: false,
required_contexts: [],
description: 'PR preview deployment'
});
return deployment.data.id;
} catch (err) {
console.log(`Attempt ${attempt}/${maxAttempts} failed: ${err.status} ${err.message}`);
if (attempt === maxAttempts) throw err;
const wait = attempt * 15000;
console.log(`Waiting ${wait / 1000}s before retry...`);
await new Promise(r => setTimeout(r, wait));
}
}

- name: Mark Success
if: success() && steps.deployment.outputs.result
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ jobs:
run: npm ci

- name: Download Playwright Blob Reports
uses: actions/download-artifact@v4
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
continue-on-error: true
with:
pattern: playwright-blob-*
Expand Down
149 changes: 149 additions & 0 deletions src/__tests__/unit/hooks/useRepoBranches.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ const MOCK_BRANCHES = [
{ name: "dev", sha: "def456" },
];

/** Build an array of N mock branches */
function makeBranches(count: number, offset = 0) {
return Array.from({ length: count }, (_, i) => ({
name: `branch-${offset + i}`,
sha: `sha-${offset + i}`,
}));
}

describe("useRepoBranches", () => {
beforeEach(() => {
vi.stubGlobal("fetch", vi.fn());
Expand Down Expand Up @@ -41,6 +49,11 @@ describe("useRepoBranches", () => {

expect(result.current.branches).toEqual(MOCK_BRANCHES);
expect(result.current.error).toBeNull();
// Single page (< 100 items) — only one fetch call
expect(fetch).toHaveBeenCalledTimes(1);
const calledUrl = vi.mocked(fetch).mock.calls[0][0] as string;
expect(calledUrl).toContain("page=1");
expect(calledUrl).toContain("per_page=100");
});

it("sets isLoading true during fetch and false after", async () => {
Expand Down Expand Up @@ -155,4 +168,140 @@ describe("useRepoBranches", () => {
await waitFor(() => expect(result.current.branches).toEqual(branches2));
expect(fetch).toHaveBeenCalledTimes(2);
});

// --- Pagination tests ---

it("fetches multiple pages and accumulates all branches (100 + 40 = 140)", async () => {
const page1 = makeBranches(100, 0);
const page2 = makeBranches(40, 100);

vi.mocked(fetch)
.mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: page1 }),
} as Response)
.mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: page2 }),
} as Response);

const { result } = renderHook(() =>
useRepoBranches(REPO_URL, WORKSPACE_SLUG),
);

act(() => { result.current.fetchBranches(); });

await waitFor(() => expect(result.current.isLoading).toBe(false));

expect(result.current.branches).toHaveLength(140);
expect(result.current.branches).toEqual([...page1, ...page2]);
expect(fetch).toHaveBeenCalledTimes(2);

const call1Url = vi.mocked(fetch).mock.calls[0][0] as string;
const call2Url = vi.mocked(fetch).mock.calls[1][0] as string;
expect(call1Url).toContain("page=1");
expect(call2Url).toContain("page=2");
expect(call1Url).toContain("per_page=100");
expect(call2Url).toContain("per_page=100");
});

it("continues fetching when page returns exactly 100 items, stops on empty next page", async () => {
const page1 = makeBranches(100, 0);

vi.mocked(fetch)
.mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: page1 }),
} as Response)
.mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: [] }),
} as Response);

const { result } = renderHook(() =>
useRepoBranches(REPO_URL, WORKSPACE_SLUG),
);

act(() => { result.current.fetchBranches(); });

await waitFor(() => expect(result.current.isLoading).toBe(false));

expect(result.current.branches).toHaveLength(100);
expect(fetch).toHaveBeenCalledTimes(2);
});

it("stops after one fetch when page 1 returns fewer than 100 items", async () => {
const page1 = makeBranches(42, 0);

vi.mocked(fetch).mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: page1 }),
} as Response);

const { result } = renderHook(() =>
useRepoBranches(REPO_URL, WORKSPACE_SLUG),
);

act(() => { result.current.fetchBranches(); });

await waitFor(() => expect(result.current.isLoading).toBe(false));

expect(result.current.branches).toHaveLength(42);
expect(fetch).toHaveBeenCalledTimes(1);
});

it("fetches three pages and accumulates all branches (100 + 100 + 50 = 250)", async () => {
const page1 = makeBranches(100, 0);
const page2 = makeBranches(100, 100);
const page3 = makeBranches(50, 200);

vi.mocked(fetch)
.mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: page1 }),
} as Response)
.mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: page2 }),
} as Response)
.mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: page3 }),
} as Response);

const { result } = renderHook(() =>
useRepoBranches(REPO_URL, WORKSPACE_SLUG),
);

act(() => { result.current.fetchBranches(); });

await waitFor(() => expect(result.current.isLoading).toBe(false));

expect(result.current.branches).toHaveLength(250);
expect(fetch).toHaveBeenCalledTimes(3);

const call3Url = vi.mocked(fetch).mock.calls[2][0] as string;
expect(call3Url).toContain("page=3");
});

it("does not re-fetch for the same repoUrl + workspaceSlug (cache)", async () => {
vi.mocked(fetch).mockResolvedValueOnce({
ok: true,
json: async () => ({ branches: MOCK_BRANCHES }),
} as Response);

const { result } = renderHook(() =>
useRepoBranches(REPO_URL, WORKSPACE_SLUG),
);

act(() => { result.current.fetchBranches(); });
await waitFor(() => expect(result.current.isLoading).toBe(false));

// Second call — should be a no-op due to cache
act(() => { result.current.fetchBranches(); });

// Still only 1 fetch total
expect(fetch).toHaveBeenCalledTimes(1);
expect(result.current.branches).toEqual(MOCK_BRANCHES);
});
});
10 changes: 5 additions & 5 deletions src/__tests__/unit/services/notifications.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,21 +177,21 @@ describe("createAndSendNotification", () => {
findFirst.mockResolvedValue(null);
create.mockResolvedValue(mockRecord);
userFindUnique.mockResolvedValue(userWithPubkey);
update.mockResolvedValue({ ...mockRecord });

await createAndSendNotification(baseInput);

expect(create).toHaveBeenCalledOnce();
expect(mockedSendDirectMessage).not.toHaveBeenCalled();
expect(update).toHaveBeenCalledWith(
// sendAfter + message are now written atomically in the create call, so no
// separate update call should happen for deferred notification types.
expect(create).toHaveBeenCalledWith(
expect.objectContaining({
where: { id: "notif-1" },
data: expect.objectContaining({
sendAfter: expect.any(Date),
message: baseInput.message,
}),
})
);
expect(mockedSendDirectMessage).not.toHaveBeenCalled();
expect(update).not.toHaveBeenCalled();
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,12 @@ export async function GET(
repository = mockGitHubState.createRepository(owner, repo);
}

const branches = mockGitHubState.getBranches(owner, repo);
const page = Math.max(1, parseInt(request.nextUrl.searchParams.get("page") ?? "1", 10));
const perPage = Math.max(1, parseInt(request.nextUrl.searchParams.get("per_page") ?? "100", 10));

const allBranches = mockGitHubState.getBranches(owner, repo);
const start = (page - 1) * perPage;
const branches = allBranches.slice(start, start + perPage);
return NextResponse.json(branches);
} catch (error) {
console.error("Mock GitHub branches error:", error);
Expand Down
14 changes: 14 additions & 0 deletions src/app/api/mock/seed-branches/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { NextRequest, NextResponse } from "next/server";
import { mockGitHubState } from "@/lib/mock/github-state";

export async function POST(request: NextRequest) {
const { owner, repo, branches } = await request.json();
if (!mockGitHubState.getRepository(owner, repo)) {
mockGitHubState.createRepository(owner, repo);
}
for (const name of branches) {
mockGitHubState.createBranch(owner, repo, name, false);
}
const all = mockGitHubState.getBranches(owner, repo);
return NextResponse.json({ count: all.length, branches: all.map(b => b.name) });
}
Loading
Loading