diff --git a/config/dot/hypr/DESKTOP-PARITY.md b/config/dot/hypr/DESKTOP-PARITY.md index b5afa57..a87c70f 100644 --- a/config/dot/hypr/DESKTOP-PARITY.md +++ b/config/dot/hypr/DESKTOP-PARITY.md @@ -37,13 +37,13 @@ Last live audit: 2026-08-17, Fedora 44, Hyprland 0.56.2, Quickshell 0.3.0. | Autostart apps | Nextcloud, Bitwarden, and RustDesk system service/tray | Live | | Printer administration | CUPS with the `system-config-printer` graphical interface | Live | | System settings | The Settings app for display policy, appearance, desktop, sound, focus, shortcuts, and services; labeled GNOME hardware/account handoffs | Live | -| System health and recovery | Settings → System Health, `Panama: Check System Health` in Vicinae, a degraded-only bar indicator, redacted reports, and bounded Panama-owned repairs | Live | +| System health and recovery | Settings → System Health, `Check System Health` in Vicinae, a degraded-only bar indicator, redacted reports, and bounded Panama-owned repairs | Live | ## System health and recovery Panama stays silent while the desktop is healthy. A compact bar indicator appears only for actionable warnings or errors and opens the same **System -Health** page available from Settings and the Vicinae command **Panama: Check +Health** page available from Settings and the Vicinae command **Check System Health**. The terminal summary is available with: ```bash diff --git a/config/dot/quickshell/modules/settings/README.md b/config/dot/quickshell/modules/settings/README.md index 7e4c214..29763f1 100644 --- a/config/dot/quickshell/modules/settings/README.md +++ b/config/dot/quickshell/modules/settings/README.md @@ -8,7 +8,7 @@ such rather than half-reimplemented. The stable internal `services` route renders **System Health**. It is reachable from the Settings sidebar and its live 54px footer, the degraded-only bar -indicator, and Vicinae's **Panama: Check System Health** command. Healthy scans +indicator, and Vicinae's **Check System Health** command. Healthy scans reserve no bar space and produce no notification. `services/Health.qml` owns the last accepted redacted snapshot. It invokes diff --git a/config/dot/quickshell/scripts/panama-action b/config/dot/quickshell/scripts/panama-action index 9f755d0..b8b5b45 100755 --- a/config/dot/quickshell/scripts/panama-action +++ b/config/dot/quickshell/scripts/panama-action @@ -109,6 +109,19 @@ case "$action" in clipboard) qs ipc call clipboard open ;; overview) qs ipc call overview open ;; settings) qs ipc call settings open ;; + + # Jump straight to one settings page. The launcher's per-page commands are + # the only caller, and they are generated from the page list itself, so the + # pattern below is a boundary check rather than a whitelist: an unknown page + # would leave the settings window showing nothing at all. + settings-page) + page="${2:-}" + if [[ ! "$page" =~ ^[a-z][a-z-]*$ ]]; then + printf 'Usage: panama-action settings-page PAGE\n' >&2 + exit 2 + fi + qs ipc call settings page "$page" + ;; health) qs ipc call health open ;; dnd) @@ -149,7 +162,7 @@ case "$action" in ;; *) printf 'Usage: panama-action {%s}\n' \ - 'control-center|notifications|calendar|clipboard|overview|settings|health|dnd|caffeine|night-light|focus-start|focus-end|capture|intelligence|screenshot|microphone|gallery|restart-shell' >&2 + 'control-center|notifications|calendar|clipboard|overview|settings|settings-page PAGE|health|dnd|caffeine|night-light|focus-start|focus-end|capture|intelligence|screenshot|microphone|gallery|restart-shell' >&2 exit 2 ;; esac diff --git a/config/dot/quickshell/scripts/panama-settings-commands b/config/dot/quickshell/scripts/panama-settings-commands new file mode 100755 index 0000000..d692e4b --- /dev/null +++ b/config/dot/quickshell/scripts/panama-settings-commands @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 + +"""Generate one launcher command per settings page. + +Settings has a search index and the launcher has script commands, but they did +not know about each other: finding a setting meant opening Settings first and +searching there. These commands close that gap, so typing "night light" into the +launcher opens the page that owns it. + +The vocabulary is derived from the same sources the in-app search uses -- +the page list in SettingsSidebar.qml, the group routing in SettingsSearch.qml, +and the labels in PreferenceSchema.qml -- so a setting that is searchable inside +Settings is searchable from the launcher without anyone maintaining a second +list. + + panama-settings-commands write the commands + panama-settings-commands --check fail if what is on disk is stale + +Run it after adding a settings page or renaming a setting. +""" + +from __future__ import annotations + +import re +import sys +from pathlib import Path + +REPO = Path(__file__).resolve().parents[4] +SHELL = REPO / "config/dot/quickshell" +SIDEBAR = SHELL / "modules/settings/SettingsSidebar.qml" +SEARCH = SHELL / "services/SettingsSearch.qml" +SCHEMA = SHELL / "config/PreferenceSchema.qml" +OUTPUT_DIR = REPO / "config/local/share/vicinae/scripts" + +# Home is what the plain "Open Settings" command already lands on, so a second +# command for it would be a duplicate under a different name. +SKIP_PAGES = {"home"} + +# Enough vocabulary to find the page, not so much that one page matches +# everything. Ordered by the schema, so the settings at the top of a page -- +# the ones it is named for -- are the ones that survive the cut. +MAX_KEYWORDS = 12 + +GENERATED_MARKER = "# Generated by scripts/panama-settings-commands -- do not edit by hand." + + +class ParseError(RuntimeError): + """A source file did not look the way this generator expects.""" + + +def read(path: Path) -> str: + try: + return path.read_text(encoding="utf-8") + except OSError as error: + raise ParseError(f"could not read {path}") from error + + +def pages() -> list[tuple[str, str]]: + """The settings pages, in sidebar order, as (id, label).""" + source = read(SIDEBAR) + found = re.findall(r'\{ page: "([a-z-]+)", label: "([^"]+)"', source) + if not found: + raise ParseError("no pages found in SettingsSidebar.qml") + return [(page, label) for page, label in found if page not in SKIP_PAGES] + + +def group_pages() -> dict[str, str]: + source = read(SEARCH) + table = re.search(r"readonly property var groupPages: \(\{(.*?)\n \}\)", source, re.S) + if not table: + raise ParseError("groupPages not found in SettingsSearch.qml") + return dict(re.findall(r'"([A-Za-z]+)":\s*"([a-z-]+)"', table.group(1))) + + +def extra_labels() -> dict[str, list[str]]: + """Settings the system owns rather than Panama, which have no schema entry.""" + source = read(SEARCH) + table = re.search(r"readonly property var extraEntries: \[(.*?)\n \]", source, re.S) + if not table: + return {} + labels: dict[str, list[str]] = {} + for label, page in re.findall(r'\{ label: "([^"]+)".*?page: "([a-z-]+)" \}', table.group(1)): + labels.setdefault(page, []).append(label) + return labels + + +def schema_labels() -> list[tuple[str, str]]: + """(group, label) for every user-facing setting, in schema order.""" + source = read(SCHEMA) + entries: list[tuple[str, str]] = [] + chunks = source.split("key: ") + for chunk in chunks[1:]: + # Internal state is not a setting anyone searches for. + if re.search(r"internal:\s*true", chunk[:600]): + continue + group = re.search(r'group:\s*"([A-Za-z]+)"', chunk[:600]) + label = re.search(r'label:\s*"([^"]+)"', chunk[:600]) + if group and label: + entries.append((group.group(1), label.group(1))) + if not entries: + raise ParseError("no labelled settings found in PreferenceSchema.qml") + return entries + + +def keywords_for(page: str, routing: dict[str, str], schema: list[tuple[str, str]], + extras: dict[str, list[str]]) -> list[str]: + words: list[str] = [] + for group, label in schema: + if routing.get(group) == page: + lowered = label.lower() + if lowered not in words: + words.append(lowered) + for label in extras.get(page, []): + lowered = label.lower() + if lowered not in words: + words.append(lowered) + return words[:MAX_KEYWORDS] + + +def command_for(page: str, label: str, words: list[str]) -> str: + """One launcher command, titled "Settings: ". + + The qualifier is not product branding -- that was deliberately dropped from + every command title. It is here because a bare page label collides with the + feature of the same name: "Screen Intelligence" is both a thing you open and + a page of settings about it, and two commands sharing one title are + indistinguishable in a launcher. Qualifying the page also groups all of them + under one word, which is what typing "settings" is for. + """ + # "settings" is always a keyword so typing it lists every page at once. + vocabulary = ["settings"] + [word for word in words if word != "settings"] + keywords = ", ".join(f'"{word}"' for word in vocabulary) + return f"""#!/usr/bin/env bash +{GENERATED_MARKER} +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: {label} +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open {label} in Settings. +# @vicinae.keywords [{keywords}] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page {page} +""" + + +def build() -> dict[Path, str]: + routing = group_pages() + schema = schema_labels() + extras = extra_labels() + files: dict[Path, str] = {} + for page, label in pages(): + words = keywords_for(page, routing, schema, extras) + files[OUTPUT_DIR / f"settings-{page}.sh"] = command_for(page, label, words) + return files + + +def existing() -> set[Path]: + return {path for path in OUTPUT_DIR.glob("settings-*.sh")} + + +def main(arguments: list[str]) -> int: + check = arguments == ["--check"] + if arguments and not check: + print(__doc__, file=sys.stderr) + return 2 + + try: + files = build() + except ParseError as error: + # Loud and empty-handed: writing a partial set would silently drop the + # pages whose source stopped parsing. + print(f"panama-settings-commands: {error}", file=sys.stderr) + return 2 + + stale = [path for path, body in files.items() + if not path.is_file() or path.read_text(encoding="utf-8") != body] + orphaned = sorted(existing() - set(files)) + + if check: + for path in stale: + print(f"stale: {path.name}", file=sys.stderr) + for path in orphaned: + print(f"orphaned: {path.name}", file=sys.stderr) + if stale or orphaned: + print("panama-settings-commands: run it without --check to regenerate", + file=sys.stderr) + return 1 + print(f"panama-settings-commands: {len(files)} commands are current") + return 0 + + for path in orphaned: + path.unlink() + print(f"removed {path.name}") + for path, body in files.items(): + path.write_text(body, encoding="utf-8") + path.chmod(0o755) + print(f"panama-settings-commands: wrote {len(files)} commands" + + (f", removed {len(orphaned)}" if orphaned else "")) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/config/dot/quickshell/services/SettingsSearch.qml b/config/dot/quickshell/services/SettingsSearch.qml index 3dbc9fc..995f4e4 100644 --- a/config/dot/quickshell/services/SettingsSearch.qml +++ b/config/dot/quickshell/services/SettingsSearch.qml @@ -64,6 +64,22 @@ Singleton { { label: "Bluetooth", detail: "Managed by GNOME Settings", page: "connectivity" }, { label: "Printers", detail: "Managed by GNOME Settings", page: "connectivity" }, { label: "Default applications", detail: "Browser, mail, files", page: "applications" }, + { label: "Output volume", detail: "Choose the output device and its level", page: "sound" }, + { label: "Input volume", detail: "Choose the microphone and its level", page: "sound" }, + { label: "Per-application volume", detail: "Set the level of each application separately", page: "sound" }, + { label: "Event sounds", detail: "Play alerts and interface event sounds", page: "sound" }, + { label: "Saved passwords", detail: "The login keyring and what is stored in it", page: "privacy" }, + { label: "Camera and microphone", detail: "Which applications may use them", page: "privacy" }, + { label: "Screen sharing", detail: "Which applications may capture the screen", page: "privacy" }, + { label: "File history and trash", detail: "What is remembered and when it is cleared", page: "privacy" }, + { label: "Device security", detail: "Secure boot and firmware protections", page: "privacy" }, + { label: "Language", detail: "The system language, applied to programs started afterwards", page: "region" }, + { label: "Regional formats", detail: "How dates, times, and numbers are written", page: "region" }, + { label: "Online accounts", detail: "Sign in to mail, calendar, and contacts", page: "accounts" }, + { label: "Home Assistant", detail: "Connect the desktop to a Home Assistant server", page: "home-phone" }, + { label: "Phone", detail: "Pair a phone for messages and notifications", page: "home-phone" }, + { label: "System information", detail: "Kernel, distribution, and hardware", page: "about" }, + { label: "Desktop version", detail: "Which Hyprland and Quickshell this session runs", page: "about" }, { label: "Restore defaults", detail: "Return every Panama setting to its shipped value", page: "desktop" }, { label: "Keyboard shortcuts", detail: "Every shortcut the compositor has bound", page: "shortcuts" }, { label: "System Health", detail: "Check Panama services, integrations, tools, and recovery actions", page: "services" }, diff --git a/config/local/share/vicinae/scripts/capture.sh b/config/local/share/vicinae/scripts/capture.sh index 550a153..2a31b2a 100755 --- a/config/local/share/vicinae/scripts/capture.sh +++ b/config/local/share/vicinae/scripts/capture.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Screenshot and Recording +# @vicinae.title Screenshot and Recording # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Open the polished screenshot and screen-recording picker. diff --git a/config/local/share/vicinae/scripts/check-system-health.sh b/config/local/share/vicinae/scripts/check-system-health.sh index 9e2c834..599197e 100755 --- a/config/local/share/vicinae/scripts/check-system-health.sh +++ b/config/local/share/vicinae/scripts/check-system-health.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Check System Health +# @vicinae.title Check System Health # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Review Panama services, integrations, and recovery actions. diff --git a/config/local/share/vicinae/scripts/end-focus.sh b/config/local/share/vicinae/scripts/end-focus.sh index e460bc3..cced0f4 100755 --- a/config/local/share/vicinae/scripts/end-focus.sh +++ b/config/local/share/vicinae/scripts/end-focus.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: End Focus Session +# @vicinae.title End Focus Session # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description End the current focus timer and restore its previous states. diff --git a/config/local/share/vicinae/scripts/open-calendar.sh b/config/local/share/vicinae/scripts/open-calendar.sh index 323f068..961c9be 100755 --- a/config/local/share/vicinae/scripts/open-calendar.sh +++ b/config/local/share/vicinae/scripts/open-calendar.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Open Calendar +# @vicinae.title Open Calendar # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Open the calendar, synchronized agenda, and ongoing activity. diff --git a/config/local/share/vicinae/scripts/open-clipboard.sh b/config/local/share/vicinae/scripts/open-clipboard.sh index 8110aed..0cae36a 100755 --- a/config/local/share/vicinae/scripts/open-clipboard.sh +++ b/config/local/share/vicinae/scripts/open-clipboard.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Open Clipboard +# @vicinae.title Open Clipboard # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Open Panama's compact clipboard history surface. diff --git a/config/local/share/vicinae/scripts/open-control-center.sh b/config/local/share/vicinae/scripts/open-control-center.sh index f3e76b1..4fad5a7 100755 --- a/config/local/share/vicinae/scripts/open-control-center.sh +++ b/config/local/share/vicinae/scripts/open-control-center.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Open Control Center +# @vicinae.title Open Control Center # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Open Wi-Fi, Bluetooth, audio, phone, and Home controls. diff --git a/config/local/share/vicinae/scripts/open-mission-control.sh b/config/local/share/vicinae/scripts/open-mission-control.sh index c7ef48f..f527e86 100755 --- a/config/local/share/vicinae/scripts/open-mission-control.sh +++ b/config/local/share/vicinae/scripts/open-mission-control.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Open Mission Control +# @vicinae.title Open Mission Control # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description See every workspace, tiled window, and scratchpad window. diff --git a/config/local/share/vicinae/scripts/open-notifications.sh b/config/local/share/vicinae/scripts/open-notifications.sh index e0946a4..21a3dbe 100755 --- a/config/local/share/vicinae/scripts/open-notifications.sh +++ b/config/local/share/vicinae/scripts/open-notifications.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Open Notifications +# @vicinae.title Open Notifications # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Open notification history and the unified date center. diff --git a/config/local/share/vicinae/scripts/open-prism-gallery.sh b/config/local/share/vicinae/scripts/open-prism-gallery.sh index 1e4ccf3..2ab134a 100755 --- a/config/local/share/vicinae/scripts/open-prism-gallery.sh +++ b/config/local/share/vicinae/scripts/open-prism-gallery.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Open Prism Gallery +# @vicinae.title Open Prism Gallery # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Open the living gallery of Panama's production components. diff --git a/config/local/share/vicinae/scripts/open-settings.sh b/config/local/share/vicinae/scripts/open-settings.sh index e7dd245..6487bc2 100755 --- a/config/local/share/vicinae/scripts/open-settings.sh +++ b/config/local/share/vicinae/scripts/open-settings.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Open Settings +# @vicinae.title Open Settings # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Configure the Panama desktop from its native Settings app. diff --git a/config/local/share/vicinae/scripts/quick-screenshot.sh b/config/local/share/vicinae/scripts/quick-screenshot.sh index 0416a18..7373bd5 100755 --- a/config/local/share/vicinae/scripts/quick-screenshot.sh +++ b/config/local/share/vicinae/scripts/quick-screenshot.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Capture Entire Screen +# @vicinae.title Capture Entire Screen # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Save an immediate screenshot of the complete desktop. diff --git a/config/local/share/vicinae/scripts/restart-shell.sh b/config/local/share/vicinae/scripts/restart-shell.sh index 9407e98..34f4c02 100755 --- a/config/local/share/vicinae/scripts/restart-shell.sh +++ b/config/local/share/vicinae/scripts/restart-shell.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Restart Desktop Shell +# @vicinae.title Restart Desktop Shell # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Restart Quickshell if a desktop surface becomes unresponsive. diff --git a/config/local/share/vicinae/scripts/screen-intelligence.sh b/config/local/share/vicinae/scripts/screen-intelligence.sh index 8ab6f5b..bd04745 100755 --- a/config/local/share/vicinae/scripts/screen-intelligence.sh +++ b/config/local/share/vicinae/scripts/screen-intelligence.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Screen Intelligence +# @vicinae.title Screen Intelligence # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Select part of the screen for OCR, QR, or code recognition. diff --git a/config/local/share/vicinae/scripts/settings-about.sh b/config/local/share/vicinae/scripts/settings-about.sh new file mode 100755 index 0000000..37b7906 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-about.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: About +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open About in Settings. +# @vicinae.keywords ["settings", "system information", "desktop version"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page about diff --git a/config/local/share/vicinae/scripts/settings-accessibility.sh b/config/local/share/vicinae/scripts/settings-accessibility.sh new file mode 100755 index 0000000..79d399e --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-accessibility.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Accessibility +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Accessibility in Settings. +# @vicinae.keywords ["settings", "magnifier", "magnifier follows in steps", "dim inactive windows", "dim amount", "pointer size", "text size"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page accessibility diff --git a/config/local/share/vicinae/scripts/settings-accounts.sh b/config/local/share/vicinae/scripts/settings-accounts.sh new file mode 100755 index 0000000..dbcfe6c --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-accounts.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Online Accounts +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Online Accounts in Settings. +# @vicinae.keywords ["settings", "online accounts"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page accounts diff --git a/config/local/share/vicinae/scripts/settings-appearance.sh b/config/local/share/vicinae/scripts/settings-appearance.sh new file mode 100755 index 0000000..57e7045 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-appearance.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Appearance +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Appearance in Settings. +# @vicinae.keywords ["settings", "24-hour time", "show seconds", "show weekday", "processor", "memory", "graphics", "inner gaps", "outer gaps", "border width", "corner radius", "unfocused window opacity", "focused window opacity"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page appearance diff --git a/config/local/share/vicinae/scripts/settings-applications.sh b/config/local/share/vicinae/scripts/settings-applications.sh new file mode 100755 index 0000000..f752ef4 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-applications.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Applications +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Applications in Settings. +# @vicinae.keywords ["settings", "default applications"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page applications diff --git a/config/local/share/vicinae/scripts/settings-connectivity.sh b/config/local/share/vicinae/scripts/settings-connectivity.sh new file mode 100755 index 0000000..2bdac3b --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-connectivity.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Network & Devices +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Network & Devices in Settings. +# @vicinae.keywords ["settings", "wi-fi", "bluetooth", "printers"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page connectivity diff --git a/config/local/share/vicinae/scripts/settings-datetime.sh b/config/local/share/vicinae/scripts/settings-datetime.sh new file mode 100755 index 0000000..46bcdf7 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-datetime.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Date & Time +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Date & Time in Settings. +# @vicinae.keywords ["settings", "timezone", "network time"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page datetime diff --git a/config/local/share/vicinae/scripts/settings-desktop.sh b/config/local/share/vicinae/scripts/settings-desktop.sh new file mode 100755 index 0000000..db741c0 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-desktop.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Desktop & Dock +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Desktop & Dock in Settings. +# @vicinae.keywords ["settings", "automatically hide the dock", "reveal delay", "hide delay", "focus session length", "resize by dragging the border", "border grab area", "show the resize cursor", "snap distance between windows", "snap distance to screen edges", "snapping respects gaps", "master area size", "master area position"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page desktop diff --git a/config/local/share/vicinae/scripts/settings-displays.sh b/config/local/share/vicinae/scripts/settings-displays.sh new file mode 100755 index 0000000..ac40249 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-displays.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Displays +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Displays in Settings. +# @vicinae.keywords ["settings", "game-aware hdr", "variable refresh rate", "direct scanout", "night light", "schedule automatically", "color temperature", "turns on at", "turns off at", "arrange displays", "monitor position", "primary display"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page displays diff --git a/config/local/share/vicinae/scripts/settings-home-phone.sh b/config/local/share/vicinae/scripts/settings-home-phone.sh new file mode 100755 index 0000000..bd5edd8 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-home-phone.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Home & Phone +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Home & Phone in Settings. +# @vicinae.keywords ["settings", "home assistant", "phone"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page home-phone diff --git a/config/local/share/vicinae/scripts/settings-mouse.sh b/config/local/share/vicinae/scripts/settings-mouse.sh new file mode 100755 index 0000000..331f23b --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-mouse.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Mouse & Touchpad +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Mouse & Touchpad in Settings. +# @vicinae.keywords ["settings", "pointer focus", "pointer speed", "hide pointer after", "natural scrolling", "acceleration", "scroll speed", "left-handed", "middle-click paste", "tap to click", "disable while typing", "drag lock", "middle-click by pressing both buttons"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page mouse diff --git a/config/local/share/vicinae/scripts/settings-notifications.sh b/config/local/share/vicinae/scripts/settings-notifications.sh new file mode 100755 index 0000000..b9afd50 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-notifications.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Notifications & Focus +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Notifications & Focus in Settings. +# @vicinae.keywords ["settings", "notification duration", "critical notification duration", "notification history", "visible banners"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page notifications diff --git a/config/local/share/vicinae/scripts/settings-power.sh b/config/local/share/vicinae/scripts/settings-power.sh new file mode 100755 index 0000000..426cee5 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-power.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Power & Lock +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Power & Lock in Settings. +# @vicinae.keywords ["settings", "turn the screen off after", "lock the screen after", "suspend after", "lock before sleeping"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page power diff --git a/config/local/share/vicinae/scripts/settings-privacy.sh b/config/local/share/vicinae/scripts/settings-privacy.sh new file mode 100755 index 0000000..7852506 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-privacy.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Privacy & Security +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Privacy & Security in Settings. +# @vicinae.keywords ["settings", "saved passwords", "camera and microphone", "screen sharing", "file history and trash", "device security"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page privacy diff --git a/config/local/share/vicinae/scripts/settings-region.sh b/config/local/share/vicinae/scripts/settings-region.sh new file mode 100755 index 0000000..be0e2b9 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-region.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Region & Language +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Region & Language in Settings. +# @vicinae.keywords ["settings", "language", "regional formats"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page region diff --git a/config/local/share/vicinae/scripts/settings-screen-intelligence.sh b/config/local/share/vicinae/scripts/settings-screen-intelligence.sh new file mode 100755 index 0000000..f7c7cc6 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-screen-intelligence.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Screen Intelligence +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Screen Intelligence in Settings. +# @vicinae.keywords ["settings", "screenshot folder", "recording folder", "recording encoder"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page screen-intelligence diff --git a/config/local/share/vicinae/scripts/settings-services.sh b/config/local/share/vicinae/scripts/settings-services.sh new file mode 100755 index 0000000..f87e2fe --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-services.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: System Health +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open System Health in Settings. +# @vicinae.keywords ["settings", "system health", "copy health report"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page services diff --git a/config/local/share/vicinae/scripts/settings-shortcuts.sh b/config/local/share/vicinae/scripts/settings-shortcuts.sh new file mode 100755 index 0000000..dae4bc1 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-shortcuts.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Keyboard +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Keyboard in Settings. +# @vicinae.keywords ["settings", "keyboard layout", "layout variant", "keyboard options", "num lock on login", "repeat delay", "repeat rate", "keyboard shortcuts"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page shortcuts diff --git a/config/local/share/vicinae/scripts/settings-sound.sh b/config/local/share/vicinae/scripts/settings-sound.sh new file mode 100755 index 0000000..f7f3602 --- /dev/null +++ b/config/local/share/vicinae/scripts/settings-sound.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Generated by scripts/panama-settings-commands -- do not edit by hand. +# @vicinae.schemaVersion 1 +# @vicinae.title Settings: Sound +# @vicinae.mode silent +# @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg +# @vicinae.description Open Sound in Settings. +# @vicinae.keywords ["settings", "output volume", "input volume", "per-application volume", "event sounds"] + +exec "$HOME/.config/quickshell/scripts/panama-action" settings-page sound diff --git a/config/local/share/vicinae/scripts/start-focus.sh b/config/local/share/vicinae/scripts/start-focus.sh index ef0ef22..4b68849 100755 --- a/config/local/share/vicinae/scripts/start-focus.sh +++ b/config/local/share/vicinae/scripts/start-focus.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Start Focus Session +# @vicinae.title Start Focus Session # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Start the configured focus timer with DND and Caffeine. diff --git a/config/local/share/vicinae/scripts/toggle-caffeine.sh b/config/local/share/vicinae/scripts/toggle-caffeine.sh index 18de65d..15e0298 100755 --- a/config/local/share/vicinae/scripts/toggle-caffeine.sh +++ b/config/local/share/vicinae/scripts/toggle-caffeine.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Toggle Caffeine +# @vicinae.title Toggle Caffeine # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Keep the display awake and block automatic sleep. diff --git a/config/local/share/vicinae/scripts/toggle-dnd.sh b/config/local/share/vicinae/scripts/toggle-dnd.sh index f769e64..61b2716 100755 --- a/config/local/share/vicinae/scripts/toggle-dnd.sh +++ b/config/local/share/vicinae/scripts/toggle-dnd.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Toggle Do Not Disturb +# @vicinae.title Toggle Do Not Disturb # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Pause or resume notification banners, with OSD confirmation. diff --git a/config/local/share/vicinae/scripts/toggle-microphone.sh b/config/local/share/vicinae/scripts/toggle-microphone.sh index 429db6e..761808e 100755 --- a/config/local/share/vicinae/scripts/toggle-microphone.sh +++ b/config/local/share/vicinae/scripts/toggle-microphone.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Toggle Microphone Mute +# @vicinae.title Toggle Microphone Mute # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Mute or unmute the default microphone with OSD feedback. diff --git a/config/local/share/vicinae/scripts/toggle-night-light.sh b/config/local/share/vicinae/scripts/toggle-night-light.sh index 521fe60..55f5907 100755 --- a/config/local/share/vicinae/scripts/toggle-night-light.sh +++ b/config/local/share/vicinae/scripts/toggle-night-light.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # @vicinae.schemaVersion 1 -# @vicinae.title Panama: Toggle Night Light +# @vicinae.title Toggle Night Light # @vicinae.mode silent # @vicinae.icon ../../icons/hicolor/scalable/apps/panama-settings.svg # @vicinae.description Toggle the warm display color temperature. diff --git a/docs/superpowers/plans/2026-08-19-desktop-integration.md b/docs/superpowers/plans/2026-08-19-desktop-integration.md index 7600b20..e68c1f8 100644 --- a/docs/superpowers/plans/2026-08-19-desktop-integration.md +++ b/docs/superpowers/plans/2026-08-19-desktop-integration.md @@ -93,12 +93,20 @@ about each other, so finding a setting means opening Settings first. - Generator gets a `--check` staleness mode, matching `panama-settings-docs`. - Contract: every page has a command, every command resolves to a real page. -**Open question for Gabriel:** the existing launcher commands are titled -"Panama: Open Settings", which the debranding pass did not touch. Keep the prefix -so desktop commands group together in the launcher, or drop it to match the rest? - **Done when** the launcher is the fastest way to reach any setting. +**Landed 2026-08-19.** The product prefix is gone from all eighteen hand-written +commands. The nineteen generated ones are titled "Settings: " -- not +branding, which was the thing being dropped, but a qualifier: a bare page label +collides with the feature of the same name ("Screen Intelligence" is both a thing +you open and a page about it), and two commands sharing a title are +indistinguishable in a launcher. + +Six pages turned out to have no search vocabulary at all -- sound, privacy, +region, accounts, home-phone, about -- because their contents come from the +system rather than our schema. That was an in-app search gap too: "volume" found +nothing in Settings either. They now carry entries, so both surfaces improved. + ## Phase 5 — Keychain and secrets (medium, security-sensitive) `panama-keyring` knows whether the keyring is locked and can unlock it. Nothing diff --git a/tests/quickshell/panama-commands-contract.sh b/tests/quickshell/panama-commands-contract.sh index 459af61..77a2ff0 100755 --- a/tests/quickshell/panama-commands-contract.sh +++ b/tests/quickshell/panama-commands-contract.sh @@ -38,6 +38,24 @@ declare -A expected=( [restart-shell.sh]=restart-shell ) +# The per-page settings commands are generated from the settings page list, so +# they are enumerated from that list rather than restated here -- a hand-written +# copy would have to be edited every time a page is added, which is exactly the +# kind of second list this generator exists to avoid. +sidebar="$repo_dir/config/dot/quickshell/modules/settings/SettingsSidebar.qml" +while read -r page; do + [[ -n "$page" ]] || continue + [[ "$page" == "home" ]] && continue + expected[settings-$page.sh]="settings-page $page" +done < <(grep -oE '\{ page: "[a-z-]+"' "$sidebar" | sed 's/.*"\([a-z-]*\)"/\1/') + +(( ${#expected[@]} > 18 )) || fail 'no generated per-page commands were found; run scripts/panama-settings-commands' + +# Generated commands must match their source. A stale command dispatches to a +# page that has been renamed or removed, and the launcher reports nothing wrong. +"$repo_dir/config/dot/quickshell/scripts/panama-settings-commands" --check >/dev/null \ + || fail 'the generated per-page commands are stale; run scripts/panama-settings-commands' + mkdir -p "$work/home/.config/quickshell/scripts" cat >"$work/home/.config/quickshell/scripts/panama-action" <<'EOF' #!/usr/bin/env bash @@ -60,7 +78,11 @@ for script_name in "${!expected[@]}"; do || fail "$script_name is rejected by Vicinae" title="$(sed -n 's/^# @vicinae.title //p' "$script")" - [[ $title == 'Panama: '* ]] || fail "$script_name has an ungrouped title: $title" + # No product prefix: this is the desktop's own settings, not a third-party + # add-on announcing itself in someone else's launcher. Uniqueness still + # matters, because two commands with one title are indistinguishable there. + [[ -n $title ]] || fail "$script_name has no title" + [[ $title != Panama* ]] || fail "$script_name still carries the product prefix: $title" [[ -z ${seen_titles[$title]+x} ]] || fail "duplicate launcher title: $title" seen_titles[$title]=1 @@ -74,7 +96,7 @@ for script_name in "${!expected[@]}"; do || fail "$script_name does not use the Panama application identity" if [[ $script_name == check-system-health.sh ]]; then - [[ $title == 'Panama: Check System Health' ]] \ + [[ $title == 'Check System Health' ]] \ || fail "health command has the wrong title: $title" grep -Fxq '# @vicinae.schemaVersion 1' "$script" \ || fail 'health command does not use schema version 1'