Skip to content
ReviewOS
Features
Review
Durable review threads
Comments that follow the line through a rebase instead of vanishing.
Stacked pull requests
Dependent changes that merge in order and retarget themselves.
Agentic review
Coding agents as first-class authors and reviewers, with the audit trail to match.
Diffs that stay fast
Rendered on the server, against the merge base, readable at a hundred files.
Merge strategies and rules
Merge, squash, or rebase, gated by approvals, threads, and checks.
Repositories
Plain git hosting
Ordinary bare repositories on your disk, driven by the git binary.
Issues that link up
One number sequence, closing keywords, and references that resolve.
Search that reads like a query
Qualifiers, quoting, and negation, parsed properly rather than by regex.
Automation
Checks from your own CI
A status API your existing pipeline reports into, enforced at merge.
Webhooks you can trust
Signed, retried with backoff, and blocked from reaching your own network.
Notifications worth reading
Every message says why it reached you, and a burst arrives as one.
Operations
Self-hosting without a cluster
One database and one process. Scale the parts that need it, later.
Pages for every repository
A docs folder is a documentation site. Push, and the site is the branch.
Every feature, in one place.
All features
Repositories
Activity
Docs
Sign in
Sign up
Reload
also looking at this
stacks
/
stx
style(desktop): format the two files holding the format check red
#1949
Merged
glennmichael123 wants to merge
fix/desktop-format
into
main
2 files
+30
-29
Conversation
Commits
Checks
Files changed
Review screen
File 2 of 2
previous
all files
packages/desktop/src/menu.ts
modified
+25
-24
formatting only · 44 hidden lines
Changes to packages/desktop/src/menu.ts
@@ -61,25 +61,25 @@
import { hasBridge, onCraftEvent } from './_bridge'
formatting only
61
61
*
insensitively
;
this
list
is
the
canonical
casing
.
62
62
*
/
63
63
export
type
MenuRole
=
64
-
|
'about'
65
-
|
'hide'
66
-
|
'hideOthers'
67
-
|
'showAll'
68
-
|
'quit'
69
-
|
'undo'
70
-
|
'redo'
71
-
|
'cut'
72
-
|
'copy'
73
-
|
'paste'
74
-
|
'delete'
75
-
|
'selectAll'
76
-
|
'close'
77
-
|
'minimize'
78
-
|
'zoom'
79
-
|
'front'
80
-
|
'fullscreen'
81
-
|
'reload'
82
-
|
'forceReload'
64
+
|
'about'
65
+
|
'hide'
66
+
|
'hideOthers'
67
+
|
'showAll'
68
+
|
'quit'
69
+
|
'undo'
70
+
|
'redo'
71
+
|
'cut'
72
+
|
'copy'
73
+
|
'paste'
74
+
|
'delete'
75
+
|
'selectAll'
76
+
|
'close'
77
+
|
'minimize'
78
+
|
'zoom'
79
+
|
'front'
80
+
|
'fullscreen'
81
+
|
'reload'
82
+
|
'forceReload'
83
83
84
84
export
interface
MenuItem
{
85
85
/** Stable identifier. The same id is reported by `onAction`. */
Changes to packages/desktop/src/menu.ts
@@ -297,11 +297,12 @@
export const menu: MenuAPI = {
297
297
const
{
payload
,
handlers
}
=
extractHandlers
(
appMenu
)
298
298
299
299
disposeHandlers
?
.
(
)
300
-
disposeHandlers
=
handlers
.
size
>
0
301
-
?
onCraftEvent
<
MenuActionEvent
>
(
'craft:menu:action'
,
(
event
)
=>
{
302
-
handlers
.
get
(
event
.
id
)
?
.
(
)
303
-
}
)
304
-
:
null
300
+
disposeHandlers
=
null
301
+
if
(
handlers
.
size
>
0
)
{
302
+
disposeHandlers
=
onCraftEvent
<
MenuActionEvent
>
(
'craft:menu:action'
,
(
event
)
=>
{
303
+
handlers
.
get
(
event
.
id
)
?
.
(
)
304
+
}
)
305
+
}
305
306
306
307
await
window
.
craft
!
.
menu
.
set
(
payload
)
307
308
return
true