Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 26 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,32 @@ SHIBUMI_AGENTS_OMARCHY_PATH=/tmp/omarchy-agents-b99fd91 \

Live acceptance must record what was actually exercised and must not claim unavailable hardware, credentials, multi-monitor, nested-compositor, or clean-chroot evidence as passed. Physical hardware gates require raw setup details, relevant command output, screenshots or video, and sanitized logs; fixtures cannot replace them.

## Change delivery approvals

Treat each delivery phase as a separate authorization boundary. Approval for one
phase never authorizes a later phase, and a bundled request must still be
confirmed immediately before each phase begins.

1. **Branch or worktree preparation:** show the intended branch and worktree
path, then obtain explicit approval before creating, deleting, or resetting
either one.
2. **Commit:** show the files or staged diff, validation result, and proposed
English commit message, then obtain explicit approval before creating the
local commit.
3. **Push:** report the exact commit hashes, source branch, and destination
remote branch, then obtain a new explicit approval before pushing.
4. **Pull request:** show the proposed base, head, title, body summary, and any
issue-closing keywords, then obtain a new explicit approval before creating,
editing, commenting on, or otherwise mutating the PR.
5. **Merge:** wait for the required checks and reviews, report their results and
the intended merge method, then obtain a new explicit approval before
merging. Do not treat PR approval or a general request to finish as merge
authorization.

Issue comments, labels, and closure are independent GitHub writes and require
separate explicit approval. Read-only status and CI inspection do not require
approval. If authorization is unclear, stop at the current phase and ask.

## Release safety

