Skip to content

feat: the menu bar is a surface, not a launcher (goal 0189) - #519

Merged
alicoding merged 1 commit into
mainfrom
feat/0189-menu-bar-surface
Aug 29, 2026
Merged

feat: the menu bar is a surface, not a launcher (goal 0189)#519
alicoding merged 1 commit into
mainfrom
feat/0189-menu-bar-surface

Conversation

@alicoding

Copy link
Copy Markdown
Owner

Owner-raised: "when I click the Mill icon it just opens the app... jobs that are running that you can quickly pause or stop, Docker style." The tray icon now anchors a real status surface.

  • Attached panel: left-click toggles a 340×440 panel via SystemTray.AttachWindow — a DECLARED non-activating NSPanel (beta.12 MacWindowClassPanel + PanelPreferences{FloatingPanel, NonActivating, BecomesKeyOnlyIfNeeded}), never hand-managed activation (the 0182/0186/0188 defect seam). Its own window, deliberately not the Quick Panel's (owner decision 2026-08-24).
  • Panel content (app/TrayPanel.tsx at /#/traypanel): presence header ("Mill · Running" + Open Mill), Needs you (parked runs / agent writes / plugin asks — rows land on Review), Running now with per-run Stop (CancelRun; Stop not Pause, per the goal's engine audit — a Pause button that doesn't pause is the lie this product exists to remove), and the honest quit contract: quitting first names how many automatic workflows (schedules/hotkeys/watchers) stop.
  • Icon: SetTemplateIcon replaces SetIcon (adapts to menu-bar appearance); SetLabel shows the pending count, driven by the SAME frontend aggregate the dock badge uses (SetPendingBadge's injected tray hook — one count, two chromes). Right-click keeps the native Open Mill/Quit menu.
  • Proofs: panel content e2e (dedicated server pair — empty states, quit contract, a parked run's Needs-you row partitioned from Running), runningRuns split Vitest'd, the badge→tray fan-out Go-tested (with a new dockBadgeSetFn seam — the real dock call hangs headless), and the OS attachment (click-toggle, label, template rendering, click-away) joins testing.md's manual-only registry. State screenshots reviewed against the design contract. Riders: tray setup moved beside the aux-window family (main.go 500-line gate).

🤖 Generated with Claude Code

https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq

The tray icon's left-click now toggles an attached status panel
(SystemTray.AttachWindow + a declared non-activating NSPanel, beta.12
MacWindowClassPanel — never hand-managed activation, the 0182/0186/0188
seam). The panel carries presence, a Needs-you section (parked runs,
agent writes, plugin asks — rows land on Review), Running-now with
per-run Stop (CancelRun; Stop not Pause per the goal's engine audit),
and the honest quit contract naming how many automatic workflows stop.
SetTemplateIcon replaces SetIcon; SetLabel shows the pending count,
driven by the SAME frontend aggregate the dock badge uses
(SetPendingBadge's injected tray hook — one count, two chromes).
Right-click keeps the native Open Mill/Quit menu. Panel content
e2e-proven at /#/traypanel (dedicated server pair); the OS attachment
joins testing.md's manual-only registry. Tray setup moves beside the
aux-window family (main.go's 500-line convention).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012im1JxQQV2ahnXzZDdVmZq
@alicoding
alicoding enabled auto-merge (squash) August 29, 2026 17:24
@alicoding
alicoding merged commit dd5d21b into main Aug 29, 2026
30 checks passed
@alicoding
alicoding deleted the feat/0189-menu-bar-surface branch August 29, 2026 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant