From aa2c312525517c848ac2a0f0fa82264b501c1c3a Mon Sep 17 00:00:00 2001 From: McAmner Date: Sun, 21 Jun 2026 11:54:27 +0200 Subject: [PATCH] chore: prune 154 stale tracked files under backups/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit backups/ is a runtime snapshot/bundle directory — its README documents it as local-only, and .gitignore already ignored backups/scripts/* and backups/launchers/*.bak. But 154 files committed before those rules were added stayed tracked: old mqlaunch .bak versions, perf snapshots, and nested backup-of-backup snapshots (backups/scripts//backups/scripts//...). Nothing reads from backups/ — every live reference either writes into it (all guarded by mkdir -p) or excludes it from scanning. Remove the tracked cruft (history preserves it) and tighten .gitignore to ignore everything under backups/ except the README. Write scripts recreate their subdirs at runtime. Drops ~59k lines and 2.0M from the tree; clears the 15 false-positive bash -n hits that all lived under backups/. Full selftest + install-smoke green. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 11 +- backups/ai-prompts-20260330-011812.zip | Bin 5859 -> 0 bytes .../launchers/mqlaunch-20260406-025315.sh.bak | 933 ---------- .../launchers/mqlaunch-20260406-025453.sh.bak | 933 ---------- .../launchers/mqlaunch-20260406-030024.sh.bak | 933 ---------- .../launchers/mqlaunch-20260406-030843.sh.bak | 936 ---------- .../launchers/mqlaunch-20260406-193515.sh.bak | 936 ---------- .../launchers/mqlaunch-20260408-013344.sh.bak | 936 ---------- .../launchers/mqlaunch-20260410-022926.sh.bak | 1043 ------------ backups/launchers/mqlaunch-v2-stable.sh | 623 ------- backups/launchers/mqlaunch-v3-stable.sh | 671 -------- backups/launchers/mqlaunch-v3.1-stable.sh | 743 -------- backups/launchers/mqlaunch-v3.2-stable.sh | 774 --------- backups/launchers/mqlaunch.sh.bak | 425 ----- .../mqlaunch.sh.bak.20260411-184504 | 1280 -------------- .../mqlaunch.sh.bak.20260411-234418 | 1347 --------------- .../mqlaunch.sh.bak.about.20260411-150907 | 1172 ------------- .../mqlaunch.sh.bak.bundle.20260411-143705 | 1109 ------------ .../mqlaunch.sh.bak.index.20260411-151416 | 1229 -------------- ...launch.sh.bak.mainmenu-fix.20260410-230937 | 1037 ------------ ...qlaunch.sh.bak.mainmenu-v2.20260410-225339 | 1037 ------------ .../mqlaunch.sh.bak.notes.20260411-144616 | 1144 ------------- .../mqlaunch.sh.bak.selfcheck.20260411-000611 | 1076 ------------ .../mqlaunch.sh.bak.version.20260410-235924 | 1042 ------------ .../perf-snapshot-2026-04-10_19-21-00.txt | 98 -- .../perf-snapshot-2026-04-10_19-37-03.txt | 104 -- .../perf-snapshot-2026-04-10_20-53-56.txt | 104 -- .../perf-snapshot-2026-04-10_22-22-09.txt | 104 -- backups/scripts/.gitkeep | 1 - .../tools/scripts/mission-control.sh | 212 --- .../terminal/launchers/gitlaunch.sh | 727 -------- .../launchers/mqlaunch-command-mode.sh | 421 ----- .../terminal/launchers/mqlaunch-repl.sh | 192 --- .../terminal/launchers/mqlaunch.sh | 1480 ---------------- .../automation/login/mqlogin.sh | 269 --- .../automation/shortcuts/mqshortcuts.sh | 168 -- .../automation/workflows/project-check.sh | 128 -- .../automation/workflows/workspace.sh | 267 --- .../launchers/mqlaunch-20260406-025315.sh.bak | 886 ---------- .../launchers/mqlaunch-20260406-025453.sh.bak | 886 ---------- .../launchers/mqlaunch-20260406-030024.sh.bak | 886 ---------- .../launchers/mqlaunch-20260406-030843.sh.bak | 889 ---------- .../launchers/mqlaunch-20260406-193515.sh.bak | 889 ---------- .../launchers/mqlaunch-20260408-013344.sh.bak | 889 ---------- .../launchers/mqlaunch-20260410-022926.sh.bak | 991 ----------- .../launchers/mqlaunch-20260505-051128.sh.bak | 1359 --------------- .../launchers/mqlaunch-20260508-020947.sh.bak | 1419 ---------------- .../backups/launchers/mqlaunch-v2-stable.sh | 588 ------- .../backups/launchers/mqlaunch-v3-stable.sh | 632 ------- .../backups/launchers/mqlaunch-v3.1-stable.sh | 703 -------- .../backups/launchers/mqlaunch-v3.2-stable.sh | 733 -------- .../backups/launchers/mqlaunch.sh.bak | 400 ----- .../tools/scripts/mission-control.sh | 191 --- .../terminal/launchers/gitlaunch.sh | 702 -------- .../launchers/mqlaunch-command-mode.sh | 418 ----- .../terminal/launchers/mqlaunch-repl.sh | 176 -- .../terminal/launchers/mqlaunch.sh | 1421 ---------------- backups/scripts/20260509-030842/bootstrap.sh | 48 - backups/scripts/20260509-030842/install.sh | 344 ---- backups/scripts/20260509-030842/release.sh | 307 ---- .../system/tweaks/macos-tweaks.sh | 482 ------ .../terminal/ai-prompts/mq-ai-prompts.sh | 206 --- .../terminal/bridges/dev-bridge.sh | 28 - .../terminal/bridges/performance-bridge.sh | 45 - .../terminal/bridges/tools-bridge.sh | 28 - .../terminal/launchers/mqlaunch.sh | 1505 ----------------- .../terminal/menus/mq-ai-menu.sh | 59 - .../terminal/menus/mq-apps-menu.sh | 69 - .../terminal/menus/mq-dev-menu.sh | 71 - .../terminal/menus/mq-git-menu.sh | 605 ------- .../terminal/menus/mq-help-center-menu.sh | 92 - .../terminal/menus/mq-help-menu.sh | 189 --- .../terminal/menus/mq-login-menu.sh | 179 -- .../terminal/menus/mq-main-menu.sh | 528 ------ .../terminal/menus/mq-net-menu.sh | 53 - .../terminal/menus/mq-performance-menu.sh | 105 -- .../terminal/menus/mq-release-menu.sh | 712 -------- .../terminal/menus/mq-shortcuts-menu.sh | 244 --- .../terminal/menus/mq-system-menu.sh | 73 - .../terminal/menus/mq-tools-menu.sh | 527 ------ .../terminal/menus/mq-workflows-menu.sh | 326 ---- .../terminal/mqlaunch-v1/commands/about.sh | 55 - .../terminal/mqlaunch-v1/commands/bundle.sh | 30 - .../terminal/mqlaunch-v1/commands/check.sh | 17 - .../terminal/mqlaunch-v1/commands/dev.sh | 97 -- .../terminal/mqlaunch-v1/commands/index.sh | 49 - .../terminal/mqlaunch-v1/commands/login.sh | 25 - .../terminal/mqlaunch-v1/commands/meta.sh | 22 - .../terminal/mqlaunch-v1/commands/notes.sh | 22 - .../mqlaunch-v1/commands/performance.sh | 478 ------ .../terminal/mqlaunch-v1/commands/repo.sh | 36 - .../mqlaunch-v1/commands/shortcuts.sh | 25 - .../terminal/mqlaunch-v1/commands/system.sh | 37 - .../terminal/mqlaunch-v1/commands/tools.sh | 107 -- .../terminal/mqlaunch-v1/lib/core.sh | 85 - .../terminal/mqlaunch-v1/lib/router.sh | 117 -- .../terminal/mqlaunch-v1/lib/ui.sh | 48 - .../terminal/mqlaunch-v1/menus/ai.sh | 24 - .../terminal/mqlaunch-v1/menus/automation.sh | 22 - .../terminal/mqlaunch-v1/menus/dev.sh | 42 - .../terminal/mqlaunch-v1/menus/main.sh | 38 - .../terminal/mqlaunch-v1/menus/performance.sh | 40 - .../terminal/mqlaunch-v1/menus/system.sh | 26 - .../terminal/mqlaunch-v1/menus/tools.sh | 36 - .../terminal/mqlaunch-v1/mqlaunch.sh | 60 - .../terminal/release/mq-release-check.sh | 170 -- .../terminal/themes/mq-theme-manager.sh | 230 --- .../terminal/themes/mq-zsh-theme-switcher.sh | 258 --- .../terminal/themes/mq-zsh-theme-v2.zsh | 173 -- .../terminal/themes/mq-zsh-theme-v3.zsh | 307 ---- .../terminal/themes/mq-zsh-theme.zsh | 109 -- .../20260509-030842/tools/cli/ai-mode.sh | 89 - .../20260509-030842/tools/cli/mq-dashboard.sh | 224 --- .../20260509-030842/tools/cli/mq-lib.sh | 57 - .../20260509-030842/tools/cli/mq-ui.sh | 64 - .../patch-mqlaunch-add-backup-option.sh | 247 --- .../patches/patch-mqlaunch-add-dashboard.sh | 270 --- .../patches/patch-mqlaunch-add-themes.sh | 300 ---- .../patches/patch-mqlaunch-add-tools-menu.sh | 255 --- .../patches/patch-mqlaunch-add-tweaks.sh | 143 -- .../patches/patch-mqlaunch-clean-themes.sh | 222 --- .../20260509-030842/tools/onboarding.sh | 36 - .../20260509-030842/tools/scripts/chat.sh | 74 - .../tools/scripts/document-functions.sh | 422 ----- .../tools/scripts/hal-terminal-guide.sh | 631 ------- .../tools/scripts/mqlaunch_desktop.sh | 1048 ------------ .../20260509-030842/tools/scripts/overseer.sh | 140 -- .../20260509-030842/tools/scripts/scan.sh | 763 --------- .../tools/scripts/test-mqlaunch-v1.sh | 67 - .../tools/scripts/test-mqlaunch.sh | 85 - .../20260509-030842/tools/scripts/watch.sh | 39 - .../tools/test_tools_readme.sh | 20 - .../20260509-030842/ui/ascii/mq-banner.sh | 49 - .../ui/ascii/mq-bg-miami-muse.sh | 71 - .../ui/ascii/mq-dashboard-v3.sh | 197 --- .../20260509-030842/ui/ascii/mq-dashboard.sh | 134 -- .../ui/ascii/mqlaunch-dashboard-v4.sh | 307 ---- .../ui/ascii/mqlaunch-dashboard-v5.sh | 391 ----- .../ui/ascii/mqlaunch-dashboard-v6.sh | 471 ------ .../ui/ascii/mqlaunch-dashboard-v7.1.sh | 527 ------ .../ui/dashboards/mq-dashboard.sh | 322 ---- .../ui/terminal-ui/mq-ui-demo.sh | 78 - .../20260509-030842/ui/terminal-ui/mq-ui.sh | 344 ---- .../terminal/dev/mq-create-repo.sh | 229 --- .../terminal/menus/mq-themes-menu.sh | 92 - .../20260514-010651/tools/scripts/ask.sh | 104 -- .../scripts/generate-wiki-command-ref.sh | 123 -- .../20260514-010651/tools/scripts/srm.sh | 149 -- backups/workspaces/.gitkeep | 1 - .../20260508-041502/changed-files.txt | 0 .../workspaces/20260508-041502/git-status.txt | 2 - .../workspaces/20260508-041502/metadata.env | 9 - .../20260508-041502/recent-files.txt | 40 - backups/workspaces/latest | 1 - 154 files changed, 4 insertions(+), 59146 deletions(-) delete mode 100644 backups/ai-prompts-20260330-011812.zip delete mode 100755 backups/launchers/mqlaunch-20260406-025315.sh.bak delete mode 100755 backups/launchers/mqlaunch-20260406-025453.sh.bak delete mode 100755 backups/launchers/mqlaunch-20260406-030024.sh.bak delete mode 100755 backups/launchers/mqlaunch-20260406-030843.sh.bak delete mode 100755 backups/launchers/mqlaunch-20260406-193515.sh.bak delete mode 100755 backups/launchers/mqlaunch-20260408-013344.sh.bak delete mode 100755 backups/launchers/mqlaunch-20260410-022926.sh.bak delete mode 100755 backups/launchers/mqlaunch-v2-stable.sh delete mode 100755 backups/launchers/mqlaunch-v3-stable.sh delete mode 100755 backups/launchers/mqlaunch-v3.1-stable.sh delete mode 100755 backups/launchers/mqlaunch-v3.2-stable.sh delete mode 100755 backups/launchers/mqlaunch.sh.bak delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.20260411-184504 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.20260411-234418 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.about.20260411-150907 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.bundle.20260411-143705 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.index.20260411-151416 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.mainmenu-fix.20260410-230937 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.mainmenu-v2.20260410-225339 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.notes.20260411-144616 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.selfcheck.20260411-000611 delete mode 100755 backups/mqlaunch-old/mqlaunch.sh.bak.version.20260410-235924 delete mode 100644 backups/performance-reports/perf-snapshot-2026-04-10_19-21-00.txt delete mode 100644 backups/performance-reports/perf-snapshot-2026-04-10_19-37-03.txt delete mode 100644 backups/performance-reports/perf-snapshot-2026-04-10_20-53-56.txt delete mode 100644 backups/performance-reports/perf-snapshot-2026-04-10_22-22-09.txt delete mode 100644 backups/scripts/.gitkeep delete mode 100755 backups/scripts/20260508-031028/tools/scripts/mission-control.sh delete mode 100755 backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh delete mode 100644 backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh delete mode 100755 backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh delete mode 100755 backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh delete mode 100755 backups/scripts/20260509-030842/automation/login/mqlogin.sh delete mode 100755 backups/scripts/20260509-030842/automation/shortcuts/mqshortcuts.sh delete mode 100755 backups/scripts/20260509-030842/automation/workflows/project-check.sh delete mode 100755 backups/scripts/20260509-030842/automation/workflows/workspace.sh delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-025315.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-025453.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-030024.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-030843.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-193515.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260408-013344.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260410-022926.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260505-051128.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260508-020947.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-v2-stable.sh delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-v3-stable.sh delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-v3.1-stable.sh delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch-v3.2-stable.sh delete mode 100755 backups/scripts/20260509-030842/backups/launchers/mqlaunch.sh.bak delete mode 100755 backups/scripts/20260509-030842/backups/scripts/20260508-031028/tools/scripts/mission-control.sh delete mode 100755 backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh delete mode 100644 backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh delete mode 100755 backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh delete mode 100755 backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh delete mode 100644 backups/scripts/20260509-030842/bootstrap.sh delete mode 100755 backups/scripts/20260509-030842/install.sh delete mode 100755 backups/scripts/20260509-030842/release.sh delete mode 100755 backups/scripts/20260509-030842/system/tweaks/macos-tweaks.sh delete mode 100755 backups/scripts/20260509-030842/terminal/ai-prompts/mq-ai-prompts.sh delete mode 100755 backups/scripts/20260509-030842/terminal/bridges/dev-bridge.sh delete mode 100755 backups/scripts/20260509-030842/terminal/bridges/performance-bridge.sh delete mode 100755 backups/scripts/20260509-030842/terminal/bridges/tools-bridge.sh delete mode 100755 backups/scripts/20260509-030842/terminal/launchers/mqlaunch.sh delete mode 100644 backups/scripts/20260509-030842/terminal/menus/mq-ai-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-apps-menu.sh delete mode 100644 backups/scripts/20260509-030842/terminal/menus/mq-dev-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-git-menu.sh delete mode 100644 backups/scripts/20260509-030842/terminal/menus/mq-help-center-menu.sh delete mode 100644 backups/scripts/20260509-030842/terminal/menus/mq-help-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-login-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-main-menu.sh delete mode 100644 backups/scripts/20260509-030842/terminal/menus/mq-net-menu.sh delete mode 100644 backups/scripts/20260509-030842/terminal/menus/mq-performance-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-release-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-shortcuts-menu.sh delete mode 100644 backups/scripts/20260509-030842/terminal/menus/mq-system-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-tools-menu.sh delete mode 100755 backups/scripts/20260509-030842/terminal/menus/mq-workflows-menu.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/about.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/bundle.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/check.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/dev.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/index.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/login.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/meta.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/notes.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/performance.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/repo.sh delete mode 100644 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/shortcuts.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/system.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/tools.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/core.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/router.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/ui.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/ai.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/automation.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/dev.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/main.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/performance.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/system.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/tools.sh delete mode 100755 backups/scripts/20260509-030842/terminal/mqlaunch-v1/mqlaunch.sh delete mode 100755 backups/scripts/20260509-030842/terminal/release/mq-release-check.sh delete mode 100755 backups/scripts/20260509-030842/terminal/themes/mq-theme-manager.sh delete mode 100755 backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-switcher.sh delete mode 100644 backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v2.zsh delete mode 100755 backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v3.zsh delete mode 100644 backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme.zsh delete mode 100755 backups/scripts/20260509-030842/tools/cli/ai-mode.sh delete mode 100755 backups/scripts/20260509-030842/tools/cli/mq-dashboard.sh delete mode 100755 backups/scripts/20260509-030842/tools/cli/mq-lib.sh delete mode 100644 backups/scripts/20260509-030842/tools/cli/mq-ui.sh delete mode 100755 backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-backup-option.sh delete mode 100755 backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-dashboard.sh delete mode 100755 backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-themes.sh delete mode 100755 backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-tools-menu.sh delete mode 100755 backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-tweaks.sh delete mode 100755 backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-clean-themes.sh delete mode 100755 backups/scripts/20260509-030842/tools/onboarding.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/chat.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/document-functions.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/hal-terminal-guide.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/mqlaunch_desktop.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/overseer.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/scan.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/test-mqlaunch-v1.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/test-mqlaunch.sh delete mode 100755 backups/scripts/20260509-030842/tools/scripts/watch.sh delete mode 100755 backups/scripts/20260509-030842/tools/test_tools_readme.sh delete mode 100755 backups/scripts/20260509-030842/ui/ascii/mq-banner.sh delete mode 100644 backups/scripts/20260509-030842/ui/ascii/mq-bg-miami-muse.sh delete mode 100755 backups/scripts/20260509-030842/ui/ascii/mq-dashboard-v3.sh delete mode 100755 backups/scripts/20260509-030842/ui/ascii/mq-dashboard.sh delete mode 100755 backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v4.sh delete mode 100755 backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v5.sh delete mode 100755 backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v6.sh delete mode 100755 backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v7.1.sh delete mode 100755 backups/scripts/20260509-030842/ui/dashboards/mq-dashboard.sh delete mode 100755 backups/scripts/20260509-030842/ui/terminal-ui/mq-ui-demo.sh delete mode 100644 backups/scripts/20260509-030842/ui/terminal-ui/mq-ui.sh delete mode 100755 backups/scripts/20260514-010651/terminal/dev/mq-create-repo.sh delete mode 100755 backups/scripts/20260514-010651/terminal/menus/mq-themes-menu.sh delete mode 100755 backups/scripts/20260514-010651/tools/scripts/ask.sh delete mode 100755 backups/scripts/20260514-010651/tools/scripts/generate-wiki-command-ref.sh delete mode 100755 backups/scripts/20260514-010651/tools/scripts/srm.sh delete mode 100644 backups/workspaces/.gitkeep delete mode 100644 backups/workspaces/20260508-041502/changed-files.txt delete mode 100644 backups/workspaces/20260508-041502/git-status.txt delete mode 100644 backups/workspaces/20260508-041502/metadata.env delete mode 100644 backups/workspaces/20260508-041502/recent-files.txt delete mode 100644 backups/workspaces/latest diff --git a/.gitignore b/.gitignore index 7daea7a..c45a2bf 100644 --- a/.gitignore +++ b/.gitignore @@ -22,13 +22,10 @@ __pycache__/ # Local Playwright CLI captures .playwright-cli/ -# Local debug bundles -backups/debug-bundles/*.txt - -# Local backup files -backups/launchers/*.bak -backups/scripts/* -!backups/scripts/.gitkeep +# Backups: project-generated snapshots, bundles, and reports are local-only. +# Write scripts mkdir -p their own subdirs at runtime; only the README is tracked. +backups/* +!backups/README.md terminal/launchers/*.bak.* terminal/menus/*.bak.* tools/*.bak.* diff --git a/backups/ai-prompts-20260330-011812.zip b/backups/ai-prompts-20260330-011812.zip deleted file mode 100644 index 023ab76b06c96c49a3f9cc39e6ab944289ede5e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5859 zcma)=XH-*b(}qJc^kzV$h%~98N(U*@qY`O~f|L-NkYEZRO*&EpLQy(M7X(BELFv6o z6@}0Rlpa8u0{X@GJ3r)jT$;Uh_RiW_b7ke8=YD1e3Lzt>2K;zA3;SC9@8+L38UQE2 z#tH0(Lb|$P&=RI5Q~)AT*re*N`a-Mz;Q${^zE)}CSkeiD{nV0 zjkBJ*BZ?FC7vy4QUpSQzmEY-2O?DcFM)Z0vj_R(3S`Ptr*498D<-6S3Zx4^Inx65t z=d^7RPIV5#S{uwR4x0I1nS5d&e)Ijic&xb1mwidAr)B_omOe58rx?dcQxc!Djrv(f z0bEiuKZ&2odKs24e%1EH72CAnnSz*MODlzhJI2GVAq{*XbKj+WSQr{aeCBU>D2wN- z?DekOuabF=K7Eub+o%PaiFx&~!uZone(iEC1*?@%;MJJUpWx-XAn`lx#uJ0r;Yhi<^uPYejEfB#Y=f|Ixr=r}|4C)6 z5d<+INjtd$vN#ucIxExEU7H<55z%LTLOV83C)+jed11s>?>?!jddz5iLc$zxsu(R~ zK4)rX|q$B4Oi zNrEZVD#KK{*+c1LjR`8OrC%SSK%l@3mxP4Khl&_9WL~r2eopXdzE}7_!Fg&=ZNWex zjVi1o=L{8d$rEi=V;7;ToAX=LcVw^Ne}Sd_CVtRYSGM%Jdic z-<}^@GB*j9F=*rq3p~^MNJY5$s%^PQZg+d_bP0B4q^%mX-X71dY~S@1g^7&X)X3B_emgn>ii-x_+Uk*M_nBx$Y)&nzRAM%Z z`pk!bpg1OYXFV86WB%~LQeiD(OZk?muszA){_a_h=K=l5vbd_D^Q1u6z{=`aw)b*( z$TIstwJz5*!+NWFzss(;aKkAnd73r@FKk$UBRQT-kGjJ;?TN``K{N~gUz17kAO9hG zhAq~?0gn1pHoVCR*^r(S}HkQB_3e8!>DRwXe6k9 z^X-UU)wDceY-J#hB{t7ObCRDOHf+Wc{8YjT&tLk5EADg!eF^mW9YaoG3Xw6h3t9st z?gS=2-tucu8GoH%*xXYy`qwA(xUQItC!Ea*5L2KO+mWUB=9<96!Z1C!LOfzTe1W zRgKoK$Qj()a?S2qcjW90(+Wvh$o683blo5e9y#pj^m+@icZ zyZVh&`w^gJta*)1~x`mkja~It^=v^xR=ird8s?FxjU@dn#&K z^VKrb$2G*D5zUfB4VQ@LsefrG33fu*!9D*Zn=2G@rA3l)@&Hs3tbI>3cU=VZ*uXUM z29F63>$zn99Hpw$<0dr#;LQEB;Bbz`(DaVa^=J&$dA?TGrey|a48H@idG@)J^cfwev~|(jL4l@4H_`xYAecRK#7I4KPivuTn{mMU^k+5WVVwE#r z2-Xn0i?$X;gnkKYG0XRlOYB55AW2J(82?9$Dv4zVlZ0Ig(0JHRm4c8g0{GEKD!tz( z@l)bRJ_E1iXsB2--RlHVN2Xn!o1!fxDT-rF65e;@pL>wy@SYhGgvi;CwlnBO+4;Fqh`XKR~MPka?{T)*dBv(|FIj zDR4$_e-JbYkaQ^KHH((^=M;3H54}N~o9)q#)hm@L_y`$Ub-Pvq@yCxR$9gvl8+jfb zNqk^CG=u~JoP;W~PwPN%QmBoy60)C!slB-|2iP=@FVGUc|nd@=4in6RF+M@0e4IVg^J zc=^x1Ybca05Bq*R0~krJRx}ecfReZ;|3}Rw4MxGya2piN@lOe0`cDF^i0+eElKD=j zUJl5nV0K{!dE3G9W-v&oUPo8PSEi$8KmCp?9&=|%wa$mhq|L(E?^iGm2Nk;Q(yfUP zvJYXJa|5u>|T@49<@1fpYu>P=jsFlC)gYz545(QhW#IH%#_O z^m-MjLQ0WA4m4B?F|kS6$S|X{an9ZGmZ_RkFz`+j>@m-teuxnk-CQ$rFK)7)sgu@k zZ0mHfa5@HMjLK{)ePJAK8dlm+@GWO*PX>l#5-mx z?2CS0(|OubSr;R#n+72G{M)?G`Josi!ji7ymDDw(1kb*Xi*@Z(P)f!s zDG?X9Zt|BTM~7j#sCC&Zq!D)+(lq$obTw)+HGrgv;nvh#;hBoH8aH3bv`)>(wYCpa zaz1Bv&r^tt&3v3QK`o!h(+?X`u$S?gy5PFLg0ESjUN8Kl9@!=`S8oC}*3`(05nmLD zE`D-wqsi6aoK@eV1|^!-{zJX#2F-AG)l?-J%57S7|87S6Z~*yquLNpf6(KTe#Lr@E0qOc(-hQYTF0ncq0BT|d|F=0OT=+tR!vpr-N=;_zL&51%Di#z$W9U(Sj^6LV|$Bkom#qz7-+*suy}Bd-Mk=? zqEKa*uQ%OmQZx89uu@-iwaNeoN+}Aope3gq7q0Xm#cr{PyFiTXrd( zdhY=YZ{1QpubOX(Kb5pC6_jws&n(=R#@3+(NBP$uYP2NKt*E@LGJ6Y6A@sL9a{<8R z!LEH{TGwLgd6nzc))Mzi85GChvXYxwHQ)5~rhPXOuVH{EOKxlHr^hInA6aefzV~U} zigdmh{4dv!dwwarLu!q6ly7m@MlI8Uat zPEiUPI05hja5m@(N=OtBA0Y!xZhI-}Psc{2vzoJIcg^-5^ltFb+VKvf^a4sRw%FBO z_n|F;Eq>LKSJjPwIz4P3*E;#S$cyq~E*ocHh+F>*Dl7@FAb+)`@|h&d9PHxeXr0o_u6pnYDLLk?$2{#wHamDpSuZYho;AlmMnr7^XqBy)yO5 zC%`1J2ND|U_=%Et+W{Gwe#3Q01q0G|K1lAU;-a2V-{-IONuo;hb-#)v;Rsn@m+iXg zla%Pp8$g1In%I(?JwWZrXQPx6&|+?8xhzA%{$PGMr{+Y|6099V-yXPCpyEfkoHKa}fC#f;m?>*g-JSUBil%W} zw_;aDo|-2bY9|hH9Cq%+LSvO)c$-c}D$!e6jE;Y${kUd-w@+l@dT=rvWvr;?Y+`E- z23Phkwy%&2MBl3GZK|*qU`_@C&!DU4aYi=0Pr-`}?PKk^yj@Idmln|Z&%0j(8dklp zx%AcHb&G3a#MLJ*R3h1<>!LZ7F?R`Ci)vvbBW>>8>wS#%c9imYCv84Ep3~rQVBoAY zDcP+ZGlcbA*t;Yi6bh6e>*&$2!#v;Yyvwu&os)vL+?r2oQ<94snBj_q_LNT3(WCEr z->bx%bow?a2bI3%F}g$Ted&B7d1v4W4*P&lH%MkqEr16em>H3JM`1 zJwx`pffw69qc29ln#PaYW8*K1{~v$-GWz-v@OQ(n{|`tsVnA+y_VIxKH3}mlevHEY zfH*#X`57TV^n#y$GZFEdY0Te&j`!w2gHYtZfPT}d{~hUg2l+Ee?!&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BASE_DIR/terminal/launchers/mqlaunch-$stamp.sh.bak" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -# Prints git menu. -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -# Prints net menu. -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles git menu loop. -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles net menu loop. -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BASE_DIR/terminal/launchers/mqlaunch-$stamp.sh.bak" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -# Prints git menu. -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -# Prints net menu. -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles git menu loop. -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles net menu loop. -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BASE_DIR/terminal/launchers/mqlaunch-$stamp.sh.bak" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -# Prints git menu. -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -# Prints net menu. -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles git menu loop. -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles net menu loop. -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -# Prints git menu. -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -# Prints net menu. -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles git menu loop. -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles net menu loop. -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -# Prints git menu. -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -# Prints net menu. -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles git menu loop. -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles net menu loop. -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -# Prints git menu. -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -# Prints net menu. -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles git menu loop. -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles net menu loop. -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - - -# Handles theme cmd. -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -# Prints themes menu. -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -# Handles themes menu loop. -themes_menu_loop() { - local choice - - while true; do - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - - -# Opens git menu. -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -# Opens tools menu. -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -# Prints git menu. -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -# Prints net menu. -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles git menu loop. -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles net menu loop. -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat </dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -# Handles short host. -short_host() { - hostname -s 2>/dev/null || hostname -} - -# Prints header. -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -# Prints footer. -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -# Opens app. -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - echo "${C_ERR}AI script missing or not executable:${C_RESET}" - echo "$AI_SCRIPT" - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$AI_SCRIPT" ]]; then - row "[OK] ai-mode.sh executable" - else - row "[FAIL] ai-mode.sh missing/not executable" - fi - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "DEV / PROMPTS" - row3 "20. AI Modes" "21. Open AI Prompts folder" "22. Show prompt files" - row3 "23. Edit mqlaunch" "24. Backup prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-24]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) open_ai_prompts_folder ;; - 22) show_prompt_files ;; - 23) edit_mqlaunch ;; - 24) backup_prompts ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat </dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -# Handles short host. -short_host() { - hostname -s 2>/dev/null || hostname -} - -# Prints header. -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -# Prints footer. -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -# Opens app. -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - echo "${C_ERR}AI script missing or not executable:${C_RESET}" - echo "$AI_SCRIPT" - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$AI_SCRIPT" ]]; then - row "[OK] ai-mode.sh executable" - else - row "[FAIL] ai-mode.sh missing/not executable" - fi - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-21]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Open macos-scripts folder" " 6. Open launcher folder" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-6]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) open_base_dir ;; - 6) open_launcher_folder ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat </dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -# Handles short host. -short_host() { - hostname -s 2>/dev/null || hostname -} - -# Prints header. -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -# Prints footer. -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -# Opens app. -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-21]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Open macos-scripts folder" " 6. Open launcher folder" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-6]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) open_base_dir ;; - 6) open_launcher_folder ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat </dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -# Handles short host. -short_host() { - hostname -s 2>/dev/null || hostname -} - -# Prints header. -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -# Prints footer. -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -# Opens app. -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-21]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Prints dev menu. -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Open macos-scripts folder" " 6. Open launcher folder" - row2 " 7. Open mac terminal guide" " 0. Back" - - print_footer - printf "${C_TITLE}Select dev option [0-7]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles dev menu loop. -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) open_base_dir ;; - 6) open_launcher_folder ;; - 7) open_terminal_guide ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat </dev/null || hostname -} - -# Prints header. -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -# Prints footer. -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -# Opens app. -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - echo "${C_ERR}AI script missing or not executable:${C_RESET}" - echo "$AI_SCRIPT" - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - open "$REPO_URL" -} - -# Handles system check. -system_check() { - local prompt_count - prompt_count="0" - - if [[ -d "$PROMPT_DIR" ]]; then - prompt_count="$(find "$PROMPT_DIR" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$AI_SCRIPT" ]]; then - row "[OK] ai-mode.sh executable" - else - row "[FAIL] ai-mode.sh missing/not executable" - fi - - if [[ -d "$PROMPT_DIR" ]]; then - row "[OK] Prompt dir found" - else - row "[FAIL] Prompt dir missing" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - row3 "20. AI Modes" "" "" - - print_footer - printf "${C_TITLE}Select option [1-20]: ${C_RESET}" -} - -# Prints ai menu. -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -# Handles ai menu loop. -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Handles main loop. -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_path "$HOME/Downloads" ;; - 9) open_path "$HOME" ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_path "/Applications/Utilities" ;; - 15) open_path "/Applications" ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Shows help. -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Legacy: $BASE_DIR/terminal/launchers/mqlaunch.sh" - row "V1: $BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local legacy="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local v1="$BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Legacy: $legacy" - row "V1: $v1" - row "Latest bundle: $latest_bundle" - row "Modules: perf / dev / tools" - - print_footer - pause_enter -} - -show_command_index() { - print_header - row_bold "COMMAND INDEX" - empty_row - - row "CORE" - row " mqlaunch Open main menu" - row " mqlaunch help Show help" - row " mqlaunch commands Show command index" - - empty_row - row "WORKFLOWS" - row " mqlaunch perf Performance module" - row " mqlaunch dev Dev module" - row " mqlaunch git Alias for Dev" - row " mqlaunch tools Tools module" - - empty_row - row "STATUS / SUPPORT" - row " mqlaunch about About / status dashboard" - row " mqlaunch version Version information" - row " mqlaunch notes Release notes / changelog" - row " mqlaunch check Run self-check" - row " mqlaunch bundle Create debug bundle" - - empty_row - row "UTILITY" - row " mqlaunch repo Open repo root" - row " mqlaunch guide Open terminal guide" - - empty_row - row "ALIASES" - row " mqlaunch health Alias for check" - row " mqlaunch support Alias for bundle" - row " mqlaunch changelog Alias for notes" - row " mqlaunch dashboard Alias for about" - row " mqlaunch index Alias for commands" - row " mqlaunch palette Alias for commands" - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row2 "23. Performance" "24. Dev" - row2 "25. Tools" "26. Version" - row2 "27. Self-check" "28. Debug bundle" - row2 "29. Release notes" "30. About / Status" - row "31. Command index" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-31,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - - -tweaks_menu_loop() { - local tweaks_script="$BASE_DIR/system/tweaks/macos-tweaks.sh" - - if [[ -x "$tweaks_script" || -f "$tweaks_script" ]]; then - bash "$tweaks_script" menu || true - else - echo "${C_ERR}Tweaks script not found:${C_RESET} $tweaks_script" - pause_enter - return 1 - fi -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - 26) show_version_info ;; - 27) run_self_check || true ;; - 28) run_debug_bundle || true ;; - 29) show_release_notes || true ;; - 30) show_about_dashboard || true ;; - 31) show_command_index || true ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_release_menu() { - local release_menu="$BASE_DIR/terminal/menus/mq-release-menu.sh" - if [[ -x "$release_menu" ]]; then - "$release_menu" - else - echo "Release menu not found: $release_menu" - fi -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Legacy: $BASE_DIR/terminal/launchers/mqlaunch.sh" - row "V1: $BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -run_mqlogin() { - local login_script="$BASE_DIR/automation/login/mqlogin.sh" - - if [[ ! -x "$login_script" ]]; then - print_header - row_bold "LOGIN BOOT" - empty_row - row "Missing or non-executable:" - row " $login_script" - row "Run:" - row " chmod +x $login_script" - print_footer - pause_enter - return 1 - fi - - "$login_script" "$@" -} - -run_mqshortcuts() { - local shortcuts_script="$BASE_DIR/automation/shortcuts/mqshortcuts.sh" - - if [[ ! -x "$shortcuts_script" ]]; then - print_header - row_bold "SHORTCUTS" - empty_row - row "Missing or non-executable:" - row " $shortcuts_script" - row "Run:" - row " chmod +x $shortcuts_script" - print_footer - pause_enter - return 1 - fi - - "$shortcuts_script" "$@" -} - -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local legacy="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local v1="$BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Legacy: $legacy" - row "V1: $v1" - row "Latest bundle: $latest_bundle" - row "Modules: perf / dev / tools" - - print_footer - pause_enter -} - -show_command_index() { - print_header - row_bold "COMMAND INDEX" - empty_row - - row "CORE" - row " mqlaunch Open main menu" - row " mqlaunch help Show help" - row " mqlaunch commands Show command index" - - empty_row - row "WORKFLOWS" - row " mqlaunch perf Performance module" - row " mqlaunch dev Dev module" - row " mqlaunch git Alias for Dev" - row " mqlaunch tools Tools module" - row " mqlaunch release Open Release Menu" - row " mqlaunch login Start session boot" - row " mqlaunch shortcuts Open Shortcuts helper" - row " mqlaunch shortcuts list" - row " mqlaunch shortcuts search clip" - row " mqlaunch login menu Session boot + full menu" - row " mqlaunch login about Session boot + about screen" - row " mqlaunch login check Session boot + self-check" - - empty_row - row "STATUS / SUPPORT" - row " mqlaunch about About / status dashboard" - row " mqlaunch version Version information" - row " mqlaunch notes Release notes / changelog" - row " mqlaunch check Run self-check" - row " mqlaunch bundle Create debug bundle" - - empty_row - row "UTILITY" - row " mqlaunch repo Open repo root" - row " mqlaunch guide Open terminal guide" - - empty_row - row "ALIASES" - row " mqlaunch health Alias for check" - row " mqlaunch support Alias for bundle" - row " mqlaunch changelog Alias for notes" - row " mqlaunch dashboard Alias for about" - row " mqlaunch index Alias for commands" - row " mqlaunch palette Alias for commands" - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row2 "23. Performance" "24. Dev" - row2 "25. Tools" "26. Version" - row2 "27. Self-check" "28. Debug bundle" - row2 "29. Release notes" "30. About / Status" - row "31. Command index" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-31,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - - -tweaks_menu_loop() { - local tweaks_script="$BASE_DIR/system/tweaks/macos-tweaks.sh" - - if [[ -x "$tweaks_script" || -f "$tweaks_script" ]]; then - bash "$tweaks_script" menu || true - else - echo "${C_ERR}Tweaks script not found:${C_RESET} $tweaks_script" - pause_enter - return 1 - fi -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - 26) show_version_info ;; - 27) run_self_check || true ;; - 28) run_debug_bundle || true ;; - 29) show_release_notes || true ;; - 30) show_about_dashboard || true ;; - 31) show_command_index || true ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Legacy: $BASE_DIR/terminal/launchers/mqlaunch.sh" - row "V1: $BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row2 "23. Performance" "24. Dev" - row2 "25. Tools" "26. Version" - row2 "27. Self-check" "28. Debug bundle" - row "29. Release notes" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-29,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - 26) show_version_info ;; - 27) run_self_check || true ;; - 28) run_debug_bundle || true ;; - 29) show_release_notes || true ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Legacy: $BASE_DIR/terminal/launchers/mqlaunch.sh" - row "V1: $BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local status=$? - - echo - if [[ $status -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $status -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row2 "23. Performance" "24. Dev" - row2 "25. Tools" "26. Version" - row "27. Self-check" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-27,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - 26) show_version_info ;; - 27) run_self_check ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Legacy: $BASE_DIR/terminal/launchers/mqlaunch.sh" - row "V1: $BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local legacy="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local v1="$BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Legacy: $legacy" - row "V1: $v1" - row "Latest bundle: $latest_bundle" - row "Modules: perf / dev / tools" - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row2 "23. Performance" "24. Dev" - row2 "25. Tools" "26. Version" - row2 "27. Self-check" "28. Debug bundle" - row2 "29. Release notes" "30. About / Status" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-30,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - 26) show_version_info ;; - 27) run_self_check || true ;; - 28) run_debug_bundle || true ;; - 29) show_release_notes || true ;; - 30) show_about_dashboard || true ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-25,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-25,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Legacy: $BASE_DIR/terminal/launchers/mqlaunch.sh" - row "V1: $BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local status=$? - - echo - if [[ $status -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $status -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local status=$? - - echo - if [[ $status -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $status -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row2 "23. Performance" "24. Dev" - row2 "25. Tools" "26. Version" - row2 "27. Self-check" "28. Debug bundle" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-28,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - 26) show_version_info ;; - 27) run_self_check ;; - 28) run_debug_bundle ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Legacy: $BASE_DIR/terminal/launchers/mqlaunch.sh" - row "V1: $BASE_DIR/terminal/mqlaunch-v1/mqlaunch.sh" - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row2 "23. Performance" "24. Dev" - row2 "25. Tools" "26. Version" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-26,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - 26) show_version_info ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -BOX_INNER=88 - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "QUICK ACTIONS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - empty_row - row "WORKFLOWS" - row2 "23. Performance" "24. Dev" - row "25. Tools" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-25,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) tweaks_menu_loop ;; - 23) open_v1_performance_menu ;; - 24) open_v1_dev_menu ;; - 25) open_v1_tools_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat </dev/null 2>&1 -} - -# Gets hostname. -get_hostname() { - scutil --get ComputerName 2>/dev/null || hostname -} - -# Gets user. -get_user() { - whoami -} - -# Gets shell name. -get_shell_name() { - basename "${SHELL:-unknown}" -} - -# Gets now. -get_now() { - date '+%Y-%m-%d %H:%M:%S' -} - -# Gets uptime pretty. -get_uptime_pretty() { - uptime | sed 's/^.*up *//; s/, *[0-9]* users.*$//' -} - -# Gets cpu load. -get_cpu_load() { - uptime | awk -F'load averages?: ' '{print $2}' | sed 's/^ *//' -} - -# Gets mem info. -get_mem_info() { - if ! safe_cmd vm_stat; then - echo "vm_stat unavailable" - return - fi - - local page_size pages_free pages_active pages_inactive pages_speculative pages_wired - page_size="$(vm_stat | awk '/page size of/ {gsub("\\.","",$8); print $8}')" - pages_free="$(vm_stat | awk '/Pages free/ {gsub("\\.","",$3); print $3}')" - pages_active="$(vm_stat | awk '/Pages active/ {gsub("\\.","",$3); print $3}')" - pages_inactive="$(vm_stat | awk '/Pages inactive/ {gsub("\\.","",$3); print $3}')" - pages_speculative="$(vm_stat | awk '/Pages speculative/ {gsub("\\.","",$3); print $3}')" - pages_wired="$(vm_stat | awk '/Pages wired down/ {gsub("\\.","",$4); print $4}')" - - python3 - </dev/null | awk '/gateway:/{print $2}' || true -} - -# Gets wifi name. -get_wifi_name() { - local airport - airport="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport" - if [[ -x "$airport" ]]; then - "$airport" -I 2>/dev/null | awk -F': ' '/ SSID/ {print $2}' - fi -} - -# Gets battery info. -get_battery_info() { - if safe_cmd pmset; then - local raw - raw="$(pmset -g batt 2>/dev/null | tail -1 | sed 's/^ *//')" - [[ -n "$raw" ]] && echo "$raw" || echo "Battery info unavailable" - else - echo "Battery info unavailable" - fi -} - -# Gets git info. -get_git_info() { - if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then - local branch dirty - branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")" - if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then - dirty="dirty" - else - dirty="clean" - fi - echo "Repo: $(basename "$(git rev-parse --show-toplevel 2>/dev/null)") | Branch: $branch | State: $dirty" - else - echo "Not in a git repository" - fi -} - -# Handles top processes. -top_processes() { - ps -Ao pid,comm,%cpu,%mem -r | head -n 6 -} - -# Prints header. -print_header() { - clear || true - line - printf '%*s\n' $(( (WIDTH + ${#APP_NAME}) / 2 )) "$APP_NAME" - line -} - -# Runs the main entry point. -main() { - print_header - - section "SYSTEM" - kv "Host" "$(get_hostname)" - kv "User" "$(get_user)" - kv "Shell" "$(get_shell_name)" - kv "Time" "$(get_now)" - kv "Uptime" "$(get_uptime_pretty)" - - section "PERFORMANCE" - kv "CPU Load" "$(get_cpu_load)" - kv "Memory" "$(get_mem_info)" - kv "Disk /" "$(get_disk_info)" - - section "NETWORK" - kv "Primary IP" "$(get_primary_ip)" - kv "Gateway" "$(get_default_route)" - local wifi_name - wifi_name="$(get_wifi_name 2>/dev/null || true)" - [[ -z "$wifi_name" ]] && wifi_name="Not connected" - kv "Wi-Fi" "$wifi_name" - - section "POWER" - kv "Battery" "$(get_battery_info)" - - section "GIT" - kv "Status" "$(get_git_info)" - - section "TOP PROCESSES" - printf '%-8s %-28s %-8s %-8s\n' "PID" "COMMAND" "%CPU" "%MEM" - subline - top_processes - - printf '\n' - line - printf 'Press Enter to return...' - read -r _ -} - -main "$@" diff --git a/backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh b/backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh deleted file mode 100755 index 616d7c7..0000000 --- a/backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh +++ /dev/null @@ -1,727 +0,0 @@ -#!/bin/zsh - -export LANG=C.UTF-8 -export LC_ALL=C.UTF-8 -export LC_MESSAGES=C.UTF-8 - -STATE_FILE=~/.gitlaunch_state -DEFAULT_REPO=~/macos-scripts -REQUESTED_REPO="${MQ_GIT_REPO:-${1:-}}" -WORK_DIR="" - -if [[ -t 1 ]] && command -v tput >/dev/null 2>&1 && [[ "$(tput colors 2>/dev/null)" -ge 8 ]]; then - C_RESET=$'\e[0m' - C_BOLD=$'\e[1m' - C_DIM=$'\e[2m' - C_BORDER=$'\e[38;5;229m' - C_ACCENT=$'\e[38;5;220m' - C_TITLE=$'\e[1;38;5;229m' - C_LABEL=$'\e[38;5;229m' - C_GOOD=$'\e[92m' - C_WARN=$'\e[93m' - C_BAD=$'\e[91m' - C_DIM=$'\e[38;5;245m' - C_CYAN=$'\e[36m' - C_YELLOW=$'\e[33m' - C_PINK=$'\e[95m' - C_MAGENTA=$'\e[35m' -else - C_RESET="" - C_BOLD="" - C_DIM="" - C_BORDER="" - C_ACCENT="" - C_TITLE="" - C_LABEL="" - C_GOOD="" - C_WARN="" - C_BAD="" - C_DIM="" - C_CYAN="" - C_YELLOW="" - C_PINK="" - C_MAGENTA="" -fi - -GUM_BIN="$(command -v gum 2>/dev/null || true)" -UI_WIDTH=62 -UI_INNER=$((UI_WIDTH - 4)) - -# ------------------------ -# ASCII ART -# ------------------------ -function render_ascii() { - printf "%b" "$C_CYAN" - cat <<'EOF' - ██████╗ ██╗████████╗ - ██╔════╝ ██║╚══██╔══╝ - ██║ ███╗██║ ██║ - ██║ ██║██║ ██║ - ╚██████╔╝██║ ██║ - ╚═════╝ ╚═╝ ╚═╝ -EOF - printf "%b" "$C_PINK" - cat <<'EOF' -██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗ -██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║ -██║ ███████║██║ ██║██╔██╗██║██║ ███████║ -██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║ -╚██████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║ - ╚═════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝ -EOF - printf "%b" "$C_RESET" -} - -# ------------------------ -# STATE MANAGEMENT -# ------------------------ -function save_state() { - { - print -r -- "REPO=${(qqq)REPO}" - print -r -- "WORK_DIR=${(qqq)WORK_DIR}" - print -r -- "LAST_ACTION=${(qqq)1}" - print -r -- "TIMESTAMP=${(qqq)$(date)}" - } > "$STATE_FILE" -} - -# Handles load state. -function load_state() { - if [ -f "$STATE_FILE" ]; then - source $STATE_FILE - return 0 - else - return 1 - fi -} - -# ------------------------ -# REPO SWITCHING -# ------------------------ -function resolve_repo_path() { - local repo_path="$1" - - case "$repo_path" in - \~) repo_path="$HOME" ;; - \~/*) repo_path="$HOME/${repo_path#\~/}" ;; - esac - - if [[ "$repo_path" != /* ]]; then - repo_path="$(pwd)/$repo_path" - fi - - (cd "$repo_path" 2>/dev/null && pwd) || return 1 -} - -# Sets repo. -function set_repo() { - local repo_path="$1" - local save="${2:-}" - local resolved_path resolved_repo - - resolved_path=$(resolve_repo_path "$repo_path") || { - echo "Path not found: $repo_path" - sleep 1 - return 1 - } - - resolved_repo=$(git -C "$resolved_path" rev-parse --show-toplevel 2>/dev/null) - if [ -z "$resolved_repo" ]; then - echo "Not a git repo: $repo_path" - sleep 1 - return 1 - fi - - REPO=$resolved_repo - WORK_DIR=$resolved_path - if [ "$save" = "save" ]; then - save_state "set_repo" - fi -} - -# Handles switch repo. -function switch_repo() { - echo "Enter local repo path:" - echo -n "> " - read new_repo - - if [ -z "$new_repo" ]; then - echo "No repo entered" - sleep 1 - return - fi - - set_repo "$new_repo" save || return - echo "Switched to: $REPO" - sleep 1 -} - -# ------------------------ -# REPO DETECTION -# ------------------------ -function detect_repo() { - local detected="" - local detected_path="" - - if [ -n "$REQUESTED_REPO" ]; then - set_repo "$REQUESTED_REPO" || REPO="" - REQUESTED_REPO="" - fi - - if [ -z "$REPO" ]; then - detected=$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null) - if [ -n "$detected" ]; then - REPO=$detected - detected_path=$(pwd) - WORK_DIR=$detected_path - fi - fi - - if [ -z "$REPO" ]; then - echo "⚠️ Not inside a git repo" - echo "1. Go to default repo" - echo "2. Exit" - echo -n "Choose: " - read choice - - case $choice in - 1) - REPO=$DEFAULT_REPO - WORK_DIR=$DEFAULT_REPO - ;; - *) exit ;; - esac - fi - - [ -n "$WORK_DIR" ] || WORK_DIR="$REPO" - cd "$WORK_DIR" || exit -} - -# ------------------------ -# UI -# ------------------------ -function clear_screen() { - printf "%b" "$C_RESET" - clear -} - -# Handles use gum menu. -function use_gum_menu() { - [[ -t 0 && -t 1 && -n "$GUM_BIN" ]] -} - -# Handles repeat char. -function repeat_char() { - local char="$1" - local count="$2" - printf "%${count}s" "" | tr " " "$char" -} - -# Handles truncate text. -function truncate_text() { - local text="$1" - local max="$2" - - if [ ${#text} -le "$max" ]; then - print -r -- "$text" - elif [ "$max" -le 3 ]; then - print -r -- "${text[1,$max]}" - else - print -r -- "${text[1,$((max - 3))]}..." - fi -} - -# Handles frame top. -function frame_top() { - printf "%b┌%s┐%b\n" "$C_BORDER" "$(repeat_char "─" "$((UI_WIDTH - 2))")" "$C_RESET" -} - -# Handles frame mid. -function frame_mid() { - printf "%b├%s┤%b\n" "$C_BORDER" "$(repeat_char "─" "$((UI_WIDTH - 2))")" "$C_RESET" -} - -# Handles frame bottom. -function frame_bottom() { - printf "%b└%s┘%b\n" "$C_BORDER" "$(repeat_char "─" "$((UI_WIDTH - 2))")" "$C_RESET" -} - -# Handles frame blank. -function frame_blank() { - printf "%b│%b %-${UI_INNER}s %b│%b\n" "$C_BORDER" "$C_RESET" "" "$C_BORDER" "$C_RESET" -} - -# Handles frame row. -function frame_row() { - local text - text=$(truncate_text "$1" "$UI_INNER") - printf "%b│%b %-${UI_INNER}s %b│%b\n" "$C_BORDER" "$C_RESET" "$text" "$C_BORDER" "$C_RESET" -} - -# Handles frame row colored. -function frame_row_colored() { - local text color - text=$(truncate_text "$1" "$UI_INNER") - color="$2" - printf "%b│%b %b%-${UI_INNER}s%b %b│%b\n" "$C_BORDER" "$C_RESET" "$color" "$text" "$C_RESET" "$C_BORDER" "$C_RESET" -} - -# Handles frame two col. -function frame_two_col() { - local left right col_width - col_width=$(((UI_INNER - 3) / 2)) - left=$(truncate_text "$1" "$col_width") - right=$(truncate_text "$2" "$col_width") - printf "%b│%b %-${col_width}s %b│%b %-${col_width}s %b│%b\n" \ - "$C_BORDER" "$C_RESET" "$left" "$C_BORDER" "$C_RESET" "$right" "$C_BORDER" "$C_RESET" -} - -# Handles frame title. -function frame_title() { - local title="$1" - local title_len=${#title} - local inner=$((UI_WIDTH - 2)) - local pad_left=$(((inner - title_len) / 2)) - local pad_right=$((inner - title_len - pad_left)) - [ "$pad_left" -lt 0 ] && pad_left=0 - [ "$pad_right" -lt 0 ] && pad_right=0 - - printf "%b│%b%${pad_left}s%b%s%b%${pad_right}s%b│%b\n" \ - "$C_BORDER" "$C_RESET" "" "$C_TITLE" "$title" "$C_RESET" "" "$C_BORDER" "$C_RESET" -} - -# Handles render banner. -function render_banner() { - render_ascii - echo - frame_top - frame_title "MQ REPO LAUNCHER" - frame_mid - frame_row_colored " ★ PHOSPHOR GRID ACTIVE ★" "$C_PINK" - frame_blank - frame_mid -} - -# Handles remote state. -function remote_state() { - local ahead behind - - ahead=$(git rev-list --count @{u}..HEAD 2>/dev/null) - behind=$(git rev-list --count HEAD..@{u} 2>/dev/null) - - if [ -z "$ahead" ] || [ -z "$behind" ]; then - echo "NO UPSTREAM" - elif [ "$ahead" -gt 0 ] && [ "$behind" -gt 0 ]; then - echo "DIVERGED" - elif [ "$ahead" -gt 0 ]; then - echo "AHEAD $ahead" - elif [ "$behind" -gt 0 ]; then - echo "BEHIND $behind" - else - echo "OK" - fi -} - -# Handles fallback border top. -function fallback_border_top() { - printf "%b┌────────────────────────────────────────────────────────────────────────┐%b\n" "$C_CYAN" "$C_RESET" -} - -# Handles fallback border mid. -function fallback_border_mid() { - printf "%b├────────────────────────────────────────────────────────────────────────┤%b\n" "$C_CYAN" "$C_RESET" -} - -# Handles fallback border bottom. -function fallback_border_bottom() { - printf "%b└────────────────────────────────────────────────────────────────────────┘%b\n" "$C_CYAN" "$C_RESET" -} - -# Handles fallback row. -function fallback_row() { - local text - text=$(truncate_text "$1" 70) - printf "%b│%b %-70s %b│%b\n" "$C_CYAN" "$C_RESET" "$text" "$C_CYAN" "$C_RESET" -} - -# Handles fallback row colored. -function fallback_row_colored() { - local text color - text=$(truncate_text "$1" 70) - color="$2" - printf "%b│%b %b%-70s%b %b│%b\n" "$C_CYAN" "$C_RESET" "$color" "$text" "$C_RESET" "$C_CYAN" "$C_RESET" -} - -# Handles fallback status row. -function fallback_status_row() { - local label="$1" - local value="$2" - local color="${3:-}" - value=$(truncate_text "$value" 61) - printf "%b│%b %b%-7s%b: %b%-61s%b %b│%b\n" \ - "$C_CYAN" "$C_RESET" "$C_TITLE" "$label" "$C_RESET" "$color" "$value" "$C_RESET" "$C_CYAN" "$C_RESET" -} - -# ------------------------ -# STATUS -# ------------------------ - -# Handles status check. -function status_check() { - BRANCH=$(git branch --show-current) - CHANGES=$(git status --porcelain | wc -l | xargs) - REMOTE=$(remote_state) - - if ! use_gum_menu; then - fallback_border_top - fallback_row_colored "GITHUB LAUNCHPAD" "$C_TITLE" - fallback_row_colored "REPO COMMAND DECK" "$C_YELLOW" - fallback_border_mid - fallback_status_row "Repo" "$REPO" - fallback_status_row "Path" "${WORK_DIR:-$REPO}" - fallback_status_row "Branch" "$BRANCH" - fallback_status_row "Status" "${CHANGES} change(s)" - if [ "$CHANGES" -eq 0 ]; then - fallback_status_row "State" "CLEAN" "$C_GOOD" - else - fallback_status_row "State" "DIRTY" "$C_BAD" - fi - fallback_status_row "Remote" "$REMOTE" - return - fi - - render_banner - frame_row "PATH : ${WORK_DIR:-$REPO}" - frame_row "BRANCH : ${BRANCH:u}" - if [ "$CHANGES" -eq 0 ]; then - frame_row_colored "STATE : CLEAN" "$C_GOOD" - else - frame_row_colored "STATE : DIRTY (${CHANGES} CHANGES)" "$C_WARN" - fi - frame_row "REMOTE : $REMOTE" - frame_bottom -} - -# ------------------------ -# MENU -# ------------------------ -function render_menu() { - echo - frame_top - frame_row_colored "1. GIT STATUS" "$C_LABEL" - frame_row_colored "2. GIT PULL" "$C_LABEL" - frame_row_colored "3. AI COMMIT" "$C_LABEL" - frame_row_colored "4. SAFE PUSH" "$C_LABEL" - frame_row_colored "5. OPEN REPO" "$C_LABEL" - frame_row_colored "6. DEV MODE" "$C_LABEL" - frame_row_colored "7. SWITCH REPO" "$C_LABEL" - frame_row_colored "8. AUTO ACTION" "$C_LABEL" - frame_row_colored "b. BACK" "$C_LABEL" - frame_bottom -} - -# Handles render next action. -function render_next_action() { - if ! use_gum_menu; then - fallback_border_mid - fallback_row_colored "NEXT ACTION: $NEXT_ACTION_MESSAGE" "$NEXT_ACTION_COLOR" - fallback_border_bottom - return - fi - - frame_top - frame_row_colored "$NEXT_ACTION_MESSAGE" "$NEXT_ACTION_COLOR" - frame_bottom -} - -# Handles prompt choice. -function prompt_choice() { - local prompt_sep input old_stty - prompt_sep="$(repeat_char "─" "$UI_WIDTH")" - - printf "%b%s%b\n" "$C_BORDER" "$prompt_sep" "$C_RESET" - printf "%bgitlaunch > %b\n" "$C_TITLE" "$C_RESET" - printf "%b%s%b\n" "$C_BORDER" "$prompt_sep" "$C_RESET" - printf "%b>> press 1-9%b\n" "$C_DIM" "$C_RESET" - printf "\033[3A" - printf "%bgitlaunch > %b" "$C_TITLE" "$C_RESET" - - if [[ -t 0 ]]; then - old_stty="$(stty -g)" - stty -echo -icanon min 1 time 0 2>/dev/null || true - IFS= read -r -k 1 input 2>/dev/null || input="" - stty "$old_stty" 2>/dev/null || true - else - IFS= read -r input || input="b" - fi - - printf "%s\n" "$input" - printf "\033[2B" - - choice="$input" -} - -# ------------------------ -# NEXT ACTION ENGINE -# ------------------------ -function next_action() { - - CHANGES=$(git status --porcelain) - STAGED=$(git diff --cached --name-only) - AHEAD=$(git rev-list --count @{u}..HEAD 2>/dev/null) - BEHIND=$(git rev-list --count HEAD..@{u} 2>/dev/null) - - if echo "$CHANGES" | grep -q "UU"; then - NEXT_ACTION_MESSAGE="Resolve merge conflicts" - NEXT_ACTION_COLOR="$C_BAD" - return - fi - - if [ -n "$CHANGES" ] && [ -z "$STAGED" ]; then - NEXT_ACTION_MESSAGE="Stage your changes (git add .)" - NEXT_ACTION_COLOR="$C_WARN" - return - fi - - if [ -n "$STAGED" ]; then - NEXT_ACTION_MESSAGE="Commit your changes" - NEXT_ACTION_COLOR="$C_WARN" - return - fi - - if [ -n "$BEHIND" ] && [ "$BEHIND" -gt 0 ]; then - NEXT_ACTION_MESSAGE="Pull latest changes" - NEXT_ACTION_COLOR="$C_WARN" - return - fi - - if [ -n "$AHEAD" ] && [ "$AHEAD" -gt 0 ]; then - NEXT_ACTION_MESSAGE="Push your commits" - NEXT_ACTION_COLOR="$C_GOOD" - return - fi - - NEXT_ACTION_MESSAGE="Nothing to do" - NEXT_ACTION_COLOR="$C_GOOD" -} - -# ------------------------ -# DIFF INTELLIGENCE (v6) -# ------------------------ -function analyze_diff() { - - DIFF=$(git diff) - FILES=$(git diff --name-only) - - echo "" - echo "🔍 Diff analysis:" - - RISK_LEVEL="LOW" - WARNINGS=() - - # Sensitive files - if echo "$FILES" | grep -E "\.env|\.key|\.pem" >/dev/null; then - WARNINGS+=("Possible secrets in sensitive files") - RISK_LEVEL="HIGH" - fi - - # Credentials - if echo "$DIFF" | grep -iE "password=|token=|secret=" >/dev/null; then - WARNINGS+=("Hardcoded credentials detected") - RISK_LEVEL="HIGH" - fi - - # Dangerous commands - if echo "$DIFF" | grep -E "rm -rf" >/dev/null; then - WARNINGS+=("Destructive command: rm -rf") - RISK_LEVEL="HIGH" - fi - - if echo "$DIFF" | grep -E "sudo " >/dev/null; then - WARNINGS+=("Use of sudo detected") - [ "$RISK_LEVEL" != "HIGH" ] && RISK_LEVEL="MEDIUM" - fi - - # Large diff - LINES=$(echo "$DIFF" | wc -l | xargs) - if [ "$LINES" -gt 300 ]; then - WARNINGS+=("Large diff: $LINES lines") - [ "$RISK_LEVEL" = "LOW" ] && RISK_LEVEL="MEDIUM" - fi - - # Script changes - if echo "$FILES" | grep -E "\.sh$" >/dev/null; then - WARNINGS+=("Shell script modified") - [ "$RISK_LEVEL" = "LOW" ] && RISK_LEVEL="MEDIUM" - fi - - if [ ${#WARNINGS[@]} -eq 0 ]; then - printf "%b✅ No obvious risks%b\n" "$C_GOOD" "$C_RESET" - else - case "$RISK_LEVEL" in - HIGH) RISK_COLOR=$C_BAD ;; - MEDIUM) RISK_COLOR=$C_WARN ;; - *) RISK_COLOR=$C_GOOD ;; - esac - printf "%b⚠️ Risk level: %s%b\n" "$RISK_COLOR" "$RISK_LEVEL" "$C_RESET" - for w in "${WARNINGS[@]}"; do - printf "%b- %s%b\n" "$C_DIM" "$w" "$C_RESET" - done - fi - - echo "" -} - -# ------------------------ -# SAFE PUSH -# ------------------------ -function safe_push() { - git fetch - LOCAL=$(git rev-parse @) - REMOTE=$(git rev-parse @{u} 2>/dev/null) - - if [ -z "$REMOTE" ]; then - echo "⚠️ No upstream branch set." - return - fi - - if [ "$LOCAL" != "$REMOTE" ]; then - echo "⚠️ Repo not up to date. Run pull first." - return - fi - - git push -} - -# ------------------------ -# COMMIT SUGGESTION -# ------------------------ -function suggest_commit() { - FILES=$(git diff --name-only) - - if [[ "$FILES" == *"install.sh"* && "$FILES" == *"system-check.sh"* ]]; then - echo "improve install and system-check scripts" - elif [[ "$FILES" == *.sh* ]]; then - echo "update shell scripts" - elif [[ "$FILES" == *.md* ]]; then - echo "update documentation" - else - echo "update project files" - fi -} - -# ------------------------ -# WORKSPACE RESUME -# ------------------------ -if load_state; then - echo "🔁 Resume last workspace?" - echo "Repo: $REPO" - echo -n "(y/n): " - read resume - - if [[ "$resume" == "y" ]]; then - cd "${WORK_DIR:-$REPO}" - echo "🚀 Restoring workspace..." - - echo "Workspace restored" - sleep 1 - else - REPO="" - fi -fi - -# ------------------------ -# MAIN LOOP -# ------------------------ -trap 'printf "%b" "$C_RESET"' EXIT - -while true; do - detect_repo - clear_screen - status_check - next_action - render_next_action - - if use_gum_menu && [ -n "$(git status --porcelain)" ]; then - analyze_diff - fi - - echo "" - render_menu - - prompt_choice - - case $choice in - 1) - git status - read - ;; - 2) - git pull - read - ;; - 3) - SUGGESTED=$(suggest_commit) - - echo "" - printf "%b💡 Suggested commit message:%b\n" "$C_TITLE" "$C_RESET" - echo "$SUGGESTED" - - analyze_diff - - printf "%bProceed with commit? (y/n): %b" "$C_LABEL" "$C_RESET" - read proceed - - if [[ "$proceed" != "y" ]]; then - echo "❌ Commit cancelled" - read - continue - fi - - git add . - git commit -m "$SUGGESTED" - git push - read - ;; - 4) - safe_push - read - ;; - 5) - open . - ;; - 6) - echo "🚀 Starting Dev Mode..." - save_state "dev_mode" - - open -a "ChatGPT Atlas" - open -a Terminal "${WORK_DIR:-$REPO}" - - if command -v code >/dev/null 2>&1; then - code "${WORK_DIR:-$REPO}" - fi - - REPO_NAME=$(basename "$REPO") - open "https://github.com/MCamner/$REPO_NAME" - - echo "✅ Dev environment ready" - sleep 1 - ;; - 7) - switch_repo - ;; - 8) - git add . - SUGGESTED=$(suggest_commit) - git commit -m "$SUGGESTED" - git push - read - ;; - 9|b|B) - break - ;; - *) - echo "Invalid" - sleep 1 - ;; - esac -done diff --git a/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh b/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh deleted file mode 100644 index 6ce87ef..0000000 --- a/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh +++ /dev/null @@ -1,421 +0,0 @@ -#!/usr/bin/env bash - -# Normalizes cli word. -normalize_cli_word() { - printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]' -} - -# AI prompt helpers -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -AI_PROMPTS="$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" -# shellcheck disable=SC1090 -[[ -f "$AI_PROMPTS" ]] && source "$AI_PROMPTS" - -# Prints command help. -print_command_help() { - local topic="${1:-}" - - case "$topic" in - system) - cat <<'HELP' -mqlaunch system -mqlaunch system perf -mqlaunch system network -mqlaunch system check -mqlaunch system self-check -mqlaunch system debug -mqlaunch system repo -mqlaunch system browser -mqlaunch system time -HELP - ;; - release) - cat <<'HELP' -mqlaunch release -mqlaunch release notes -mqlaunch release version -HELP - ;; - dev) - cat <<'HELP' -mqlaunch dev -mqlaunch dev ai -mqlaunch dev tools -HELP - ;; - help) - cat <<'HELP' -mqlaunch help -mqlaunch help index -mqlaunch help about -mqlaunch help version -mqlaunch help notes -mqlaunch help repo -mqlaunch help browser -HELP - ;; - git) - cat <<'HELP' -mqlaunch git -HELP - ;; - *) - cat <<'HELP' -Usage: - mqlaunch - mqlaunch demo - mqlaunch workflows - mqlaunch system - mqlaunch git - mqlaunch release - mqlaunch dev - mqlaunch help - -Quick commands: - mqlaunch demo - mqlaunch perf - mqlaunch network - mqlaunch check - mqlaunch self-check - mqlaunch debug - mqlaunch apps - mqlaunch theme - mqlaunch theme-macos - mqlaunch review - mqlaunch ui - mqlaunch ask "your question" - mqlaunch release-check - mqlaunch selftest - mqlaunch version - mqlaunch notes - mqlaunch about - mqlaunch index - mqlaunch docfunc - mqlaunch docwrite - -Subcommands: - mqlaunch system perf - mqlaunch system network - mqlaunch system check - mqlaunch system self-check - mqlaunch system debug - mqlaunch system repo - mqlaunch system browser - mqlaunch system time - - mqlaunch release notes - mqlaunch release version - - mqlaunch help index - mqlaunch help about - mqlaunch help version - mqlaunch help notes - mqlaunch help repo - mqlaunch help browser - - mqlaunch dev ai - mqlaunch dev tools - -Compatibility routes still work: - mqlaunch login menu - mqlaunch shortcuts list - mqlaunch palette -HELP - ;; - esac -} - -# Handles dispatch cli command. -dispatch_cli_command() { - local area sub - area="$(normalize_cli_word "${1:-}")" - sub="$(normalize_cli_word "${2:-}")" - - case "$area" in - ""|menu) - return 1 - ;; - - workflows|workflow) - if [[ -n "$sub" && "$sub" != "menu" ]]; then - run_mqworkflows "$sub" - else - run_mqworkflows - fi - return 0 - ;; - - demo) - run_demo_mode - return 0 - ;; - - review|/review) - if declare -f mq_ai_prompt_review >/dev/null; then - mq_ai_prompt_review - else - echo "Missing helper: mq_ai_prompt_review" - echo "Expected: $AI_PROMPTS" - fi - pause_enter - return 0 - ;; - - ui|/ui) - if declare -f mq_ai_prompt_ui >/dev/null; then - mq_ai_prompt_ui - else - echo "Missing helper: mq_ai_prompt_ui" - echo "Expected: $AI_PROMPTS" - fi - pause_enter - return 0 - ;; - - ask|/ask) - shift - "$BASE_DIR/tools/scripts/ask.sh" "$@" - return 0 - ;; - - fix|/fix) - shift - "$BASE_DIR/tools/scripts/fix.sh" "$@" - return 0 - ;; - - chat|/chat) - "$BASE_DIR/tools/scripts/chat.sh" - return 0 - ;; - - release-check|/release-check|check-release) - "$BASE_DIR/terminal/release/mq-release-check.sh" - pause_enter - return 0 - ;; - - selftest|/selftest|test-all) - "$BASE_DIR/tools/scripts/test-all.sh" - pause_enter - return 0 - ;; - - doctor|/doctor) - "$BASE_DIR/tools/scripts/doctor.sh" - pause_enter - return 0 - ;; - - scan|/scan) - "$BASE_DIR/tools/scripts/scan.sh" - pause_enter - return 0 - ;; - - atlas|/atlas) - shift - mq_ai_run_atlas "$@" - return 0 - ;; - - system) - case "$sub" in - ""|menu) - open_system_menu - ;; - perf|performance) - open_performance_menu - ;; - net|network) - show_network_info - ;; - doctor) - "$BASE_DIR/tools/scripts/doctor.sh" - ;; - check|health) - system_check - ;; - self-check|selfcheck) - run_self_check || true - ;; - debug|debug-bundle|bundle) - run_debug_bundle || true - ;; - repo|folder) - open_base_dir - ;; - browser|web) - open_repo_browser - ;; - time|date) - show_date_time - ;; - *) - print_command_help "system" - return 2 - ;; - esac - return 0 - ;; - - git) - case "$sub" in - ""|menu) - open_git_menu "${3:-}" - ;; - *) - open_git_menu "${2:-}" - ;; - esac - return 0 - ;; - - release) - case "$sub" in - ""|menu) - open_release_menu - ;; - notes|release-notes) - show_release_notes || true - ;; - version) - show_version_info || true - ;; - status) - "$BASE_DIR/terminal/menus/mq-release-menu.sh" status - ;; - *) - print_command_help "release" - return 2 - ;; - esac - return 0 - ;; - - dev) - case "$sub" in - ""|menu) - open_dev_menu - ;; - ai) - ai_menu_loop - ;; - tools) - open_tools_menu - ;; - current) - open_dev_menu - ;; - *) - print_command_help "dev" - return 2 - ;; - esac - return 0 - ;; - - help|-h|--help) - case "$sub" in - "") - show_help - ;; - menu) - open_help_center_menu - ;; - index|commands) - show_command_index || true - ;; - about|status) - show_about_dashboard || true - ;; - version) - show_version_info || true - ;; - notes|release-notes) - show_release_notes || true - ;; - repo|folder) - open_base_dir - ;; - browser|web) - open_repo_browser - ;; - *) - print_command_help "help" - return 2 - ;; - esac - return 0 - ;; - - perf|performance) - open_performance_menu - return 0 - ;; - - net|network) - show_network_info - return 0 - ;; - - check|health) - system_check - return 0 - ;; - - self-check|selfcheck) - run_self_check || true - return 0 - ;; - - debug|bundle|debug-bundle|support) - run_debug_bundle || true - return 0 - ;; - - apps) - open_apps_menu - return 0 - ;; - - docfunc|document-functions) - "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docfunc - return 0 - ;; - - docwrite|document-functions-write|update-comments) - "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docwrite - return 0 - ;; - - version) - show_version_info || true - return 0 - ;; - - notes|release-notes) - show_release_notes || true - return 0 - ;; - - about|status) - show_about_dashboard || true - return 0 - ;; - - index|commands) - show_command_index || true - return 0 - ;; - - *) - if declare -f mq_ai_prompt_ask >/dev/null; then - echo "Unknown command → routing to /ask" - mq_ai_prompt_ask "$@" - return 0 - fi - return 1 - ;; - esac -} diff --git a/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh b/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh deleted file mode 100755 index faea380..0000000 --- a/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env bash - -set -uo pipefail - -BASE_DIR="${BASE_DIR:-$HOME/macos-scripts}" -MQ_SHELL="${SHELL:-/bin/zsh}" -MQ_LINE="════════════════════════════════════════════════════" -PROMPT_LABEL="mqlaunch > " -MQ_LAST_STATUS=0 -MQ_MODE="repl" - -# --- COLORS (subtle) --- -C_RESET='\033[0m' -C_DIM='\033[2m' -C_ACCENT='\033[36m' # cyan -C_OK='\033[32m' # green -C_ERR='\033[31m' # red - -# Gets git branch. -get_git_branch() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git rev-parse --abbrev-ref HEAD 2>/dev/null || true -} - -# Gets status symbol. -get_status_symbol() { - if [[ "$MQ_LAST_STATUS" -eq 0 ]]; then - printf "%b✔%b" "$C_OK" "$C_RESET" - else - printf "%b✖ %d%b" "$C_ERR" "$MQ_LAST_STATUS" "$C_RESET" - fi -} - -# Gets context line. -get_context_line() { - local cwd branch status context - cwd="${PWD/#$HOME/~}" - branch="$(get_git_branch)" - status="$(get_status_symbol)" - - context="$cwd" - [[ -n "$branch" ]] && context="$context · $branch" - context="$context · $MQ_MODE · $status" - - printf "%b%s%b" "$C_DIM" "$context" "$C_RESET" -} - -# Runs menu. -run_menu() { - exec "$BASE_DIR/terminal/launchers/mqlaunch.sh" -} - -# Runs doctor. -run_doctor() { "$BASE_DIR/tools/scripts/doctor.sh"; } -# Runs perf. -run_perf() { "$BASE_DIR/terminal/bridges/performance-bridge.sh"; } -# Runs dev. -run_dev() { "$BASE_DIR/terminal/bridges/dev-bridge.sh"; } -# Runs tools. -run_tools() { "$BASE_DIR/terminal/menus/mq-tools-menu.sh"; } - -# Runs system. -run_system() { - if [[ "${1:-}" == "check" ]]; then - "$BASE_DIR/tools/scripts/system-check.sh" - else - "$BASE_DIR/terminal/menus/mq-system-menu.sh" - fi -} - -# Prints help. -print_help() { - cat <<'HELP' - -Core: doctor, perf, dev, tools, system, system check, demo, menu, where -Built-in: help, clear, x -Aliases: d, p, t, sys, sc - -HELP -} - -# Prints where. -print_where() { - local cwd branch - cwd="${PWD/#$HOME/~}" - branch="$(get_git_branch)" - - echo "cwd: $cwd" - echo "mode: $MQ_MODE" - echo "shell: $MQ_SHELL" - echo "git: ${branch:-"-"}" -} - -# Normalizes aliases. -normalize_aliases() { - case "$1" in - h) echo "help" ;; - d) echo "doctor" ;; - p) echo "perf" ;; - t) echo "tools" ;; - sys) echo "system" ;; - sc) echo "system check" ;; - q|x) echo "exit" ;; - *) echo "$1" ;; - esac -} - -# Runs shell fallback. -run_shell_fallback() { - local line="$1" - echo - echo -e "${C_DIM}[shell] $line${C_RESET}" - echo - "$MQ_SHELL" -lc "$line" -} - -# Handles dispatch command. -dispatch_command() { - local line="$1" - - [[ -z "$line" ]] && return 0 - line="$(normalize_aliases "$line")" - - case "$line" in - help) print_help ;; - clear|cls) clear ;; - exit|quit) return 99 ;; - menu) run_menu ;; - where) print_where ;; - doctor) run_doctor ;; - perf|performance) run_perf ;; - dev) run_dev ;; - tools) run_tools ;; - demo) run_demo ;; - "system check") run_system check ;; - system) run_system ;; - *) run_shell_fallback "$line" ;; - esac -} - -# Handles read prompt input. -read_prompt_input() { - local line context_line - context_line="$(get_context_line)" - - { - printf '%s\n' "$MQ_LINE" - printf '%b%s%b\n' "$C_ACCENT" "$PROMPT_LABEL" "$C_RESET" - printf '%s\n' "$MQ_LINE" - printf 'MQLAUNCH — Command Surface\n' - printf '%s\n' "$context_line" - printf '%bhelp = commands · x = exit%b\n' "$C_DIM" "$C_RESET" - - printf '\033[5A' - printf '\033[%dC' "${#PROMPT_LABEL}" - } > /dev/tty - - IFS= read -r line < /dev/tty - - { - printf '\033[5B' - printf '\r' - } > /dev/tty - - REPLY="$line" -} - -# Runs the main entry point. -main() { - local line status - - while true; do - read_prompt_input - line="$REPLY" - echo - - dispatch_command "$line" - status=$? - MQ_LAST_STATUS=$status - - if [[ $status -eq 99 ]]; then - echo - break - fi - - echo - done - - echo "[MQ] Bye." -} - -main "$@" diff --git a/backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh b/backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh deleted file mode 100755 index 7157a23..0000000 --- a/backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh +++ /dev/null @@ -1,1480 +0,0 @@ -#!/bin/zsh - -set -u - -# ============================================================ -# MQLAUNCH — Branded Neon Command Surface -# Adds: -# - MAIN MENU in bold -# - Author line in header -# - Git Launch + Net Launch in Prompt Tools -# ============================================================ - -APP_TITLE="MQLAUNCH" -APP_SUBTITLE="Branded Neon Command Surface" -APP_AUTHOR="Author Mattias Camner" - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - -# Performance bridge -if [[ -f "$BASE_DIR/terminal/bridges/performance-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/performance-bridge.sh" -fi - -# Dev bridge -if [[ -f "$BASE_DIR/terminal/bridges/dev-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/dev-bridge.sh" -fi - -# Tools bridge -if [[ -f "$BASE_DIR/terminal/bridges/tools-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/tools-bridge.sh" -fi -AI_SCRIPT="$BASE_DIR/tools/cli/ai-mode.sh" -PROMPT_DIR="$BASE_DIR/ai-prompts" -REPO_URL="https://github.com/MCamner/macos-scripts" -MQ_SCRIPT="$BASE_DIR/terminal/launchers/mqlaunch.sh" -BACKUP_DIR="$BASE_DIR/backups" -BIN_LINK="$HOME/bin/mqlaunch" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -DASHBOARD_V71="$BASE_DIR/ui/ascii/mqlaunch-dashboard-v7.1.sh" - -TERMINAL_GUIDE_HTML="$BASE_DIR/docs/mac-terminal-guide.html" -TERMINAL_GUIDE_URL="https://mcamner.github.io/macos-scripts/" - -if [[ -f "$UI_LIB" ]]; then - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -if [[ -t 0 ]]; then - stty erase '^?' 2>/dev/null || true -fi - -BOX_INNER=88 - -# Main menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-main-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-main-menu.sh" -fi - -# Apps menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-apps-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-apps-menu.sh" -fi - -# System menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-system-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-system-menu.sh" -fi - -# Help center menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" -fi - -# Command mode module -if [[ -f "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" -fi - -# AI prompts -if [[ -f "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" -fi - -# Dev menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-dev-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-dev-menu.sh" -fi - -# AI menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-ai-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-ai-menu.sh" -fi - -# Net menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-net-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-net-menu.sh" -fi - -# Help/index module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-menu.sh" -fi - -# Prints header. -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$BASE_DIR/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$BASE_DIR/bin/mqlaunch" || "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# Handles theme cmd. -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -# Handles theme current variant. -theme_current_variant() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Eq '^export MQ_ZSH_VARIANT=' "$zshrc" 2>/dev/null; then - grep -E '^export MQ_ZSH_VARIANT=' "$zshrc" | tail -n 1 | sed -E 's/^export MQ_ZSH_VARIANT="?([^"]+)"?/\1/' - else - echo "not-set" - fi -} - -# Handles theme source state. -theme_source_state() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Fq 'source "$HOME/macos-scripts/terminal/themes/mq-zsh-theme-v3.zsh"' "$zshrc" 2>/dev/null; then - echo "PRESENT" - else - echo "MISSING" - fi -} - -# Prints themes menu. -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Apply macos" - row2 " 7. Reset theme" " b. Back" - - print_footer -} - -# Handles themes menu loop. -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read_menu_choice "Select theme option [1-7,b] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd apply macos ;; - 7) theme_cmd reset ;; - b|B|0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Opens git menu. -open_git_menu() { - local repo_arg="${1:-}" - local git_script="$BASE_DIR/terminal/launchers/gitlaunch.sh" - local git_path="" - - if [[ -n "$repo_arg" ]]; then - git_path="$repo_arg" - else - git_path="$(pwd)" - fi - - if [[ -x "$git_script" ]]; then - MQ_GIT_REPO="$git_path" "$git_script" - elif [[ -f "$git_script" ]]; then - MQ_GIT_REPO="$git_path" zsh "$git_script" - else - print_header - row "GIT MENU" - empty_row - row "Git menu not found:" - row " $git_script" - print_footer - pause_enter - fi -} - -# Opens release menu. -open_release_menu() { - local release_menu="$BASE_DIR/terminal/menus/mq-release-menu.sh" - if [[ -x "$release_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$release_menu" menu - elif [[ -f "$release_menu" ]]; then - chmod +x "$release_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$release_menu" menu - else - print_header - row "RELEASE MENU" - empty_row - row "Release menu not found:" - row " $release_menu" - print_footer - pause_enter - fi -} - -# Runs mqworkflows. -run_mqworkflows() { - local workflows_menu="$BASE_DIR/terminal/menus/mq-workflows-menu.sh" - - if [[ -x "$workflows_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$workflows_menu" "${@:-menu}" - elif [[ -f "$workflows_menu" ]]; then - chmod +x "$workflows_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$workflows_menu" "${@:-menu}" - else - print_header - row_bold "WORKFLOWS" - empty_row - row "Workflows menu not found:" - row " $workflows_menu" - print_footer - pause_enter - return 1 - fi -} - -# Opens tools menu. -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# Gets repo version. -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -# Shows version info. -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - - print_footer - pause_enter -} - -# Runs self check. -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -# Runs debug bundle. -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -# Shows release notes. -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -# Runs mqlogin. -run_mqlogin() { - local login_script="$BASE_DIR/automation/login/mqlogin.sh" - local login_menu="$BASE_DIR/terminal/menus/mq-login-menu.sh" - - if [[ $# -eq 0 && -x "$login_menu" ]]; then - "$login_menu" menu - return $? - fi - - if [[ ! -x "$login_script" ]]; then - print_header - row_bold "LOGIN BOOT" - empty_row - row "Missing or non-executable:" - row " $login_script" - row "Run:" - row " chmod +x $login_script" - print_footer - pause_enter - return 1 - fi - - "$login_script" "$@" -} - -# Runs mqshortcuts. -run_mqshortcuts() { - local shortcuts_script="$BASE_DIR/automation/shortcuts/mqshortcuts.sh" - local shortcuts_menu="$BASE_DIR/terminal/menus/mq-shortcuts-menu.sh" - - if [[ $# -eq 0 && -x "$shortcuts_menu" ]]; then - "$shortcuts_menu" menu - return $? - fi - - if [[ ! -x "$shortcuts_script" ]]; then - print_header - row_bold "SHORTCUTS" - empty_row - row "Missing or non-executable:" - row " $shortcuts_script" - row "Run:" - row " chmod +x $shortcuts_script" - print_footer - pause_enter - return 1 - fi - - "$shortcuts_script" "$@" -} - -# Shows about dashboard. -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - row "Latest bundle: $latest_bundle" - row "Core menus: main / help / dev / ai / net" - - print_footer - pause_enter -} - -# Runs command palette. -run_command_palette() { - local fzf_bin selected selected_cmd - fzf_bin="$(command -v fzf 2>/dev/null || true)" - - if [[ -z "$fzf_bin" ]]; then - print_header - row_bold "COMMAND PALETTE" - empty_row - row "fzf is not installed." - row "Falling back to command index." - print_footer - pause_enter - show_command_index - return 0 - fi - - selected="$( - cat <<'EOF' | "$fzf_bin" --height=70% --layout=reverse --border --prompt='mqlaunch > ' --with-nth=2.. --delimiter=$'\t' --preview-window=hidden -main Open main menu -demo Run guided demo mode -git Open Git workspace -perf Open Performance module -dev Open Dev menu -tools Open Tools menu -workflows Open Project workflows menu -workflows boot Run project boot -release Open Release menu -login Open Login / Session menu -login menu Start full session boot -login about Start session about mode -login check Start session self-check mode -shortcuts Open Shortcuts menu -shortcuts list List shortcuts directly -shortcuts search clip Search shortcuts by name -version Show version information -about Show about / status dashboard -notes Show release notes -check Run self-check -bundle Create debug bundle -repo Open repo root in browser -guide Open terminal guide -commands Show command index -EOF - )" - - [[ -n "$selected" ]] || return 0 - - selected_cmd="${selected%%$'\t'*}" - - case "$selected_cmd" in - main) - main_loop - ;; - *) - # shellcheck disable=SC2086 - run_arg_command ${=selected_cmd} - ;; - esac -} - -# Runs demo mode. -run_demo_mode() { - local delay version prompt_dir prompt_count repo_state load_line disk_line ip_addr battery_line active_cmd - local theme_variant theme_state - delay="${MQLAUNCH_DEMO_DELAY:-1}" - version="$(get_repo_version)" - prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - prompt_count=0 - load_line="$(uptime 2>/dev/null || echo "uptime unavailable")" - disk_line="$(df -h / 2>/dev/null | tail -1 || echo "disk usage unavailable")" - ip_addr="$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "Unavailable")" - battery_line="$(pmset -g batt 2>/dev/null | tail -1 || echo "Battery info unavailable")" - active_cmd="$(command -v mqlaunch 2>/dev/null || echo "$BIN_LINK")" - theme_variant="$(theme_current_variant)" - theme_state="$(theme_source_state)" - - if [[ -n "$prompt_dir" ]]; then - prompt_count="$(find "$prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if git -C "$BASE_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - else - repo_state="not-a-git-repo" - fi - - print_header - row_bold "DEMO MODE" - empty_row - row "A guided tour of the mqlaunch surface." - row "Press Enter to advance each step." - print_footer - pause_enter - - print_header - row_bold "STEP 1 / 5 — SYSTEM CHECK" - empty_row - row "[OK] Base dir: $BASE_DIR" - row "[OK] Active command: $active_cmd" - row "[OK] Repo state: $repo_state" - row "[OK] Prompt files: $prompt_count" - empty_row - row "Run anytime:" - row " mqlaunch doctor" - row " mqlaunch system check" - print_footer - pause_enter - - print_header - row_bold "STEP 2 / 5 — PERFORMANCE SNAPSHOT" - empty_row - row "Load: $load_line" - row "Disk /: $disk_line" - row "Network: $ip_addr" - row "Battery: $battery_line" - empty_row - row "Run anytime:" - row " mqlaunch perf" - row " mq scan" - print_footer - pause_enter - - print_header - row_bold "STEP 3 / 5 — THEME STATUS" - empty_row - row "Current theme: $theme_variant" - row "Theme source: $theme_state" - empty_row - row "Commands:" - row " mqlaunch theme open theme menu" - row " mqlaunch theme-macos apply macOS theme" - row " mqlaunch theme-reset reset to default" - print_footer - pause_enter - - print_header - row_bold "STEP 4 / 5 — VERSION" - empty_row - row "Project: macos-scripts" - row "Version: $version" - row "Launcher: $MQ_SCRIPT" - empty_row - row "Commands:" - row " mqlaunch version" - row " mqlaunch notes" - row " mqlaunch release" - print_footer - pause_enter - - print_header - row_bold "STEP 5 / 5 — WHAT TO TRY NEXT" - empty_row - row "WORKFLOWS" - row " mqlaunch system check" - row " mqlaunch dev" - row " mqlaunch workflows" - row " mqlaunch release" - empty_row - row "AI ASSISTANT" - row " mqlaunch ask \"what does doctor.sh check?\"" - row " mqlaunch atlas" - empty_row - row "RELEASE" - row " mqlaunch release-check" - row " mqlaunch release-notes" - print_footer - pause_enter - - row "Demo complete. Run mqlaunch to open the full menu." -} - -# Handles legacy alias notice. -legacy_alias_notice() { - local old_cmd="$1" - local new_cmd="$2" - print_header - row_bold "LEGACY ALIAS" - empty_row - row "Redirecting:" - row " $old_cmd" - row " -> $new_cmd" - print_footer -} - -# Handles tweaks menu loop. -tweaks_menu_loop() { - local tweaks_script="$BASE_DIR/system/tweaks/macos-tweaks.sh" - - if [[ -x "$tweaks_script" || -f "$tweaks_script" ]]; then - bash "$tweaks_script" menu || true - else - echo "${C_ERR}Tweaks script not found:${C_RESET} $tweaks_script" - pause_enter - return 1 - fi -} - -# Runs arg command. -run_arg_command() { - local cmd="${1:l}" - shift || true - - case "$cmd" in - finder) open_app "Finder" ;; - safari) open_app "Safari" ;; - chrome) open_app "Google Chrome" ;; - spotify) open_app "Spotify" ;; - xcode) open_app "Xcode" ;; - settings) open_app "System Settings" ;; - monitor) open_app "Activity Monitor" ;; - downloads) open_downloads_folder ;; - home) open_home_folder ;; - utilities) open_utilities_folder ;; - applications|apps) open_applications_folder ;; - ip|network) show_network_info ;; - lock) lock_screen ;; - sleep) sleep_display ;; - restart-finder|finder-restart) restart_finder ;; - date|time) show_date_time ;; - repo) open_repo_browser ;; - ai) open_ai_menu ;; - dev) open_dev_menu ;; - tweaks|tweak|tw) open_tweaks_menu ;; - tweaks-status) show_tweaks_status ;; - tweaks-workstation) run_tweaks_workstation ;; - tweaks-dev) run_tweaks_dev ;; - tweaks-clean) run_tweaks_clean ;; - tweaks-fast) run_tweaks_fast ;; - tweaks-all) run_tweaks_all ;; - tweaks-revert|revert-tweaks) revert_tweaks_latest ;; - dashboard|dash) open_dashboard ;; - theme|themes) themes_menu_loop ;; - theme-current) theme_cmd current ;; - theme-reset) theme_cmd reset ;; - theme-amber) theme_cmd apply amber ;; - theme-green) theme_cmd apply green ;; - theme-minimal) theme_cmd apply minimal ;; - theme-ice) theme_cmd apply ice ;; - theme-macos) theme_cmd apply macos ;; - release|rel) open_release_menu ;; - workflows|workflow|wf) run_mqworkflows "$@" ;; - git|git-menu|gitmenu|menu-git) open_git_menu "${1:-}" ;; - gitlaunch) - legacy_alias_notice "mqlaunch gitlaunch" "mqlaunch git" - open_git_menu "${1:-}" - ;; - login|boot|session) run_mqlogin "$@" ;; - shortcuts|shortcut|sc) run_mqshortcuts "$@" ;; - perf|performance) open_performance_menu ;; - demo) run_demo_mode ;; - version|ver|about) show_version_info ;; - ask) "$BASE_DIR/tools/scripts/ask.sh" "$@" ;; - fix) "$BASE_DIR/tools/scripts/fix.sh" "$@" ;; - nickname-set|nick-set|nick) - if [[ -n "${1:-}" ]]; then - printf '%s\n' "$*" > "$HOME/.mqlaunch_nickname" - echo "Smeknamn sparat: $*" - else - echo "Nuvarande smeknamn: $(get_nickname)" - echo "Ändra: mqlaunch nickname-set " - fi - ;; - doctor) "$BASE_DIR/tools/scripts/doctor.sh" ;; - check|health) run_self_check ;; - bundle|debug-bundle|support) run_debug_bundle ;; - notes|changelog|release-notes) show_release_notes ;; - about|status|dashboard) show_about_dashboard ;; - commands|index) show_command_index ;; - palette|fzf|search) run_command_palette ;; - dev-v1|git-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch dev" - open_dev_menu - ;; - tools) open_tools_menu ;; - docfunc|document-functions) "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docfunc ;; - docwrite|document-functions-write|update-comments) - "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docwrite - ;; - tools-menu|toolsmenu|menu-tools|tools-v1|menu-tools-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch tools" - open_tools_menu - ;; - prompts|prompt-folder) open_ai_prompts_folder ;; - prompt-files|files) show_prompt_files ;; - edit|edit-mqlaunch) edit_mqlaunch ;; - backup-prompts|backup) backup_prompts ;; - backup-mqlaunch|backup-launcher) backup_mqlaunch ;; - base|macos-scripts) open_base_dir ;; - launchers|launcher-folder) open_launcher_folder ;; - guide|terminal-guide) open_terminal_guide ;; - netlaunch|net) open_net_menu ;; - atlas) mq_ai_run_atlas "$@" ;; - auto|one|decide|research|root|solve|pdebug|menu) safe_run_ai "$cmd" ;; - mc) "$BASE_DIR/tools/scripts/mission-control.sh" ;; - ghost) "$BASE_DIR/tools/scripts/network-ghost.sh" ;; - pulse) "$BASE_DIR/tools/scripts/pulse.sh" ;; - scan) "$BASE_DIR/tools/scripts/vault-scan.sh" ;; - reap) "$BASE_DIR/tools/scripts/overseer.sh" ;; - guard) "$BASE_DIR/tools/scripts/blackout.sh" ;; - help|-h|--help) show_help ;; - *) - echo "${C_ERR}Unknown command:${C_RESET} $cmd" - echo - echo "Try:" - echo " mqlaunch ask \"Vad betyder kommandot: $cmd $*\"" - echo - - if declare -f mq_ai_prompt_ask >/dev/null; then - echo "Copying an /ask prompt for this unknown command..." - mq_ai_prompt_ask "Vad betyder kommandot '$cmd $*' i mqlaunch, och finns det ett liknande kommando?" - return 0 - fi - - show_help - exit 1 - ;; - esac -} - -# --- Entry -------------------------------------------------- -if [[ $# -gt 0 ]]; then - # Atlas REPL — intercept before dispatch to avoid ai-mode.sh routing - case "${1:l}" in - atlas) - shift - mq_ai_run_atlas "$@" - exit 0 - ;; - esac - - if dispatch_cli_command "$@"; then - exit 0 - else - cmd_status=$? - if [[ $cmd_status -eq 2 ]]; then - exit 2 - fi - fi - - if [[ "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" == "menu" ]]; then - main_loop - else - run_arg_command "$@" - fi -else - main_loop -fi diff --git a/backups/scripts/20260509-030842/automation/login/mqlogin.sh b/backups/scripts/20260509-030842/automation/login/mqlogin.sh deleted file mode 100755 index 466206d..0000000 --- a/backups/scripts/20260509-030842/automation/login/mqlogin.sh +++ /dev/null @@ -1,269 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" -DEFAULT_PROJECT_ROOT="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - -if [[ ! -d "$PROJECT_ROOT/.git" && -d "$DEFAULT_PROJECT_ROOT" ]]; then - PROJECT_ROOT="$DEFAULT_PROJECT_ROOT" -fi - -PROJECT_NAME="$(basename "$PROJECT_ROOT")" -HOST_NAME="$(scutil --get ComputerName 2>/dev/null || hostname)" -DATE_STAMP="$(date '+%Y-%m-%d %H:%M:%S')" -DATE_SAFE="$(date '+%Y-%m-%d_%H-%M-%S')" -LOG_DIR="$HOME/.macos-scripts/logs/login" -LOG_FILE="$LOG_DIR/mqlogin_${DATE_SAFE}.log" - -MODE="menu" -OPEN_FINDER=1 -OPEN_CODE=1 -OPEN_TERMINAL=1 -INLINE=0 - -mkdir -p "$LOG_DIR" - -usage() { - cat <<'EOF' -mqlogin — stylish login/session boot for macos-scripts + mqlaunch - -Usage: - bash automation/login/mqlogin.sh [options] - -Options: - --menu Open full `mqlaunch` menu in Terminal (default) - --about Show `mqlaunch about`, then return - --check Open `mqlaunch check` in Terminal - --inline Run in the current terminal instead of opening Terminal.app - --no-finder Do not open the project folder - --no-code Do not open Visual Studio Code - --no-terminal Do not open Terminal.app - -h, --help Show this help -EOF -} - -info() { - printf '==> %s\n' "$*" -} - -note() { - printf ' • %s\n' "$*" -} - -log_line() { - printf '%s\n' "$*" | tee -a "$LOG_FILE" -} - -command_for_terminal() { - local mq_base_cmd="$1" - local mq_cmd="$2" - - if [[ "$MODE" == "menu" ]]; then - printf 'cd %q && clear && printf "\\n🚀 mqlogin booting %s\\n\\n" && %s' \ - "$PROJECT_ROOT" "$PROJECT_NAME" "$mq_cmd" - else - printf 'cd %q && clear && printf "\\n🚀 mqlogin booting %s\\n\\n" && %s; printf "\\n"; printf "Handing off to the full mqlaunch menu...\\n\\n"; %s' \ - "$PROJECT_ROOT" "$PROJECT_NAME" "$mq_cmd" "$mq_base_cmd" - fi -} - -detect_mqlaunch_base() { - if command -v mqlaunch >/dev/null 2>&1; then - command -v mqlaunch - return 0 - fi - - if [[ -x "$PROJECT_ROOT/terminal/mqlaunch-v1/mqlaunch.sh" ]]; then - printf '%q' "$PROJECT_ROOT/terminal/mqlaunch-v1/mqlaunch.sh" - return 0 - fi - - if [[ -x "$PROJECT_ROOT/terminal/launchers/mqlaunch.sh" ]]; then - printf 'zsh %q' "$PROJECT_ROOT/terminal/launchers/mqlaunch.sh" - return 0 - fi - - return 1 -} - -fallback_terminal_command() { - printf 'cd %q && clear && printf "\\n🚀 mqlogin booting %s\\n\\n" && pwd && printf "\\n"; git status || true; printf "\\nTip: install or expose mqlaunch to unlock the full launcher.\\n"' \ - "$PROJECT_ROOT" "$PROJECT_NAME" -} - -print_banner() { - cat <&2 - usage - exit 1 - ;; - esac - done -} - -main() { - local mq_base_cmd="" - local mq_cmd="" - local terminal_payload="" - - parse_args "$@" - - log_line "========================================" - log_line "MQLOGIN BOOT" - log_line "Project : $PROJECT_NAME" - log_line "Root : $PROJECT_ROOT" - log_line "Host : $HOST_NAME" - log_line "Mode : $MODE" - log_line "Started : $DATE_STAMP" - log_line "========================================" - - if [[ ! -d "$PROJECT_ROOT" ]]; then - log_line "Project directory not found: $PROJECT_ROOT" - exit 1 - fi - - case "$MODE" in - about) mq_base_cmd="$(detect_mqlaunch_base || true)"; [[ -n "$mq_base_cmd" ]] && mq_cmd="$mq_base_cmd about" ;; - check) mq_base_cmd="$(detect_mqlaunch_base || true)"; [[ -n "$mq_base_cmd" ]] && mq_cmd="$mq_base_cmd check" ;; - menu) mq_base_cmd="$(detect_mqlaunch_base || true)"; [[ -n "$mq_base_cmd" ]] && mq_cmd="$mq_base_cmd" ;; - esac - - if [[ -n "$mq_cmd" ]]; then - log_line "mqlaunch status: available" - log_line "mqlaunch command: $mq_cmd" - terminal_payload="$(command_for_terminal "$mq_base_cmd" "$mq_cmd")" - else - log_line "mqlaunch status: missing, using fallback" - terminal_payload="$(fallback_terminal_command)" - fi - - if [[ "$INLINE" -eq 1 ]]; then - run_inline "$mq_base_cmd" "$mq_cmd" - log_line "Mode: inline" - log_line "Done" - exit 0 - fi - - print_banner - info "Starting your session flow..." - echo - - if [[ "$OPEN_FINDER" -eq 1 ]]; then - note "Opening project folder" - open "$PROJECT_ROOT" - fi - - if [[ "$OPEN_CODE" -eq 1 ]]; then - if [[ -d "/Applications/Visual Studio Code.app" ]]; then - note "Opening Visual Studio Code" - open -a "Visual Studio Code" "$PROJECT_ROOT" - else - note "Visual Studio Code not found, skipping" - fi - fi - - if [[ "$OPEN_TERMINAL" -eq 1 ]]; then - note "Opening Terminal boot view" - open_terminal_boot "$terminal_payload" - fi - - echo - info "Session ready." - note "Log saved to $LOG_FILE" -} - -main "$@" diff --git a/backups/scripts/20260509-030842/automation/shortcuts/mqshortcuts.sh b/backups/scripts/20260509-030842/automation/shortcuts/mqshortcuts.sh deleted file mode 100755 index c8a438f..0000000 --- a/backups/scripts/20260509-030842/automation/shortcuts/mqshortcuts.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -SCRIPT_NAME="mqshortcuts" - -usage() { - cat <<'EOF' -mqshortcuts — fast macOS Shortcuts helper for terminal workflows - -Usage: - bash automation/shortcuts/mqshortcuts.sh [options] - -Commands: - list [folder] List shortcuts, optionally in a folder - folders List shortcut folders - search [folder] Search shortcuts by name - run [input-path] Run a shortcut, optionally with input - view Open a shortcut in the Shortcuts app - help Show this help - -Examples: - bash automation/shortcuts/mqshortcuts.sh list - bash automation/shortcuts/mqshortcuts.sh folders - bash automation/shortcuts/mqshortcuts.sh search clip - bash automation/shortcuts/mqshortcuts.sh search clip Work - bash automation/shortcuts/mqshortcuts.sh run "Daily Briefing" - bash automation/shortcuts/mqshortcuts.sh run "Resize Image" ~/Desktop/pic.png - bash automation/shortcuts/mqshortcuts.sh view "Daily Briefing" -EOF -} - -die() { - echo "ERROR: $*" >&2 - exit 1 -} - -require_shortcuts() { - command -v shortcuts >/dev/null 2>&1 || die "The macOS 'shortcuts' CLI is not available" -} - -run_shortcuts_cli() { - local output="" - - if output="$("$@" 2>&1)"; then - printf '%s\n' "$output" - return 0 - fi - - if [[ "$output" == *"Couldn’t communicate with a helper application."* ]] || [[ "$output" == *"Couldn't communicate with a helper application."* ]]; then - die "The Shortcuts helper app is not reachable right now. Try opening the Shortcuts app once and run the command again." - fi - - die "$output" -} - -print_header() { - echo - echo "== $1 ==" -} - -list_shortcuts() { - local folder="${1:-}" - - print_header "SHORTCUTS" - - if [[ -n "$folder" ]]; then - run_shortcuts_cli shortcuts list --folder-name "$folder" - else - run_shortcuts_cli shortcuts list - fi -} - -list_folders() { - print_header "SHORTCUT FOLDERS" - run_shortcuts_cli shortcuts list --folders -} - -search_shortcuts() { - local query="${1:-}" - local folder="${2:-}" - local output="" - - [[ -n "$query" ]] || die "Missing search query" - - print_header "SEARCH: $query" - - if [[ -n "$folder" ]]; then - output="$(run_shortcuts_cli shortcuts list --folder-name "$folder")" - else - output="$(run_shortcuts_cli shortcuts list)" - fi - - if [[ -z "$output" ]]; then - echo "No shortcuts found." - return 0 - fi - - if command -v rg >/dev/null 2>&1; then - if ! printf '%s\n' "$output" | rg -i -- "$query"; then - echo "No matches." - fi - else - if ! printf '%s\n' "$output" | grep -i -- "$query"; then - echo "No matches." - fi - fi -} - -run_shortcut() { - local name="${1:-}" - local input_path="${2:-}" - - [[ -n "$name" ]] || die "Missing shortcut name" - - print_header "RUN: $name" - - if [[ -n "$input_path" ]]; then - run_shortcuts_cli shortcuts run "$name" --input-path "$input_path" - else - run_shortcuts_cli shortcuts run "$name" - fi -} - -view_shortcut() { - local name="${1:-}" - - [[ -n "$name" ]] || die "Missing shortcut name" - - print_header "VIEW: $name" - run_shortcuts_cli shortcuts view "$name" -} - -main() { - local cmd="${1:-help}" - - require_shortcuts - - case "$cmd" in - list) - shift - list_shortcuts "${1:-}" - ;; - folders) - list_folders - ;; - search) - shift - search_shortcuts "${1:-}" "${2:-}" - ;; - run) - shift - run_shortcut "${1:-}" "${2:-}" - ;; - view) - shift - view_shortcut "${1:-}" - ;; - help|-h|--help) - usage - ;; - *) - die "Unknown command: $cmd" - ;; - esac -} - -main "$@" diff --git a/backups/scripts/20260509-030842/automation/workflows/project-check.sh b/backups/scripts/20260509-030842/automation/workflows/project-check.sh deleted file mode 100755 index 0bf985b..0000000 --- a/backups/scripts/20260509-030842/automation/workflows/project-check.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -PROJECT_NAME="${1:-macos-scripts}" -PROJECT_DIR="${2:-${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}}" -LOG_DIR="$HOME/.macos-scripts/logs" -TIMESTAMP="$(date '+%Y-%m-%d_%H-%M-%S')" -LOG_FILE="$LOG_DIR/${PROJECT_NAME}_check_${TIMESTAMP}.log" - -mkdir -p "$LOG_DIR" - -say() { - printf '%s\n' "${1-}" | tee -a "$LOG_FILE" -} - -ok() { - say "[OK] $1" -} - -warn() { - say "[WARN] $1" -} - -fail() { - say "[FAIL] $1" -} - -say "====================================" -say "PROJECT CHECK" -say "Project : $PROJECT_NAME" -say "Directory : $PROJECT_DIR" -say "Started : $(date)" -say "====================================" - -if [[ ! -d "$PROJECT_DIR" ]]; then - fail "Project directory not found: $PROJECT_DIR" - say - say "Log saved to: $LOG_FILE" - exit 1 -fi - -cd "$PROJECT_DIR" - -issues=0 - -if [[ -d ".git" ]]; then - ok "Git repository found" -else - fail "Not a git repository" - issues=$((issues + 1)) -fi - -if [[ -f "README.md" ]]; then - ok "README.md present" -else - warn "README.md missing" -fi - -if [[ -f "VERSION" ]]; then - ok "VERSION file present" -else - warn "VERSION file missing" -fi - -if [[ -f "CHANGELOG.md" ]]; then - ok "CHANGELOG.md present" -else - warn "CHANGELOG.md missing" -fi - -if [[ -f "install.sh" ]]; then - ok "install.sh present" -else - warn "install.sh missing" -fi - -if [[ -x "bin/mqlaunch" ]]; then - ok "bin/mqlaunch executable" -elif [[ -f "bin/mqlaunch" ]]; then - warn "bin/mqlaunch present but not executable" -else - warn "bin/mqlaunch missing" -fi - -if [[ -x "tools/scripts/test-all.sh" ]]; then - ok "Smoke test script available" -else - warn "Smoke test script missing or not executable" -fi - -if [[ -d ".git" ]]; then - branch="$(git branch --show-current 2>/dev/null || true)" - upstream="$(git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null || true)" - - if [[ -n "$branch" ]]; then - ok "Current branch: $branch" - else - warn "Could not resolve current branch" - fi - - if git diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - ok "Working tree clean" - else - warn "Working tree has local changes" - fi - - if [[ -n "$upstream" ]]; then - ok "Upstream configured: $upstream" - else - warn "No upstream configured for current branch" - fi - - remotes="$(git remote 2>/dev/null | tr '\n' ' ' | sed 's/[[:space:]]*$//')" - if [[ -n "$remotes" ]]; then - ok "Git remotes: $remotes" - else - warn "No git remotes configured" - fi -fi - -say -if [[ "$issues" -eq 0 ]]; then - say "Project check completed." -else - say "Project check completed with $issues blocking issue(s)." -fi -say "Log saved to: $LOG_FILE" diff --git a/backups/scripts/20260509-030842/automation/workflows/workspace.sh b/backups/scripts/20260509-030842/automation/workflows/workspace.sh deleted file mode 100755 index 6225a98..0000000 --- a/backups/scripts/20260509-030842/automation/workflows/workspace.sh +++ /dev/null @@ -1,267 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -SNAPSHOT_ROOT="$BASE_DIR/backups/workspaces" - -usage() { - cat <<'USAGE' -workspace.sh - save and restore lightweight workspace snapshots - -Usage: - automation/workflows/workspace.sh [command] [snapshot-id] - -Commands: - menu Open interactive menu - save Save current workspace snapshot - list List recent snapshots - latest Show latest snapshot - show Show snapshot details (default: latest) - restore Restore/open snapshot workspace (default: latest) - help Show this help -USAGE -} - -ensure_snapshot_root() { - mkdir -p "$SNAPSHOT_ROOT" -} - -current_repo_root() { - git -C "$PWD" rev-parse --show-toplevel 2>/dev/null || true -} - -git_value() { - local repo="$1" - shift - - [[ -n "$repo" ]] || return 0 - git -C "$repo" "$@" 2>/dev/null || true -} - -quote_value() { - printf "%q" "$1" -} - -latest_id() { - [[ -f "$SNAPSHOT_ROOT/latest" ]] || return 1 - sed -n '1p' "$SNAPSHOT_ROOT/latest" -} - -resolve_snapshot_id() { - local id="${1:-latest}" - - if [[ "$id" == "latest" || -z "$id" ]]; then - latest_id - else - printf '%s\n' "$id" - fi -} - -snapshot_dir() { - local id="$1" - printf '%s/%s\n' "$SNAPSHOT_ROOT" "$id" -} - -save_snapshot() { - ensure_snapshot_root - - local id dir work_dir repo branch upstream status_count ahead behind - id="$(date +%Y%m%d-%H%M%S)" - dir="$(snapshot_dir "$id")" - work_dir="$PWD" - repo="$(current_repo_root)" - branch="$(git_value "$repo" branch --show-current)" - upstream="$(git_value "$repo" rev-parse --abbrev-ref --symbolic-full-name '@{u}')" - status_count="0" - ahead="0" - behind="0" - - mkdir -p "$dir" - - if [[ -n "$repo" ]]; then - status_count="$(git -C "$repo" status --porcelain 2>/dev/null | wc -l | tr -d ' ')" - git -C "$repo" status --short --branch > "$dir/git-status.txt" 2>/dev/null || true - git -C "$repo" diff --name-only > "$dir/changed-files.txt" 2>/dev/null || true - git -C "$repo" diff --cached --name-only >> "$dir/changed-files.txt" 2>/dev/null || true - sort -u "$dir/changed-files.txt" -o "$dir/changed-files.txt" - if [[ -n "$upstream" ]]; then - behind="$(git -C "$repo" rev-list --count "HEAD..$upstream" 2>/dev/null || printf '0')" - ahead="$(git -C "$repo" rev-list --count "$upstream..HEAD" 2>/dev/null || printf '0')" - fi - else - : > "$dir/git-status.txt" - : > "$dir/changed-files.txt" - fi - - find "$work_dir" -maxdepth 2 -type f \ - ! -path '*/.git/*' \ - ! -path '*/node_modules/*' \ - ! -path '*/backups/*' \ - -print 2>/dev/null | sort | tail -40 > "$dir/recent-files.txt" - - { - printf 'SNAPSHOT_ID=%s\n' "$(quote_value "$id")" - printf 'CREATED_AT=%s\n' "$(quote_value "$(date '+%Y-%m-%d %H:%M:%S')")" - printf 'WORK_DIR=%s\n' "$(quote_value "$work_dir")" - printf 'REPO_ROOT=%s\n' "$(quote_value "$repo")" - printf 'BRANCH=%s\n' "$(quote_value "$branch")" - printf 'UPSTREAM=%s\n' "$(quote_value "$upstream")" - printf 'AHEAD=%s\n' "$(quote_value "$ahead")" - printf 'BEHIND=%s\n' "$(quote_value "$behind")" - printf 'STATUS_COUNT=%s\n' "$(quote_value "$status_count")" - } > "$dir/metadata.env" - - printf '%s\n' "$id" > "$SNAPSHOT_ROOT/latest" - - printf 'Saved workspace snapshot: %s\n' "$id" - printf 'Path: %s\n' "$dir" -} - -list_snapshots() { - ensure_snapshot_root - - find "$SNAPSHOT_ROOT" -mindepth 1 -maxdepth 1 -type d -print \ - | sort -r \ - | while IFS= read -r dir; do - local id work_dir branch status_count - id="$(basename "$dir")" - work_dir="" - branch="" - status_count="" - # shellcheck disable=SC1090,SC1091 - [[ -f "$dir/metadata.env" ]] && source "$dir/metadata.env" - printf '%s %s branch=%s changes=%s\n' "$id" "${WORK_DIR:-$work_dir}" "${BRANCH:-$branch}" "${STATUS_COUNT:-$status_count}" - done -} - -show_snapshot() { - ensure_snapshot_root - - local id dir - id="$(resolve_snapshot_id "${1:-latest}")" || { - printf 'No workspace snapshots found.\n' >&2 - return 1 - } - dir="$(snapshot_dir "$id")" - - [[ -d "$dir" ]] || { - printf 'Snapshot not found: %s\n' "$id" >&2 - return 1 - } - - # shellcheck disable=SC1090,SC1091 - source "$dir/metadata.env" - - printf 'Snapshot: %s\n' "$SNAPSHOT_ID" - printf 'Created: %s\n' "$CREATED_AT" - printf 'Work dir: %s\n' "$WORK_DIR" - printf 'Repo: %s\n' "${REPO_ROOT:-none}" - printf 'Branch: %s\n' "${BRANCH:-none}" - printf 'Upstream: %s\n' "${UPSTREAM:-none}" - printf 'Ahead: %s\n' "${AHEAD:-0}" - printf 'Behind: %s\n' "${BEHIND:-0}" - printf 'Changes: %s\n' "${STATUS_COUNT:-0}" - printf '\nChanged files:\n' - sed -n '1,20p' "$dir/changed-files.txt" -} - -restore_snapshot() { - ensure_snapshot_root - - local id dir confirm - id="$(resolve_snapshot_id "${1:-latest}")" || { - printf 'No workspace snapshots found.\n' >&2 - return 1 - } - dir="$(snapshot_dir "$id")" - - [[ -d "$dir" ]] || { - printf 'Snapshot not found: %s\n' "$id" >&2 - return 1 - } - - # shellcheck disable=SC1090,SC1091 - source "$dir/metadata.env" - - show_snapshot "$id" - printf '\nRestore/open this workspace? [y/N] ' - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || { - printf 'Cancelled.\n' - return 0 - } - - if [[ -d "$WORK_DIR" ]]; then - if command -v code >/dev/null 2>&1; then - code "$WORK_DIR" >/dev/null 2>&1 || true - fi - open -a Terminal "$WORK_DIR" >/dev/null 2>&1 || true - printf 'Opened workspace: %s\n' "$WORK_DIR" - else - printf 'Workspace path missing: %s\n' "$WORK_DIR" >&2 - return 1 - fi - - if [[ -n "${REPO_ROOT:-}" && -d "$REPO_ROOT/.git" && -n "${BRANCH:-}" ]]; then - printf 'Branch at snapshot: %s\n' "$BRANCH" - printf 'To switch manually:\n' - printf ' git -C %q checkout %q\n' "$REPO_ROOT" "$BRANCH" - fi -} - -menu_loop() { - local choice id - - while true; do - clear 2>/dev/null || true - printf 'WORKSPACE SNAPSHOTS\n' - printf '===================\n\n' - printf '1. Save current workspace\n' - printf '2. List snapshots\n' - printf '3. Show latest snapshot\n' - printf '4. Restore latest snapshot\n' - printf '5. Restore by snapshot id\n' - printf 'b. Back\n\n' - printf 'workspace > ' - read -r choice - - case "$choice" in - 1) save_snapshot ;; - 2) list_snapshots ;; - 3) show_snapshot latest ;; - 4) restore_snapshot latest ;; - 5) - printf 'Snapshot id > ' - read -r id - restore_snapshot "$id" - ;; - b|B) break ;; - *) printf 'Invalid option.\n' ;; - esac - - printf '\nPress Enter to continue...' - read -r _ - done -} - -main() { - local cmd="${1:-menu}" - shift || true - - case "$cmd" in - menu) menu_loop ;; - save) save_snapshot ;; - list) list_snapshots ;; - latest) show_snapshot latest ;; - show) show_snapshot "${1:-latest}" ;; - restore) restore_snapshot "${1:-latest}" ;; - help|-h|--help) usage ;; - *) - printf 'Unknown command: %s\n\n' "$cmd" >&2 - usage - exit 1 - ;; - esac -} - -main "$@" diff --git a/backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-025315.sh.bak b/backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-025315.sh.bak deleted file mode 100755 index e33d9fb..0000000 --- a/backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260406-025315.sh.bak +++ /dev/null @@ -1,886 +0,0 @@ -#!/bin/zsh - -set -u - -# ============================================================ -# MQLaunch v3.4 — Old School Utility -# Adds: -# - MAIN MENU in bold -# - Author line in header -# - Git Launch + Net Launch in Dev / Prompts -# ============================================================ - -APP_TITLE="MQLaunch v3.4" -APP_SUBTITLE="Old School Utility" -APP_AUTHOR="Author Mattias Camner" - -BASE_DIR="$HOME/macos-scripts" -AI_SCRIPT="$BASE_DIR/tools/cli/ai-mode.sh" -PROMPT_DIR="$BASE_DIR/ai-prompts" -REPO_URL="https://github.com/MCamner/macos-scripts" -MQ_SCRIPT="$BASE_DIR/terminal/launchers/mqlaunch.sh" -BACKUP_DIR="$BASE_DIR/backups" -BIN_LINK="$HOME/bin/mqlaunch" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" - -TERMINAL_GUIDE_HTML="$BASE_DIR/tools/mac terminal_guide/mac-terminal-guide.html" -TERMINAL_GUIDE_URL="https://mcamner.github.io/macos-scripts/" - -if [[ -f "$UI_LIB" ]]; then - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BASE_DIR/terminal/launchers/mqlaunch-$stamp.sh.bak" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BASE_DIR/terminal/launchers/mqlaunch-$stamp.sh.bak" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BASE_DIR/terminal/launchers/mqlaunch-$stamp.sh.bak" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - - -BOX_INNER=88 - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat <&2 - exit 1 -fi - -if [[ -t 0 ]]; then - stty erase '^?' 2>/dev/null || true -fi - -BOX_INNER=88 - -# Main menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-main-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-main-menu.sh" -fi - -# Apps menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-apps-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-apps-menu.sh" -fi - -# System menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-system-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-system-menu.sh" -fi - -# Help center menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" -fi - -# Command mode module -if [[ -f "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" -fi - -# Dev menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-dev-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-dev-menu.sh" -fi - -# AI menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-ai-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-ai-menu.sh" -fi - -# Net menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-net-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-net-menu.sh" -fi - -# Help/index module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-menu.sh" -fi - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -theme_current_variant() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Eq '^export MQ_ZSH_VARIANT=' "$zshrc" 2>/dev/null; then - grep -E '^export MQ_ZSH_VARIANT=' "$zshrc" | tail -n 1 | sed -E 's/^export MQ_ZSH_VARIANT="?([^"]+)"?/\1/' - else - echo "not-set" - fi -} - -theme_source_state() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Fq 'source "$HOME/macos-scripts/terminal/themes/mq-zsh-theme-v3.zsh"' "$zshrc" 2>/dev/null; then - echo "PRESENT" - else - echo "MISSING" - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Apply macos" - row2 " 7. Reset theme" " b. Back" - - print_footer -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read_menu_choice "Select theme option [1-7,b] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd apply macos ;; - 7) theme_cmd reset ;; - b|B|0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local repo_arg="${1:-}" - local git_script="$BASE_DIR/terminal/launchers/gitlaunch.sh" - local git_repo="" - - if [[ -n "$repo_arg" ]]; then - git_repo="$(git -C "$repo_arg" rev-parse --show-toplevel 2>/dev/null || true)" - [[ -n "$git_repo" ]] || git_repo="$repo_arg" - else - git_repo="$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null || true)" - [[ -n "$git_repo" ]] || git_repo="$BASE_DIR" - fi - - if [[ -x "$git_script" ]]; then - MQ_GIT_REPO="$git_repo" "$git_script" - elif [[ -f "$git_script" ]]; then - MQ_GIT_REPO="$git_repo" zsh "$git_script" - else - print_header - row "GIT MENU" - empty_row - row "Git menu not found:" - row " $git_script" - print_footer - pause_enter - fi -} - -open_release_menu() { - local release_menu="$BASE_DIR/terminal/menus/mq-release-menu.sh" - if [[ -x "$release_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$release_menu" menu - elif [[ -f "$release_menu" ]]; then - chmod +x "$release_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$release_menu" menu - else - print_header - row "RELEASE MENU" - empty_row - row "Release menu not found:" - row " $release_menu" - print_footer - pause_enter - fi -} - -run_mqworkflows() { - local workflows_menu="$BASE_DIR/terminal/menus/mq-workflows-menu.sh" - - if [[ -x "$workflows_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$workflows_menu" "${@:-menu}" - elif [[ -f "$workflows_menu" ]]; then - chmod +x "$workflows_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$workflows_menu" "${@:-menu}" - else - print_header - row_bold "WORKFLOWS" - empty_row - row "Workflows menu not found:" - row " $workflows_menu" - print_footer - pause_enter - return 1 - fi -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -run_mqlogin() { - local login_script="$BASE_DIR/automation/login/mqlogin.sh" - local login_menu="$BASE_DIR/terminal/menus/mq-login-menu.sh" - - if [[ $# -eq 0 && -x "$login_menu" ]]; then - "$login_menu" menu - return $? - fi - - if [[ ! -x "$login_script" ]]; then - print_header - row_bold "LOGIN BOOT" - empty_row - row "Missing or non-executable:" - row " $login_script" - row "Run:" - row " chmod +x $login_script" - print_footer - pause_enter - return 1 - fi - - "$login_script" "$@" -} - -run_mqshortcuts() { - local shortcuts_script="$BASE_DIR/automation/shortcuts/mqshortcuts.sh" - local shortcuts_menu="$BASE_DIR/terminal/menus/mq-shortcuts-menu.sh" - - if [[ $# -eq 0 && -x "$shortcuts_menu" ]]; then - "$shortcuts_menu" menu - return $? - fi - - if [[ ! -x "$shortcuts_script" ]]; then - print_header - row_bold "SHORTCUTS" - empty_row - row "Missing or non-executable:" - row " $shortcuts_script" - row "Run:" - row " chmod +x $shortcuts_script" - print_footer - pause_enter - return 1 - fi - - "$shortcuts_script" "$@" -} - -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - row "Latest bundle: $latest_bundle" - row "Core menus: main / help / dev / ai / net" - - print_footer - pause_enter -} - -run_command_palette() { - local fzf_bin selected selected_cmd - fzf_bin="$(command -v fzf 2>/dev/null || true)" - - if [[ -z "$fzf_bin" ]]; then - print_header - row_bold "COMMAND PALETTE" - empty_row - row "fzf is not installed." - row "Falling back to command index." - print_footer - pause_enter - show_command_index - return 0 - fi - - selected="$( - cat <<'EOF' | "$fzf_bin" --height=70% --layout=reverse --border --prompt='mqlaunch > ' --with-nth=2.. --delimiter=$'\t' --preview-window=hidden -main Open main menu -demo Run guided demo mode -git Open Git workspace -perf Open Performance module -dev Open Dev menu -tools Open Tools menu -workflows Open Project workflows menu -workflows boot Run project boot -release Open Release menu -login Open Login / Session menu -login menu Start full session boot -login about Start session about mode -login check Start session self-check mode -shortcuts Open Shortcuts menu -shortcuts list List shortcuts directly -shortcuts search clip Search shortcuts by name -version Show version information -about Show about / status dashboard -notes Show release notes -check Run self-check -bundle Create debug bundle -repo Open repo root in browser -guide Open terminal guide -commands Show command index -EOF - )" - - [[ -n "$selected" ]] || return 0 - - selected_cmd="${selected%%$'\t'*}" - - case "$selected_cmd" in - main) - main_loop - ;; - *) - # shellcheck disable=SC2086 - run_arg_command ${=selected_cmd} - ;; - esac -} - -run_demo_mode() { - local delay version prompt_dir prompt_count repo_state load_line disk_line ip_addr battery_line active_cmd - local theme_variant theme_state - delay="${MQLAUNCH_DEMO_DELAY:-1}" - version="$(get_repo_version)" - prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - prompt_count=0 - load_line="$(uptime 2>/dev/null || echo "uptime unavailable")" - disk_line="$(df -h / 2>/dev/null | tail -1 || echo "disk usage unavailable")" - ip_addr="$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "Unavailable")" - battery_line="$(pmset -g batt 2>/dev/null | tail -1 || echo "Battery info unavailable")" - active_cmd="$(command -v mqlaunch 2>/dev/null || echo "$BIN_LINK")" - theme_variant="$(theme_current_variant)" - theme_state="$(theme_source_state)" - - if [[ -n "$prompt_dir" ]]; then - prompt_count="$(find "$prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if git -C "$BASE_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - else - repo_state="not-a-git-repo" - fi - - print_header - row_bold "DEMO MODE" - empty_row - row "A quick scripted tour of the current mqlaunch surface." - row "Delay between steps: ${delay}s" - print_footer - sleep "$delay" - - print_header - row_bold "STEP 1 / SYSTEM CHECK" - empty_row - row "[OK] Base dir: $BASE_DIR" - row "[OK] Active command: $active_cmd" - row "[OK] Repo state: $repo_state" - row "[OK] Prompt files: $prompt_count" - print_footer - sleep "$delay" - - print_header - row_bold "STEP 2 / PERFORMANCE SNAPSHOT" - empty_row - row "Load: $load_line" - row "Disk /: $disk_line" - row "Network: $ip_addr" - row "Battery: $battery_line" - print_footer - sleep "$delay" - - print_header - row_bold "STEP 3 / THEME STATUS" - empty_row - row "Current theme: $theme_variant" - row "Theme source: $theme_state" - row "Try: mqlaunch theme" - row "Apply macOS: mqlaunch theme-macos" - row "Reset theme: mqlaunch theme-reset" - print_footer - sleep "$delay" - - print_header - row_bold "STEP 4 / VERSION" - empty_row - row "Project: macos-scripts" - row "Version: $version" - row "Launcher: $MQ_SCRIPT" - row "Current mode: command-driven + menu-backed" - print_footer - sleep "$delay" - - print_header - row_bold "STEP 5 / TRY THESE COMMANDS" - empty_row - row " mqlaunch system check" - row " mqlaunch release notes" - row " mqlaunch theme-macos" - row " mqlaunch dev" - row " mqlaunch workflows" - print_footer - echo - row "Demo complete." -} - -legacy_alias_notice() { - local old_cmd="$1" - local new_cmd="$2" - print_header - row_bold "LEGACY ALIAS" - empty_row - row "Redirecting:" - row " $old_cmd" - row " -> $new_cmd" - print_footer -} - -tweaks_menu_loop() { - local tweaks_script="$BASE_DIR/system/tweaks/macos-tweaks.sh" - - if [[ -x "$tweaks_script" || -f "$tweaks_script" ]]; then - bash "$tweaks_script" menu || true - else - echo "${C_ERR}Tweaks script not found:${C_RESET} $tweaks_script" - pause_enter - return 1 - fi -} - -run_arg_command() { - local cmd="${1:l}" - shift || true - - case "$cmd" in - finder) open_app "Finder" ;; - safari) open_app "Safari" ;; - chrome) open_app "Google Chrome" ;; - spotify) open_app "Spotify" ;; - xcode) open_app "Xcode" ;; - settings) open_app "System Settings" ;; - monitor) open_app "Activity Monitor" ;; - downloads) open_downloads_folder ;; - home) open_home_folder ;; - utilities) open_utilities_folder ;; - applications|apps) open_applications_folder ;; - ip|network) show_network_info ;; - lock) lock_screen ;; - sleep) sleep_display ;; - restart-finder|finder-restart) restart_finder ;; - date|time) show_date_time ;; - repo) open_repo_browser ;; - ai) open_ai_menu ;; - dev) open_dev_menu ;; - tweaks|tweak|tw) open_tweaks_menu ;; - tweaks-status) show_tweaks_status ;; - tweaks-workstation) run_tweaks_workstation ;; - tweaks-dev) run_tweaks_dev ;; - tweaks-clean) run_tweaks_clean ;; - tweaks-fast) run_tweaks_fast ;; - tweaks-all) run_tweaks_all ;; - tweaks-revert|revert-tweaks) revert_tweaks_latest ;; - dashboard|dash) open_dashboard ;; - theme|themes) themes_menu_loop ;; - theme-current) theme_cmd current ;; - theme-reset) theme_cmd reset ;; - theme-amber) theme_cmd apply amber ;; - theme-green) theme_cmd apply green ;; - theme-minimal) theme_cmd apply minimal ;; - theme-ice) theme_cmd apply ice ;; - theme-macos) theme_cmd apply macos ;; - release|rel) open_release_menu ;; - workflows|workflow|wf) run_mqworkflows "$@" ;; - git|git-menu|gitmenu|menu-git) open_git_menu "${1:-}" ;; - gitlaunch) - legacy_alias_notice "mqlaunch gitlaunch" "mqlaunch git" - open_git_menu "${1:-}" - ;; - login|boot|session) run_mqlogin "$@" ;; - shortcuts|shortcut|sc) run_mqshortcuts "$@" ;; - perf|performance) open_performance_menu ;; - demo) run_demo_mode ;; - version|ver|about) show_version_info ;; - doctor) "$BASE_DIR/tools/scripts/doctor.sh" ;; - check|health) run_self_check ;; - bundle|debug-bundle|support) run_debug_bundle ;; - notes|changelog|release-notes) show_release_notes ;; - about|status|dashboard) show_about_dashboard ;; - commands|index) show_command_index ;; - palette|fzf|search) run_command_palette ;; - dev-v1|git-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch dev" - open_dev_menu - ;; - tools) open_tools_menu ;; - tools-menu|toolsmenu|menu-tools|tools-v1|menu-tools-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch tools" - open_tools_menu - ;; - prompts|prompt-folder) open_ai_prompts_folder ;; - prompt-files|files) show_prompt_files ;; - edit|edit-mqlaunch) edit_mqlaunch ;; - backup-prompts|backup) backup_prompts ;; - backup-mqlaunch|backup-launcher) backup_mqlaunch ;; - base|macos-scripts) open_base_dir ;; - launchers|launcher-folder) open_launcher_folder ;; - guide|terminal-guide) open_terminal_guide ;; - netlaunch|net) open_net_menu ;; - auto|one|atlas|decide|research|root|solve|pdebug|menu) safe_run_ai "$cmd" ;; - mc) "$BASE_DIR/tools/scripts/mission-control.sh" ;; - ghost) "$BASE_DIR/tools/scripts/network-ghost.sh" ;; - pulse) "$BASE_DIR/tools/scripts/pulse.sh" ;; - scan) "$BASE_DIR/tools/scripts/vault-scan.sh" ;; - reap) "$BASE_DIR/tools/scripts/overseer.sh" ;; - guard) "$BASE_DIR/tools/scripts/blackout.sh" ;; - help|-h|--help) show_help ;; - *) - echo "${C_ERR}Unknown command:${C_RESET} $cmd" - echo - show_help - exit 1 - ;; - esac -} - -# --- Entry -------------------------------------------------- -if [[ $# -gt 0 ]]; then - if dispatch_cli_command "$@"; then - exit 0 - else - cmd_status=$? - if [[ $cmd_status -eq 2 ]]; then - exit 2 - fi - fi - - if [[ "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" == "menu" ]]; then - main_loop - else - run_arg_command "$@" - fi -else - main_loop -fi diff --git a/backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260508-020947.sh.bak b/backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260508-020947.sh.bak deleted file mode 100755 index 9250b87..0000000 --- a/backups/scripts/20260509-030842/backups/launchers/mqlaunch-20260508-020947.sh.bak +++ /dev/null @@ -1,1419 +0,0 @@ -#!/bin/zsh - -set -u - -# ============================================================ -# MQLAUNCH — Branded Neon Command Surface -# Adds: -# - MAIN MENU in bold -# - Author line in header -# - Git Launch + Net Launch in Prompt Tools -# ============================================================ - -APP_TITLE="MQLAUNCH" -APP_SUBTITLE="Branded Neon Command Surface" -APP_AUTHOR="Author Mattias Camner" - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - -# Performance bridge -if [[ -f "$BASE_DIR/terminal/bridges/performance-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/performance-bridge.sh" -fi - -# Dev bridge -if [[ -f "$BASE_DIR/terminal/bridges/dev-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/dev-bridge.sh" -fi - -# Tools bridge -if [[ -f "$BASE_DIR/terminal/bridges/tools-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/tools-bridge.sh" -fi -AI_SCRIPT="$BASE_DIR/tools/cli/ai-mode.sh" -PROMPT_DIR="$BASE_DIR/ai-prompts" -REPO_URL="https://github.com/MCamner/macos-scripts" -MQ_SCRIPT="$BASE_DIR/terminal/launchers/mqlaunch.sh" -BACKUP_DIR="$BASE_DIR/backups" -BIN_LINK="$HOME/bin/mqlaunch" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -DASHBOARD_V71="$BASE_DIR/ui/ascii/mqlaunch-dashboard-v7.1.sh" - -TERMINAL_GUIDE_HTML="$BASE_DIR/docs/mac-terminal-guide.html" -TERMINAL_GUIDE_URL="https://mcamner.github.io/macos-scripts/" - -if [[ -f "$UI_LIB" ]]; then - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -if [[ -t 0 ]]; then - stty erase '^?' 2>/dev/null || true -fi - -BOX_INNER=88 - -# Main menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-main-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-main-menu.sh" -fi - -# Apps menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-apps-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-apps-menu.sh" -fi - -# System menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-system-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-system-menu.sh" -fi - -# Help center menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" -fi - -# Command mode module -if [[ -f "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" -fi - -# AI prompts -if [[ -f "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" -fi - -# Dev menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-dev-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-dev-menu.sh" -fi - -# AI menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-ai-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-ai-menu.sh" -fi - -# Net menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-net-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-net-menu.sh" -fi - -# Help/index module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-menu.sh" -fi - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$BASE_DIR/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$BASE_DIR/bin/mqlaunch" || "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -theme_current_variant() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Eq '^export MQ_ZSH_VARIANT=' "$zshrc" 2>/dev/null; then - grep -E '^export MQ_ZSH_VARIANT=' "$zshrc" | tail -n 1 | sed -E 's/^export MQ_ZSH_VARIANT="?([^"]+)"?/\1/' - else - echo "not-set" - fi -} - -theme_source_state() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Fq 'source "$HOME/macos-scripts/terminal/themes/mq-zsh-theme-v3.zsh"' "$zshrc" 2>/dev/null; then - echo "PRESENT" - else - echo "MISSING" - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Apply macos" - row2 " 7. Reset theme" " b. Back" - - print_footer -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read_menu_choice "Select theme option [1-7,b] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd apply macos ;; - 7) theme_cmd reset ;; - b|B|0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local repo_arg="${1:-}" - local git_script="$BASE_DIR/terminal/launchers/gitlaunch.sh" - local git_repo="" - - if [[ -n "$repo_arg" ]]; then - git_repo="$(git -C "$repo_arg" rev-parse --show-toplevel 2>/dev/null || true)" - [[ -n "$git_repo" ]] || git_repo="$repo_arg" - else - git_repo="$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null || true)" - [[ -n "$git_repo" ]] || git_repo="$BASE_DIR" - fi - - if [[ -x "$git_script" ]]; then - MQ_GIT_REPO="$git_repo" "$git_script" - elif [[ -f "$git_script" ]]; then - MQ_GIT_REPO="$git_repo" zsh "$git_script" - else - print_header - row "GIT MENU" - empty_row - row "Git menu not found:" - row " $git_script" - print_footer - pause_enter - fi -} - -open_release_menu() { - local release_menu="$BASE_DIR/terminal/menus/mq-release-menu.sh" - if [[ -x "$release_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$release_menu" menu - elif [[ -f "$release_menu" ]]; then - chmod +x "$release_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$release_menu" menu - else - print_header - row "RELEASE MENU" - empty_row - row "Release menu not found:" - row " $release_menu" - print_footer - pause_enter - fi -} - -run_mqworkflows() { - local workflows_menu="$BASE_DIR/terminal/menus/mq-workflows-menu.sh" - - if [[ -x "$workflows_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$workflows_menu" "${@:-menu}" - elif [[ -f "$workflows_menu" ]]; then - chmod +x "$workflows_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$workflows_menu" "${@:-menu}" - else - print_header - row_bold "WORKFLOWS" - empty_row - row "Workflows menu not found:" - row " $workflows_menu" - print_footer - pause_enter - return 1 - fi -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -run_mqlogin() { - local login_script="$BASE_DIR/automation/login/mqlogin.sh" - local login_menu="$BASE_DIR/terminal/menus/mq-login-menu.sh" - - if [[ $# -eq 0 && -x "$login_menu" ]]; then - "$login_menu" menu - return $? - fi - - if [[ ! -x "$login_script" ]]; then - print_header - row_bold "LOGIN BOOT" - empty_row - row "Missing or non-executable:" - row " $login_script" - row "Run:" - row " chmod +x $login_script" - print_footer - pause_enter - return 1 - fi - - "$login_script" "$@" -} - -run_mqshortcuts() { - local shortcuts_script="$BASE_DIR/automation/shortcuts/mqshortcuts.sh" - local shortcuts_menu="$BASE_DIR/terminal/menus/mq-shortcuts-menu.sh" - - if [[ $# -eq 0 && -x "$shortcuts_menu" ]]; then - "$shortcuts_menu" menu - return $? - fi - - if [[ ! -x "$shortcuts_script" ]]; then - print_header - row_bold "SHORTCUTS" - empty_row - row "Missing or non-executable:" - row " $shortcuts_script" - row "Run:" - row " chmod +x $shortcuts_script" - print_footer - pause_enter - return 1 - fi - - "$shortcuts_script" "$@" -} - -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - row "Latest bundle: $latest_bundle" - row "Core menus: main / help / dev / ai / net" - - print_footer - pause_enter -} - -run_command_palette() { - local fzf_bin selected selected_cmd - fzf_bin="$(command -v fzf 2>/dev/null || true)" - - if [[ -z "$fzf_bin" ]]; then - print_header - row_bold "COMMAND PALETTE" - empty_row - row "fzf is not installed." - row "Falling back to command index." - print_footer - pause_enter - show_command_index - return 0 - fi - - selected="$( - cat <<'EOF' | "$fzf_bin" --height=70% --layout=reverse --border --prompt='mqlaunch > ' --with-nth=2.. --delimiter=$'\t' --preview-window=hidden -main Open main menu -demo Run guided demo mode -git Open Git workspace -perf Open Performance module -dev Open Dev menu -tools Open Tools menu -workflows Open Project workflows menu -workflows boot Run project boot -release Open Release menu -login Open Login / Session menu -login menu Start full session boot -login about Start session about mode -login check Start session self-check mode -shortcuts Open Shortcuts menu -shortcuts list List shortcuts directly -shortcuts search clip Search shortcuts by name -version Show version information -about Show about / status dashboard -notes Show release notes -check Run self-check -bundle Create debug bundle -repo Open repo root in browser -guide Open terminal guide -commands Show command index -EOF - )" - - [[ -n "$selected" ]] || return 0 - - selected_cmd="${selected%%$'\t'*}" - - case "$selected_cmd" in - main) - main_loop - ;; - *) - # shellcheck disable=SC2086 - run_arg_command ${=selected_cmd} - ;; - esac -} - -run_demo_mode() { - local delay version prompt_dir prompt_count repo_state load_line disk_line ip_addr battery_line active_cmd - local theme_variant theme_state - delay="${MQLAUNCH_DEMO_DELAY:-1}" - version="$(get_repo_version)" - prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - prompt_count=0 - load_line="$(uptime 2>/dev/null || echo "uptime unavailable")" - disk_line="$(df -h / 2>/dev/null | tail -1 || echo "disk usage unavailable")" - ip_addr="$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "Unavailable")" - battery_line="$(pmset -g batt 2>/dev/null | tail -1 || echo "Battery info unavailable")" - active_cmd="$(command -v mqlaunch 2>/dev/null || echo "$BIN_LINK")" - theme_variant="$(theme_current_variant)" - theme_state="$(theme_source_state)" - - if [[ -n "$prompt_dir" ]]; then - prompt_count="$(find "$prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if git -C "$BASE_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - else - repo_state="not-a-git-repo" - fi - - print_header - row_bold "DEMO MODE" - empty_row - row "A guided tour of the mqlaunch surface." - row "Press Enter to advance each step." - print_footer - pause_enter - - print_header - row_bold "STEP 1 / 5 — SYSTEM CHECK" - empty_row - row "[OK] Base dir: $BASE_DIR" - row "[OK] Active command: $active_cmd" - row "[OK] Repo state: $repo_state" - row "[OK] Prompt files: $prompt_count" - empty_row - row "Run anytime:" - row " mqlaunch doctor" - row " mqlaunch system check" - print_footer - pause_enter - - print_header - row_bold "STEP 2 / 5 — PERFORMANCE SNAPSHOT" - empty_row - row "Load: $load_line" - row "Disk /: $disk_line" - row "Network: $ip_addr" - row "Battery: $battery_line" - empty_row - row "Run anytime:" - row " mqlaunch perf" - row " mq scan" - print_footer - pause_enter - - print_header - row_bold "STEP 3 / 5 — THEME STATUS" - empty_row - row "Current theme: $theme_variant" - row "Theme source: $theme_state" - empty_row - row "Commands:" - row " mqlaunch theme open theme menu" - row " mqlaunch theme-macos apply macOS theme" - row " mqlaunch theme-reset reset to default" - print_footer - pause_enter - - print_header - row_bold "STEP 4 / 5 — VERSION" - empty_row - row "Project: macos-scripts" - row "Version: $version" - row "Launcher: $MQ_SCRIPT" - empty_row - row "Commands:" - row " mqlaunch version" - row " mqlaunch notes" - row " mqlaunch release" - print_footer - pause_enter - - print_header - row_bold "STEP 5 / 5 — WHAT TO TRY NEXT" - empty_row - row "WORKFLOWS" - row " mqlaunch system check" - row " mqlaunch dev" - row " mqlaunch workflows" - row " mqlaunch release" - empty_row - row "AI ASSISTANT" - row " mqlaunch ask \"what does doctor.sh check?\"" - row " mqlaunch atlas" - empty_row - row "RELEASE" - row " mqlaunch release-check" - row " mqlaunch release-notes" - print_footer - pause_enter - - row "Demo complete. Run mqlaunch to open the full menu." -} - -legacy_alias_notice() { - local old_cmd="$1" - local new_cmd="$2" - print_header - row_bold "LEGACY ALIAS" - empty_row - row "Redirecting:" - row " $old_cmd" - row " -> $new_cmd" - print_footer -} - -tweaks_menu_loop() { - local tweaks_script="$BASE_DIR/system/tweaks/macos-tweaks.sh" - - if [[ -x "$tweaks_script" || -f "$tweaks_script" ]]; then - bash "$tweaks_script" menu || true - else - echo "${C_ERR}Tweaks script not found:${C_RESET} $tweaks_script" - pause_enter - return 1 - fi -} - -run_arg_command() { - local cmd="${1:l}" - shift || true - - case "$cmd" in - finder) open_app "Finder" ;; - safari) open_app "Safari" ;; - chrome) open_app "Google Chrome" ;; - spotify) open_app "Spotify" ;; - xcode) open_app "Xcode" ;; - settings) open_app "System Settings" ;; - monitor) open_app "Activity Monitor" ;; - downloads) open_downloads_folder ;; - home) open_home_folder ;; - utilities) open_utilities_folder ;; - applications|apps) open_applications_folder ;; - ip|network) show_network_info ;; - lock) lock_screen ;; - sleep) sleep_display ;; - restart-finder|finder-restart) restart_finder ;; - date|time) show_date_time ;; - repo) open_repo_browser ;; - ai) open_ai_menu ;; - dev) open_dev_menu ;; - tweaks|tweak|tw) open_tweaks_menu ;; - tweaks-status) show_tweaks_status ;; - tweaks-workstation) run_tweaks_workstation ;; - tweaks-dev) run_tweaks_dev ;; - tweaks-clean) run_tweaks_clean ;; - tweaks-fast) run_tweaks_fast ;; - tweaks-all) run_tweaks_all ;; - tweaks-revert|revert-tweaks) revert_tweaks_latest ;; - dashboard|dash) open_dashboard ;; - theme|themes) themes_menu_loop ;; - theme-current) theme_cmd current ;; - theme-reset) theme_cmd reset ;; - theme-amber) theme_cmd apply amber ;; - theme-green) theme_cmd apply green ;; - theme-minimal) theme_cmd apply minimal ;; - theme-ice) theme_cmd apply ice ;; - theme-macos) theme_cmd apply macos ;; - release|rel) open_release_menu ;; - workflows|workflow|wf) run_mqworkflows "$@" ;; - git|git-menu|gitmenu|menu-git) open_git_menu "${1:-}" ;; - gitlaunch) - legacy_alias_notice "mqlaunch gitlaunch" "mqlaunch git" - open_git_menu "${1:-}" - ;; - login|boot|session) run_mqlogin "$@" ;; - shortcuts|shortcut|sc) run_mqshortcuts "$@" ;; - perf|performance) open_performance_menu ;; - demo) run_demo_mode ;; - version|ver|about) show_version_info ;; - ask) "$BASE_DIR/tools/scripts/ask.sh" "$@" ;; - fix) "$BASE_DIR/tools/scripts/fix.sh" "$@" ;; - nickname-set|nick-set|nick) - if [[ -n "${1:-}" ]]; then - printf '%s\n' "$*" > "$HOME/.mqlaunch_nickname" - echo "Smeknamn sparat: $*" - else - echo "Nuvarande smeknamn: $(get_nickname)" - echo "Ändra: mqlaunch nickname-set " - fi - ;; - doctor) "$BASE_DIR/tools/scripts/doctor.sh" ;; - check|health) run_self_check ;; - bundle|debug-bundle|support) run_debug_bundle ;; - notes|changelog|release-notes) show_release_notes ;; - about|status|dashboard) show_about_dashboard ;; - commands|index) show_command_index ;; - palette|fzf|search) run_command_palette ;; - dev-v1|git-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch dev" - open_dev_menu - ;; - tools) open_tools_menu ;; - tools-menu|toolsmenu|menu-tools|tools-v1|menu-tools-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch tools" - open_tools_menu - ;; - prompts|prompt-folder) open_ai_prompts_folder ;; - prompt-files|files) show_prompt_files ;; - edit|edit-mqlaunch) edit_mqlaunch ;; - backup-prompts|backup) backup_prompts ;; - backup-mqlaunch|backup-launcher) backup_mqlaunch ;; - base|macos-scripts) open_base_dir ;; - launchers|launcher-folder) open_launcher_folder ;; - guide|terminal-guide) open_terminal_guide ;; - netlaunch|net) open_net_menu ;; - atlas) mq_ai_run_atlas "$@" ;; - auto|one|decide|research|root|solve|pdebug|menu) safe_run_ai "$cmd" ;; - mc) "$BASE_DIR/tools/scripts/mission-control.sh" ;; - ghost) "$BASE_DIR/tools/scripts/network-ghost.sh" ;; - pulse) "$BASE_DIR/tools/scripts/pulse.sh" ;; - scan) "$BASE_DIR/tools/scripts/vault-scan.sh" ;; - reap) "$BASE_DIR/tools/scripts/overseer.sh" ;; - guard) "$BASE_DIR/tools/scripts/blackout.sh" ;; - help|-h|--help) show_help ;; - *) - echo "${C_ERR}Unknown command:${C_RESET} $cmd" - echo - echo "Try:" - echo " mqlaunch ask \"Vad betyder kommandot: $cmd $*\"" - echo - - if declare -f mq_ai_prompt_ask >/dev/null; then - echo "Copying an /ask prompt for this unknown command..." - mq_ai_prompt_ask "Vad betyder kommandot '$cmd $*' i mqlaunch, och finns det ett liknande kommando?" - return 0 - fi - - show_help - exit 1 - ;; - esac -} - -# --- Entry -------------------------------------------------- -if [[ $# -gt 0 ]]; then - # Atlas REPL — intercept before dispatch to avoid ai-mode.sh routing - case "${1:l}" in - atlas) - shift - mq_ai_run_atlas "$@" - exit 0 - ;; - esac - - if dispatch_cli_command "$@"; then - exit 0 - else - cmd_status=$? - if [[ $cmd_status -eq 2 ]]; then - exit 2 - fi - fi - - if [[ "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" == "menu" ]]; then - main_loop - else - run_arg_command "$@" - fi -else - main_loop -fi diff --git a/backups/scripts/20260509-030842/backups/launchers/mqlaunch-v2-stable.sh b/backups/scripts/20260509-030842/backups/launchers/mqlaunch-v2-stable.sh deleted file mode 100755 index 41a3fd7..0000000 --- a/backups/scripts/20260509-030842/backups/launchers/mqlaunch-v2-stable.sh +++ /dev/null @@ -1,588 +0,0 @@ -#!/bin/zsh - -set -u - -# ============================================================ -# MQLaunch v2 — Old School Utility -# ============================================================ - -APP_TITLE="MQLaunch v2" -APP_SUBTITLE="Old School Utility" - -BASE_DIR="$HOME/macos-scripts" -AI_SCRIPT="$BASE_DIR/tools/cli/ai-mode.sh" -PROMPT_DIR="$BASE_DIR/ai-prompts" -REPO_URL="https://github.com/MCamner/macos-scripts" -MQ_SCRIPT="$BASE_DIR/terminal/launchers/mqlaunch.sh" -BACKUP_DIR="$BASE_DIR/backups" - -BOX_INNER=88 - -# --- ANSI colors -------------------------------------------- -if [[ -t 1 ]]; then - C_RESET=$'\033[0m' - C_TITLE=$'\033[1;33m' - C_ERR=$'\033[0;31m' -else - C_RESET='' - C_TITLE='' - C_ERR='' -fi - -# --- Helpers ------------------------------------------------ -repeat_char() { - local count="$1" - local char="$2" - printf '%*s' "$count" '' | tr ' ' "$char" -} - -border() { - printf "+%s+\n" "$(repeat_char "$BOX_INNER" "-")" -} - -row() { - local text="$1" - printf "| %-*.*s |\n" "$BOX_INNER" "$BOX_INNER" "$text" -} - -row3() { - local c1="$1" - local c2="$2" - local c3="$3" - row "$(printf '%-26s %-26s %-26s' "$c1" "$c2" "$c3")" -} - -row2() { - local c1="$1" - local c2="$2" - row "$(printf '%-40s %-40s' "$c1" "$c2")" -} - -empty_row() { - row "" -} - -pause_enter() { - echo - read -r "?Press Enter to continue..." -} - -set_terminal_title() { - print -Pn "\e]0;${APP_TITLE} — ${APP_SUBTITLE}\a" -} - -clear_screen() { - if command -v tput >/dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -short_host() { - hostname -s 2>/dev/null || hostname -} - -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - echo "${C_ERR}AI script missing or not executable:${C_RESET}" - echo "$AI_SCRIPT" - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$AI_SCRIPT" ]]; then - row "[OK] ai-mode.sh executable" - else - row "[FAIL] ai-mode.sh missing/not executable" - fi - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "DEV / PROMPTS" - row3 "20. AI Modes" "21. Open AI Prompts folder" "22. Show prompt files" - row3 "23. Edit mqlaunch" "24. Backup prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-24]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) open_ai_prompts_folder ;; - 22) show_prompt_files ;; - 23) edit_mqlaunch ;; - 24) backup_prompts ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat </dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -short_host() { - hostname -s 2>/dev/null || hostname -} - -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - echo "${C_ERR}AI script missing or not executable:${C_RESET}" - echo "$AI_SCRIPT" - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$AI_SCRIPT" ]]; then - row "[OK] ai-mode.sh executable" - else - row "[FAIL] ai-mode.sh missing/not executable" - fi - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-21]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Open macos-scripts folder" " 6. Open launcher folder" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-6]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) open_base_dir ;; - 6) open_launcher_folder ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat </dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -short_host() { - hostname -s 2>/dev/null || hostname -} - -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-21]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Open macos-scripts folder" " 6. Open launcher folder" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-6]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) open_base_dir ;; - 6) open_launcher_folder ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat </dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear - else - clear - fi - set_terminal_title -} - -short_host() { - hostname -s 2>/dev/null || hostname -} - -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "" - - print_footer - printf "${C_TITLE}Select option [1-21]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Open macos-scripts folder" " 6. Open launcher folder" - row2 " 7. Open mac terminal guide" " 0. Back" - - print_footer - printf "${C_TITLE}Select dev option [0-7]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) open_base_dir ;; - 6) open_launcher_folder ;; - 7) open_terminal_guide ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat </dev/null || hostname -} - -print_header() { - clear_screen - border - row " ${APP_TITLE}" - row " ${APP_SUBTITLE}" - border -} - -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="$USER" - - empty_row - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - border -} - -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - echo "${C_ERR}AI script missing or not executable:${C_RESET}" - echo "$AI_SCRIPT" - pause_enter - fi -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - open "$REPO_URL" -} - -system_check() { - local prompt_count - prompt_count="0" - - if [[ -d "$PROMPT_DIR" ]]; then - prompt_count="$(find "$PROMPT_DIR" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$AI_SCRIPT" ]]; then - row "[OK] ai-mode.sh executable" - else - row "[FAIL] ai-mode.sh missing/not executable" - fi - - if [[ -d "$PROMPT_DIR" ]]; then - row "[OK] Prompt dir found" - else - row "[FAIL] Prompt dir missing" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# --- Menus -------------------------------------------------- -print_main_menu() { - print_header - row "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "11. Exit launcher" "12. Lock screen" "13. Sleep display" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - row3 "20. AI Modes" "" "" - - print_footer - printf "${C_TITLE}Select option [1-20]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_path "$HOME/Downloads" ;; - 9) open_path "$HOME" ;; - 10) show_network_info ;; - 11) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_path "/Applications/Utilities" ;; - 15) open_path "/Applications" ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat </dev/null 2>&1 -} - -get_hostname() { - scutil --get ComputerName 2>/dev/null || hostname -} - -get_user() { - whoami -} - -get_shell_name() { - basename "${SHELL:-unknown}" -} - -get_now() { - date '+%Y-%m-%d %H:%M:%S' -} - -get_uptime_pretty() { - uptime | sed 's/^.*up *//; s/, *[0-9]* users.*$//' -} - -get_cpu_load() { - uptime | awk -F'load averages?: ' '{print $2}' | sed 's/^ *//' -} - -get_mem_info() { - if ! safe_cmd vm_stat; then - echo "vm_stat unavailable" - return - fi - - local page_size pages_free pages_active pages_inactive pages_speculative pages_wired - page_size="$(vm_stat | awk '/page size of/ {gsub("\\.","",$8); print $8}')" - pages_free="$(vm_stat | awk '/Pages free/ {gsub("\\.","",$3); print $3}')" - pages_active="$(vm_stat | awk '/Pages active/ {gsub("\\.","",$3); print $3}')" - pages_inactive="$(vm_stat | awk '/Pages inactive/ {gsub("\\.","",$3); print $3}')" - pages_speculative="$(vm_stat | awk '/Pages speculative/ {gsub("\\.","",$3); print $3}')" - pages_wired="$(vm_stat | awk '/Pages wired down/ {gsub("\\.","",$4); print $4}')" - - python3 - </dev/null | awk '/gateway:/{print $2}' || true -} - -get_wifi_name() { - local airport - airport="/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport" - if [[ -x "$airport" ]]; then - "$airport" -I 2>/dev/null | awk -F': ' '/ SSID/ {print $2}' - fi -} - -get_battery_info() { - if safe_cmd pmset; then - local raw - raw="$(pmset -g batt 2>/dev/null | tail -1 | sed 's/^ *//')" - [[ -n "$raw" ]] && echo "$raw" || echo "Battery info unavailable" - else - echo "Battery info unavailable" - fi -} - -get_git_info() { - if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then - local branch dirty - branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")" - if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then - dirty="dirty" - else - dirty="clean" - fi - echo "Repo: $(basename "$(git rev-parse --show-toplevel 2>/dev/null)") | Branch: $branch | State: $dirty" - else - echo "Not in a git repository" - fi -} - -top_processes() { - ps -Ao pid,comm,%cpu,%mem -r | head -n 6 -} - -print_header() { - clear || true - line - printf '%*s\n' $(( (WIDTH + ${#APP_NAME}) / 2 )) "$APP_NAME" - line -} - -main() { - print_header - - section "SYSTEM" - kv "Host" "$(get_hostname)" - kv "User" "$(get_user)" - kv "Shell" "$(get_shell_name)" - kv "Time" "$(get_now)" - kv "Uptime" "$(get_uptime_pretty)" - - section "PERFORMANCE" - kv "CPU Load" "$(get_cpu_load)" - kv "Memory" "$(get_mem_info)" - kv "Disk /" "$(get_disk_info)" - - section "NETWORK" - kv "Primary IP" "$(get_primary_ip)" - kv "Gateway" "$(get_default_route)" - local wifi_name - wifi_name="$(get_wifi_name 2>/dev/null || true)" - [[ -z "$wifi_name" ]] && wifi_name="Not connected" - kv "Wi-Fi" "$wifi_name" - - section "POWER" - kv "Battery" "$(get_battery_info)" - - section "GIT" - kv "Status" "$(get_git_info)" - - section "TOP PROCESSES" - printf '%-8s %-28s %-8s %-8s\n' "PID" "COMMAND" "%CPU" "%MEM" - subline - top_processes - - printf '\n' - line - printf 'Press Enter to return...' - read -r _ -} - -main "$@" diff --git a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh b/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh deleted file mode 100755 index 414f57c..0000000 --- a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/gitlaunch.sh +++ /dev/null @@ -1,702 +0,0 @@ -#!/bin/zsh - -export LANG=C.UTF-8 -export LC_ALL=C.UTF-8 -export LC_MESSAGES=C.UTF-8 - -STATE_FILE=~/.gitlaunch_state -DEFAULT_REPO=~/macos-scripts -REQUESTED_REPO="${MQ_GIT_REPO:-${1:-}}" -WORK_DIR="" - -if [[ -t 1 ]] && command -v tput >/dev/null 2>&1 && [[ "$(tput colors 2>/dev/null)" -ge 8 ]]; then - C_RESET=$'\e[0m' - C_BOLD=$'\e[1m' - C_DIM=$'\e[2m' - C_BORDER=$'\e[38;5;229m' - C_ACCENT=$'\e[38;5;220m' - C_TITLE=$'\e[1;38;5;229m' - C_LABEL=$'\e[38;5;229m' - C_GOOD=$'\e[92m' - C_WARN=$'\e[93m' - C_BAD=$'\e[91m' - C_DIM=$'\e[38;5;245m' - C_CYAN=$'\e[36m' - C_YELLOW=$'\e[33m' - C_PINK=$'\e[95m' - C_MAGENTA=$'\e[35m' -else - C_RESET="" - C_BOLD="" - C_DIM="" - C_BORDER="" - C_ACCENT="" - C_TITLE="" - C_LABEL="" - C_GOOD="" - C_WARN="" - C_BAD="" - C_DIM="" - C_CYAN="" - C_YELLOW="" - C_PINK="" - C_MAGENTA="" -fi - -GUM_BIN="$(command -v gum 2>/dev/null || true)" -UI_WIDTH=62 -UI_INNER=$((UI_WIDTH - 4)) - -# ------------------------ -# ASCII ART -# ------------------------ -function render_ascii() { - printf "%b" "$C_CYAN" - cat <<'EOF' - ██████╗ ██╗████████╗ - ██╔════╝ ██║╚══██╔══╝ - ██║ ███╗██║ ██║ - ██║ ██║██║ ██║ - ╚██████╔╝██║ ██║ - ╚═════╝ ╚═╝ ╚═╝ -EOF - printf "%b" "$C_PINK" - cat <<'EOF' -██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗ -██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║ -██║ ███████║██║ ██║██╔██╗██║██║ ███████║ -██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║ -╚██████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║ - ╚═════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝ -EOF - printf "%b" "$C_RESET" -} - -# ------------------------ -# STATE MANAGEMENT -# ------------------------ -function save_state() { - { - print -r -- "REPO=${(qqq)REPO}" - print -r -- "WORK_DIR=${(qqq)WORK_DIR}" - print -r -- "LAST_ACTION=${(qqq)1}" - print -r -- "TIMESTAMP=${(qqq)$(date)}" - } > "$STATE_FILE" -} - -function load_state() { - if [ -f "$STATE_FILE" ]; then - source $STATE_FILE - return 0 - else - return 1 - fi -} - -# ------------------------ -# REPO SWITCHING -# ------------------------ -function resolve_repo_path() { - local repo_path="$1" - - case "$repo_path" in - \~) repo_path="$HOME" ;; - \~/*) repo_path="$HOME/${repo_path#\~/}" ;; - esac - - if [[ "$repo_path" != /* ]]; then - repo_path="$(pwd)/$repo_path" - fi - - (cd "$repo_path" 2>/dev/null && pwd) || return 1 -} - -function set_repo() { - local repo_path="$1" - local save="${2:-}" - local resolved_path resolved_repo - - resolved_path=$(resolve_repo_path "$repo_path") || { - echo "Path not found: $repo_path" - sleep 1 - return 1 - } - - resolved_repo=$(git -C "$resolved_path" rev-parse --show-toplevel 2>/dev/null) - if [ -z "$resolved_repo" ]; then - echo "Not a git repo: $repo_path" - sleep 1 - return 1 - fi - - REPO=$resolved_repo - WORK_DIR=$resolved_path - if [ "$save" = "save" ]; then - save_state "set_repo" - fi -} - -function switch_repo() { - echo "Enter local repo path:" - echo -n "> " - read new_repo - - if [ -z "$new_repo" ]; then - echo "No repo entered" - sleep 1 - return - fi - - set_repo "$new_repo" save || return - echo "Switched to: $REPO" - sleep 1 -} - -# ------------------------ -# REPO DETECTION -# ------------------------ -function detect_repo() { - local detected="" - local detected_path="" - - if [ -n "$REQUESTED_REPO" ]; then - set_repo "$REQUESTED_REPO" || REPO="" - REQUESTED_REPO="" - fi - - if [ -z "$REPO" ]; then - detected=$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null) - if [ -n "$detected" ]; then - REPO=$detected - detected_path=$(pwd) - WORK_DIR=$detected_path - fi - fi - - if [ -z "$REPO" ]; then - echo "⚠️ Not inside a git repo" - echo "1. Go to default repo" - echo "2. Exit" - echo -n "Choose: " - read choice - - case $choice in - 1) - REPO=$DEFAULT_REPO - WORK_DIR=$DEFAULT_REPO - ;; - *) exit ;; - esac - fi - - [ -n "$WORK_DIR" ] || WORK_DIR="$REPO" - cd "$WORK_DIR" || exit -} - -# ------------------------ -# UI -# ------------------------ -function clear_screen() { - printf "%b" "$C_RESET" - clear -} - -function use_gum_menu() { - [[ -t 0 && -t 1 && -n "$GUM_BIN" ]] -} - -function repeat_char() { - local char="$1" - local count="$2" - printf "%${count}s" "" | tr " " "$char" -} - -function truncate_text() { - local text="$1" - local max="$2" - - if [ ${#text} -le "$max" ]; then - print -r -- "$text" - elif [ "$max" -le 3 ]; then - print -r -- "${text[1,$max]}" - else - print -r -- "${text[1,$((max - 3))]}..." - fi -} - -function frame_top() { - printf "%b┌%s┐%b\n" "$C_BORDER" "$(repeat_char "─" "$((UI_WIDTH - 2))")" "$C_RESET" -} - -function frame_mid() { - printf "%b├%s┤%b\n" "$C_BORDER" "$(repeat_char "─" "$((UI_WIDTH - 2))")" "$C_RESET" -} - -function frame_bottom() { - printf "%b└%s┘%b\n" "$C_BORDER" "$(repeat_char "─" "$((UI_WIDTH - 2))")" "$C_RESET" -} - -function frame_blank() { - printf "%b│%b %-${UI_INNER}s %b│%b\n" "$C_BORDER" "$C_RESET" "" "$C_BORDER" "$C_RESET" -} - -function frame_row() { - local text - text=$(truncate_text "$1" "$UI_INNER") - printf "%b│%b %-${UI_INNER}s %b│%b\n" "$C_BORDER" "$C_RESET" "$text" "$C_BORDER" "$C_RESET" -} - -function frame_row_colored() { - local text color - text=$(truncate_text "$1" "$UI_INNER") - color="$2" - printf "%b│%b %b%-${UI_INNER}s%b %b│%b\n" "$C_BORDER" "$C_RESET" "$color" "$text" "$C_RESET" "$C_BORDER" "$C_RESET" -} - -function frame_two_col() { - local left right col_width - col_width=$(((UI_INNER - 3) / 2)) - left=$(truncate_text "$1" "$col_width") - right=$(truncate_text "$2" "$col_width") - printf "%b│%b %-${col_width}s %b│%b %-${col_width}s %b│%b\n" \ - "$C_BORDER" "$C_RESET" "$left" "$C_BORDER" "$C_RESET" "$right" "$C_BORDER" "$C_RESET" -} - -function frame_title() { - local title="$1" - local title_len=${#title} - local inner=$((UI_WIDTH - 2)) - local pad_left=$(((inner - title_len) / 2)) - local pad_right=$((inner - title_len - pad_left)) - [ "$pad_left" -lt 0 ] && pad_left=0 - [ "$pad_right" -lt 0 ] && pad_right=0 - - printf "%b│%b%${pad_left}s%b%s%b%${pad_right}s%b│%b\n" \ - "$C_BORDER" "$C_RESET" "" "$C_TITLE" "$title" "$C_RESET" "" "$C_BORDER" "$C_RESET" -} - -function render_banner() { - render_ascii - echo - frame_top - frame_title "MQ REPO LAUNCHER" - frame_mid - frame_row_colored " ★ PHOSPHOR GRID ACTIVE ★" "$C_PINK" - frame_blank - frame_mid -} - -function remote_state() { - local ahead behind - - ahead=$(git rev-list --count @{u}..HEAD 2>/dev/null) - behind=$(git rev-list --count HEAD..@{u} 2>/dev/null) - - if [ -z "$ahead" ] || [ -z "$behind" ]; then - echo "NO UPSTREAM" - elif [ "$ahead" -gt 0 ] && [ "$behind" -gt 0 ]; then - echo "DIVERGED" - elif [ "$ahead" -gt 0 ]; then - echo "AHEAD $ahead" - elif [ "$behind" -gt 0 ]; then - echo "BEHIND $behind" - else - echo "OK" - fi -} - -function fallback_border_top() { - printf "%b┌────────────────────────────────────────────────────────────────────────┐%b\n" "$C_CYAN" "$C_RESET" -} - -function fallback_border_mid() { - printf "%b├────────────────────────────────────────────────────────────────────────┤%b\n" "$C_CYAN" "$C_RESET" -} - -function fallback_border_bottom() { - printf "%b└────────────────────────────────────────────────────────────────────────┘%b\n" "$C_CYAN" "$C_RESET" -} - -function fallback_row() { - local text - text=$(truncate_text "$1" 70) - printf "%b│%b %-70s %b│%b\n" "$C_CYAN" "$C_RESET" "$text" "$C_CYAN" "$C_RESET" -} - -function fallback_row_colored() { - local text color - text=$(truncate_text "$1" 70) - color="$2" - printf "%b│%b %b%-70s%b %b│%b\n" "$C_CYAN" "$C_RESET" "$color" "$text" "$C_RESET" "$C_CYAN" "$C_RESET" -} - -function fallback_status_row() { - local label="$1" - local value="$2" - local color="${3:-}" - value=$(truncate_text "$value" 61) - printf "%b│%b %b%-7s%b: %b%-61s%b %b│%b\n" \ - "$C_CYAN" "$C_RESET" "$C_TITLE" "$label" "$C_RESET" "$color" "$value" "$C_RESET" "$C_CYAN" "$C_RESET" -} - -# ------------------------ -# STATUS -# ------------------------ - -function status_check() { - BRANCH=$(git branch --show-current) - CHANGES=$(git status --porcelain | wc -l | xargs) - REMOTE=$(remote_state) - - if ! use_gum_menu; then - fallback_border_top - fallback_row_colored "GITHUB LAUNCHPAD" "$C_TITLE" - fallback_row_colored "REPO COMMAND DECK" "$C_YELLOW" - fallback_border_mid - fallback_status_row "Repo" "$REPO" - fallback_status_row "Path" "${WORK_DIR:-$REPO}" - fallback_status_row "Branch" "$BRANCH" - fallback_status_row "Status" "${CHANGES} change(s)" - if [ "$CHANGES" -eq 0 ]; then - fallback_status_row "State" "CLEAN" "$C_GOOD" - else - fallback_status_row "State" "DIRTY" "$C_BAD" - fi - fallback_status_row "Remote" "$REMOTE" - return - fi - - render_banner - frame_row "PATH : ${WORK_DIR:-$REPO}" - frame_row "BRANCH : ${BRANCH:u}" - if [ "$CHANGES" -eq 0 ]; then - frame_row_colored "STATE : CLEAN" "$C_GOOD" - else - frame_row_colored "STATE : DIRTY (${CHANGES} CHANGES)" "$C_WARN" - fi - frame_row "REMOTE : $REMOTE" - frame_bottom -} - -# ------------------------ -# MENU -# ------------------------ -function render_menu() { - echo - frame_top - frame_row_colored "1. GIT STATUS" "$C_LABEL" - frame_row_colored "2. GIT PULL" "$C_LABEL" - frame_row_colored "3. AI COMMIT" "$C_LABEL" - frame_row_colored "4. SAFE PUSH" "$C_LABEL" - frame_row_colored "5. OPEN REPO" "$C_LABEL" - frame_row_colored "6. DEV MODE" "$C_LABEL" - frame_row_colored "7. SWITCH REPO" "$C_LABEL" - frame_row_colored "8. AUTO ACTION" "$C_LABEL" - frame_row_colored "b. BACK" "$C_LABEL" - frame_bottom -} - -function render_next_action() { - if ! use_gum_menu; then - fallback_border_mid - fallback_row_colored "NEXT ACTION: $NEXT_ACTION_MESSAGE" "$NEXT_ACTION_COLOR" - fallback_border_bottom - return - fi - - frame_top - frame_row_colored "$NEXT_ACTION_MESSAGE" "$NEXT_ACTION_COLOR" - frame_bottom -} - -function prompt_choice() { - local prompt_sep input old_stty - prompt_sep="$(repeat_char "─" "$UI_WIDTH")" - - printf "%b%s%b\n" "$C_BORDER" "$prompt_sep" "$C_RESET" - printf "%bgitlaunch > %b\n" "$C_TITLE" "$C_RESET" - printf "%b%s%b\n" "$C_BORDER" "$prompt_sep" "$C_RESET" - printf "%b>> press 1-9%b\n" "$C_DIM" "$C_RESET" - printf "\033[3A" - printf "%bgitlaunch > %b" "$C_TITLE" "$C_RESET" - - if [[ -t 0 ]]; then - old_stty="$(stty -g)" - stty -echo -icanon min 1 time 0 2>/dev/null || true - IFS= read -r -k 1 input 2>/dev/null || input="" - stty "$old_stty" 2>/dev/null || true - else - IFS= read -r input || input="b" - fi - - printf "%s\n" "$input" - printf "\033[2B" - - choice="$input" -} - -# ------------------------ -# NEXT ACTION ENGINE -# ------------------------ -function next_action() { - - CHANGES=$(git status --porcelain) - STAGED=$(git diff --cached --name-only) - AHEAD=$(git rev-list --count @{u}..HEAD 2>/dev/null) - BEHIND=$(git rev-list --count HEAD..@{u} 2>/dev/null) - - if echo "$CHANGES" | grep -q "UU"; then - NEXT_ACTION_MESSAGE="Resolve merge conflicts" - NEXT_ACTION_COLOR="$C_BAD" - return - fi - - if [ -n "$CHANGES" ] && [ -z "$STAGED" ]; then - NEXT_ACTION_MESSAGE="Stage your changes (git add .)" - NEXT_ACTION_COLOR="$C_WARN" - return - fi - - if [ -n "$STAGED" ]; then - NEXT_ACTION_MESSAGE="Commit your changes" - NEXT_ACTION_COLOR="$C_WARN" - return - fi - - if [ -n "$BEHIND" ] && [ "$BEHIND" -gt 0 ]; then - NEXT_ACTION_MESSAGE="Pull latest changes" - NEXT_ACTION_COLOR="$C_WARN" - return - fi - - if [ -n "$AHEAD" ] && [ "$AHEAD" -gt 0 ]; then - NEXT_ACTION_MESSAGE="Push your commits" - NEXT_ACTION_COLOR="$C_GOOD" - return - fi - - NEXT_ACTION_MESSAGE="Nothing to do" - NEXT_ACTION_COLOR="$C_GOOD" -} - -# ------------------------ -# DIFF INTELLIGENCE (v6) -# ------------------------ -function analyze_diff() { - - DIFF=$(git diff) - FILES=$(git diff --name-only) - - echo "" - echo "🔍 Diff analysis:" - - RISK_LEVEL="LOW" - WARNINGS=() - - # Sensitive files - if echo "$FILES" | grep -E "\.env|\.key|\.pem" >/dev/null; then - WARNINGS+=("Possible secrets in sensitive files") - RISK_LEVEL="HIGH" - fi - - # Credentials - if echo "$DIFF" | grep -iE "password=|token=|secret=" >/dev/null; then - WARNINGS+=("Hardcoded credentials detected") - RISK_LEVEL="HIGH" - fi - - # Dangerous commands - if echo "$DIFF" | grep -E "rm -rf" >/dev/null; then - WARNINGS+=("Destructive command: rm -rf") - RISK_LEVEL="HIGH" - fi - - if echo "$DIFF" | grep -E "sudo " >/dev/null; then - WARNINGS+=("Use of sudo detected") - [ "$RISK_LEVEL" != "HIGH" ] && RISK_LEVEL="MEDIUM" - fi - - # Large diff - LINES=$(echo "$DIFF" | wc -l | xargs) - if [ "$LINES" -gt 300 ]; then - WARNINGS+=("Large diff: $LINES lines") - [ "$RISK_LEVEL" = "LOW" ] && RISK_LEVEL="MEDIUM" - fi - - # Script changes - if echo "$FILES" | grep -E "\.sh$" >/dev/null; then - WARNINGS+=("Shell script modified") - [ "$RISK_LEVEL" = "LOW" ] && RISK_LEVEL="MEDIUM" - fi - - if [ ${#WARNINGS[@]} -eq 0 ]; then - printf "%b✅ No obvious risks%b\n" "$C_GOOD" "$C_RESET" - else - case "$RISK_LEVEL" in - HIGH) RISK_COLOR=$C_BAD ;; - MEDIUM) RISK_COLOR=$C_WARN ;; - *) RISK_COLOR=$C_GOOD ;; - esac - printf "%b⚠️ Risk level: %s%b\n" "$RISK_COLOR" "$RISK_LEVEL" "$C_RESET" - for w in "${WARNINGS[@]}"; do - printf "%b- %s%b\n" "$C_DIM" "$w" "$C_RESET" - done - fi - - echo "" -} - -# ------------------------ -# SAFE PUSH -# ------------------------ -function safe_push() { - git fetch - LOCAL=$(git rev-parse @) - REMOTE=$(git rev-parse @{u} 2>/dev/null) - - if [ -z "$REMOTE" ]; then - echo "⚠️ No upstream branch set." - return - fi - - if [ "$LOCAL" != "$REMOTE" ]; then - echo "⚠️ Repo not up to date. Run pull first." - return - fi - - git push -} - -# ------------------------ -# COMMIT SUGGESTION -# ------------------------ -function suggest_commit() { - FILES=$(git diff --name-only) - - if [[ "$FILES" == *"install.sh"* && "$FILES" == *"system-check.sh"* ]]; then - echo "improve install and system-check scripts" - elif [[ "$FILES" == *.sh* ]]; then - echo "update shell scripts" - elif [[ "$FILES" == *.md* ]]; then - echo "update documentation" - else - echo "update project files" - fi -} - -# ------------------------ -# WORKSPACE RESUME -# ------------------------ -if load_state; then - echo "🔁 Resume last workspace?" - echo "Repo: $REPO" - echo -n "(y/n): " - read resume - - if [[ "$resume" == "y" ]]; then - cd "${WORK_DIR:-$REPO}" - echo "🚀 Restoring workspace..." - - echo "Workspace restored" - sleep 1 - else - REPO="" - fi -fi - -# ------------------------ -# MAIN LOOP -# ------------------------ -trap 'printf "%b" "$C_RESET"' EXIT - -while true; do - detect_repo - clear_screen - status_check - next_action - render_next_action - - if use_gum_menu && [ -n "$(git status --porcelain)" ]; then - analyze_diff - fi - - echo "" - render_menu - - prompt_choice - - case $choice in - 1) - git status - read - ;; - 2) - git pull - read - ;; - 3) - SUGGESTED=$(suggest_commit) - - echo "" - printf "%b💡 Suggested commit message:%b\n" "$C_TITLE" "$C_RESET" - echo "$SUGGESTED" - - analyze_diff - - printf "%bProceed with commit? (y/n): %b" "$C_LABEL" "$C_RESET" - read proceed - - if [[ "$proceed" != "y" ]]; then - echo "❌ Commit cancelled" - read - continue - fi - - git add . - git commit -m "$SUGGESTED" - git push - read - ;; - 4) - safe_push - read - ;; - 5) - open . - ;; - 6) - echo "🚀 Starting Dev Mode..." - save_state "dev_mode" - - open -a "ChatGPT Atlas" - open -a Terminal "${WORK_DIR:-$REPO}" - - if command -v code >/dev/null 2>&1; then - code "${WORK_DIR:-$REPO}" - fi - - REPO_NAME=$(basename "$REPO") - open "https://github.com/MCamner/$REPO_NAME" - - echo "✅ Dev environment ready" - sleep 1 - ;; - 7) - switch_repo - ;; - 8) - git add . - SUGGESTED=$(suggest_commit) - git commit -m "$SUGGESTED" - git push - read - ;; - 9|b|B) - break - ;; - *) - echo "Invalid" - sleep 1 - ;; - esac -done diff --git a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh b/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh deleted file mode 100644 index ec13cce..0000000 --- a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-command-mode.sh +++ /dev/null @@ -1,418 +0,0 @@ -#!/usr/bin/env bash - -normalize_cli_word() { - printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]' -} - -# AI prompt helpers -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -AI_PROMPTS="$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" -# shellcheck disable=SC1090 -[[ -f "$AI_PROMPTS" ]] && source "$AI_PROMPTS" - -print_command_help() { - local topic="${1:-}" - - case "$topic" in - system) - cat <<'HELP' -mqlaunch system -mqlaunch system perf -mqlaunch system network -mqlaunch system check -mqlaunch system self-check -mqlaunch system debug -mqlaunch system repo -mqlaunch system browser -mqlaunch system time -HELP - ;; - release) - cat <<'HELP' -mqlaunch release -mqlaunch release notes -mqlaunch release version -HELP - ;; - dev) - cat <<'HELP' -mqlaunch dev -mqlaunch dev ai -mqlaunch dev tools -HELP - ;; - help) - cat <<'HELP' -mqlaunch help -mqlaunch help index -mqlaunch help about -mqlaunch help version -mqlaunch help notes -mqlaunch help repo -mqlaunch help browser -HELP - ;; - git) - cat <<'HELP' -mqlaunch git -HELP - ;; - *) - cat <<'HELP' -Usage: - mqlaunch - mqlaunch demo - mqlaunch workflows - mqlaunch system - mqlaunch git - mqlaunch release - mqlaunch dev - mqlaunch help - -Quick commands: - mqlaunch demo - mqlaunch perf - mqlaunch network - mqlaunch check - mqlaunch self-check - mqlaunch debug - mqlaunch apps - mqlaunch theme - mqlaunch theme-macos - mqlaunch review - mqlaunch ui - mqlaunch ask "your question" - mqlaunch release-check - mqlaunch selftest - mqlaunch version - mqlaunch notes - mqlaunch about - mqlaunch index - mqlaunch docfunc - mqlaunch docwrite - -Subcommands: - mqlaunch system perf - mqlaunch system network - mqlaunch system check - mqlaunch system self-check - mqlaunch system debug - mqlaunch system repo - mqlaunch system browser - mqlaunch system time - - mqlaunch release notes - mqlaunch release version - - mqlaunch help index - mqlaunch help about - mqlaunch help version - mqlaunch help notes - mqlaunch help repo - mqlaunch help browser - - mqlaunch dev ai - mqlaunch dev tools - -Compatibility routes still work: - mqlaunch login menu - mqlaunch shortcuts list - mqlaunch palette -HELP - ;; - esac -} - -dispatch_cli_command() { - local area sub - area="$(normalize_cli_word "${1:-}")" - sub="$(normalize_cli_word "${2:-}")" - - case "$area" in - ""|menu) - return 1 - ;; - - workflows|workflow) - if [[ -n "$sub" && "$sub" != "menu" ]]; then - run_mqworkflows "$sub" - else - run_mqworkflows - fi - return 0 - ;; - - demo) - run_demo_mode - return 0 - ;; - - review|/review) - if declare -f mq_ai_prompt_review >/dev/null; then - mq_ai_prompt_review - else - echo "Missing helper: mq_ai_prompt_review" - echo "Expected: $AI_PROMPTS" - fi - pause_enter - return 0 - ;; - - ui|/ui) - if declare -f mq_ai_prompt_ui >/dev/null; then - mq_ai_prompt_ui - else - echo "Missing helper: mq_ai_prompt_ui" - echo "Expected: $AI_PROMPTS" - fi - pause_enter - return 0 - ;; - - ask|/ask) - shift - "$BASE_DIR/tools/scripts/ask.sh" "$@" - return 0 - ;; - - fix|/fix) - shift - "$BASE_DIR/tools/scripts/fix.sh" "$@" - return 0 - ;; - - chat|/chat) - "$BASE_DIR/tools/scripts/chat.sh" - return 0 - ;; - - release-check|/release-check|check-release) - "$BASE_DIR/terminal/release/mq-release-check.sh" - pause_enter - return 0 - ;; - - selftest|/selftest|test-all) - "$BASE_DIR/tools/scripts/test-all.sh" - pause_enter - return 0 - ;; - - doctor|/doctor) - "$BASE_DIR/tools/scripts/doctor.sh" - pause_enter - return 0 - ;; - - scan|/scan) - "$BASE_DIR/tools/scripts/scan.sh" - pause_enter - return 0 - ;; - - atlas|/atlas) - shift - mq_ai_run_atlas "$@" - return 0 - ;; - - system) - case "$sub" in - ""|menu) - open_system_menu - ;; - perf|performance) - open_performance_menu - ;; - net|network) - show_network_info - ;; - doctor) - "$BASE_DIR/tools/scripts/doctor.sh" - ;; - check|health) - system_check - ;; - self-check|selfcheck) - run_self_check || true - ;; - debug|debug-bundle|bundle) - run_debug_bundle || true - ;; - repo|folder) - open_base_dir - ;; - browser|web) - open_repo_browser - ;; - time|date) - show_date_time - ;; - *) - print_command_help "system" - return 2 - ;; - esac - return 0 - ;; - - git) - case "$sub" in - ""|menu) - open_git_menu "${3:-}" - ;; - *) - open_git_menu "${2:-}" - ;; - esac - return 0 - ;; - - release) - case "$sub" in - ""|menu) - open_release_menu - ;; - notes|release-notes) - show_release_notes || true - ;; - version) - show_version_info || true - ;; - status) - "$BASE_DIR/terminal/menus/mq-release-menu.sh" status - ;; - *) - print_command_help "release" - return 2 - ;; - esac - return 0 - ;; - - dev) - case "$sub" in - ""|menu) - open_dev_menu - ;; - ai) - ai_menu_loop - ;; - tools) - open_tools_menu - ;; - current) - open_dev_menu - ;; - *) - print_command_help "dev" - return 2 - ;; - esac - return 0 - ;; - - help|-h|--help) - case "$sub" in - "") - show_help - ;; - menu) - open_help_center_menu - ;; - index|commands) - show_command_index || true - ;; - about|status) - show_about_dashboard || true - ;; - version) - show_version_info || true - ;; - notes|release-notes) - show_release_notes || true - ;; - repo|folder) - open_base_dir - ;; - browser|web) - open_repo_browser - ;; - *) - print_command_help "help" - return 2 - ;; - esac - return 0 - ;; - - perf|performance) - open_performance_menu - return 0 - ;; - - net|network) - show_network_info - return 0 - ;; - - check|health) - system_check - return 0 - ;; - - self-check|selfcheck) - run_self_check || true - return 0 - ;; - - debug|bundle|debug-bundle|support) - run_debug_bundle || true - return 0 - ;; - - apps) - open_apps_menu - return 0 - ;; - - docfunc|document-functions) - "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docfunc - return 0 - ;; - - docwrite|document-functions-write|update-comments) - "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docwrite - return 0 - ;; - - version) - show_version_info || true - return 0 - ;; - - notes|release-notes) - show_release_notes || true - return 0 - ;; - - about|status) - show_about_dashboard || true - return 0 - ;; - - index|commands) - show_command_index || true - return 0 - ;; - - *) - if declare -f mq_ai_prompt_ask >/dev/null; then - echo "Unknown command → routing to /ask" - mq_ai_prompt_ask "$@" - return 0 - fi - return 1 - ;; - esac -} diff --git a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh b/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh deleted file mode 100755 index 9ccfb18..0000000 --- a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch-repl.sh +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env bash - -set -uo pipefail - -BASE_DIR="${BASE_DIR:-$HOME/macos-scripts}" -MQ_SHELL="${SHELL:-/bin/zsh}" -MQ_LINE="════════════════════════════════════════════════════" -PROMPT_LABEL="mqlaunch > " -MQ_LAST_STATUS=0 -MQ_MODE="repl" - -# --- COLORS (subtle) --- -C_RESET='\033[0m' -C_DIM='\033[2m' -C_ACCENT='\033[36m' # cyan -C_OK='\033[32m' # green -C_ERR='\033[31m' # red - -get_git_branch() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git rev-parse --abbrev-ref HEAD 2>/dev/null || true -} - -get_status_symbol() { - if [[ "$MQ_LAST_STATUS" -eq 0 ]]; then - printf "%b✔%b" "$C_OK" "$C_RESET" - else - printf "%b✖ %d%b" "$C_ERR" "$MQ_LAST_STATUS" "$C_RESET" - fi -} - -get_context_line() { - local cwd branch status context - cwd="${PWD/#$HOME/~}" - branch="$(get_git_branch)" - status="$(get_status_symbol)" - - context="$cwd" - [[ -n "$branch" ]] && context="$context · $branch" - context="$context · $MQ_MODE · $status" - - printf "%b%s%b" "$C_DIM" "$context" "$C_RESET" -} - -run_menu() { - exec "$BASE_DIR/terminal/launchers/mqlaunch.sh" -} - -run_doctor() { "$BASE_DIR/tools/scripts/doctor.sh"; } -run_perf() { "$BASE_DIR/terminal/bridges/performance-bridge.sh"; } -run_dev() { "$BASE_DIR/terminal/bridges/dev-bridge.sh"; } -run_tools() { "$BASE_DIR/terminal/menus/mq-tools-menu.sh"; } - -run_system() { - if [[ "${1:-}" == "check" ]]; then - "$BASE_DIR/tools/scripts/system-check.sh" - else - "$BASE_DIR/terminal/menus/mq-system-menu.sh" - fi -} - -print_help() { - cat <<'HELP' - -Core: doctor, perf, dev, tools, system, system check, demo, menu, where -Built-in: help, clear, x -Aliases: d, p, t, sys, sc - -HELP -} - -print_where() { - local cwd branch - cwd="${PWD/#$HOME/~}" - branch="$(get_git_branch)" - - echo "cwd: $cwd" - echo "mode: $MQ_MODE" - echo "shell: $MQ_SHELL" - echo "git: ${branch:-"-"}" -} - -normalize_aliases() { - case "$1" in - h) echo "help" ;; - d) echo "doctor" ;; - p) echo "perf" ;; - t) echo "tools" ;; - sys) echo "system" ;; - sc) echo "system check" ;; - q|x) echo "exit" ;; - *) echo "$1" ;; - esac -} - -run_shell_fallback() { - local line="$1" - echo - echo -e "${C_DIM}[shell] $line${C_RESET}" - echo - "$MQ_SHELL" -lc "$line" -} - -dispatch_command() { - local line="$1" - - [[ -z "$line" ]] && return 0 - line="$(normalize_aliases "$line")" - - case "$line" in - help) print_help ;; - clear|cls) clear ;; - exit|quit) return 99 ;; - menu) run_menu ;; - where) print_where ;; - doctor) run_doctor ;; - perf|performance) run_perf ;; - dev) run_dev ;; - tools) run_tools ;; - demo) run_demo ;; - "system check") run_system check ;; - system) run_system ;; - *) run_shell_fallback "$line" ;; - esac -} - -read_prompt_input() { - local line context_line - context_line="$(get_context_line)" - - { - printf '%s\n' "$MQ_LINE" - printf '%b%s%b\n' "$C_ACCENT" "$PROMPT_LABEL" "$C_RESET" - printf '%s\n' "$MQ_LINE" - printf 'MQLAUNCH — Command Surface\n' - printf '%s\n' "$context_line" - printf '%bhelp = commands · x = exit%b\n' "$C_DIM" "$C_RESET" - - printf '\033[5A' - printf '\033[%dC' "${#PROMPT_LABEL}" - } > /dev/tty - - IFS= read -r line < /dev/tty - - { - printf '\033[5B' - printf '\r' - } > /dev/tty - - REPLY="$line" -} - -main() { - local line status - - while true; do - read_prompt_input - line="$REPLY" - echo - - dispatch_command "$line" - status=$? - MQ_LAST_STATUS=$status - - if [[ $status -eq 99 ]]; then - echo - break - fi - - echo - done - - echo "[MQ] Bye." -} - -main "$@" diff --git a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh b/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh deleted file mode 100755 index 6a15faa..0000000 --- a/backups/scripts/20260509-030842/backups/scripts/20260508-033012/terminal/launchers/mqlaunch.sh +++ /dev/null @@ -1,1421 +0,0 @@ -#!/bin/zsh - -set -u - -# ============================================================ -# MQLAUNCH — Branded Neon Command Surface -# Adds: -# - MAIN MENU in bold -# - Author line in header -# - Git Launch + Net Launch in Prompt Tools -# ============================================================ - -APP_TITLE="MQLAUNCH" -APP_SUBTITLE="Branded Neon Command Surface" -APP_AUTHOR="Author Mattias Camner" - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - -# Performance bridge -if [[ -f "$BASE_DIR/terminal/bridges/performance-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/performance-bridge.sh" -fi - -# Dev bridge -if [[ -f "$BASE_DIR/terminal/bridges/dev-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/dev-bridge.sh" -fi - -# Tools bridge -if [[ -f "$BASE_DIR/terminal/bridges/tools-bridge.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/bridges/tools-bridge.sh" -fi -AI_SCRIPT="$BASE_DIR/tools/cli/ai-mode.sh" -PROMPT_DIR="$BASE_DIR/ai-prompts" -REPO_URL="https://github.com/MCamner/macos-scripts" -MQ_SCRIPT="$BASE_DIR/terminal/launchers/mqlaunch.sh" -BACKUP_DIR="$BASE_DIR/backups" -BIN_LINK="$HOME/bin/mqlaunch" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -DASHBOARD_V71="$BASE_DIR/ui/ascii/mqlaunch-dashboard-v7.1.sh" - -TERMINAL_GUIDE_HTML="$BASE_DIR/docs/mac-terminal-guide.html" -TERMINAL_GUIDE_URL="https://mcamner.github.io/macos-scripts/" - -if [[ -f "$UI_LIB" ]]; then - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -if [[ -t 0 ]]; then - stty erase '^?' 2>/dev/null || true -fi - -BOX_INNER=88 - -# Main menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-main-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-main-menu.sh" -fi - -# Apps menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-apps-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-apps-menu.sh" -fi - -# System menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-system-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-system-menu.sh" -fi - -# Help center menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" -fi - -# Command mode module -if [[ -f "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" -fi - -# AI prompts -if [[ -f "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" -fi - -# Dev menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-dev-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-dev-menu.sh" -fi - -# AI menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-ai-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-ai-menu.sh" -fi - -# Net menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-net-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-net-menu.sh" -fi - -# Help/index module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-menu.sh" -fi - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$BASE_DIR/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$BASE_DIR/bin/mqlaunch" || "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -theme_current_variant() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Eq '^export MQ_ZSH_VARIANT=' "$zshrc" 2>/dev/null; then - grep -E '^export MQ_ZSH_VARIANT=' "$zshrc" | tail -n 1 | sed -E 's/^export MQ_ZSH_VARIANT="?([^"]+)"?/\1/' - else - echo "not-set" - fi -} - -theme_source_state() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Fq 'source "$HOME/macos-scripts/terminal/themes/mq-zsh-theme-v3.zsh"' "$zshrc" 2>/dev/null; then - echo "PRESENT" - else - echo "MISSING" - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Apply macos" - row2 " 7. Reset theme" " b. Back" - - print_footer -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read_menu_choice "Select theme option [1-7,b] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd apply macos ;; - 7) theme_cmd reset ;; - b|B|0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local repo_arg="${1:-}" - local git_script="$BASE_DIR/terminal/launchers/gitlaunch.sh" - local git_path="" - - if [[ -n "$repo_arg" ]]; then - git_path="$repo_arg" - else - git_path="$(pwd)" - fi - - if [[ -x "$git_script" ]]; then - MQ_GIT_REPO="$git_path" "$git_script" - elif [[ -f "$git_script" ]]; then - MQ_GIT_REPO="$git_path" zsh "$git_script" - else - print_header - row "GIT MENU" - empty_row - row "Git menu not found:" - row " $git_script" - print_footer - pause_enter - fi -} - -open_release_menu() { - local release_menu="$BASE_DIR/terminal/menus/mq-release-menu.sh" - if [[ -x "$release_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$release_menu" menu - elif [[ -f "$release_menu" ]]; then - chmod +x "$release_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$release_menu" menu - else - print_header - row "RELEASE MENU" - empty_row - row "Release menu not found:" - row " $release_menu" - print_footer - pause_enter - fi -} - -run_mqworkflows() { - local workflows_menu="$BASE_DIR/terminal/menus/mq-workflows-menu.sh" - - if [[ -x "$workflows_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$workflows_menu" "${@:-menu}" - elif [[ -f "$workflows_menu" ]]; then - chmod +x "$workflows_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$workflows_menu" "${@:-menu}" - else - print_header - row_bold "WORKFLOWS" - empty_row - row "Workflows menu not found:" - row " $workflows_menu" - print_footer - pause_enter - return 1 - fi -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - - print_footer - pause_enter -} - -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -run_mqlogin() { - local login_script="$BASE_DIR/automation/login/mqlogin.sh" - local login_menu="$BASE_DIR/terminal/menus/mq-login-menu.sh" - - if [[ $# -eq 0 && -x "$login_menu" ]]; then - "$login_menu" menu - return $? - fi - - if [[ ! -x "$login_script" ]]; then - print_header - row_bold "LOGIN BOOT" - empty_row - row "Missing or non-executable:" - row " $login_script" - row "Run:" - row " chmod +x $login_script" - print_footer - pause_enter - return 1 - fi - - "$login_script" "$@" -} - -run_mqshortcuts() { - local shortcuts_script="$BASE_DIR/automation/shortcuts/mqshortcuts.sh" - local shortcuts_menu="$BASE_DIR/terminal/menus/mq-shortcuts-menu.sh" - - if [[ $# -eq 0 && -x "$shortcuts_menu" ]]; then - "$shortcuts_menu" menu - return $? - fi - - if [[ ! -x "$shortcuts_script" ]]; then - print_header - row_bold "SHORTCUTS" - empty_row - row "Missing or non-executable:" - row " $shortcuts_script" - row "Run:" - row " chmod +x $shortcuts_script" - print_footer - pause_enter - return 1 - fi - - "$shortcuts_script" "$@" -} - -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - row "Latest bundle: $latest_bundle" - row "Core menus: main / help / dev / ai / net" - - print_footer - pause_enter -} - -run_command_palette() { - local fzf_bin selected selected_cmd - fzf_bin="$(command -v fzf 2>/dev/null || true)" - - if [[ -z "$fzf_bin" ]]; then - print_header - row_bold "COMMAND PALETTE" - empty_row - row "fzf is not installed." - row "Falling back to command index." - print_footer - pause_enter - show_command_index - return 0 - fi - - selected="$( - cat <<'EOF' | "$fzf_bin" --height=70% --layout=reverse --border --prompt='mqlaunch > ' --with-nth=2.. --delimiter=$'\t' --preview-window=hidden -main Open main menu -demo Run guided demo mode -git Open Git workspace -perf Open Performance module -dev Open Dev menu -tools Open Tools menu -workflows Open Project workflows menu -workflows boot Run project boot -release Open Release menu -login Open Login / Session menu -login menu Start full session boot -login about Start session about mode -login check Start session self-check mode -shortcuts Open Shortcuts menu -shortcuts list List shortcuts directly -shortcuts search clip Search shortcuts by name -version Show version information -about Show about / status dashboard -notes Show release notes -check Run self-check -bundle Create debug bundle -repo Open repo root in browser -guide Open terminal guide -commands Show command index -EOF - )" - - [[ -n "$selected" ]] || return 0 - - selected_cmd="${selected%%$'\t'*}" - - case "$selected_cmd" in - main) - main_loop - ;; - *) - # shellcheck disable=SC2086 - run_arg_command ${=selected_cmd} - ;; - esac -} - -run_demo_mode() { - local delay version prompt_dir prompt_count repo_state load_line disk_line ip_addr battery_line active_cmd - local theme_variant theme_state - delay="${MQLAUNCH_DEMO_DELAY:-1}" - version="$(get_repo_version)" - prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - prompt_count=0 - load_line="$(uptime 2>/dev/null || echo "uptime unavailable")" - disk_line="$(df -h / 2>/dev/null | tail -1 || echo "disk usage unavailable")" - ip_addr="$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "Unavailable")" - battery_line="$(pmset -g batt 2>/dev/null | tail -1 || echo "Battery info unavailable")" - active_cmd="$(command -v mqlaunch 2>/dev/null || echo "$BIN_LINK")" - theme_variant="$(theme_current_variant)" - theme_state="$(theme_source_state)" - - if [[ -n "$prompt_dir" ]]; then - prompt_count="$(find "$prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if git -C "$BASE_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - else - repo_state="not-a-git-repo" - fi - - print_header - row_bold "DEMO MODE" - empty_row - row "A guided tour of the mqlaunch surface." - row "Press Enter to advance each step." - print_footer - pause_enter - - print_header - row_bold "STEP 1 / 5 — SYSTEM CHECK" - empty_row - row "[OK] Base dir: $BASE_DIR" - row "[OK] Active command: $active_cmd" - row "[OK] Repo state: $repo_state" - row "[OK] Prompt files: $prompt_count" - empty_row - row "Run anytime:" - row " mqlaunch doctor" - row " mqlaunch system check" - print_footer - pause_enter - - print_header - row_bold "STEP 2 / 5 — PERFORMANCE SNAPSHOT" - empty_row - row "Load: $load_line" - row "Disk /: $disk_line" - row "Network: $ip_addr" - row "Battery: $battery_line" - empty_row - row "Run anytime:" - row " mqlaunch perf" - row " mq scan" - print_footer - pause_enter - - print_header - row_bold "STEP 3 / 5 — THEME STATUS" - empty_row - row "Current theme: $theme_variant" - row "Theme source: $theme_state" - empty_row - row "Commands:" - row " mqlaunch theme open theme menu" - row " mqlaunch theme-macos apply macOS theme" - row " mqlaunch theme-reset reset to default" - print_footer - pause_enter - - print_header - row_bold "STEP 4 / 5 — VERSION" - empty_row - row "Project: macos-scripts" - row "Version: $version" - row "Launcher: $MQ_SCRIPT" - empty_row - row "Commands:" - row " mqlaunch version" - row " mqlaunch notes" - row " mqlaunch release" - print_footer - pause_enter - - print_header - row_bold "STEP 5 / 5 — WHAT TO TRY NEXT" - empty_row - row "WORKFLOWS" - row " mqlaunch system check" - row " mqlaunch dev" - row " mqlaunch workflows" - row " mqlaunch release" - empty_row - row "AI ASSISTANT" - row " mqlaunch ask \"what does doctor.sh check?\"" - row " mqlaunch atlas" - empty_row - row "RELEASE" - row " mqlaunch release-check" - row " mqlaunch release-notes" - print_footer - pause_enter - - row "Demo complete. Run mqlaunch to open the full menu." -} - -legacy_alias_notice() { - local old_cmd="$1" - local new_cmd="$2" - print_header - row_bold "LEGACY ALIAS" - empty_row - row "Redirecting:" - row " $old_cmd" - row " -> $new_cmd" - print_footer -} - -tweaks_menu_loop() { - local tweaks_script="$BASE_DIR/system/tweaks/macos-tweaks.sh" - - if [[ -x "$tweaks_script" || -f "$tweaks_script" ]]; then - bash "$tweaks_script" menu || true - else - echo "${C_ERR}Tweaks script not found:${C_RESET} $tweaks_script" - pause_enter - return 1 - fi -} - -run_arg_command() { - local cmd="${1:l}" - shift || true - - case "$cmd" in - finder) open_app "Finder" ;; - safari) open_app "Safari" ;; - chrome) open_app "Google Chrome" ;; - spotify) open_app "Spotify" ;; - xcode) open_app "Xcode" ;; - settings) open_app "System Settings" ;; - monitor) open_app "Activity Monitor" ;; - downloads) open_downloads_folder ;; - home) open_home_folder ;; - utilities) open_utilities_folder ;; - applications|apps) open_applications_folder ;; - ip|network) show_network_info ;; - lock) lock_screen ;; - sleep) sleep_display ;; - restart-finder|finder-restart) restart_finder ;; - date|time) show_date_time ;; - repo) open_repo_browser ;; - ai) open_ai_menu ;; - dev) open_dev_menu ;; - tweaks|tweak|tw) open_tweaks_menu ;; - tweaks-status) show_tweaks_status ;; - tweaks-workstation) run_tweaks_workstation ;; - tweaks-dev) run_tweaks_dev ;; - tweaks-clean) run_tweaks_clean ;; - tweaks-fast) run_tweaks_fast ;; - tweaks-all) run_tweaks_all ;; - tweaks-revert|revert-tweaks) revert_tweaks_latest ;; - dashboard|dash) open_dashboard ;; - theme|themes) themes_menu_loop ;; - theme-current) theme_cmd current ;; - theme-reset) theme_cmd reset ;; - theme-amber) theme_cmd apply amber ;; - theme-green) theme_cmd apply green ;; - theme-minimal) theme_cmd apply minimal ;; - theme-ice) theme_cmd apply ice ;; - theme-macos) theme_cmd apply macos ;; - release|rel) open_release_menu ;; - workflows|workflow|wf) run_mqworkflows "$@" ;; - git|git-menu|gitmenu|menu-git) open_git_menu "${1:-}" ;; - gitlaunch) - legacy_alias_notice "mqlaunch gitlaunch" "mqlaunch git" - open_git_menu "${1:-}" - ;; - login|boot|session) run_mqlogin "$@" ;; - shortcuts|shortcut|sc) run_mqshortcuts "$@" ;; - perf|performance) open_performance_menu ;; - demo) run_demo_mode ;; - version|ver|about) show_version_info ;; - ask) "$BASE_DIR/tools/scripts/ask.sh" "$@" ;; - fix) "$BASE_DIR/tools/scripts/fix.sh" "$@" ;; - nickname-set|nick-set|nick) - if [[ -n "${1:-}" ]]; then - printf '%s\n' "$*" > "$HOME/.mqlaunch_nickname" - echo "Smeknamn sparat: $*" - else - echo "Nuvarande smeknamn: $(get_nickname)" - echo "Ändra: mqlaunch nickname-set " - fi - ;; - doctor) "$BASE_DIR/tools/scripts/doctor.sh" ;; - check|health) run_self_check ;; - bundle|debug-bundle|support) run_debug_bundle ;; - notes|changelog|release-notes) show_release_notes ;; - about|status|dashboard) show_about_dashboard ;; - commands|index) show_command_index ;; - palette|fzf|search) run_command_palette ;; - dev-v1|git-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch dev" - open_dev_menu - ;; - tools) open_tools_menu ;; - docfunc|document-functions) "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docfunc ;; - docwrite|document-functions-write|update-comments) - "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docwrite - ;; - tools-menu|toolsmenu|menu-tools|tools-v1|menu-tools-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch tools" - open_tools_menu - ;; - prompts|prompt-folder) open_ai_prompts_folder ;; - prompt-files|files) show_prompt_files ;; - edit|edit-mqlaunch) edit_mqlaunch ;; - backup-prompts|backup) backup_prompts ;; - backup-mqlaunch|backup-launcher) backup_mqlaunch ;; - base|macos-scripts) open_base_dir ;; - launchers|launcher-folder) open_launcher_folder ;; - guide|terminal-guide) open_terminal_guide ;; - netlaunch|net) open_net_menu ;; - atlas) mq_ai_run_atlas "$@" ;; - auto|one|decide|research|root|solve|pdebug|menu) safe_run_ai "$cmd" ;; - mc) "$BASE_DIR/tools/scripts/mission-control.sh" ;; - ghost) "$BASE_DIR/tools/scripts/network-ghost.sh" ;; - pulse) "$BASE_DIR/tools/scripts/pulse.sh" ;; - scan) "$BASE_DIR/tools/scripts/vault-scan.sh" ;; - reap) "$BASE_DIR/tools/scripts/overseer.sh" ;; - guard) "$BASE_DIR/tools/scripts/blackout.sh" ;; - help|-h|--help) show_help ;; - *) - echo "${C_ERR}Unknown command:${C_RESET} $cmd" - echo - echo "Try:" - echo " mqlaunch ask \"Vad betyder kommandot: $cmd $*\"" - echo - - if declare -f mq_ai_prompt_ask >/dev/null; then - echo "Copying an /ask prompt for this unknown command..." - mq_ai_prompt_ask "Vad betyder kommandot '$cmd $*' i mqlaunch, och finns det ett liknande kommando?" - return 0 - fi - - show_help - exit 1 - ;; - esac -} - -# --- Entry -------------------------------------------------- -if [[ $# -gt 0 ]]; then - # Atlas REPL — intercept before dispatch to avoid ai-mode.sh routing - case "${1:l}" in - atlas) - shift - mq_ai_run_atlas "$@" - exit 0 - ;; - esac - - if dispatch_cli_command "$@"; then - exit 0 - else - cmd_status=$? - if [[ $cmd_status -eq 2 ]]; then - exit 2 - fi - fi - - if [[ "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" == "menu" ]]; then - main_loop - else - run_arg_command "$@" - fi -else - main_loop -fi diff --git a/backups/scripts/20260509-030842/bootstrap.sh b/backups/scripts/20260509-030842/bootstrap.sh deleted file mode 100644 index 0f63d48..0000000 --- a/backups/scripts/20260509-030842/bootstrap.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -REPO_URL="${REPO_URL:-https://github.com/MCamner/macos-scripts.git}" -BRANCH="${BRANCH:-main}" -INSTALL_DIR="${INSTALL_DIR:-$HOME/macos-scripts}" - -log() { printf "\033[1;34m[INFO]\033[0m %s\n" "$*"; } -ok() { printf "\033[1;32m[ OK ]\033[0m %s\n" "$*"; } -warn() { printf "\033[1;33m[WARN]\033[0m %s\n" "$*" >&2; } -err() { printf "\033[1;31m[ERR ]\033[0m %s\n" "$*" >&2; } -die() { err "$*"; exit 1; } - -require_cmd() { - command -v "$1" >/dev/null 2>&1 || die "Missing required command: $1" -} - -main() { - require_cmd git - require_cmd bash - - log "Installing macos-scripts" - log "Repository: $REPO_URL" - log "Branch: $BRANCH" - log "Target: $INSTALL_DIR" - - if [[ -d "$INSTALL_DIR/.git" ]]; then - log "Existing git checkout found. Updating..." - git -C "$INSTALL_DIR" fetch origin "$BRANCH" - git -C "$INSTALL_DIR" checkout "$BRANCH" - git -C "$INSTALL_DIR" pull --ff-only origin "$BRANCH" - else - if [[ -e "$INSTALL_DIR" ]]; then - die "Target path exists but is not a git repo: $INSTALL_DIR" - fi - - log "Cloning repository..." - git clone --branch "$BRANCH" --depth 1 "$REPO_URL" "$INSTALL_DIR" - fi - - log "Running local installer..." - bash "$INSTALL_DIR/install.sh" --install-dir "$INSTALL_DIR" --yes - - ok "macos-scripts installed" - printf '\nRun:\n mqlaunch\n' -} - -main "$@" diff --git a/backups/scripts/20260509-030842/install.sh b/backups/scripts/20260509-030842/install.sh deleted file mode 100755 index a4347cc..0000000 --- a/backups/scripts/20260509-030842/install.sh +++ /dev/null @@ -1,344 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$SCRIPT_DIR" - -DEFAULT_INSTALL_DIR="$PROJECT_ROOT" -INSTALL_DIR="$DEFAULT_INSTALL_DIR" -BIN_DIR="/usr/local/bin" -STATE_DIR="${HOME}/.local/state/macos-scripts" -STATE_FILE="${STATE_DIR}/install-state.env" -MANAGED_BEGIN="# >>> macos-scripts >>>" -MANAGED_END="# <<< macos-scripts <<<" - -DRY_RUN=0 -UNINSTALL=0 -AUTO_YES=0 - -LAUNCHER_REL="terminal/launchers/mqlaunch.sh" -ONBOARDING_REL="tools/onboarding.sh" -TARGET_LINK_NAME="mqlaunch" - -log() { printf "\033[1;34m[INFO]\033[0m %s\n" "$*"; } -ok() { printf "\033[1;32m[ OK ]\033[0m %s\n" "$*"; } -warn() { printf "\033[1;33m[WARN]\033[0m %s\n" "$*" >&2; } -err() { printf "\033[1;31m[ERR ]\033[0m %s\n" "$*" >&2; } -die() { err "$*"; exit 1; } - -usage() { - cat </dev/null 2>&1 || die "Missing required command: $1" -} - -realpath_fallback() { - python3 - <<'PY' "$1" -import os, sys -print(os.path.realpath(sys.argv[1])) -PY -} - -abs_path() { - local p="$1" - if command -v realpath >/dev/null 2>&1; then - realpath "$p" - else - realpath_fallback "$p" - fi -} - -run_cmd() { - if (( DRY_RUN )); then - printf '[dry-run] ' - printf '%q ' "$@" - printf '\n' - else - "$@" - fi -} - -confirm() { - local prompt="${1:-Continue? [y/N]}" - if (( AUTO_YES )); then - return 0 - fi - read -r -p "$prompt " reply - [[ "$reply" =~ ^[Yy]([Ee][Ss])?$ ]] -} - -ensure_repo_layout() { - [[ -f "$INSTALL_DIR/$LAUNCHER_REL" ]] || \ - die "Missing $LAUNCHER_REL under $INSTALL_DIR. Run from a full repo checkout or use bootstrap.sh." - [[ -f "$INSTALL_DIR/$ONBOARDING_REL" ]] || \ - warn "Missing $ONBOARDING_REL under $INSTALL_DIR. Onboarding step will be skipped." -} - -ensure_dirs() { - run_cmd mkdir -p "$STATE_DIR" -} - -target_launcher() { - printf '%s\n' "$INSTALL_DIR/$LAUNCHER_REL" -} - -target_link() { - printf '%s\n' "$BIN_DIR/$TARGET_LINK_NAME" -} - -shell_rc_file() { - if [[ -n "${ZDOTDIR:-}" ]]; then - printf '%s\n' "$ZDOTDIR/.zshrc" - else - printf '%s\n' "$HOME/.zshrc" - fi -} - -write_state() { - local launcher_path link_path - launcher_path="$(target_launcher)" - link_path="$(target_link)" - - if (( DRY_RUN )); then - log "Would write install state to $STATE_FILE" - return 0 - fi - - cat > "$STATE_FILE" </dev/null || true)" == "$(abs_path "$launcher_path")" ]]; then - ok "Symlink already correct: $link_path" - return 0 - fi - - if ! confirm "Replace existing $link_path ? [y/N]"; then - die "Aborted" - fi - - run_cmd rm -f "$link_path" - fi - - run_cmd ln -s "$launcher_path" "$link_path" - ok "Installed symlink: $link_path -> $launcher_path" -} - -managed_block_content() { - local install_dir_escaped - install_dir_escaped="$INSTALL_DIR" - - cat < "$tmp_file" - - if (( DRY_RUN )); then - log "Would remove managed shell block from $rc_file" - rm -f "$tmp_file" - else - mv "$tmp_file" "$rc_file" - ok "Removed managed shell block from $rc_file" - fi -} - -append_managed_block() { - local rc_file - rc_file="$(shell_rc_file)" - - if [[ ! -f "$rc_file" ]]; then - if (( DRY_RUN )); then - log "Would create shell rc file: $rc_file" - else - : > "$rc_file" - fi - fi - - remove_managed_block - - if (( DRY_RUN )); then - log "Would append managed shell block to $rc_file" - else - { - printf '\n' - managed_block_content - printf '\n' - } >> "$rc_file" - ok "Updated shell config: $rc_file" - fi -} - -run_onboarding_if_present() { - local onboarding="$INSTALL_DIR/$ONBOARDING_REL" - if [[ -x "$onboarding" ]]; then - if (( DRY_RUN )); then - log "Would run onboarding: $onboarding" - else - "$onboarding" || warn "Onboarding returned non-zero status" - fi - else - warn "Onboarding script not executable or missing: $onboarding" - fi -} - -do_install() { - ensure_repo_layout - ensure_dirs - - log "Install dir: $INSTALL_DIR" - log "Bin dir: $BIN_DIR" - - install_symlink - append_managed_block - write_state - run_onboarding_if_present - - ok "Installation complete" - printf '\nNext steps:\n' - printf ' source "%s"\n' "$(shell_rc_file)" - printf ' mqlaunch\n' -} - -remove_symlink() { - local link_path - link_path="${TARGET_LINK:-$(target_link)}" - - if [[ -L "$link_path" || -e "$link_path" ]]; then - run_cmd rm -f "$link_path" - ok "Removed: $link_path" - else - warn "Nothing to remove at: $link_path" - fi -} - -remove_state() { - if [[ -f "$STATE_FILE" ]]; then - run_cmd rm -f "$STATE_FILE" - ok "Removed state file" - fi -} - -do_uninstall() { - read_state_if_present - remove_symlink - remove_managed_block - remove_state - ok "Uninstall complete" -} - -parse_args() { - while [[ $# -gt 0 ]]; do - case "$1" in - --install-dir) - [[ $# -ge 2 ]] || die "Missing value for --install-dir" - INSTALL_DIR="$2" - shift 2 - ;; - --bin-dir) - [[ $# -ge 2 ]] || die "Missing value for --bin-dir" - BIN_DIR="$2" - shift 2 - ;; - --dry-run) - DRY_RUN=1 - shift - ;; - --uninstall) - UNINSTALL=1 - shift - ;; - --yes) - AUTO_YES=1 - shift - ;; - -h|--help) - usage - exit 0 - ;; - *) - die "Unknown argument: $1" - ;; - esac - done -} - -main() { - require_cmd bash - require_cmd mkdir - require_cmd ln - require_cmd rm - require_cmd awk - - parse_args "$@" - - INSTALL_DIR="$(abs_path "$INSTALL_DIR")" - BIN_DIR="$(abs_path "$BIN_DIR")" - - if (( UNINSTALL )); then - do_uninstall - else - do_install - fi -} - -main "$@" diff --git a/backups/scripts/20260509-030842/release.sh b/backups/scripts/20260509-030842/release.sh deleted file mode 100755 index 0b29291..0000000 --- a/backups/scripts/20260509-030842/release.sh +++ /dev/null @@ -1,307 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -DRY_RUN=false -GITHUB_RELEASE=false -INIT_CHANGELOG=false -VERSION="" - -VERSION_FILE="VERSION" -README_FILE="README.md" -CHANGELOG_FILE="CHANGELOG.md" - -ORIG_VERSION_CONTENT="" -ORIG_README_CONTENT="" - -show_usage() { - cat <<'USAGE' -Usage: - ./release.sh [--dry-run] [--github-release] [--init-changelog] - -Examples: - ./release.sh 0.1.2 - ./release.sh --dry-run 0.1.2 - ./release.sh --github-release 0.1.2 - ./release.sh --init-changelog 0.1.2 - -What it does: - 1. Verifies git working tree is clean - 2. Verifies required files exist - 3. Syncs with origin/main for live releases - 4. Verifies tag v does not already exist - 5. Updates VERSION - 6. Updates README version badge when present - 7. Verifies CHANGELOG.md contains the version - 8. Shows a diff preview - 9. Creates a release commit - 10. Creates annotated tag v - 11. Pushes main and the new tag to origin - 12. Optionally creates a GitHub Release via gh CLI - -Special mode: - --init-changelog - Creates a changelog template for the requested version at the top of - CHANGELOG.md, then exits without commit/tag/push. - -Safety: - - --dry-run performs local checks and file updates, shows the diff, - then rolls changes back and exits without fetch/commit/tag/push. - - If the script aborts before commit, VERSION and README.md are restored. -USAGE -} - -log_step() { - printf '==> %s\n' "$1" -} - -error() { - printf 'ERROR: %s\n' "$1" >&2 -} - -rollback_local_changes() { - local rolled_back=false - - if [[ -n "${ORIG_VERSION_CONTENT}" && -f "${VERSION_FILE}" ]]; then - printf '%s' "${ORIG_VERSION_CONTENT}" > "${VERSION_FILE}" - rolled_back=true - fi - - if [[ -n "${ORIG_README_CONTENT}" && -f "${README_FILE}" ]]; then - printf '%s' "${ORIG_README_CONTENT}" > "${README_FILE}" - rolled_back=true - fi - - if [[ "${rolled_back}" == true ]]; then - log_step "Rolled back local file changes" - fi -} - -on_error() { - error "Release command failed with exit code: $?" - rollback_local_changes || true -} - -trap on_error ERR - -require_clean_tree() { - if ! git diff --quiet || ! git diff --cached --quiet; then - error "Git working tree is not clean. Commit or stash changes first." - exit 1 - fi - - if [[ -n "$(git ls-files --others --exclude-standard)" ]]; then - error "Untracked files detected. Commit, remove, or ignore them first." - exit 1 - fi -} - -require_file() { - local file="$1" - [[ -f "$file" ]] || { error "Required file missing: $file"; exit 1; } -} - -require_changelog_version() { - local version="$1" - - if ! grep -Eq "^\## \[${version}\]" "${CHANGELOG_FILE}"; then - error "${CHANGELOG_FILE} does not appear to contain a section for version ${version}" - exit 1 - fi -} - -update_version_file() { - local version="$1" - log_step "Updating VERSION -> ${version}" - ORIG_VERSION_CONTENT="$(cat "${VERSION_FILE}")" - printf '%s\n' "${version}" > "${VERSION_FILE}" -} - -update_readme_badge() { - local version="$1" - - ORIG_README_CONTENT="$(cat "${README_FILE}")" - - if grep -Eq 'badge/version-[0-9]+\.[0-9]+\.[0-9]+' "${README_FILE}"; then - log_step "Updating README version badge -> ${version}" - perl -0pi -e "s/badge\/version-[0-9]+\.[0-9]+\.[0-9]+/badge\/version-${version}/g" "${README_FILE}" - else - log_step "Updating README version badge -> ${version}" - printf 'README version badge not found; skipping\n' - fi -} - -init_changelog_section() { - local version="$1" - local today tmp_file - today="$(date +%F)" - - require_file "${CHANGELOG_FILE}" - - if grep -Eq "^\## \[${version}\]" "${CHANGELOG_FILE}"; then - printf 'CHANGELOG already contains version %s\n' "${version}" - return 0 - fi - - tmp_file="$(mktemp)" - - { - printf '## [%s] - %s\n\n' "${version}" "${today}" - printf '### Added\n' - printf -- '- \n\n' - printf '### Changed\n' - printf -- '- \n\n' - printf '### Fixed\n' - printf -- '- \n\n' - cat "${CHANGELOG_FILE}" - } > "${tmp_file}" - - mv "${tmp_file}" "${CHANGELOG_FILE}" - printf 'Initialized CHANGELOG.md template for version %s\n' "${version}" -} - -print_summary() { - local tag="v${VERSION}" - - cat </dev/null 2>&1 || { - error "gh CLI is required for --github-release" - exit 1 - } - - gh release create "${tag}" \ - --title "${tag}" \ - --notes-file "${CHANGELOG_FILE}" -} - -while [[ $# -gt 0 ]]; do - case "$1" in - --dry-run) - DRY_RUN=true - shift - ;; - --github-release) - GITHUB_RELEASE=true - shift - ;; - --init-changelog) - INIT_CHANGELOG=true - shift - ;; - -h|--help) - show_usage - exit 0 - ;; - -*) - error "Unknown option: $1" - show_usage - exit 1 - ;; - *) - if [[ -n "${VERSION}" ]]; then - error "Only one version argument is allowed." - show_usage - exit 1 - fi - VERSION="$1" - shift - ;; - esac -done - -if [[ -z "${VERSION}" ]]; then - show_usage - printf '\nRelease aborted.\n' - exit 1 -fi - -require_file "${VERSION_FILE}" -require_file "${README_FILE}" -require_file "${CHANGELOG_FILE}" - -if [[ "${INIT_CHANGELOG}" == true ]]; then - init_changelog_section "${VERSION}" - exit 0 -fi - -require_clean_tree - -print_summary -printf '\n' - -if [[ "${DRY_RUN}" == false ]]; then - log_step "Syncing with origin/main" - git fetch origin main - git checkout main >/dev/null 2>&1 || true - git pull --ff-only origin main -fi - -if git rev-parse "v${VERSION}" >/dev/null 2>&1; then - error "Tag v${VERSION} already exists locally." - exit 1 -fi - -if git ls-remote --tags origin | grep -q "refs/tags/v${VERSION}$"; then - error "Tag v${VERSION} already exists on origin." - exit 1 -fi - -update_version_file "${VERSION}" -update_readme_badge "${VERSION}" - -log_step "Verifying CHANGELOG contains version ${VERSION}" -require_changelog_version "${VERSION}" - -log_step "Showing diff preview" -git --no-pager diff -- "${VERSION_FILE}" "${README_FILE}" "${CHANGELOG_FILE}" || true - -if [[ "${DRY_RUN}" == true ]]; then - printf '\nDry run complete. No commit, tag, or push performed.\n' - rollback_local_changes - exit 0 -fi - -log_step "Creating release commit and tag" -create_release_commit_and_tag "${VERSION}" - -log_step "Pushing main and tag" -push_release "${VERSION}" - -if [[ "${GITHUB_RELEASE}" == true ]]; then - log_step "Creating GitHub release" - create_github_release "${VERSION}" -fi - -trap - ERR -printf '\nRelease completed successfully.\n' diff --git a/backups/scripts/20260509-030842/system/tweaks/macos-tweaks.sh b/backups/scripts/20260509-030842/system/tweaks/macos-tweaks.sh deleted file mode 100755 index 86bba07..0000000 --- a/backups/scripts/20260509-030842/system/tweaks/macos-tweaks.sh +++ /dev/null @@ -1,482 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_NAME="$(basename "$0")" -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -BACKUP_DIR="${HOME}/.macos-tweaks-backup" -TIMESTAMP="$(date +%Y%m%d-%H%M%S)" -BACKUP_FILE="${BACKUP_DIR}/backup-${TIMESTAMP}.txt" - -DRY_RUN=0 -VERBOSE=0 -COMMAND="menu" - -APP_TITLE="macOS Tweaks Utility" -APP_SUBTITLE="MQLaunch Module" -APP_AUTHOR="Author Mattias Camner" - -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - - -C_RESET='\033[0m' -C_BOLD='\033[1m' -C_DIM='\033[2m' -C_RED='\033[31m' -C_GREEN='\033[32m' -C_YELLOW='\033[33m' -C_BLUE='\033[34m' -C_CYAN='\033[36m' - -log() { printf "%b%s%b\n" "$C_BLUE" "$1" "$C_RESET"; } -ok() { printf "%b%s%b\n" "$C_GREEN" "$1" "$C_RESET"; } -warn() { printf "%b%s%b\n" "$C_YELLOW" "$1" "$C_RESET"; } -err() { printf "%b%s%b\n" "$C_RED" "$1" "$C_RESET" >&2; } - - -usage() { - cat </dev/null || true -} - -print_pref() { - local label="$1" - local domain="$2" - local key="$3" - local value - value="$(read_pref "$domain" "$key")" - [[ -z "$value" ]] && value="__UNSET__" - printf " %-28s %s\n" "$label" "$value" -} - -backup_pref() { - local domain="$1" - local key="$2" - local value - value="$(defaults read "$domain" "$key" 2>/dev/null || echo "__UNSET__")" - printf "%s\t%s\t%s\n" "$domain" "$key" "$value" >> "$BACKUP_FILE" -} - -backup_selected() { - ensure_backup_dir - : > "$BACKUP_FILE" - - log "Creating backup: $BACKUP_FILE" - - backup_pref "com.apple.dock" "autohide" - backup_pref "com.apple.dock" "autohide-delay" - backup_pref "com.apple.dock" "autohide-time-modifier" - backup_pref "com.apple.dock" "show-recents" - backup_pref "com.apple.dock" "tilesize" - backup_pref "com.apple.dock" "mineffect" - backup_pref "com.apple.dock" "minimize-to-application" - backup_pref "com.apple.dock" "showhidden" - - backup_pref "com.apple.finder" "AppleShowAllFiles" - backup_pref "com.apple.finder" "ShowPathbar" - backup_pref "com.apple.finder" "ShowStatusBar" - backup_pref "com.apple.finder" "FXPreferredViewStyle" - backup_pref "com.apple.finder" "_FXSortFoldersFirst" - backup_pref "com.apple.finder" "FXEnableExtensionChangeWarning" - - backup_pref "NSGlobalDomain" "AppleShowAllExtensions" - backup_pref "NSGlobalDomain" "KeyRepeat" - backup_pref "NSGlobalDomain" "InitialKeyRepeat" - - backup_pref "com.apple.desktopservices" "DSDontWriteNetworkStores" - backup_pref "com.apple.desktopservices" "DSDontWriteUSBStores" - - backup_pref "com.apple.screencapture" "location" - backup_pref "com.apple.screencapture" "type" - - backup_pref "com.apple.screensaver" "askForPassword" - backup_pref "com.apple.screensaver" "askForPasswordDelay" - - backup_pref "com.apple.AdLib" "allowApplePersonalizedAdvertising" - - ok "Backup saved." -} - -latest_backup() { - ls -t "$BACKUP_DIR"/backup-*.txt 2>/dev/null | head -n 1 || true -} - -show_latest_backup() { - local latest - latest="$(latest_backup)" - if [[ -z "$latest" ]]; then - warn "No backup file found." - return 1 - fi - printf "%s\n" "$latest" -} - -revert_from_file() { - local file="$1" - - [[ -f "$file" ]] || { err "Backup file not found: $file"; return 1; } - - log "Reverting from backup: $file" - - while IFS=$'\t' read -r domain key value; do - [[ -z "${domain:-}" || -z "${key:-}" ]] && continue - - if [[ "$value" == "__UNSET__" ]]; then - run_cmd "defaults delete \"$domain\" \"$key\" >/dev/null 2>&1 || true" - continue - fi - - case "$value" in - true|false) - run_cmd "defaults write \"$domain\" \"$key\" -bool \"$value\"" - ;; - ''|*[!0-9.-]*) - run_cmd "defaults write \"$domain\" \"$key\" -string \"$value\"" - ;; - *) - if [[ "$value" == *.* ]]; then - run_cmd "defaults write \"$domain\" \"$key\" -float \"$value\"" - else - run_cmd "defaults write \"$domain\" \"$key\" -int \"$value\"" - fi - ;; - esac - done < "$file" - - restart_affected_apps - ok "Revert complete." -} - -revert_latest() { - local latest - latest="$(latest_backup)" - if [[ -z "$latest" ]]; then - warn "No backup file found." - return 1 - fi - revert_from_file "$latest" -} - -restart_affected_apps() { - log "Restarting affected apps..." - run_cmd "killall Dock >/dev/null 2>&1 || true" - run_cmd "killall Finder >/dev/null 2>&1 || true" - run_cmd "killall SystemUIServer >/dev/null 2>&1 || true" - ok "Done." -} - -apply_dev_tweaks() { - log "${C_BOLD}Applying developer tweaks...${C_RESET}" - - run_cmd 'defaults write com.apple.finder AppleShowAllFiles -bool true' - run_cmd 'defaults write NSGlobalDomain AppleShowAllExtensions -bool true' - run_cmd 'defaults write com.apple.finder ShowPathbar -bool true' - run_cmd 'defaults write com.apple.finder ShowStatusBar -bool true' - run_cmd 'defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"' - - run_cmd 'defaults write NSGlobalDomain KeyRepeat -int 2' - run_cmd 'defaults write NSGlobalDomain InitialKeyRepeat -int 15' - - run_cmd 'defaults write com.apple.dock show-recents -bool false' - run_cmd 'defaults write com.apple.dock autohide -bool true' - run_cmd 'defaults write com.apple.dock autohide-delay -float 0' - run_cmd 'defaults write com.apple.dock autohide-time-modifier -float 0.15' - run_cmd 'defaults write com.apple.dock tilesize -int 36' - - ok "Developer tweaks applied." -} - -apply_clean_tweaks() { - log "${C_BOLD}Applying clean UI tweaks...${C_RESET}" - - run_cmd 'defaults write com.apple.dock mineffect -string "scale"' - run_cmd 'defaults write com.apple.dock minimize-to-application -bool true' - run_cmd 'defaults write com.apple.dock showhidden -bool true' - - run_cmd 'defaults write com.apple.finder _FXSortFoldersFirst -bool true' - run_cmd 'defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false' - - run_cmd 'defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true' - run_cmd 'defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true' - - ok "Clean tweaks applied." -} - -apply_fast_tweaks() { - log "${C_BOLD}Applying speed/productivity tweaks...${C_RESET}" - - run_cmd 'defaults write com.apple.AdLib allowApplePersonalizedAdvertising -bool false' - run_cmd 'defaults write com.apple.screensaver askForPassword -int 1' - run_cmd 'defaults write com.apple.screensaver askForPasswordDelay -int 0' - run_cmd 'mkdir -p "${HOME}/Screenshots"' - run_cmd 'defaults write com.apple.screencapture location -string "${HOME}/Screenshots"' - run_cmd 'defaults write com.apple.screencapture type -string "png"' - - ok "Fast tweaks applied." -} - -apply_workstation_tweaks() { - log "${C_BOLD}Applying workstation profile...${C_RESET}" - - run_cmd 'defaults write com.apple.finder ShowPathbar -bool true' - run_cmd 'defaults write com.apple.finder ShowStatusBar -bool true' - run_cmd 'defaults write NSGlobalDomain AppleShowAllExtensions -bool true' - run_cmd 'defaults write com.apple.finder _FXSortFoldersFirst -bool true' - - run_cmd 'defaults write com.apple.dock autohide -bool true' - run_cmd 'defaults write com.apple.dock show-recents -bool false' - run_cmd 'defaults write com.apple.dock tilesize -int 42' - run_cmd 'defaults write com.apple.dock minimize-to-application -bool true' - - run_cmd 'defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true' - run_cmd 'defaults write com.apple.screensaver askForPassword -int 1' - run_cmd 'defaults write com.apple.screensaver askForPasswordDelay -int 0' - - ok "Workstation tweaks applied." -} - -show_status() { - print_header - row_bold "TWEAKS STATUS" - printf '\n' - - print_pref "Dock autohide" "com.apple.dock" "autohide" - print_pref "Dock show recents" "com.apple.dock" "show-recents" - print_pref "Dock tile size" "com.apple.dock" "tilesize" - print_pref "Dock minimize effect" "com.apple.dock" "mineffect" - print_pref "Dock minimize to app" "com.apple.dock" "minimize-to-application" - print_pref "Dock hidden translucency" "com.apple.dock" "showhidden" - - print_pref "Finder show hidden files" "com.apple.finder" "AppleShowAllFiles" - print_pref "Finder show path bar" "com.apple.finder" "ShowPathbar" - print_pref "Finder show status bar" "com.apple.finder" "ShowStatusBar" - print_pref "Finder folders first" "com.apple.finder" "_FXSortFoldersFirst" - - print_pref "Show all extensions" "NSGlobalDomain" "AppleShowAllExtensions" - print_pref "Key repeat" "NSGlobalDomain" "KeyRepeat" - print_pref "Initial key repeat" "NSGlobalDomain" "InitialKeyRepeat" - - print_pref "No .DS_Store on network" "com.apple.desktopservices" "DSDontWriteNetworkStores" - print_pref "No .DS_Store on USB" "com.apple.desktopservices" "DSDontWriteUSBStores" - - print_pref "Screenshot location" "com.apple.screencapture" "location" - print_pref "Screenshot type" "com.apple.screencapture" "type" - - print_pref "Require password after saver" "com.apple.screensaver" "askForPassword" - print_pref "Password delay" "com.apple.screensaver" "askForPasswordDelay" - - print_pref "Personalized ads" "com.apple.AdLib" "allowApplePersonalizedAdvertising" - - print_footer -} - -print_tweaks_menu() { - print_header - row_bold "TWEAKS MENU" - printf '\n' - - row2 " 1. Status" " 2. Backup current values" - row2 " 3. Apply developer tweaks" " 4. Apply clean tweaks" - row2 " 5. Apply fast tweaks" " 6. Apply workstation profile" - row2 " 7. Apply all tweaks" " 8. Revert latest backup" - row2 " 9. Show latest backup path" " 0. Exit" - - print_footer - printf "${C_BLUE}Select option [0-9]: ${C_RESET}" -} - -interactive_menu() { - while true; do - print_tweaks_menu - read -r choice - echo - - case "$choice" in - 1) - show_status - pause_enter - ;; - 2) - backup_selected - pause_enter - ;; - 3) - backup_selected - apply_dev_tweaks - restart_affected_apps - pause_enter - ;; - 4) - backup_selected - apply_clean_tweaks - restart_affected_apps - pause_enter - ;; - 5) - backup_selected - apply_fast_tweaks - restart_affected_apps - pause_enter - ;; - 6) - backup_selected - apply_workstation_tweaks - restart_affected_apps - pause_enter - ;; - 7) - backup_selected - apply_dev_tweaks - apply_clean_tweaks - apply_fast_tweaks - restart_affected_apps - pause_enter - ;; - 8) - revert_latest - pause_enter - ;; - 9) - show_latest_backup - pause_enter - ;; - 0) - ok "Exiting." - break - ;; - *) - err "Invalid option." - pause_enter - ;; - esac - done -} - -parse_args() { - while [[ $# -gt 0 ]]; do - case "$1" in - menu|status|backup|revert-latest|dev|clean|fast|workstation|all) - COMMAND="$1" - shift - ;; - --dry-run) - DRY_RUN=1 - shift - ;; - -v|--verbose) - VERBOSE=1 - shift - ;; - -h|--help) - usage - exit 0 - ;; - *) - err "Unknown argument: $1" - usage - exit 1 - ;; - esac - done -} - -main() { - ensure_backup_dir - parse_args "$@" - - case "$COMMAND" in - menu) - interactive_menu - ;; - status) - show_status - ;; - backup) - backup_selected - ;; - revert-latest) - revert_latest - ;; - dev) - backup_selected - apply_dev_tweaks - restart_affected_apps - ;; - clean) - backup_selected - apply_clean_tweaks - restart_affected_apps - ;; - fast) - backup_selected - apply_fast_tweaks - restart_affected_apps - ;; - workstation) - backup_selected - apply_workstation_tweaks - restart_affected_apps - ;; - all) - backup_selected - apply_dev_tweaks - apply_clean_tweaks - apply_fast_tweaks - restart_affected_apps - ;; - *) - err "Unknown command." - usage - exit 1 - ;; - esac -} - -main "$@" diff --git a/backups/scripts/20260509-030842/terminal/ai-prompts/mq-ai-prompts.sh b/backups/scripts/20260509-030842/terminal/ai-prompts/mq-ai-prompts.sh deleted file mode 100755 index e355223..0000000 --- a/backups/scripts/20260509-030842/terminal/ai-prompts/mq-ai-prompts.sh +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bin/env bash - -mq_ai_copy_prompt() { - local name="$1" - local prompt="$2" - - if ! command -v pbcopy >/dev/null 2>&1; then - echo "pbcopy missing." - return 1 - fi - - printf '%s\n' "$prompt" | pbcopy - echo "Copied $name prompt to clipboard." - echo "→ Paste in ChatGPT with Cmd+V, then press Enter." -} - -mq_ai_open_chatgpt() { - open "https://chatgpt.com/" >/dev/null 2>&1 || true -} - -mq_ai_prompt_review() { - local prompt - prompt="$(cat <<'PROMPT' -Use repo-product-auditor. - -You are auditing this repository as a product, not only reviewing a diff. - -Focus on the highest-signal product and repo issues first: -- broken or confusing workflows -- unclear command names, prompts, or UX -- mismatches between intent, docs, and implementation -- missing verification for important user paths -- correctness, regression, security, or data-loss risks - -Lead with findings, ordered by severity. Include file/line references when available. -Recommend concrete fixes. Keep summaries brief and avoid theory unless it directly supports a practical next step. -PROMPT -)" - mq_ai_copy_prompt "/review" "$prompt" - mq_ai_open_chatgpt -} - -mq_ai_prompt_ui() { - local prompt - prompt="$(cat <<'PROMPT' -Use terminal-ui-polisher. - -You are improving a terminal UI, CLI, or TUI experience for mqlaunch. - -Prioritize: -- clear command hierarchy -- discoverable terminal actions -- readable labels and help text -- consistent spacing, prompts, and states -- keyboard-friendly flows -- practical, polished CLI/TUI interactions - -Make the actual terminal workflow usable first. Keep decoration subordinate to clarity. -Verify that text fits in common terminal widths, commands are reachable, and output remains readable in light and dark themes. -PROMPT -)" - mq_ai_copy_prompt "/ui" "$prompt" - mq_ai_open_chatgpt -} - -mq_ai_prompt_atlas() { - cat <<'PROMPT' -You are Atlas — a senior systems engineer and macOS specialist embedded in mqlaunch. - -Your role: -- Diagnose failures, explain behavior, and suggest fixes for shell scripts, terminal workflows, and macOS system tasks. -- Answer questions about the macos-scripts repository and mqlaunch command hub. -- Provide concrete, runnable commands. Avoid vague theory. -- Keep answers short and direct unless asked to elaborate. -- If unsure, say so — do not invent behavior. -PROMPT -} - -mq_ai_repl_atlas() { - local system_prompt input - system_prompt="$(mq_ai_prompt_atlas)" - - echo "──────────────────── Atlas ────────────────────" - echo " Type your question. 'exit' to quit." - echo "───────────────────────────────────────────────" - echo - - while true; do - printf "atlas> " - read -r input || break - - [[ -z "$input" ]] && continue - - case "$input" in - exit|quit|q) - echo "Exiting Atlas." - break - ;; - esac - - BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - "$BASE_DIR/tools/scripts/ask.sh" "$system_prompt - -User request: -$input" - echo - done -} - -mq_ai_run_atlas() { - local user_input="$*" - - if [[ -z "$user_input" ]]; then - mq_ai_repl_atlas - return - fi - - local system_prompt - system_prompt="$(mq_ai_prompt_atlas)" - - BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - "$BASE_DIR/tools/scripts/ask.sh" "$system_prompt - -User request: -$user_input" -} - -mq_ai_prompt_ask() { - local question="$*" - local repo_root branch status_short prompt - - if [[ "${1:-}" == "quick" ]]; then - shift - question="$*" - - if [[ -z "$question" ]]; then - cat <<'HELP' -Usage: - mqlaunch ask quick "your question" - -Example: - mqlaunch ask quick "Hur dödar jag en process på macOS?" -HELP - return 0 - fi - - prompt="Answer briefly and practically. Prefer concrete commands when useful. - -Question: -$question" - - mq_ai_copy_prompt "/ask quick" "$prompt" - mq_ai_open_chatgpt - return 0 - fi - - repo_root="$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null || echo "$HOME/macos-scripts")" - branch="$(git -C "$repo_root" branch --show-current 2>/dev/null || echo "unknown")" - status_short="$(git -C "$repo_root" status --short 2>/dev/null | head -n 20 || true)" - - if [[ -z "$question" ]]; then - cat <<'HELP' -Usage: - mqlaunch ask "your question" - -Good questions: - mqlaunch ask "Förklara hur command routing fungerar i mqlaunch.sh" - mqlaunch ask "Hur felsöker jag att mqlaunch inte hittar ett kommando?" - mqlaunch ask "Vad gör safe_run_ai?" - mqlaunch ask "Hur förbättrar jag mqlaunch som CLI-produkt?" -HELP - return 0 - fi - - prompt="$(cat <&2 - exit 1 -fi - -if [[ -t 0 ]]; then - stty erase '^?' 2>/dev/null || true -fi - -BOX_INNER=88 - -# Main menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-main-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-main-menu.sh" -fi - -# Apps menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-apps-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-apps-menu.sh" -fi - -# System menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-system-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-system-menu.sh" -fi - -# Help center menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-center-menu.sh" -fi - -# Command mode module -if [[ -f "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/launchers/mqlaunch-command-mode.sh" -fi - -# AI prompts -if [[ -f "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" -fi - -# Dev menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-dev-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-dev-menu.sh" -fi - -# AI menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-ai-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-ai-menu.sh" -fi - -# Net menu module -if [[ -f "$BASE_DIR/terminal/menus/mq-net-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-net-menu.sh" -fi - -# Help/index module -if [[ -f "$BASE_DIR/terminal/menus/mq-help-menu.sh" ]]; then - # shellcheck disable=SC1091 - source "$BASE_DIR/terminal/menus/mq-help-menu.sh" -fi - -# Prints header. -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s -' "----------------------------------------------------------------------------------------" - fi - echo -} - -# --- Shared UI ------------------------------------------------ -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - } -} - -# Opens path. -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -# Opens folder screen. -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -# Resolves prompt dir. -resolve_prompt_dir() { - local candidate - for candidate in "$BASE_DIR/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -# Resolves ai status. -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -# Handles safe run ai. -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -# Runs git screen. -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -# Copies network info. -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -# Opens network settings. -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" -} - -# Pings test. -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -# Shows dns gateway. -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# --- Actions ------------------------------------------------ -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# Locks screen. -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -# Sleeps display. -sleep_display() { - pmset displaysleepnow -} - -# Restarts finder. -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -# Restarts mqlaunch by replacing the current process. -restart_mqlaunch() { - local target="${1:-menu}" - shift || true - - if [[ -x "$MQ_SCRIPT" ]]; then - exec "$MQ_SCRIPT" "$target" "$@" - elif [[ -f "$MQ_SCRIPT" ]]; then - exec zsh "$MQ_SCRIPT" "$target" "$@" - fi - - echo "${C_ERR}mqlaunch script not found:${C_RESET} $MQ_SCRIPT" - return 1 -} - -# Shows date time. -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -# Opens repo browser. -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" -} - -# Opens terminal guide. -open_terminal_guide() { - local html="$BASE_DIR/docs/mac-terminal-guide.html" - local readme="$BASE_DIR/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - echo "${C_ERR}No terminal guide file found.${C_RESET}" - pause_enter - return 1 - fi -} - -# Handles system check. -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$BASE_DIR/bin/mqlaunch" || "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -# Opens downloads folder. -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -# Opens home folder. -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -# Opens utilities folder. -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -# Opens applications folder. -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -# Opens ai prompts folder. -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -# Shows prompt files. -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -# Edits mqlaunch. -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -# Backs up prompts. -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -# Opens base dir. -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -# Opens launcher folder. -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -# Opens tweaks menu. -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -# Shows tweaks status. -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -# Runs tweaks workstation. -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -# Runs tweaks dev. -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -# Runs tweaks clean. -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -# Runs tweaks fast. -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -# Runs tweaks all. -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -# Reverts tweaks latest. -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -# Backs up mqlaunch. -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -# Handles theme cmd. -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -# Handles theme current variant. -theme_current_variant() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Eq '^export MQ_ZSH_VARIANT=' "$zshrc" 2>/dev/null; then - grep -E '^export MQ_ZSH_VARIANT=' "$zshrc" | tail -n 1 | sed -E 's/^export MQ_ZSH_VARIANT="?([^"]+)"?/\1/' - else - echo "not-set" - fi -} - -# Handles theme source state. -theme_source_state() { - local zshrc="$HOME/.zshrc" - - if [[ -f "$zshrc" ]] && grep -Fq 'source "$HOME/macos-scripts/terminal/themes/mq-zsh-theme-v3.zsh"' "$zshrc" 2>/dev/null; then - echo "PRESENT" - else - echo "MISSING" - fi -} - -# Prints themes menu. -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Apply macos" - row2 " 7. Reset theme" " b. Back" - - print_footer -} - -# Handles themes menu loop. -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read_menu_choice "Select theme option [1-7,b] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd apply macos ;; - 7) theme_cmd reset ;; - b|B|0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -# Opens git menu. -open_git_menu() { - local repo_arg="${1:-}" - local git_script="$BASE_DIR/terminal/launchers/gitlaunch.sh" - local git_path="" - - if [[ -n "$repo_arg" ]]; then - git_path="$repo_arg" - else - git_path="$(pwd)" - fi - - if [[ -x "$git_script" ]]; then - MQ_GIT_REPO="$git_path" "$git_script" - elif [[ -f "$git_script" ]]; then - MQ_GIT_REPO="$git_path" zsh "$git_script" - else - print_header - row "GIT MENU" - empty_row - row "Git menu not found:" - row " $git_script" - print_footer - pause_enter - fi -} - -# Opens release menu. -open_release_menu() { - local release_menu="$BASE_DIR/terminal/menus/mq-release-menu.sh" - if [[ -x "$release_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$release_menu" menu - elif [[ -f "$release_menu" ]]; then - chmod +x "$release_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$release_menu" menu - else - print_header - row "RELEASE MENU" - empty_row - row "Release menu not found:" - row " $release_menu" - print_footer - pause_enter - fi -} - -# Runs mqworkflows. -run_mqworkflows() { - local workflows_menu="$BASE_DIR/terminal/menus/mq-workflows-menu.sh" - - if [[ -x "$workflows_menu" ]]; then - MQ_USE_DASHBOARD_HEADER=1 "$workflows_menu" "${@:-menu}" - elif [[ -f "$workflows_menu" ]]; then - chmod +x "$workflows_menu" 2>/dev/null || true - MQ_USE_DASHBOARD_HEADER=1 bash "$workflows_menu" "${@:-menu}" - else - print_header - row_bold "WORKFLOWS" - empty_row - row "Workflows menu not found:" - row " $workflows_menu" - print_footer - pause_enter - return 1 - fi -} - -# Opens tools menu. -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - local work_dir="$PWD" - - if [[ -x "$tools_script" ]]; then - MQ_WORK_DIR="$work_dir" MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - MQ_WORK_DIR="$work_dir" MQ_USE_DASHBOARD_HEADER=1 bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# Gets repo version. -get_repo_version() { - local version_file="$BASE_DIR/VERSION" - - if [[ -f "$version_file" ]]; then - head -n 1 "$version_file" - else - echo "unknown" - fi -} - -# Shows version info. -show_version_info() { - print_header - row_bold "VERSION INFO" - empty_row - - local version - version="$(get_repo_version)" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Shell: zsh" - row "Project root: $BASE_DIR" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - - print_footer - pause_enter -} - -# Runs self check. -run_self_check() { - print_header - row_bold "SELF-CHECK" - empty_row - - local check_script="$BASE_DIR/tools/scripts/test-all.sh" - - row "Running smoke checks..." - empty_row - - if [[ ! -x "$check_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $check_script" - print_footer - pause_enter - return 1 - fi - - "$check_script" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}All smoke checks passed.${C_RESET}" - else - echo "${C_ERR}Smoke checks failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -# Runs debug bundle. -run_debug_bundle() { - print_header - row_bold "DEBUG BUNDLE" - empty_row - - local bundle_script="$BASE_DIR/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - echo "${C_ERR}Missing or non-executable:${C_RESET} $bundle_script" - print_footer - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local rc=$? - - echo - if [[ $rc -eq 0 ]]; then - echo "${C_OK}Debug bundle created:${C_RESET}" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - echo "${C_ERR}Debug bundle failed.${C_RESET}" - fi - - print_footer - pause_enter - return $rc -} - -# Shows release notes. -show_release_notes() { - print_header - row_bold "RELEASE NOTES" - empty_row - - local changelog="$BASE_DIR/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - echo "${C_ERR}Missing:${C_RESET} $changelog" - print_footer - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - print_footer - pause_enter -} - -# Runs mqlogin. -run_mqlogin() { - local login_script="$BASE_DIR/automation/login/mqlogin.sh" - local login_menu="$BASE_DIR/terminal/menus/mq-login-menu.sh" - - if [[ $# -eq 0 && -x "$login_menu" ]]; then - "$login_menu" menu - return $? - fi - - if [[ ! -x "$login_script" ]]; then - print_header - row_bold "LOGIN BOOT" - empty_row - row "Missing or non-executable:" - row " $login_script" - row "Run:" - row " chmod +x $login_script" - print_footer - pause_enter - return 1 - fi - - "$login_script" "$@" -} - -# Runs mqshortcuts. -run_mqshortcuts() { - local shortcuts_script="$BASE_DIR/automation/shortcuts/mqshortcuts.sh" - local shortcuts_menu="$BASE_DIR/terminal/menus/mq-shortcuts-menu.sh" - - if [[ $# -eq 0 && -x "$shortcuts_menu" ]]; then - "$shortcuts_menu" menu - return $? - fi - - if [[ ! -x "$shortcuts_script" ]]; then - print_header - row_bold "SHORTCUTS" - empty_row - row "Missing or non-executable:" - row " $shortcuts_script" - row "Run:" - row " chmod +x $shortcuts_script" - print_footer - pause_enter - return 1 - fi - - "$shortcuts_script" "$@" -} - -# Shows about dashboard. -show_about_dashboard() { - print_header - row_bold "ABOUT / STATUS" - empty_row - - local version_file="$BASE_DIR/VERSION" - local version="unknown" - local repo_state="unknown" - local smoke_status="unknown" - local latest_bundle="none" - local guide_html="$BASE_DIR/docs/mac-terminal-guide.html" - local launcher="$BASE_DIR/terminal/launchers/mqlaunch.sh" - local main_menu="$BASE_DIR/terminal/menus/mq-main-menu.sh" - local help_menu="$BASE_DIR/terminal/menus/mq-help-menu.sh" - local bundle_dir="$BASE_DIR/backups/debug-bundles" - local test_script="$BASE_DIR/tools/scripts/test-all.sh" - - [[ -f "$version_file" ]] && version="$(head -n 1 "$version_file")" - - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - row "Project: macos-scripts" - row "Version: $version" - row "Release stage: baseline" - row "Repo state: $repo_state" - row "Smoke tests: $smoke_status" - row "Guide HTML: $guide_html" - row "Launcher: $launcher" - row "Main menu: $main_menu" - row "Help module: $help_menu" - row "Latest bundle: $latest_bundle" - row "Core menus: main / help / dev / ai / net" - - print_footer - pause_enter -} - -# Runs command palette. -run_command_palette() { - local fzf_bin selected selected_cmd - fzf_bin="$(command -v fzf 2>/dev/null || true)" - - if [[ -z "$fzf_bin" ]]; then - print_header - row_bold "COMMAND PALETTE" - empty_row - row "fzf is not installed." - row "Falling back to command index." - print_footer - pause_enter - show_command_index - return 0 - fi - - selected="$( - cat <<'EOF' | "$fzf_bin" --height=70% --layout=reverse --border --prompt='mqlaunch > ' --with-nth=2.. --delimiter=$'\t' --preview-window=hidden -main Open main menu -demo Run guided demo mode -git Open Git workspace -perf Open Performance module -dev Open Dev menu -tools Open Tools menu -workflows Open Project workflows menu -workflows boot Run project boot -release Open Release menu -login Open Login / Session menu -login menu Start full session boot -login about Start session about mode -login check Start session self-check mode -shortcuts Open Shortcuts menu -shortcuts list List shortcuts directly -shortcuts search clip Search shortcuts by name -version Show version information -about Show about / status dashboard -notes Show release notes -check Run self-check -bundle Create debug bundle -repo Open repo root in browser -hal Open HAL command menu -guide Open terminal guide -commands Show command index -EOF - )" - - [[ -n "$selected" ]] || return 0 - - selected_cmd="${selected%%$'\t'*}" - - case "$selected_cmd" in - main) - main_loop - ;; - *) - # shellcheck disable=SC2086 - run_arg_command ${=selected_cmd} - ;; - esac -} - -# Runs demo mode. -run_demo_mode() { - local delay version prompt_dir prompt_count repo_state load_line disk_line ip_addr battery_line active_cmd - local theme_variant theme_state - delay="${MQLAUNCH_DEMO_DELAY:-1}" - version="$(get_repo_version)" - prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - prompt_count=0 - load_line="$(uptime 2>/dev/null || echo "uptime unavailable")" - disk_line="$(df -h / 2>/dev/null | tail -1 || echo "disk usage unavailable")" - ip_addr="$(ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "Unavailable")" - battery_line="$(pmset -g batt 2>/dev/null | tail -1 || echo "Battery info unavailable")" - active_cmd="$(command -v mqlaunch 2>/dev/null || echo "$BIN_LINK")" - theme_variant="$(theme_current_variant)" - theme_state="$(theme_source_state)" - - if [[ -n "$prompt_dir" ]]; then - prompt_count="$(find "$prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if git -C "$BASE_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then - if git -C "$BASE_DIR" diff --quiet --ignore-submodules HEAD >/dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - else - repo_state="not-a-git-repo" - fi - - print_header - row_bold "DEMO MODE" - empty_row - row "A guided tour of the mqlaunch surface." - row "Press Enter to advance each step." - print_footer - pause_enter - - print_header - row_bold "STEP 1 / 5 — SYSTEM CHECK" - empty_row - row "[OK] Base dir: $BASE_DIR" - row "[OK] Active command: $active_cmd" - row "[OK] Repo state: $repo_state" - row "[OK] Prompt files: $prompt_count" - empty_row - row "Run anytime:" - row " mqlaunch doctor" - row " mqlaunch system check" - print_footer - pause_enter - - print_header - row_bold "STEP 2 / 5 — PERFORMANCE SNAPSHOT" - empty_row - row "Load: $load_line" - row "Disk /: $disk_line" - row "Network: $ip_addr" - row "Battery: $battery_line" - empty_row - row "Run anytime:" - row " mqlaunch perf" - row " mq scan" - print_footer - pause_enter - - print_header - row_bold "STEP 3 / 5 — THEME STATUS" - empty_row - row "Current theme: $theme_variant" - row "Theme source: $theme_state" - empty_row - row "Commands:" - row " mqlaunch theme open theme menu" - row " mqlaunch theme-macos apply macOS theme" - row " mqlaunch theme-reset reset to default" - print_footer - pause_enter - - print_header - row_bold "STEP 4 / 5 — VERSION" - empty_row - row "Project: macos-scripts" - row "Version: $version" - row "Launcher: $MQ_SCRIPT" - empty_row - row "Commands:" - row " mqlaunch version" - row " mqlaunch notes" - row " mqlaunch release" - print_footer - pause_enter - - print_header - row_bold "STEP 5 / 5 — WHAT TO TRY NEXT" - empty_row - row "WORKFLOWS" - row " mqlaunch system check" - row " mqlaunch dev" - row " mqlaunch workflows" - row " mqlaunch release" - empty_row - row "AI ASSISTANT" - row " mqlaunch ask \"what does doctor.sh check?\"" - row " mqlaunch atlas" - empty_row - row "RELEASE" - row " mqlaunch release-check" - row " mqlaunch release-notes" - print_footer - pause_enter - - row "Demo complete. Run mqlaunch to open the full menu." -} - -# Handles legacy alias notice. -legacy_alias_notice() { - local old_cmd="$1" - local new_cmd="$2" - print_header - row_bold "LEGACY ALIAS" - empty_row - row "Redirecting:" - row " $old_cmd" - row " -> $new_cmd" - print_footer -} - -# Handles tweaks menu loop. -tweaks_menu_loop() { - local tweaks_script="$BASE_DIR/system/tweaks/macos-tweaks.sh" - - if [[ -x "$tweaks_script" || -f "$tweaks_script" ]]; then - bash "$tweaks_script" menu || true - else - echo "${C_ERR}Tweaks script not found:${C_RESET} $tweaks_script" - pause_enter - return 1 - fi -} - -# Runs arg command. -run_arg_command() { - local cmd="${1:l}" - shift || true - - case "$cmd" in - finder) open_app "Finder" ;; - safari) open_app "Safari" ;; - chrome) open_app "Google Chrome" ;; - spotify) open_app "Spotify" ;; - xcode) open_app "Xcode" ;; - settings) open_app "System Settings" ;; - monitor) open_app "Activity Monitor" ;; - downloads) open_downloads_folder ;; - home) open_home_folder ;; - utilities) open_utilities_folder ;; - applications) open_applications_folder ;; - apps|hal|guide-ai|terminal-guide-ai) - if [[ -n "${1:-}" ]]; then - "$BASE_DIR/tools/scripts/hal-terminal-guide.sh" ask "$@" - else - "$BASE_DIR/tools/scripts/hal-terminal-guide.sh" - fi - ;; - ip|network) show_network_info ;; - lock) lock_screen ;; - sleep) sleep_display ;; - restart|reload|relaunch) restart_mqlaunch "$@" ;; - restart-finder|finder-restart) restart_finder ;; - date|time) show_date_time ;; - repo) open_repo_browser ;; - ai) open_ai_menu ;; - dev) open_dev_menu ;; - tweaks|tweak|tw) open_tweaks_menu ;; - tweaks-status) show_tweaks_status ;; - tweaks-workstation) run_tweaks_workstation ;; - tweaks-dev) run_tweaks_dev ;; - tweaks-clean) run_tweaks_clean ;; - tweaks-fast) run_tweaks_fast ;; - tweaks-all) run_tweaks_all ;; - tweaks-revert|revert-tweaks) revert_tweaks_latest ;; - dashboard|dash) open_dashboard ;; - theme|themes) themes_menu_loop ;; - theme-current) theme_cmd current ;; - theme-reset) theme_cmd reset ;; - theme-amber) theme_cmd apply amber ;; - theme-green) theme_cmd apply green ;; - theme-minimal) theme_cmd apply minimal ;; - theme-ice) theme_cmd apply ice ;; - theme-macos) theme_cmd apply macos ;; - release|rel) open_release_menu ;; - workflows|workflow|wf) run_mqworkflows "$@" ;; - git|git-menu|gitmenu|menu-git) open_git_menu "${1:-}" ;; - gitlaunch) - legacy_alias_notice "mqlaunch gitlaunch" "mqlaunch git" - open_git_menu "${1:-}" - ;; - login|boot|session) run_mqlogin "$@" ;; - shortcuts|shortcut|sc) run_mqshortcuts "$@" ;; - perf|performance) open_performance_menu ;; - demo) run_demo_mode ;; - version|ver|about) show_version_info ;; - ask) "$BASE_DIR/tools/scripts/ask.sh" "$@" ;; - fix) "$BASE_DIR/tools/scripts/fix.sh" "$@" ;; - nickname-set|nick-set|nick) - if [[ -n "${1:-}" ]]; then - printf '%s\n' "$*" > "$HOME/.mqlaunch_nickname" - echo "Smeknamn sparat: $*" - else - echo "Nuvarande smeknamn: $(get_nickname)" - echo "Ändra: mqlaunch nickname-set " - fi - ;; - doctor) "$BASE_DIR/tools/scripts/doctor.sh" ;; - check|health) run_self_check ;; - bundle|debug-bundle|support) run_debug_bundle ;; - notes|changelog|release-notes) show_release_notes ;; - about|status|dashboard) show_about_dashboard ;; - commands|index) show_command_index ;; - palette|fzf|search) run_command_palette ;; - dev-v1|git-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch dev" - open_dev_menu - ;; - tools) open_tools_menu ;; - docfunc|document-functions) MQ_WORK_DIR="$PWD" "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docfunc ;; - docwrite|document-functions-write|update-comments) - MQ_WORK_DIR="$PWD" "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docwrite - ;; - tools-menu|toolsmenu|menu-tools|tools-v1|menu-tools-v1) - legacy_alias_notice "mqlaunch $cmd" "mqlaunch tools" - open_tools_menu - ;; - prompts|prompt-folder) open_ai_prompts_folder ;; - prompt-files|files) show_prompt_files ;; - edit|edit-mqlaunch) edit_mqlaunch ;; - backup-prompts|backup) backup_prompts ;; - backup-mqlaunch|backup-launcher) backup_mqlaunch ;; - base|macos-scripts) open_base_dir ;; - launchers|launcher-folder) open_launcher_folder ;; - guide|terminal-guide) open_terminal_guide ;; - netlaunch|net) open_net_menu ;; - atlas) mq_ai_run_atlas "$@" ;; - auto|one|decide|research|root|solve|pdebug|menu) safe_run_ai "$cmd" ;; - mc) "$BASE_DIR/tools/scripts/mission-control.sh" ;; - ghost) "$BASE_DIR/tools/scripts/network-ghost.sh" ;; - pulse) "$BASE_DIR/tools/scripts/pulse.sh" ;; - scan) "$BASE_DIR/tools/scripts/vault-scan.sh" ;; - reap) "$BASE_DIR/tools/scripts/overseer.sh" ;; - guard) "$BASE_DIR/tools/scripts/blackout.sh" ;; - help|-h|--help) show_help ;; - *) - echo "${C_ERR}Unknown command:${C_RESET} $cmd" - echo - echo "Try:" - echo " mqlaunch ask \"Vad betyder kommandot: $cmd $*\"" - echo - - if declare -f mq_ai_prompt_ask >/dev/null; then - echo "Copying an /ask prompt for this unknown command..." - mq_ai_prompt_ask "Vad betyder kommandot '$cmd $*' i mqlaunch, och finns det ett liknande kommando?" - return 0 - fi - - show_help - exit 1 - ;; - esac -} - -# --- Entry -------------------------------------------------- -if [[ $# -gt 0 ]]; then - # Atlas REPL — intercept before dispatch to avoid ai-mode.sh routing - case "${1:l}" in - atlas) - shift - mq_ai_run_atlas "$@" - exit 0 - ;; - esac - - if dispatch_cli_command "$@"; then - exit 0 - else - cmd_status=$? - if [[ $cmd_status -eq 2 ]]; then - exit 2 - fi - fi - - if [[ "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" == "menu" ]]; then - main_loop - else - run_arg_command "$@" - fi -else - main_loop -fi diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-ai-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-ai-menu.sh deleted file mode 100644 index 0353d9d..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-ai-menu.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash - -print_ai_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "AI Modes" "AI" "$width" "$panel_color" - surface_row "MODES" "$width" "$panel_color" - surface_split_row "1. Auto Mode" "2. Atlas One" "$width" "$panel_color" - surface_split_row "3. Atlas Router" "4. Decision" "$width" "$panel_color" - surface_split_row "5. Research" "6. Root Cause" "$width" "$panel_color" - surface_split_row "7. Problem Solving" "8. Prompt Debugger" "$width" "$panel_color" - surface_split_row "9. AI Menu" "b. Back" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -handle_ai_menu_choice() { - local choice="$1" - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - b|B) return 1 ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - - return 0 -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read_menu_choice "Select AI mode [1-9,b] > " "ai" || break - choice="$REPLY" - echo - - if ! handle_ai_menu_choice "$choice"; then - break - fi - done -} - -open_ai_menu() { - ai_menu_loop -} diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-apps-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-apps-menu.sh deleted file mode 100755 index ad9365c..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-apps-menu.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env bash - -render_apps_panel() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - surface_panel_header "Apps / Shortcuts" "Apps" "$width" "$panel_color" - surface_row "APPS" "$width" "$panel_color" - surface_split_row "1. Finder" "2. Safari" "$width" "$panel_color" - surface_split_row "3. Google Chrome" "4. Spotify" "$width" "$panel_color" - surface_split_row "5. Xcode" "6. System Settings" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "FOLDERS" "$width" "$panel_color" - surface_split_row "7. Downloads" "8. Home" "$width" "$panel_color" - surface_split_row "9. Utilities" "10. Applications" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "QUICK ACTIONS" "$width" "$panel_color" - surface_split_row "11. Lock screen" "12. Sleep display" "$width" "$panel_color" - surface_split_row "13. Restart Finder" "14. Repo in browser" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_split_row "b. Back" "x. Exit" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -open_apps_menu() { - local choice - - while true; do - print_header - render_apps_panel - if command -v read_main_choice >/dev/null 2>&1; then - read_main_choice || return - else - printf "\nmqlaunch > " - read -r choice - fi - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_downloads_folder ;; - 8) open_home_folder ;; - 9) open_utilities_folder ;; - 10) open_applications_folder ;; - 11) lock_screen ;; - 12) sleep_display ;; - 13) restart_finder ;; - 14) open_repo_browser ;; - b|B) return ;; - x|X) - echo "Exiting ${APP_TITLE}..." - exit 0 - ;; - *) - echo "${C_ERR}Invalid selection:${C_RESET} $choice" - pause_enter - ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-dev-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-dev-menu.sh deleted file mode 100644 index 8184964..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-dev-menu.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash - -print_dev_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Prompt Tools" "Dev" "$width" "$panel_color" - surface_row "PROMPTS" "$width" "$panel_color" - surface_split_row "1. Open AI Prompts folder" "2. Show prompt files" "$width" "$panel_color" - surface_split_row "3. Edit mqlaunch" "4. Backup prompts" "$width" "$panel_color" - surface_split_row "5. Backup mqlaunch" "6. Open macos-scripts folder" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "NAVIGATION" "$width" "$panel_color" - surface_split_row "7. Open launcher folder" "8. HAL terminal guide" "$width" "$panel_color" - surface_split_row "9. Git Menu" "10. Net Launch" "$width" "$panel_color" - surface_split_row "11. Themes" "12. Tools Menu" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_split_row "b. Back" "" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -handle_dev_menu_choice() { - local choice="$1" - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) "$BASE_DIR/tools/scripts/hal-terminal-guide.sh" ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - b|B) return 1 ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - - return 0 -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - if command -v read_main_choice >/dev/null 2>&1; then - read_main_choice || break - else - printf "\nmqlaunch > " - read -r choice - fi - echo - - if ! handle_dev_menu_choice "$choice"; then - break - fi - done -} - -open_dev_menu() { - dev_menu_loop -} diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-git-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-git-menu.sh deleted file mode 100755 index 9b015a5..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-git-menu.sh +++ /dev/null @@ -1,605 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" - -APP_TITLE="MQ Git" -APP_SUBTITLE="Git Workspace and Safe Repo Actions" -APP_AUTHOR="Author Mattias Camner" -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - # shellcheck disable=SC1090 - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -print_header() { - local nickname - nickname="$(get_nickname)" - - clear_screen - printf '%b%s%b\n' "$C_TITLE" "════════════════════════════════════════════════════════════════════════════════════════" "$C_RESET" - printf '%b%s%b\n' "$C_TITLE" " __ __ ____ ____ ___ ______" "$C_RESET" - printf '%b%s%b\n' "$C_TITLE" " | \/ | / __ \ / __ \ / _ \/_ __/" "$C_RESET" - printf '%b%s%b\n' "$C_TITLE" " | |\/| || | | | | | | | | | | | " "$C_RESET" - printf '%b%s%b\n' "$C_TITLE" " | | | || |__| | | |__| | |_| | | " "$C_RESET" - printf '%b%s%b\n' "$C_TITLE" " |_| |_| \___\_\ \____/ \___/ |_| " "$C_RESET" - printf '\n' - printf '%b%s%b\n' "$C_BOLD" " MQ Git" "$C_RESET" - printf '%s\n' " Git Workspace and Safe Repo Actions" - printf '%s\n' " Author Mattias Camner" - printf '%s\n' " Hej, $nickname!" - printf '%b%s%b\n' "$C_TITLE" "════════════════════════════════════════════════════════════════════════════════════════" "$C_RESET" -} - -CURRENT_REPO="${MQ_GIT_REPO:-$BASE_DIR}" - -ensure_repo() { - if [[ ! -d "$CURRENT_REPO/.git" ]]; then - print_header - row_bold "GIT WORKSPACE" - empty_row - row "Not a git repository:" - row " $CURRENT_REPO" - print_footer - pause_enter - return 1 - fi -} - -repo_name() { - basename "$CURRENT_REPO" -} - -normalize_remote_url() { - local remote_url="$1" - - if [[ "$remote_url" =~ ^git@github\.com:(.*)$ ]]; then - echo "https://github.com/${BASH_REMATCH[1]}" - return 0 - fi - - if [[ "$remote_url" =~ ^https://github\.com/(.*)\.git$ ]]; then - echo "https://github.com/${BASH_REMATCH[1]}" - return 0 - fi - - if [[ "$remote_url" =~ ^git@([^:]+):(.*)$ ]]; then - echo "https://${BASH_REMATCH[1]}/${BASH_REMATCH[2]}" - return 0 - fi - - echo "${remote_url%.git}" -} - -github_web_url() { - local remote_url="" - remote_url="$(git -C "$CURRENT_REPO" remote get-url origin 2>/dev/null || true)" - [[ -n "$remote_url" ]] || return 1 - normalize_remote_url "$remote_url" -} - -get_ahead_behind() { - local upstream="$1" - local counts left right - - counts="$(git -C "$CURRENT_REPO" rev-list --left-right --count "${upstream}...HEAD" 2>/dev/null || true)" - read -r left right <<< "$counts" - - case "$left" in ''|*[!0-9]*) left=0 ;; esac - case "$right" in ''|*[!0-9]*) right=0 ;; esac - - printf '%s %s\n' "$left" "$right" -} - -choose_repo() { - local path="" - - print_header - row_bold "CHANGE REPO" - empty_row - row "Current repo:" - row " $CURRENT_REPO" - print_footer - printf "${C_TITLE}Repo path: ${C_RESET}" - read -r path - - if [[ -z "${path// }" ]]; then - ui_warn "No path entered." - pause_enter - return 1 - fi - - if [[ -d "$path/.git" ]]; then - CURRENT_REPO="$path" - ui_ok "Switched repo to: $CURRENT_REPO" - else - ui_err "Not a git repo: $path" - fi - - pause_enter -} - -show_status() { - ensure_repo || return 1 - - local branch upstream ahead behind - branch="$(git -C "$CURRENT_REPO" branch --show-current)" - upstream="$(git -C "$CURRENT_REPO" rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null || true)" - - ahead=0 - behind=0 - if [[ -n "$upstream" ]]; then - read -r behind ahead <<< "$(get_ahead_behind "$upstream")" - fi - - print_header - row_bold "REPO STATUS" - empty_row - row "Repo: $CURRENT_REPO" - row "Branch: ${branch:-unknown}" - row "Upstream: ${upstream:-none}" - row "Ahead: ${ahead:-0}" - row "Behind: ${behind:-0}" - empty_row - - git -C "$CURRENT_REPO" status --short --branch || true - - print_footer - pause_enter -} - -analyze_diff() { - ensure_repo || return 1 - - local diff risk lines - local reasons=() - - diff="$(git -C "$CURRENT_REPO" diff --cached -- . 2>/dev/null)" - if [[ -z "$diff" ]]; then - diff="$(git -C "$CURRENT_REPO" diff -- . 2>/dev/null)" - fi - - print_header - row_bold "DIFF RISK ANALYSIS" - empty_row - - if [[ -z "$diff" ]]; then - row "No diff to analyze." - print_footer - pause_enter - return 0 - fi - - risk="LOW" - - if echo "$diff" | grep -Eqi '(api[_-]?key|secret|token|password|passwd|PRIVATE KEY|BEGIN RSA|BEGIN OPENSSH)'; then - risk="HIGH" - reasons+=("Possible secret or credential content detected") - fi - - if echo "$diff" | grep -Eqi 'rm -rf|chmod 777|curl .*\|.*sh|sudo '; then - risk="HIGH" - reasons+=("Potentially dangerous shell command pattern detected") - fi - - if echo "$diff" | grep -Eqi '^diff --git a/.*\.(sh|zsh|bash)$'; then - [[ "$risk" == "LOW" ]] && risk="MEDIUM" - reasons+=("Shell script changes detected") - fi - - lines="$(printf "%s\n" "$diff" | wc -l | tr -d ' ')" - if [[ "${lines:-0}" -gt 250 ]]; then - [[ "$risk" == "LOW" ]] && risk="MEDIUM" - reasons+=("Large diff (${lines} lines)") - fi - - row "Risk level: $risk" - empty_row - - if (( ${#reasons[@]} > 0 )); then - row "Reasons:" - for r in "${reasons[@]}"; do - row " - $r" - done - else - row "No obvious risk patterns detected." - fi - - empty_row - row "Changed files:" - git -C "$CURRENT_REPO" diff --name-only --cached 2>/dev/null || true - git -C "$CURRENT_REPO" diff --name-only 2>/dev/null | awk '!seen[$0]++' || true - - print_footer - pause_enter -} - -suggest_commit() { - ensure_repo || return 1 - - local files first kind msg - - files="$(git -C "$CURRENT_REPO" diff --name-only --cached 2>/dev/null)" - if [[ -z "$files" ]]; then - files="$(git -C "$CURRENT_REPO" diff --name-only 2>/dev/null)" - fi - - print_header - row_bold "SUGGESTED COMMIT" - empty_row - - if [[ -z "$files" ]]; then - row "No changed files found." - print_footer - pause_enter - return 0 - fi - - first="$(printf "%s\n" "$files" | head -1)" - kind="update" - - if printf "%s\n" "$files" | grep -Eq 'README|CHANGELOG|docs/'; then - kind="docs" - elif printf "%s\n" "$files" | grep -Eq '\.sh$|terminal/|tools/|ui/'; then - kind="improve" - elif printf "%s\n" "$files" | grep -Eq 'test|spec'; then - kind="test" - fi - - msg="$kind: refine $(repo_name)" - [[ -n "$first" ]] && msg="$kind: update $(basename "$first")" - - row "Suggested message:" - row " $msg" - empty_row - row "Changed files:" - printf "%s\n" "$files" - - print_footer - pause_enter -} - -next_action() { - ensure_repo || return 1 - - local status branch upstream ahead behind - status="$(git -C "$CURRENT_REPO" status --short)" - branch="$(git -C "$CURRENT_REPO" branch --show-current)" - upstream="$(git -C "$CURRENT_REPO" rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null || true)" - ahead=0 - behind=0 - - if [[ -n "$upstream" ]]; then - read -r behind ahead <<< "$(get_ahead_behind "$upstream")" - fi - - print_header - row_bold "NEXT RECOMMENDED ACTION" - empty_row - - if [[ -n "$status" ]]; then - if echo "$status" | grep -Eq '^\?\?'; then - row "1. Review untracked files before staging." - row "2. Stage intentionally, not with blind git add ." - elif echo "$status" | grep -Eq '^( M|M |MM|A |AM| D|D )'; then - row "1. Review diff." - row "2. Stage selected changes." - row "3. Commit with a clear message." - else - row "Working tree has changes. Review before committing." - fi - else - if [[ "${behind:-0}" -gt 0 && "${ahead:-0}" -gt 0 ]]; then - row "Branch has diverged from upstream." - row "Recommended: inspect log, then reconcile." - elif [[ "${behind:-0}" -gt 0 ]]; then - row "You are behind upstream." - row "Recommended: git pull --rebase origin $branch" - elif [[ "${ahead:-0}" -gt 0 ]]; then - row "You are ahead of upstream." - row "Recommended: git push origin $branch" - else - row "Repo looks clean and synced." - row "Recommended: no action needed." - fi - fi - - print_footer - pause_enter -} - -stage_selected() { - ensure_repo || return 1 - - local files="" - - print_header - row_bold "STAGE SELECTED FILES" - empty_row - - git -C "$CURRENT_REPO" status --short || true - empty_row - print_footer - printf "${C_TITLE}File(s) to stage: ${C_RESET}" - read -r files - - if [[ -z "${files// }" ]]; then - ui_warn "No files entered." - pause_enter - return 1 - fi - - ( - cd "$CURRENT_REPO" || exit 1 - git add $files - ) - - print_header - row_bold "UPDATED STATUS" - empty_row - git -C "$CURRENT_REPO" status --short || true - print_footer - pause_enter -} - -commit_changes() { - ensure_repo || return 1 - - local msg="" - - print_header - row_bold "COMMIT STAGED CHANGES" - empty_row - - if [[ -z "$(git -C "$CURRENT_REPO" diff --cached --name-only)" ]]; then - row "No staged changes to commit." - print_footer - pause_enter - return 0 - fi - - git -C "$CURRENT_REPO" diff --cached --name-only || true - empty_row - print_footer - printf "${C_TITLE}Commit message: ${C_RESET}" - read -r msg - - if [[ -z "${msg// }" ]]; then - ui_warn "No commit message entered." - pause_enter - return 1 - fi - - git -C "$CURRENT_REPO" commit -m "$msg" - echo - pause_enter -} - -safe_push() { - ensure_repo || return 1 - - local branch upstream ahead behind confirm - branch="$(git -C "$CURRENT_REPO" branch --show-current)" - upstream="$(git -C "$CURRENT_REPO" rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null || true)" - ahead=0 - behind=0 - - if [[ -n "$upstream" ]]; then - read -r behind ahead <<< "$(get_ahead_behind "$upstream")" - fi - - print_header - row_bold "SAFE PUSH" - empty_row - row "Branch: ${branch:-unknown}" - row "Upstream: ${upstream:-none}" - row "Ahead: ${ahead:-0}" - row "Behind: ${behind:-0}" - empty_row - - if [[ -z "$upstream" ]]; then - row "No upstream branch configured." - print_footer - printf "${C_TITLE}Push with -u origin $branch? [y/N]: ${C_RESET}" - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || return 0 - git -C "$CURRENT_REPO" push -u origin "$branch" - pause_enter - return 0 - fi - - if [[ "${behind:-0}" -gt 0 && "${ahead:-0}" -gt 0 ]]; then - row "Branch has diverged. Push blocked." - print_footer - pause_enter - return 1 - fi - - if [[ "${behind:-0}" -gt 0 ]]; then - row "Remote is ahead. Push blocked." - row "Recommended: git pull --rebase origin $branch" - print_footer - pause_enter - return 1 - fi - - if [[ "${ahead:-0}" -eq 0 ]]; then - row "Nothing to push." - print_footer - pause_enter - return 0 - fi - - print_footer - printf "${C_TITLE}Push current branch to origin? [y/N]: ${C_RESET}" - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || return 0 - - git -C "$CURRENT_REPO" push origin "$branch" - echo - pause_enter -} - -pull_rebase() { - ensure_repo || return 1 - - local branch confirm - branch="$(git -C "$CURRENT_REPO" branch --show-current)" - - print_header - row_bold "PULL WITH REBASE" - empty_row - row "This will run:" - row " git pull --rebase origin $branch" - print_footer - printf "${C_TITLE}Continue? [y/N]: ${C_RESET}" - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || return 0 - - git -C "$CURRENT_REPO" pull --rebase origin "$branch" - echo - pause_enter -} - -show_log() { - ensure_repo || return 1 - - print_header - row_bold "RECENT GIT LOG" - empty_row - git -C "$CURRENT_REPO" log --oneline --decorate --graph -15 || true - print_footer - pause_enter -} - -open_repo_github() { - ensure_repo || return 1 - - local url="" - url="$(github_web_url || true)" - - if [[ -z "$url" ]]; then - print_header - row_bold "OPEN REPO ON GITHUB" - empty_row - row "Could not determine GitHub URL from origin remote." - print_footer - pause_enter - return 1 - fi - - print_header - row_bold "OPEN REPO ON GITHUB" - empty_row - row "Opening:" - row " $url" - print_footer - open "$url" -} - -open_local_repo() { - ensure_repo || return 1 - - print_header - row_bold "OPEN LOCAL REPO" - empty_row - row "Opening:" - row " $CURRENT_REPO" - print_footer - open "$CURRENT_REPO" -} - -print_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Git Menu" "Git" "$width" "$panel_color" - surface_row "Repo: $CURRENT_REPO" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "WORKSPACE" "$width" "$panel_color" - surface_split_row "1. Repo status" "2. Diff risk analysis" "$width" "$panel_color" - surface_split_row "3. Suggest commit message" "4. Next recommended action" "$width" "$panel_color" - surface_split_row "5. Stage selected files" "6. Commit staged changes" "$width" "$panel_color" - surface_split_row "7. Safe push" "8. Pull with rebase" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "NAVIGATION" "$width" "$panel_color" - surface_split_row "10. Open repo on GitHub" "11. Open local repo folder" "$width" "$panel_color" - surface_split_row "12. Change repo path" "b. Back" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -menu_loop() { - local choice="" - - while true; do - print_menu - read_menu_choice "Select option [1-8,10-12,b] > " "git" || return - choice="$REPLY" - echo - - case "$choice" in - 1) show_status ;; - 2) analyze_diff ;; - 3) suggest_commit ;; - 4) next_action ;; - 5) stage_selected ;; - 6) commit_changes ;; - 7) safe_push ;; - 8) pull_rebase ;; - 9) show_log ;; - 10) open_repo_github ;; - 11) open_local_repo ;; - 12) choose_repo ;; - b|B|9) return ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -usage() { - cat </dev/null 2>&1; then - BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - # shellcheck disable=SC1091 - [[ -f "$BASE_DIR/ui/terminal-ui/mq-ui.sh" ]] && source "$BASE_DIR/ui/terminal-ui/mq-ui.sh" -fi - -help_center_git_state() { - local count - count="$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')" - - if [[ -z "$count" || "$count" == "0" ]]; then - printf "Clean" - else - printf "Dirty (%s)" "$count" - fi -} - -render_help_center_panel() { - local width panel_color host user git_state mode - width="$(surface_terminal_width)" - - if [[ -t 1 ]]; then - panel_color=$'\033[0;37m' - else - panel_color="" - fi - - host="$(hostname -s 2>/dev/null || echo unknown)" - user="${USER:-unknown}" - git_state="$(help_center_git_state)" - mode="Help" - - surface_top "Help" "$width" "$panel_color" - surface_row "Host: $host User: $user Mode: $mode Git: $git_state" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - - surface_row "REFERENCE" "$width" "$panel_color" - surface_split_row "1. Command index" "2. About / Status" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "INFO" "$width" "$panel_color" - surface_split_row "3. Version" "4. Release Notes" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "SUPPORT" "$width" "$panel_color" - surface_split_row "5. Repo in browser" "6. Repo folder" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_split_row "b. Back" "x. Exit" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -open_help_center_menu() { - local choice - - while true; do - print_header - render_help_center_panel - - if command -v read_main_choice >/dev/null 2>&1; then - read_main_choice "help" || return - else - printf "\nhelp > " - read -r choice - fi - echo - - case "$choice" in - 1) show_command_index || true ;; - 2) show_about_dashboard || true ;; - 3) show_version_info || true ;; - 4) show_release_notes || true ;; - 5) open_repo_browser ;; - 6) open_base_dir ;; - b|B) return ;; - x|X) - echo "Exiting ${APP_TITLE}..." - exit 0 - ;; - *) - echo "${C_ERR}Invalid selection:${C_RESET} $choice" - pause_enter - ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-help-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-help-menu.sh deleted file mode 100644 index ba64cd9..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-help-menu.sh +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/env bash - -CYAN='\033[0;36m' -PURPLE='\033[0;35m' -BLUE='\033[0;34m' -NC='\033[0m' - -print_header() { - clear - echo -e "${PURPLE}" - echo " __ __ ____ _ _ _ _ _____ _ _ " - echo " | \/ |/ __ \| | / \ | | | | / ____| | | |" - echo " | \ / | | | | | / _ \ | | | || | | |__| |" - echo " | |\/| | | | | | / ___ \| | | || | | __ |" - echo " | | | | |__| | |____ / / \ \ |_| || |____| | | |" - echo " |_| |_|\___\_\______| /_/ \_\___/ \_____|_| |_|" - echo -e " -- S Y S T E M H U B v1.0 --${NC}\n" - echo -e "${CYAN}COMMAND INDEX${NC}" - echo -e "${BLUE}----------------------------------------------------------------------------------------${NC}" -} - -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(hostname -s 2>/dev/null || hostname)" - user_name="${USER:-$(whoami)}" - - printf '\n' - printf "Host: %s User: %s\n" "$host" "$user_name" - printf "Time: %s\n" "$now" -} - -row() { - printf "%s\n" "$1" -} - -row_bold() { - echo -e "${PURPLE}$1${NC}" -} - -empty_row() { - printf "\n" -} - -pause_enter() { - printf "\nPress Enter to continue..." - read -r -} - -show_command_index() { - print_header - row_bold "START" - row " mqlaunch Open main menu" - row " mqlaunch demo Run guided demo mode" - row " mqlaunch help Show help" - row " mqlaunch commands Show command index" - row " mqlaunch palette Open fuzzy command palette" - - empty_row - row_bold "WORKFLOWS" - row " mqlaunch system Open System menu" - row " mqlaunch perf Open Performance menu" - row " mqlaunch dev Open Dev menu" - row " mqlaunch git Open Git menu" - row " mqlaunch tools Open Tools menu" - row " mqlaunch workflows Open Workflows menu" - row " mqlaunch release Open Release menu" - row " mqlaunch login Open Login menu" - row " mqlaunch shortcuts Open Shortcuts menu" - - empty_row - row_bold "PROJECT FLOWS" - row " mqlaunch workflows boot Run project boot" - row " mqlaunch workflows check Run project check" - row " mqlaunch login menu Session boot + full menu" - row " mqlaunch login about Session boot + about screen" - row " mqlaunch login check Session boot + self-check" - row " mqlaunch shortcuts list List shortcuts directly" - row " mqlaunch shortcuts search clip Search shortcuts by name" - - empty_row - row_bold "SECURITY & OPS" - row " mqlaunch ghost Run network cloaking (MAC/DNS spoof)" - row " mqlaunch pulse Diagnostic for network latency & WiFi" - row " mqlaunch scan Matrix-style system & port scan" - row " mqlaunch reap Overseer process reaper (CPU/MEM focus)" - row " mqlaunch guard Perimeter watchdog (USB/Power monitor)" - row " mqlaunch mc Open advanced system dashboard" - - empty_row - row_bold "CHECKS & SUPPORT" - row " mqlaunch check Run environment check" - row " mqlaunch self-check Run internal smoke test" - row " mqlaunch bundle Create debug bundle" - row " mqlaunch about Open About / Status" - row " mqlaunch version Show version information" - row " mqlaunch notes Show release notes / changelog" - - empty_row - row_bold "UTILITY" - row " mqlaunch repo Open repo root" - row " mqlaunch guide Open terminal guide" - row " mqlaunch system time Show date and time" - row " mqlaunch theme Open Themes menu" - row " mqlaunch theme-macos Apply macOS theme" - row " mqlaunch theme-reset Reset theme" - - empty_row - row_bold "AI" - row " mqlaunch ask \"din fråga\" Fråga om repot — svar direkt i terminalen" - row " mqlaunch ask quick \"fråga\" Kort svar utan repo-kontext" - row " mqlaunch chat Konversationsläge med minne" - row " mqlaunch review Kopiera code review-prompt till clipboard" - row " mqlaunch ui Kopiera UI-prompt till clipboard" - - print_footer - pause_enter -} - -show_help() { - cat <<'HELP' -mqlaunch — modular terminal workflow hub - -START - mqlaunch Open main menu - mqlaunch demo Run guided demo mode - mqlaunch help Show help - mqlaunch commands Show command index - mqlaunch palette Open fuzzy command palette - -WORKFLOWS - mqlaunch system Open System menu - mqlaunch perf Open Performance menu - mqlaunch dev Open Dev menu - mqlaunch git Open Git menu - mqlaunch tools Open Tools menu - mqlaunch workflows Open Workflows menu - mqlaunch release Open Release menu - mqlaunch login Open Login menu - mqlaunch shortcuts Open Shortcuts menu - -PROJECT FLOWS - mqlaunch workflows boot Run project boot - mqlaunch workflows check Run project check - mqlaunch login menu Session boot + full menu - mqlaunch login about Session boot + about screen - mqlaunch login check Session boot + self-check - mqlaunch shortcuts list List shortcuts directly - mqlaunch shortcuts search clip Search shortcuts by name - -SECURITY & OPS - mqlaunch ghost Run network cloaking (MAC/DNS spoof) - mqlaunch pulse Diagnostic for network latency & WiFi - mqlaunch scan Matrix-style system & port scan - mqlaunch reap Overseer process reaper (CPU/MEM focus) - mqlaunch guard Perimeter watchdog (USB/Power monitor) - mqlaunch mc Open advanced system dashboard - -CHECKS & SUPPORT - mqlaunch check Run environment check - mqlaunch self-check Run internal smoke test - mqlaunch bundle Create debug bundle - mqlaunch about Open About / Status - mqlaunch version Show version information - mqlaunch notes Show release notes / changelog - -UTILITY - mqlaunch repo Open repo root - mqlaunch guide Open terminal guide - mqlaunch system time Show date and time - mqlaunch theme Open Themes menu - mqlaunch theme-macos Apply macOS theme - mqlaunch theme-reset Reset theme - -AI - mqlaunch ask "din fråga" Fråga om repot — svar direkt i terminalen - mqlaunch ask quick "fråga" Kort svar utan repo-kontext - mqlaunch review Kopiera code review-prompt till clipboard - mqlaunch ui Kopiera UI-prompt till clipboard - -POPULAR FLOWS - mqlaunch - mqlaunch perf - mqlaunch system check - mqlaunch doctor - mqlaunch ask "vad gör scan?" - mqlaunch review -HELP -} diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-login-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-login-menu.sh deleted file mode 100755 index b499fdf..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-login-menu.sh +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -LOGIN_SCRIPT="$BASE_DIR/automation/login/mqlogin.sh" - -APP_TITLE="MQ Login" -APP_SUBTITLE="Login and Session Boot" -APP_AUTHOR="Author Mattias Camner" -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - # shellcheck disable=SC1090 - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -require_login_script() { - if [[ ! -x "$LOGIN_SCRIPT" ]]; then - print_header - row_bold "LOGIN" - empty_row - row "Missing or non-executable script:" - row " $LOGIN_SCRIPT" - row "Run:" - row " chmod +x $LOGIN_SCRIPT" - print_footer - pause_enter - return 1 - fi -} - -run_login_mode() { - local title="$1" - shift - - require_login_script || return 1 - - print_header - row_bold "$title" - empty_row - row "Starting session flow..." - print_footer - - "$LOGIN_SCRIPT" "$@" -} - -run_login_inline_menu() { - local mode="$1" - - require_login_script || return 1 - - print_header - row_bold "INLINE SESSION" - empty_row - row "Mode: $mode" - row "Running in current terminal." - print_footer - - "$LOGIN_SCRIPT" "$mode" --inline - pause_enter -} - -run_quiet_inline_menu() { - local mode="$1" - - require_login_script || return 1 - - print_header - row_bold "QUIET INLINE SESSION" - empty_row - row "Mode: $mode" - row "No Finder, Code, or Terminal windows." - print_footer - - "$LOGIN_SCRIPT" "$mode" --inline --no-finder --no-code --no-terminal - pause_enter -} - -show_login_help() { - require_login_script || return 1 - - print_header - row_bold "MQLOGIN HELP" - empty_row - - if ! "$LOGIN_SCRIPT" --help; then - echo - row "mqlogin help failed." - fi - - print_footer - pause_enter -} - -print_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Login" "Login" "$width" "$panel_color" - surface_row "SESSION" "$width" "$panel_color" - surface_split_row "1. Start session menu" "2. Start session about" "$width" "$panel_color" - surface_split_row "3. Start session check" "4. Inline menu session" "$width" "$panel_color" - surface_split_row "5. Inline about session" "6. Quiet inline menu" "$width" "$panel_color" - surface_split_row "7. Quiet inline about" "8. Show mqlogin help" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_split_row "b. Back" "" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -menu_loop() { - local choice - - while true; do - print_menu - read_menu_choice "Select option [1-8,b] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) run_login_mode "SESSION MENU" menu ;; - 2) run_login_mode "SESSION ABOUT" about ;; - 3) run_login_mode "SESSION CHECK" check ;; - 4) run_login_inline_menu menu ;; - 5) run_login_inline_menu about ;; - 6) run_quiet_inline_menu menu ;; - 7) run_quiet_inline_menu about ;; - 8) show_login_help ;; - b|B) ui_ok "Exiting."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -usage() { - cat <&2 - exit 1 -} - -print_main_menu() { - print_header - render_main_menu_panel - render_command_surface - MQ_MAIN_MENU_RENDERED_LINES=66 -} - -surface_action_word() { - local index="$1" - case $(( index % 10 )) in - 0) printf "routing" ;; - 1) printf "loading" ;; - 2) printf "opening" ;; - 3) printf "mapping" ;; - 4) printf "syncing" ;; - 5) printf "priming" ;; - 6) printf "launching" ;; - 7) printf "resolving" ;; - 8) printf "decoding" ;; - *) printf "activating" ;; - esac -} - -surface_accept_scramble() { - local color="$1" - local selected="$2" - local frame start word - start=$(( RANDOM % 10 )) - - for frame in 1 2 3 4 5 6; do - word="$(surface_action_word $(( start + frame )))" - printf "\r\033[2K%b>> %-10s %s%b" "$color" "$word" "$selected" "$C_RESET" - sleep 0.025 - done - - word="$(surface_action_word $(( start + 7 )))" - printf "\r\033[2K%b>> %-10s %s%b" "$C_OK" "$word" "$selected" "$C_RESET" - sleep 0.04 -} - -render_main_menu_panel() { - local width panel_color host user git_state mode - width="$(surface_terminal_width)" - - if [[ -t 1 ]]; then - panel_color=$'\033[0;37m' - else - panel_color="" - fi - - host="$(hostname -s 2>/dev/null || echo unknown)" - user="${USER:-unknown}" - git_state="$(surface_git_state)" - mode="Main" - - surface_top "Main Menu" "$width" "$panel_color" - surface_row "Host: $host User: $user Mode: $mode Git: $git_state" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - - surface_row "CORE" "$width" "$panel_color" - surface_split_row "1. Workflows" "2. System" "$width" "$panel_color" - surface_split_row "3. Git" "4. Release" "$width" "$panel_color" - surface_split_row "5. Dev" "6. Help" "$width" "$panel_color" - surface_split_row "7. Script comments" "8. Workspace" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "QUICK ACCESS" "$width" "$panel_color" - surface_split_row "p. Performance" "n. Network" "$width" "$panel_color" - surface_split_row "h. Health Check" "a. HAL" "$width" "$panel_color" - surface_split_row "r. REPL" "z. Restart mqlaunch" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "COMMANDS" "$width" "$panel_color" - surface_split_row "/review" "/ui" "$width" "$panel_color" - surface_split_row "/ask \"your question\"" "/chat" "$width" "$panel_color" - surface_split_row "/doctor" "/scan /atlas" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -surface_dual_figure_row() { - local left_art="$1" - local right_art="$2" - local right="$3" - local width="$4" - local surface_color="$5" - local left_color="$6" - local right_color="$7" - local inner left_width right_width art_width art_col right_pad gap - inner=$(( width - 4 )) - left_width=$(( inner / 2 )) - right_width=$(( inner - left_width - 1 )) - gap=" " - art_width=$(( ${#left_art} + ${#gap} + ${#right_art} )) - art_col=$(( (left_width - art_width) / 2 )) - (( art_col < 1 )) && art_col=1 - right_pad=$(( left_width - art_col - art_width )) - (( right_pad < 0 )) && right_pad=0 - - printf "%b│ %s%b%s%b%s%b%s%b%s %s │%b\n" \ - "$surface_color" \ - "$(repeat_char "$art_col" " ")" \ - "$left_color" \ - "$left_art" \ - "$surface_color" \ - "$gap" \ - "$right_color" \ - "$right_art" \ - "$surface_color" \ - "$(repeat_char "$right_pad" " ")" \ - "$(surface_pad "$right" "$right_width")" \ - "$C_RESET" -} - -surface_compact_dual_figure_row() { - local left_art="$1" - local right_art="$2" - local width="$3" - local surface_color="$4" - local left_color="$5" - local right_color="$6" - local inner art_width art_col right_pad gap - inner=$(( width - 4 )) - gap=" " - art_width=$(( ${#left_art} + ${#gap} + ${#right_art} )) - art_col=$(( (inner - art_width) / 2 )) - (( art_col < 1 )) && art_col=1 - right_pad=$(( inner - art_col - art_width )) - (( right_pad < 0 )) && right_pad=0 - - printf "%b│ %s%b%s%b%s%b%s%b%s │%b\n" \ - "$surface_color" \ - "$(repeat_char "$art_col" " ")" \ - "$left_color" \ - "$left_art" \ - "$surface_color" \ - "$gap" \ - "$right_color" \ - "$right_art" \ - "$surface_color" \ - "$(repeat_char "$right_pad" " ")" \ - "$C_RESET" -} - -surface_git_state() { - local count - count="$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')" - if [[ -z "$count" || "$count" == "0" ]]; then - printf "Clean" - else - printf "Dirty (%s)" "$count" - fi -} - -render_command_surface() { - local USER_NAME HOST_NAME TIME SURFACE_COLOR FIGURE_COLOR ALT_FIGURE_COLOR width git_state tip activity system_state - USER_NAME="${USER:-$(whoami)}" - HOST_NAME="$(hostname -s)" - TIME="$(date '+%Y-%m-%d %H:%M:%S')" - width="$(surface_terminal_width)" - MQ_SURFACE_WIDTH="$width" - git_state="$(surface_git_state)" - system_state="System: Stable" - activity="Activity: Monitoring" - if [[ "$git_state" == Dirty* ]]; then - tip="Review git changes" - else - tip="Run help to see index" - fi - - if [[ -t 1 ]]; then - SURFACE_COLOR=$'\033[0;37m' - FIGURE_COLOR="$C_OK" - ALT_FIGURE_COLOR="$C_WARN" - else - SURFACE_COLOR="" - FIGURE_COLOR="" - ALT_FIGURE_COLOR="" - fi - - surface_top "Command Surface v3" "$width" "$SURFACE_COLOR" - if (( width < 56 )); then - surface_row "Welcome back ${USER_NAME}!" "$width" "$SURFACE_COLOR" - if (( width >= 44 )); then - surface_compact_dual_figure_row "▄▄████▄▄" " ▄▄██▄▄ " "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - surface_compact_dual_figure_row "████████" "█▀████▀█" "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - surface_compact_dual_figure_row "██▄██▄██" "██▀██▀██" "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - surface_compact_dual_figure_row " ▄█▀▀█▄ " " ▀▄██▄▀ " "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - fi - surface_row "$system_state | Git: $git_state" "$width" "$SURFACE_COLOR" - surface_row "$activity" "$width" "$SURFACE_COLOR" - surface_row "Host: ${HOST_NAME} | User: ${USER_NAME}" "$width" "$SURFACE_COLOR" - surface_row "Time: ${TIME} | X. Exit launcher" "$width" "$SURFACE_COLOR" - surface_row "Tip: $tip" "$width" "$SURFACE_COLOR" - else - surface_split_row "Welcome back ${USER_NAME}!" "Tips: $tip" "$width" "$SURFACE_COLOR" - surface_split_row "Mode: Interactive" "Git: $git_state" "$width" "$SURFACE_COLOR" - surface_row "" "$width" "$SURFACE_COLOR" - surface_dual_figure_row "▄▄████▄▄" " ▄▄██▄▄ " "" "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - surface_dual_figure_row "████████" "█▀████▀█" "$system_state" "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - surface_dual_figure_row "██▄██▄██" "██▀██▀██" "Repo: macos-scripts" "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - surface_dual_figure_row " ▄█▀▀█▄ " " ▀▄██▄▀ " "$activity" "$width" "$SURFACE_COLOR" "$FIGURE_COLOR" "$ALT_FIGURE_COLOR" - surface_row "" "$width" "$SURFACE_COLOR" - surface_split_row "Host: ${HOST_NAME}" "User: ${USER_NAME}" "$width" "$SURFACE_COLOR" - surface_split_row "Time: ${TIME}" "X. Exit launcher" "$width" "$SURFACE_COLOR" - fi - surface_bottom "$width" "$SURFACE_COLOR" -} - -handle_main_menu_choice() { - local choice="$1" - local normalized - - normalized="$(printf '%s' "$choice" | tr '[:upper:]' '[:lower:]')" - case "$choice" in - # CORE - 1) run_mqworkflows ;; - 2) open_system_menu ;; - 3) open_git_menu ;; - 4) open_release_menu ;; - 5) open_dev_menu ;; - 6) open_help_center_menu ;; - 7) "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docfunc ;; - 8) run_mqworkflows workspace ;; - - # QUICK ACCESS - p|P) open_performance_menu ;; - n|N) show_network_info ;; - h|H) system_check ;; - a|A) - "$BASE_DIR/tools/scripts/hal-terminal-guide.sh" - if [[ -f "$HOME/.hal_nav" ]]; then - local _hal_target - _hal_target="$(cat "$HOME/.hal_nav")" - rm -f "$HOME/.hal_nav" - if [[ -d "$_hal_target" ]]; then - cd "$_hal_target" || true - printf 'HAL: navigated to %s\n' "$_hal_target" - sleep 1 - fi - fi - ;; - r|R) "$BASE_DIR/bin/mqlaunch" repl ;; - z|Z) restart_mqlaunch ;; - - # EXIT - x|X) - echo "Exiting ${APP_TITLE}..." - exit 0 - ;; - - *) - if handle_main_prompt_command "$normalized" "$choice"; then - return 0 - fi - ;; - esac -} - -handle_main_prompt_command() { - local normalized="$1" - local original="$2" - - [[ -z "${normalized// }" ]] && return 0 - - case "$normalized" in - workflows|workflow|wf) run_mqworkflows; return 0 ;; - system|sys) open_system_menu; return 0 ;; - git|git-menu|gitmenu) open_git_menu; return 0 ;; - release|rel) open_release_menu; return 0 ;; - dev) open_dev_menu; return 0 ;; - help|h|\?|commands|index) open_help_center_menu; return 0 ;; - perf|performance) open_performance_menu; return 0 ;; - net|network|ip) show_network_info; return 0 ;; - check|health|system\ check) system_check; return 0 ;; - hal|apps) "$BASE_DIR/tools/scripts/hal-terminal-guide.sh"; return 0 ;; - applications) open_applications_folder; return 0 ;; - repl|r) "$BASE_DIR/bin/mqlaunch" repl; return 0 ;; - restart|reload|relaunch|z) restart_mqlaunch; return 0 ;; - docfunc|document-functions|document\ functions|docs|docs-preview) "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docfunc; return 0 ;; - docwrite|document-functions-write|update-comments|update\ comments) "$BASE_DIR/terminal/menus/mq-tools-menu.sh" docwrite; return 0 ;; - workspace|snapshots|workspace\ snapshots) run_mqworkflows workspace; return 0 ;; - clear|cls) clear; return 0 ;; - version|ver) show_version_info || true; return 0 ;; - notes|changelog|release\ notes) show_release_notes || true; return 0 ;; - about|status|dashboard) show_about_dashboard || true; return 0 ;; - bundle|debug|debug-bundle|support) run_debug_bundle || true; return 0 ;; - repo|base|macos-scripts) open_base_dir; return 0 ;; - guide|terminal-guide) open_terminal_guide; return 0 ;; - ask\ *|/ask\ *) - local _ask_args="${original#* }" - "$BASE_DIR/tools/scripts/ask.sh" "$_ask_args" - pause_enter - return 0 - ;; - ask|/ask) - "$BASE_DIR/tools/scripts/ask.sh" - pause_enter - return 0 - ;; - chat|/chat) - "$BASE_DIR/tools/scripts/chat.sh" - return 0 - ;; - esac - - if command -v dispatch_cli_command >/dev/null 2>&1; then - # zsh-style splitting is intentional when this menu is sourced by mqlaunch. - # shellcheck disable=SC2086 - if dispatch_cli_command ${=normalized}; then - return 0 - fi - fi - - run_main_shell_command "$original" -} - -run_main_shell_command() { - local command_line="$1" - local shell_bin="${SHELL:-/bin/zsh}" - - echo - printf "%b[shell]%b %s\n" "$C_INFO" "$C_RESET" "$command_line" - echo - "$shell_bin" -lc "$command_line" - pause_enter -} - -read_main_choice() { - local label="${1:-mqlaunch}" - local prompt_line prompt_hint prompt_color prompt_width term_lines prompt_row input_row pin_prompt - prompt_width="${MQ_SURFACE_WIDTH:-$(surface_terminal_width)}" - prompt_line="$(repeat_char "$prompt_width" "─")" - prompt_hint=">> option, mqlaunch command, shell command, or x to exit" - if [[ -t 1 ]]; then - prompt_color=$'\033[0;37m' - else - prompt_color="" - fi - - # Pin prompt area to the bottom of the visible terminal window. - # Layout (4 rows): separator / input / separator / hint - term_lines="$(tput lines 2>/dev/null || echo 24)" - prompt_row=$(( term_lines - 3 )) # row of first separator (1-indexed) - input_row=$(( prompt_row + 1 )) # row of "mqlaunch > " input - (( prompt_row < 2 )) && prompt_row=2 - (( input_row < 3 )) && input_row=3 - pin_prompt=0 - if (( term_lines > ${MQ_MAIN_MENU_RENDERED_LINES:-64} + 4 )); then - pin_prompt=1 - fi - - if [[ -n "${ZSH_VERSION:-}" && -t 0 && -t 1 && "$pin_prompt" -eq 1 ]]; then - local prompt input cursor key old_stty - prompt="${label} > " - input="" - cursor=0 - - # Clear from prompt_row to end of screen, then draw fixed prompt block - printf "\033[%d;1H\033[J" "$prompt_row" - printf "%b%s%b\n" "$prompt_color" "$prompt_line" "$C_RESET" - printf "%s" "$prompt" - printf "\n%b%s%b\n" "$prompt_color" "$prompt_line" "$C_RESET" - printf "%b%s%b" "$C_OK" "$prompt_hint" "$C_RESET" - # Move cursor to the input line - printf "\033[%d;1H" "$input_row" - - old_stty="$(stty -g)" - stty -echo -icanon min 1 time 0 2>/dev/null || true - - while true; do - printf "\033[%d;1H" "$input_row" - printf "\r\033[2K%s%s" "$prompt" "$input" - printf "\033[%d;%dH" "$input_row" $(( ${#prompt} + cursor + 1 )) - - IFS= read -r -k 1 key || { - stty "$old_stty" 2>/dev/null || true - return 1 - } - - case "$key" in - $'\n'|$'\r') - break - ;; - $'\177'|$'\b') - if (( cursor > 0 )); then - input="${input[1,cursor-1]}${input[cursor+1,-1]}" - (( cursor-- )) - fi - ;; - $'\033') - IFS= read -r -k 1 key || key="" - if [[ "$key" == "[" ]]; then - IFS= read -r -k 1 key || key="" - case "$key" in - C) (( cursor < ${#input} )) && (( cursor++ )) ;; - D) (( cursor > 0 )) && (( cursor-- )) ;; - esac - fi - ;; - *) - input="${input[1,cursor]}${key}${input[cursor+1,-1]}" - (( cursor++ )) - ;; - esac - done - - stty "$old_stty" 2>/dev/null || true - printf "\033[%d;1H\r\033[2K" "$input_row" - surface_accept_scramble "$C_WARN" "${input:-menu}" - printf "\n" - choice="$input" - return 0 - fi - - # Fallback for normal Terminal heights: keep the prompt in flow so it never - # clears the lower part of the rendered menu. - if [[ -n "${ZSH_VERSION:-}" && -t 0 && -t 1 ]]; then - local prompt input cursor key old_stty - prompt="${label} > " - input="" - cursor=0 - - printf "%b%s%b\n" "$prompt_color" "$prompt_line" "$C_RESET" - printf "%s\n" "$prompt" - printf "%b%s%b\n" "$prompt_color" "$prompt_line" "$C_RESET" - printf "%b%s%b\n" "$C_OK" "$prompt_hint" "$C_RESET" - printf "\033[3A" - - old_stty="$(stty -g)" - stty -echo -icanon min 1 time 0 2>/dev/null || true - - while true; do - printf "\r\033[2K%s%s" "$prompt" "$input" - printf "\r\033[%dC" $(( ${#prompt} + cursor )) - - IFS= read -r -k 1 key || { - stty "$old_stty" 2>/dev/null || true - return 1 - } - - case "$key" in - $'\n'|$'\r') - break - ;; - $'\177'|$'\b') - if (( cursor > 0 )); then - input="${input[1,cursor-1]}${input[cursor+1,-1]}" - (( cursor-- )) - fi - ;; - $'\033') - IFS= read -r -k 1 key || key="" - if [[ "$key" == "[" ]]; then - IFS= read -r -k 1 key || key="" - case "$key" in - C) (( cursor < ${#input} )) && (( cursor++ )) ;; - D) (( cursor > 0 )) && (( cursor-- )) ;; - esac - fi - ;; - *) - input="${input[1,cursor]}${key}${input[cursor+1,-1]}" - (( cursor++ )) - ;; - esac - done - - stty "$old_stty" 2>/dev/null || true - printf "\r\033[2K" - surface_accept_scramble "$C_WARN" "${input:-menu}" - printf "\033[3B\r" - choice="$input" - return 0 - fi - - printf "%b%s%b\n" "$prompt_color" "$prompt_line" "$C_RESET" - printf "%b%s%b\n" "$C_OK" "$prompt_hint" "$C_RESET" - read_prompt "${C_TITLE}${label} > ${C_RESET}" "${label} > " || return 1 - printf "%b%s%b\n" "$prompt_color" "$prompt_line" "$C_RESET" - choice="$REPLY" -} - -main_loop() { - local choice - - while true; do - print_main_menu - read_main_choice || return - echo - handle_main_menu_choice "$choice" - done -} - -if ! main_menu_is_sourced; then - main_menu_direct_entry "$@" -fi diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-net-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-net-menu.sh deleted file mode 100644 index 9dde311..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-net-menu.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash - -print_net_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Network" "Network" "$width" "$panel_color" - surface_row "TOOLS" "$width" "$panel_color" - surface_split_row "1. Show IP + network info" "2. Ping test" "$width" "$panel_color" - surface_split_row "3. Show DNS + gateway" "4. Open Network Settings" "$width" "$panel_color" - surface_split_row "5. Copy IP info to clipboard" "b. Back" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -handle_net_menu_choice() { - local choice="$1" - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - b|B) return 1 ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - - return 0 -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read_menu_choice "Select net option [1-5,b] > " "network" || break - choice="$REPLY" - echo - - if ! handle_net_menu_choice "$choice"; then - break - fi - done -} - -open_net_menu() { - net_menu_loop -} diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-performance-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-performance-menu.sh deleted file mode 100644 index faa25ee..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-performance-menu.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env bash - -# Performance Menu for MQLaunch v3 -# Uses the Command Surface (v3) styling and sources data from v1 commands. - -performance_menu_is_sourced() { - if [[ -n "${ZSH_EVAL_CONTEXT:-}" ]]; then - [[ ":$ZSH_EVAL_CONTEXT:" == *:file:* ]] - return - fi - [[ "${BASH_SOURCE[0]:-}" != "$0" ]] -} - -# Source dependencies if not already available -if ! command -v surface_top >/dev/null 2>&1; then - BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - [[ -f "$BASE_DIR/ui/terminal-ui/mq-ui.sh" ]] && source "$BASE_DIR/ui/terminal-ui/mq-ui.sh" -fi - -# Compatibility with v1 commands -: "${PROJECT_ROOT:=$BASE_DIR}" - -if ! command -v perf_health_score >/dev/null 2>&1; then - BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - [[ -f "$BASE_DIR/terminal/mqlaunch-v1/commands/performance.sh" ]] && source "$BASE_DIR/terminal/mqlaunch-v1/commands/performance.sh" -fi - -render_performance_panel() { - local width panel_color score perf_status color output warnings - width="$(surface_terminal_width)" - - if [[ -t 1 ]]; then - panel_color=$'\033[0;37m' - else - panel_color="" - fi - - output="$(perf_health_score)" - score="$(echo "$output" | sed -n '1p')" - perf_status="$(perf_score_status "$score")" - color="$(perf_score_color "$score")" - - surface_top "Performance Hub" "$width" "$panel_color" - surface_row "Health Score: ${color}${score}/100${C_RESET} ($perf_status)" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - - surface_row "MONITORING" "$width" "$panel_color" - surface_split_row "1. Overview" "2. Detailed Health" "$width" "$panel_color" - surface_split_row "3. Top CPU" "4. Top Memory" "$width" "$panel_color" - surface_split_row "5. Disk Usage" "6. Network Overview" "$width" "$panel_color" - surface_split_row "7. Battery Status" "" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "TOOLS" "$width" "$panel_color" - surface_split_row "8. Create Snapshot" "9. Quick Watch" "$width" "$panel_color" - surface_split_row "10. MQ Scan" "b. Back" "$width" "$panel_color" - - surface_row "" "$width" "$panel_color" - surface_row "Signals: Load $(perf_load_1m) | Disk $(perf_disk_percent_root)% | Batt $(perf_battery_display)%" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" -} - -open_performance_menu() { - local choice - - while true; do - print_header - render_performance_panel - - # Reuse the main choice reader logic for consistency - if command -v read_main_choice >/dev/null 2>&1; then - read_main_choice || return - else - printf "\nmqlaunch > " - read -r choice - fi - - case "$choice" in - 1) command_perf_overview ;; - 2) command_perf_health_score ;; - 3) command_perf_cpu_top ;; - 4) command_perf_mem_top ;; - 5) command_perf_disk_usage ;; - 6) command_perf_network ;; - 7) command_perf_battery ;; - 8) command_perf_snapshot ;; - 9) command_perf_quick_watch ;; - 10) "$PROJECT_ROOT/tools/scripts/scan.sh"; pause_enter ;; - b|B|back) break ;; - x|X) exit 0 ;; - *) - # If it looks like a shell command, try to run it - if [[ -n "$choice" ]]; then - echo - /bin/zsh -lc "$choice" - pause_enter - fi - ;; - esac - done -} - -if ! performance_menu_is_sourced; then - open_performance_menu "$@" -fi diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-release-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-release-menu.sh deleted file mode 100755 index a79d4d3..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-release-menu.sh +++ /dev/null @@ -1,712 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -RELEASE_REPO="${MQ_RELEASE_REPO:-}" -RELEASE_SCRIPT="" -CHANGELOG_FILE="" -VERSION_FILE="" - -# shellcheck disable=SC2034 -APP_TITLE="MQ Release" -# shellcheck disable=SC2034 -APP_SUBTITLE="Release Automation and Versioning" -# shellcheck disable=SC2034 -APP_AUTHOR="Author Mattias Camner" -# shellcheck disable=SC2034 -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - # shellcheck disable=SC1090 - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -refresh_release_paths() { - RELEASE_SCRIPT="$RELEASE_REPO/release.sh" - CHANGELOG_FILE="$RELEASE_REPO/CHANGELOG.md" - VERSION_FILE="$RELEASE_REPO/VERSION" -} - -default_release_repo() { - local detected="" - - detected="$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null || true)" - if [[ -n "$detected" ]]; then - printf '%s\n' "$detected" - else - printf '%s\n' "$BASE_DIR" - fi -} - -resolve_repo_path() { - local path="$1" - - case "$path" in - \~) path="$HOME" ;; - \~/*) path="$HOME/${path#\~/}" ;; - esac - - if [[ "$path" != /* ]]; then - path="$(pwd)/$path" - fi - - (cd "$path" 2>/dev/null && pwd) || return 1 -} - -set_release_repo() { - local path="$1" - local resolved - - resolved="$(resolve_repo_path "$path")" || { - ui_err "Repo path not found: $path" - pause_enter - return 1 - } - - if [[ ! -d "$resolved/.git" ]]; then - ui_err "Not a git repository: $resolved" - pause_enter - return 1 - fi - - RELEASE_REPO="$resolved" - refresh_release_paths -} - -choose_release_repo() { - local path="" - - print_header - row_bold "SELECT RELEASE REPO" - empty_row - row "Detected from current PATH:" - row " $(default_release_repo)" - empty_row - row "Current repo:" - row " $RELEASE_REPO" - empty_row - row "Press Enter to keep current repo." - row "Or enter another repo path." - print_footer - - printf "%bRepo path: %b" "$C_TITLE" "$C_RESET" - read -r path - - if [[ -z "${path// }" ]]; then - refresh_release_paths - return 0 - fi - - set_release_repo "$path" -} - -require_release_script() { - if [[ ! -x "$RELEASE_SCRIPT" ]]; then - print_header - row_bold "RELEASE" - empty_row - row "Missing or non-executable script:" - row " $RELEASE_SCRIPT" - row "Run:" - row " chmod +x $RELEASE_SCRIPT" - print_footer - pause_enter - return 1 - fi -} - -init_release_files() { - local version today confirm - - print_header - row_bold "INITIALIZE RELEASE FILES" - empty_row - row "Repo:" - row " $RELEASE_REPO" - empty_row - row "This can create missing files:" - row " release.sh" - row " VERSION" - row " CHANGELOG.md" - empty_row - row "Existing files will not be overwritten." - print_footer - - printf "%bInitial version [0.1.0]: %b" "$C_TITLE" "$C_RESET" - read -r version - version="${version:-0.1.0}" - - printf "%bCreate missing release files? [y/N]: %b" "$C_TITLE" "$C_RESET" - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || { - ui_warn "Initialization cancelled." - pause_enter - return 1 - } - - today="$(date +%F)" - - if [[ ! -f "$VERSION_FILE" ]]; then - printf '%s\n' "$version" > "$VERSION_FILE" - fi - - if [[ ! -f "$CHANGELOG_FILE" ]]; then - cat > "$CHANGELOG_FILE" < - -All notable changes to this project will be documented in this file. - -## [$version] - $today - -### Added - -* Initial release setup -EOF_CHANGELOG - fi - - if [[ ! -f "$RELEASE_SCRIPT" ]]; then - cp "$BASE_DIR/release.sh" "$RELEASE_SCRIPT" - chmod +x "$RELEASE_SCRIPT" - elif [[ ! -x "$RELEASE_SCRIPT" ]]; then - chmod +x "$RELEASE_SCRIPT" - fi - - print_header - row_bold "INITIALIZE RELEASE FILES" - empty_row - row "Release files are ready:" - row " $RELEASE_SCRIPT" - row " $VERSION_FILE" - row " $CHANGELOG_FILE" - print_footer - pause_enter -} - -current_version() { - if [[ -f "$VERSION_FILE" ]]; then - head -n 1 "$VERSION_FILE" - else - echo "unknown" - fi -} - -latest_tag() { - git -C "$RELEASE_REPO" describe --tags --abbrev=0 2>/dev/null || true -} - -show_release_status() { - print_header - row_bold "RELEASE STATUS" - empty_row - - row "Repo: $RELEASE_REPO" - row "Current version: $(current_version)" - row "Latest tag: $(latest_tag || true)" - row "Release script: $RELEASE_SCRIPT" - row "Changelog: $CHANGELOG_FILE" - - print_footer - pause_enter -} - -show_changelog() { - print_header - row_bold "CHANGELOG" - empty_row - - if [[ ! -f "$CHANGELOG_FILE" ]]; then - row "Missing changelog:" - row " $CHANGELOG_FILE" - elif command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$CHANGELOG_FILE" | head -n 80 - else - head -n 80 "$CHANGELOG_FILE" - fi - - print_footer - pause_enter -} - -show_tags() { - print_header - row_bold "LATEST TAGS" - empty_row - - git -C "$RELEASE_REPO" tag --sort=-creatordate | head -n 12 || true - - print_footer - pause_enter -} - -open_changelog_in_editor() { - print_header - row_bold "OPEN CHANGELOG" - empty_row - row "Opening:" - row " $CHANGELOG_FILE" - print_footer - - if command -v code >/dev/null 2>&1; then - code "$CHANGELOG_FILE" - else - open "$CHANGELOG_FILE" - fi -} - -open_release_script_in_editor() { - print_header - row_bold "OPEN RELEASE SCRIPT" - empty_row - row "Opening:" - row " $RELEASE_SCRIPT" - print_footer - - if command -v code >/dev/null 2>&1; then - code "$RELEASE_SCRIPT" - else - open "$RELEASE_SCRIPT" - fi -} - -prompt_version() { - local prompt="$1" - - print_header - row_bold "$prompt" - empty_row - row "Example: 0.1.4" - print_footer - printf "%bVersion: %b" "$C_TITLE" "$C_RESET" - read -r REPLY - - if [[ -z "${REPLY// }" ]]; then - ui_warn "No version entered." - pause_enter - return 1 - fi -} - -run_release_command() { - local title="$1" - local status=0 - shift - - require_release_script || return 1 - - print_header - row_bold "$title" - empty_row - - ( - cd "$RELEASE_REPO" || exit 1 - "$RELEASE_SCRIPT" "$@" - ) || status=$? - - if [[ "$status" -ne 0 ]]; then - empty_row - row "Release command failed with exit code: $status" - fi - - print_footer - pause_enter - return "$status" -} - -run_release_dry() { - local version="" - prompt_version "DRY RUN RELEASE" || return 1 - version="$REPLY" - run_release_command "DRY RUN RELEASE" --dry-run "$version" -} - -run_release_live() { - local version="" - prompt_version "RUN RELEASE" || return 1 - version="$REPLY" - run_release_command "RUN RELEASE" "$version" -} - -create_github_release_only() { - local tag="" - local latest="" - - latest="$(latest_tag)" - - print_header - row_bold "CREATE GITHUB RELEASE" - empty_row - - if [[ -n "$latest" ]]; then - row "Press Enter to use latest tag: $latest" - fi - - print_footer - printf "%bTag: %b" "$C_TITLE" "$C_RESET" - read -r tag - - if [[ -z "${tag// }" && -n "$latest" ]]; then - tag="$latest" - fi - - if [[ -z "${tag// }" ]]; then - ui_warn "No tag entered." - pause_enter - return 1 - fi - - print_header - row_bold "GITHUB RELEASE" - empty_row - - local exit_code=0 - ( - cd "$RELEASE_REPO" || exit 1 - gh release create "$tag" \ - --title "Release $tag" \ - --notes-file "$CHANGELOG_FILE" - ) || exit_code=$? - - if [[ $exit_code -ne 0 ]]; then - ui_err "GitHub release failed (exit $exit_code). Check network/API status and try again." - else - ui_ok "Release $tag created successfully." - fi - - print_footer - pause_enter -} - -generate_changelog_section() { - local version="$1" - local changelog="$2" - local today last_tag commits entry confirm - - today="$(date +%F)" - last_tag="$(git -C "$RELEASE_REPO" describe --tags --abbrev=0 2>/dev/null || true)" - - if [[ -n "$last_tag" ]]; then - commits="$(git -C "$RELEASE_REPO" log "${last_tag}..HEAD" --oneline --no-merges 2>/dev/null || true)" - else - commits="$(git -C "$RELEASE_REPO" log --oneline --no-merges --max-count=20 2>/dev/null || true)" - fi - - print_header - row_bold "AUTO RELEASE — CHANGELOG" - empty_row - row "Genererar sektion för $version baserat på commits sedan $last_tag:" - empty_row - - if [[ -n "$commits" ]]; then - while IFS= read -r line; do - row " $line" - done <<< "$commits" - else - row " (inga commits hittades)" - fi - - empty_row - print_footer - - printf "%bSkriv in changelog-sektion automatiskt? [y/N]: %b" "$C_TITLE" "$C_RESET" - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || { - ui_warn "Hoppar över changelog-generering. Lägg till manuellt." - pause_enter - return 1 - } - - # Build the new section - entry="## [$version] - $today"$'\n' - entry+=$'\n' - entry+="### Changed"$'\n' - entry+=$'\n' - if [[ -n "$commits" ]]; then - while IFS= read -r line; do - entry+="* ${line#* }"$'\n' - done <<< "$commits" - else - entry+="* Release $version"$'\n' - fi - entry+=$'\n'"---"$'\n' - - # Insert after the header block (first blank line after the intro paragraph) - local header_end - header_end="$(grep -n "^All notable" "$changelog" | head -1 | cut -d: -f1)" - - if [[ -n "$header_end" ]]; then - local before after - before="$(head -n "$((header_end + 1))" "$changelog")" - after="$(tail -n "+$((header_end + 2))" "$changelog")" - printf '%s\n\n%s\n%s\n' "$before" "$entry" "$after" > "$changelog" - else - # Fallback: prepend after first line - local rest - rest="$(tail -n +2 "$changelog")" - printf '%s\n\n%s\n%s\n' "$(head -1 "$changelog")" "$entry" "$rest" > "$changelog" - fi - - ui_ok "Changelog-sektion för $version skriven." - pause_enter -} - -auto_release() { - local version confirm dry_status - - prompt_version "AUTO RELEASE" || return 1 - version="$REPLY" - - print_header - row_bold "AUTO RELEASE — PREVIEW" - empty_row - row "Repo: $RELEASE_REPO" - row "Version: $version" - empty_row - row "Steps:" - row " 1. Check working tree (commit or stash if dirty)" - row " 2. Auto-generate changelog (if missing)" - row " 3. Dry run" - row " 4. Live release" - row " 5. Create GitHub release" - empty_row - print_footer - - printf "%bProceed with auto release %s? [y/N]: %b" "$C_TITLE" "$version" "$C_RESET" - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || { ui_warn "Cancelled."; pause_enter; return 1; } - - # Check for unclean working tree - if ! git -C "$RELEASE_REPO" diff --quiet --ignore-submodules HEAD 2>/dev/null; then - local dirty_files - dirty_files="$(git -C "$RELEASE_REPO" status --short)" - - print_header - row_bold "AUTO RELEASE — UNCOMMITTED CHANGES" - empty_row - ui_warn "Working tree is not clean:" - empty_row - while IFS= read -r line; do row " $line"; done <<< "$dirty_files" - empty_row - row " c) Commit all changes" - row " s) Stash changes" - row " x) Abort" - print_footer - - printf "%b[c/s/x]: %b" "$C_TITLE" "$C_RESET" - read -r confirm - case "$confirm" in - c|C) - printf "%bCommit message: %b" "$C_TITLE" "$C_RESET" - read -r msg - msg="${msg:-chore: prepare release $version}" - (cd "$RELEASE_REPO" && git add -A && git commit -m "$msg") || { - ui_err "Commit failed." - pause_enter - return 1 - } - ui_ok "Committed." - ;; - s|S) - (cd "$RELEASE_REPO" && git stash push -m "auto-release stash before $version") || { - ui_err "Stash failed." - pause_enter - return 1 - } - ui_ok "Stashed." - ;; - *) - ui_warn "Aborted." - pause_enter - return 1 - ;; - esac - fi - - # Auto-generate changelog section if missing, then commit it - if [[ -f "$CHANGELOG_FILE" ]] && ! grep -q "$version" "$CHANGELOG_FILE"; then - generate_changelog_section "$version" "$CHANGELOG_FILE" || return 1 - if ! git -C "$RELEASE_REPO" diff --quiet "$CHANGELOG_FILE" 2>/dev/null; then - (cd "$RELEASE_REPO" && git add "$CHANGELOG_FILE" && \ - git commit -m "docs: add changelog section for $version") || { - ui_err "Failed to commit changelog. Fix manually and retry." - pause_enter - return 1 - } - ui_ok "Changelog committed." - fi - fi - - print_header - row_bold "AUTO RELEASE — DRY RUN" - empty_row - dry_status=0 - (cd "$RELEASE_REPO" && "$RELEASE_SCRIPT" --dry-run "$version") || dry_status=$? - - if [[ $dry_status -ne 0 ]]; then - empty_row - ui_err "Dry run failed (exit $dry_status). Aborting." - print_footer - pause_enter - return 1 - fi - - empty_row - row "Dry run OK." - print_footer - - printf "%bDry run passed. Run live release? [y/N]: %b" "$C_TITLE" "$C_RESET" - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || { ui_warn "Cancelled after dry run."; pause_enter; return 1; } - - print_header - row_bold "AUTO RELEASE — LIVE" - empty_row - (cd "$RELEASE_REPO" && "$RELEASE_SCRIPT" "$version") || { - ui_err "Live release failed. Check output above." - print_footer - pause_enter - return 1 - } - empty_row - row "Release $version complete." - row "Pushing commits and tags..." - print_footer - - (cd "$RELEASE_REPO" && git push && git push --tags) || { - ui_err "Push failed. Fix and push manually before creating GitHub release." - pause_enter - return 1 - } - ui_ok "Pushed." - - printf "%bCreate GitHub release for %s? [y/N]: %b" "$C_TITLE" "$version" "$C_RESET" - read -r confirm - if [[ "$confirm" =~ ^[Yy]$ ]]; then - ( - cd "$RELEASE_REPO" - gh release create "$version" \ - --title "Release $version" \ - --notes-file "$CHANGELOG_FILE" - ) && ui_ok "GitHub release $version created." || ui_err "GitHub release failed." - fi - - pause_enter -} - -print_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Release" "Release" "$width" "$panel_color" - surface_row "Repo: $RELEASE_REPO" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "CHECKS" "$width" "$panel_color" - surface_split_row "1. Release status" "2. Change repo" "$width" "$panel_color" - surface_split_row "3. Initialize files" "4. Dry run release" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "SHIP" "$width" "$panel_color" - surface_split_row "5. Run release" "6. Create GitHub release" "$width" "$panel_color" - surface_split_row "11. Auto release" "b. Back" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "REFERENCE" "$width" "$panel_color" - surface_split_row "7. View changelog" "8. Show latest tags" "$width" "$panel_color" - surface_split_row "9. Open changelog" "10. Open release script" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -menu_loop() { - local choice - - choose_release_repo || true - - while true; do - print_menu - if command -v read_main_choice >/dev/null 2>&1; then - read_main_choice "release" || return - else - read_menu_choice "Select option [1-11,b] > " "release" || return - choice="$REPLY" - fi - echo - - case "$choice" in - 1) show_release_status ;; - 2) choose_release_repo || true ;; - 3) init_release_files || true ;; - 4) run_release_dry || true ;; - 5) run_release_live || true ;; - 6) create_github_release_only || true ;; - 7) show_changelog ;; - 8) show_tags ;; - 9) open_changelog_in_editor ;; - 10) open_release_script_in_editor ;; - 11) require_release_script && auto_release || true ;; - b|B) ui_ok "Exiting."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -usage() { - cat <&2 - exit 1 -fi - -require_shortcuts_script() { - if [[ ! -x "$SHORTCUTS_SCRIPT" ]]; then - print_header - row_bold "SHORTCUTS" - empty_row - row "Missing or non-executable script:" - row " $SHORTCUTS_SCRIPT" - row "Run:" - row " chmod +x $SHORTCUTS_SCRIPT" - print_footer - pause_enter - return 1 - fi -} - -run_shortcuts_screen() { - local title="$1" - shift - - require_shortcuts_script || return 1 - - print_header - row_bold "$title" - empty_row - - if ! "$SHORTCUTS_SCRIPT" "$@"; then - echo - row "Shortcuts command failed." - fi - - print_footer - pause_enter -} - -list_shortcuts_menu() { - local folder="" - - print_header - row_bold "LIST SHORTCUTS" - empty_row - row "Leave folder blank to list everything." - print_footer - printf "${C_TITLE}Folder (optional): ${C_RESET}" - read -r folder - - if [[ -n "${folder// }" ]]; then - run_shortcuts_screen "SHORTCUTS IN: $folder" list "$folder" - else - run_shortcuts_screen "ALL SHORTCUTS" list - fi -} - -search_shortcuts_menu() { - local query="" - local folder="" - - print_header - row_bold "SEARCH SHORTCUTS" - empty_row - print_footer - printf "${C_TITLE}Search query: ${C_RESET}" - read -r query - - if [[ -z "${query// }" ]]; then - ui_err "Search query cannot be empty." - pause_enter - return 1 - fi - - printf "${C_TITLE}Folder (optional): ${C_RESET}" - read -r folder - - if [[ -n "${folder// }" ]]; then - run_shortcuts_screen "SEARCH: $query" search "$query" "$folder" - else - run_shortcuts_screen "SEARCH: $query" search "$query" - fi -} - -run_shortcut_menu() { - local name="" - local input_path="" - - print_header - row_bold "RUN SHORTCUT" - empty_row - print_footer - printf "${C_TITLE}Shortcut name: ${C_RESET}" - read -r name - - if [[ -z "${name// }" ]]; then - ui_err "Shortcut name cannot be empty." - pause_enter - return 1 - fi - - printf "${C_TITLE}Input path (optional): ${C_RESET}" - read -r input_path - - if [[ -n "${input_path// }" ]]; then - run_shortcuts_screen "RUN: $name" run "$name" "$input_path" - else - run_shortcuts_screen "RUN: $name" run "$name" - fi -} - -view_shortcut_menu() { - local name="" - - print_header - row_bold "VIEW SHORTCUT" - empty_row - print_footer - printf "${C_TITLE}Shortcut name: ${C_RESET}" - read -r name - - if [[ -z "${name// }" ]]; then - ui_err "Shortcut name cannot be empty." - pause_enter - return 1 - fi - - run_shortcuts_screen "VIEW: $name" view "$name" -} - -open_shortcuts_app() { - print_header - row_bold "OPEN SHORTCUTS APP" - empty_row - row "Opening Shortcuts..." - print_footer - open -a "Shortcuts" >/dev/null 2>&1 || { - ui_err "Could not open Shortcuts." - pause_enter - return 1 - } -} - -show_shortcuts_help() { - run_shortcuts_screen "MQSHORTCUTS HELP" help -} - -print_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Shortcuts" "Shortcuts" "$width" "$panel_color" - surface_row "BROWSE" "$width" "$panel_color" - surface_split_row "1. List shortcuts" "2. List folders" "$width" "$panel_color" - surface_split_row "3. Search shortcuts" "4. Run shortcut" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "ACTIONS" "$width" "$panel_color" - surface_split_row "5. View shortcut" "6. Open Shortcuts app" "$width" "$panel_color" - surface_split_row "7. Show mqshortcuts help" "b. Back" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -menu_loop() { - local choice - - while true; do - print_menu - read_menu_choice "Select option [1-7,b] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) list_shortcuts_menu ;; - 2) run_shortcuts_screen "SHORTCUT FOLDERS" folders ;; - 3) search_shortcuts_menu ;; - 4) run_shortcut_menu ;; - 5) view_shortcut_menu ;; - 6) open_shortcuts_app ;; - 7) show_shortcuts_help ;; - b|B) ui_ok "Exiting."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -usage() { - cat </dev/null 2>&1; then - read_main_choice "system" || return - else - printf "\nsystem > " - read -r choice - fi - echo - - case "$choice" in - 1) open_performance_menu ;; - 2) show_network_info ;; - 3) "$BASE_DIR/tools/scripts/network-ghost.sh"; pause_enter ;; - 4) "$BASE_DIR/tools/scripts/doctor.sh"; pause_enter ;; - 5) run_self_check || true; pause_enter ;; - 6) run_debug_bundle || true; pause_enter ;; - 7) system_check; pause_enter ;; - 8) "$BASE_DIR/tools/scripts/vault-scan.sh"; pause_enter ;; - 9) "$BASE_DIR/tools/scripts/overseer.sh"; pause_enter ;; - 10) lock_screen ;; - 11) sleep_display ;; - 12) restart_finder ;; - 13) show_date_time ;; - 14) open_base_dir ;; - 15) open_repo_browser ;; - b|B) return ;; - x|X) - echo "Exiting ${APP_TITLE}..." - exit 0 - ;; - *) - echo "${C_ERR}Invalid selection:${C_RESET} $choice" - pause_enter - ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/menus/mq-tools-menu.sh b/backups/scripts/20260509-030842/terminal/menus/mq-tools-menu.sh deleted file mode 100755 index 7fbbaf1..0000000 --- a/backups/scripts/20260509-030842/terminal/menus/mq-tools-menu.sh +++ /dev/null @@ -1,527 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -WORK_DIR="${MQ_WORK_DIR:-$PWD}" - -if repo_root="$(git -C "$WORK_DIR" rev-parse --show-toplevel 2>/dev/null)"; then - WORK_DIR="$repo_root" -fi - -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" - -# shellcheck disable=SC2034 -APP_TITLE="MQ Tools Menu" -# shellcheck disable=SC2034 -APP_SUBTITLE="Reusable Terminal Module" -# shellcheck disable=SC2034 -APP_AUTHOR="Author Mattias Camner" -# shellcheck disable=SC2034 -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - # shellcheck disable=SC1090 - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -SYSTEM_CHECK="$BASE_DIR/tools/scripts/system-check.sh" -DOCUMENT_FUNCTIONS="$BASE_DIR/tools/scripts/document-functions.sh" -DOCUMENT_FUNCTION_TARGETS=("$WORK_DIR") -DOCUMENT_FUNCTION_ARGS=(--summary --exclude '*.bak.*' --exclude '*/.git/*') -MQLAUNCH="$BASE_DIR/terminal/launchers/mqlaunch.sh" -DASHBOARD="$BASE_DIR/ui/dashboards/mq-dashboard.sh" -THEMES_DIR="$BASE_DIR/terminal/themes" -LAUNCHERS_DIR="$BASE_DIR/terminal/launchers" -MENUS_DIR="$BASE_DIR/terminal/menus" -GUIDE_HTML="$BASE_DIR/tools/mac-terminal-guide/mac-terminal-guide.html" -GUIDE_URL="https://mcamner.github.io/macos-scripts/" - -normalize_document_function_target() { - local target="$1" - - if [[ "$target" = /* ]]; then - printf '%s\n' "$target" - else - printf '%s/%s\n' "$WORK_DIR" "$target" - fi -} - -run_system_check() { - if [[ -x "$SYSTEM_CHECK" ]]; then - "$SYSTEM_CHECK" - else - print_header - row "SYSTEM CHECK" - empty_row - row "system-check.sh not found or not executable:" - row " $SYSTEM_CHECK" - print_footer - pause_enter - fi -} - -open_repo() { - open "$BASE_DIR" -} - -open_launchers() { - open "$LAUNCHERS_DIR" -} - -open_themes() { - open "$THEMES_DIR" -} - -open_menus() { - open "$MENUS_DIR" -} - -open_dashboard() { - if [[ -x "$DASHBOARD" ]]; then - bash "$DASHBOARD" menu - elif [[ -f "$DASHBOARD" ]]; then - chmod +x "$DASHBOARD" 2>/dev/null || true - bash "$DASHBOARD" menu - else - print_header - row "DASHBOARD" - empty_row - row "Dashboard script missing:" - row " $DASHBOARD" - print_footer - pause_enter - fi -} - -open_guide() { - if [[ -f "$GUIDE_HTML" ]]; then - open "$GUIDE_HTML" - else - open "$GUIDE_URL" - fi -} - -show_paths() { - print_header - row_bold "KEY PATHS" - empty_row - - row "BASE_DIR" - row " $BASE_DIR" - empty_row - - row "WORK_DIR" - row " $WORK_DIR" - empty_row - - row "MQLAUNCH" - row " $MQLAUNCH" - empty_row - - row "DASHBOARD" - row " $DASHBOARD" - empty_row - - row "THEMES DIR" - row " $THEMES_DIR" - empty_row - - row "MENUS DIR" - row " $MENUS_DIR" - - print_footer - pause_enter -} - -show_git_status() { - print_header - row_bold "GIT STATUS" - empty_row - - if [[ -d "$BASE_DIR/.git" ]]; then - git -C "$BASE_DIR" status --short --branch || true - else - row "Not a git repository:" - row " $BASE_DIR" - fi - - print_footer - pause_enter -} - -run_document_functions_preview() { - print_header - row_bold "DOCUMENT FUNCTIONS" - empty_row - - if [[ -x "$DOCUMENT_FUNCTIONS" ]]; then - run_document_functions_command "${DOCUMENT_FUNCTION_ARGS[@]}" "${DOCUMENT_FUNCTION_TARGETS[@]}" - elif [[ -f "$DOCUMENT_FUNCTIONS" ]]; then - run_document_functions_command "${DOCUMENT_FUNCTION_ARGS[@]}" "${DOCUMENT_FUNCTION_TARGETS[@]}" - else - row "document-functions.sh not found:" - row " $DOCUMENT_FUNCTIONS" - fi - - print_footer - if [[ -t 0 ]]; then - pause_enter - fi -} - -run_document_functions_command() { - if [[ -x "$DOCUMENT_FUNCTIONS" ]]; then - MACOS_SCRIPTS_HOME="$WORK_DIR" "$DOCUMENT_FUNCTIONS" "$@" - else - MACOS_SCRIPTS_HOME="$WORK_DIR" bash "$DOCUMENT_FUNCTIONS" "$@" - fi -} - -pause_if_interactive() { - if [[ -t 0 ]]; then - pause_enter - fi -} - -select_document_function_targets() { - local action="${1:-update}" - local selection custom target - - SELECTED_DOCUMENT_FUNCTION_TARGETS=() - - row "Choose what to $action:" - row " a. Current repo/path (default)" - row " 1. tools/scripts in current path" - row " 2. terminal/menus in current path" - row " 3. terminal/launchers in current path" - row " 4. One script/path" - row " c. Custom list" - row " q. Cancel" - empty_row - - printf 'Target [a,1-4,c,q] > ' - read -r selection - selection="${selection:-a}" - - case "$selection" in - a|A) - SELECTED_DOCUMENT_FUNCTION_TARGETS=("${DOCUMENT_FUNCTION_TARGETS[@]}") - ;; - 1) - SELECTED_DOCUMENT_FUNCTION_TARGETS=("$(normalize_document_function_target "tools/scripts")") - ;; - 2) - SELECTED_DOCUMENT_FUNCTION_TARGETS=("$(normalize_document_function_target "terminal/menus")") - ;; - 3) - SELECTED_DOCUMENT_FUNCTION_TARGETS=("$(normalize_document_function_target "terminal/launchers")") - ;; - 4) - printf 'Script/path > ' - read -r custom - if [[ -z "${custom// }" ]]; then - ui_warn "No path entered." - return 1 - fi - SELECTED_DOCUMENT_FUNCTION_TARGETS=("$(normalize_document_function_target "$custom")") - ;; - c|C) - row "Enter space-separated files or directories." - printf 'Paths > ' - read -r custom - if [[ -z "${custom// }" ]]; then - ui_warn "No paths entered." - return 1 - fi - for target in $custom; do - SELECTED_DOCUMENT_FUNCTION_TARGETS+=("$(normalize_document_function_target "$target")") - done - ;; - q|Q|n|N) - ui_warn "Cancelled." - return 1 - ;; - *) - ui_err "Unknown target selection: $selection" - return 1 - ;; - esac - - return 0 -} - -print_document_function_targets() { - local target - - for target in "${SELECTED_DOCUMENT_FUNCTION_TARGETS[@]}"; do - row " $target" - done -} - -run_document_functions_preview_selected() { - print_header - row_bold "DOCUMENT FUNCTIONS PREVIEW" - empty_row - - if [[ ! -f "$DOCUMENT_FUNCTIONS" ]]; then - row "document-functions.sh not found:" - row " $DOCUMENT_FUNCTIONS" - print_footer - pause_if_interactive - return 1 - fi - - if ! select_document_function_targets "preview"; then - print_footer - pause_if_interactive - return 0 - fi - - empty_row - run_document_functions_command "${DOCUMENT_FUNCTION_ARGS[@]}" "${SELECTED_DOCUMENT_FUNCTION_TARGETS[@]}" - - print_footer - pause_if_interactive -} - -run_document_functions_diff_selected() { - print_header - row_bold "DOCUMENT FUNCTIONS DIFF" - empty_row - - if [[ ! -f "$DOCUMENT_FUNCTIONS" ]]; then - row "document-functions.sh not found:" - row " $DOCUMENT_FUNCTIONS" - print_footer - pause_if_interactive - return 1 - fi - - if ! select_document_function_targets "diff"; then - print_footer - pause_if_interactive - return 0 - fi - - empty_row - run_document_functions_command --diff "${DOCUMENT_FUNCTION_ARGS[@]}" "${SELECTED_DOCUMENT_FUNCTION_TARGETS[@]}" - - print_footer - pause_if_interactive -} - -run_document_functions_check_selected() { - print_header - row_bold "DOCUMENT FUNCTIONS CHECK" - empty_row - - if [[ ! -f "$DOCUMENT_FUNCTIONS" ]]; then - row "document-functions.sh not found:" - row " $DOCUMENT_FUNCTIONS" - print_footer - pause_if_interactive - return 1 - fi - - if ! select_document_function_targets "check"; then - print_footer - pause_if_interactive - return 0 - fi - - empty_row - if run_document_functions_command --check "${DOCUMENT_FUNCTION_ARGS[@]}" "${SELECTED_DOCUMENT_FUNCTION_TARGETS[@]}"; then - ui_ok "All selected function comments are current." - else - ui_warn "Selected files need function comment updates." - fi - - print_footer - pause_if_interactive -} - -run_document_functions_update() { - local confirm - - print_header - row_bold "UPDATE FUNCTION COMMENTS" - empty_row - - if [[ ! -f "$DOCUMENT_FUNCTIONS" ]]; then - row "document-functions.sh not found:" - row " $DOCUMENT_FUNCTIONS" - print_footer - if [[ -t 0 ]]; then - pause_enter - fi - return 1 - fi - - if ! select_document_function_targets "update"; then - print_footer - if [[ -t 0 ]]; then - pause_enter - fi - return 0 - fi - - empty_row - row "This will add or refresh generated function comments in:" - print_document_function_targets - empty_row - row "Backups will be saved under backups/scripts before files are changed." - empty_row - - printf 'Update comments now? [y/N] ' - read -r confirm - if [[ ! "$confirm" =~ ^[Yy]$ ]]; then - ui_warn "Cancelled." - print_footer - if [[ -t 0 ]]; then - pause_enter - fi - return 0 - fi - - empty_row - run_document_functions_command --write --backup "${DOCUMENT_FUNCTION_ARGS[@]}" "${SELECTED_DOCUMENT_FUNCTION_TARGETS[@]}" - - print_footer - if [[ -t 0 ]]; then - pause_enter - fi -} - -print_document_functions_menu() { - print_header - row_bold "DOCUMENT FUNCTIONS" - empty_row - - row2 " 1. Preview active areas" " 2. Preview selected" - row2 " 3. Diff selected" " 4. Check selected" - row2 " 5. Update selected" " b. Back" - - print_footer -} - -document_functions_menu_loop() { - local choice - - while true; do - print_document_functions_menu - read_menu_choice "Select option [1-5,b] > " "docs" || return - choice="$REPLY" - echo - - case "$choice" in - 1) run_document_functions_preview ;; - 2) run_document_functions_preview_selected ;; - 3) run_document_functions_diff_selected ;; - 4) run_document_functions_check_selected ;; - 5) run_document_functions_update ;; - b|B) ui_ok "Back."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -print_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Tools Menu" "Tools" "$width" "$panel_color" - surface_row "SYSTEM" "$width" "$panel_color" - surface_split_row "1. Run system check" "2. Open repo folder" "$width" "$panel_color" - surface_split_row "3. Open launchers folder" "4. Open themes folder" "$width" "$panel_color" - surface_split_row "5. Open menus folder" "6. Open dashboard" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "REFERENCE" "$width" "$panel_color" - surface_split_row "7. Open terminal guide" "8. Show key paths" "$width" "$panel_color" - surface_split_row "9. Show git status" "10. Boot Maker" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "ACTIONS" "$width" "$panel_color" - surface_split_row "11. Blackout Mode" "12. Document functions" "$width" "$panel_color" - surface_split_row "b. Back" "" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -menu_loop() { - local choice - - while true; do - print_menu - read_menu_choice "Select option [1-12,b] > " "tools" || return - choice="$REPLY" - echo - - case "$choice" in - 1) run_system_check ;; - 2) open_repo ;; - 3) open_launchers ;; - 4) open_themes ;; - 5) open_menus ;; - 6) open_dashboard ;; - 7) open_guide ;; - 8) show_paths ;; - 9) show_git_status ;; - 10) "$BASE_DIR/tools/cli/boot-maker.sh"; pause_enter ;; - 11) "$BASE_DIR/tools/scripts/blackout.sh"; pause_enter ;; - 12) document_functions_menu_loop ;; - b|B) ui_ok "Exiting."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -usage() { - cat <&2 - exit 1 -fi - -require_project_boot() { - if [[ ! -x "$PROJECT_BOOT_SCRIPT" ]]; then - print_header - row_bold "WORKFLOWS" - empty_row - row "Missing or non-executable script:" - row " $PROJECT_BOOT_SCRIPT" - row "Run:" - row " chmod +x $PROJECT_BOOT_SCRIPT" - print_footer - pause_enter - return 1 - fi -} - -require_project_check() { - if [[ ! -x "$PROJECT_CHECK_SCRIPT" ]]; then - print_header - row_bold "WORKFLOWS" - empty_row - row "Missing or non-executable script:" - row " $PROJECT_CHECK_SCRIPT" - row "Run:" - row " chmod +x $PROJECT_CHECK_SCRIPT" - print_footer - pause_enter - return 1 - fi -} - -require_workspace() { - if [[ ! -x "$WORKSPACE_SCRIPT" ]]; then - print_header - row_bold "WORKFLOWS" - empty_row - row "Missing or non-executable script:" - row " $WORKSPACE_SCRIPT" - row "Run:" - row " chmod +x $WORKSPACE_SCRIPT" - print_footer - pause_enter - return 1 - fi -} - -run_project_boot_default() { - require_project_boot || return 1 - - print_header - row_bold "PROJECT BOOT" - empty_row - row "Starting default project boot..." - print_footer - - "$PROJECT_BOOT_SCRIPT" -} - -run_project_boot_custom() { - local project_name="" - local project_dir="" - local project_url="" - - require_project_boot || return 1 - - print_header - row_bold "CUSTOM PROJECT BOOT" - empty_row - row "Leave fields blank to use defaults." - print_footer - printf '%bProject name: %b' "$C_TITLE" "$C_RESET" - read -r project_name - printf '%bProject directory: %b' "$C_TITLE" "$C_RESET" - read -r project_dir - printf '%bProject URL: %b' "$C_TITLE" "$C_RESET" - read -r project_url - - project_name="${project_name:-macos-scripts}" - project_dir="${project_dir:-$HOME/macos-scripts}" - project_url="${project_url:-https://github.com/MCamner/macos-scripts}" - - print_header - row_bold "PROJECT BOOT" - empty_row - row "Project: $project_name" - row "Directory: $project_dir" - row "Repo URL: $project_url" - print_footer - - "$PROJECT_BOOT_SCRIPT" "$project_name" "$project_dir" "$project_url" -} - -run_project_check_default() { - require_project_check || return 1 - - print_header - row_bold "PROJECT CHECK" - empty_row - row "Running default project check..." - print_footer - - "$PROJECT_CHECK_SCRIPT" - pause_enter -} - -run_project_check_custom() { - local project_name="" - local project_dir="" - - require_project_check || return 1 - - print_header - row_bold "CUSTOM PROJECT CHECK" - empty_row - row "Leave fields blank to use defaults." - print_footer - printf '%bProject name: %b' "$C_TITLE" "$C_RESET" - read -r project_name - printf '%bProject directory: %b' "$C_TITLE" "$C_RESET" - read -r project_dir - - project_name="${project_name:-macos-scripts}" - project_dir="${project_dir:-$HOME/macos-scripts}" - - print_header - row_bold "PROJECT CHECK" - empty_row - row "Project: $project_name" - row "Directory: $project_dir" - print_footer - - "$PROJECT_CHECK_SCRIPT" "$project_name" "$project_dir" - pause_enter -} - -open_workflows_folder() { - print_header - row_bold "OPEN WORKFLOWS FOLDER" - empty_row - row "Opening:" - row " $WORKFLOWS_DIR" - print_footer - open "$WORKFLOWS_DIR" -} - -open_workflows_readme() { - local target="$WORKFLOWS_README" - - [[ -f "$target" ]] || target="$AUTOMATION_README" - - print_header - row_bold "OPEN WORKFLOWS README" - empty_row - row "Opening:" - row " $target" - print_footer - - if command -v code >/dev/null 2>&1; then - code "$target" - else - open "$target" - fi -} - -show_workflows_status() { - print_header - row_bold "WORKFLOWS STATUS" - empty_row - - row "Workflows dir: $WORKFLOWS_DIR" - row "Project boot: $PROJECT_BOOT_SCRIPT" - row "Project check: $PROJECT_CHECK_SCRIPT" - row "Workspace: $WORKSPACE_SCRIPT" - - if [[ -f "$WORKFLOWS_README" ]]; then - row "README: $WORKFLOWS_README" - else - row "README: missing" - fi - - print_footer - pause_enter -} - -open_workspace_menu() { - require_workspace || return 1 - "$WORKSPACE_SCRIPT" menu -} - -save_workspace_snapshot() { - require_workspace || return 1 - "$WORKSPACE_SCRIPT" save - pause_enter -} - -restore_workspace_snapshot() { - require_workspace || return 1 - "$WORKSPACE_SCRIPT" restore - pause_enter -} - -print_menu() { - local width panel_color - width="$(surface_terminal_width)" - panel_color="$(surface_panel_color)" - - print_header - surface_panel_header "Workflows" "Workflows" "$width" "$panel_color" - surface_row "PROJECT" "$width" "$panel_color" - surface_split_row "1. Workflows status" "2. Run project boot" "$width" "$panel_color" - surface_split_row "3. Custom project boot" "4. Run project check" "$width" "$panel_color" - surface_split_row "5. Custom project check" "6. Open workflows folder" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "REFERENCE" "$width" "$panel_color" - surface_split_row "7. Open workflows README" "8. Workspace snapshots" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "WORKSPACE" "$width" "$panel_color" - surface_split_row "9. Save workspace" "10. Restore workspace" "$width" "$panel_color" - surface_split_row "b. Back" "" "$width" "$panel_color" - surface_row "" "$width" "$panel_color" - surface_row "Status: ready" "$width" "$panel_color" - surface_bottom "$width" "$panel_color" - printf '\n' -} - -menu_loop() { - local choice - - while true; do - print_menu - read_menu_choice "Select option [1-10,b] > " "workflows" || return - choice="$REPLY" - echo - - case "$choice" in - 1) show_workflows_status ;; - 2) run_project_boot_default ;; - 3) run_project_boot_custom ;; - 4) run_project_check_default ;; - 5) run_project_check_custom ;; - 6) open_workflows_folder ;; - 7) open_workflows_readme ;; - 8) open_workspace_menu ;; - 9) save_workspace_snapshot ;; - 10) restore_workspace_snapshot ;; - b|B) ui_ok "Exiting."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -usage() { - cat </dev/null 2>&1; then - repo_state="clean" - else - repo_state="dirty" - fi - - if [[ -x "$test_script" ]]; then - if "$test_script" >/dev/null 2>&1; then - smoke_status="PASS" - else - smoke_status="FAIL" - fi - else - smoke_status="missing" - fi - - if [[ -d "$bundle_dir" ]]; then - latest_bundle="$(ls -1t "$bundle_dir" 2>/dev/null | head -n 1)" - [[ -z "$latest_bundle" ]] && latest_bundle="none" - fi - - print_kv "Project:" "macos-scripts" - print_kv "Version:" "$version" - print_kv "Release stage:" "baseline" - print_kv "Repo state:" "$repo_state" - print_kv "Smoke tests:" "$smoke_status" - print_kv "Guide HTML:" "$guide_html" - print_kv "Launcher:" "$launcher" - print_kv "Main menu:" "$main_menu" - print_kv "Help module:" "$help_menu" - print_kv "Latest bundle:" "$latest_bundle" - print_kv "Core menus:" "main / help / dev / ai / net" - - pause_enter -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/bundle.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/bundle.sh deleted file mode 100644 index 9661008..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/bundle.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -command_run_debug_bundle() { - print_header - print_section "Debug Bundle" - - local bundle_script="$PROJECT_ROOT/tools/scripts/create-debug-bundle.sh" - - if [[ ! -x "$bundle_script" ]]; then - err "Missing or non-executable: $bundle_script" - pause_enter - return 1 - fi - - local outfile - outfile="$("$bundle_script")" - local status=$? - - echo - if [[ $status -eq 0 ]]; then - ok "Debug bundle created:" - echo " $outfile" - [[ -f "$outfile" ]] && open -R "$outfile" 2>/dev/null || true - else - err "Debug bundle failed." - fi - - pause_enter - return $status -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/check.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/check.sh deleted file mode 100644 index 2dad67f..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/check.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -command_run_self_check() { - local check_script="$PROJECT_ROOT/tools/scripts/system-check.sh" - - if [[ -x "$check_script" ]]; then - "$check_script" - return $? - fi - - if [[ -f "$check_script" ]]; then - bash "$check_script" - return $? - fi - - command_health_check -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/dev.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/dev.sh deleted file mode 100755 index 30cd936..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/dev.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env bash - -command_git_status() { - print_header - print_section "Git Status" - (cd "$PROJECT_ROOT" && git status) - pause_enter -} - -command_git_pull() { - print_header - print_section "Git Pull" - (cd "$PROJECT_ROOT" && git pull) - pause_enter -} - -command_git_push() { - print_header - print_section "Git Push" - (cd "$PROJECT_ROOT" && git push) - pause_enter -} - -command_git_log_recent() { - print_header - print_section "Recent Commits" - (cd "$PROJECT_ROOT" && git log --oneline --decorate -n 12) - pause_enter -} - -command_git_branch_current() { - print_header - print_section "Current Branch" - (cd "$PROJECT_ROOT" && git branch --show-current) - echo - print_section "Branch Overview" - (cd "$PROJECT_ROOT" && git branch -vv) - pause_enter -} - -command_repo_open_root() { - open_path "$PROJECT_ROOT" -} - -command_repo_open_terminal() { - open_path "$PROJECT_ROOT/terminal" -} - -command_repo_open_tools() { - open_path "$PROJECT_ROOT/tools" -} - -command_repo_open_ai_prompts() { - if [[ -d "$PROJECT_ROOT/ai-prompts" ]]; then - open_path "$PROJECT_ROOT/ai-prompts" - else - err "Directory not found: $PROJECT_ROOT/ai-prompts" - pause_enter - return 1 - fi -} - -command_edit_v1_launcher() { - local target="$PROJECT_ROOT/terminal/mqlaunch-v1/mqlaunch.sh" - - if command_exists code; then - code "$target" - else - open "$target" - fi -} - -command_dev_repo_health() { - print_header - print_section "Repo Health" - - local current_branch - local last_commit - local changed_count - local untracked_count - - current_branch="$(cd "$PROJECT_ROOT" && git branch --show-current 2>/dev/null || echo "unknown")" - last_commit="$(cd "$PROJECT_ROOT" && git log -1 --pretty=format:'%h - %s (%cr)' 2>/dev/null || echo "No commits found")" - changed_count="$(cd "$PROJECT_ROOT" && git status --porcelain 2>/dev/null | grep -vc '^??' || true)" - untracked_count="$(cd "$PROJECT_ROOT" && git status --porcelain 2>/dev/null | grep -c '^??' || true)" - - print_kv "Branch:" "$current_branch" - print_kv "Last commit:" "$last_commit" - print_kv "Changed files:" "$changed_count" - print_kv "Untracked files:" "$untracked_count" - - echo - print_section "Git Status Summary" - (cd "$PROJECT_ROOT" && git status --short) - - pause_enter -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/index.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/index.sh deleted file mode 100644 index 82b14e1..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/index.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -command_show_command_index() { - print_header - print_section "Command Index" - - echo "CORE" - echo " mqlaunch Open main menu" - echo " mqlaunch help Show help" - echo " mqlaunch commands Show command index" - echo - - echo "WORKFLOWS" - echo " mqlaunch perf Performance module" - echo " mqlaunch dev Dev module" - echo " mqlaunch git Alias for Dev" - echo " mqlaunch tools Tools module" - echo " mqlaunch login Start session boot" - echo " mqlaunch shortcuts Open Shortcuts menu" - echo " mqlaunch shortcuts list" - echo " mqlaunch shortcuts search clip" - echo " mqlaunch login menu Session boot + full menu" - echo " mqlaunch login about Session boot + about screen" - echo " mqlaunch login check Session boot + self-check" - echo - - echo "STATUS / SUPPORT" - echo " mqlaunch about About / status dashboard" - echo " mqlaunch version Version information" - echo " mqlaunch notes Release notes / changelog" - echo " mqlaunch check Run self-check" - echo " mqlaunch bundle Create debug bundle" - echo - - echo "UTILITY" - echo " mqlaunch repo Open repo root" - echo " mqlaunch guide Open terminal guide" - echo - - echo "ALIASES" - echo " mqlaunch health Alias for check" - echo " mqlaunch support Alias for bundle" - echo " mqlaunch changelog Alias for notes" - echo " mqlaunch dashboard Alias for about" - echo " mqlaunch index Alias for commands" - echo " mqlaunch palette Alias for commands" - - pause_enter -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/login.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/login.sh deleted file mode 100644 index f6c08e5..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/login.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -command_run_login_boot() { - local login_menu="$PROJECT_ROOT/terminal/menus/mq-login-menu.sh" - local login_script="$PROJECT_ROOT/automation/login/mqlogin.sh" - - if [[ $# -eq 0 && -x "$login_menu" ]]; then - "$login_menu" menu - return $? - fi - - if [[ ! -x "$login_script" ]]; then - print_header - print_section "Login Boot" - echo "Missing or non-executable script:" - echo " $login_script" - echo - echo "Run:" - echo " chmod +x $login_script" - pause_enter - return 1 - fi - - "$login_script" "$@" -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/meta.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/meta.sh deleted file mode 100644 index 03ee762..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/meta.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -command_show_version() { - print_header - print_section "Version Info" - - local version_file="$PROJECT_ROOT/VERSION" - local version="unknown" - - if [[ -f "$version_file" ]]; then - version="$(head -n 1 "$version_file")" - fi - - print_kv "Project:" "macos-scripts" - print_kv "Version:" "$version" - print_kv "Release stage:" "baseline" - print_kv "Project root:" "$PROJECT_ROOT" - print_kv "Legacy launcher:" "$PROJECT_ROOT/terminal/launchers/mqlaunch.sh" - print_kv "V1 launcher:" "$PROJECT_ROOT/terminal/mqlaunch-v1/mqlaunch.sh" - - pause_enter -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/notes.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/notes.sh deleted file mode 100644 index 6b77399..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/notes.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -command_show_changelog() { - print_header - print_section "Release Notes" - - local changelog="$PROJECT_ROOT/CHANGELOG.md" - - if [[ ! -f "$changelog" ]]; then - err "Missing: $changelog" - pause_enter - return 1 - fi - - if command -v bat >/dev/null 2>&1; then - bat --style=plain --paging=never "$changelog" | head -n 80 - else - head -n 80 "$changelog" - fi - - pause_enter -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/performance.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/performance.sh deleted file mode 100755 index 1fcae30..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/performance.sh +++ /dev/null @@ -1,478 +0,0 @@ -#!/usr/bin/env bash - -performance_reports_dir() { - local dir="$PROJECT_ROOT/backups/performance-reports" - mkdir -p "$dir" - printf "%s\n" "$dir" -} - -perf_has_command() { - command -v "$1" >/dev/null 2>&1 -} - -perf_cpu_count() { - sysctl -n hw.logicalcpu 2>/dev/null || echo "1" -} - -perf_load_1m() { - uptime | awk -F'load averages?: ' '{print $2}' | awk -F', ' '{print $1}' | tr -d ' ' -} - -perf_disk_percent_root() { - df -h / | tail -1 | awk '{print $5}' | tr -d '%' -} - -perf_disk_line_root() { - df -h / | tail -1 -} - -perf_battery_percent() { - if perf_has_command pmset; then - pmset -g batt 2>/dev/null | grep -Eo '[0-9]+%' | head -1 | tr -d '%' || true - fi -} - -perf_battery_line() { - if perf_has_command pmset; then - pmset -g batt 2>/dev/null | tail -1 || echo "Battery info unavailable" - else - echo "Battery info unavailable" - fi -} - -perf_memory_pressure_raw() { - if perf_has_command memory_pressure; then - memory_pressure 2>/dev/null || true - fi -} - -perf_memory_pressure_tail() { - local mp - mp="$(perf_memory_pressure_raw)" - if [[ -n "$mp" ]]; then - echo "$mp" | tail -5 - else - echo "Memory pressure data unavailable" - fi -} - -perf_memory_pressure_level() { - local mp - mp="$(perf_memory_pressure_raw)" - - if echo "$mp" | grep -qi "System-wide memory free percentage"; then - local free_pct - free_pct="$(echo "$mp" | awk -F': ' '/System-wide memory free percentage/ {print $2}' | tr -d '%')" - - if [[ -n "${free_pct:-}" ]]; then - if (( free_pct < 5 )); then - echo "critical" - return - elif (( free_pct < 10 )); then - echo "high" - return - elif (( free_pct < 20 )); then - echo "medium" - return - else - echo "normal" - return - fi - fi - fi - - echo "unknown" -} - -perf_network_ip() { - ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || true -} - -perf_network_display() { - local ip - ip="$(perf_network_ip)" - [[ -z "$ip" ]] && ip="Unavailable" - echo "$ip" -} - -perf_battery_display() { - local batt - batt="$(perf_battery_percent)" - [[ -z "$batt" ]] && batt="N/A" - echo "$batt" -} - -perf_score_status() { - local score="$1" - if (( score >= 90 )); then - echo "Excellent" - elif (( score >= 75 )); then - echo "Good" - elif (( score >= 55 )); then - echo "Warning" - else - echo "Critical" - fi -} - -perf_score_color() { - local score="$1" - if (( score >= 90 )); then - printf "%s" "${C_GREEN:-$(printf '\033[32m')}" - elif (( score >= 75 )); then - printf "%s" "${C_CYAN:-$(printf '\033[36m')}" - elif (( score >= 55 )); then - printf "%s" "${C_YELLOW:-$(printf '\033[33m')}" - else - printf "%s" "${C_RED:-$(printf '\033[31m')}" - fi -} - -perf_health_score() { - local score=100 - local warnings=() - - local disk_pct - local batt_pct - local load_1m - local cpu_count - local mem_level - local net_ip - - disk_pct="$(perf_disk_percent_root)" - batt_pct="$(perf_battery_percent)" - load_1m="$(perf_load_1m)" - cpu_count="$(perf_cpu_count)" - mem_level="$(perf_memory_pressure_level)" - net_ip="$(perf_network_ip)" - - if [[ -n "${disk_pct:-}" ]]; then - if (( disk_pct >= 95 )); then - score=$((score - 40)) - warnings+=("Disk usage on / is critical (${disk_pct}%)") - elif (( disk_pct >= 90 )); then - score=$((score - 25)) - warnings+=("Disk usage on / is very high (${disk_pct}%)") - elif (( disk_pct >= 80 )); then - score=$((score - 12)) - warnings+=("Disk usage on / is elevated (${disk_pct}%)") - fi - fi - - if [[ -n "${batt_pct:-}" ]]; then - if (( batt_pct <= 10 )); then - score=$((score - 20)) - warnings+=("Battery is critically low (${batt_pct}%)") - elif (( batt_pct <= 20 )); then - score=$((score - 10)) - warnings+=("Battery is low (${batt_pct}%)") - fi - fi - - if [[ -n "${load_1m:-}" && -n "${cpu_count:-}" ]]; then - local load_ratio - load_ratio="$(awk -v load="$load_1m" -v cpu="$cpu_count" 'BEGIN { if (cpu <= 0) cpu=1; printf "%.2f", load/cpu }')" - - if awk -v r="$load_ratio" 'BEGIN { exit !(r >= 2.0) }'; then - score=$((score - 25)) - warnings+=("CPU load is critical (load/core ratio ${load_ratio})") - elif awk -v r="$load_ratio" 'BEGIN { exit !(r >= 1.2) }'; then - score=$((score - 12)) - warnings+=("CPU load is elevated (load/core ratio ${load_ratio})") - fi - fi - - case "$mem_level" in - critical) - score=$((score - 30)) - warnings+=("Memory pressure is critical") - ;; - high) - score=$((score - 18)) - warnings+=("Memory pressure is high") - ;; - medium) - score=$((score - 8)) - warnings+=("Memory pressure is elevated") - ;; - esac - - if [[ -z "${net_ip:-}" ]]; then - score=$((score - 8)) - warnings+=("No active primary network IP found") - fi - - (( score < 0 )) && score=0 - (( score > 100 )) && score=100 - - printf "%s\n" "$score" - printf "%s\n" "---WARNINGS---" - if (( ${#warnings[@]} == 0 )); then - printf "%s\n" "No major issues detected" - else - printf "%s\n" "${warnings[@]}" - fi -} - -command_perf_health_score() { - local output score perf_status color warnings width - width="$(surface_terminal_width)" - - output="$(perf_health_score)" - score="$(echo "$output" | sed -n '1p')" - warnings="$(echo "$output" | sed '1d' | sed '1d')" - perf_status="$(perf_score_status "$score")" - color="$(perf_score_color "$score")" - - print_header - surface_top "Performance Health Score" "$width" "$C_INFO" - surface_row "Score: ${color}${score}/100${C_RESET} ($perf_status)" "$width" "" - surface_row "" "$width" "" - - surface_row "SIGNALS" "$width" "$C_INFO" - surface_split_row "Load (1m): $(perf_load_1m)" "CPU cores: $(perf_cpu_count)" "$width" "" - surface_split_row "Disk (/): $(perf_disk_percent_root)%" "Battery: $(perf_battery_display)%" "$width" "" - surface_split_row "Memory: $(perf_memory_pressure_level)" "Network: $(perf_network_display)" "$width" "" - - if [[ -n "$warnings" && "$warnings" != "No major issues detected" ]]; then - surface_row "" "$width" "" - surface_row "WARNINGS" "$width" "$C_WARN" - while IFS= read -r line; do - [[ -z "$line" ]] && continue - surface_row "! $line" "$width" "" - done <<< "$warnings" - fi - - surface_bottom "$width" "$C_INFO" - pause_enter -} - -command_perf_overview() { - local cpu_line mem_pressure disk_line ip_addr battery_line score_output score perf_status color warnings width - width="$(surface_terminal_width)" - - cpu_line="$(uptime)" - mem_pressure="$(perf_memory_pressure_level)" - disk_line="$(perf_disk_percent_root)%" - ip_addr="$(perf_network_display)" - battery_line="$(perf_battery_display)%" - - score_output="$(perf_health_score)" - score="$(echo "$score_output" | sed -n '1p')" - warnings="$(echo "$score_output" | sed '1d' | sed '1d')" - perf_status="$(perf_score_status "$score")" - color="$(perf_score_color "$score")" - - print_header - surface_top "Performance Overview" "$width" "$C_INFO" - surface_row "Health score: ${color}${score}/100${C_RESET} ($perf_status)" "$width" "" - surface_row "" "$width" "" - - surface_row "SYSTEM STATE" "$width" "$C_INFO" - surface_row "Load: $cpu_line" "$width" "" - surface_row "Disk: $disk_line Memory: $mem_pressure Battery: $battery_line" "$width" "" - surface_row "Network IP: $ip_addr" "$width" "" - - if [[ -n "$warnings" && "$warnings" != "No major issues detected" ]]; then - surface_row "" "$width" "" - surface_row "WARNINGS" "$width" "$C_WARN" - while IFS= read -r line; do - [[ -z "$line" ]] && continue - surface_row "! $line" "$width" "" - done <<< "$warnings" - fi - - surface_bottom "$width" "$C_INFO" - pause_enter -} - -command_perf_cpu_top() { - print_header - print_section "Top CPU Processes" - - ps -Ao pid,ppid,%cpu,%mem,etime,comm | sort -k3 -nr | head -n 15 - - pause_enter -} - -command_perf_mem_top() { - print_header - print_section "Top Memory Processes" - - ps -Ao pid,ppid,%mem,%cpu,etime,comm | sort -k3 -nr | head -n 15 - - pause_enter -} - -command_perf_disk_usage() { - print_header - print_section "Disk Usage" - - df -h - echo - - print_section "Largest folders in project root" - du -sh "$PROJECT_ROOT"/* 2>/dev/null | sort -hr | head -n 20 - - pause_enter -} - -command_perf_network() { - print_header - print_section "Network Overview" - - echo "Active IP:" - echo "$(perf_network_display)" - echo - - echo "Routes:" - netstat -rn | head -n 20 - echo - - echo "Listening ports:" - lsof -nP -iTCP -sTCP:LISTEN 2>/dev/null | head -n 20 - - pause_enter -} - -command_perf_battery() { - print_header - print_section "Battery Status" - - if perf_has_command pmset; then - pmset -g batt 2>/dev/null || echo "Battery data unavailable" - echo - pmset -g ps 2>/dev/null || true - else - echo "Battery data unavailable" - fi - - pause_enter -} - -command_perf_snapshot() { - print_header - print_section "Create Performance Snapshot" - - local reports_dir - local ts - local outfile - local score_output - local score - local warnings - - reports_dir="$(performance_reports_dir)" - ts="$(date +"%Y-%m-%d_%H-%M-%S")" - outfile="$reports_dir/perf-snapshot-$ts.txt" - - score_output="$(perf_health_score)" - score="$(echo "$score_output" | sed -n '1p')" - warnings="$(echo "$score_output" | sed '1d' | sed '1d')" - - { - echo "macOS Performance Snapshot" - echo "Generated: $(date)" - echo "Host: $(scutil --get ComputerName 2>/dev/null || hostname)" - echo "User: $(whoami)" - echo - - echo "=== HEALTH SCORE ===" - echo "Score: $score/100" - echo "Status: $(perf_score_status "$score")" - echo "Warnings:" - echo "$warnings" - echo - - echo "=== UPTIME / LOAD ===" - uptime - echo - - echo "=== DISK ===" - df -h - echo - - echo "=== MEMORY PRESSURE ===" - perf_memory_pressure_raw || echo "memory_pressure unavailable" - echo - - echo "=== VM STAT ===" - vm_stat - echo - - echo "=== TOP CPU ===" - ps -Ao pid,ppid,%cpu,%mem,etime,comm | sort -k3 -nr | head -n 20 - echo - - echo "=== TOP MEMORY ===" - ps -Ao pid,ppid,%mem,%cpu,etime,comm | sort -k3 -nr | head -n 20 - echo - - echo "=== NETWORK ===" - perf_network_display - echo - netstat -rn | head -n 40 - echo - lsof -nP -iTCP -sTCP:LISTEN 2>/dev/null | head -n 40 - echo - - echo "=== BATTERY ===" - perf_battery_line - echo - - echo "=== PROJECT SIZE ===" - du -sh "$PROJECT_ROOT"/* 2>/dev/null | sort -hr | head -n 50 - echo - } > "$outfile" - - ok "Snapshot created:" - echo "$outfile" - echo - - if command_exists open; then - open -R "$outfile" 2>/dev/null || true - fi - - pause_enter -} - -command_perf_quick_watch() { - print_header - print_section "Quick Watch" - - echo "Refreshing every 2 seconds. Press Ctrl+C to stop." - echo - - while true; do - local score_output - local score - local perf_status - local disk_line - local batt_line - - score_output="$(perf_health_score)" - score="$(echo "$score_output" | sed -n '1p')" - perf_status="$(perf_score_status "$score")" - disk_line="$(perf_disk_line_root)" - batt_line="$(perf_battery_line)" - - clear - print_section "Quick Watch" - print_kv "Time:" "$(date)" - print_kv "Health:" "$score/100 ($perf_status)" - echo - print_divider - echo - uptime - echo - echo "$disk_line" - echo - echo "$batt_line" - echo - echo "Top CPU:" - ps -Ao %cpu,comm | sort -nr | head -n 6 - echo - echo "Top Memory:" - ps -Ao %mem,comm | sort -nr | head -n 6 - sleep 2 - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/repo.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/repo.sh deleted file mode 100755 index a0046ff..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/repo.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -command_open_repo() { - open_path "$PROJECT_ROOT" -} - -command_open_terminal_dir() { - open_path "$PROJECT_ROOT/terminal" -} - -command_open_tools_dir() { - open_path "$PROJECT_ROOT/tools" -} - -command_open_ai_prompts_dir() { - if [[ -d "$PROJECT_ROOT/ai-prompts" ]]; then - open_path "$PROJECT_ROOT/ai-prompts" - else - err "Directory not found: $PROJECT_ROOT/ai-prompts" - return 1 - fi -} - -command_open_terminal_guide() { - local html="$PROJECT_ROOT/tools/mac-terminal-guide/mac-terminal-guide.html" - local readme="$PROJECT_ROOT/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - err "No terminal guide found." - return 1 - fi -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/shortcuts.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/shortcuts.sh deleted file mode 100644 index 3fc9cb6..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/shortcuts.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -command_run_shortcuts_helper() { - local shortcuts_menu="$PROJECT_ROOT/terminal/menus/mq-shortcuts-menu.sh" - local shortcuts_script="$PROJECT_ROOT/automation/shortcuts/mqshortcuts.sh" - - if [[ $# -eq 0 && -x "$shortcuts_menu" ]]; then - "$shortcuts_menu" menu - return $? - fi - - if [[ ! -x "$shortcuts_script" ]]; then - print_header - print_section "Shortcuts" - echo "Missing or non-executable script:" - echo " $shortcuts_script" - echo - echo "Run:" - echo " chmod +x $shortcuts_script" - pause_enter - return 1 - fi - - "$shortcuts_script" "$@" -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/system.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/system.sh deleted file mode 100755 index d1ecd55..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/system.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash - -command_health_check() { - print_header - print_section "System Health Check" - - echo "Hostname: $(scutil --get ComputerName 2>/dev/null || hostname)" - echo "User: $(whoami)" - echo "Shell: $SHELL" - echo "Date: $(date)" - echo - - print_section "Disk" - df -h / | tail -1 - - print_section "Memory" - vm_stat | head -10 - - print_section "Uptime" - uptime - - print_section "Network" - ipconfig getifaddr en0 2>/dev/null || echo "No en0 IP found" - - pause_enter -} - -command_lock_screen() { - /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend -} - -command_show_date_time() { - print_header - print_section "Date & Time" - date - pause_enter -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/tools.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/tools.sh deleted file mode 100755 index 92c9044..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/commands/tools.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env bash - -command_tools_open_tools_root() { - open_path "$PROJECT_ROOT/tools" -} - -command_tools_open_scripts_dir() { - local dir="$PROJECT_ROOT/tools/scripts" - if [[ -d "$dir" ]]; then - open_path "$dir" - else - err "Directory not found: $dir" - pause_enter - return 1 - fi -} - -command_tools_open_cli_dir() { - local dir="$PROJECT_ROOT/tools/cli" - if [[ -d "$dir" ]]; then - open_path "$dir" - else - err "Directory not found: $dir" - pause_enter - return 1 - fi -} - -command_tools_open_guide_dir() { - local dir="$PROJECT_ROOT/tools/mac-terminal-guide" - if [[ -d "$dir" ]]; then - open_path "$dir" - else - err "Directory not found: $dir" - pause_enter - return 1 - fi -} - -command_tools_open_guide_file() { - local html="$PROJECT_ROOT/tools/mac-terminal-guide/mac-terminal-guide.html" - local readme="$PROJECT_ROOT/tools/mac-terminal-guide/README.md" - - if [[ -f "$html" ]]; then - open "$html" - elif [[ -f "$readme" ]]; then - open "$readme" - else - err "No terminal guide file found." - pause_enter - return 1 - fi -} - -command_tools_list_tree() { - print_header - print_section "Tools Tree" - - if [[ -d "$PROJECT_ROOT/tools" ]]; then - find "$PROJECT_ROOT/tools" -maxdepth 2 \( -type d -o -type f \) | sed "s|$PROJECT_ROOT/||" | sort - else - err "Tools directory not found: $PROJECT_ROOT/tools" - fi - - pause_enter -} - -command_tools_repo_summary() { - print_header - print_section "Tools Summary" - - local tools_dir="$PROJECT_ROOT/tools" - local dir_count="0" - local file_count="0" - - if [[ ! -d "$tools_dir" ]]; then - err "Tools directory not found: $tools_dir" - pause_enter - return 1 - fi - - dir_count="$(find "$tools_dir" -type d | wc -l | awk '{print $1}')" - file_count="$(find "$tools_dir" -type f | wc -l | awk '{print $1}')" - - print_kv "Tools root:" "$tools_dir" - print_kv "Directories:" "$dir_count" - print_kv "Files:" "$file_count" - - echo - print_section "Top-level entries" - find "$tools_dir" -maxdepth 1 -mindepth 1 | sed "s|$PROJECT_ROOT/||" | sort - - pause_enter -} - -command_tools_find_readmes() { - print_header - print_section "README Files Under tools/" - - if [[ -d "$PROJECT_ROOT/tools" ]]; then - find "$PROJECT_ROOT/tools" -iname "README.md" | sed "s|$PROJECT_ROOT/||" | sort - else - err "Tools directory not found: $PROJECT_ROOT/tools" - fi - - pause_enter -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/core.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/core.sh deleted file mode 100755 index cab7792..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/core.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env bash - -set -u - -MQ_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -PROJECT_ROOT="$(cd "$MQ_ROOT/../.." && pwd)" - -# Colors -C_RESET='\033[0m' -C_BOLD='\033[1m' -C_DIM='\033[2m' -C_RED='\033[31m' -C_GREEN='\033[32m' -C_YELLOW='\033[33m' -C_BLUE='\033[34m' -C_MAGENTA='\033[35m' -C_CYAN='\033[36m' - -msg() { - printf "%b\n" "$*" -} - -info() { - msg "${C_CYAN}$*${C_RESET}" -} - -ok() { - msg "${C_GREEN}$*${C_RESET}" -} - -warn() { - msg "${C_YELLOW}$*${C_RESET}" -} - -err() { - msg "${C_RED}$*${C_RESET}" >&2 -} - -die() { - err "$*" - exit 1 -} - -command_exists() { - command -v "$1" >/dev/null 2>&1 -} - -require_command() { - command_exists "$1" || die "Missing required command: $1" -} - -pause_enter() { - printf "\nPress Enter to continue..." - read -r _ -} - -clear_screen() { - clear -} - -project_path() { - printf "%s/%s\n" "$PROJECT_ROOT" "$1" -} - -open_path() { - local target="$1" - - if [[ ! -e "$target" ]]; then - err "Path not found: $target" - return 1 - fi - - open "$target" -} - -run_script_if_exists() { - local script="$1" - - if [[ -f "$script" ]]; then - bash "$script" - else - err "Script not found: $script" - return 1 - fi -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/router.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/router.sh deleted file mode 100755 index cbc1b31..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/lib/router.sh +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env bash - -route_command() { - local cmd="${1:-menu}" - shift || true - - case "$cmd" in - menu|main) - menu_main - ;; - system) - menu_system - ;; - tools|tools-v1|menu-tools-v1) - menu_tools - ;; - shortcuts|shortcut|sc) - command_run_shortcuts_helper "$@" - ;; - login|boot|session) - command_run_login_boot "$@" - ;; - automation|auto) - menu_automation - ;; - dev|git|dev-v1) - menu_dev - ;; - ai) - menu_ai - ;; - performance|perf) - menu_performance - ;; - version|ver|about-version) - command_show_version - ;; - about|status|dashboard) - command_show_about_dashboard - ;; - check|health) - command_run_self_check - ;; - bundle|debug-bundle|support) - command_run_debug_bundle - ;; - notes|changelog|release-notes) - command_show_changelog - ;; - commands|index|palette) - command_show_command_index - ;; - repo) - command_open_repo - ;; - guide|terminal-guide) - command_open_terminal_guide - ;; - help|-h|--help) - show_help - ;; - x|exit|quit) - return 0 - ;; - *) - err "Unknown command: $cmd" - echo - show_help - return 1 - ;; - esac -} - -show_help() { - cat < " - read -r choice - - case "$choice" in - 1) command_open_ai_prompts_dir ;; - 2) command_open_repo ;; - b|B|back) break ;; - *) warn "Unknown choice: $choice"; sleep 1 ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/automation.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/automation.sh deleted file mode 100755 index b3a1661..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/automation.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -menu_automation() { - local choice - - while true; do - print_header - print_section "Automation Menu" - print_menu_item "1" "Open automation folder" - print_menu_item "b" "Back" - print_footer_hint - - printf "\n> " - read -r choice - - case "$choice" in - 1) open_path "$PROJECT_ROOT/automation" ;; - b|B|back) break ;; - *) warn "Unknown choice: $choice"; sleep 1 ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/dev.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/dev.sh deleted file mode 100755 index 5cb2fa2..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/dev.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash - -menu_dev() { - local choice - - while true; do - print_header - print_section "Dev Menu" - print_menu_item "1" "Repo health" - print_menu_item "2" "Git status" - print_menu_item "3" "Git pull" - print_menu_item "4" "Git push" - print_menu_item "5" "Recent commits" - print_menu_item "6" "Current branch" - print_menu_item "7" "Open repo root" - print_menu_item "8" "Open terminal folder" - print_menu_item "9" "Open tools folder" - print_menu_item "10" "Open AI prompts folder" - print_menu_item "11" "Edit v1 launcher" - print_menu_item "b" "Back" - print_footer_hint - - printf "\n> " - read -r choice - - case "$choice" in - 1) command_dev_repo_health ;; - 2) command_git_status ;; - 3) command_git_pull ;; - 4) command_git_push ;; - 5) command_git_log_recent ;; - 6) command_git_branch_current ;; - 7) command_repo_open_root ;; - 8) command_repo_open_terminal ;; - 9) command_repo_open_tools ;; - 10) command_repo_open_ai_prompts ;; - 11) command_edit_v1_launcher ;; - b|B|back) break ;; - *) warn "Unknown choice: $choice"; sleep 1 ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/main.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/main.sh deleted file mode 100755 index ad8e92a..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/main.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash - -menu_main() { - local choice - - while true; do - print_header - print_section "Main Menu" - print_menu_item "1" "System" - print_menu_item "2" "Tools" - print_menu_item "3" "Automation" - print_menu_item "4" "Dev" - print_menu_item "5" "AI" - print_menu_item "6" "Performance" - print_menu_item "7" "Health Check" - print_menu_item "8" "Open Repo" - print_menu_item "9" "Open Terminal Guide" - print_menu_item "x" "Exit" - print_footer_hint - - printf "\n> " - read -r choice - - case "$choice" in - 1) menu_system ;; - 2) menu_tools ;; - 3) menu_automation ;; - 4) menu_dev ;; - 5) menu_ai ;; - 6) menu_performance ;; - 7) command_health_check ;; - 8) command_open_repo ;; - 9) command_open_terminal_guide ;; - x|X|exit|quit) break ;; - *) warn "Unknown choice: $choice"; sleep 1 ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/performance.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/performance.sh deleted file mode 100755 index e8fe914..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/performance.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash - -menu_performance() { - local choice - - while true; do - print_header - print_section "Performance Menu" - print_menu_item "1" "Overview" - print_menu_item "2" "Health score" - print_menu_item "3" "Top CPU processes" - print_menu_item "4" "Top memory processes" - print_menu_item "5" "Disk usage" - print_menu_item "6" "Network overview" - print_menu_item "7" "Battery status" - print_menu_item "8" "Create performance snapshot" - print_menu_item "9" "Quick watch" - print_menu_item "10" "MQ scan" - print_menu_item "b" "Back" - print_footer_hint - - printf "\n> " - read -r choice - - case "$choice" in - 1) command_perf_overview ;; - 2) command_perf_health_score ;; - 3) command_perf_cpu_top ;; - 4) command_perf_mem_top ;; - 5) command_perf_disk_usage ;; - 6) command_perf_network ;; - 7) command_perf_battery ;; - 8) command_perf_snapshot ;; - 9) command_perf_quick_watch ;; - 10) "$PROJECT_ROOT/tools/scripts/scan.sh"; pause_enter ;; - b|B|back) break ;; - *) warn "Unknown choice: $choice"; sleep 1 ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/system.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/system.sh deleted file mode 100755 index 2ea2432..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/system.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -menu_system() { - local choice - - while true; do - print_header - print_section "System Menu" - print_menu_item "1" "Health Check" - print_menu_item "2" "Show Date & Time" - print_menu_item "3" "Lock Screen" - print_menu_item "b" "Back" - print_footer_hint - - printf "\n> " - read -r choice - - case "$choice" in - 1) command_health_check ;; - 2) command_show_date_time ;; - 3) command_lock_screen ;; - b|B|back) break ;; - *) warn "Unknown choice: $choice"; sleep 1 ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/tools.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/tools.sh deleted file mode 100755 index 8607500..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/menus/tools.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -menu_tools() { - local choice - - while true; do - print_header - print_section "Tools Menu" - print_menu_item "1" "Open tools root" - print_menu_item "2" "Open scripts folder" - print_menu_item "3" "Open CLI folder" - print_menu_item "4" "Open terminal guide folder" - print_menu_item "5" "Open terminal guide file" - print_menu_item "6" "Show tools tree" - print_menu_item "7" "Show tools summary" - print_menu_item "8" "Find README files" - print_menu_item "b" "Back" - print_footer_hint - - printf "\n> " - read -r choice - - case "$choice" in - 1) command_tools_open_tools_root ;; - 2) command_tools_open_scripts_dir ;; - 3) command_tools_open_cli_dir ;; - 4) command_tools_open_guide_dir ;; - 5) command_tools_open_guide_file ;; - 6) command_tools_list_tree ;; - 7) command_tools_repo_summary ;; - 8) command_tools_find_readmes ;; - b|B|back) break ;; - *) warn "Unknown choice: $choice"; sleep 1 ;; - esac - done -} diff --git a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/mqlaunch.sh b/backups/scripts/20260509-030842/terminal/mqlaunch-v1/mqlaunch.sh deleted file mode 100755 index 4be1000..0000000 --- a/backups/scripts/20260509-030842/terminal/mqlaunch-v1/mqlaunch.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" - -# shellcheck source=/dev/null -source "$SCRIPT_DIR/lib/core.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/lib/ui.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/lib/router.sh" - -# Commands -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/system.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/repo.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/dev.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/performance.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/tools.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/meta.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/check.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/bundle.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/notes.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/about.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/login.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/commands/shortcuts.sh" - -# Menus -# shellcheck source=/dev/null -source "$SCRIPT_DIR/menus/main.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/menus/system.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/menus/tools.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/menus/automation.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/menus/dev.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/menus/ai.sh" -# shellcheck source=/dev/null -source "$SCRIPT_DIR/menus/performance.sh" - -main() { - route_command "$@" -} - -main "$@" diff --git a/backups/scripts/20260509-030842/terminal/release/mq-release-check.sh b/backups/scripts/20260509-030842/terminal/release/mq-release-check.sh deleted file mode 100755 index 575bd0e..0000000 --- a/backups/scripts/20260509-030842/terminal/release/mq-release-check.sh +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env bash -set -u - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -AI_PROMPTS="$BASE_DIR/terminal/ai-prompts/mq-ai-prompts.sh" - -[[ -f "$AI_PROMPTS" ]] && source "$AI_PROMPTS" - -cd "$BASE_DIR" || { - echo "Missing repo: $BASE_DIR" - exit 1 -} - -rule() { - printf '%*s\n' "${1:-72}" '' | tr ' ' '─' -} - -section() { - echo - echo "$1" - rule 72 -} - -status_ok() { - echo " ✔ $1" -} - -status_warn() { - echo " ⚠ $1" -} - -print_section() { section "$1"; } -pass() { status_ok "$1"; } -warn() { status_warn "$1"; } -fail() { echo " ✘ $1"; } - -title() { - echo "MQ RELEASE CHECK" - rule 72 - echo "Host: $(hostname -s 2>/dev/null || echo unknown) User: ${USER:-unknown} Repo: $BASE_DIR" - echo "Mode: release-check" - rule 72 -} - -title - -section "GIT STATUS" -if [[ -z "$(git status --short)" ]]; then - status_ok "Working tree clean" -else - git status --short -fi - -section "SECRETS SCAN" -if command -v gitleaks >/dev/null 2>&1; then - if gitleaks git --pre-commit --staged -v; then - status_ok "No staged secrets found" - else - status_warn "Secrets scan found issues" - fi -else - status_warn "gitleaks not installed" -fi - -section "SYSTEM CHECK" -if [[ -x "$BASE_DIR/tools/scripts/doctor.sh" ]]; then - "$BASE_DIR/tools/scripts/doctor.sh" -else - status_warn "doctor.sh not found" -fi - -section "RECENT COMMITS" -git log --oneline -5 - -section "AI CHECK PROMPTS" -if declare -f mq_ai_prompt_review >/dev/null; then - mq_ai_prompt_review -else - status_warn "Missing mq_ai_prompt_review" -fi - -if declare -f mq_ai_prompt_ui >/dev/null; then - mq_ai_prompt_ui -else - status_warn "Missing mq_ai_prompt_ui" -fi - -section "RELEASE CHECKLIST" -cat <<'CHECKLIST' - [ ] git status is clean or expected - [ ] no staged secrets found - [ ] doctor check reviewed - [ ] /review prompt checked - [ ] /ui prompt checked - [ ] README/help text updated if commands changed - [ ] version/changelog updated if this is a release - [ ] tests or syntax checks passed -CHECKLIST - -check_changelog_matches_commits() { - print_section "CHANGELOG / COMMITS" - - local version - version="$(cat VERSION 2>/dev/null | tr -d '[:space:]')" - - if [[ -z "$version" ]]; then - fail "VERSION file missing or empty" - return 1 - fi - - if [[ ! -f CHANGELOG.md ]]; then - fail "CHANGELOG.md missing" - return 1 - fi - - if ! grep -qE "^## \[?v?${version}\]?" CHANGELOG.md; then - fail "CHANGELOG.md has no entry for version ${version}" - echo "Expected heading like:" - echo " ## [${version}] - YYYY-MM-DD" - return 1 - fi - - local previous_tag - previous_tag="$(git describe --tags --abbrev=0 2>/dev/null || true)" - - if [[ -z "$previous_tag" ]]; then - warn "No previous tag found; skipping commit/changelog comparison" - return 0 - fi - - local commit_count - commit_count="$(git log --oneline "${previous_tag}..HEAD" | wc -l | tr -d ' ')" - - if [[ "$commit_count" == "0" ]]; then - pass "No commits since ${previous_tag}" - return 0 - fi - - echo "Commits since ${previous_tag}: ${commit_count}" - - local changelog_block - changelog_block="$(awk " - /^## / { - if (found) exit - if (\$0 ~ /\\[?v?${version}\\]?/) found=1 - } - found { print } - " CHANGELOG.md)" - - local bullet_count - bullet_count="$(printf '%s\n' "$changelog_block" | grep -E '^[*-] ' | wc -l | tr -d ' ')" - - if [[ "$bullet_count" == "0" ]]; then - fail "Version ${version} exists in CHANGELOG.md but has no bullet entries" - return 1 - fi - - pass "CHANGELOG.md contains version ${version} with ${bullet_count} documented change(s)" - - echo - echo "Recent commits:" - git log --oneline "${previous_tag}..HEAD" | sed 's/^/ - /' -} - - -check_changelog_matches_commits || exit 1 - -echo -rule 72 -echo "Status: release-check complete" diff --git a/backups/scripts/20260509-030842/terminal/themes/mq-theme-manager.sh b/backups/scripts/20260509-030842/terminal/themes/mq-theme-manager.sh deleted file mode 100755 index 2ae777f..0000000 --- a/backups/scripts/20260509-030842/terminal/themes/mq-theme-manager.sh +++ /dev/null @@ -1,230 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -THEME_FILE="${HOME}/.mq-theme" - -theme_list() { - cat <<'LIST' -classic -green -amber -ice -synth -LIST -} - -theme_description() { - case "$1" in - classic) echo "Yellow/blue MQ default feel" ;; - green) echo "Green terminal vibe" ;; - amber) echo "Warm amber monitor feel" ;; - ice) echo "Cool cyan/blue theme" ;; - synth) echo "Purple neon style" ;; - *) return 1 ;; - esac -} - -theme_exports() { - case "$1" in - classic) - cat <<'EOF_THEME' -export MQ_THEME_NAME="classic" -export MQ_COLOR_TITLE=$'\033[1;33m' -export MQ_COLOR_ERR=$'\033[0;31m' -export MQ_COLOR_OK=$'\033[0;32m' -export MQ_COLOR_WARN=$'\033[0;33m' -export MQ_COLOR_INFO=$'\033[0;34m' -export MQ_COLOR_BOLD=$'\033[1m' -EOF_THEME - ;; - green) - cat <<'EOF_THEME' -export MQ_THEME_NAME="green" -export MQ_COLOR_TITLE=$'\033[1;32m' -export MQ_COLOR_ERR=$'\033[0;31m' -export MQ_COLOR_OK=$'\033[1;32m' -export MQ_COLOR_WARN=$'\033[0;33m' -export MQ_COLOR_INFO=$'\033[0;32m' -export MQ_COLOR_BOLD=$'\033[1m' -EOF_THEME - ;; - amber) - cat <<'EOF_THEME' -export MQ_THEME_NAME="amber" -export MQ_COLOR_TITLE=$'\033[1;33m' -export MQ_COLOR_ERR=$'\033[0;31m' -export MQ_COLOR_OK=$'\033[0;33m' -export MQ_COLOR_WARN=$'\033[1;33m' -export MQ_COLOR_INFO=$'\033[0;37m' -export MQ_COLOR_BOLD=$'\033[1m' -EOF_THEME - ;; - ice) - cat <<'EOF_THEME' -export MQ_THEME_NAME="ice" -export MQ_COLOR_TITLE=$'\033[1;36m' -export MQ_COLOR_ERR=$'\033[0;31m' -export MQ_COLOR_OK=$'\033[0;36m' -export MQ_COLOR_WARN=$'\033[1;37m' -export MQ_COLOR_INFO=$'\033[0;34m' -export MQ_COLOR_BOLD=$'\033[1m' -EOF_THEME - ;; - synth) - cat <<'EOF_THEME' -export MQ_THEME_NAME="synth" -export MQ_COLOR_TITLE=$'\033[1;35m' -export MQ_COLOR_ERR=$'\033[0;31m' -export MQ_COLOR_OK=$'\033[0;36m' -export MQ_COLOR_WARN=$'\033[1;35m' -export MQ_COLOR_INFO=$'\033[0;35m' -export MQ_COLOR_BOLD=$'\033[1m' -EOF_THEME - ;; - *) - return 1 - ;; - esac -} - -write_theme_file() { - local theme="$1" - { - echo "# Generated by mq-theme-manager.sh" - theme_exports "$theme" - } > "$THEME_FILE" -} - -show_current() { - if [[ -f "$THEME_FILE" ]]; then - # shellcheck disable=SC1090 - source "$THEME_FILE" - echo "Current theme: ${MQ_THEME_NAME:-unknown}" - echo "Theme file: $THEME_FILE" - else - echo "Current theme: default (no ~/.mq-theme file)" - fi -} - -preview_theme() { - local theme="$1" - - if ! theme_description "$theme" >/dev/null 2>&1; then - echo "Unknown theme: $theme" >&2 - exit 1 - fi - - ( - eval "$(theme_exports "$theme")" - - APP_TITLE="MQ Theme Preview" - APP_SUBTITLE="$theme" - APP_AUTHOR="Author Mattias Camner" - BOX_INNER=88 - - # shellcheck disable=SC1090 - source "$UI_LIB" - - print_header - row_bold "THEME PREVIEW" - empty_row - row "Theme: $theme" - row "Description: $(theme_description "$theme")" - empty_row - row "STATUS" - row2 " ui_ok()" " success" - row2 " ui_warn()" " warning" - row2 " ui_err()" " error" - row2 " row2()" " shared layout" - empty_row - ui_ok "OK message preview" - ui_warn "Warning message preview" - ui_err "Error message preview" - print_footer - pause_enter - ) -} - -apply_theme() { - local theme="$1" - - if ! theme_description "$theme" >/dev/null 2>&1; then - echo "Unknown theme: $theme" >&2 - exit 1 - fi - - write_theme_file "$theme" - echo "Applied theme: $theme" - echo "Saved to: $THEME_FILE" - echo - echo "Run one of these to see it:" - echo " mqlaunch" - echo " mqlaunch tweaks" - echo " ~/macos-scripts/ui/dashboards/mq-dashboard.sh" -} - -reset_theme() { - rm -f "$THEME_FILE" - echo "Removed theme file." - echo "UI will now use default colors." -} - -usage() { - cat <<'USAGE' -mq-theme-manager.sh - manage terminal UI themes - -Usage: - mq-theme-manager.sh list - mq-theme-manager.sh current - mq-theme-manager.sh preview - mq-theme-manager.sh apply - mq-theme-manager.sh reset - -Themes: - classic - green - amber - ice - synth -USAGE -} - -main() { - local cmd="${1:-list}" - - case "$cmd" in - list) - while read -r name; do - [[ -z "$name" ]] && continue - printf "%-10s %s\n" "$name" "$(theme_description "$name")" - done < <(theme_list) - ;; - current) - show_current - ;; - preview) - [[ $# -ge 2 ]] || { usage; exit 1; } - preview_theme "$2" - ;; - apply) - [[ $# -ge 2 ]] || { usage; exit 1; } - apply_theme "$2" - ;; - reset) - reset_theme - ;; - help|-h|--help) - usage - ;; - *) - echo "Unknown command: $cmd" >&2 - echo - usage - exit 1 - ;; - esac -} - -main "$@" diff --git a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-switcher.sh b/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-switcher.sh deleted file mode 100755 index 8bb5e53..0000000 --- a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-switcher.sh +++ /dev/null @@ -1,258 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -THEME_FILE="$BASE_DIR/terminal/themes/mq-zsh-theme-v3.zsh" -ZSHRC="${HOME}/.zshrc" -BACKUP_DIR="$HOME/.mq-zsh-theme-backups" - -APP_TITLE="MQ Theme Switcher" -APP_SUBTITLE="ZSH Theme Manager" -APP_AUTHOR="Author Mattias Camner" -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - # shellcheck disable=SC1090 - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -theme_list() { - cat <<'LIST' -amber -green -minimal -ice -macos -LIST -} - -theme_description() { - case "$1" in - amber) echo "Retro amber + MQ feel" ;; - green) echo "Classic green terminal vibe" ;; - minimal) echo "Cleaner low-noise prompt" ;; - ice) echo "Cool cyan / blue look" ;; - macos) echo "Clean Apple-inspired blue/gray theme" ;; - *) return 1 ;; - esac -} - -current_variant() { - if grep -Eq '^export MQ_ZSH_VARIANT=' "$ZSHRC" 2>/dev/null; then - grep -E '^export MQ_ZSH_VARIANT=' "$ZSHRC" | tail -n 1 | sed -E 's/^export MQ_ZSH_VARIANT="?([^"]+)"?/\1/' - else - echo "not-set" - fi -} - -theme_source_present() { - grep -Fq 'source "$HOME/macos-scripts/terminal/themes/mq-zsh-theme-v3.zsh"' "$ZSHRC" 2>/dev/null -} - -backup_zshrc() { - mkdir -p "$BACKUP_DIR" - local backup_file="$BACKUP_DIR/.zshrc.backup-$(date +%Y%m%d-%H%M%S)" - if [[ -f "$ZSHRC" ]]; then - cp "$ZSHRC" "$backup_file" - echo "$backup_file" - else - : > "$backup_file" - echo "$backup_file" - fi -} - -clean_existing_theme_lines() { - local tmp - tmp="$(mktemp)" - if [[ -f "$ZSHRC" ]]; then - grep -v 'mq-zsh-theme-v3.zsh\|MQ_ZSH_VARIANT=' "$ZSHRC" > "$tmp" || true - mv "$tmp" "$ZSHRC" - else - : > "$ZSHRC" - rm -f "$tmp" - fi -} - -apply_theme() { - local variant="$1" - - if ! theme_description "$variant" >/dev/null 2>&1; then - ui_err "Unknown theme: $variant" - return 1 - fi - - if [[ ! -f "$THEME_FILE" ]]; then - ui_err "Missing theme file: $THEME_FILE" - return 1 - fi - - local backup_file - backup_file="$(backup_zshrc)" - clean_existing_theme_lines - - { - echo - echo "export MQ_ZSH_VARIANT=\"$variant\"" - echo 'source "$HOME/macos-scripts/terminal/themes/mq-zsh-theme-v3.zsh"' - } >> "$ZSHRC" - - print_header - row_bold "THEME APPLIED" - empty_row - row "Theme: $variant" - row "Description: $(theme_description "$variant")" - row "Backup:" - row " $backup_file" - empty_row - row "Run this to activate it now:" - row " exec zsh" - print_footer - pause_enter -} - -reset_theme() { - local backup_file - backup_file="$(backup_zshrc)" - clean_existing_theme_lines - - print_header - row_bold "THEME RESET" - empty_row - row "Removed MQ_ZSH_VARIANT and theme source line from .zshrc." - row "Backup:" - row " $backup_file" - empty_row - row "Run this to reload your shell:" - row " exec zsh" - print_footer - pause_enter -} - -show_current() { - print_header - row_bold "CURRENT THEME" - empty_row - row "Current variant: $(current_variant)" - if theme_source_present; then - row "Theme source: PRESENT" - else - row "Theme source: MISSING" - fi - row "Theme file:" - row " $THEME_FILE" - print_footer - pause_enter -} - -show_list() { - print_header - row_bold "AVAILABLE THEMES" - empty_row - while read -r name; do - [[ -z "$name" ]] && continue - row2 " $name" " $(theme_description "$name")" - done < <(theme_list) - print_footer - pause_enter -} - -print_menu() { - print_header - row_bold "ZSH THEME SWITCHER" - empty_row - - row2 " 1. Show current theme" " 2. List themes" - row2 " 3. Apply amber" " 4. Apply green" - row2 " 5. Apply minimal" " 6. Apply ice" - row2 " 7. Apply macos" " 8. Reset theme" - row2 " 0. Exit" "" - - print_footer -} - -menu_loop() { - local choice - while true; do - print_menu - read_menu_choice "Select option [0-8] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) show_current ;; - 2) show_list ;; - 3) apply_theme amber ;; - 4) apply_theme green ;; - 5) apply_theme minimal ;; - 6) apply_theme ice ;; - 7) apply_theme macos ;; - 8) reset_theme ;; - 0) ui_ok "Exiting."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -usage() { - cat < - mq-zsh-theme-switcher.sh reset - -Examples: - mq-zsh-theme-switcher.sh apply amber - mq-zsh-theme-switcher.sh current - mq-zsh-theme-switcher.sh menu -USAGE -} - -main() { - local cmd="${1:-menu}" - - case "$cmd" in - menu) - menu_loop - ;; - list) - while read -r name; do - [[ -z "$name" ]] && continue - printf "%-10s %s\n" "$name" "$(theme_description "$name")" - done < <(theme_list) - ;; - current) - echo "Current variant: $(current_variant)" - if theme_source_present; then - echo "Theme source: PRESENT" - else - echo "Theme source: MISSING" - fi - ;; - apply) - [[ $# -ge 2 ]] || { usage; exit 1; } - apply_theme "$2" - ;; - reset) - reset_theme - ;; - help|-h|--help) - usage - ;; - *) - ui_err "Unknown command: $cmd" - echo - usage - exit 1 - ;; - esac -} - -main "$@" diff --git a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v2.zsh b/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v2.zsh deleted file mode 100644 index f45e1c4..0000000 --- a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v2.zsh +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env zsh - -# MQ ZSH Theme v2 -# Real shell prompt theme for zsh -# Retro amber + clean status + git + duration - -[[ -n "${MQ_ZSH_THEME_V2_LOADED:-}" ]] && return 0 -export MQ_ZSH_THEME_V2_LOADED=1 - -autoload -Uz colors vcs_info add-zsh-hook -colors -setopt prompt_subst - -# ------------------------------------------------------------ -# Theme colors -# ------------------------------------------------------------ -typeset -g MQC_RESET="%f%k" -typeset -g MQC_USER="%F{220}" # amber -typeset -g MQC_HOST="%F{179}" # soft amber -typeset -g MQC_PATH="%F{117}" # cool cyan -typeset -g MQC_GIT="%F{141}" # purple -typeset -g MQC_OK="%F{46}" # green -typeset -g MQC_ERR="%F{196}" # red -typeset -g MQC_WARN="%F{214}" # orange -typeset -g MQC_TIME="%F{244}" # gray -typeset -g MQC_DIM="%F{242}" # dim gray -typeset -g MQC_ACCENT="%F{220}" # amber accent - -# ------------------------------------------------------------ -# VCS / git info -# ------------------------------------------------------------ -zstyle ':vcs_info:*' enable git -zstyle ':vcs_info:*' max-exports 2 -zstyle ':vcs_info:git:*' formats '%b' -zstyle ':vcs_info:git:*' actionformats '%b|%a' - -mq_git_dirty() { - command git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - local dirty="" - command git diff --no-ext-diff --quiet --exit-code 2>/dev/null || dirty="*" - command git diff --no-ext-diff --cached --quiet --exit-code 2>/dev/null || dirty="+${dirty}" - - [[ -n "$dirty" ]] && print -r -- "$dirty" -} - -mq_prompt_git() { - command git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - vcs_info - local branch="${vcs_info_msg_0_:-}" - local dirty - dirty="$(mq_git_dirty)" - - [[ -z "$branch" ]] && return 0 - - if [[ -n "$dirty" ]]; then - print -n "${MQC_GIT}[${branch}]${MQC_RESET} ${MQC_ERR}${dirty}${MQC_RESET}" - else - print -n "${MQC_GIT}[${branch}]${MQC_RESET}" - fi -} - -# ------------------------------------------------------------ -# Command duration -# ------------------------------------------------------------ -typeset -g MQ_CMD_START=0 -typeset -g MQ_CMD_DURATION="" - -mq_preexec() { - MQ_CMD_START=$EPOCHSECONDS -} - -mq_format_duration() { - local s="$1" - - if (( s < 1 )); then - print -r -- "" - elif (( s < 60 )); then - print -r -- "${s}s" - elif (( s < 3600 )); then - print -r -- "$(( s / 60 ))m $(( s % 60 ))s" - else - print -r -- "$(( s / 3600 ))h $(( (s % 3600) / 60 ))m" - fi -} - -mq_precmd() { - local last_status="$?" - local now="$EPOCHSECONDS" - - if (( MQ_CMD_START > 0 )); then - local elapsed=$(( now - MQ_CMD_START )) - MQ_CMD_DURATION="$(mq_format_duration "$elapsed")" - else - MQ_CMD_DURATION="" - fi - - mq_set_title - MQ_LAST_STATUS="$last_status" -} - -add-zsh-hook preexec mq_preexec -add-zsh-hook precmd mq_precmd - -# ------------------------------------------------------------ -# Helpers -# ------------------------------------------------------------ -mq_set_title() { - print -Pn "\e]0;%n@%m: %~\a" -} - -mq_short_path() { - print -Pn "%2~" -} - -mq_prompt_symbol() { - local last_status="$1" - - if [[ "$last_status" -eq 0 ]]; then - print -n "${MQC_OK}❯${MQC_RESET}" - else - print -n "${MQC_ERR}❯${MQC_RESET}" - fi -} - -mq_prompt_right() { - local last_status="$1" - local status_seg="" - local git_seg="" - local dur_seg="" - local time_seg="${MQC_TIME}%*${MQC_RESET}" - - if [[ "$last_status" -ne 0 ]]; then - status_seg="${MQC_ERR}exit:${last_status}${MQC_RESET} " - fi - - git_seg="$(mq_prompt_git)" - [[ -n "$git_seg" ]] && git_seg="${git_seg} " - - if [[ -n "${MQ_CMD_DURATION:-}" ]]; then - dur_seg="${MQC_WARN}${MQ_CMD_DURATION}${MQC_RESET} " - fi - - print -n "${status_seg}${git_seg}${dur_seg}${time_seg}" -} - -# ------------------------------------------------------------ -# Prompt -# ------------------------------------------------------------ -PROMPT=' -${MQC_ACCENT}┌─${MQC_RESET}${MQC_USER}%n${MQC_RESET}${MQC_DIM}@${MQC_RESET}${MQC_HOST}%m${MQC_RESET} ${MQC_DIM}in${MQC_RESET} ${MQC_PATH}$(mq_short_path)${MQC_RESET} -${MQC_ACCENT}└─${MQC_RESET}$(mq_prompt_symbol ${MQ_LAST_STATUS:-0}) ' - -RPROMPT='$(mq_prompt_right ${MQ_LAST_STATUS:-0})' - -# ------------------------------------------------------------ -# Quality-of-life defaults -# ------------------------------------------------------------ -HISTSIZE=${HISTSIZE:-25000} -SAVEHIST=${SAVEHIST:-25000} - -setopt AUTO_CD -setopt APPEND_HISTORY -setopt HIST_IGNORE_DUPS -setopt HIST_REDUCE_BLANKS -setopt SHARE_HISTORY -setopt INTERACTIVE_COMMENTS -setopt NO_BEEP -setopt PROMPT_SUBST - -# Optional completion polish -zmodload zsh/complist 2>/dev/null || true diff --git a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v3.zsh b/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v3.zsh deleted file mode 100755 index fda7be1..0000000 --- a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme-v3.zsh +++ /dev/null @@ -1,307 +0,0 @@ -#!/usr/bin/env zsh - -# MQ ZSH Theme v3 -# Variant-based zsh prompt theme -# Variants: -# amber (default) -# green -# minimal -# ice -# macos - -[[ -n "${MQ_ZSH_THEME_V3_LOADED:-}" ]] && return 0 -export MQ_ZSH_THEME_V3_LOADED=1 - -autoload -Uz colors vcs_info add-zsh-hook -colors -setopt prompt_subst - -: "${MQ_ZSH_VARIANT:=macos}" - -# ------------------------------------------------------------ -# Variant palette -# ------------------------------------------------------------ -mq_theme_palette() { - case "${MQ_ZSH_VARIANT}" in - amber) - typeset -g MQC_USER="%F{220}" - typeset -g MQC_HOST="%F{179}" - typeset -g MQC_PATH="%F{117}" - typeset -g MQC_GIT="%F{141}" - typeset -g MQC_OK="%F{46}" - typeset -g MQC_ERR="%F{196}" - typeset -g MQC_WARN="%F{214}" - typeset -g MQC_TIME="%F{244}" - typeset -g MQC_DIM="%F{242}" - typeset -g MQC_ACCENT="%F{220}" - ;; - green) - typeset -g MQC_USER="%F{82}" - typeset -g MQC_HOST="%F{120}" - typeset -g MQC_PATH="%F{159}" - typeset -g MQC_GIT="%F{84}" - typeset -g MQC_OK="%F{46}" - typeset -g MQC_ERR="%F{196}" - typeset -g MQC_WARN="%F{190}" - typeset -g MQC_TIME="%F{244}" - typeset -g MQC_DIM="%F{240}" - typeset -g MQC_ACCENT="%F{82}" - ;; - minimal) - typeset -g MQC_USER="%F{250}" - typeset -g MQC_HOST="%F{245}" - typeset -g MQC_PATH="%F{111}" - typeset -g MQC_GIT="%F{146}" - typeset -g MQC_OK="%F{76}" - typeset -g MQC_ERR="%F{196}" - typeset -g MQC_WARN="%F{180}" - typeset -g MQC_TIME="%F{243}" - typeset -g MQC_DIM="%F{240}" - typeset -g MQC_ACCENT="%F{245}" - ;; - ice) - typeset -g MQC_USER="%F{123}" - typeset -g MQC_HOST="%F{81}" - typeset -g MQC_PATH="%F{159}" - typeset -g MQC_GIT="%F{147}" - typeset -g MQC_OK="%F{50}" - typeset -g MQC_ERR="%F{196}" - typeset -g MQC_WARN="%F{229}" - typeset -g MQC_TIME="%F{244}" - typeset -g MQC_DIM="%F{240}" - typeset -g MQC_ACCENT="%F{81}" - ;; - macos) - typeset -g MQC_USER="%F{39}" - typeset -g MQC_HOST="%F{110}" - typeset -g MQC_PATH="%F{153}" - typeset -g MQC_GIT="%F{81}" - typeset -g MQC_OK="%F{76}" - typeset -g MQC_ERR="%F{203}" - typeset -g MQC_WARN="%F{221}" - typeset -g MQC_TIME="%F{246}" - typeset -g MQC_DIM="%F{244}" - typeset -g MQC_ACCENT="%F{75}" - ;; - *) - export MQ_ZSH_VARIANT="amber" - mq_theme_palette - return - ;; - esac -} - -mq_theme_palette -typeset -g MQC_RESET="%f%k" - -# ------------------------------------------------------------ -# VCS / git info -# ------------------------------------------------------------ -zstyle ':vcs_info:*' enable git -zstyle ':vcs_info:*' max-exports 2 -zstyle ':vcs_info:git:*' formats '%b' -zstyle ':vcs_info:git:*' actionformats '%b|%a' - -mq_git_dirty() { - command git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - local dirty="" - command git diff --no-ext-diff --quiet --exit-code 2>/dev/null || dirty="*" - command git diff --no-ext-diff --cached --quiet --exit-code 2>/dev/null || dirty="+${dirty}" - - [[ -n "$dirty" ]] && print -r -- "$dirty" -} - -mq_prompt_git() { - command git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - vcs_info - local branch="${vcs_info_msg_0_:-}" - local dirty - dirty="$(mq_git_dirty)" - - [[ -z "$branch" ]] && return 0 - - if [[ -n "$dirty" ]]; then - print -n "${MQC_GIT}[${branch}]${MQC_RESET} ${MQC_ERR}${dirty}${MQC_RESET}" - else - print -n "${MQC_GIT}[${branch}]${MQC_RESET}" - fi -} - -# ------------------------------------------------------------ -# Command duration -# ------------------------------------------------------------ -typeset -g MQ_CMD_START=0 -typeset -g MQ_CMD_DURATION="" -typeset -g MQ_LAST_STATUS=0 - -mq_preexec() { - MQ_CMD_START=$EPOCHSECONDS -} - -mq_format_duration() { - local s="$1" - - if (( s < 1 )); then - print -r -- "" - elif (( s < 60 )); then - print -r -- "${s}s" - elif (( s < 3600 )); then - print -r -- "$(( s / 60 ))m $(( s % 60 ))s" - else - print -r -- "$(( s / 3600 ))h $(( (s % 3600) / 60 ))m" - fi -} - -mq_set_title() { - print -Pn "\e]0;%n@%m: %~\a" -} - -mq_precmd() { - local last_status="$?" - local now="$EPOCHSECONDS" - - if (( MQ_CMD_START > 0 )); then - local elapsed=$(( now - MQ_CMD_START )) - MQ_CMD_DURATION="$(mq_format_duration "$elapsed")" - else - MQ_CMD_DURATION="" - fi - - MQ_LAST_STATUS="$last_status" - mq_set_title -} - -add-zsh-hook preexec mq_preexec -add-zsh-hook precmd mq_precmd - -# ------------------------------------------------------------ -# Prompt helpers -# ------------------------------------------------------------ -mq_short_path() { - print -Pn "%2~" -} - -mq_prompt_symbol() { - local last_status="$1" - - if [[ "$last_status" -eq 0 ]]; then - print -n "${MQC_OK}❯${MQC_RESET}" - else - print -n "${MQC_ERR}❯${MQC_RESET}" - fi -} - -mq_prompt_right() { - local last_status="$1" - local status_seg="" - local git_seg="" - local dur_seg="" - local time_seg="${MQC_TIME}%*${MQC_RESET}" - - if [[ "$last_status" -ne 0 ]]; then - status_seg="${MQC_ERR}exit:${last_status}${MQC_RESET} " - fi - - git_seg="$(mq_prompt_git)" - [[ -n "$git_seg" ]] && git_seg="${git_seg} " - - if [[ -n "${MQ_CMD_DURATION:-}" ]]; then - dur_seg="${MQC_WARN}${MQ_CMD_DURATION}${MQC_RESET} " - fi - - print -n "${status_seg}${git_seg}${dur_seg}${time_seg}" -} - -# ------------------------------------------------------------ -# Prompt layout -# ------------------------------------------------------------ - -# ------------------------------------------------------------ -# Quality-of-life defaults -# ------------------------------------------------------------ -HISTSIZE=${HISTSIZE:-25000} -SAVEHIST=${SAVEHIST:-25000} - -setopt AUTO_CD -setopt APPEND_HISTORY -setopt HIST_IGNORE_DUPS -setopt HIST_REDUCE_BLANKS -setopt SHARE_HISTORY -setopt INTERACTIVE_COMMENTS -setopt NO_BEEP -setopt PROMPT_SUBST - -zmodload zsh/complist 2>/dev/null || true - -# ------------------------------------------------------------ -# Prompt helpers (macOS style) -# ------------------------------------------------------------ - -mq_prompt_path() { - print -P "%~" -} - -mq_prompt_git() { - local branch dirty ahead behind git_info - - branch=$(git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null) || return 0 - - git diff --quiet --ignore-submodules HEAD 2>/dev/null - if [[ $? -eq 0 ]]; then - dirty="" - else - dirty="*" - fi - - ahead=$(git rev-list --count @{upstream}..HEAD 2>/dev/null) - behind=$(git rev-list --count HEAD..@{upstream} 2>/dev/null) - - git_info="$branch$dirty" - - if [[ -n "$ahead" && "$ahead" != "0" ]]; then - git_info="$git_info ↑$ahead" - fi - if [[ -n "$behind" && "$behind" != "0" ]]; then - git_info="$git_info ↓$behind" - fi - - print -r -- "$git_info" -} - - -# ------------------------------------------------------------ -# macOS-style prompt (clean, 2-line) -# ------------------------------------------------------------ - -mq_build_prompt() { - local exit_code="$?" - local status_icon - local git_part="" - local path_part - local user_host - - if [[ "$exit_code" -eq 0 ]]; then - status_icon="${MQC_ACCENT}❯%f" - else - status_icon="${MQC_ERR}❯%f" - fi - - user_host="${MQC_USER}%n%f ${MQC_DIM}·%f ${MQC_HOST}%m%f" - path_part="${MQC_PATH}$(mq_prompt_path)%f" - - local git_info - git_info="$(mq_prompt_git)" - if [[ -n "$git_info" ]]; then - git_part=" ${MQC_DIM}•%f ${MQC_GIT} ${git_info}%f" - fi - - PROMPT=$'\n'"${user_host} ${MQC_DIM}•%f ${path_part}${git_part}"$'\n'"${status_icon} " - RPROMPT="" -} - -# Hook prompt -autoload -Uz add-zsh-hook -add-zsh-hook precmd mq_build_prompt - diff --git a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme.zsh b/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme.zsh deleted file mode 100644 index 4017887..0000000 --- a/backups/scripts/20260509-030842/terminal/themes/mq-zsh-theme.zsh +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env zsh - -# MQ ZSH Theme -# Real shell prompt theme for zsh -# Separate from mq-ui.sh - -[[ -n "${MQ_ZSH_THEME_LOADED:-}" ]] && return 0 -export MQ_ZSH_THEME_LOADED=1 - -autoload -Uz colors vcs_info add-zsh-hook -colors -setopt prompt_subst - -# ------------------------------------------------------------ -# VCS / git info -# ------------------------------------------------------------ -zstyle ':vcs_info:*' enable git -zstyle ':vcs_info:*' max-exports 2 -zstyle ':vcs_info:git:*' formats '%b' -zstyle ':vcs_info:git:*' actionformats '%b|%a' - -mq_git_dirty() { - command git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - local dirty="" - command git diff --no-ext-diff --quiet --exit-code 2>/dev/null || dirty="*" - command git diff --no-ext-diff --cached --quiet --exit-code 2>/dev/null || dirty="+${dirty}" - - [[ -n "$dirty" ]] && print -r -- "$dirty" -} - -mq_prompt_git() { - command git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - vcs_info - local branch="${vcs_info_msg_0_:-}" - local dirty - dirty="$(mq_git_dirty)" - - [[ -z "$branch" ]] && return 0 - - if [[ -n "$dirty" ]]; then - print -n "%F{141}[${branch}]%f %F{196}${dirty}%f" - else - print -n "%F{141}[${branch}]%f" - fi -} - -# ------------------------------------------------------------ -# Prompt helpers -# ------------------------------------------------------------ -mq_prompt_symbol() { - local last_status="$1" - - if [[ "$last_status" -eq 0 ]]; then - print -n "%F{46}❯%f" - else - print -n "%F{196}❯%f" - fi -} - -mq_prompt_right() { - local last_status="$1" - local status_seg="" - local git_seg="" - local time_seg="%F{244}%*%f" - - if [[ "$last_status" -ne 0 ]]; then - status_seg="%F{196}exit:${last_status}%f " - fi - - git_seg="$(mq_prompt_git)" - [[ -n "$git_seg" ]] && git_seg="${git_seg} " - - print -n "${status_seg}${git_seg}${time_seg}" -} - -mq_set_title() { - print -Pn "\e]0;%n@%m: %~\a" -} - -mq_precmd() { - mq_set_title -} - -add-zsh-hook precmd mq_precmd - -# ------------------------------------------------------------ -# Prompt -# ------------------------------------------------------------ -PROMPT=' -%F{39}%n@%m%f %F{111}%~%f -$(mq_prompt_symbol $?) ' - -RPROMPT='$(mq_prompt_right $?)' - -# ------------------------------------------------------------ -# Optional shell quality-of-life -# ------------------------------------------------------------ -HISTSIZE=${HISTSIZE:-25000} -SAVEHIST=${SAVEHIST:-25000} - -setopt AUTO_CD -setopt APPEND_HISTORY -setopt HIST_IGNORE_DUPS -setopt HIST_REDUCE_BLANKS -setopt SHARE_HISTORY -setopt INTERACTIVE_COMMENTS -setopt NO_BEEP diff --git a/backups/scripts/20260509-030842/tools/cli/ai-mode.sh b/backups/scripts/20260509-030842/tools/cli/ai-mode.sh deleted file mode 100755 index dc7aa3e..0000000 --- a/backups/scripts/20260509-030842/tools/cli/ai-mode.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -PROMPT_DIR="${BASE_DIR}/ai-prompts" - -copy_and_open() { - local file="$1" - - if [[ ! -f "$file" ]]; then - echo "Prompt file not found: $file" - exit 1 - fi - - cat "$file" | pbcopy - echo "Copied: $(basename "$file")" - - open "https://chatgpt.com/" -} - -show_menu() { - cat </dev/null 2>&1 <<'APPLESCRIPT' -tell application "Terminal" to activate -APPLESCRIPT -} - -safe_run_ai() { - local mode="$1" - if [ -x "$AI_SCRIPT" ]; then - "$AI_SCRIPT" "$mode" - else - echo "${C_RED}AI script missing or not executable:${C_RESET} $AI_SCRIPT" - pause_enter - fi -} - -show_status() { - local now shell_name prompt_count ai_state - now="$(date '+%Y-%m-%d %H:%M:%S')" - shell_name="$SHELL" - - if [ -d "$PROMPT_DIR" ]; then - prompt_count="$(find "$PROMPT_DIR" -maxdepth 1 -type f | wc -l | tr -d ' ')" - else - prompt_count="0" - fi - - if [ -x "$AI_SCRIPT" ]; then - ai_state="READY" - else - ai_state="MISSING" - fi - - echo "${C_BOLD}${C_CYAN} ${APP_TITLE}${C_RESET}" - echo "${C_DIM} Time:${C_RESET} $now" - echo "${C_DIM} Shell:${C_RESET} $shell_name" - echo "${C_DIM} AI Script:${C_RESET} $ai_state" - echo "${C_DIM} Prompt Files:${C_RESET} $prompt_count" -} - -show_quick_actions() { - echo "${C_BOLD}${C_MAGENTA} AI MODES${C_RESET}" - echo "${C_GREEN} 1)${C_RESET} Auto Mode" - echo "${C_GREEN} 2)${C_RESET} Atlas One" - echo "${C_GREEN} 3)${C_RESET} Atlas Router" - echo "${C_GREEN} 4)${C_RESET} Decision" - echo "${C_GREEN} 5)${C_RESET} Research" - echo "${C_GREEN} 6)${C_RESET} Root Cause" - echo "${C_GREEN} 7)${C_RESET} Problem Solving" - echo "${C_GREEN} 8)${C_RESET} Prompt Debugger" - echo "${C_GREEN} 9)${C_RESET} AI Menu" -} - -show_system_actions() { - echo "${C_BOLD}${C_YELLOW} SYSTEM${C_RESET}" - echo "${C_YELLOW} 10)${C_RESET} Open ChatGPT" - echo "${C_YELLOW} 11)${C_RESET} Open AI Prompts folder" - echo "${C_YELLOW} 12)${C_RESET} Open macos-scripts repo" - echo "${C_YELLOW} 13)${C_RESET} Show prompt files" - echo "${C_YELLOW} 14)${C_RESET} Quick health check" - echo "${C_YELLOW} 15)${C_RESET} Back to mqlaunch" - echo "${C_YELLOW} 0)${C_RESET} Exit" -} - -open_chatgpt() { - open "https://chatgpt.com/" -} - -open_prompt_dir() { - if [ -d "$PROMPT_DIR" ]; then - open "$PROMPT_DIR" - else - echo "${C_RED}Prompt directory not found:${C_RESET} $PROMPT_DIR" - pause_enter - fi -} - -open_repo() { - open "$REPO_URL" -} - -show_prompt_files() { - clear_screen - line - echo "${C_BOLD}${C_CYAN} PROMPT FILES${C_RESET}" - line - if [ -d "$PROMPT_DIR" ]; then - find "$PROMPT_DIR" -maxdepth 1 -type f | sort | sed "s|$HOME|~|" - else - echo "${C_RED}Prompt directory not found.${C_RESET}" - fi - echo - pause_enter -} - -health_check() { - clear_screen - line - echo "${C_BOLD}${C_CYAN} HEALTH CHECK${C_RESET}" - line - echo - - if [ -x "$AI_SCRIPT" ]; then - echo "${C_GREEN}OK${C_RESET} ai-mode.sh is executable" - else - echo "${C_RED}FAIL${C_RESET} ai-mode.sh missing or not executable" - fi - - if [ -d "$PROMPT_DIR" ]; then - echo "${C_GREEN}OK${C_RESET} prompt directory exists" - else - echo "${C_RED}FAIL${C_RESET} prompt directory missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - echo "${C_GREEN}OK${C_RESET} pbcopy available" - else - echo "${C_RED}FAIL${C_RESET} pbcopy not available" - fi - - if command -v open >/dev/null 2>&1; then - echo "${C_GREEN}OK${C_RESET} open command available" - else - echo "${C_RED}FAIL${C_RESET} open command missing" - fi - - echo - pause_enter -} - -print_dashboard() { - clear_screen - set_terminal_title - line - show_status - line - show_quick_actions - small_line - show_system_actions - line - echo - echo "${C_BOLD}Choose a number and press Enter.${C_RESET}" - echo -} - -main_loop() { - while true; do - print_dashboard - read -r "?Selection: " choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 10) open_chatgpt ;; - 11) open_prompt_dir ;; - 12) open_repo ;; - 13) show_prompt_files ;; - 14) health_check ;; - 15) "$BASE_DIR/terminal/launchers/mqlaunch.sh" ;; - 0) echo "${C_GREEN}Exiting dashboard...${C_RESET}"; exit 0 ;; - *) echo "${C_RED}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - - bring_terminal_front - pause_brief - done -} - -main_loop diff --git a/backups/scripts/20260509-030842/tools/cli/mq-lib.sh b/backups/scripts/20260509-030842/tools/cli/mq-lib.sh deleted file mode 100755 index 9aa6a4e..0000000 --- a/backups/scripts/20260509-030842/tools/cli/mq-lib.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------- -# MQ LIB (minimal stable v2) -# -------------------------------------------------- - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - -# ---------------------------- -# Commands -# ---------------------------- - -mq_scan() { - "$BASE_DIR/tools/scripts/scan.sh" "$@" -} - -mq_doctor() { - "$BASE_DIR/tools/scripts/doctor.sh" -} - -mq_sys() { - echo "User: $USER" - echo "Shell: $SHELL" -} - -mq_config() { - cd "$HOME/.config/mq-shell" || exit -} - -mq_reload() { - if command -v zsh >/dev/null 2>&1; then - echo "Reloading shell with zsh..." - exec zsh -l - fi - - echo "zsh not found; run: exec zsh -l" >&2 - return 1 -} - -mq_pulse() { - "$BASE_DIR/tools/scripts/pulse.sh" -} - -mq_help() { - echo "mq commands:" - echo " doctor" - echo " sys" - echo " config" - echo " reload" - echo " scan" - echo " pulse" - echo " test" -} - -mq_watch() { - "$BASE_DIR/tools/scripts/watch.sh" -} diff --git a/backups/scripts/20260509-030842/tools/cli/mq-ui.sh b/backups/scripts/20260509-030842/tools/cli/mq-ui.sh deleted file mode 100644 index b70b28b..0000000 --- a/backups/scripts/20260509-030842/tools/cli/mq-ui.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash - -# ---------------------------- -# Theme system -# ---------------------------- - -MQ_THEME="${MQ_THEME:-green}" - -case "$MQ_THEME" in - green) - C_OK="\033[1;32m" - C_WARN="\033[1;33m" - C_ERR="\033[1;31m" - C_TITLE="\033[1;36m" - ;; - amber) - C_OK="\033[38;5;214m" - C_WARN="\033[38;5;222m" - C_ERR="\033[38;5;196m" - C_TITLE="\033[38;5;220m" - ;; - ice) - C_OK="\033[38;5;51m" - C_WARN="\033[38;5;117m" - C_ERR="\033[38;5;39m" - C_TITLE="\033[38;5;123m" - ;; - *) - C_OK="\033[1;32m" - C_WARN="\033[1;33m" - C_ERR="\033[1;31m" - C_TITLE="\033[1;36m" - ;; -esac - -C_RESET="\033[0m" - -# ---------------------------- -# Layout -# ---------------------------- - -hr() { - printf "%*s\n" "$(tput cols)" '' | tr ' ' '─' -} - -header() { - echo -e "${C_TITLE}$1${C_RESET}" - hr -} - -section() { - echo - echo -e "${C_TITLE}$1${C_RESET}" - hr -} - -ok() { printf "${C_OK}✔ %-30s${C_RESET}\n" "$1"; } -warn() { printf "${C_WARN}⚠ %-30s${C_RESET}\n" "$1"; } -err() { printf "${C_ERR}✖ %-30s${C_RESET}\n" "$1"; } - -# Blink helper (used for CRITICAL) -blink_err() { - printf "\033[5m${C_ERR}✖ %-30s${C_RESET}\n" "$1" -} diff --git a/backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-backup-option.sh b/backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-backup-option.sh deleted file mode 100755 index 2319122..0000000 --- a/backups/scripts/20260509-030842/tools/legacy/patches/patch-mqlaunch-add-backup-option.sh +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -python3 - <<'PY' -from pathlib import Path -import re -import sys - -path = Path.home() / "macos-scripts" / "terminal" / "launchers" / "mqlaunch.sh" - -if not path.exists(): - print(f"Missing file: {path}") - sys.exit(1) - -text = path.read_text() -original = text - -# ------------------------------------------------------------ -# 1) Add backup_mqlaunch() before menu section -# ------------------------------------------------------------ -backup_func = r''' -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BASE_DIR/terminal/launchers/mqlaunch-$stamp.sh.bak" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -''' - -if 'backup_mqlaunch() {' not in text: - marker = '# --- Menus --------------------------------------------------' - if marker not in text: - print("Could not find menu marker.") - sys.exit(1) - text = text.replace(marker, backup_func + marker, 1) - -# ------------------------------------------------------------ -# 2) Replace print_dev_menu() -# ------------------------------------------------------------ -new_print_dev_menu = r'''print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-10]: ${C_RESET}" -}''' - -text, count = re.subn( - r'print_dev_menu\(\)\s*\{.*?^\}', - new_print_dev_menu, - text, - flags=re.S | re.M, - count=1 -) - -if count != 1: - print("Could not patch print_dev_menu().") - sys.exit(1) - -# ------------------------------------------------------------ -# 3) Replace dev_menu_loop() -# ------------------------------------------------------------ -new_dev_menu_loop = r'''dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -}''' - -text, count = re.subn( - r'dev_menu_loop\(\)\s*\{.*?^\}', - new_dev_menu_loop, - text, - flags=re.S | re.M, - count=1 -) - -if count != 1: - print("Could not patch dev_menu_loop().") - sys.exit(1) - -# ------------------------------------------------------------ -# 4) Replace show_help() -# ------------------------------------------------------------ -new_show_help = r'''show_help() { - cat </dev/null || true - bash "$dashboard_script" menu - else - print_header - row "MQ DASHBOARD" - empty_row - row "Dashboard script missing:" - row " $dashboard_script" - print_footer - pause_enter - fi -} - -''' - -if 'open_dashboard() {' not in text: - if 'backup_mqlaunch() {' in text: - text = text.replace('backup_mqlaunch() {', dashboard_func + 'backup_mqlaunch() {', 1) - elif '# --- Menus --------------------------------------------------' in text: - text = text.replace('# --- Menus --------------------------------------------------', dashboard_func + '# --- Menus --------------------------------------------------', 1) - else: - print("Could not find safe insertion point for open_dashboard().") - sys.exit(1) - -# ------------------------------------------------------------ -# 2) Replace print_main_menu() -# ------------------------------------------------------------ -new_print_main_menu = r'''print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - row3 "23. Dashboard" "" "" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-23,X]: ${C_RESET}" -}''' - -text, count = re.subn( - r'print_main_menu\(\)\s*\{.*?^\}', - new_print_main_menu, - text, - flags=re.S | re.M, - count=1 -) - -if count != 1: - print("Could not patch print_main_menu().") - sys.exit(1) - -# ------------------------------------------------------------ -# 3) Replace main_loop() -# ------------------------------------------------------------ -new_main_loop = r'''main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - 23) open_dashboard ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -}''' - -text, count = re.subn( - r'main_loop\(\)\s*\{.*?^\}', - new_main_loop, - text, - flags=re.S | re.M, - count=1 -) - -if count != 1: - print("Could not patch main_loop().") - sys.exit(1) - -# ------------------------------------------------------------ -# 4) Replace show_help() -# ------------------------------------------------------------ -new_show_help = r'''show_help() { - cat </dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME MANAGER" - empty_row - row "Theme manager script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. List themes" " 2. Current theme" - row2 " 3. Preview classic" " 4. Preview green" - row2 " 5. Apply classic" " 6. Apply green" - row2 " 7. Apply amber" " 8. Apply ice" - row2 " 9. Apply synth" "10. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-10]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd list; pause_enter ;; - 2) theme_cmd current; pause_enter ;; - 3) theme_cmd preview classic ;; - 4) theme_cmd preview green ;; - 5) theme_cmd apply classic; pause_enter ;; - 6) theme_cmd apply green; pause_enter ;; - 7) theme_cmd apply amber; pause_enter ;; - 8) theme_cmd apply ice; pause_enter ;; - 9) theme_cmd apply synth; pause_enter ;; - 10) theme_cmd reset; pause_enter ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -''' - -if 'themes_menu_loop() {' not in text: - marker = '# --- Menus --------------------------------------------------' - if marker not in text: - print("Could not find menu marker.") - sys.exit(1) - text = text.replace(marker, theme_block + marker, 1) - -# ------------------------------------------------------------ -# 2) Patch print_dev_menu() -# ------------------------------------------------------------ -new_print_dev_menu = r'''print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" " 0. Back" - - print_footer - printf "${C_TITLE}Select dev option [0-11]: ${C_RESET}" -}''' - -text, count = re.subn( - r'print_dev_menu\(\)\s*\{.*?^\}', - new_print_dev_menu, - text, - flags=re.S | re.M, - count=1 -) - -if count != 1: - print("Could not patch print_dev_menu().") - sys.exit(1) - -# ------------------------------------------------------------ -# 3) Patch dev_menu_loop() -# ------------------------------------------------------------ -new_dev_menu_loop = r'''dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -}''' - -text, count = re.subn( - r'dev_menu_loop\(\)\s*\{.*?^\}', - new_dev_menu_loop, - text, - flags=re.S | re.M, - count=1 -) - -if count != 1: - print("Could not patch dev_menu_loop().") - sys.exit(1) - -# ------------------------------------------------------------ -# 4) Patch show_help() -# ------------------------------------------------------------ -new_show_help = r'''show_help() { - cat </dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -''' - -if 'open_tools_menu() {' not in text: - marker = '# --- Menus --------------------------------------------------' - if marker not in text: - print("Could not find menu marker.") - sys.exit(1) - text = text.replace(marker, tools_helper + marker, 1) - -# ------------------------------------------------------------ -# 2) Patch print_dev_menu() -# ------------------------------------------------------------ -new_print_dev_menu = r'''print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -}''' - -text, count = re.subn( - r'print_dev_menu\(\)\s*\{.*?^\}', - new_print_dev_menu, - text, - flags=re.S | re.M, - count=1 -) -if count != 1: - print("Could not patch print_dev_menu().") - sys.exit(1) - -# ------------------------------------------------------------ -# 3) Patch dev_menu_loop() -# ------------------------------------------------------------ -new_dev_menu_loop = r'''dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) git_menu_loop ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -}''' - -text, count = re.subn( - r'dev_menu_loop\(\)\s*\{.*?^\}', - new_dev_menu_loop, - text, - flags=re.S | re.M, - count=1 -) -if count != 1: - print("Could not patch dev_menu_loop().") - sys.exit(1) - -# ------------------------------------------------------------ -# 4) Patch show_help() -# ------------------------------------------------------------ -new_show_help = r'''show_help() { - cat </dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -}''' - -text, count = re.subn( - r'theme_cmd\(\)\s*\{.*?themes_menu_loop\(\)\s*\{.*?^\}', - new_theme_block, - text, - flags=re.S | re.M, - count=1 -) - -if count != 1: - print("Could not replace theme menu block.") - sys.exit(1) - -# ------------------------------------------------------------ -# 2) Replace help text -# ------------------------------------------------------------ -new_show_help = r'''show_help() { - cat </dev/null || true -source "$BASE_DIR/.env" 2>/dev/null || true - -VECTOR_STORE_ID="vs_69f93de12f508191bd6a36ea3b825beb" -previous_id="" - -_chat_sep() { printf '%.0s─' $(seq 1 "${COLUMNS:-80}"); printf '\n'; } - -clear -_chat_sep -printf " mqlaunch chat — fråga om repot, skriv exit för att avsluta\n" -_chat_sep -echo "" - -while true; do - printf "chat > " - IFS= read -r question || break - [[ "$question" == "exit" || "$question" == "quit" || "$question" == "q" ]] && break - [[ -z "${question// }" ]] && continue - - if [[ -z "$previous_id" ]]; then - PAYLOAD="$(jq -n \ - --arg q "$question" \ - --arg vs "$VECTOR_STORE_ID" \ - '{ - model: "gpt-4.1-mini", - input: ("Use file search when relevant. " + $q), - tools: [{ type: "file_search", vector_store_ids: [$vs] }] - }')" - else - PAYLOAD="$(jq -n \ - --arg q "$question" \ - --arg prev "$previous_id" \ - --arg vs "$VECTOR_STORE_ID" \ - '{ - model: "gpt-4.1-mini", - input: $q, - previous_response_id: $prev, - tools: [{ type: "file_search", vector_store_ids: [$vs] }] - }')" - fi - - printf "thinking..." - - RESPONSE="$(curl -s https://api.openai.com/v1/responses \ - -H "Authorization: Bearer $OPENAI_API_KEY" \ - -H "Content-Type: application/json" \ - -d "$PAYLOAD")" - - printf "\r\033[2K" - - previous_id="$(echo "$RESPONSE" | jq -r '.id // empty')" - - TEXT="$(echo "$RESPONSE" | jq -r ' - first( - .output[] - | select(.type == "message") - | .content[] - | select(.type == "output_text") - | .text - ) // .error.message // "No response" - ' 2>/dev/null)" - - echo "" - echo "$TEXT" - echo "" -done - -echo "Chat avslutat." diff --git a/backups/scripts/20260509-030842/tools/scripts/document-functions.sh b/backups/scripts/20260509-030842/tools/scripts/document-functions.sh deleted file mode 100755 index e8fdcfc..0000000 --- a/backups/scripts/20260509-030842/tools/scripts/document-functions.sh +++ /dev/null @@ -1,422 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -ROOT_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -WRITE=0 -CHECK=0 -SHOW_DIFF=0 -SUMMARY=0 -BACKUP=0 -STYLE="simple" -BACKUP_ROOT="$ROOT_DIR/backups/scripts" -BACKUP_TIMESTAMP="" -TARGETS=() -EXCLUDES=() -SCANNED_FILES=0 -CHANGED_FILES=0 -CHANGED_COMMENTS=0 - -usage() { - cat <<'EOF' -document-functions.sh — add short comments above undocumented shell functions - -Usage: - tools/scripts/document-functions.sh [options] [path ...] - -Options: - --write Update files in place - --check Exit 1 if any file would change - --diff Show a unified diff for planned changes - --summary Print scan totals at the end - --backup Save backups under backups/scripts before --write updates - --exclude PATTERN Skip paths matching a shell glob pattern - --style simple|function|name - Comment style to generate (default: simple) - -h, --help Show this help - -Examples: - tools/scripts/document-functions.sh tools/scripts/scan.sh - tools/scripts/document-functions.sh --diff tools/scripts/scan.sh - tools/scripts/document-functions.sh --check tools/scripts terminal - tools/scripts/document-functions.sh --write tools/scripts/scan.sh - tools/scripts/document-functions.sh --write --backup tools/scripts terminal - tools/scripts/document-functions.sh --exclude '*/legacy/*' tools - -Default mode is dry-run. Use --write to update files. -EOF -} - -while [[ $# -gt 0 ]]; do - case "$1" in - --write) - WRITE=1 - shift - ;; - --check) - CHECK=1 - shift - ;; - --diff) - SHOW_DIFF=1 - shift - ;; - --summary) - SUMMARY=1 - shift - ;; - --backup) - BACKUP=1 - shift - ;; - --exclude) - if [[ $# -lt 2 ]]; then - printf 'Missing pattern for --exclude\n' >&2 - exit 2 - fi - EXCLUDES+=("$2") - shift 2 - ;; - --style) - if [[ $# -lt 2 ]]; then - printf 'Missing value for --style\n' >&2 - exit 2 - fi - case "$2" in - simple|function|name) - STYLE="$2" - ;; - *) - printf 'Unsupported --style value: %s\n' "$2" >&2 - exit 2 - ;; - esac - shift 2 - ;; - -h|--help) - usage - exit 0 - ;; - --*) - printf 'Unknown option: %s\n' "$1" >&2 - exit 2 - ;; - *) - TARGETS+=("$1") - shift - ;; - esac -done - -if [[ ${#TARGETS[@]} -eq 0 ]]; then - TARGETS=("tools/scripts") -fi - -is_shell_file() { - local file="$1" - - [[ -f "$file" ]] || return 1 - case "$file" in - *.sh|*.bash|*.zsh) return 0 ;; - esac - - head -n 1 "$file" 2>/dev/null | grep -Eq '^#!.*\b(bash|zsh|sh)\b' -} - -collect_files() { - local target="$1" - - if [[ -d "$target" ]]; then - find "$target" -type f | sort - elif [[ -f "$target" ]]; then - printf '%s\n' "$target" - else - printf 'Skipping missing path: %s\n' "$target" >&2 - fi -} - -should_exclude() { - local file="$1" - local pattern - - [[ ${#EXCLUDES[@]} -eq 0 ]] && return 1 - - for pattern in "${EXCLUDES[@]}"; do - # Intentional glob match: --exclude accepts shell patterns. - # shellcheck disable=SC2254 - case "$file" in - $pattern) return 0 ;; - esac - done - - return 1 -} - -backup_file() { - local file="$1" - local relative backup_path backup_dir - - if [[ -z "$BACKUP_TIMESTAMP" ]]; then - BACKUP_TIMESTAMP="$(date +%Y%m%d-%H%M%S)" - fi - - if [[ "$file" == "$ROOT_DIR/"* ]]; then - relative="${file#"$ROOT_DIR"/}" - else - relative="$file" - fi - relative="${relative#./}" - relative="${relative#/}" - backup_path="$BACKUP_ROOT/$BACKUP_TIMESTAMP/$relative" - backup_dir="$(dirname "$backup_path")" - - mkdir -p "$backup_dir" - cp "$file" "$backup_path" - printf 'Backup saved %s\n' "$backup_path" -} - -document_file() { - local file="$1" - local tmp changed - tmp="$(mktemp "${TMPDIR:-/tmp}/mq-doc-functions.XXXXXX")" - - awk -v style="$STYLE" ' - function trim(s) { - sub(/^[[:space:]]+/, "", s) - sub(/[[:space:]]+$/, "", s) - return s - } - - function words(name, result) { - result = name - gsub(/_+/, " ", result) - return result - } - - function strip_prefix(name, prefix, result) { - result = name - sub("^" prefix "_", "", result) - return words(result) - } - - function simple_comment(name) { - if (name == "main") { - return "# Runs the main entry point." - } - if (name == "usage") { - return "# Prints usage information." - } - if (name == "menu_loop") { - return "# Runs the menu loop." - } - if (name ~ /^is_/) { - return "# Checks whether " strip_prefix(name, "is") " applies." - } - if (name ~ /^has_/) { - return "# Checks whether " strip_prefix(name, "has") " is available." - } - if (name ~ /^ensure_/) { - return "# Ensures " strip_prefix(name, "ensure") " is ready." - } - if (name ~ /^collect_/) { - return "# Collects " strip_prefix(name, "collect") "." - } - if (name ~ /^document_/) { - return "# Documents " strip_prefix(name, "document") "." - } - if (name ~ /^open_/) { - return "# Opens " strip_prefix(name, "open") "." - } - if (name ~ /^run_/) { - return "# Runs " strip_prefix(name, "run") "." - } - if (name ~ /^show_/) { - return "# Shows " strip_prefix(name, "show") "." - } - if (name ~ /^print_/) { - return "# Prints " strip_prefix(name, "print") "." - } - if (name ~ /^get_/) { - return "# Gets " strip_prefix(name, "get") "." - } - if (name ~ /^set_/) { - return "# Sets " strip_prefix(name, "set") "." - } - if (name ~ /^draw_/) { - return "# Draws " strip_prefix(name, "draw") "." - } - if (name ~ /^copy_/) { - return "# Copies " strip_prefix(name, "copy") "." - } - if (name ~ /^normalize_/) { - return "# Normalizes " strip_prefix(name, "normalize") "." - } - if (name ~ /^choose_/) { - return "# Chooses " strip_prefix(name, "choose") "." - } - if (name ~ /^analyze_/) { - return "# Analyzes " strip_prefix(name, "analyze") "." - } - if (name ~ /^suggest_/) { - return "# Suggests " strip_prefix(name, "suggest") "." - } - if (name ~ /^stage_/) { - return "# Stages " strip_prefix(name, "stage") "." - } - if (name ~ /^commit_/) { - return "# Commits " strip_prefix(name, "commit") "." - } - if (name ~ /^pull_/) { - return "# Pulls " strip_prefix(name, "pull") "." - } - if (name ~ /^edit_/) { - return "# Edits " strip_prefix(name, "edit") "." - } - if (name ~ /^backup_/) { - return "# Backs up " strip_prefix(name, "backup") "." - } - if (name ~ /^revert_/) { - return "# Reverts " strip_prefix(name, "revert") "." - } - if (name ~ /^resolve_/) { - return "# Resolves " strip_prefix(name, "resolve") "." - } - if (name ~ /^lock_/) { - return "# Locks " strip_prefix(name, "lock") "." - } - if (name ~ /^sleep_/) { - return "# Sleeps " strip_prefix(name, "sleep") "." - } - if (name ~ /^restart_/) { - return "# Restarts " strip_prefix(name, "restart") "." - } - if (name ~ /^ping_/) { - return "# Pings " strip_prefix(name, "ping") "." - } - - return "# Handles " words(name) "." - } - - function generated_comment(name) { - if (style == "function") { - return "# Function: " name - } - if (style == "name") { - return "# " name - } - return simple_comment(name) - } - - function function_name(line, candidate) { - candidate = line - if (candidate ~ /^[[:space:]]*[A-Za-z_][A-Za-z0-9_]*[[:space:]]*\(\)[[:space:]]*\{/) { - sub(/^[[:space:]]*/, "", candidate) - sub(/[[:space:]]*\(\)[[:space:]]*\{.*/, "", candidate) - return candidate - } - if (candidate ~ /^[[:space:]]*function[[:space:]]+[A-Za-z_][A-Za-z0-9_]*[[:space:]]*(\(\))?[[:space:]]*\{/) { - sub(/^[[:space:]]*function[[:space:]]+/, "", candidate) - sub(/[[:space:]]*(\(\))?[[:space:]]*\{.*/, "", candidate) - return candidate - } - return "" - } - - function emit_pending() { - if (has_pending) { - print pending - pending = "" - has_pending = 0 - } - } - - { - name = function_name($0) - if (name != "") { - prev = trim(pending) - expected = generated_comment(name) - if (prev ~ /^# Function:/ || prev ~ /^# Handles [A-Za-z0-9_ ]+\.$/ || prev ~ /^# (Opens|Runs|Shows|Prints|Gets|Sets|Collects|Documents|Draws|Copies|Normalizes|Chooses|Analyzes|Suggests|Stages|Commits|Pulls|Edits|Backs up|Reverts|Resolves|Locks|Sleeps|Restarts|Pings) [A-Za-z0-9_ ]+\.$/ || prev ~ /^# Checks whether [A-Za-z0-9_ ]+ (applies|is available)\.$/ || prev ~ /^# Ensures [A-Za-z0-9_ ]+ is ready\.$/) { - pending = expected - emit_pending() - if (prev != expected) { - added++ - } - } else if (!has_pending) { - print expected - added++ - } else if (prev !~ /^#/ && prev !~ /^$/) { - emit_pending() - print expected - added++ - } else if (prev == "") { - emit_pending() - print expected - added++ - } else { - emit_pending() - } - print - next - } - - emit_pending() - pending = $0 - has_pending = 1 - } - - END { - emit_pending() - if (added > 0) { - printf "%d\n", added > "/dev/stderr" - } - } - ' "$file" > "$tmp" 2>"$tmp.count" - - changed="$(cat "$tmp.count" 2>/dev/null || true)" - rm -f "$tmp.count" - - if [[ -z "$changed" ]]; then - rm -f "$tmp" - return 0 - fi - - CHANGED_FILES=$((CHANGED_FILES + 1)) - CHANGED_COMMENTS=$((CHANGED_COMMENTS + changed)) - - if [[ "$SHOW_DIFF" -eq 1 ]]; then - diff -u "$file" "$tmp" || true - fi - - if [[ "$WRITE" -eq 1 ]]; then - if [[ "$BACKUP" -eq 1 ]]; then - backup_file "$file" - fi - cp "$tmp" "$file" - printf 'Updated %s (%s comments)\n' "$file" "$changed" - else - printf 'Would update %s (%s comments)\n' "$file" "$changed" - fi - - rm -f "$tmp" -} - -cd "$ROOT_DIR" - -for target in "${TARGETS[@]}"; do - while IFS= read -r file; do - should_exclude "$file" && continue - is_shell_file "$file" || continue - SCANNED_FILES=$((SCANNED_FILES + 1)) - document_file "$file" - done < <(collect_files "$target") -done - -if [[ "$SUMMARY" -eq 1 ]]; then - printf 'Scanned %s files\n' "$SCANNED_FILES" - printf '%s files need updates\n' "$CHANGED_FILES" - printf '%s function comments missing or outdated\n' "$CHANGED_COMMENTS" -fi - -if [[ "$CHECK" -eq 1 && "$CHANGED_FILES" -gt 0 ]]; then - exit 1 -fi diff --git a/backups/scripts/20260509-030842/tools/scripts/hal-terminal-guide.sh b/backups/scripts/20260509-030842/tools/scripts/hal-terminal-guide.sh deleted file mode 100755 index 02779f5..0000000 --- a/backups/scripts/20260509-030842/tools/scripts/hal-terminal-guide.sh +++ /dev/null @@ -1,631 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -GUIDE_HTML="$BASE_DIR/docs/mac-terminal-guide.html" -GUIDE_FALLBACK="$BASE_DIR/tools/mac-terminal-guide/mac-terminal-guide.html" -VECTOR_STORE_ID="${MQ_TERMINAL_GUIDE_VECTOR_STORE_ID:-vs_69f93de12f508191bd6a36ea3b825beb}" -REPO_URL="${MQ_REPO_URL:-https://github.com/MCamner/macos-scripts}" -HAL_NAV_PENDING=0 - -hal_width() { - local cols - cols="$(tput cols 2>/dev/null || echo 80)" - (( cols < 64 )) && cols=64 - (( cols > 80 )) && cols=80 - printf '%s\n' "$cols" -} - -hal_repeat() { - local count="$1" - local char="${2:- }" - local out="" - - while (( count > 0 )); do - out+="$char" - (( count-- )) - done - - printf '%s' "$out" -} - -hal_pad() { - local text="$1" - local width="$2" - local len pad - len="${#text}" - - if (( len > width )); then - printf '%s' "${text:0:width}" - return - fi - - pad=$(( width - len )) - printf '%s%s' "$text" "$(hal_repeat "$pad" " ")" -} - -hal_top() { - local title="$1" - local width="$2" - local inner rest - inner=$(( width - 4 )) - rest=$(( inner - ${#title} - 1 )) - (( rest < 0 )) && rest=0 - - printf '┌─ %s %s┐\n' "$title" "$(hal_repeat "$rest" "─")" -} - -hal_row() { - local text="$1" - local width="$2" - local inner - inner=$(( width - 4 )) - printf '│ %s │\n' "$(hal_pad "$text" "$inner")" -} - -hal_split_row() { - local left="$1" - local right="$2" - local width="$3" - local inner left_width right_width - inner=$(( width - 4 )) - left_width=$(( inner / 2 )) - right_width=$(( inner - left_width )) - - printf '│ %s%s │\n' "$(hal_pad "$left" "$left_width")" "$(hal_pad "$right" "$right_width")" -} - -hal_bottom() { - local width="$1" - printf '└%s┘\n' "$(hal_repeat "$(( width - 2 ))" "─")" -} - -load_env_file() { - local file="$1" - local line key value - - [[ -f "$file" ]] || return 0 - - while IFS= read -r line || [[ -n "$line" ]]; do - [[ "$line" =~ ^[[:space:]]*# || -z "${line// }" ]] && continue - line="${line#export }" - key="${line%%=*}" - value="${line#*=}" - value="${value%\"}" - value="${value#\"}" - value="${value%\'}" - value="${value#\'}" - - case "$key" in - OPENAI_API_KEY) - : "${OPENAI_API_KEY:=$value}" - ;; - MQ_TERMINAL_GUIDE_VECTOR_STORE_ID) - VECTOR_STORE_ID="$value" - ;; - esac - done < "$file" -} - -load_env_file "$HOME/.env" -load_env_file "$BASE_DIR/.env" - -usage() { - cat <<'USAGE' -hal-terminal-guide.sh - ask or run commands grounded in the mac terminal guide - -Usage: - tools/scripts/hal-terminal-guide.sh - tools/scripts/hal-terminal-guide.sh ask "question" - tools/scripts/hal-terminal-guide.sh run "open Google Chrome" - tools/scripts/hal-terminal-guide.sh open-guide - -Examples: - tools/scripts/hal-terminal-guide.sh ask "how do I open an app from Terminal?" - tools/scripts/hal-terminal-guide.sh run "open Google Chrome" -USAGE -} - -guide_file() { - if [[ -f "$GUIDE_HTML" ]]; then - printf '%s\n' "$GUIDE_HTML" - else - printf '%s\n' "$GUIDE_FALLBACK" - fi -} - -open_guide() { - local guide - guide="$(guide_file)" - - if [[ -f "$guide" ]]; then - open "$guide" - else - printf 'Guide file not found: %s\n' "$guide" >&2 - return 1 - fi -} - -lower_text() { - printf '%s' "$1" | tr '[:upper:]' '[:lower:]' -} - -trim_text() { - local text="$1" - text="${text#"${text%%[![:space:]]*}"}" - text="${text%"${text##*[![:space:]]}"}" - printf '%s' "$text" -} - -resolve_nav_dir() { - local name lower - name="$(trim_text "$1")" - lower="$(lower_text "$name")" - - case "$lower" in - macos-scripts|macos_scripts|"macos scripts"|mqlaunch|mq|scripts) - printf '%s' "${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}"; return 0 ;; - downloads|download|"hämtade filer"|hämtningar) - printf '%s' "$HOME/Downloads"; return 0 ;; - documents|document|dokument|dokumenten) - printf '%s' "$HOME/Documents"; return 0 ;; - desktop|skrivbord|skrivbordet) - printf '%s' "$HOME/Desktop"; return 0 ;; - home|hem|hemkatalog|~) - printf '%s' "$HOME"; return 0 ;; - applications|appar|apps) - printf '%s' "/Applications"; return 0 ;; - utilities|verktyg) - printf '%s' "/Applications/Utilities"; return 0 ;; - zephyr|"zephyr-workbench"|zephyr_workbench) - printf '%s' "$HOME/zephyr-workbench"; return 0 ;; - design|"design-prototyp"|design_prototyp) - printf '%s' "$HOME/design-prototyp"; return 0 ;; - *) - if [[ "$name" == /* ]] && [[ -d "$name" ]]; then - printf '%s' "$name"; return 0 - fi - if [[ "$name" == ~* ]]; then - local expanded="${name/#\~/$HOME}" - [[ -d "$expanded" ]] && { printf '%s' "$expanded"; return 0; } - fi - if [[ -d "$HOME/$name" ]]; then - printf '%s' "$HOME/$name"; return 0 - fi - return 1 - ;; - esac -} - -extract_nav_target() { - local lower="$1" result trigger - local triggers=("gå till " "navigera till " "öppna katalogen " "öppna mappen " "öppna katalog " "öppna mapp " "go to " "navigate to " "cd to ") - for trigger in "${triggers[@]}"; do - if [[ "$lower" == *"$trigger"* ]]; then - result="${lower##*$trigger}" - result="$(trim_text "$result")" - [[ -n "$result" ]] && { printf '%s' "$result"; return 0; } - fi - done - return 1 -} - -safe_intent_command() { - local query app path lower - query="$1" - lower="$(lower_text "$query")" - - case "$lower" in - 1|finder|*"öppna finder"*|*"open finder"*|*"starta finder"*) - app="Finder" - printf 'app|%s|open -a "%s"\n' "$app" "$app" - return 0 - ;; - 2|safari|*"öppna safari"*|*"open safari"*|*"starta safari"*) - app="Safari" - printf 'app|%s|open -a "%s"\n' "$app" "$app" - return 0 - ;; - 3|chrome|google\ chrome|*"öppna google chrome"*|*"open google chrome"*|*"starta google chrome"*|*"öppna chrome"*|*"open chrome"*) - app="Google Chrome" - printf 'app|%s|open -a "%s"\n' "$app" "$app" - return 0 - ;; - 4|spotify|*"öppna spotify"*|*"open spotify"*|*"starta spotify"*) - app="Spotify" - printf 'app|%s|open -a "%s"\n' "$app" "$app" - return 0 - ;; - 5|xcode|*"öppna xcode"*|*"open xcode"*|*"starta xcode"*) - app="Xcode" - printf 'app|%s|open -a "%s"\n' "$app" "$app" - return 0 - ;; - 6|system\ settings|settings|*"öppna system settings"*|*"open system settings"*|*"öppna systeminställningar"*) - app="System Settings" - printf 'app|%s|open -a "%s"\n' "$app" "$app" - return 0 - ;; - 7|downloads|download|*"öppna downloads"*|*"open downloads"*|*"öppna hämtade filer"*) - path="$HOME/Downloads" - printf 'path|%s|open "%s"\n' "$path" "$path" - return 0 - ;; - 8|home|home\ folder|*"open home folder"*|*"öppna home"*|*"open home"*) - path="$HOME" - printf 'path|%s|open "%s"\n' "$path" "$path" - return 0 - ;; - 9|utilities|utilities\ folder|*"open utilities folder"*|*"öppna utilities"*|*"open utilities"*) - path="/Applications/Utilities" - printf 'path|%s|open "%s"\n' "$path" "$path" - return 0 - ;; - 10|applications|applications\ folder|*"open applications folder"*|*"öppna applications"*|*"open applications"*) - path="/Applications" - printf 'path|%s|open "%s"\n' "$path" "$path" - return 0 - ;; - 11|lock|lock\ screen|*"lås skärm"*|*"lock screen"*|*"lock mac"*) - printf 'lock|Lock screen|CGSession -suspend\n' - return 0 - ;; - 12|sleep|sleep\ display|*"sleep display"*|*"turn off display"*|*"släck skärm"*) - printf 'sleep|Sleep display|pmset displaysleepnow\n' - return 0 - ;; - 13|restart\ finder|*"restart finder"*|*"starta om finder"*) - printf 'restart_finder|Restart Finder|killall Finder\n' - return 0 - ;; - 14|repo|repo\ browser|repo\ in\ browser|*"repo in browser"*|*"open repo"*|*"öppna repo"*) - printf 'url|Repo in browser|open "%s"\n' "$REPO_URL" - return 0 - ;; - guide|open\ guide|*"öppna guide"*|*"open guide"*|*"terminal guide"*|*"terminalguiden"*) - printf 'guide|mac terminal guide|open guide\n' - return 0 - ;; - *"gå till"*|*"navigera till"*|*"öppna katalog"*|*"öppna mapp"*|*"go to "*) - local nav_name nav_path - if nav_name="$(extract_nav_target "$lower")" && nav_path="$(resolve_nav_dir "$nav_name")"; then - printf 'cd|%s|cd "%s"\n' "$nav_path" "$nav_path" - return 0 - fi - ;; - cd\ *) - local nav_name nav_path - nav_name="$(trim_text "${lower#cd }")" - if [[ -n "$nav_name" ]] && nav_path="$(resolve_nav_dir "$nav_name")"; then - printf 'cd|%s|cd "%s"\n' "$nav_path" "$nav_path" - return 0 - fi - ;; - esac - - return 1 -} - -extract_shell_command() { - local query lower command first - query="$(trim_text "$1")" - lower="$(lower_text "$query")" - - case "$query" in - \!*) - command="${query#!}" - trim_text "$command" - return 0 - ;; - esac - - case "$lower" in - run\ *|execute\ *|exec\ *|kör\ *|kor\ *) - command="${query#* }" - trim_text "$command" - return 0 - ;; - esac - - first="${query%% *}" - case "$first" in - pwd|date|whoami|hostname|uptime|ls|ll|la|tree|df|du|find|rg|grep|cat|less|head|tail|wc|which|type|command|git) - printf '%s\n' "$query" - return 0 - ;; - esac - - return 1 -} - -is_blocked_shell_command() { - local command lower - command="$1" - lower="$(lower_text "$command")" - - case "$lower" in - *"sudo "*|sudo|\ - *" rm -rf "*|rm\ -rf*|*" rm -r "*|rm\ -r*|\ - *"mkfs"*|*"diskutil erase"*|*"diskutil partition"*|\ - *"dd if="*|*"shutdown"*|*"reboot"*|*"halt"*|\ - *":(){:"*|*" chmod -r 777"*|chmod\ -r\ 777*|\ - *" chown -r "*|chown\ -r*|killall\ *|*" killall "*) - return 0 - ;; - esac - - return 1 -} - -execute_shell_command() { - local command confirm shell_bin status - command="$(trim_text "$1")" - shell_bin="${SHELL:-/bin/zsh}" - - if [[ -z "$command" ]]; then - printf 'HAL: no command to run.\n' - return 0 - fi - - if is_blocked_shell_command "$command"; then - printf 'HAL: I will not run that command automatically.\n' - printf 'Command: %s\n' "$command" - printf 'Reason: it looks destructive, privileged, or process-killing.\n' - return 0 - fi - - printf 'HAL: I can run this terminal command.\n' - printf 'Command: %s\n' "$command" - printf 'Run it now? [y/N] ' - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || { - printf 'Cancelled.\n' - return 0 - } - - printf '\n' - set +e - "$shell_bin" -lc "$command" - status=$? - set -e - printf '\nHAL: command exited with status %s.\n' "$status" - return 0 -} - -execute_safe_intent() { - local intent="$1" - local kind label command confirm - IFS='|' read -r kind label command <<< "$intent" - - printf 'HAL: I found a safe guide action.\n' - printf 'Target: %s\n' "$label" - printf 'Command: %s\n' "$command" - printf 'Run it now? [y/N] ' - read -r confirm - [[ "$confirm" =~ ^[Yy]$ ]] || { - printf 'Cancelled.\n' - return 0 - } - - case "$kind" in - app) - open -a "$label" - ;; - path) - open "$label" - ;; - guide) - open_guide - ;; - url) - open "$REPO_URL" - ;; - lock) - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi - ;; - sleep) - pmset displaysleepnow - ;; - restart_finder) - killall Finder >/dev/null 2>&1 - ;; - cd) - if [[ ! -d "$label" ]]; then - printf 'HAL: directory not found: %s\n' "$label" - return 1 - fi - printf '%s\n' "$label" > "${HOME}/.hal_nav" - HAL_NAV_PENDING=1 - ;; - *) - printf 'Unsupported safe action: %s\n' "$kind" >&2 - return 1 - ;; - esac -} - -print_hal_menu() { - local width - width="$(hal_width)" - - hal_top "HAL" "$width" - hal_row "Terminal Guide and Safe macOS Actions" "$width" - hal_row "" "$width" - hal_row "APPS" "$width" - hal_split_row " 1. Finder" " 2. Safari" "$width" - hal_split_row " 3. Google Chrome" " 4. Spotify" "$width" - hal_split_row " 5. Xcode" " 6. System Settings" "$width" - hal_row "" "$width" - hal_row "FOLDERS" "$width" - hal_split_row " 7. Downloads" " 8. Home" "$width" - hal_split_row " 9. Utilities" "10. Applications" "$width" - hal_row "" "$width" - hal_row "QUICK ACTIONS" "$width" - hal_split_row "11. Lock screen" "12. Sleep display" "$width" - hal_split_row "13. Restart Finder" "14. Repo in browser" "$width" - hal_row "" "$width" - hal_row "Type a number, question, or 'gå till '" "$width" - hal_row "Commands: ! , cd , run , /guide, /quit" "$width" - hal_bottom "$width" -} - -local_guide_search() { - local query guide term - query="$1" - guide="$(guide_file)" - term="$(printf '%s' "$query" | tr ' ' '\n' | grep -E '.{4,}' | head -1 || true)" - - [[ -f "$guide" && -n "$term" ]] || return 0 - - printf '\nLocal guide matches:\n' - rg -i -m 5 "$term" "$guide" \ - | sed -E 's/^[^:]+:[0-9]+:[[:space:]]*//' \ - | sed -E 's/"/"/g; s/'/'"'"'/g; s/<[^>]+>//g' \ - | sed -n '1,5p' -} - -read_hal_prompt() { - local width line - width="$(hal_width)" - line="$(hal_repeat "$width" "─")" - query="" - - if [[ -t 0 && -t 1 ]]; then - printf '%s\n' "$line" - printf 'hal > \n' - printf '%s\n' "$line" - printf '>> press 1-14, use ! , or /quit\n' - printf '\033[3A\rhal > ' - read -r query || return 1 - printf '\033[2B\r' - return 0 - fi - - printf '%s\n' "$line" - printf 'hal > ' - read -r query || return 1 - printf '%s\n' "$line" - printf '>> press 1-14, use ! , or /quit\n' -} - -ask_vector_store() { - local question="$1" - local payload response text - - if [[ -z "${OPENAI_API_KEY:-}" ]]; then - printf 'OPENAI_API_KEY is not set. Falling back to local guide search.\n' - local_guide_search "$question" - return 0 - fi - - if ! command -v jq >/dev/null 2>&1; then - printf 'jq is missing. Falling back to local guide search.\n' - local_guide_search "$question" - return 0 - fi - - payload="$(jq -n \ - --arg q "$question" \ - --arg vs "$VECTOR_STORE_ID" \ - '{ - model: "gpt-4.1-mini", - input: ( - "You are HAL Terminal Guide for mqlaunch. Use file search from the mac terminal guide. " + - "Answer in English unless the user explicitly asks for another language. Be concise and practical. " + - "Prefer safe macOS terminal commands from the guide. " + - "If a command is potentially destructive or uses sudo, warn before showing it. " + - "Question: " + $q - ), - tools: [{ type: "file_search", vector_store_ids: [$vs] }] - }')" - - printf 'HAL thinking... ' - response="$(curl -s https://api.openai.com/v1/responses \ - -H "Authorization: Bearer $OPENAI_API_KEY" \ - -H "Content-Type: application/json" \ - -d "$payload" || true)" - printf '\r\033[2K' - - text="$(printf '%s' "$response" | jq -r ' - first( - .output[] - | select(.type == "message") - | .content[] - | select(.type == "output_text") - | .text - ) // .error.message // "" - ' 2>/dev/null)" - - if [[ -z "$text" || "$text" == "null" ]]; then - printf 'No AI response. Local guide fallback:\n' - local_guide_search "$question" - return 0 - fi - - printf '%s\n' "$text" -} - -handle_query() { - local mode="$1" - local query="$2" - local intent shell_command - - if intent="$(safe_intent_command "$query")"; then - execute_safe_intent "$intent" - return - fi - - if shell_command="$(extract_shell_command "$query")"; then - execute_shell_command "$shell_command" - return - fi - - if [[ "$mode" == "run" ]]; then - printf 'HAL: I do not have a safe executable action for that yet.\n' - ask_vector_store "$query" - return - fi - - ask_vector_store "$query" -} - -prompt_loop() { - local query - - while true; do - print_hal_menu - read_hal_prompt || return - - case "$query" in - "" ) continue ;; - /quit|quit|exit|q) break ;; - /guide) open_guide ;; - *) - handle_query "ask" "$query" - [[ "${HAL_NAV_PENDING:-0}" -eq 1 ]] && break - ;; - esac - done -} - -main() { - local cmd="${1:-menu}" - shift || true - - case "$cmd" in - menu) prompt_loop ;; - ask) handle_query "ask" "$*" ;; - run) handle_query "run" "$*" ;; - open-guide|guide) open_guide ;; - help|-h|--help) usage ;; - *) - handle_query "ask" "$cmd $*" - ;; - esac -} - -main "$@" diff --git a/backups/scripts/20260509-030842/tools/scripts/mqlaunch_desktop.sh b/backups/scripts/20260509-030842/tools/scripts/mqlaunch_desktop.sh deleted file mode 100755 index b959b05..0000000 --- a/backups/scripts/20260509-030842/tools/scripts/mqlaunch_desktop.sh +++ /dev/null @@ -1,1048 +0,0 @@ -#!/bin/zsh - -set -u - -# ============================================================ -# MQLAUNCH DESKTOP — Branded Neon Command Surface -# Desktop mode: fullscreen Terminal, stays in foreground -# after launching apps. -# ============================================================ - -APP_TITLE="MQLAUNCH" -APP_SUBTITLE="Branded Neon Command Surface" -APP_AUTHOR="Author Mattias Camner" - -BASE_DIR="$HOME/macos-scripts" -AI_SCRIPT="$BASE_DIR/tools/cli/ai-mode.sh" -PROMPT_DIR="$BASE_DIR/ai-prompts" -REPO_URL="https://github.com/MCamner/macos-scripts" -MQ_SCRIPT="$BASE_DIR/terminal/launchers/mqlaunch.sh" -BACKUP_DIR="$BASE_DIR/backups" -BIN_LINK="$HOME/bin/mqlaunch" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -DASHBOARD_V71="$BASE_DIR/ui/ascii/mqlaunch-dashboard-v7.1.sh" - -TERMINAL_GUIDE_HTML="$BASE_DIR/tools/mac terminal_guide/mac-terminal-guide.html" -TERMINAL_GUIDE_URL="https://mcamner.github.io/macos-scripts/" - -if [[ -f "$UI_LIB" ]]; then - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -BOX_INNER=88 - -# ============================================================ -# DESKTOP MODE — Fullscreen + refocus helpers -# ============================================================ - -# Sätter Terminal till helskärm vid start -enter_fullscreen() { - osascript <<'EOF' >/dev/null 2>&1 -tell application "Terminal" - activate - tell front window - set zoomed to true - end tell -end tell --- Skicka Cmd+Ctrl+F för att gå in i fullscreen -tell application "System Events" - keystroke "f" using {command down, control down} -end tell -EOF - sleep 0.6 -} - -# Återfokuserar Terminal och tar det till förgrunden -refocus_terminal() { - sleep 0.4 - osascript -e 'tell application "Terminal" to activate' >/dev/null 2>&1 -} - -# ============================================================ -# Shared UI -# ============================================================ - -print_header() { - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - else - echo "$APP_TITLE — $APP_SUBTITLE" - printf '%s\n' "----------------------------------------------------------------------------------------" - fi - echo -} - -open_app() { - local app_name="$1" - open -a "$app_name" >/dev/null 2>&1 || { - echo "${C_ERR}Could not open:${C_RESET} $app_name" - pause_enter - return - } - refocus_terminal -} - -open_path() { - local path="$1" - if [[ -e "$path" ]]; then - open "$path" - refocus_terminal - else - echo "${C_ERR}Path not found:${C_RESET} $path" - pause_enter - fi -} - -open_folder_screen() { - local title="$1" - local target="$2" - local missing_label="$3" - - print_header - row "$title" - empty_row - - if [[ -d "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - refocus_terminal - else - row "$missing_label" - row " $target" - print_footer - pause_enter - fi -} - -resolve_prompt_dir() { - local candidate - for candidate in "$HOME/macos-scripts/ai-prompts" "$PROMPT_DIR"; do - if [[ -d "$candidate" ]]; then - print -r -- "$candidate" - return 0 - fi - done - return 1 -} - -resolve_ai_status() { - if [[ -x "$AI_SCRIPT" ]]; then - print -r -- "OK" - elif [[ -e "$AI_SCRIPT" ]]; then - print -r -- "FOUND_NOT_EXECUTABLE" - else - print -r -- "MISSING" - fi -} - -safe_run_ai() { - local mode="$1" - - if [[ -x "$AI_SCRIPT" ]]; then - "$AI_SCRIPT" "$mode" - else - print_header - row "AI BACKEND STATUS" - empty_row - if [[ -e "$AI_SCRIPT" ]]; then - row "ai-mode.sh found but not executable." - row "Run:" - row " chmod +x $AI_SCRIPT" - else - row "ai-mode.sh missing." - row "Expected:" - row " $AI_SCRIPT" - fi - print_footer - pause_enter - fi -} - -run_git_screen() { - local title="$1" - local cmd="$2" - - print_header - row "$title" - empty_row - row "Repo:" - row " $BASE_DIR" - empty_row - - ( - cd "$BASE_DIR" 2>/dev/null || exit 1 - eval "$cmd" - ) - - echo - print_footer - pause_enter -} - -copy_network_info() { - local wifi_ip gateway dns payload - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - payload="Wi-Fi: $wifi_ip -Gateway: $gateway -DNS: $dns" - - if command -v pbcopy >/dev/null 2>&1; then - print -r -- "$payload" | pbcopy - print_header - row "COPY NETWORK INFO" - empty_row - row "Copied to clipboard:" - row " Wi-Fi: $wifi_ip" - row " Gateway: $gateway" - row " DNS: $dns" - print_footer - pause_enter - else - echo "${C_ERR}pbcopy missing.${C_RESET}" - pause_enter - fi -} - -open_network_settings() { - print_header - row "OPEN NETWORK SETTINGS" - empty_row - row "Opening System Settings → Network" - print_footer - open "x-apple.systempreferences:com.apple.Network-Settings.extension" - refocus_terminal -} - -ping_test() { - print_header - row "PING TEST" - empty_row - row "Target: 1.1.1.1" - empty_row - ping -c 4 1.1.1.1 - echo - print_footer - pause_enter -} - -show_dns_gateway() { - local gateway dns - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "DNS + GATEWAY" - empty_row - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -# ============================================================ -# Actions -# ============================================================ - -show_network_info() { - local wifi_ip eth_ip gateway dns - wifi_ip="$(ipconfig getifaddr en0 2>/dev/null || echo "-")" - eth_ip="$(ipconfig getifaddr en1 2>/dev/null || echo "-")" - gateway="$(route -n get default 2>/dev/null | awk '/gateway:/{print $2; exit}')" - dns="$(scutil --dns 2>/dev/null | awk '/nameserver\[[0-9]+\]/{print $3; exit}')" - - [[ -z "$gateway" ]] && gateway="-" - [[ -z "$dns" ]] && dns="-" - - print_header - row "NETWORK INFO" - empty_row - row "Wi-Fi (en0): $wifi_ip" - row "Ethernet (en1): $eth_ip" - row "Gateway: $gateway" - row "DNS: $dns" - print_footer - pause_enter -} - -lock_screen() { - if [[ -x "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" ]]; then - "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend - else - osascript -e 'tell application "System Events" to keystroke "q" using {control down, command down}' >/dev/null 2>&1 - fi -} - -sleep_display() { - pmset displaysleepnow -} - -restart_finder() { - killall Finder >/dev/null 2>&1 -} - -show_date_time() { - print_header - row "DATE AND TIME" - empty_row - row "$(date '+%A %Y-%m-%d')" - row "$(date '+%H:%M:%S')" - print_footer - pause_enter -} - -open_repo_browser() { - print_header - row "OPEN REPO IN BROWSER" - empty_row - row "Opening:" - row " $REPO_URL" - print_footer - open "$REPO_URL" - refocus_terminal -} - -open_terminal_guide() { - print_header - row "OPEN MAC TERMINAL GUIDE" - empty_row - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "Opening local guide:" - row " $TERMINAL_GUIDE_HTML" - print_footer - open "$TERMINAL_GUIDE_HTML" - else - row "Local guide missing, using GitHub:" - row " $TERMINAL_GUIDE_URL" - print_footer - open "$TERMINAL_GUIDE_URL" - fi - refocus_terminal -} - -system_check() { - local prompt_count="0" - local resolved_prompt_dir="" - local ai_status="" - local link_target="" - local active_cmd="" - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - ai_status="$(resolve_ai_status)" - - if [[ -n "$resolved_prompt_dir" ]]; then - prompt_count="$(find "$resolved_prompt_dir" -maxdepth 1 -type f 2>/dev/null | wc -l | tr -d ' ')" - fi - - if [[ -L "$BIN_LINK" ]]; then - link_target="$(readlink "$BIN_LINK" 2>/dev/null || true)" - fi - - active_cmd="$(command -v mqlaunch 2>/dev/null || true)" - - print_header - row "SYSTEM CHECK" - empty_row - - if [[ -d "$BASE_DIR" ]]; then - row "[OK] Base dir found" - else - row "[FAIL] Base dir missing" - fi - - if [[ -x "$MQ_SCRIPT" ]]; then - row "[OK] mqlaunch.sh executable" - elif [[ -e "$MQ_SCRIPT" ]]; then - row "[FAIL] mqlaunch.sh found but not executable" - else - row "[FAIL] mqlaunch.sh missing" - fi - - case "$ai_status" in - OK) - row "[OK] AI backend executable" - ;; - FOUND_NOT_EXECUTABLE) - row "[FAIL] AI backend found but not executable" - ;; - MISSING) - row "[FAIL] AI backend missing" - ;; - esac - - if [[ -n "$resolved_prompt_dir" ]]; then - row "[OK] Prompt dir found" - row " $resolved_prompt_dir" - else - row "[FAIL] Prompt dir missing" - fi - - if [[ -f "$TERMINAL_GUIDE_HTML" ]]; then - row "[OK] Terminal guide local file found" - else - row "[FAIL] Terminal guide local file missing" - fi - - if [[ -L "$BIN_LINK" ]]; then - if [[ "$link_target" == "$MQ_SCRIPT" ]]; then - row "[OK] ~/bin/mqlaunch symlink correct" - else - row "[FAIL] ~/bin/mqlaunch points elsewhere" - row " $link_target" - fi - elif [[ -e "$BIN_LINK" ]]; then - row "[FAIL] ~/bin/mqlaunch exists but is not a symlink" - else - row "[FAIL] ~/bin/mqlaunch missing" - fi - - if [[ -n "$active_cmd" ]]; then - row "[OK] mqlaunch command resolves" - row " $active_cmd" - else - row "[FAIL] mqlaunch command not found in PATH" - fi - - if command -v git >/dev/null 2>&1; then - row "[OK] git available" - else - row "[FAIL] git missing" - fi - - if command -v open >/dev/null 2>&1; then - row "[OK] open command available" - else - row "[FAIL] open command missing" - fi - - if command -v pbcopy >/dev/null 2>&1; then - row "[OK] pbcopy available" - else - row "[FAIL] pbcopy missing" - fi - - row "Prompt files: $prompt_count" - print_footer - pause_enter -} - -open_downloads_folder() { - open_folder_screen "OPEN DOWNLOADS FOLDER" "$HOME/Downloads" "Downloads folder missing:" -} - -open_home_folder() { - open_folder_screen "OPEN HOME FOLDER" "$HOME" "Home folder missing:" -} - -open_utilities_folder() { - open_folder_screen "OPEN UTILITIES FOLDER" "/Applications/Utilities" "Utilities folder missing:" -} - -open_applications_folder() { - open_folder_screen "OPEN APPLICATIONS FOLDER" "/Applications" "Applications folder missing:" -} - -open_ai_prompts_folder() { - local target="" - target="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "OPEN AI PROMPTS FOLDER" - empty_row - - if [[ -n "$target" ]]; then - row "Opening:" - row " $target" - print_footer - open "$target" - refocus_terminal - else - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - print_footer - pause_enter - fi -} - -show_prompt_files() { - local resolved_prompt_dir="" - local -a files - local f - local shown=0 - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - print_header - row "PROMPT FILES" - empty_row - - if [[ -z "$resolved_prompt_dir" ]]; then - row "Prompt dir missing." - row "Checked:" - row " $HOME/macos-scripts/ai-prompts" - row " $PROMPT_DIR" - else - files=("$resolved_prompt_dir"/*(.N)) - if (( ${#files[@]} == 0 )); then - row "No prompt files found." - row "Folder:" - row " $resolved_prompt_dir" - else - for f in "${files[@]}"; do - row " - ${f:t}" - ((shown++)) - if (( shown >= 20 && ${#files[@]} > 20 )); then - row " ..." - break - fi - done - empty_row - row "Total files: ${#files[@]}" - row "Folder: $resolved_prompt_dir" - fi - fi - - print_footer - pause_enter -} - -edit_mqlaunch() { - ${EDITOR:-nano} "$MQ_SCRIPT" -} - -backup_prompts() { - local resolved_prompt_dir="" - local stamp backup_file - - resolved_prompt_dir="$(resolve_prompt_dir 2>/dev/null || true)" - - if [[ -z "$resolved_prompt_dir" ]]; then - echo "${C_ERR}Prompt dir missing.${C_RESET}" - pause_enter - return - fi - - if ! command -v zip >/dev/null 2>&1; then - echo "${C_ERR}zip is missing on this system.${C_RESET}" - pause_enter - return - fi - - mkdir -p "$BACKUP_DIR" - stamp="$(date '+%Y%m%d-%H%M%S')" - backup_file="$BACKUP_DIR/ai-prompts-$stamp.zip" - - ( - cd "$(dirname "$resolved_prompt_dir")" || exit 1 - zip -rq "$backup_file" "$(basename "$resolved_prompt_dir")" - ) - - print_header - row "PROMPT BACKUP" - empty_row - - if [[ -f "$backup_file" ]]; then - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "Backup failed." - fi - - print_footer - pause_enter -} - -open_base_dir() { - open_folder_screen "OPEN MACOS-SCRIPTS FOLDER" "$BASE_DIR" "Base dir missing:" -} - -open_launcher_folder() { - open_folder_screen "OPEN LAUNCHER FOLDER" "$BASE_DIR/terminal/launchers" "Launcher folder missing:" -} - -open_tweaks_menu() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" menu -} - -show_tweaks_status() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" status -} - -run_tweaks_workstation() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" workstation -} - -run_tweaks_dev() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" dev -} - -run_tweaks_clean() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" clean -} - -run_tweaks_fast() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" fast -} - -run_tweaks_all() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" all -} - -revert_tweaks_latest() { - bash "$BASE_DIR/system/tweaks/macos-tweaks.sh" revert-latest -} - -backup_mqlaunch() { - local stamp backup_file - stamp="$(date '+%Y%m%d-%H%M%S')" - launcher_backup_dir="$BACKUP_DIR/launchers" - backup_file="$launcher_backup_dir/mqlaunch-$stamp.sh.bak" - - mkdir -p "$launcher_backup_dir" - - print_header - row "BACKUP MQLAUNCH" - empty_row - - if [[ -f "$MQ_SCRIPT" ]]; then - cp "$MQ_SCRIPT" "$backup_file" - chmod +x "$backup_file" 2>/dev/null || true - - row "Backup created successfully." - row "File:" - row " $backup_file" - else - row "mqlaunch.sh not found:" - row " $MQ_SCRIPT" - fi - - print_footer - pause_enter -} - -theme_cmd() { - local theme_script="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - local cmd="${1:-current}" - shift || true - - if [[ -x "$theme_script" ]]; then - bash "$theme_script" "$cmd" "$@" - elif [[ -f "$theme_script" ]]; then - chmod +x "$theme_script" 2>/dev/null || true - bash "$theme_script" "$cmd" "$@" - else - print_header - row "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $theme_script" - print_footer - pause_enter - return 1 - fi -} - -print_themes_menu() { - print_header - row "THEMES" - empty_row - - row2 " 1. Current theme" " 2. Apply amber" - row2 " 3. Apply green" " 4. Apply minimal" - row2 " 5. Apply ice" " 6. Reset theme" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select theme option [0-6]: ${C_RESET}" -} - -themes_menu_loop() { - local choice - - while true; do - clear - if [[ -f "$DASHBOARD_V71" ]]; then - bash "$DASHBOARD_V71" "MQLAUNCH" "Branded Neon Command Surface" "ONLINE" - echo - fi - print_themes_menu - read -r choice - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd reset ;; - 0) break ;; - *) echo "${C_ERR}Invalid theme selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -open_git_menu() { - local git_script="$BASE_DIR/terminal/menus/mq-git-menu.sh" - [[ -f "$git_script" ]] && bash "$git_script" || echo "Git menu not found." -} - -open_tools_menu() { - local tools_script="$BASE_DIR/terminal/menus/mq-tools-menu.sh" - - if [[ -x "$tools_script" ]]; then - bash "$tools_script" menu - elif [[ -f "$tools_script" ]]; then - chmod +x "$tools_script" 2>/dev/null || true - bash "$tools_script" menu - else - print_header - row "TOOLS MENU" - empty_row - row "Tools menu script missing:" - row " $tools_script" - print_footer - pause_enter - fi -} - -# ============================================================ -# Menus -# ============================================================ - -print_main_menu() { - print_header - row_bold "MAIN MENU" - empty_row - - row "APPS" - row3 " 1. Finder" " 2. Safari" " 3. Google Chrome" - row3 " 4. Spotify" " 5. Xcode" " 6. System Settings" - row3 " 7. Activity Monitor" "" "" - - empty_row - row "SYSTEM / CONTROL" - row3 " 8. Downloads folder" " 9. Home folder" "10. Show IP + network" - row3 "12. Lock screen" "13. Sleep display" "" - - empty_row - row "TOOLS" - row3 "14. Utilities folder" "15. Applications folder" "16. Restart Finder" - row3 "17. Show date and time" "18. Open repo in browser" "19. Run system check" - - empty_row - row "MENUS" - row3 "20. AI Modes" "21. Dev / Prompts" "22. Tweaks" - - print_main_footer - printf "${C_TITLE}Select option [1-10,12-22,X]: ${C_RESET}" -} - -print_ai_menu() { - print_header - row "AI MODES" - empty_row - - row2 " 1. Auto Mode" " 2. Atlas One" - row2 " 3. Atlas Router" " 4. Decision" - row2 " 5. Research" " 6. Root Cause" - row2 " 7. Problem Solving" " 8. Prompt Debugger" - row2 " 9. AI Menu" " 0. Back" - - print_footer - printf "${C_TITLE}Select AI mode [0-9]: ${C_RESET}" -} - -print_dev_menu() { - print_header - row "DEV / PROMPTS" - empty_row - - row2 " 1. Open AI Prompts folder" " 2. Show prompt files" - row2 " 3. Edit mqlaunch" " 4. Backup prompts" - row2 " 5. Backup mqlaunch" " 6. Open macos-scripts folder" - row2 " 7. Open launcher folder" " 8. Open mac terminal guide" - row2 " 9. Git Launch" "10. Net Launch" - row2 "11. Themes" "12. Tools Menu" - row2 " 0. Back" "" - - print_footer - printf "${C_TITLE}Select dev option [0-12]: ${C_RESET}" -} - -print_git_menu() { - print_header - row "GIT LAUNCH" - empty_row - - row2 " 1. Git status" " 2. Git pull" - row2 " 3. Git push" " 4. Open repo in browser" - row2 " 5. Open local repo folder" " 0. Back" - - print_footer - printf "${C_TITLE}Select git option [0-5]: ${C_RESET}" -} - -print_net_menu() { - print_header - row "NET LAUNCH" - empty_row - - row2 " 1. Show IP + network info" " 2. Ping test" - row2 " 3. Show DNS + gateway" " 4. Open Network Settings" - row2 " 5. Copy IP info to clipboard" " 0. Back" - - print_footer - printf "${C_TITLE}Select net option [0-5]: ${C_RESET}" -} - -ai_menu_loop() { - local choice - - while true; do - print_ai_menu - read -r choice - echo - - case "$choice" in - 1) safe_run_ai auto ;; - 2) safe_run_ai one ;; - 3) safe_run_ai atlas ;; - 4) safe_run_ai decide ;; - 5) safe_run_ai research ;; - 6) safe_run_ai root ;; - 7) safe_run_ai solve ;; - 8) safe_run_ai pdebug ;; - 9) safe_run_ai menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid AI selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -git_menu_loop() { - local choice - - while true; do - print_git_menu - read -r choice - echo - - case "$choice" in - 1) run_git_screen "GIT STATUS" "git status --short --branch" ;; - 2) run_git_screen "GIT PULL" "git pull" ;; - 3) run_git_screen "GIT PUSH" "git push" ;; - 4) open_repo_browser ;; - 5) open_base_dir ;; - 0) break ;; - *) echo "${C_ERR}Invalid git selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -net_menu_loop() { - local choice - - while true; do - print_net_menu - read -r choice - echo - - case "$choice" in - 1) show_network_info ;; - 2) ping_test ;; - 3) show_dns_gateway ;; - 4) open_network_settings ;; - 5) copy_network_info ;; - 0) break ;; - *) echo "${C_ERR}Invalid net selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -dev_menu_loop() { - local choice - - while true; do - print_dev_menu - read -r choice - echo - - case "$choice" in - 1) open_ai_prompts_folder ;; - 2) show_prompt_files ;; - 3) edit_mqlaunch ;; - 4) backup_prompts ;; - 5) backup_mqlaunch ;; - 6) open_base_dir ;; - 7) open_launcher_folder ;; - 8) open_terminal_guide ;; - 9) open_git_menu ;; - 10) net_menu_loop ;; - 11) themes_menu_loop ;; - 12) open_tools_menu ;; - 0) break ;; - *) echo "${C_ERR}Invalid dev selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -main_loop() { - local choice - - while true; do - print_main_menu - read -r choice - echo - - case "$choice" in - 1) open_app "Finder" ;; - 2) open_app "Safari" ;; - 3) open_app "Google Chrome" ;; - 4) open_app "Spotify" ;; - 5) open_app "Xcode" ;; - 6) open_app "System Settings" ;; - 7) open_app "Activity Monitor" ;; - 8) open_downloads_folder ;; - 9) open_home_folder ;; - 10) show_network_info ;; - x|X) echo "Exiting ${APP_TITLE}..."; exit 0 ;; - 12) lock_screen ;; - 13) sleep_display ;; - 14) open_utilities_folder ;; - 15) open_applications_folder ;; - 16) restart_finder ;; - 17) show_date_time ;; - 18) open_repo_browser ;; - 19) system_check ;; - 20) ai_menu_loop ;; - 21) dev_menu_loop ;; - 22) open_tweaks_menu ;; - *) echo "${C_ERR}Invalid selection:${C_RESET} $choice"; pause_enter ;; - esac - done -} - -show_help() { - cat </dev/null || true - printf '%b\n' "$PURPLE" - cat <<'BANNER' - ██████╗ ██╗ ██╗███████╗██████╗ ███████╗███████╗███████╗██████╗ - ██╔══██╗██║ ██║██╔════╝██╔══██╗██╔════╝██╔════╝██╔════╝██╔══██╗ - ██║ ██║██║ ██║█████╗ ██████╔╝███████╗█████╗ █████╗ ██████╔╝ - ██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗╚════██║██╔══╝ ██╔══╝ ██╔══██╗ - ██████╔╝ ╚████╔╝ ███████╗██║ ██║███████║███████╗███████╗██║ ██║ - ╚═════╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝ -BANNER - printf ' -- SYSTEM PROCESS INTERROGATOR v1.1 --%b\n\n' "$NC" -} - -process_name() { - local pid="$1" - local comm - comm="$(ps -p "$pid" -o comm= 2>/dev/null || true)" - basename "${comm:-unknown}" -} - -process_exists() { - local pid="$1" - ps -p "$pid" >/dev/null 2>&1 -} - -list_processes() { - local rows count app_name - - printf '%b%-7s %-20s %-10s %-10s %-10s%b\n' \ - "$CYAN" "PID" "PROCESS NAME" "CPU%" "MEM%" "STATUS" "$NC" - printf '%s\n' "----------------------------------------------------------------------" - - if ! rows="$(ps -Ao pid=,pcpu=,pmem=,state=,comm= 2>/dev/null | sort -k2 -nr -k3 -nr)"; then - printf '%b[ERROR] Unable to read process list.%b\n' "$RED" "$NC" >&2 - return 1 - fi - - count=0 - while read -r pid cpu mem state comm; do - [[ -n "${pid:-}" ]] || continue - (( count++ )) - (( count <= 10 )) || break - app_name="$(basename "${comm:-unknown}")" - printf '%-7s %-20s %-10s %-10s %-10s\n' \ - "$pid" "${app_name:0:19}" "${cpu}%" "${mem}%" "$state" - done <<< "$rows" -} - -is_safe_pid() { - local pid="$1" - - [[ "$pid" =~ ^[0-9]+$ ]] || return 1 - (( pid > 1 )) || return 1 - (( pid != $$ )) || return 1 -} - -terminate_process() { - local pid="$1" - local name="$2" - local confirm force_confirm - - printf '%b[!] TARGET ACQUIRED:%b %s (%s)\n' "$RED" "$NC" "$name" "$pid" - read -r -p "Send TERM to this process? [y/N]: " confirm - - [[ "$confirm" =~ ^[Yy]$ ]] || { - printf 'Target spared.\n' - return 0 - } - - kill -TERM "$pid" - sleep 1 - - if ! process_exists "$pid"; then - printf '%b[+] PROCESS %s TERMINATED.%b\n' "$PURPLE" "$pid" "$NC" - return 0 - fi - - printf '%b[!] PROCESS STILL RUNNING.%b\n' "$YELLOW" "$NC" - read -r -p "Force kill with KILL? [y/N]: " force_confirm - - [[ "$force_confirm" =~ ^[Yy]$ ]] || { - printf 'Force kill skipped.\n' - return 0 - } - - kill -KILL "$pid" - sleep 0.2 - printf '%b[+] PROCESS %s FORCE KILLED.%b\n' "$PURPLE" "$pid" "$NC" -} - -main() { - local target_pid name - - print_header - list_processes || return 1 - - printf '\n%b[?] ENTER PID TO TERMINATE OR q TO ABORT:%b\n' "$YELLOW" "$NC" - read -r -p "OVERSEER > " target_pid - - case "$target_pid" in - q|Q|'') - printf 'Exiting Overseer...\n' - return 0 - ;; - esac - - if ! is_safe_pid "$target_pid"; then - printf '%b[ERROR] Invalid or protected PID: %s%b\n' "$RED" "$target_pid" "$NC" - return 1 - fi - - if ! process_exists "$target_pid"; then - printf '%b[ERROR] PID %s NOT FOUND.%b\n' "$RED" "$target_pid" "$NC" - return 1 - fi - - name="$(process_name "$target_pid")" - terminate_process "$target_pid" "$name" -} - -main "$@" diff --git a/backups/scripts/20260509-030842/tools/scripts/scan.sh b/backups/scripts/20260509-030842/tools/scripts/scan.sh deleted file mode 100755 index c734443..0000000 --- a/backups/scripts/20260509-030842/tools/scripts/scan.sh +++ /dev/null @@ -1,763 +0,0 @@ -#!/usr/bin/env bash - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" - -source "$BASE_DIR/tools/cli/mq-ui.sh" - -# ================================================== -# FUNCTIONS -# ================================================== - -# Function: Implements the `suggest_fallback` shell routine. -suggest_fallback() { - echo - echo "Suggested actions:" - echo "- Close heavy apps" - echo "- Restart session" -} - -# Function: Implements the `insight_v2` shell routine. -insight_v2() { - echo - echo "Analysis:" - ps -Ao pcpu,comm | sort -nr | awk 'NR>1 && NR<=4 {print "- " $2}' -} - -# Function: Implements the `memory_insight` shell routine. -memory_insight() { - echo - section "MEMORY (Top consumers)" - - ps -Ao pid,pmem,rss,comm \ - | sort -k2 -nr \ - | head -n 6 \ - | awk ' - NR==1 {printf "%-8s %-6s %-10s %s\n", "PID", "MEM%", "RSS(MB)", "PROCESS"} - NR>1 {n=split($4,a,"/"); printf "%-8s %-6s %-10.1f %s\n", $1, $2, $3/1024, a[n]} - ' -} - -# Function: Implements the `memory_pressure_v4` shell routine. -memory_pressure_v4() { - read AVAILABLE_MB COMPRESSED_MB PAGEOUTS <<< \ - $(vm_stat | awk ' - NR==1 { - page_size=$8 - gsub(/[^0-9]/, "", page_size) - } - /Pages free:/ {free=$3} - /Pages speculative:/ {speculative=$3} - /Pages purgeable:/ {purgeable=$3} - /Pages occupied by compressor:/ {compressor=$5} - /Pageouts:/ {pageouts=$2} - END { - gsub(/\./, "", free) - gsub(/\./, "", speculative) - gsub(/\./, "", purgeable) - gsub(/\./, "", compressor) - gsub(/\./, "", pageouts) - - available=(free + speculative + purgeable) * page_size / 1024 / 1024 - compressed=compressor * page_size / 1024 / 1024 - - printf "%.0f %.0f %d\n", available, compressed, pageouts - } - ') - - if [ -z "$AVAILABLE_MB" ] || [ -z "$COMPRESSED_MB" ]; then - MQ_MEM_SCORE=20 - MEM_STATUS="UNKNOWN" - warn "Memory: unable to read vm_stat" - return - fi - - if [ "$COMPRESSED_MB" -lt 1024 ]; then - MQ_MEM_SCORE=10 - MEM_STATUS="OK" - ok "Memory OK: ${AVAILABLE_MB} MB available, ${COMPRESSED_MB} MB compressed" - elif [ "$COMPRESSED_MB" -lt 3000 ]; then - MQ_MEM_SCORE=20 - MEM_STATUS="PRESSURE" - warn "Memory PRESSURE: ${AVAILABLE_MB} MB available, ${COMPRESSED_MB} MB compressed" - else - MQ_MEM_SCORE=30 - MEM_STATUS="CRITICAL" - err "Memory CRITICAL: ${AVAILABLE_MB} MB available, ${COMPRESSED_MB} MB compressed" - fi -} - -# Function: Implements the `combined_insight_v2` shell routine. -combined_insight_v2() { - echo - section "COMBINED INSIGHT" - - read CPU_PID CPU CPU_NAME <<< \ - $(ps -Ao pid,pcpu,comm | sort -k2 -nr | awk 'NR==2 {print $1, $2, $3}') - CPU_NAME=$(basename "$CPU_NAME") - - read MEM_PID MEM MEM_RSS MEM_NAME <<< \ - $(ps -Ao pid,pmem,rss,comm | sort -k2 -nr | awk 'NR==2 {print $1, $2, $3, $4}') - MEM_NAME=$(basename "$MEM_NAME") - - echo "Top CPU: $CPU_NAME ($CPU%)" - echo "Top Memory: $MEM_NAME ($(awk "BEGIN {print $MEM_RSS/1024}") MB)" -} - -# Function: Implements the `severity_score` shell routine. -severity_score() { - echo - section "HEALTH SCORE" - - CORES=$(sysctl -n hw.ncpu) - LOAD=$(uptime | awk -F'load averages:' '{print $2}' | awk '{print $1}' | tr ',' '.') - CPU_LOAD="$LOAD" - - CPU_RATIO=$(echo "$LOAD / $CORES" | bc -l 2>/dev/null) - [ -z "$CPU_RATIO" ] && CPU_RATIO=0 - - if (( $(echo "$CPU_RATIO < 0.7" | bc -l) )); then - CPU_SCORE=10 - elif (( $(echo "$CPU_RATIO < 1.2" | bc -l) )); then - CPU_SCORE=20 - else - CPU_SCORE=30 - fi - - MEM_SCORE=${MQ_MEM_SCORE:-20} - DISK_SCORE=5 - - SCORE=$((100 - CPU_SCORE - MEM_SCORE - DISK_SCORE)) - HEALTH_SCORE="$SCORE" - - if [ "$SCORE" -gt 80 ]; then - STATUS="HEALTHY" - elif [ "$SCORE" -gt 60 ]; then - STATUS="MODERATE" - else - STATUS="CRITICAL" - fi - - echo "Score: $SCORE / 100" - echo "Status: $STATUS" -} - -# Function: Implements the `no_action_mode` shell routine. -no_action_mode() { - [ -n "$HEALTH_SCORE" ] || return 1 - [ -n "$MEM_STATUS" ] || return 1 - [ -n "$CPU_LOAD" ] || return 1 - - CPU_LOW=$(awk "BEGIN {print ($CPU_LOAD < 4) ? 1 : 0}") - - if [ "$HEALTH_SCORE" -ge 70 ] && [ "$MEM_STATUS" = "OK" ] && [ "$CPU_LOW" -eq 1 ]; then - echo - section "SYSTEM STATUS" - - echo "Healthy - no action required" - echo - - if [ -n "$ROOT_CAUSE_NAME" ]; then - echo "Note:" - echo "- $ROOT_CAUSE_NAME is the primary load (normal usage)" - fi - - return 0 - fi - - return 1 -} - -# Function: Implements the `suggest_kill` shell routine. -suggest_kill() { - read PID CPU NAME <<< \ - $(ps -Ao pid,pcpu,comm | sort -k2 -nr | awk 'NR==2 {print $1, $2, $3}') - NAME=$(basename "$NAME") - - echo - echo "Top offender:" - echo "PID: $PID | CPU: $CPU | PROCESS: $NAME" - - case "$NAME" in - *"/System/"*|*"coreaudiod"*|*"WindowServer"*) - echo "⚠ Protected system process" - suggest_fallback - return - ;; - esac - - read -p "Kill this process? [y/N]: " choice - [[ "$choice" == "y" ]] && kill -15 "$PID" && echo "✔ killed" -} - -# Function: Implements the `smart_kill` shell routine. -smart_kill() { - read PID CPU NAME <<< \ - $(ps -Ao pid,pcpu,comm | sort -k2 -nr | awk 'NR==2 {print $1, $2, $3}') - NAME=$(basename "$NAME") - CPU_INT=${CPU%%[.,]*} - - if [ "$CPU_INT" -lt 15 ]; then - return - fi - - case "$NAME" in - *"/System/"*|*"coreaudiod"*|*"WindowServer"*) - return - ;; - esac - - echo - echo "Smart suggestion:" - echo "$NAME ($CPU%)" - - read -p "Kill recommended [y/N]: " choice - [[ "$choice" == "y" ]] && kill -15 "$PID" && echo "✔ killed" -} - -# Function: Implements the `track_offender` shell routine. -track_offender() { - LOG="$HOME/.mq/offenders.log" - mkdir -p "$HOME/.mq" - - read PID CPU NAME <<< \ - $(ps -Ao pid,pcpu,comm | sort -k2 -nr | awk 'NR==2 {print $1, $2, $3}') - NAME=$(basename "$NAME") - - echo "$NAME" >> "$LOG" - - COUNT=$(grep -c "$NAME" "$LOG" 2>/dev/null) - - # limit log size - tail -n 50 "$LOG" > "$LOG.tmp" && mv "$LOG.tmp" "$LOG" - - # only escalate if non-system - case "$NAME" in - *"/System/"*|*"coreaudiod"*|*"WindowServer"*) - return - ;; - esac - - if [ "$COUNT" -ge 3 ]; then - echo - echo "Repeat offender detected:" - echo "$NAME seen $COUNT times" - - echo - echo "Escalation:" - echo "- Consistent CPU usage" - - echo - read -p "Kill strongly recommended [y/N]: " choice - - case "$choice" in - y|Y) - kill -15 "$PID" && echo "✔ killed" - ;; - *) - echo "Skipped" - ;; - esac - fi -} - -# Function: Implements the `score_offenders` shell routine. -score_offenders() { - echo - section "OFFENDER RANKING" - - LOG="$HOME/.mq/offenders.log" - mkdir -p "$HOME/.mq" - - ps -Ao pid,pcpu,pmem,comm \ - | sort -k2 -nr \ - | head -n 6 \ - | awk 'NR>1 {print $1, $2, $3, $4}' | while read PID CPU MEM NAME - do - case "$NAME" in - *"/System/"*|*"coreaudiod"*|*"WindowServer"*) - continue - ;; - esac - NAME=$(basename "$NAME") - CPU_INT=${CPU%%[.,]*} - MEM_INT=${MEM%%[.,]*} - - # repeat count - COUNT=$(recent_count "$NAME") - - SCORE=$((CPU_INT * 5 + MEM_INT * 3 + COUNT * 2)) - - printf "%-20s score: %s\n" "$NAME" "$SCORE" - done | sort -k3 -nr - - echo -} - -# Function: Implements the `top_weighted_action` shell routine. -top_weighted_action() { - read PID CPU MEM NAME <<< \ - $(ps -Ao pid,pcpu,pmem,comm \ - | sort -k2 -nr \ - | awk 'NR==2 {print $1, $2, $3, $4}') - NAME=$(basename "$NAME") - CPU_INT=${CPU%%[.,]*} - - case "$NAME" in - *"/System/"*|*"coreaudiod"*|*"WindowServer"*) - return - ;; - esac - - if [ "$CPU_INT" -lt 15 ]; then - return - fi - - echo "Top offender (weighted):" - echo "$NAME → Kill recommended" - - read -p "[y/N]: " choice - [[ "$choice" == "y" ]] && kill -15 "$PID" && echo "✔ killed" -} - -# ---------------------------- -# DECAY MODEL v1 -# ---------------------------- - -# Function: Implements the `track_offender_decay` shell routine. -track_offender_decay() { - LOG="$HOME/.mq/offenders.log" - mkdir -p "$HOME/.mq" - - read PID CPU NAME <<< \ - $(ps -Ao pid,pcpu,comm | sort -k2 -nr | awk 'NR==2 {print $1, $2, $3}') - - NOW=$(date +%s) - - echo "$NOW|$NAME" >> "$LOG" - - # Keep the latest 100 rows. - tail -n 100 "$LOG" > "$LOG.tmp" && mv "$LOG.tmp" "$LOG" -} - -# Function: Implements the `recent_count` shell routine. -recent_count() { - LOG="$HOME/.mq/offenders.log" - NOW=$(date +%s) - TARGET="$1" - - COUNT=0 - [ -f "$LOG" ] || { echo "$COUNT"; return; } - - while IFS='|' read TS PROC; do - [[ "$TS" =~ ^[0-9]+$ ]] || continue - - AGE=$((NOW - TS)) - - if [ "$AGE" -lt 300 ]; then # 5 minutes - if [[ "$(basename "$PROC")" == "$TARGET" ]]; then - COUNT=$((COUNT + 1)) - fi - fi - done < "$LOG" - - echo "$COUNT" -} - -# ---------------------------- -# MEMORY-WEIGHTED SCORING v3 -# ---------------------------- - -# Function: Implements the `score_offenders_v3` shell routine. -score_offenders_v3() { - echo - section "OFFENDER RANKING (v3)" - - LOG="$HOME/.mq/offenders.log" - mkdir -p "$HOME/.mq" - - ps -Ao pid,pcpu,pmem,rss,comm \ - | sort -k2 -nr \ - | head -n 8 \ - | awk 'NR>1 {print $1, $2, $3, $4, $5}' \ - | while read PID CPU MEM RSS NAME - do - CPU_INT=${CPU%%[.,]*} - MEM_MB=$(awk "BEGIN {printf \"%.0f\", $RSS/1024}") - - # Recent count when decay data exists. - if command -v recent_count >/dev/null 2>&1; then - COUNT=$(recent_count "$(basename "$NAME")") - else - COUNT=$(grep -c "$NAME" "$LOG" 2>/dev/null) - fi - - # score: memory-heavy - SCORE=$(awk "BEGIN { - print ($MEM_MB * 0.08) + ($CPU_INT * 2) + ($COUNT * 3) - }") - - printf "%-18s score: %-6.1f (mem: %4s MB cpu: %2s%% seen: %s)\n" \ - "$(basename "$NAME")" "$SCORE" "$MEM_MB" "$CPU_INT" "$COUNT" - done | sort -k3 -nr - - echo -} - -# Function: Implements the `top_weighted_action_v3` shell routine. -top_weighted_action_v3() { - # Select the highest score from the same calculation. - TOP_LINE=$(ps -Ao pid,pcpu,pmem,rss,comm \ - | sort -k2 -nr \ - | head -n 8 \ - | awk 'NR>1 {print $0}' \ - | while read PID CPU MEM RSS NAME - do - CPU_INT=${CPU%%[.,]*} - MEM_MB=$(awk "BEGIN {printf \"%.0f\", $RSS/1024}") - - if command -v recent_count >/dev/null 2>&1; then - COUNT=$(recent_count "$(basename "$NAME")") - else - COUNT=0 - fi - - SCORE=$(awk "BEGIN { - print ($MEM_MB * 0.08) + ($CPU_INT * 2) + ($COUNT * 3) - }") - - echo "$SCORE|$PID|$CPU|$NAME" - done | sort -t'|' -k1 -nr | head -n1) - - SCORE=$(echo "$TOP_LINE" | cut -d'|' -f1) - PID=$(echo "$TOP_LINE" | cut -d'|' -f2) - CPU=$(echo "$TOP_LINE" | cut -d'|' -f3) - NAME=$(echo "$TOP_LINE" | cut -d'|' -f4) - - # skydda systemprocesser - case "$NAME" in - *"/System/"*|*"coreaudiod"*|*"WindowServer"*) - return - ;; - esac - - CPU_INT=${CPU%%[.,]*} - - # Act only when there is real impact. - if [ "$CPU_INT" -lt 10 ]; then - return - fi - - echo "Top offender (weighted v3):" - printf "%s (score %.1f)\n" "$(basename "$NAME")" "$SCORE" - - read -p "Kill recommended [y/N]: " choice - [[ "$choice" == "y" ]] && kill -15 "$PID" && echo "✔ killed" -} - -# ---------------------------- -# AUDIO FILTERING v2 -# ---------------------------- - -# Function: Implements the `audio_insight` shell routine. -audio_insight() { - # Trigger only when coreaudiod appears high in the process list. - if ! ps -Ao pcpu,comm | sort -nr | head -n 5 | grep -qi coreaudiod; then - return - fi - - echo - section "AUDIO INSIGHT" - - echo "coreaudiod active" - - # Skip noisy output when no likely candidates are found. - CANDIDATES=$(ps -Ao comm | grep -E "ChatGPT|Chrome|Safari|Spotify|Music|VLC|zoom|Teams|Discord" | wc -l) - if [ "$CANDIDATES" -eq 0 ]; then - echo "No clear audio source detected" - return - fi - - echo - echo "Likely audio sources:" - - # Allowlist apps that commonly use audio. - ps -Ao pid,pcpu,rss,comm \ - | sort -k2 -nr \ - | head -n 20 \ - | awk ' - NR>1 { - name=$4 - - # Normalize to basename. - n=name - sub(".*/","",n) - - # Allowlist, extend when needed. - if (n ~ /(ChatGPT|Chrome|Safari|Firefox|Spotify|Music|QuickTime|VLC|zoom|Teams|Discord|Slack)/) { - printf "%-18s cpu:%-5s mem:%5.0fMB\n", n, $2, $3/1024 - } - } - ' \ - | sort -u - - echo - echo "Recommendation:" - echo "- Close tabs/apps playing audio" - echo "- Check browser (video/music)" - echo "- Restart audio if glitching: sudo killall coreaudiod" -} - -# ---------------------------- -# GUI-AWARE INSIGHT v1 -# ---------------------------- - -# Function: Implements the `gui_insight` shell routine. -gui_insight() { - # Trigger only when WindowServer is a top CPU process. - if ! ps -Ao pcpu,comm | sort -nr | head -n 5 | grep -qi WindowServer; then - return - fi - - echo - section "GUI INSIGHT" - - echo "WindowServer active" - echo - - echo "Likely GUI-heavy apps:" - - ps -Ao pid,pcpu,rss,comm \ - | sort -k3 -nr \ - | head -n 15 \ - | awk ' - NR>1 { - name=$4 - - # Remove path and keep only the app name. - n=name - sub(".*/","",n) - - # Filter to relevant app processes. - if (n ~ /(Visual|Code|Chrome|Safari|Firefox|ChatGPT|Slack|Discord|Electron)/) { - printf "%-18s cpu:%-5s mem:%5.0fMB\n", n, $2, $3/1024 - } - } - ' | sort -u - - echo - echo "Reason:" - echo "- High memory usage drives rendering" - echo "- WindowServer reflects UI load" -} - -# ---------------------------- -# ROOT CAUSE ENGINE v1 -# ---------------------------- - -# Function: Implements the `root_cause_engine` shell routine. -root_cause_engine() { - echo - section "ROOT CAUSE" - - TMP="$HOME/.mq/rc.tmp" - mkdir -p "$HOME/.mq" - : > "$TMP" - - # Aggregera per app: max RSS, top 3 RSS, max CPU, antal processer - ps -Ao pid,pcpu,rss,comm \ - | awk ' - NR>1 { - full_cmd=$0 - sub(/^[[:space:]]*[0-9]+[[:space:]]+[0-9.]+[[:space:]]+[0-9]+[[:space:]]+/, "", full_cmd) - - cmd=full_cmd - gsub(".*/","",cmd) - - # -------- NORMALIZATION -------- - if (full_cmd ~ /ChatGPT/) cmd="ChatGPT" - else if (full_cmd ~ /Electron/) cmd="Electron" - else if (full_cmd ~ /Google/) cmd="Google" - else if (full_cmd ~ /Chrome/) cmd="Chrome" - else if (full_cmd ~ /Code|Visual Studio Code/) cmd="Visual" - - cpu=($2+0) - rss_mb=($3/1024) - - # ChatGPT Atlas renderers can report inflated shared RSS. - # Keep them from dominating app-impact scoring over heavier local apps. - if (full_cmd ~ /ChatGPT Atlas.*\(Renderer\)/ && rss_mb > 120) rss_mb=120 - - if (rss_mb > top1[cmd]) { - top3[cmd]=top2[cmd] - top2[cmd]=top1[cmd] - top1[cmd]=rss_mb - } else if (rss_mb > top2[cmd]) { - top3[cmd]=top2[cmd] - top2[cmd]=rss_mb - } else if (rss_mb > top3[cmd]) { - top3[cmd]=rss_mb - } - - if (rss_mb > max_mem[cmd]) max_mem[cmd]=rss_mb - if (cpu > max_cpu[cmd]) max_cpu[cmd]=cpu - count[cmd]++ - } - END { - for (k in count) { - top3_sum=top1[k] + top2[k] + top3[k] - if (top3_sum > 1500) top3_sum=1500 - - printf "%s|%.0f|%.0f|%.0f|%d\n", k, max_mem[k], top3_sum, max_cpu[k], count[k] - } - } - ' > "$TMP" - - # Select the top candidate after filtering system and symptom processes. - TOP_LINE=$(awk -F'|' ' - { - name=$1; max_mem=$2+0; top3_mem=$3+0; cpu=$4+0; cnt=$5+0 - - # Filter symptom and system processes. - if (name ~ /(WindowServer|coreaudiod|trustd|syspolicyd|kernel|launchd|loginwindow)/) next - - # impact scoring v4: max process + top 3 processes + CPU - score = (max_mem * 0.6) + (top3_mem * 0.3) + (cpu * 0.1) - - printf "%f|%s|%d|%d|%d|%d\n", score, name, max_mem, top3_mem, cpu, cnt - } - ' "$TMP" | sort -t'|' -k1 -nr | head -n1) - - if [ -z "$TOP_LINE" ]; then - echo "No clear root cause detected" - return - fi - - SCORE=$(echo "$TOP_LINE" | cut -d'|' -f1) - NAME=$(echo "$TOP_LINE" | cut -d'|' -f2) - ROOT_CAUSE_NAME="$NAME" - MAX_MEM=$(echo "$TOP_LINE" | cut -d'|' -f3) - TOP3_MEM=$(echo "$TOP_LINE" | cut -d'|' -f4) - ROOT_MEM_TOP3="$TOP3_MEM" - CPU=$(echo "$TOP_LINE" | cut -d'|' -f5) - CNT=$(echo "$TOP_LINE" | cut -d'|' -f6) - - # Confidence heuristik - CONF="MEDIUM" - if [ "$MAX_MEM" -gt 450 ]; then CONF="HIGH"; fi - if [ "$TOP3_MEM" -gt 1000 ]; then CONF="HIGH"; fi - if [ "$CPU" -gt 20 ]; then CONF="HIGH"; fi - INST=$( [ "$CNT" -gt 5 ] && echo "5+" || echo "$CNT" ) - - echo "$NAME" - echo - echo "Confidence: $CONF" - echo - echo "Reason:" - echo "- Max process memory: ${MAX_MEM} MB" - echo "- Top 3 memory: ${TOP3_MEM} MB" - echo "- Peak CPU: ${CPU}%" - echo "- Instances: $INST" - - no_action_mode && return - - echo - echo "Recommended action:" - echo "- Close or restart $NAME" -} - -# Function: Implements the `trend_engine_v1` shell routine. -trend_engine_v1() { - [ -n "$ROOT_CAUSE_NAME" ] || return - [ -n "$ROOT_MEM_TOP3" ] || return - - echo - section "TREND" - - LOG="$HOME/.mq/trend.log" - mkdir -p "$HOME/.mq" - - NOW=$(date +%s) - echo "$NOW|$ROOT_CAUSE_NAME|$ROOT_MEM_TOP3" >> "$LOG" - tail -n 50 "$LOG" > "$LOG.tmp" && mv "$LOG.tmp" "$LOG" - - LAST=$(tail -n 5 "$LOG") - - if [ "$(echo "$LAST" | wc -l | tr -d ' ')" -lt 3 ]; then - echo "Not enough data yet" - return - fi - - APP_HISTORY=$(echo "$LAST" | awk -F'|' -v app="$ROOT_CAUSE_NAME" '$2 == app') - - if [ "$(echo "$APP_HISTORY" | sed '/^$/d' | wc -l | tr -d ' ')" -lt 2 ]; then - echo "$ROOT_CAUSE_NAME stable" - echo - echo "Pattern:" - echo "- New primary load; collecting trend data" - return - fi - - PREV_MEM=$(echo "$APP_HISTORY" | head -n 1 | cut -d'|' -f3) - CURR_MEM=$(echo "$APP_HISTORY" | tail -n 1 | cut -d'|' -f3) - DIFF=$((CURR_MEM - PREV_MEM)) - - if [ "$DIFF" -gt 200 ]; then - echo "$ROOT_CAUSE_NAME increasing load" - PATTERN="Rising memory usage detected" - elif [ "$DIFF" -lt -200 ]; then - echo "$ROOT_CAUSE_NAME decreasing load" - PATTERN="Memory usage is easing" - else - echo "$ROOT_CAUSE_NAME stable" - PATTERN="Load is stable" - fi - - echo - echo "Memory change: ${DIFF} MB" - echo - echo "Pattern:" - echo "- $PATTERN" -} - -# ================================================== -# MAIN -# ================================================== - -header "MQ SCAN" - -track_offender_decay - -section "SYSTEM" -ok "CPU: $(uptime | awk -F'load averages:' '{print $2}')" - -section "MEMORY" -memory_pressure_v4 - -section "STORAGE" -ok "Disk: $(df -h / | awk 'NR==2 {print $5}')" - -section "TOP PROCESSES" - -ps -Ao pid,pcpu,comm \ - | sort -k2 -nr \ - | head -n 6 \ - | awk ' - NR==1 {printf "%-8s %-6s %s\n", "PID", "CPU%", "PROCESS"} - NR>1 {n=split($3,a,"/"); printf "%-8s %-6s %s\n", $1, $2, a[n]} - ' - -suggest_kill -smart_kill -track_offender -memory_insight -score_offenders_v3 -top_weighted_action_v3 -combined_insight_v2 -audio_insight -gui_insight -severity_score -root_cause_engine -trend_engine_v1 - -section "SUMMARY" -ok "Scan complete" diff --git a/backups/scripts/20260509-030842/tools/scripts/test-mqlaunch-v1.sh b/backups/scripts/20260509-030842/tools/scripts/test-mqlaunch-v1.sh deleted file mode 100755 index 1baecdf..0000000 --- a/backups/scripts/20260509-030842/tools/scripts/test-mqlaunch-v1.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -PROJECT_ROOT="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -V1_ROOT="$PROJECT_ROOT/terminal/mqlaunch-v1" -V1="$V1_ROOT/mqlaunch.sh" -UI="$V1_ROOT/lib/ui.sh" -ROUTER="$V1_ROOT/lib/router.sh" -PERF="$V1_ROOT/commands/performance.sh" -DEV="$V1_ROOT/commands/dev.sh" -TOOLS="$V1_ROOT/commands/tools.sh" - -pass() { - echo "[PASS] $1" -} - -fail() { - echo "[FAIL] $1" - exit 1 -} - -assert_file() { - local path="$1" - local label="$2" - [[ -f "$path" ]] || fail "$label missing: $path" - pass "$label exists" -} - -assert_grep() { - local pattern="$1" - local file="$2" - local label="$3" - grep -qE "$pattern" "$file" || fail "$label" - pass "$label" -} - -assert_cmd_ok() { - local label="$1" - shift - "$@" >/dev/null 2>&1 || fail "$label" - pass "$label" -} - -assert_file "$V1" "V1 launcher" -assert_file "$UI" "Shared UI helper" -assert_file "$ROUTER" "Router" -assert_file "$PERF" "Performance command file" -assert_file "$DEV" "Dev command file" -assert_file "$TOOLS" "Tools command file" - -assert_cmd_ok "V1 help works" bash "$V1" help - -assert_grep 'print_kv\(\)' "$UI" "Shared print_kv helper exists" -assert_grep 'print_warning_block\(\)' "$UI" "Shared warning helper exists" - -assert_grep 'print_kv ' "$PERF" "Performance uses shared print_kv" -assert_grep 'print_warning_block|surface_row "WARNINGS"' "$PERF" "Performance renders warning block" -assert_grep 'print_kv ' "$DEV" "Dev uses shared print_kv" -assert_grep 'print_kv ' "$TOOLS" "Tools uses shared print_kv" - -assert_grep 'performance\|perf' "$ROUTER" "Router contains performance route" -assert_grep 'dev\|git\|dev-v1' "$ROUTER" "Router contains dev route" -assert_grep 'tools\|tools-v1\|menu-tools-v1' "$ROUTER" "Router contains tools route" -assert_grep 'help\|-h\|--help' "$ROUTER" "Router contains help route" - -echo -echo "All v1 checks passed." diff --git a/backups/scripts/20260509-030842/tools/scripts/test-mqlaunch.sh b/backups/scripts/20260509-030842/tools/scripts/test-mqlaunch.sh deleted file mode 100755 index 826d326..0000000 --- a/backups/scripts/20260509-030842/tools/scripts/test-mqlaunch.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env zsh -set -euo pipefail - -PROJECT_ROOT="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -LEGACY="$PROJECT_ROOT/terminal/launchers/mqlaunch.sh" -V1="$PROJECT_ROOT/terminal/mqlaunch-v1/mqlaunch.sh" -TOOLS_BRIDGE="$PROJECT_ROOT/terminal/bridges/tools-bridge.sh" -DEV_BRIDGE="$PROJECT_ROOT/terminal/bridges/dev-bridge.sh" -PERF_BRIDGE="$PROJECT_ROOT/terminal/bridges/performance-bridge.sh" -RELEASE_SCRIPT="$PROJECT_ROOT/release.sh" -RELEASE_MENU="$PROJECT_ROOT/terminal/menus/mq-release-menu.sh" - -pass() { - echo "[PASS] $1" -} - -fail() { - echo "[FAIL] $1" - exit 1 -} - -assert_file() { - local path="$1" - local label="$2" - [[ -f "$path" ]] || fail "$label missing: $path" - pass "$label exists" -} - -assert_grep() { - local pattern="$1" - local file="$2" - local label="$3" - grep -qE "$pattern" "$file" || fail "$label" - pass "$label" -} - -assert_cmd_ok() { - local label="$1" - shift - "$@" >/dev/null 2>&1 || fail "$label" - pass "$label" -} - -assert_file "$LEGACY" "Legacy launcher" -assert_file "$V1" "V1 launcher" -assert_file "$TOOLS_BRIDGE" "Tools bridge" -assert_file "$DEV_BRIDGE" "Dev bridge" -assert_file "$PERF_BRIDGE" "Performance bridge" -assert_file "$RELEASE_SCRIPT" "Release script" - -assert_cmd_ok "Legacy launcher help works" zsh "$LEGACY" help -assert_cmd_ok "V1 launcher help works" bash "$V1" help - -assert_grep 'perf\|performance\).*open_performance_menu' "$LEGACY" "Performance route exists in launcher" -assert_grep 'dev\).*open_dev_menu' "$LEGACY" "Dev route exists in launcher" -assert_grep 'tools\) open_tools_menu' "$LEGACY" "Tools route exists in launcher" -assert_grep 'restart\|reload\|relaunch\).*restart_mqlaunch' "$LEGACY" "mqlaunch restart route exists" -assert_grep 'tools-menu\|toolsmenu\|menu-tools\|tools-v1\|menu-tools-v1\)' "$LEGACY" "Legacy Tools aliases still exist" -assert_grep 'terminal/launchers/gitlaunch\.sh' "$LEGACY" "Git route uses gitlaunch" -assert_grep 'RELEASE_SCRIPT="\$RELEASE_REPO/release\.sh"' "$RELEASE_MENU" "Release menu points at root release script" - -assert_grep 'render_main_menu_panel' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu panel exists" -assert_grep 'surface_top "Main Menu"' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu panel has title" -assert_grep 'surface_split_row "1\. Workflows" "2\. System"' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu contains Workflows and System" -assert_grep 'surface_split_row "3\. Git" "4\. Release"' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu contains Git and Release" -assert_grep 'surface_split_row "5\. Dev" "6\. Help"' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu contains Dev and Help" -assert_grep 'surface_split_row "p\. Performance" "n\. Network"' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu contains Performance and Network quick access" -assert_grep 'surface_split_row "h\. Health Check" "a\. HAL"' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu contains Health Check and HAL quick access" -assert_grep 'surface_split_row "r\. REPL" "z\. Restart mqlaunch"' "$PROJECT_ROOT/terminal/menus/mq-main-menu.sh" "Main menu contains restart quick access" -assert_grep 'render_help_center_panel' "$PROJECT_ROOT/terminal/menus/mq-help-center-menu.sh" "Help center panel exists" -assert_grep 'surface_top "Help"' "$PROJECT_ROOT/terminal/menus/mq-help-center-menu.sh" "Help center uses surface panel" -assert_grep 'surface_split_row "1\. Command index" "2\. About / Status"' "$PROJECT_ROOT/terminal/menus/mq-help-center-menu.sh" "Help center contains reference actions" -assert_grep 'surface_panel_header "System"' "$PROJECT_ROOT/terminal/menus/mq-system-menu.sh" "System menu uses surface panel" -assert_grep 'surface_panel_header "Prompt Tools"' "$PROJECT_ROOT/terminal/menus/mq-dev-menu.sh" "Dev menu uses surface panel" -assert_grep 'surface_panel_header "AI Modes"' "$PROJECT_ROOT/terminal/menus/mq-ai-menu.sh" "AI menu uses surface panel" -assert_grep 'surface_panel_header "Network"' "$PROJECT_ROOT/terminal/menus/mq-net-menu.sh" "Network menu uses surface panel" -assert_grep 'surface_panel_header "Apps / Shortcuts"' "$PROJECT_ROOT/terminal/menus/mq-apps-menu.sh" "Apps menu uses surface panel" -assert_grep 'surface_panel_header "Release"' "$PROJECT_ROOT/terminal/menus/mq-release-menu.sh" "Release menu uses surface panel" -assert_grep 'surface_panel_header "Tools Menu"' "$PROJECT_ROOT/terminal/menus/mq-tools-menu.sh" "Tools menu uses surface panel" -assert_grep 'surface_panel_header "Workflows"' "$PROJECT_ROOT/terminal/menus/mq-workflows-menu.sh" "Workflows menu uses surface panel" -assert_grep 'surface_panel_header "Shortcuts"' "$PROJECT_ROOT/terminal/menus/mq-shortcuts-menu.sh" "Shortcuts menu uses surface panel" -assert_grep 'surface_panel_header "Login"' "$PROJECT_ROOT/terminal/menus/mq-login-menu.sh" "Login menu uses surface panel" - -echo -echo "All legacy + bridge checks passed." diff --git a/backups/scripts/20260509-030842/tools/scripts/watch.sh b/backups/scripts/20260509-030842/tools/scripts/watch.sh deleted file mode 100755 index 14f2d54..0000000 --- a/backups/scripts/20260509-030842/tools/scripts/watch.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -INTERVAL="${1:-2}" -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -SCAN="$BASE_DIR/tools/scripts/scan.sh" - -# init screen -tput civis # hide cursor -clear - -draw_header() { - tput cup 0 0 - echo "MQ LIVE DASHBOARD (refresh: ${INTERVAL}s) [Ctrl+C=exit, r=refresh, +/-=speed]" - printf "%*s\n" "$(tput cols)" '' | tr ' ' '═' -} - -trap 'tput cnorm; clear; exit' INT TERM - -while true; do - # header - draw_header - - # body start at line 2 - tput cup 2 0 - - # run scan - "$SCAN" - - # non-blocking key read (0.1s steps) - for i in $(seq 1 $((INTERVAL*10))); do - read -rsn1 -t 0.1 key - case "$key" in - r|R) break ;; # force refresh - +) INTERVAL=$((INTERVAL+1)) ;; - -) [ "$INTERVAL" -gt 1 ] && INTERVAL=$((INTERVAL-1)) ;; - q|Q) tput cnorm; clear; exit ;; - esac - done -done diff --git a/backups/scripts/20260509-030842/tools/test_tools_readme.sh b/backups/scripts/20260509-030842/tools/test_tools_readme.sh deleted file mode 100755 index 1d7b128..0000000 --- a/backups/scripts/20260509-030842/tools/test_tools_readme.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -FILE="tools/README.md" - -fail() { - echo "FAIL: $1" >&2 - exit 1 -} - -[[ -f "$FILE" ]] || fail "Missing $FILE" - -grep -q '^# Tools' "$FILE" || fail "Missing heading '# Tools'" -grep -q '^## Purpose' "$FILE" || fail "Missing section '## Purpose'" -grep -q '^## Contents' "$FILE" || fail "Missing section '## Contents'" -grep -q '^## How to run' "$FILE" || fail "Missing section '## How to run'" -grep -q '`bash tools/cli/ai-mode\.sh`' "$FILE" || fail "Missing example: bash tools/cli/ai-mode.sh" -grep -q 'mac-terminal-guide' "$FILE" || fail "Missing reference to mac-terminal-guide" - -echo "OK: tools/README.md looks good" diff --git a/backups/scripts/20260509-030842/ui/ascii/mq-banner.sh b/backups/scripts/20260509-030842/ui/ascii/mq-banner.sh deleted file mode 100755 index 3ee6f57..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mq-banner.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -: "${C_RESET:=\033[0m}" -: "${C_BOLD:=\033[1m}" -: "${C_DIM:=\033[2m}" -: "${C_CYAN:=\033[36m}" -: "${C_MAGENTA:=\033[35m}" -: "${C_GREEN:=\033[32m}" -: "${C_YELLOW:=\033[33m}" -: "${C_RED:=\033[31m}" - -mq_banner() { - local title="${1:-MQLaunch}" - local subtitle="${2:-Old School Utility}" - local author="${3:-Mattias Camner}" - - echo -e "${C_CYAN}${C_BOLD}================================================================================${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}███╗ ███╗ ██████╗ ██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}████╗ ████║██╔═══██╗██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}██╔████╔██║██║ ██║██║ ███████║██║ ██║██╔██╗ ██║██║ ███████║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}██║╚██╔╝██║██║▄▄ ██║██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}██║ ╚═╝ ██║╚██████╔╝███████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}╚═╝ ╚═╝ ╚══▀▀═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝${C_RESET}" - echo -e "${C_CYAN}${C_BOLD}================================================================================${C_RESET}" - echo -e "${C_GREEN}${C_BOLD}:: ${title}${C_RESET}" - echo -e "${C_YELLOW}:: ${subtitle}${C_RESET}" - echo -e "${C_DIM}:: Author: ${author}${C_RESET}" - echo - echo -e "${C_CYAN} .--------. ${C_MAGENTA}___${C_RESET}" - echo -e "${C_CYAN} / .------. \\ ${C_MAGENTA}| _ ) _ _ __ _${C_RESET}" - echo -e "${C_CYAN} / / \\ \\ ${C_MAGENTA}| _ \\ | | | | / _\` |${C_RESET}" - echo -e "${C_CYAN} | | | | ${C_MAGENTA}|___/ \\_,_| \\__, |${C_RESET}" - echo -e "${C_CYAN} _| |________| |_ ${C_MAGENTA}|___/${C_RESET}" - echo -e "${C_CYAN} .' |_| |_| '.${C_RESET}" - echo -e "${C_CYAN} '._____ ____ _____.'${C_RESET}" - echo -e "${C_CYAN} | .'____'. |${C_RESET}" - echo -e "${C_CYAN} '.__.'.' '.'.__.'${C_RESET}" - echo -e "${C_CYAN} '.__ | .-. | __.'${C_RESET}" - echo -e "${C_CYAN} | '.'.____.'.' |${C_RESET}" - echo -e "${C_CYAN} '.____'.____.'____.'${C_RESET}" - echo -e "${C_CYAN} '.________________.'${C_RESET}" - echo - echo -e "${C_RED}${C_BOLD}>>> SYSTEM READY${C_RESET} ${C_DIM}:: modular terminal framework online${C_RESET}" - echo -e "${C_CYAN}${C_BOLD}================================================================================${C_RESET}" -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mq_banner "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/ascii/mq-bg-miami-muse.sh b/backups/scripts/20260509-030842/ui/ascii/mq-bg-miami-muse.sh deleted file mode 100644 index aceb46c..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mq-bg-miami-muse.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash - -: "${C_RESET:=\033[0m}" -: "${C_BOLD:=\033[1m}" -: "${C_DIM:=\033[2m}" -: "${C_MAGENTA:=\033[35m}" -: "${C_CYAN:=\033[36m}" -: "${C_BLUE:=\033[34m}" -: "${C_WHITE:=\033[37m}" -: "${C_YELLOW:=\033[33m}" - -MQ_NEON_PINK="\033[95m" -MQ_NEON_BLUE="\033[94m" -MQ_NEON_CYAN="\033[96m" -MQ_DIM_BLUE="\033[38;5;24m" -MQ_FOG="\033[38;5;250m" - -mq_bg_bladerunner() { - cat <>>${C_RESET} ${MQ_FOG}SPINNER LANES ABOVE // AD BOARD BURN-IN // LOW VISIBILITY //${C_RESET} ${MQ_NEON_BLUE}│${C_RESET} -${MQ_NEON_BLUE}│${C_RESET} ${MQ_NEON_BLUE}│${C_RESET} -${MQ_NEON_BLUE}└──────────────────────────────────────────────────────────────────────────────┘${C_RESET} -EOF -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mq_bg_bladerunner "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/ascii/mq-dashboard-v3.sh b/backups/scripts/20260509-030842/ui/ascii/mq-dashboard-v3.sh deleted file mode 100755 index 82ebdaf..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mq-dashboard-v3.sh +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env bash - -: "${C_RESET:=\033[0m}" -: "${C_BOLD:=\033[1m}" -: "${C_DIM:=\033[2m}" -: "${C_BLACK:=\033[30m}" -: "${C_RED:=\033[31m}" -: "${C_GREEN:=\033[32m}" -: "${C_YELLOW:=\033[33m}" -: "${C_BLUE:=\033[34m}" -: "${C_MAGENTA:=\033[35m}" -: "${C_CYAN:=\033[36m}" -: "${C_WHITE:=\033[37m}" - -NEON_PINK="${C_MAGENTA}" -NEON_CYAN="${C_CYAN}" -NEON_GREEN="${C_GREEN}" -NEON_YELLOW="${C_YELLOW}" -NEON_RED="${C_RED}" - -mq_strip_ansi() { - printf '%s' "$1" | perl -pe 's/\e\[[0-9;]*m//g' -} - -mq_repeat() { - local char="${1:--}" - local count="${2:-80}" - local out="" - local i - for (( i=0; i/dev/null 2>&1 || return 0 - git branch --show-current 2>/dev/null -} - -mq_git_repo() { - git rev-parse --show-toplevel >/dev/null 2>&1 || return 0 - basename "$(git rev-parse --show-toplevel 2>/dev/null)" -} - -mq_git_dirty() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then - printf '%s' "DIRTY" - else - printf '%s' "CLEAN" - fi -} - -mq_user() { - printf '%s' "${USER:-unknown}" -} - -mq_host() { - hostname -s 2>/dev/null || hostname 2>/dev/null || printf '%s' "unknown" -} - -mq_time() { - date '+%Y-%m-%d %H:%M:%S' -} - -mq_shell_name() { - basename "${SHELL:-shell}" -} - -mq_os_name() { - uname -s -} - -mq_box_line() { - local left="$1" - local fill="$2" - local right="$3" - local width="${4:-88}" - printf '%s%s%s\n' "$left" "$(mq_repeat "$fill" $((width - 2)))" "$right" -} - -mq_print_row() { - local left="$1" - local right="$2" - local width="${3:-88}" - local inner=$(( width - 4 )) - local left_width=42 - local right_width=$(( inner - left_width - 3 )) - - left="$(mq_truncate "$left" "$left_width")" - right="$(mq_truncate "$right" "$right_width")" - - printf "│ %s │ %s │\n" \ - "$(mq_pad_right "$left" "$left_width")" \ - "$(mq_pad_right "$right" "$right_width")" -} - -mq_dashboard_v3() { - local title="${1:-MQLaunch v3}" - local subtitle="${2:-Cyberpunk CRT Control Surface}" - local mode="${3:-ONLINE}" - local width="${4:-88}" - - local user host now cwd shell_name os_name branch repo dirty - local mode_color dirty_color - local top_glow bot_glow - - user="$(mq_user)" - host="$(mq_host)" - now="$(mq_time)" - cwd="$(pwd)" - shell_name="$(mq_shell_name)" - os_name="$(mq_os_name)" - branch="$(mq_git_branch)" - repo="$(mq_git_repo)" - dirty="$(mq_git_dirty)" - - mode_color="$NEON_GREEN" - [[ "$mode" =~ ERROR|FAIL|OFFLINE ]] && mode_color="$NEON_RED" - [[ "$mode" =~ WARN|WARNING ]] && mode_color="$NEON_YELLOW" - [[ "$mode" =~ DEV|DEBUG|GIT ]] && mode_color="$NEON_CYAN" - - dirty_color="$NEON_GREEN" - [[ "$dirty" == "DIRTY" ]] && dirty_color="$NEON_RED" - - top_glow="${NEON_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" - bot_glow="${NEON_MAGENTA}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" - - clear 2>/dev/null || true - - echo -e "${NEON_CYAN}${C_DIM}:::: CRT-SCAN ACTIVE :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "▄" "$width")${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}███╗ ███╗ ██████╗ ${NEON_CYAN}██████╗ █████╗ ███████╗██╗ ██╗${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}████╗ ████║██╔═══██╗ ${NEON_CYAN}██╔══██╗██╔══██╗██╔════╝██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██╔████╔██║██║ ██║ ${NEON_CYAN}██║ ██║███████║███████╗███████║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║╚██╔╝██║██║▄▄ ██║ ${NEON_CYAN}██║ ██║██╔══██║╚════██║██╔══██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║ ╚═╝ ██║╚██████╔╝ ${NEON_CYAN}██████╔╝██║ ██║███████║██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}╚═╝ ╚═╝ ╚══▀▀═╝ ${NEON_CYAN}╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "▀" "$width")${C_RESET}" - echo - - echo -e "${NEON_PINK}${C_BOLD}╔$(mq_repeat "═" $((width - 2)))╗${C_RESET}" - mq_print_row "${NEON_GREEN}${C_BOLD}SYSTEM${C_RESET} $title" "${NEON_YELLOW}${C_BOLD}MODE${C_RESET} ${mode_color}${C_BOLD}${mode}${C_RESET}" "$width" - mq_print_row "${NEON_CYAN}${C_BOLD}PROFILE${C_RESET} $subtitle" "${NEON_RED}${C_BOLD}STATE${C_RESET} ${dirty_color}${C_BOLD}${dirty:-N/A}${C_RESET}" "$width" - echo -e "${NEON_PINK}${C_BOLD}╠$(mq_repeat "═" $((width - 2)))╣${C_RESET}" - - mq_print_row "${C_BOLD}USER${C_RESET} $(mq_truncate "$user" 30)" "${C_BOLD}HOST${C_RESET} $(mq_truncate "$host" 30)" "$width" - mq_print_row "${C_BOLD}TIME${C_RESET} $now" "${C_BOLD}SHELL${C_RESET} $(mq_truncate "$shell_name" 30)" "$width" - mq_print_row "${C_BOLD}OS${C_RESET} $(mq_truncate "$os_name" 30)" "${C_BOLD}PATH${C_RESET} $(mq_truncate "$cwd" 36)" "$width" - - if [[ -n "$repo" || -n "$branch" ]]; then - echo -e "${NEON_PINK}${C_BOLD}╠$(mq_repeat "═" $((width - 2)))╣${C_RESET}" - mq_print_row "${NEON_CYAN}${C_BOLD}REPO${C_RESET} ${repo:-N/A}" "${NEON_GREEN}${C_BOLD}BRANCH${C_RESET} ${branch:-N/A}" "$width" - fi - - echo -e "${NEON_PINK}${C_BOLD}╠$(mq_repeat "═" $((width - 2)))╣${C_RESET}" - mq_print_row "${NEON_RED}${C_BOLD}SIGNAL${C_RESET} cyberpunk crt / neon / git-aware / modular" "${NEON_YELLOW}${C_BOLD}AURA${C_RESET} old-school utility" "$width" - mq_print_row "${C_DIM}scanlines simulated // dashboard online // zero fluff${C_RESET}" "${C_DIM}author: Mattias Camner${C_RESET}" "$width" - echo -e "${NEON_PINK}${C_BOLD}╚$(mq_repeat "═" $((width - 2)))╝${C_RESET}" - - echo - echo -e "${NEON_CYAN}${C_DIM}>>> phosphor glow stable // command surface ready${C_RESET}" -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mq_dashboard_v3 "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/ascii/mq-dashboard.sh b/backups/scripts/20260509-030842/ui/ascii/mq-dashboard.sh deleted file mode 100755 index 524be9a..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mq-dashboard.sh +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env bash - -: "${C_RESET:=\033[0m}" -: "${C_BOLD:=\033[1m}" -: "${C_DIM:=\033[2m}" -: "${C_RED:=\033[31m}" -: "${C_GREEN:=\033[32m}" -: "${C_YELLOW:=\033[33m}" -: "${C_BLUE:=\033[34m}" -: "${C_MAGENTA:=\033[35m}" -: "${C_CYAN:=\033[36m}" -: "${C_WHITE:=\033[37m}" - -mq_strip_ansi() { - printf '%s' "$1" | perl -pe 's/\e\[[0-9;]*m//g' -} - -mq_repeat_char() { - local char="${1:--}" - local count="${2:-80}" - local out="" - local i - for (( i=0; i width )); then - printf '%s' "${stripped:0:width-3}..." - return - fi - - printf '%s' "$text" -} - -mq_pad_right() { - local text="$1" - local width="${2:-88}" - local stripped len pad - stripped="$(mq_strip_ansi "$text")" - len=${#stripped} - pad=$(( width - len )) - (( pad < 0 )) && pad=0 - printf '%s' "$text" - printf "%*s" "$pad" "" -} - -mq_git_branch() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git branch --show-current 2>/dev/null -} - -mq_repo_root_name() { - git rev-parse --show-toplevel >/dev/null 2>&1 || return 0 - basename "$(git rev-parse --show-toplevel 2>/dev/null)" -} - -mq_dashboard() { - local title="${1:-MQLaunch}" - local subtitle="${2:-Modular Terminal Framework}" - local mode="${3:-READY}" - local width="${4:-88}" - - local user host now cwd branch repo shell_name os_name - local top line1 line2 line3 line4 info1 info2 info3 info4 info5 - local badge statusline - - user="${USER:-unknown}" - host="$(hostname -s 2>/dev/null || hostname 2>/dev/null || echo unknown)" - now="$(date '+%Y-%m-%d %H:%M:%S')" - cwd="$(pwd)" - branch="$(mq_git_branch)" - repo="$(mq_repo_root_name)" - shell_name="$(basename "${SHELL:-shell}")" - os_name="$(uname -s)" - - top="$(mq_repeat_char "=" "$width")" - - badge="${C_RED}${C_BOLD}>>>${C_RESET} ${C_GREEN}${C_BOLD}${mode}${C_RESET}" - statusline="${C_DIM}scanline // terminal online // no nonsense${C_RESET}" - - echo -e "${C_CYAN}${C_BOLD}${top}${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}███╗ ███╗ ██████╗ ${C_CYAN}██████╗ █████╗ ███████╗██╗ ██╗${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}████╗ ████║██╔═══██╗${C_CYAN}██╔══██╗██╔══██╗██╔════╝██║ ██║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}██╔████╔██║██║ ██║${C_CYAN}██║ ██║███████║███████╗███████║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}██║╚██╔╝██║██║▄▄ ██║${C_CYAN}██║ ██║██╔══██║╚════██║██╔══██║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}██║ ╚═╝ ██║╚██████╔╝${C_CYAN}██████╔╝██║ ██║███████║██║ ██║${C_RESET}" - echo -e "${C_MAGENTA}${C_BOLD}╚═╝ ╚═╝ ╚══▀▀═╝ ${C_CYAN}╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝${C_RESET}" - echo -e "${C_CYAN}${C_BOLD}${top}${C_RESET}" - - line1="${C_GREEN}${C_BOLD}SYSTEM${C_RESET} $(mq_fit_text "$title" 60)" - line2="${C_YELLOW}${C_BOLD}PROFILE${C_RESET} $(mq_fit_text "$subtitle" 60)" - line3="${C_BLUE}${C_BOLD}STATUS${C_RESET} ${badge}" - line4="${C_DIM}${statusline}${C_RESET}" - - echo -e "$line1" - echo -e "$line2" - echo -e "$line3" - echo -e "$line4" - echo -e "${C_CYAN}${mq_repeat_char "-" "$width"}${C_RESET}" - - info1="${C_BOLD}User:${C_RESET} ${user}" - info2="${C_BOLD}Host:${C_RESET} ${host}" - info3="${C_BOLD}Time:${C_RESET} ${now}" - info4="${C_BOLD}Shell:${C_RESET} ${shell_name}" - info5="${C_BOLD}OS:${C_RESET} ${os_name}" - - echo -e "$(mq_pad_right "$info1" 28)$(mq_pad_right "$info2" 24)$info3" - echo -e "$(mq_pad_right "$info4" 28)$info5" - - if [[ -n "$repo" || -n "$branch" ]]; then - echo -e "${C_CYAN}${mq_repeat_char "-" "$width"}${C_RESET}" - [[ -n "$repo" ]] && echo -e "${C_BOLD}Repo:${C_RESET} ${repo}" - [[ -n "$branch" ]] && echo -e "${C_BOLD}Branch:${C_RESET} ${C_GREEN}${branch}${C_RESET}" - fi - - echo -e "${C_CYAN}${mq_repeat_char "-" "$width"}${C_RESET}" - echo -e "${C_BOLD}Path:${C_RESET} $(mq_fit_text "$cwd" $((width - 6)))" - echo -e "${C_RED}${C_BOLD}◢${C_RESET}${C_DIM} old school utility // modular menus // git-aware workflows ${C_RED}${C_BOLD}◣${C_RESET}" - echo -e "${C_CYAN}${C_BOLD}${top}${C_RESET}" -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mq_dashboard "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v4.sh b/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v4.sh deleted file mode 100755 index 6eaba26..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v4.sh +++ /dev/null @@ -1,307 +0,0 @@ -#!/usr/bin/env bash - -: "${C_RESET:=\033[0m}" -: "${C_BOLD:=\033[1m}" -: "${C_DIM:=\033[2m}" -: "${C_RED:=\033[31m}" -: "${C_GREEN:=\033[32m}" -: "${C_YELLOW:=\033[33m}" -: "${C_BLUE:=\033[34m}" -: "${C_MAGENTA:=\033[35m}" -: "${C_CYAN:=\033[36m}" -: "${C_WHITE:=\033[37m}" - -NEON_PINK="${C_MAGENTA}" -NEON_CYAN="${C_CYAN}" -NEON_GREEN="${C_GREEN}" -NEON_YELLOW="${C_YELLOW}" -NEON_RED="${C_RED}" - -mq_strip_ansi() { - printf '%s' "$1" | perl -pe 's/\e\[[0-9;]*m//g' -} - -mq_len() { - local s="$1" - s="$(mq_strip_ansi "$s")" - printf '%s' "${#s}" -} - -mq_repeat() { - local char="${1:--}" - local count="${2:-10}" - local out="" - local i - for (( i=0; i/dev/null 2>&1 || return 0 - basename "$(git rev-parse --show-toplevel 2>/dev/null)" -} - -mq_git_branch() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git branch --show-current 2>/dev/null -} - -mq_git_dirty_state() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then - printf '%s' "DIRTY" - else - printf '%s' "CLEAN" - fi -} - -mq_git_counts() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - local staged unstaged untracked - staged="$(git diff --cached --name-only 2>/dev/null | wc -l | tr -d ' ')" - unstaged="$(git diff --name-only 2>/dev/null | wc -l | tr -d ' ')" - untracked="$(git ls-files --others --exclude-standard 2>/dev/null | wc -l | tr -d ' ')" - - printf '%s|%s|%s' "$staged" "$unstaged" "$untracked" -} - -mq_git_ahead_behind() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git rev-parse --abbrev-ref '@{u}' >/dev/null 2>&1 || { - printf '%s' "no-upstream" - return 0 - } - - local counts - counts="$(git rev-list --left-right --count HEAD...@{u} 2>/dev/null || true)" - if [[ -n "$counts" ]]; then - local ahead behind - ahead="$(printf '%s' "$counts" | awk '{print $1}')" - behind="$(printf '%s' "$counts" | awk '{print $2}')" - printf '↑%s ↓%s' "$ahead" "$behind" - else - printf '%s' "unknown" - fi -} - -mq_user() { - printf '%s' "${USER:-unknown}" -} - -mq_host() { - hostname -s 2>/dev/null || hostname 2>/dev/null || printf '%s' "unknown" -} - -mq_time() { - date '+%Y-%m-%d %H:%M:%S' -} - -mq_shell_name() { - basename "${SHELL:-shell}" -} - -mq_os_name() { - uname -s -} - -mq_cwd() { - pwd -} - -mq_memory_widget() { - if command -v vm_stat >/dev/null 2>&1; then - local page_size pages_free pages_active pages_inactive pages_speculative pages_wired total used pct - page_size="$(vm_stat | head -n 1 | awk '{gsub("\\.","",$8); print $8}')" - [[ -z "$page_size" ]] && page_size=4096 - - pages_free="$(vm_stat | awk '/Pages free/ {gsub("\\.","",$3); print $3}')" - pages_active="$(vm_stat | awk '/Pages active/ {gsub("\\.","",$3); print $3}')" - pages_inactive="$(vm_stat | awk '/Pages inactive/ {gsub("\\.","",$3); print $3}')" - pages_speculative="$(vm_stat | awk '/Pages speculative/ {gsub("\\.","",$3); print $3}')" - pages_wired="$(vm_stat | awk '/Pages wired down/ {gsub("\\.","",$4); print $4}')" - - pages_free="${pages_free:-0}" - pages_active="${pages_active:-0}" - pages_inactive="${pages_inactive:-0}" - pages_speculative="${pages_speculative:-0}" - pages_wired="${pages_wired:-0}" - - total=$(( pages_free + pages_active + pages_inactive + pages_speculative + pages_wired )) - used=$(( pages_active + pages_wired )) - - if (( total > 0 )); then - pct=$(( used * 100 / total )) - printf 'MEM %s%%' "$pct" - return - fi - fi - - printf '%s' "MEM N/A" -} - -mq_battery_widget() { - if command -v pmset >/dev/null 2>&1; then - local batt - batt="$(pmset -g batt 2>/dev/null | grep -Eo '[0-9]+%' | head -n 1 || true)" - if [[ -n "$batt" ]]; then - printf 'BAT %s' "$batt" - return - fi - fi - - printf '%s' "BAT N/A" -} - -mq_mode_color() { - local mode="$1" - if [[ "$mode" =~ ERROR|FAIL|OFFLINE ]]; then - printf '%s' "$NEON_RED" - elif [[ "$mode" =~ WARN|WARNING ]]; then - printf '%s' "$NEON_YELLOW" - elif [[ "$mode" =~ DEV|DEBUG|GIT ]]; then - printf '%s' "$NEON_CYAN" - else - printf '%s' "$NEON_GREEN" - fi -} - -mq_state_color() { - local state="$1" - if [[ "$state" == "DIRTY" ]]; then - printf '%s' "$NEON_RED" - else - printf '%s' "$NEON_GREEN" - fi -} - -mq_box_top() { - local title="$1" - local width="$2" - local inner=$(( width - 4 )) - printf "┌─ %s%s ─┐\n" \ - "$title" \ - "$(mq_repeat "─" $(( inner - ${#title} )))" -} - -mq_box_bottom() { - local width="$1" - printf "└%s┘\n" "$(mq_repeat "─" $(( width - 2 )))" -} - -mq_box_row() { - local left="$1" - local right="$2" - local width="$3" - local inner=$(( width - 4 )) - local left_width=24 - local right_width=$(( inner - left_width - 3 )) - - left="$(mq_truncate "$left" "$left_width")" - right="$(mq_truncate "$right" "$right_width")" - - printf "│ %s │ %s │\n" \ - "$(mq_pad_right "$left" "$left_width")" \ - "$(mq_pad_right "$right" "$right_width")" -} - -mqlaunch_dashboard_v4() { - local title="${1:-MQLAUNCH}" - local subtitle="${2:-Cyberpunk CRT Command Center}" - local mode="${3:-ONLINE}" - - local width=92 - local mode_color state_color - local user host now shell_name os_name cwd repo branch dirty counts staged unstaged untracked ahead_behind - local mem_widget batt_widget - - user="$(mq_user)" - host="$(mq_host)" - now="$(mq_time)" - shell_name="$(mq_shell_name)" - os_name="$(mq_os_name)" - cwd="$(mq_cwd)" - repo="$(mq_git_repo)" - branch="$(mq_git_branch)" - dirty="$(mq_git_dirty_state)" - counts="$(mq_git_counts)" - staged="$(printf '%s' "$counts" | cut -d'|' -f1)" - unstaged="$(printf '%s' "$counts" | cut -d'|' -f2)" - untracked="$(printf '%s' "$counts" | cut -d'|' -f3)" - ahead_behind="$(mq_git_ahead_behind)" - mem_widget="$(mq_memory_widget)" - batt_widget="$(mq_battery_widget)" - - mode_color="$(mq_mode_color "$mode")" - state_color="$(mq_state_color "$dirty")" - - clear 2>/dev/null || true - - echo -e "${NEON_CYAN}${C_DIM}::: PHOSPHOR GRID ACTIVE :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}███╗ ███╗ ██████╗ ██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}████╗ ████║██╔═══██╗██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██╔████╔██║██║ ██║██║ ███████║██║ ██║██╔██╗ ██║██║ ███████║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║╚██╔╝██║██║▄▄ ██║██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║ ╚═╝ ██║╚██████╔╝███████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}╚═╝ ╚═╝ ╚══▀▀═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" - echo -e "${NEON_GREEN}${C_BOLD}${title}${C_RESET} ${C_DIM}// ${subtitle}${C_RESET}" - echo -e "${mode_color}${C_BOLD}MODE: ${mode}${C_RESET} ${state_color}${C_BOLD}STATE: ${dirty:-N/A}${C_RESET} ${NEON_YELLOW}${C_BOLD}${mem_widget}${C_RESET} ${NEON_CYAN}${C_BOLD}${batt_widget}${C_RESET}" - echo -e "${NEON_CYAN}${C_DIM}scanlines online // widget surface active // zero fluff${C_RESET}" - echo - - mq_box_top "SYSTEM" 92 - mq_box_row "USER ${user}" "HOST ${host}" 92 - mq_box_row "TIME ${now}" "SHELL ${shell_name}" 92 - mq_box_row "OS ${os_name}" "PATH ${cwd}" 92 - mq_box_bottom 92 - echo - - mq_box_top "GIT WIDGETS" 92 - mq_box_row "REPO ${repo:-N/A}" "BRANCH ${branch:-N/A}" 92 - mq_box_row "STATE ${dirty:-N/A}" "UPSTREAM ${ahead_behind:-N/A}" 92 - mq_box_row "STAGED ${staged:-0}" "UNSTAGED ${unstaged:-0}" 92 - mq_box_row "UNTRACKD ${untracked:-0}" "MODE ${mode}" 92 - mq_box_bottom 92 - echo - - mq_box_top "SHORTCUTS" 92 - mq_box_row "git -> modular git menu" "gitlaunch -> legacy git menu" 92 - mq_box_row "dev -> dev tools menu" "tools -> tools menu" 92 - mq_box_row "Use this dashboard in launcher + menus" "Brand: MQLAUNCH" 92 - mq_box_bottom 92 - echo - - echo -e "${NEON_RED}${C_BOLD}>>> READY${C_RESET} ${C_DIM}// neon command surface stable${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mqlaunch_dashboard_v4 "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v5.sh b/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v5.sh deleted file mode 100755 index 21725e2..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v5.sh +++ /dev/null @@ -1,391 +0,0 @@ -#!/usr/bin/env bash - -: "${C_RESET:=\033[0m}" -: "${C_BOLD:=\033[1m}" -: "${C_DIM:=\033[2m}" -: "${C_RED:=\033[31m}" -: "${C_GREEN:=\033[32m}" -: "${C_YELLOW:=\033[33m}" -: "${C_BLUE:=\033[34m}" -: "${C_MAGENTA:=\033[35m}" -: "${C_CYAN:=\033[36m}" -: "${C_WHITE:=\033[37m}" - -NEON_PINK="${C_MAGENTA}" -NEON_CYAN="${C_CYAN}" -NEON_GREEN="${C_GREEN}" -NEON_YELLOW="${C_YELLOW}" -NEON_RED="${C_RED}" - -mq_strip_ansi() { - printf '%s' "$1" | perl -pe 's/\e\[[0-9;]*m//g' -} - -mq_len() { - local s="$1" - s="$(mq_strip_ansi "$s")" - printf '%s' "${#s}" -} - -mq_repeat() { - local char="${1:--}" - local count="${2:-10}" - local out="" - local i - for (( i=0; i/dev/null 2>&1 || return 0 - basename "$(git rev-parse --show-toplevel 2>/dev/null)" -} - -mq_git_branch() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git branch --show-current 2>/dev/null -} - -mq_git_dirty_state() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then - printf '%s' "DIRTY" - else - printf '%s' "CLEAN" - fi -} - -mq_git_counts() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - local staged unstaged untracked - staged="$(git diff --cached --name-only 2>/dev/null | wc -l | tr -d ' ')" - unstaged="$(git diff --name-only 2>/dev/null | wc -l | tr -d ' ')" - untracked="$(git ls-files --others --exclude-standard 2>/dev/null | wc -l | tr -d ' ')" - - printf '%s|%s|%s' "$staged" "$unstaged" "$untracked" -} - -mq_git_ahead_behind() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git rev-parse --abbrev-ref '@{u}' >/dev/null 2>&1 || { - printf '%s' "no-upstream" - return 0 - } - - local counts ahead behind - counts="$(git rev-list --left-right --count HEAD...@{u} 2>/dev/null || true)" - if [[ -n "$counts" ]]; then - ahead="$(printf '%s' "$counts" | awk '{print $1}')" - behind="$(printf '%s' "$counts" | awk '{print $2}')" - printf '↑%s ↓%s' "$ahead" "$behind" - else - printf '%s' "unknown" - fi -} - -mq_user() { - printf '%s' "${USER:-unknown}" -} - -mq_host() { - hostname -s 2>/dev/null || hostname 2>/dev/null || printf '%s' "unknown" -} - -mq_time() { - date '+%Y-%m-%d %H:%M:%S' -} - -mq_shell_name() { - basename "${SHELL:-shell}" -} - -mq_os_name() { - uname -s -} - -mq_cwd() { - pwd -} - -mq_memory_widget() { - if command -v vm_stat >/dev/null 2>&1; then - local pages_free pages_active pages_inactive pages_speculative pages_wired total used pct - pages_free="$(vm_stat | awk '/Pages free/ {gsub("\\.","",$3); print $3}')" - pages_active="$(vm_stat | awk '/Pages active/ {gsub("\\.","",$3); print $3}')" - pages_inactive="$(vm_stat | awk '/Pages inactive/ {gsub("\\.","",$3); print $3}')" - pages_speculative="$(vm_stat | awk '/Pages speculative/ {gsub("\\.","",$3); print $3}')" - pages_wired="$(vm_stat | awk '/Pages wired down/ {gsub("\\.","",$4); print $4}')" - - pages_free="${pages_free:-0}" - pages_active="${pages_active:-0}" - pages_inactive="${pages_inactive:-0}" - pages_speculative="${pages_speculative:-0}" - pages_wired="${pages_wired:-0}" - - total=$(( pages_free + pages_active + pages_inactive + pages_speculative + pages_wired )) - used=$(( pages_active + pages_wired )) - - if (( total > 0 )); then - pct=$(( used * 100 / total )) - printf 'MEM %s%%' "$pct" - return - fi - fi - - printf '%s' "MEM N/A" -} - -mq_battery_widget() { - if command -v pmset >/dev/null 2>&1; then - local batt - batt="$(pmset -g batt 2>/dev/null | grep -Eo '[0-9]+%' | head -n 1 || true)" - if [[ -n "$batt" ]]; then - printf 'BAT %s' "$batt" - return - fi - fi - - printf '%s' "BAT N/A" -} - -mq_mode_color() { - local mode="$1" - if [[ "$mode" =~ ERROR|FAIL|OFFLINE ]]; then - printf '%s' "$NEON_RED" - elif [[ "$mode" =~ WARN|WARNING ]]; then - printf '%s' "$NEON_YELLOW" - elif [[ "$mode" =~ DEV|DEBUG|GIT ]]; then - printf '%s' "$NEON_CYAN" - else - printf '%s' "$NEON_GREEN" - fi -} - -mq_state_color() { - local state="$1" - if [[ "$state" == "DIRTY" ]]; then - printf '%s' "$NEON_RED" - else - printf '%s' "$NEON_GREEN" - fi -} - -mq_box_top() { - local title="$1" - local width="$2" - local inner=$(( width - 6 - ${#title} )) - (( inner < 0 )) && inner=0 - printf "┌─ %s %s┐\n" "$title" "$(mq_repeat "─" "$inner")" -} - -mq_box_bottom() { - local width="$1" - printf "└%s┘\n" "$(mq_repeat "─" $(( width - 2 )))" -} - -mq_box_row() { - local left="$1" - local right="$2" - local width="$3" - local inner=$(( width - 4 )) - local left_width=24 - local right_width=$(( inner - left_width - 3 )) - - if (( right_width < 10 )); then - left_width=$(( inner / 2 - 1 )) - right_width=$(( inner - left_width - 3 )) - fi - - left="$(mq_truncate "$left" "$left_width")" - right="$(mq_truncate "$right" "$right_width")" - - printf "│ %s │ %s │\n" \ - "$(mq_pad_right "$left" "$left_width")" \ - "$(mq_pad_right "$right" "$right_width")" -} - -mq_box_single() { - local text="$1" - local width="$2" - local inner=$(( width - 4 )) - text="$(mq_truncate "$text" "$inner")" - printf "│ %s │\n" "$(mq_pad_right "$text" "$inner")" -} - -mq_bar() { - local label="$1" - local value="${2:-0}" - local max="${3:-10}" - local width="${4:-24}" - local color="${5:-$NEON_GREEN}" - - local filled empty safe_value i bar="" - safe_value="$value" - (( safe_value < 0 )) && safe_value=0 - (( max < 1 )) && max=1 - - filled=$(( safe_value * width / max )) - (( filled > width )) && filled="$width" - empty=$(( width - filled )) - - for (( i=0; i/dev/null || true - - echo -e "${NEON_CYAN}${C_DIM}::: PHOSPHOR GRID ACTIVE :::::::::::::::::::::::::::::::::::::::::::::::::::::::::${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}███╗ ███╗ ██████╗ ██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}████╗ ████║██╔═══██╗██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██╔████╔██║██║ ██║██║ ███████║██║ ██║██╔██╗ ██║██║ ███████║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║╚██╔╝██║██║▄▄ ██║██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║ ╚═╝ ██║╚██████╔╝███████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}╚═╝ ╚═╝ ╚══▀▀═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" - echo -e "${NEON_GREEN}${C_BOLD}${title}${C_RESET} ${C_DIM}// ${subtitle}${C_RESET}" - echo -e "${mode_color}${C_BOLD}MODE: ${mode}${C_RESET} ${state_color}${C_BOLD}STATE: ${dirty:-N/A}${C_RESET} ${NEON_YELLOW}${C_BOLD}${mem_widget}${C_RESET} ${NEON_CYAN}${C_BOLD}${batt_widget}${C_RESET}" - echo - - mq_box_top "SYSTEM" "$width" - if (( compact == 1 )); then - mq_box_single "USER ${user}" "$width" - mq_box_single "HOST ${host}" "$width" - mq_box_single "TIME ${now}" "$width" - mq_box_single "SHELL ${shell_name}" "$width" - mq_box_single "OS ${os_name}" "$width" - mq_box_single "PATH ${cwd}" "$width" - else - mq_box_row "USER ${user}" "HOST ${host}" "$width" - mq_box_row "TIME ${now}" "SHELL ${shell_name}" "$width" - mq_box_row "OS ${os_name}" "PATH ${cwd}" "$width" - fi - mq_box_bottom "$width" - echo - - mq_box_top "GIT WIDGETS" "$width" - if (( compact == 1 )); then - mq_box_single "REPO ${repo:-N/A}" "$width" - mq_box_single "BRANCH ${branch:-N/A}" "$width" - mq_box_single "STATE ${dirty:-N/A}" "$width" - mq_box_single "UPSTREAM ${ahead_behind:-N/A}" "$width" - mq_box_single "$(mq_bar "STAGED " "$staged" "$bar_max" 18 "$NEON_GREEN")" "$width" - mq_box_single "$(mq_bar "UNSTAGED" "$unstaged" "$bar_max" 18 "$NEON_YELLOW")" "$width" - mq_box_single "$(mq_bar "UNTRACK " "$untracked" "$bar_max" 18 "$NEON_RED")" "$width" - else - mq_box_row "REPO ${repo:-N/A}" "BRANCH ${branch:-N/A}" "$width" - mq_box_row "STATE ${dirty:-N/A}" "UPSTREAM ${ahead_behind:-N/A}" "$width" - mq_box_single "$(mq_bar "STAGED " "$staged" "$bar_max" 34 "$NEON_GREEN")" "$width" - mq_box_single "$(mq_bar "UNSTAGED" "$unstaged" "$bar_max" 34 "$NEON_YELLOW")" "$width" - mq_box_single "$(mq_bar "UNTRACK " "$untracked" "$bar_max" 34 "$NEON_RED")" "$width" - fi - mq_box_bottom "$width" - echo - - mq_box_top "SHORTCUTS" "$width" - if (( compact == 1 )); then - mq_box_single "git -> modular git menu" "$width" - mq_box_single "gitlaunch -> legacy git menu" "$width" - mq_box_single "dev -> dev tools menu" "$width" - mq_box_single "tools -> tools menu" "$width" - else - mq_box_row "git -> modular git menu" "gitlaunch -> legacy git menu" "$width" - mq_box_row "dev -> dev tools menu" "tools -> tools menu" "$width" - mq_box_row "adaptive layout active" "brand: MQLAUNCH" "$width" - fi - mq_box_bottom "$width" - echo - - echo -e "${NEON_RED}${C_BOLD}>>> READY${C_RESET} ${C_DIM}// adaptive neon command surface stable${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mqlaunch_dashboard_v5 "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v6.sh b/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v6.sh deleted file mode 100755 index a6ddd44..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v6.sh +++ /dev/null @@ -1,471 +0,0 @@ -#!/usr/bin/env bash - -: "${C_RESET:=\033[0m}" -: "${C_BOLD:=\033[1m}" -: "${C_DIM:=\033[2m}" -: "${C_RED:=\033[31m}" -: "${C_GREEN:=\033[32m}" -: "${C_YELLOW:=\033[33m}" -: "${C_BLUE:=\033[34m}" -: "${C_MAGENTA:=\033[35m}" -: "${C_CYAN:=\033[36m}" -: "${C_WHITE:=\033[37m}" - -NEON_PINK="${C_MAGENTA}" -NEON_CYAN="${C_CYAN}" -NEON_GREEN="${C_GREEN}" -NEON_YELLOW="${C_YELLOW}" -NEON_RED="${C_RED}" - -mq_strip_ansi() { - printf '%s' "$1" | perl -pe 's/\e\[[0-9;]*m//g' -} - -mq_len() { - local s="$1" - s="$(mq_strip_ansi "$s")" - printf '%s' "${#s}" -} - -mq_repeat() { - local char="${1:--}" - local count="${2:-10}" - local out="" - local i - for (( i=0; i/dev/null || hostname 2>/dev/null || printf '%s' "unknown" -} - -mq_time() { - date '+%Y-%m-%d %H:%M:%S' -} - -mq_shell_name() { - basename "${SHELL:-shell}" -} - -mq_os_name() { - uname -s -} - -mq_cwd() { - pwd -} - -mq_git_repo() { - git rev-parse --show-toplevel >/dev/null 2>&1 || return 0 - basename "$(git rev-parse --show-toplevel 2>/dev/null)" -} - -mq_git_branch() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git branch --show-current 2>/dev/null -} - -mq_git_dirty_state() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then - printf '%s' "DIRTY" - else - printf '%s' "CLEAN" - fi -} - -mq_git_counts() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - local staged unstaged untracked - staged="$(git diff --cached --name-only 2>/dev/null | wc -l | tr -d ' ')" - unstaged="$(git diff --name-only 2>/dev/null | wc -l | tr -d ' ')" - untracked="$(git ls-files --others --exclude-standard 2>/dev/null | wc -l | tr -d ' ')" - - printf '%s|%s|%s' "$staged" "$unstaged" "$untracked" -} - -mq_git_ahead_behind() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git rev-parse --abbrev-ref '@{u}' >/dev/null 2>&1 || { - printf '%s' "no-upstream" - return 0 - } - - local counts ahead behind - counts="$(git rev-list --left-right --count HEAD...@{u} 2>/dev/null || true)" - if [[ -n "$counts" ]]; then - ahead="$(printf '%s' "$counts" | awk '{print $1}')" - behind="$(printf '%s' "$counts" | awk '{print $2}')" - printf '↑%s ↓%s' "$ahead" "$behind" - else - printf '%s' "unknown" - fi -} - -mq_memory_widget() { - if command -v vm_stat >/dev/null 2>&1; then - local pages_free pages_active pages_inactive pages_speculative pages_wired total used pct - pages_free="$(vm_stat | awk '/Pages free/ {gsub("\\.","",$3); print $3}')" - pages_active="$(vm_stat | awk '/Pages active/ {gsub("\\.","",$3); print $3}')" - pages_inactive="$(vm_stat | awk '/Pages inactive/ {gsub("\\.","",$3); print $3}')" - pages_speculative="$(vm_stat | awk '/Pages speculative/ {gsub("\\.","",$3); print $3}')" - pages_wired="$(vm_stat | awk '/Pages wired down/ {gsub("\\.","",$4); print $4}')" - - pages_free="${pages_free:-0}" - pages_active="${pages_active:-0}" - pages_inactive="${pages_inactive:-0}" - pages_speculative="${pages_speculative:-0}" - pages_wired="${pages_wired:-0}" - - total=$(( pages_free + pages_active + pages_inactive + pages_speculative + pages_wired )) - used=$(( pages_active + pages_wired )) - - if (( total > 0 )); then - pct=$(( used * 100 / total )) - printf 'MEM %s%%' "$pct" - return - fi - fi - - printf '%s' "MEM N/A" -} - -mq_battery_widget() { - if command -v pmset >/dev/null 2>&1; then - local batt - batt="$(pmset -g batt 2>/dev/null | grep -Eo '[0-9]+%' | head -n 1 || true)" - if [[ -n "$batt" ]]; then - printf 'BAT %s' "$batt" - return - fi - fi - - printf '%s' "BAT N/A" -} - -mq_mode_color() { - local mode="$1" - if [[ "$mode" =~ ERROR|FAIL|OFFLINE ]]; then - printf '%s' "$NEON_RED" - elif [[ "$mode" =~ WARN|WARNING ]]; then - printf '%s' "$NEON_YELLOW" - elif [[ "$mode" =~ DEV|DEBUG|GIT ]]; then - printf '%s' "$NEON_CYAN" - else - printf '%s' "$NEON_GREEN" - fi -} - -mq_state_color() { - local state="$1" - if [[ "$state" == "DIRTY" ]]; then - printf '%s' "$NEON_RED" - else - printf '%s' "$NEON_GREEN" - fi -} - -mq_box_top() { - local title="$1" - local width="$2" - local inner=$(( width - 6 - ${#title} )) - (( inner < 0 )) && inner=0 - printf "┌─ %s %s┐\n" "$title" "$(mq_repeat "─" "$inner")" -} - -mq_box_bottom() { - local width="$1" - printf "└%s┘\n" "$(mq_repeat "─" $(( width - 2 )))" -} - -mq_box_row() { - local left="$1" - local right="$2" - local width="$3" - local inner=$(( width - 4 )) - local left_width=24 - local right_width=$(( inner - left_width - 3 )) - - if (( right_width < 10 )); then - left_width=$(( inner / 2 - 1 )) - right_width=$(( inner - left_width - 3 )) - fi - - left="$(mq_truncate "$left" "$left_width")" - right="$(mq_truncate "$right" "$right_width")" - - printf "│ %s │ %s │\n" \ - "$(mq_pad_right "$left" "$left_width")" \ - "$(mq_pad_right "$right" "$right_width")" -} - -mq_box_single() { - local text="$1" - local width="$2" - local inner=$(( width - 4 )) - text="$(mq_truncate "$text" "$inner")" - printf "│ %s │\n" "$(mq_pad_right "$text" "$inner")" -} - -mq_bar() { - local label="$1" - local value="${2:-0}" - local max="${3:-10}" - local width="${4:-24}" - local color="${5:-$NEON_GREEN}" - - local filled empty safe_value i bar="" - safe_value="$value" - (( safe_value < 0 )) && safe_value=0 - (( max < 1 )) && max=1 - - filled=$(( safe_value * width / max )) - (( filled > width )) && filled="$width" - empty=$(( width - filled )) - - for (( i=0; i width )) && filled="$width" - - for (( i=0; i/dev/null || true - - echo -e "${NEON_CYAN}${C_DIM}::: PHOSPHOR GRID ACTIVE :::::::::::::::::::::::::::::::::::::::::::::::::::::::::${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}███╗ ███╗ ██████╗ ██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}████╗ ████║██╔═══██╗██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██╔████╔██║██║ ██║██║ ███████║██║ ██║██╔██╗ ██║██║ ███████║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║╚██╔╝██║██║▄▄ ██║██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}██║ ╚═╝ ██║╚██████╔╝███████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║${C_RESET}" - echo -e "${NEON_PINK}${C_BOLD}╚═╝ ╚═╝ ╚══▀▀═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" - echo -e "${NEON_GREEN}${C_BOLD}${title}${C_RESET} ${C_DIM}// ${subtitle}${C_RESET}" - echo -e "${mode_color}${C_BOLD}MODE: ${mode}${C_RESET} ${state_color}${C_BOLD}STATE: ${dirty:-N/A}${C_RESET} ${severity_color}${C_BOLD}SEVERITY: ${severity}${C_RESET}" - echo -e "${NEON_YELLOW}${C_BOLD}${mem_widget}${C_RESET} ${NEON_CYAN}${C_BOLD}${batt_widget}${C_RESET} ${C_DIM}adaptive layout active${C_RESET}" - echo - - mq_box_top "SYSTEM" "$width" - if (( compact == 1 )); then - mq_box_single "USER ${user}" "$width" - mq_box_single "HOST ${host}" "$width" - mq_box_single "TIME ${now}" "$width" - mq_box_single "SHELL ${shell_name}" "$width" - mq_box_single "OS ${os_name}" "$width" - mq_box_single "PATH ${cwd}" "$width" - else - mq_box_row "USER ${user}" "HOST ${host}" "$width" - mq_box_row "TIME ${now}" "SHELL ${shell_name}" "$width" - mq_box_row "OS ${os_name}" "PATH ${cwd}" "$width" - fi - mq_box_bottom "$width" - echo - - mq_box_top "GIT WIDGETS" "$width" - if (( compact == 1 )); then - mq_box_single "REPO ${repo:-N/A}" "$width" - mq_box_single "BRANCH ${branch:-N/A}" "$width" - mq_box_single "STATE ${dirty:-N/A}" "$width" - mq_box_single "UPSTREAM ${ahead_behind:-N/A}" "$width" - mq_box_single "SEVERITY $(mq_severity_meter "$severity" "$severity_color" 18)" "$width" - mq_box_single "$(mq_bar "STAGED " "$staged" "$bar_max" 18 "$NEON_GREEN")" "$width" - mq_box_single "$(mq_bar "UNSTAGED" "$unstaged" "$bar_max" 18 "$NEON_YELLOW")" "$width" - mq_box_single "$(mq_bar "UNTRACK " "$untracked" "$bar_max" 18 "$NEON_RED")" "$width" - else - mq_box_row "REPO ${repo:-N/A}" "BRANCH ${branch:-N/A}" "$width" - mq_box_row "STATE ${dirty:-N/A}" "UPSTREAM ${ahead_behind:-N/A}" "$width" - mq_box_single "SEVERITY $(mq_severity_meter "$severity" "$severity_color" 34)" "$width" - mq_box_single "$(mq_bar "STAGED " "$staged" "$bar_max" 34 "$NEON_GREEN")" "$width" - mq_box_single "$(mq_bar "UNSTAGED" "$unstaged" "$bar_max" 34 "$NEON_YELLOW")" "$width" - mq_box_single "$(mq_bar "UNTRACK " "$untracked" "$bar_max" 34 "$NEON_RED")" "$width" - fi - mq_box_bottom "$width" - echo - - mq_box_top "LIVE SHORTCUTS" "$width" - if [[ "$mode" =~ GIT ]]; then - if (( compact == 1 )); then - mq_box_single "git status / git pull --rebase / git push" "$width" - mq_box_single "stash push / stash pop / switch branch" "$width" - mq_box_single "mqlaunch git / mqlaunch dev / mqlaunch tools" "$width" - else - mq_box_row "git status / git pull --rebase" "git push / git fetch --all" "$width" - mq_box_row "stash push / stash pop" "switch branch / create branch" "$width" - mq_box_row "mqlaunch git / dev / tools" "legacy: mqlaunch gitlaunch" "$width" - fi - elif [[ "$mode" =~ DEV ]]; then - if (( compact == 1 )); then - mq_box_single "mqlaunch dev / mqlaunch git / mqlaunch tools" "$width" - mq_box_single "edit mqlaunch / search menus / open repo" "$width" - mq_box_single "install.sh / system-check.sh" "$width" - else - mq_box_row "mqlaunch dev / git / tools" "open repo / open GitHub / VS Code" "$width" - mq_box_row "search mqlaunch / search menus" "edit dev menu / git menu / mqlaunch" "$width" - mq_box_row "run install.sh" "run system-check.sh" "$width" - fi - else - if (( compact == 1 )); then - mq_box_single "mqlaunch git / mqlaunch dev / mqlaunch tools" "$width" - mq_box_single "gitlaunch for legacy git menu" "$width" - mq_box_single "modular launcher system online" "$width" - else - mq_box_row "mqlaunch git -> modular git menu" "mqlaunch dev -> dev tools" "$width" - mq_box_row "mqlaunch tools -> tools menu" "mqlaunch gitlaunch -> legacy" "$width" - mq_box_row "adaptive layout + severity meter" "brand: MQLAUNCH" "$width" - fi - fi - mq_box_bottom "$width" - echo - - echo -e "${NEON_RED}${C_BOLD}>>> READY${C_RESET} ${C_DIM}// neon command surface stable // severity-aware widgets live${C_RESET}" - echo -e "${NEON_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mqlaunch_dashboard_v6 "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v7.1.sh b/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v7.1.sh deleted file mode 100755 index 7e97882..0000000 --- a/backups/scripts/20260509-030842/ui/ascii/mqlaunch-dashboard-v7.1.sh +++ /dev/null @@ -1,527 +0,0 @@ -#!/usr/bin/env bash - -if [[ -t 1 ]]; then - : "${C_RESET:=$'\033[0m'}" - : "${C_BOLD:=$'\033[1m'}" - : "${C_DIM:=$'\033[2m'}" - : "${C_RED:=$'\033[31m'}" - : "${C_GREEN:=$'\033[32m'}" - : "${C_YELLOW:=$'\033[33m'}" - : "${C_BLUE:=$'\033[34m'}" - : "${C_MAGENTA:=$'\033[35m'}" - : "${C_CYAN:=$'\033[36m'}" - : "${C_WHITE:=$'\033[37m'}" - MQ_PINK="${MQ_PINK:-$'\033[95m'}" - LAUNCH_PINK="${LAUNCH_PINK:-$'\033[35m'}" -else - : "${C_RESET:=}" - : "${C_BOLD:=}" - : "${C_DIM:=}" - : "${C_RED:=}" - : "${C_GREEN:=}" - : "${C_YELLOW:=}" - : "${C_BLUE:=}" - : "${C_MAGENTA:=}" - : "${C_CYAN:=}" - : "${C_WHITE:=}" - MQ_PINK="${MQ_PINK:-}" - LAUNCH_PINK="${LAUNCH_PINK:-}" -fi -ACCENT_CYAN="${C_CYAN}" -ACCENT_GREEN="${C_GREEN}" -ACCENT_YELLOW="${C_YELLOW}" -ACCENT_RED="${C_RED}" -ACCENT_DIM="${C_DIM}" - -mq_strip_ansi() { - printf '%s' "$1" | perl -pe 's/\e\[[0-9;]*m//g' -} - -mq_len() { - local s="$1" - s="$(mq_strip_ansi "$s")" - printf '%s' "${#s}" -} - -mq_repeat() { - local char="${1:--}" - local count="${2:-10}" - local out="" - local i - for (( i=0; i/dev/null || hostname 2>/dev/null || printf '%s' "unknown"; } -mq_time() { date '+%Y-%m-%d %H:%M:%S'; } -mq_shell_name() { basename "${SHELL:-shell}"; } -mq_os_name() { uname -s; } -mq_cwd() { pwd; } - -mq_git_repo() { - git rev-parse --show-toplevel >/dev/null 2>&1 || return 0 - basename "$(git rev-parse --show-toplevel 2>/dev/null)" -} - -mq_git_branch() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git branch --show-current 2>/dev/null -} - -mq_git_dirty_state() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then - printf '%s' "DIRTY" - else - printf '%s' "CLEAN" - fi -} - -mq_git_counts() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - - local staged unstaged untracked - staged="$(git diff --cached --name-only 2>/dev/null | wc -l | tr -d ' ')" - unstaged="$(git diff --name-only 2>/dev/null | wc -l | tr -d ' ')" - untracked="$(git ls-files --others --exclude-standard 2>/dev/null | wc -l | tr -d ' ')" - - printf '%s|%s|%s' "$staged" "$unstaged" "$untracked" -} - -mq_git_ahead_behind() { - git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 0 - git rev-parse --abbrev-ref '@{u}' >/dev/null 2>&1 || { - printf '%s' "no-upstream" - return 0 - } - - local counts ahead behind - counts="$(git rev-list --left-right --count HEAD...@{u} 2>/dev/null || true)" - if [[ -n "$counts" ]]; then - ahead="$(printf '%s' "$counts" | awk '{print $1}')" - behind="$(printf '%s' "$counts" | awk '{print $2}')" - printf '↑%s ↓%s' "$ahead" "$behind" - else - printf '%s' "unknown" - fi -} - -mq_memory_widget() { - if command -v vm_stat >/dev/null 2>&1; then - local pages_free pages_active pages_inactive pages_speculative pages_wired total used pct - pages_free="$(vm_stat | awk '/Pages free/ {gsub("\\.","",$3); print $3}')" - pages_active="$(vm_stat | awk '/Pages active/ {gsub("\\.","",$3); print $3}')" - pages_inactive="$(vm_stat | awk '/Pages inactive/ {gsub("\\.","",$3); print $3}')" - pages_speculative="$(vm_stat | awk '/Pages speculative/ {gsub("\\.","",$3); print $3}')" - pages_wired="$(vm_stat | awk '/Pages wired down/ {gsub("\\.","",$4); print $4}')" - - pages_free="${pages_free:-0}" - pages_active="${pages_active:-0}" - pages_inactive="${pages_inactive:-0}" - pages_speculative="${pages_speculative:-0}" - pages_wired="${pages_wired:-0}" - - total=$(( pages_free + pages_active + pages_inactive + pages_speculative + pages_wired )) - used=$(( pages_active + pages_wired )) - - if (( total > 0 )); then - pct=$(( used * 100 / total )) - printf 'MEM %s%%' "$pct" - return - fi - fi - - printf '%s' "MEM N/A" -} - -mq_battery_widget() { - if command -v pmset >/dev/null 2>&1; then - local batt - batt="$(pmset -g batt 2>/dev/null | grep -Eo '[0-9]+%' | head -n 1 || true)" - if [[ -n "$batt" ]]; then - printf 'BAT %s' "$batt" - return - fi - fi - - printf '%s' "BAT N/A" -} - -mq_mode_color() { - local mode="$1" - if [[ "$mode" =~ ERROR|FAIL|OFFLINE ]]; then - printf '%s' "$ACCENT_RED" - elif [[ "$mode" =~ WARN|WARNING ]]; then - printf '%s' "$ACCENT_YELLOW" - elif [[ "$mode" =~ DEV|DEBUG|GIT ]]; then - printf '%s' "$ACCENT_CYAN" - else - printf '%s' "$ACCENT_GREEN" - fi -} - -mq_state_color() { - local state="$1" - if [[ "$state" == "DIRTY" ]]; then - printf '%s' "$ACCENT_RED" - else - printf '%s' "$ACCENT_GREEN" - fi -} - -mq_box_top() { - local title="$1" - local width="$2" - local inner=$(( width - 5 - ${#title} )) - (( inner < 0 )) && inner=0 - printf "┌─ %s %s┐\n" "$title" "$(mq_repeat "─" "$inner")" -} - -mq_box_bottom() { - local width="$1" - printf "└%s┘\n" "$(mq_repeat "─" $(( width - 2 )))" -} - -mq_box_row() { - local left="$1" - local right="$2" - local width="$3" - local inner=$(( width - 4 )) - local left_width=24 - local right_width=$(( inner - left_width - 3 )) - - if (( right_width < 10 )); then - left_width=$(( inner / 2 - 1 )) - right_width=$(( inner - left_width - 3 )) - fi - - left="$(mq_truncate "$left" "$left_width")" - right="$(mq_truncate "$right" "$right_width")" - - printf "│ %s │ %s │\n" \ - "$(mq_pad_right "$left" "$left_width")" \ - "$(mq_pad_right "$right" "$right_width")" -} - -mq_box_single() { - local text="$1" - local width="$2" - local inner=$(( width - 4 )) - text="$(mq_truncate "$text" "$inner")" - printf "│ %s │\n" "$(mq_pad_right "$text" "$inner")" -} - -mq_bar() { - local label="$1" - local value="${2:-0}" - local max="${3:-10}" - local width="${4:-24}" - local color="${5:-$ACCENT_GREEN}" - - local filled empty safe_value i bar="" - safe_value="$value" - (( safe_value < 0 )) && safe_value=0 - (( max < 1 )) && max=1 - - filled=$(( safe_value * width / max )) - (( filled > width )) && filled="$width" - empty=$(( width - filled )) - - for (( i=0; i width )) && filled="$width" - - for (( i=0; i 0 || untracked > 0 )); then - printf '%s' "Review diff, then stage selected files" - elif (( staged > 0 )); then - printf '%s' "Commit staged changes" - else - printf '%s' "Review git status" - fi -} - -mqlaunch_dashboard_v71() { - local title="${1:-MQLAUNCH}" - local subtitle="${2:-Branded Neon Command Surface}" - local mode="${3:-ONLINE}" - - local width compact - local mode_color state_color severity severity_color - local user host now shell_name os_name cwd repo branch dirty counts staged unstaged untracked ahead_behind - local total_changes next_action workspace_summary - local mem_widget batt_widget bar_max - - width="$(mq_term_width)" - compact=0 - (( width < 86 )) && compact=1 - - user="$(mq_user)" - host="$(mq_host)" - now="$(mq_time)" - shell_name="$(mq_shell_name)" - os_name="$(mq_os_name)" - cwd="$(mq_cwd)" - repo="$(mq_git_repo)" - branch="$(mq_git_branch)" - dirty="$(mq_git_dirty_state)" - counts="$(mq_git_counts)" - staged="$(printf '%s' "$counts" | cut -d'|' -f1)" - unstaged="$(printf '%s' "$counts" | cut -d'|' -f2)" - untracked="$(printf '%s' "$counts" | cut -d'|' -f3)" - ahead_behind="$(mq_git_ahead_behind)" - mem_widget="$(mq_memory_widget)" - batt_widget="$(mq_battery_widget)" - - [[ -z "$staged" ]] && staged=0 - [[ -z "$unstaged" ]] && unstaged=0 - [[ -z "$untracked" ]] && untracked=0 - - bar_max=$(( staged + unstaged + untracked )) - (( bar_max < 5 )) && bar_max=5 - total_changes=$(( staged + unstaged + untracked )) - - severity="$(mq_dirty_severity "$staged" "$unstaged" "$untracked")" - severity_color="$(mq_dirty_severity_color "$severity")" - next_action="$(mq_git_next_action "$staged" "$unstaged" "$untracked" "$ahead_behind")" - - mode_color="$(mq_mode_color "$mode")" - state_color="$(mq_state_color "$dirty")" - - clear 2>/dev/null || true - - echo -e "${ACCENT_CYAN}${ACCENT_DIM}::: PHOSPHOR GRID ACTIVE :::::::::::::::::::::::::::::::::::::::::::::::::::::::::${C_RESET}" - echo -e "${MQ_PINK}${C_BOLD}███╗ ███╗ ██████╗ ${LAUNCH_PINK}██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗${C_RESET}" - echo -e "${MQ_PINK}${C_BOLD}████╗ ████║██╔═══██╗${LAUNCH_PINK}██║ ██╔══██╗██║ ██║████╗ ██║██╔════╝██║ ██║${C_RESET}" - echo -e "${MQ_PINK}${C_BOLD}██╔████╔██║██║ ██║${LAUNCH_PINK}██║ ███████║██║ ██║██╔██╗ ██║██║ ███████║${C_RESET}" - echo -e "${MQ_PINK}${C_BOLD}██║╚██╔╝██║██║▄▄ ██║${LAUNCH_PINK}██║ ██╔══██║██║ ██║██║╚██╗██║██║ ██╔══██║${C_RESET}" - echo -e "${MQ_PINK}${C_BOLD}██║ ╚═╝ ██║╚██████╔╝${LAUNCH_PINK}███████╗██║ ██║╚██████╔╝██║ ╚████║╚██████╗██║ ██║${C_RESET}" - echo -e "${MQ_PINK}${C_BOLD}╚═╝ ╚═╝ ╚══▀▀═╝ ${LAUNCH_PINK}╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝${C_RESET}" - echo -e "${ACCENT_CYAN}${C_BOLD}$(mq_repeat "═" "$width")${C_RESET}" - echo -e "${MQ_PINK}${C_BOLD}MQ${C_RESET}${LAUNCH_PINK}${C_BOLD}LAUNCH${C_RESET} ${C_DIM}// ${subtitle}${C_RESET}" - echo -e "${mode_color}${C_BOLD}MODE: ${mode}${C_RESET} ${state_color}${C_BOLD}STATE: ${dirty:-N/A}${C_RESET} ${severity_color}${C_BOLD}SEVERITY: ${severity}${C_RESET}" - echo -e "${ACCENT_YELLOW}${C_BOLD}${mem_widget}${C_RESET} ${ACCENT_CYAN}${C_BOLD}${batt_widget}${C_RESET} ${C_DIM}adaptive layout active${C_RESET}" - echo - - mq_box_top "SYSTEM" "$width" - if (( compact == 1 )); then - mq_box_single "USER ${user}" "$width" - mq_box_single "HOST ${host}" "$width" - mq_box_single "TIME ${now}" "$width" - mq_box_single "SHELL ${shell_name}" "$width" - mq_box_single "OS ${os_name}" "$width" - mq_box_single "PATH ${cwd}" "$width" - else - mq_box_row "USER ${user}" "HOST ${host}" "$width" - mq_box_row "TIME ${now}" "SHELL ${shell_name}" "$width" - mq_box_row "OS ${os_name}" "PATH ${cwd}" "$width" - fi - mq_box_bottom "$width" - echo - - if (( total_changes == 0 )); then - mq_box_top "WORKSPACE" "$width" - if (( compact == 1 )); then - mq_box_single "REPO ${repo:-N/A}" "$width" - mq_box_single "BRANCH ${branch:-N/A}" "$width" - mq_box_single "GIT clean UPSTREAM ${ahead_behind:-N/A}" "$width" - mq_box_single "NEXT ${next_action}" "$width" - else - workspace_summary="Repo ${repo:-N/A} Branch ${branch:-N/A} Git clean Upstream ${ahead_behind:-N/A}" - mq_box_single "$workspace_summary" "$width" - mq_box_single "Next ${next_action}" "$width" - fi - else - mq_box_top "GIT ACTION" "$width" - if (( compact == 1 )); then - mq_box_single "REPO ${repo:-N/A}" "$width" - mq_box_single "BRANCH ${branch:-N/A}" "$width" - mq_box_single "DIRTY ${total_changes} files UPSTREAM ${ahead_behind:-N/A}" "$width" - mq_box_single "$(mq_bar "STAGED " "$staged" "$bar_max" 18 "$ACCENT_GREEN")" "$width" - mq_box_single "$(mq_bar "UNSTAGED" "$unstaged" "$bar_max" 18 "$ACCENT_YELLOW")" "$width" - mq_box_single "$(mq_bar "UNTRACK " "$untracked" "$bar_max" 18 "$ACCENT_RED")" "$width" - mq_box_single "NEXT ${next_action}" "$width" - else - mq_box_row "REPO ${repo:-N/A}" "BRANCH ${branch:-N/A}" "$width" - mq_box_row "DIRTY ${total_changes} files" "UPSTREAM ${ahead_behind:-N/A}" "$width" - mq_box_single "$(mq_bar "STAGED " "$staged" "$bar_max" 34 "$ACCENT_GREEN")" "$width" - mq_box_single "$(mq_bar "UNSTAGED" "$unstaged" "$bar_max" 34 "$ACCENT_YELLOW")" "$width" - mq_box_single "$(mq_bar "UNTRACK " "$untracked" "$bar_max" 34 "$ACCENT_RED")" "$width" - mq_box_single "NEXT ${next_action}" "$width" - fi - fi - mq_box_bottom "$width" - echo - - mq_box_top "LIVE SHORTCUTS" "$width" - if [[ "$mode" =~ GIT ]]; then - if (( compact == 1 )); then - mq_box_single "git status / git pull --rebase / git push" "$width" - mq_box_single "mqlaunch workflows / mqlaunch system / mqlaunch git" "$width" - mq_box_single "Try: mqlaunch system check / release notes / git" "$width" - else - mq_box_row "git status / git pull --rebase" "git push / git fetch --all" "$width" - mq_box_row "mqlaunch workflows / system / git" "mqlaunch release / dev / help" "$width" - mq_box_row "Try: mqlaunch system check" "Try: mqlaunch release notes" "$width" - fi - elif [[ "$mode" =~ DEV ]]; then - if (( compact == 1 )); then - mq_box_single "mqlaunch workflows / mqlaunch system / mqlaunch git" "$width" - mq_box_single "mqlaunch release / mqlaunch dev / mqlaunch help" "$width" - mq_box_single "Try: mqlaunch system check / release notes / git" "$width" - else - mq_box_row "mqlaunch workflows / system / git" "mqlaunch release / dev / help" "$width" - mq_box_row "Try: mqlaunch system check" "Try: mqlaunch release notes" "$width" - mq_box_row "Try: mqlaunch git" "direct command mode enabled" "$width" - fi - else - if (( compact == 1 )); then - mq_box_single "mqlaunch workflows / mqlaunch system / mqlaunch git" "$width" - mq_box_single "mqlaunch release / mqlaunch dev / mqlaunch help" "$width" - mq_box_single "Try: mqlaunch system check / release notes / git" "$width" - else - mq_box_row "mqlaunch workflows / system / git" "mqlaunch release / dev / help" "$width" - mq_box_row "Try: mqlaunch system check" "Try: mqlaunch release notes" "$width" - mq_box_row "Try: mqlaunch git" "direct command mode enabled" "$width" - fi - fi - mq_box_bottom "$width" - echo - - local ready_text ready_pad - ready_text=" READY // polished branded command surface stable" - ready_pad=$(( width - 2 - ${#ready_text} )) - (( ready_pad < 0 )) && ready_pad=0 - - echo -e "${ACCENT_CYAN}${C_BOLD}╔$(mq_repeat "═" $(( width - 2 )))╗${C_RESET}" - printf "%b║%b %bREADY%b %b// polished branded command surface stable%b" \ - "$ACCENT_CYAN$C_BOLD" \ - "$C_RESET" \ - "$ACCENT_GREEN$C_BOLD" \ - "$C_RESET" \ - "$C_DIM" \ - "$C_RESET" - printf "%s%b║%b\n" \ - "$(mq_repeat " " "$ready_pad")" \ - "$ACCENT_CYAN$C_BOLD" \ - "$C_RESET" - echo -e "${ACCENT_CYAN}${C_BOLD}╚$(mq_repeat "═" $(( width - 2 )))╝${C_RESET}" -} - -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - mqlaunch_dashboard_v71 "$@" -fi diff --git a/backups/scripts/20260509-030842/ui/dashboards/mq-dashboard.sh b/backups/scripts/20260509-030842/ui/dashboards/mq-dashboard.sh deleted file mode 100755 index 07bc0e4..0000000 --- a/backups/scripts/20260509-030842/ui/dashboards/mq-dashboard.sh +++ /dev/null @@ -1,322 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" - -APP_TITLE="MQ Dashboard" -APP_SUBTITLE="Project Status Console" -APP_AUTHOR="Author Mattias Camner" -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - # shellcheck disable=SC1090 - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -MQ_SCRIPT="$BASE_DIR/terminal/launchers/mqlaunch.sh" -MACOS_TWEAKS="$BASE_DIR/system/tweaks/macos-tweaks.sh" -TERMINAL_TWEAKS="$BASE_DIR/terminal/tweaks.sh" -SYSTEM_CHECK="$BASE_DIR/tools/scripts/system-check.sh" -GUIDE_HTML="$BASE_DIR/tools/mac-terminal-guide/mac-terminal-guide.html" -GUIDE_URL="https://mcamner.github.io/macos-scripts/" -DOCS_DIR="$BASE_DIR/docs" - -MACOS_TWEAKS_BACKUP="${HOME}/.macos-tweaks-backup" -TERMINAL_TWEAKS_BACKUP="${HOME}/.terminal-tweaks-backup" - -status_word() { - local path="$1" - if [[ -e "$path" ]]; then - printf "OK" - else - printf "MISSING" - fi -} - -status_exec_word() { - local path="$1" - if [[ -x "$path" ]]; then - printf "OK" - elif [[ -e "$path" ]]; then - printf "FOUND" - else - printf "MISSING" - fi -} - -tool_word() { - local tool="$1" - if command -v "$tool" >/dev/null 2>&1; then - printf "INSTALLED" - else - printf "NOT FOUND" - fi -} - -latest_backup_dir() { - local dir="$1" - ls -td "$dir"/* 2>/dev/null | head -n 1 || true -} - -shorten_path() { - local p="$1" - local max="${2:-58}" - if [[ ${#p} -le $max ]]; then - printf "%s" "$p" - else - printf "...%s" "${p: -$((max-3))}" - fi -} - -git_branch() { - git -C "$BASE_DIR" rev-parse --abbrev-ref HEAD 2>/dev/null || printf "-" -} - -git_short_status_count() { - git -C "$BASE_DIR" status --short 2>/dev/null | wc -l | tr -d ' ' -} - -git_dirty_word() { - local count - count="$(git_short_status_count)" - if [[ "$count" == "0" ]]; then - printf "CLEAN" - else - printf "DIRTY (%s)" "$count" - fi -} - -git_last_commit() { - git -C "$BASE_DIR" log -1 --pretty=format:'%h %s' 2>/dev/null || printf "-" -} - -git_remote_url() { - git -C "$BASE_DIR" remote get-url origin 2>/dev/null || printf "-" -} - -show_dashboard() { - local mq_status tweaks_status terminal_tweaks_status ui_status system_check_status guide_status docs_status - local eza_status bat_status fd_status rg_status jq_status zoxide_status gh_status btop_status - local latest_macos_backup latest_terminal_backup - local mq_cmd host_name branch dirty last_commit remote_url - - mq_status="$(status_exec_word "$MQ_SCRIPT")" - tweaks_status="$(status_exec_word "$MACOS_TWEAKS")" - terminal_tweaks_status="$(status_exec_word "$TERMINAL_TWEAKS")" - ui_status="$(status_exec_word "$UI_LIB")" - system_check_status="$(status_exec_word "$SYSTEM_CHECK")" - guide_status="$(status_word "$GUIDE_HTML")" - docs_status="$(status_word "$DOCS_DIR")" - - eza_status="$(tool_word eza)" - bat_status="$(tool_word bat)" - fd_status="$(tool_word fd)" - rg_status="$(tool_word rg)" - jq_status="$(tool_word jq)" - zoxide_status="$(tool_word zoxide)" - gh_status="$(tool_word gh)" - btop_status="$(tool_word btop)" - - latest_macos_backup="$(latest_backup_dir "$MACOS_TWEAKS_BACKUP")" - latest_terminal_backup="$(latest_backup_dir "$TERMINAL_TWEAKS_BACKUP")" - - mq_cmd="$(command -v mqlaunch 2>/dev/null || printf "-")" - host_name="$(hostname -s 2>/dev/null || hostname)" - branch="$(git_branch)" - dirty="$(git_dirty_word)" - last_commit="$(git_last_commit)" - remote_url="$(git_remote_url)" - - print_header - row_bold "PROJECT DASHBOARD" - empty_row - - row "PROJECT" - row2 " Repo: $(shorten_path "$BASE_DIR" 34)" " Branch: $branch" - row2 " Repo state: $dirty" " mqlaunch cmd: $(shorten_path "$mq_cmd" 24)" - row " Last commit: $(shorten_path "$last_commit" 78)" - row " Remote: $(shorten_path "$remote_url" 82)" - - empty_row - row "CORE FILES" - row2 " mqlaunch.sh: $mq_status" " macos-tweaks.sh: $tweaks_status" - row2 " terminal/tweaks.sh: $terminal_tweaks_status" " mq-ui.sh: $ui_status" - row2 " system-check.sh: $system_check_status" " terminal guide: $guide_status" - row2 " docs/: $docs_status" " host: $host_name" - - empty_row - row "TOOLS" - row2 " eza: $eza_status" " bat: $bat_status" - row2 " fd: $fd_status" " ripgrep: $rg_status" - row2 " jq: $jq_status" " zoxide: $zoxide_status" - row2 " gh: $gh_status" " btop: $btop_status" - - empty_row - row "BACKUPS" - row " macOS tweaks latest: $(shorten_path "${latest_macos_backup:-NONE}" 66)" - row " terminal tweaks latest: $(shorten_path "${latest_terminal_backup:-NONE}" 63)" - - empty_row - row "PATHS" - row " Guide URL: $GUIDE_URL" - row " UI Lib: $(shorten_path "$UI_LIB" 74)" - - print_footer -} - -open_repo_folder() { - if [[ -d "$BASE_DIR" ]]; then - open "$BASE_DIR" - else - ui_err "Base directory missing: $BASE_DIR" - pause_enter - fi -} - -open_ui_folder() { - if [[ -d "$BASE_DIR/ui" ]]; then - open "$BASE_DIR/ui" - else - ui_err "UI directory missing." - pause_enter - fi -} - -open_dashboards_folder() { - if [[ -d "$BASE_DIR/ui/dashboards" ]]; then - open "$BASE_DIR/ui/dashboards" - else - ui_err "Dashboards directory missing." - pause_enter - fi -} - -open_docs_site() { - open "$GUIDE_URL" -} - -run_system_check_screen() { - if [[ -x "$SYSTEM_CHECK" ]]; then - "$SYSTEM_CHECK" - elif [[ -x "$MQ_SCRIPT" ]]; then - bash "$MQ_SCRIPT" check - else - ui_err "No runnable system check found." - pause_enter - fi -} - -show_git_changes_screen() { - print_header - row_bold "GIT CHANGES" - empty_row - - if [[ -d "$BASE_DIR/.git" ]]; then - git -C "$BASE_DIR" status --short --branch || true - else - row "Not a git repository:" - row " $BASE_DIR" - fi - - print_footer - pause_enter -} - -interactive_menu() { - local choice - - while true; do - show_dashboard - echo - row "MENU" - row2 " 1. Refresh dashboard" " 2. Show git changes" - row2 " 3. Run system check" " 4. Open repo folder" - row2 " 5. Open UI folder" " 6. Open dashboards folder" - row2 " 7. Open project page" " 0. Exit" - print_footer - read_menu_choice "Select option [0-7] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) - ;; - 2) - show_git_changes_screen - ;; - 3) - run_system_check_screen - ;; - 4) - open_repo_folder - ;; - 5) - open_ui_folder - ;; - 6) - open_dashboards_folder - ;; - 7) - open_docs_site - ;; - 0) - ui_ok "Exiting." - break - ;; - *) - ui_err "Invalid option." - pause_enter - ;; - esac - done -} - -usage() { - cat <&2 - exit 1 -fi - -show_demo() { - print_header - row_bold "MQ UI DEMO" - empty_row - - row "Detta är en demo av det delade UI-lagret." - row "Filen mq-ui.sh gör inget själv — den används av andra script." - empty_row - - row "EXEMPEL PÅ KOMPONENTER" - row2 " row()" " en enkel rad" - row2 " row2()" " två kolumner" - row3 " row3()" " tre kolumner" " meny-layout" - empty_row - - row "STATUS" - row2 " UI library" " OK" - row2 " Terminal launcher" " MQ style" - row2 " Tweaks module" " Shared UI" - empty_row - - row "MENU" - row2 " 1. Refresh demo" " 2. Show paths" - row2 " 0. Exit" "" - - print_footer -} - -show_paths() { - print_header - row_bold "PATHS" - empty_row - row "BASE_DIR:" - row " $BASE_DIR" - empty_row - row "UI_LIB:" - row " $UI_LIB" - print_footer - pause_enter -} - -main() { - local choice - - while true; do - show_demo - read_menu_choice "Select option [0-2] > " || return - choice="$REPLY" - echo - - case "$choice" in - 1) ;; - 2) show_paths ;; - 0) ui_ok "Exiting."; break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -main diff --git a/backups/scripts/20260509-030842/ui/terminal-ui/mq-ui.sh b/backups/scripts/20260509-030842/ui/terminal-ui/mq-ui.sh deleted file mode 100644 index e57ad22..0000000 --- a/backups/scripts/20260509-030842/ui/terminal-ui/mq-ui.sh +++ /dev/null @@ -1,344 +0,0 @@ -#!/usr/bin/env bash - -# Shared terminal UI helpers for macos-scripts -# Intended to be sourced from bash or zsh scripts. - -# ------------------------------------------------------------ -# Defaults -# ------------------------------------------------------------ -: "${APP_TITLE:=MQLaunch}" -: "${APP_SUBTITLE:=Terminal Utility}" -: "${APP_AUTHOR:=Author Mattias Camner}" -: "${BOX_INNER:=88}" -: "${MQ_THEME_FILE:=$HOME/.mq-theme}" - -# ------------------------------------------------------------ -# Optional theme file -# ------------------------------------------------------------ -if [[ -f "$MQ_THEME_FILE" ]]; then - # shellcheck disable=SC1090 - source "$MQ_THEME_FILE" -fi - -# ------------------------------------------------------------ -# ANSI colors -# ------------------------------------------------------------ -if [[ -t 1 ]]; then - _MQ_DEFAULT_RESET=$'\033[0m' - _MQ_DEFAULT_TITLE=$'\033[1;33m' - _MQ_DEFAULT_ERR=$'\033[0;31m' - _MQ_DEFAULT_OK=$'\033[0;32m' - _MQ_DEFAULT_WARN=$'\033[0;33m' - _MQ_DEFAULT_INFO=$'\033[0;34m' - _MQ_DEFAULT_BOLD=$'\033[1m' - - C_RESET="${MQ_COLOR_RESET:-$_MQ_DEFAULT_RESET}" - C_TITLE="${MQ_COLOR_TITLE:-$_MQ_DEFAULT_TITLE}" - C_ERR="${MQ_COLOR_ERR:-$_MQ_DEFAULT_ERR}" - C_OK="${MQ_COLOR_OK:-$_MQ_DEFAULT_OK}" - C_WARN="${MQ_COLOR_WARN:-$_MQ_DEFAULT_WARN}" - C_INFO="${MQ_COLOR_INFO:-$_MQ_DEFAULT_INFO}" - C_BOLD="${MQ_COLOR_BOLD:-$_MQ_DEFAULT_BOLD}" -else - C_RESET='' - C_TITLE='' - C_ERR='' - C_OK='' - C_WARN='' - C_INFO='' - C_BOLD='' -fi - -# ------------------------------------------------------------ -# Command Surface (v3) styling -# ------------------------------------------------------------ -surface_terminal_width() { - local cols width - cols="$(tput cols 2>/dev/null || true)" - [[ "$cols" =~ ^[0-9]+$ ]] || cols="${BOX_INNER:-92}" - - width="$cols" - (( width > 112 )) && width=112 - (( width < 60 )) && width=60 - printf "%s" "$width" -} - -surface_visible_len() { - local esc stripped - esc="$(printf '\033')" - stripped="$(printf '%s' "$1" | sed "s/${esc}\[[0-9;]*[mKHJsu]//g")" - printf '%d' "${#stripped}" -} - -surface_pad() { - local text="$1" - local width="$2" - local visible pad - visible="$(surface_visible_len "$text")" - pad=$(( width - visible )) - (( pad < 0 )) && pad=0 - printf "%s%*s" "$text" "$pad" "" -} - -surface_top() { - local title="$1" - local width="$2" - local color="$3" - local fill=$(( width - 5 - ${#title} )) - (( fill < 0 )) && fill=0 - printf "%b┌─ %s %s┐%b\n" "$color" "$title" "$(repeat_char "$fill" "─")" "$C_RESET" -} - -surface_bottom() { - local width="$1" - local color="$2" - printf "%b└%s┘%b\n" "$color" "$(repeat_char $(( width - 2 )) "─")" "$C_RESET" -} - -surface_row() { - local text="$1" - local width="$2" - local color="$3" - local inner=$(( width - 4 )) - printf "%b│ %s │%b\n" "$color" "$(surface_pad "$text" "$inner")" "$C_RESET" -} - -surface_split_row() { - local left="$1" - local right="$2" - local width="$3" - local color="$4" - local inner left_width right_width - inner=$(( width - 4 )) - left_width=$(( inner / 2 )) - right_width=$(( inner - left_width - 1 )) - printf "%b│ %s %s │%b\n" \ - "$color" \ - "$(surface_pad "$left" "$left_width")" \ - "$(surface_pad "$right" "$right_width")" \ - "$C_RESET" -} - -surface_git_state() { - local count - count="$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')" - - if [[ -z "$count" || "$count" == "0" ]]; then - printf "Clean" - else - printf "Dirty (%s)" "$count" - fi -} - -surface_panel_color() { - if [[ -t 1 ]]; then - printf '\033[0;37m' - fi -} - -surface_panel_header() { - local title="$1" - local mode="${2:-$1}" - local width="$3" - local color="$4" - local host user git_state - - host="$(hostname -s 2>/dev/null || echo unknown)" - user="${USER:-unknown}" - git_state="$(surface_git_state)" - - surface_top "$title" "$width" "$color" - surface_row "Host: $host User: $user Mode: $mode Git: $git_state" "$width" "$color" - surface_row "" "$width" "$color" -} - -# ------------------------------------------------------------ -# Helpers -# ------------------------------------------------------------ -repeat_char() { - local count="$1" - local char="$2" - printf '%*s' "$count" '' | tr ' ' "$char" -} - -border() { - printf '%s\n' "$(repeat_char "$BOX_INNER" "-")" -} - -row() { - local text="$1" - printf "%-*.*s\n" "$BOX_INNER" "$BOX_INNER" "$text" -} - -row_bold() { - local text="$1" - printf "${C_BOLD}%-*.*s${C_RESET}\n" "$BOX_INNER" "$BOX_INNER" "$text" -} - -row_menu_title() { - local text="$1" - if [[ -t 1 ]]; then - printf "\033[1m%-*.*s\033[0m\n" "$BOX_INNER" "$BOX_INNER" "$text" - else - row "$text" - fi -} - -row2() { - local c1="$1" - local c2="$2" - row "$(printf '%-40s %-40s' "$c1" "$c2")" -} - -row3() { - local c1="$1" - local c2="$2" - local c3="$3" - row "$(printf '%-26s %-26s %-26s' "$c1" "$c2" "$c3")" -} - -empty_row() { - printf '\n' -} - -header_dual_row() { - local left="$1" - local right="$2" - printf "%-54s %33s\n" "$left" "$right" -} - -pause_enter() { - echo - printf 'Press Enter to continue...' - read -r _ -} - -read_prompt() { - local color_prompt="$1" - local plain_prompt="${2:-$1}" - - REPLY="" - if [[ -n "${ZSH_VERSION:-}" && -t 0 && -t 1 ]]; then - vared -p "$plain_prompt" -c REPLY - else - printf "%b" "$color_prompt" - IFS= read -r REPLY - fi -} - -read_menu_choice() { - local raw_prompt="$1" - local label="${2:-mqlaunch}" - local sep_width hint sep - - sep_width="${BOX_INNER:-88}" - sep="$(repeat_char "$sep_width" "─")" - - hint="$(printf '%s' "$raw_prompt" | grep -oE '\[[^]]+\]' | head -1)" - [[ -z "$hint" ]] && hint="option" - - printf "\n%b%s%b\n" "${C_TITLE:-}" "$sep" "${C_RESET:-}" - printf "%b%s > %b\n" "${C_TITLE:-}" "$label" "${C_RESET:-}" - printf "%b%s%b\n" "${C_TITLE:-}" "$sep" "${C_RESET:-}" - printf "%b>> %s%b\n" "${C_DIM:-}" "$hint" "${C_RESET:-}" - printf "\033[3A\r" - printf "%b%s > %b" "${C_TITLE:-}" "$label" "${C_RESET:-}" - - REPLY="" - if [[ -n "${ZSH_VERSION:-}" && -t 0 && -t 1 ]]; then - vared -p "" -c REPLY - printf "\033[2B\r\n" - else - IFS= read -r REPLY - printf "\033[2B\r\n" - fi -} - -set_terminal_title() { - printf '\033]0;%s — %s\007' "$APP_TITLE" "$APP_SUBTITLE" -} - -clear_screen() { - if command -v tput >/dev/null 2>&1 && [[ -n "${TERM:-}" ]]; then - tput clear 2>/dev/null || printf '\033[H\033[2J' - else - printf '\033[H\033[2J' - fi - set_terminal_title -} - -short_host() { - hostname -s 2>/dev/null || hostname -} - -get_nickname() { - if [[ -f "$HOME/.mqlaunch_nickname" ]]; then - cat "$HOME/.mqlaunch_nickname" - else - echo "${USER:-Användare}" - fi -} - -print_header() { - local dashboard nickname - - if [[ "${MQ_USE_DASHBOARD_HEADER:-0}" == "1" ]]; then - dashboard="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}/ui/ascii/mqlaunch-dashboard-v7.1.sh" - if [[ -f "$dashboard" ]]; then - bash "$dashboard" "$APP_TITLE" "$APP_SUBTITLE" "ONLINE" - printf '\n' - return - fi - fi - - nickname="$(get_nickname)" - - clear_screen - border - header_dual_row "$APP_TITLE" " .-." - header_dual_row "$APP_SUBTITLE" " (o o)" - header_dual_row "$APP_AUTHOR" " | O \\" - header_dual_row "Hej, $nickname!" " \\ \\" - header_dual_row "" " \`~~~'" - border -} - -print_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="${USER:-unknown}" - - printf '\n' - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" -} - -print_main_footer() { - local now host user_name - now="$(date '+%Y-%m-%d %H:%M:%S')" - host="$(short_host)" - user_name="${USER:-unknown}" - - printf '\n' - row "Host: ${host} User: ${user_name}" - row "Time: ${now}" - row "X. Exit launcher" - border -} - -ui_ok() { - printf "%b%s%b\n" "$C_OK" "$1" "$C_RESET" -} - -ui_warn() { - printf "%b%s%b\n" "$C_WARN" "$1" "$C_RESET" -} - -ui_err() { - printf "%b%s%b\n" "$C_ERR" "$1" "$C_RESET" >&2 -} - -ui_info() { - printf "%b%s%b\n" "$C_INFO" "$1" "$C_RESET" -} diff --git a/backups/scripts/20260514-010651/terminal/dev/mq-create-repo.sh b/backups/scripts/20260514-010651/terminal/dev/mq-create-repo.sh deleted file mode 100755 index 511e0f4..0000000 --- a/backups/scripts/20260514-010651/terminal/dev/mq-create-repo.sh +++ /dev/null @@ -1,229 +0,0 @@ -#!/usr/bin/env bash -set -u - -DEFAULT_ROOT="/Users/mansys" -DEFAULT_OWNER="MCamner" - -hr() { - printf '%s\n' "────────────────────────────────────────────────────────────" -} - -pause() { - printf '\nPress Enter to continue...' - read -r _ -} - -fail() { - echo "✖ $1" - exit 1 -} - -safe_repo_name() { - basename "$1" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd 'a-z0-9._-' -} - -echo -echo "CREATE REPO" -hr -echo "Create or connect a local folder to a GitHub repository." -echo - -printf "Local folder under %s: " "$DEFAULT_ROOT/" -read -r INPUT_PATH - -[ -n "$INPUT_PATH" ] || fail "No folder path provided." - -case "$INPUT_PATH" in - "$DEFAULT_ROOT"/*) - LOCAL_PATH="$INPUT_PATH" - ;; - /*) - fail "Path must be under $DEFAULT_ROOT" - ;; - *) - LOCAL_PATH="$DEFAULT_ROOT/$INPUT_PATH" - ;; -esac - -LOCAL_PATH="${LOCAL_PATH%/}" - -[ -d "$LOCAL_PATH" ] || fail "Folder does not exist: $LOCAL_PATH" - -REPO_NAME="$(safe_repo_name "$LOCAL_PATH")" -[ -n "$REPO_NAME" ] || fail "Could not derive repo name from folder." - -echo -printf "GitHub owner [%s]: " "$DEFAULT_OWNER" -read -r OWNER -OWNER="${OWNER:-$DEFAULT_OWNER}" - -printf "GitHub repo name [%s]: " "$REPO_NAME" -read -r INPUT_REPO_NAME -REPO_NAME="${INPUT_REPO_NAME:-$REPO_NAME}" - -printf "Visibility public/private [public]: " -read -r VISIBILITY -VISIBILITY="${VISIBILITY:-public}" - -case "$VISIBILITY" in - public|private) - ;; - *) - fail "Visibility must be public or private." - ;; -esac - -FULL_REPO="$OWNER/$REPO_NAME" - -echo -echo "SUMMARY" -hr -echo "Local path: $LOCAL_PATH" -echo "GitHub repo: $FULL_REPO" -echo "Visibility: $VISIBILITY" -echo - -printf "Continue and create/connect repo? [y/N]: " -read -r CONFIRM - -case "$CONFIRM" in - y|Y|yes|YES) - ;; - *) - echo "Cancelled." - exit 0 - ;; -esac - -command -v git >/dev/null 2>&1 || fail "git not found." -command -v gh >/dev/null 2>&1 || fail "GitHub CLI 'gh' not found." - -if ! gh auth status >/dev/null 2>&1; then - fail "gh is not authenticated. Run: gh auth login" -fi - -cd "$LOCAL_PATH" || fail "Could not cd to $LOCAL_PATH" - -echo -echo "PREPARE FILES" -hr - -if [ ! -f ".gitignore" ]; then - cat > .gitignore <<'GITIGNORE' -# macOS -.DS_Store - -# Python -__pycache__/ -*.pyc -.venv/ -venv/ -.env - -# Node -node_modules/ -npm-debug.log* - -# Secrets / local config -*.key -*.pem -*.p12 -*.pfx -.env.local -secrets.* -settings.local.json -.claude/settings.local.json - -# Logs -*.log -logs/ -GITIGNORE - echo "✔ Created .gitignore" -else - echo "✔ .gitignore exists" -fi - -if [ ! -f "README.md" ]; then - cat > README.md </dev/null 2>&1; then - echo "✔ GitHub repo already exists: $FULL_REPO" - - if git remote get-url origin >/dev/null 2>&1; then - git remote set-url origin "$REMOTE_URL" - else - git remote add origin "$REMOTE_URL" - fi - - git push -u origin main -else - if [ "$VISIBILITY" = "private" ]; then - gh repo create "$FULL_REPO" \ - --private \ - --source=. \ - --remote=origin \ - --push - else - gh repo create "$FULL_REPO" \ - --public \ - --source=. \ - --remote=origin \ - --push - fi -fi - -echo -echo "DONE" -hr -echo "✔ Repo connected: $FULL_REPO" -echo "✔ Local path: $LOCAL_PATH" -echo - -if command -v repo-signal >/dev/null 2>&1; then - echo "REPO SIGNAL" - hr - repo-signal publish-checklist . -fi diff --git a/backups/scripts/20260514-010651/terminal/menus/mq-themes-menu.sh b/backups/scripts/20260514-010651/terminal/menus/mq-themes-menu.sh deleted file mode 100755 index e14a57e..0000000 --- a/backups/scripts/20260514-010651/terminal/menus/mq-themes-menu.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -BASE_DIR="${HOME}/macos-scripts" -UI_LIB="$BASE_DIR/ui/terminal-ui/mq-ui.sh" -THEME_SCRIPT="$BASE_DIR/terminal/themes/mq-zsh-theme-switcher.sh" - -# shellcheck disable=SC2034 -APP_TITLE="MQ Themes" -# shellcheck disable=SC2034 -APP_SUBTITLE="Theme Switcher" -# shellcheck disable=SC2034 -APP_AUTHOR="Author Mattias Camner" -# shellcheck disable=SC2034 -BOX_INNER=88 - -if [[ -f "$UI_LIB" ]]; then - # shellcheck disable=SC1090 - source "$UI_LIB" -else - echo "Missing UI library: $UI_LIB" >&2 - exit 1 -fi - -# Runs theme command. -theme_cmd() { - local cmd="${1:-current}" - shift || true - - if [[ -x "$THEME_SCRIPT" ]]; then - bash "$THEME_SCRIPT" "$cmd" "$@" - elif [[ -f "$THEME_SCRIPT" ]]; then - chmod +x "$THEME_SCRIPT" 2>/dev/null || true - bash "$THEME_SCRIPT" "$cmd" "$@" - else - print_header - row_bold "THEME SWITCHER" - empty_row - row "Theme switcher script missing:" - row " $THEME_SCRIPT" - print_footer - pause_enter - return 1 - fi -} - -# Prints themes menu. -print_themes_menu() { - local width color - width="$(surface_terminal_width)" - color="$(surface_panel_color)" - - print_header - surface_panel_header "Themes" "Themes" "$width" "$color" - surface_split_row " 1. Current theme" " 2. Apply amber" "$width" "$color" - surface_split_row " 3. Apply green" " 4. Apply minimal" "$width" "$color" - surface_split_row " 5. Apply ice" " 6. Apply macos" "$width" "$color" - surface_split_row " 7. Reset theme" " b. Back" "$width" "$color" - surface_row "" "$width" "$color" - surface_bottom "$width" "$color" - printf '\n' -} - -# Handles themes menu loop. -themes_menu_loop() { - local choice - - while true; do - print_themes_menu - read_menu_choice "Select theme option [1-7,b] > " "themes" || return - choice="$REPLY" - echo - - case "$choice" in - 1) theme_cmd current; pause_enter ;; - 2) theme_cmd apply amber ;; - 3) theme_cmd apply green ;; - 4) theme_cmd apply minimal ;; - 5) theme_cmd apply ice ;; - 6) theme_cmd apply macos ;; - 7) theme_cmd reset ;; - b|B|0) break ;; - *) ui_err "Invalid option."; pause_enter ;; - esac - done -} - -main() { - themes_menu_loop -} - -main "$@" diff --git a/backups/scripts/20260514-010651/tools/scripts/ask.sh b/backups/scripts/20260514-010651/tools/scripts/ask.sh deleted file mode 100755 index 73f7696..0000000 --- a/backups/scripts/20260514-010651/tools/scripts/ask.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -source ~/.env 2>/dev/null || true -source "$BASE_DIR/.env" 2>/dev/null || true - -VECTOR_STORE_ID="${MQ_REPO_VECTOR_STORE_ID:-${OPENAI_VECTOR_STORE_ID:-vs_69f93de12f508191bd6a36ea3b825beb}}" - -PROMPT_BUILDER="${REPO_SIGNAL_PROMPT_BUILDER:-$HOME/repo-signal/tools/build_prompt.py}" - -build_ai_prompt() { - local question="$1" - local prompt - - if [[ -x "$PROMPT_BUILDER" ]]; then - if prompt="$(python3 "$PROMPT_BUILDER" --raw "$question" 2>/dev/null)" && [[ -n "$prompt" ]]; then - printf '%s\n' "$prompt" - return 0 - fi - fi - - printf '%s\n' "$question" -} - -if [[ $# -eq 0 ]]; then - cat <" - mqlaunch ask quick "" - -Examples: - mqlaunch ask "Vad gör doctor.sh?" - mqlaunch ask "Hur fungerar command routing i mqlaunch?" - mqlaunch ask quick "Hur dödar jag en process på macOS?" - -Memory: - MQ_REPO_VECTOR_STORE_ID="$VECTOR_STORE_ID" -HELP - exit 0 -fi - -if [[ -z "${OPENAI_API_KEY:-}" ]]; then - echo "OPENAI_API_KEY is not set. Add it to ~/.env or $BASE_DIR/.env." - exit 1 -fi - -if ! command -v jq >/dev/null 2>&1; then - echo "jq is required for mqlaunch ask." - exit 1 -fi - -if [[ "${1:-}" == "quick" ]]; then - shift - QUESTION="$*" - PAYLOAD="$(jq -n --arg q "$QUESTION" '{ - model: "gpt-4.1-mini", - input: ("Answer briefly and practically. Prefer concrete commands.\n\nQuestion: " + $q) - }')" -else - QUESTION="$*" - PROMPT="$(build_ai_prompt "$QUESTION")" - PAYLOAD="$(jq -n \ - --arg q "$PROMPT" \ - --arg vs "$VECTOR_STORE_ID" \ - '{ - model: "gpt-4.1-mini", - input: ( - "You are Repo Memory Assistant for macos-scripts. " + - "Use file search from the Semantic Repository Memory vector store. " + - "Answer practically with source-aware references when useful. " + - "Prefer filenames, functions, why they matter, and confidence over generic advice.\n\n" + - $q - ), - tools: [{ type: "file_search", vector_store_ids: [$vs] }] - }')" -fi - -printf "asking... " - -RESPONSE="$(curl -s https://api.openai.com/v1/responses \ - -H "Authorization: Bearer $OPENAI_API_KEY" \ - -H "Content-Type: application/json" \ - -d "$PAYLOAD")" - -printf "\r\033[2K" - -TEXT="$(echo "$RESPONSE" | jq -r ' - first( - .output[] - | select(.type == "message") - | .content[] - | select(.type == "output_text") - | .text - ) // .error.message // "No response" -' 2>/dev/null)" - -if [[ -z "$TEXT" || "$TEXT" == "null" ]]; then - echo "Error: $(echo "$RESPONSE" | jq -r '.error.message // "unexpected response"')" - exit 1 -fi - -echo "$TEXT" diff --git a/backups/scripts/20260514-010651/tools/scripts/generate-wiki-command-ref.sh b/backups/scripts/20260514-010651/tools/scripts/generate-wiki-command-ref.sh deleted file mode 100755 index 305bd23..0000000 --- a/backups/scripts/20260514-010651/tools/scripts/generate-wiki-command-ref.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env bash -# Generates Command-Reference.md for the macos-scripts GitHub Wiki. -# Run from anywhere: ./tools/scripts/generate-wiki-command-ref.sh -# Output: ~/macos-scripts.wiki/Command-Reference.md - -set -euo pipefail - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -WIKI_DIR="$HOME/macos-scripts.wiki" -OUTPUT="$WIKI_DIR/Command-Reference.md" - -# ── helpers ──────────────────────────────────────────────────────────────── - -extract_meta() { - local file="$1" - - # 1. APP_NAME / APP_TITLE (skip if value looks like code, e.g. contains $) - local title - title=$(grep -m1 -E '^(APP_NAME|APP_TITLE)=' "$file" 2>/dev/null \ - | sed -E 's/^[A-Z_]+="?([^"#$]+)"?.*/\1/' | xargs || true) - [[ -n "$title" && ${#title} -lt 60 ]] && { printf '%s' "$title"; return; } - - # 2. header "..." call - title=$(grep -m1 'header "' "$file" 2>/dev/null \ - | sed -E 's/.*header "([^"]+)".*/\1/' | xargs || true) - [[ -n "$title" && ${#title} -lt 60 ]] && { printf '%s' "$title"; return; } - - # 3. Banner comment line (-- SOMETHING --) - title=$(grep -m1 -E '-- [A-Z].+ --' "$file" 2>/dev/null \ - | sed -E 's/.*-- ([A-Z][^-]+) --.*/\1/' | tr -d '"' | xargs || true) - [[ -n "$title" && ${#title} -lt 60 ]] && { printf '%s' "$title"; return; } - - # 4. Usage line (command verb only, not full echo) - title=$(grep -A1 'Usage:' "$file" 2>/dev/null \ - | grep -m1 'mqlaunch\|mq ' \ - | sed -E 's/^[[:space:]]*//' | xargs || true) - [[ -n "$title" && ${#title} -lt 60 && "$title" != echo* ]] && { printf '%s' "$title"; return; } - - printf '' -} - -extract_usage() { - local file="$1" - # Grab the first command line under a Usage: block - grep -A2 'Usage:' "$file" 2>/dev/null \ - | grep -m1 -E '^\s+(mqlaunch|mq |\.\/|tools/)' \ - | sed -E 's/^[[:space:]]*//' || true -} - -category_label() { - local rel="$1" - case "$rel" in - terminal/launchers/*) printf 'Launchers' ;; - terminal/menus/*) printf 'Menus' ;; - terminal/release/*) printf 'Release' ;; - terminal/ai-prompts/*) printf 'AI Prompts' ;; - terminal/themes/*) printf 'Themes' ;; - terminal/bridges/*) printf 'Bridges' ;; - tools/scripts/*) printf 'Tools & Scripts' ;; - tools/cli/*) printf 'CLI Library' ;; - automation/*) printf 'Automation' ;; - system/*) printf 'System' ;; - ui/*) printf 'UI' ;; - *) printf 'Other' ;; - esac -} - -should_skip() { - local rel="$1" - case "$rel" in - tools/legacy/*) return 0 ;; - terminal/mqlaunch-v1/*) return 0 ;; - backups/*) return 0 ;; - tools/scripts/generate-wiki-command-ref*) return 0 ;; - *) return 1 ;; - esac -} - -# ── collect data ─────────────────────────────────────────────────────────── - -declare -A cat_rows # category → accumulated table rows - -while IFS= read -r file; do - rel="${file#$BASE_DIR/}" - should_skip "$rel" && continue - - name=$(basename "$file" .sh) - category=$(category_label "$rel") - desc=$(extract_meta "$file") - usage=$(extract_usage "$file") - - row="| \`$name\` | ${desc:-—} | \`${usage:-—}\` | [\`$rel\`](../$rel) |" - cat_rows["$category"]+="$row"$'\n' - -done < <(find "$BASE_DIR" -name '*.sh' -not -path '*/.git/*' | sort) - -# ── write output ─────────────────────────────────────────────────────────── - -mkdir -p "$WIKI_DIR" - -{ - printf '# Command Reference\n\n' - printf '_Auto-generated by `tools/scripts/generate-wiki-command-ref.sh` — do not edit manually._\n\n' - printf '%s\n\n' '---' - - for category in Launchers Menus "AI Prompts" Themes Bridges "Release" \ - "Tools & Scripts" "CLI Library" Automation System UI Other; do - rows="${cat_rows[$category]:-}" - [[ -z "$rows" ]] && continue - - printf '## %s\n\n' "$category" - printf '| Script | Description | Usage | Path |\n' - printf '|---|---|---|---|\n' - printf '%s' "$rows" - printf '\n' - done - - printf '%s\n\n' '---' - printf '_Generated: %s_\n' "$(date '+%Y-%m-%d %H:%M')" -} > "$OUTPUT" - -printf '[ok] Written: %s\n' "$OUTPUT" -wc -l < "$OUTPUT" | xargs printf '[ok] Lines: %s\n' diff --git a/backups/scripts/20260514-010651/tools/scripts/srm.sh b/backups/scripts/20260514-010651/tools/scripts/srm.sh deleted file mode 100755 index 2cac6af..0000000 --- a/backups/scripts/20260514-010651/tools/scripts/srm.sh +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -BASE_DIR="${MACOS_SCRIPTS_HOME:-$HOME/macos-scripts}" -source ~/.env 2>/dev/null || true -source "$BASE_DIR/.env" 2>/dev/null || true - -VECTOR_STORE_ID="${SRM_VECTOR_STORE_ID:-${OPENAI_VECTOR_STORE_ID:-vs_69ffa9a4ef5c81919d7d237c3ecdc260}}" -MODEL="${SRM_MODEL:-gpt-4.1-mini}" - -usage() { - cat <" - mqlaunch srm search "" - mqlaunch srm inspect - mqlaunch srm "" - -Examples: - mqlaunch srm ask "what repo is indexed here?" - mqlaunch srm search "vector store upload flow" - mqlaunch srm inspect - -Memory: - SRM_VECTOR_STORE_ID="$VECTOR_STORE_ID" -HELP -} - -require_runtime() { - if [[ -z "${OPENAI_API_KEY:-}" ]]; then - echo "OPENAI_API_KEY is not set. Add it to ~/.env or $BASE_DIR/.env." - exit 1 - fi - - if ! command -v jq >/dev/null 2>&1; then - echo "jq is required for mqlaunch srm." - exit 1 - fi - - if ! command -v curl >/dev/null 2>&1; then - echo "curl is required for mqlaunch srm." - exit 1 - fi -} - -build_question() { - local mode="$1" - local question="$2" - - case "$mode" in - inspect) - printf '%s\n' "Inspect this vector store. Identify what repository or project it appears to contain, the strongest evidence, likely entrypoints, and any uncertainty." - ;; - search) - printf '%s\n' "Search this semantic repository memory for: $question" - ;; - *) - printf '%s\n' "$question" - ;; - esac -} - -ask_srm() { - local mode="$1" - local question="$2" - local prompt payload response text - - prompt="$(build_question "$mode" "$question")" - - payload="$(jq -n \ - --arg model "$MODEL" \ - --arg q "$prompt" \ - --arg vs "$VECTOR_STORE_ID" \ - '{ - model: $model, - input: ( - "You are Semantic Repository Memory Assistant. " + - "Use file_search against the attached vector store as your source of truth. " + - "Help the user inspect what this repository memory contains, answer source-aware questions, " + - "identify relevant files, functions, concepts, and explain confidence. " + - "Be practical, concise, and honest when the vector store does not contain enough evidence. " + - "Do not pretend to know files that are not retrieved.\n\n" + - $q - ), - tools: [ - { - type: "file_search", - vector_store_ids: [$vs] - } - ] - }')" - - printf "srm thinking... " - response="$(curl -sS https://api.openai.com/v1/responses \ - -H "Authorization: Bearer $OPENAI_API_KEY" \ - -H "Content-Type: application/json" \ - -d "$payload")" - printf "\r\033[2K" - - text="$(echo "$response" | jq -r ' - first( - .output[] - | select(.type == "message") - | .content[] - | select(.type == "output_text") - | .text - ) // .error.message // "No response" - ' 2>/dev/null)" - - if [[ -z "$text" || "$text" == "null" ]]; then - echo "Error: $(echo "$response" | jq -r '.error.message // "unexpected response"')" - exit 1 - fi - - echo "$text" -} - -main() { - local mode question - - if [[ $# -eq 0 || "${1:-}" == "-h" || "${1:-}" == "--help" || "${1:-}" == "help" ]]; then - usage - exit 0 - fi - - mode="ask" - case "${1:-}" in - ask|search|inspect) - mode="$1" - shift - ;; - esac - - if [[ "$mode" == "inspect" ]]; then - question="" - else - question="$*" - if [[ -z "${question// }" ]]; then - usage - exit 1 - fi - fi - - require_runtime - ask_srm "$mode" "$question" -} - -main "$@" diff --git a/backups/workspaces/.gitkeep b/backups/workspaces/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/backups/workspaces/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/backups/workspaces/20260508-041502/changed-files.txt b/backups/workspaces/20260508-041502/changed-files.txt deleted file mode 100644 index e69de29..0000000 diff --git a/backups/workspaces/20260508-041502/git-status.txt b/backups/workspaces/20260508-041502/git-status.txt deleted file mode 100644 index 51b8cb7..0000000 --- a/backups/workspaces/20260508-041502/git-status.txt +++ /dev/null @@ -1,2 +0,0 @@ -## main...origin/main -?? backups/workspaces/20260508-041502/ diff --git a/backups/workspaces/20260508-041502/metadata.env b/backups/workspaces/20260508-041502/metadata.env deleted file mode 100644 index 24df683..0000000 --- a/backups/workspaces/20260508-041502/metadata.env +++ /dev/null @@ -1,9 +0,0 @@ -SNAPSHOT_ID=20260508-041502 -CREATED_AT=2026-05-08\ 04:15:02 -WORK_DIR=/Users/mansys/macos-scripts -REPO_ROOT=/Users/mansys/macos-scripts -BRANCH=main -UPSTREAM=origin/main -AHEAD=0 -BEHIND=0 -STATUS_COUNT=0 diff --git a/backups/workspaces/20260508-041502/recent-files.txt b/backups/workspaces/20260508-041502/recent-files.txt deleted file mode 100644 index 0b12b2d..0000000 --- a/backups/workspaces/20260508-041502/recent-files.txt +++ /dev/null @@ -1,40 +0,0 @@ -/Users/mansys/macos-scripts/ai-prompts/01-00-atlas-analysis.txt -/Users/mansys/macos-scripts/ai-prompts/01-09-prompt-debugger.txt -/Users/mansys/macos-scripts/ai-prompts/01-11-decision.txt -/Users/mansys/macos-scripts/ai-prompts/01-12-research.txt -/Users/mansys/macos-scripts/ai-prompts/01-13-root-cause.txt -/Users/mansys/macos-scripts/ai-prompts/01-14-problem-solving.txt -/Users/mansys/macos-scripts/ai-prompts/01-17-atlas-one.txt -/Users/mansys/macos-scripts/ai-prompts/01-18-auto-mode.txt -/Users/mansys/macos-scripts/ai-prompts/README.md -/Users/mansys/macos-scripts/automation/.DS_Store -/Users/mansys/macos-scripts/automation/README.md -/Users/mansys/macos-scripts/bin/mqlaunch -/Users/mansys/macos-scripts/bootstrap.sh -/Users/mansys/macos-scripts/CHANGELOG.md -/Users/mansys/macos-scripts/docs/.DS_Store -/Users/mansys/macos-scripts/docs/case.html -/Users/mansys/macos-scripts/docs/demo-source.svg -/Users/mansys/macos-scripts/docs/demo.gif -/Users/mansys/macos-scripts/docs/index.html -/Users/mansys/macos-scripts/docs/mac-terminal-guide-SE.html -/Users/mansys/macos-scripts/docs/mac-terminal-guide.html -/Users/mansys/macos-scripts/docs/mqlaunch-demo.png -/Users/mansys/macos-scripts/docs/mqlaunch.png -/Users/mansys/macos-scripts/docs/robots.txt -/Users/mansys/macos-scripts/docs/sitemap.xml -/Users/mansys/macos-scripts/install.sh -/Users/mansys/macos-scripts/LICENSE -/Users/mansys/macos-scripts/README.md -/Users/mansys/macos-scripts/release.sh -/Users/mansys/macos-scripts/system/.DS_Store -/Users/mansys/macos-scripts/system/README.md -/Users/mansys/macos-scripts/terminal/.DS_Store -/Users/mansys/macos-scripts/terminal/README.md -/Users/mansys/macos-scripts/tools/.DS_Store -/Users/mansys/macos-scripts/tools/onboarding.sh -/Users/mansys/macos-scripts/tools/README.md -/Users/mansys/macos-scripts/tools/test_tools_readme.sh -/Users/mansys/macos-scripts/ui/.DS_Store -/Users/mansys/macos-scripts/ui/README.md -/Users/mansys/macos-scripts/VERSION diff --git a/backups/workspaces/latest b/backups/workspaces/latest deleted file mode 100644 index 13d740a..0000000 --- a/backups/workspaces/latest +++ /dev/null @@ -1 +0,0 @@ -20260508-041502