- Do not push, tag, publish a release, update Omarchy, log out, or reboot unless explicitly authorized.
Expand Down
37 changes: 33 additions & 4 deletions hancore.shibumi.ai/ShibumiPanel.qml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ PanelWindow {
property bool popoutSwitching: false
property bool popoutSwitchClosing: false
property Item focusTarget: null
property bool focusPrimed: false
property bool surfaceOverrideEnabled: false
property color surfaceColorOverride: "transparent"
property color surfaceBorderColorOverride: "transparent"
Expand Down Expand Up @@ -135,6 +136,19 @@ PanelWindow {
else root.open = false
}

function beginFocusPrime() {
if (open && backingWindowVisible) focusPrimeTimer.restart()
}

function requestKeyboardFocus(target) {
if (!open || !target) return
focusPrimed = false
beginFocusPrime()
Qt.callLater(function() {
if (root.open && target) target.forceActiveFocus()
})
}

screen: anchorWindow ? anchorWindow.screen : null
visible: open || card.opacity > 0 || popoutSwitching
color: "transparent"
Expand All @@ -143,7 +157,11 @@ PanelWindow {
WlrLayershell.namespace: "omarchy-keyboard-panel"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: open
? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None
? (focusPrimed ? WlrKeyboardFocus.OnDemand
: WlrKeyboardFocus.Exclusive)
: WlrKeyboardFocus.None

onBackingWindowVisibleChanged: beginFocusPrime()

anchors {
top: true
Expand Down Expand Up @@ -262,9 +280,14 @@ PanelWindow {
}

onOpenChanged: {
if (open && focusTarget) Qt.callLater(function() {
if (root.open && root.focusTarget) root.focusTarget.forceActiveFocus()
})
if (open) {
focusPrimed = false
beginFocusPrime()
if (focusTarget) requestKeyboardFocus(focusTarget)
} else {
focusPrimeTimer.stop()
focusPrimed = false
}
if (!bar) return
const activeOwner = typeof bar.activePopoutForScreen === "function"
? bar.activePopoutForScreen(popoutScreenName) : bar.activePopout
Expand All @@ -289,6 +312,12 @@ PanelWindow {
bar.clearConnectedPanel(coordinatorKey)
}

Timer {
id: focusPrimeTimer
interval: 75
onTriggered: if (root.open) root.focusPrimed = true
}

Timer {
id: popoutSwitchTimer
interval: 150
Expand Down
37 changes: 33 additions & 4 deletions hancore.shibumi.audio/ShibumiPanel.qml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ PanelWindow {
property bool popoutSwitching: false
property bool popoutSwitchClosing: false
property Item focusTarget: null
property bool focusPrimed: false
property bool surfaceOverrideEnabled: false
property color surfaceColorOverride: "transparent"
property color surfaceBorderColorOverride: "transparent"
Expand Down Expand Up @@ -135,6 +136,19 @@ PanelWindow {
else root.open = false
}

function beginFocusPrime() {
if (open && backingWindowVisible) focusPrimeTimer.restart()
}

function requestKeyboardFocus(target) {
if (!open || !target) return
focusPrimed = false
beginFocusPrime()
Qt.callLater(function() {
if (root.open && target) target.forceActiveFocus()
})
}

screen: anchorWindow ? anchorWindow.screen : null
visible: open || card.opacity > 0 || popoutSwitching
color: "transparent"
Expand All @@ -143,7 +157,11 @@ PanelWindow {
WlrLayershell.namespace: "omarchy-keyboard-panel"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: open
? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None
? (focusPrimed ? WlrKeyboardFocus.OnDemand
: WlrKeyboardFocus.Exclusive)
: WlrKeyboardFocus.None

onBackingWindowVisibleChanged: beginFocusPrime()

anchors {
top: true
Expand Down Expand Up @@ -262,9 +280,14 @@ PanelWindow {
}

onOpenChanged: {
if (open && focusTarget) Qt.callLater(function() {
if (root.open && root.focusTarget) root.focusTarget.forceActiveFocus()
})
if (open) {
focusPrimed = false
beginFocusPrime()
if (focusTarget) requestKeyboardFocus(focusTarget)
} else {
focusPrimeTimer.stop()
focusPrimed = false
}
if (!bar) return
const activeOwner = typeof bar.activePopoutForScreen === "function"
? bar.activePopoutForScreen(popoutScreenName) : bar.activePopout
Expand All @@ -289,6 +312,12 @@ PanelWindow {
bar.clearConnectedPanel(coordinatorKey)
}

Timer {
id: focusPrimeTimer
interval: 75
onTriggered: if (root.open) root.focusPrimed = true
}

Timer {
id: popoutSwitchTimer
interval: 150
Expand Down
37 changes: 33 additions & 4 deletions hancore.shibumi.battery/ShibumiPanel.qml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ PanelWindow {
property bool popoutSwitching: false
property bool popoutSwitchClosing: false
property Item focusTarget: null
property bool focusPrimed: false
property bool surfaceOverrideEnabled: false
property color surfaceColorOverride: "transparent"
property color surfaceBorderColorOverride: "transparent"
Expand Down Expand Up @@ -135,6 +136,19 @@ PanelWindow {
else root.open = false
}

function beginFocusPrime() {
if (open && backingWindowVisible) focusPrimeTimer.restart()
}

function requestKeyboardFocus(target) {
if (!open || !target) return
focusPrimed = false
beginFocusPrime()
Qt.callLater(function() {
if (root.open && target) target.forceActiveFocus()
})
}

screen: anchorWindow ? anchorWindow.screen : null
visible: open || card.opacity > 0 || popoutSwitching
color: "transparent"
Expand All @@ -143,7 +157,11 @@ PanelWindow {
WlrLayershell.namespace: "omarchy-keyboard-panel"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: open
? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None
? (focusPrimed ? WlrKeyboardFocus.OnDemand
: WlrKeyboardFocus.Exclusive)
: WlrKeyboardFocus.None

onBackingWindowVisibleChanged: beginFocusPrime()

anchors {
top: true
Expand Down Expand Up @@ -262,9 +280,14 @@ PanelWindow {
}

onOpenChanged: {
if (open && focusTarget) Qt.callLater(function() {
if (root.open && root.focusTarget) root.focusTarget.forceActiveFocus()
})
if (open) {
focusPrimed = false
beginFocusPrime()
if (focusTarget) requestKeyboardFocus(focusTarget)
} else {
focusPrimeTimer.stop()
focusPrimed = false
}
if (!bar) return
const activeOwner = typeof bar.activePopoutForScreen === "function"
? bar.activePopoutForScreen(popoutScreenName) : bar.activePopout
Expand All @@ -289,6 +312,12 @@ PanelWindow {
bar.clearConnectedPanel(coordinatorKey)
}

Timer {
id: focusPrimeTimer
interval: 75
onTriggered: if (root.open) root.focusPrimed = true
}

Timer {
id: popoutSwitchTimer
interval: 150
Expand Down
37 changes: 33 additions & 4 deletions hancore.shibumi.bluetooth/ShibumiPanel.qml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ PanelWindow {
property bool popoutSwitching: false
property bool popoutSwitchClosing: false
property Item focusTarget: null
property bool focusPrimed: false
property bool surfaceOverrideEnabled: false
property color surfaceColorOverride: "transparent"
property color surfaceBorderColorOverride: "transparent"
Expand Down Expand Up @@ -135,6 +136,19 @@ PanelWindow {
else root.open = false
}

function beginFocusPrime() {
if (open && backingWindowVisible) focusPrimeTimer.restart()
}

function requestKeyboardFocus(target) {
if (!open || !target) return
focusPrimed = false
beginFocusPrime()
Qt.callLater(function() {
if (root.open && target) target.forceActiveFocus()
})
}

screen: anchorWindow ? anchorWindow.screen : null
visible: open || card.opacity > 0 || popoutSwitching
color: "transparent"
Expand All @@ -143,7 +157,11 @@ PanelWindow {
WlrLayershell.namespace: "omarchy-keyboard-panel"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: open
? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None
? (focusPrimed ? WlrKeyboardFocus.OnDemand
: WlrKeyboardFocus.Exclusive)
: WlrKeyboardFocus.None

onBackingWindowVisibleChanged: beginFocusPrime()

anchors {
top: true
Expand Down Expand Up @@ -262,9 +280,14 @@ PanelWindow {
}

onOpenChanged: {
if (open && focusTarget) Qt.callLater(function() {
if (root.open && root.focusTarget) root.focusTarget.forceActiveFocus()
})
if (open) {
focusPrimed = false
beginFocusPrime()
if (focusTarget) requestKeyboardFocus(focusTarget)
} else {
focusPrimeTimer.stop()
focusPrimed = false
}
if (!bar) return
const activeOwner = typeof bar.activePopoutForScreen === "function"
? bar.activePopoutForScreen(popoutScreenName) : bar.activePopout
Expand All @@ -289,6 +312,12 @@ PanelWindow {
bar.clearConnectedPanel(coordinatorKey)
}

Timer {
id: focusPrimeTimer
interval: 75
onTriggered: if (root.open) root.focusPrimed = true
}

Timer {
id: popoutSwitchTimer
interval: 150
Expand Down
37 changes: 33 additions & 4 deletions hancore.shibumi.brightness/ShibumiPanel.qml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ PanelWindow {
property bool popoutSwitching: false
property bool popoutSwitchClosing: false
property Item focusTarget: null
property bool focusPrimed: false
property bool surfaceOverrideEnabled: false
property color surfaceColorOverride: "transparent"
property color surfaceBorderColorOverride: "transparent"
Expand Down Expand Up @@ -135,6 +136,19 @@ PanelWindow {
else root.open = false
}

function beginFocusPrime() {
if (open && backingWindowVisible) focusPrimeTimer.restart()
}

function requestKeyboardFocus(target) {
if (!open || !target) return
focusPrimed = false
beginFocusPrime()
Qt.callLater(function() {
if (root.open && target) target.forceActiveFocus()
})
}

screen: anchorWindow ? anchorWindow.screen : null
visible: open || card.opacity > 0 || popoutSwitching
color: "transparent"
Expand All @@ -143,7 +157,11 @@ PanelWindow {
WlrLayershell.namespace: "omarchy-keyboard-panel"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.keyboardFocus: open
? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None
? (focusPrimed ? WlrKeyboardFocus.OnDemand
: WlrKeyboardFocus.Exclusive)
: WlrKeyboardFocus.None

onBackingWindowVisibleChanged: beginFocusPrime()

anchors {
top: true
Expand Down Expand Up @@ -262,9 +280,14 @@ PanelWindow {
}

onOpenChanged: {
if (open && focusTarget) Qt.callLater(function() {
if (root.open && root.focusTarget) root.focusTarget.forceActiveFocus()
})
if (open) {
focusPrimed = false
beginFocusPrime()
if (focusTarget) requestKeyboardFocus(focusTarget)
} else {
focusPrimeTimer.stop()
focusPrimed = false
}
if (!bar) return
const activeOwner = typeof bar.activePopoutForScreen === "function"
? bar.activePopoutForScreen(popoutScreenName) : bar.activePopout
Expand All @@ -289,6 +312,12 @@ PanelWindow {
bar.clearConnectedPanel(coordinatorKey)
}

Timer {
id: focusPrimeTimer
interval: 75
onTriggered: if (root.open) root.focusPrimed = true
}

Timer {
id: popoutSwitchTimer
interval: 150
Expand Down
Loading