Settings ▸ Quicklinks rows now carry an AliasField, keyed by the quicklink's
entry ID, so a quicklink can be reached by a short alias like any application.
AliasField takes the preference key and name directly, with an init(entry:)
for the panes built on LauncherItemsSection.
The field dims on a quicklink hidden from root search, whose entry the ranker
never sees. Ranking, the launcher's alias chip, backup coverage and alias
cleanup on delete were already kind-agnostic and needed no change.
Closes#383
- Introduced `ownerName` property in `SearchFields` and `AppEntry` to represent the extension a command originates from.
- Updated scoring logic in `SearchRelevance` to include `ownerName` in the ranking process.
- Enhanced fuzz tests to validate the new owner name functionality.
- Updated documentation to reflect changes in searchable fields and owner name usage.
Not everyone wants tomorrow's schedule in front of them. The Calendar
pane gains an Include Tomorrow's Events switch, on by default, and
turning it off narrows the EventKit query itself rather than what any
surface shows — so the join card, the chord, the menu bar, My Schedule
and the launcher slice all follow from the one snapshot, and an 11pm
Join Next Meeting never reaches for tomorrow's stand-up.
`MeetingSpan` owns both the interval the query runs over and the wording
of the sentences that name those days, which is what stops a string
saying "today's and tomorrow's" over a fetch that covered one day. The
store re-reads when the span changes under it, but only once it has read
at all, so enabling the feature still fires a single query.
The `.schedule` placeholder no longer names days: it is a static
`PaletteMode` string that cannot read the setting, and one advertising a
span it could not honour would be wrong half the time.
Carried in a settings backup, unlike `calendarEnabled` and its
neighbours: it narrows what is read rather than widening what can be
reached.
Closes#361
Someone signed into several Google accounts lands on the account chooser
every time. `MeetingLink` now carries the address the current user holds
in the invite — their attendee entry, or the organizer for a meeting
booked with no guests — and `webURL` appends `?authuser=` for Meet.
`url` stays the link as written, so Copy Meeting Link and the failure
report carry no address of ours, and a link that already names an
authuser is left alone.
Closes#365
- Introduce allowsAction property in HotKeyManager to control action availability based on category settings.
- Update VisibilityStore to manage disabled kinds instead of hidden kinds, affecting launcher visibility and hotkey execution.
- Refactor SystemPromptEditor to handle enabled state more effectively, ensuring proper interaction based on settings.
- Adjust LauncherItemsSection to reflect changes in visibility logic and improve user feedback on enabled states.
- Update documentation to clarify the relationship between category switches and their impact on hotkeys and visibility.
Phase 32 left three survivors, each for a different reason and all the
same finding: AppCore still owns what comparable types own for
themselves.
QuicklinkCoordinator is the only coordinator not handed a
paletteCoordinator; its six siblings take one. That inconsistency alone
keeps the showPalette and hidePalette forwarders alive. runWindowCommand
is the only feature action still implemented on AppCore, because window
management is the only feature without a coordinator. SettingsBackup's
gather/apply carry a `= .shared` default that no caller ever supplies,
while BackupActions reaches the singleton six times outright — the same
coupling in two spellings, one of which defeats the grep that measures
it.
Nothing else in the roadmap picks these up: 33 puts gather/apply on its
own must-NOT-change list, 35 touches SettingsBackup only for a comment,
and no phase mentions window management. 32b must therefore land before
33, which freezes the two signatures.
Roadmap gains the phase row, the status row, a risk-register entry for
the window-command funnel, and M6 goes 4 phases/~14 h to 5/~17 h.
Update the naming vocabulary to reflect two renames: `CommandRegistry` to `CommandCatalog` and `PaletteViewModel` to `PaletteState`. The ten-suffix vocabulary table is documented in `AGENTS.md`, including its membership lists and exceptions. Removed references to previously proposed renames that were cut, ensuring no persisted keys or string literals were altered. All changes verified against the codebase to maintain consistency and clarity.
- Launcher search results now sit under a single "Results" header
(Raycast-style), while the empty-query per-kind sections are unchanged.
- Add two shared Theme.Spacing tokens driving every palette list's
SectionHeader: sectionHeaderBottom (header→first row) and
sectionSpacing (gap above every header except the list's first, which
reads as the previous section's closing padding). SectionHeader gains
an isFirst flag; each list passes isFirst via the first-row id.
- Document the shared SectionHeader/tokens and the menu-open input
freeze in CLAUDE.md.
- The primary/Actions footer group is hidden whenever the current mode
has no results (not just for an error calc card), so a query that
matches nothing shows no "Open … / Actions ⌘K" controls.
- Launch labels: system settings now reads "Open System Setting" (was
"Open") and commands read "Open Command" (was "Run Command"), in both
the footer pill and the ⌘K menu's primary item.
When a footer popover menu (⌘K Actions / app menu) is open, the search
field kept accepting input and showed a blinking caret, and clearing the
query while the menu was up corrupted the compact-bar state. Now the
field reads as inert while a menu owns the keyboard — matching Raycast —
without ever resigning first responder, so its text/placeholder never
reflows:
- PalettePanel.sendEvent swallows text-editing keystrokes while
menuOpen, letting shortcut chords (⌘K, ⌘⌫) and menu-nav keys reach
SwiftUI's onKeyPress.
- The caret is hidden by tuning SwiftUI's own live field editor
(insertionPointColor) via PaletteViewModel.onMenuOpenChanged — not by
changing focus (which caused the field-editor↔cell reflow) and not by
replacing the field editor (SwiftUI force-casts it to a private type
and aborts).
Also fix clipboard ⌘↵ pasting instead of copying while the menu is open:
the Return handler activated the highlighted menu row for any Return,
ignoring modifiers. Now only plain ↵ activates the row; a modified ↵
always runs the mode-specific action, so ⌘↵ copies to clipboard whether
or not the menu is open.