-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathhammerspoon-install.sh
More file actions
executable file
·150 lines (139 loc) · 5 KB
/
hammerspoon-install.sh
File metadata and controls
executable file
·150 lines (139 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/bin/bash
# Hammerspoon Tools Installer
# Installs: force-alt-tab + window-recorder + dom-for-llm-extractor
# macOS only
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo ""
echo "Hammerspoon Tools Installer"
echo "==========================="
echo ""
# Check OS
if [[ "$OSTYPE" != "darwin"* ]]; then
echo "Error: Hammerspoon is macOS only."
echo "These tools won't work on your system."
exit 1
fi
# Check if Hammerspoon is installed
if [ ! -d "/Applications/Hammerspoon.app" ] && ! command -v hs &> /dev/null; then
echo "Hammerspoon not found!"
echo ""
echo "Install it first:"
echo " brew install --cask hammerspoon"
echo ""
echo "Then run this installer again."
exit 1
fi
echo "This will install:"
echo " - force-alt-tab: Makes Cmd+Tab always unhide apps"
echo " - window-recorder: Record & replay window positions"
echo " - dom-for-llm-extractor: Page measure tool for DOM context"
echo " - eyedropper-color-picker: Pick hex color from any pixel on screen"
echo ""
# Check for existing config
if [ -f ~/.hammerspoon/init.lua ]; then
echo "Existing ~/.hammerspoon/init.lua found."
echo ""
echo "Options:"
echo " 1) Replace (backup existing to init.lua.backup)"
echo " 2) Append to existing config"
echo " 3) Cancel"
echo ""
read -p "Select [1-3]: " choice
case $choice in
1)
cp ~/.hammerspoon/init.lua ~/.hammerspoon/init.lua.backup
echo "Backed up to init.lua.backup"
MODE="replace"
;;
2)
MODE="append"
;;
*)
echo "Cancelled."
exit 0
;;
esac
else
mkdir -p ~/.hammerspoon
MODE="replace"
fi
# Generate config
generate_config() {
echo "-- =================================================="
echo "-- Workflow Tools - Hammerspoon Config"
echo "-- =================================================="
echo ""
echo "-- Force Alt-Tab"
echo "-- Makes Cmd+Tab always unhide and raise apps"
echo ""
cat "$SCRIPT_DIR/force-alt-tab/init.lua"
echo ""
echo ""
echo "-- =================================================="
echo "-- Window Recorder"
echo "-- Record and replay window positions with hotkeys"
echo "-- Cmd+Option+R to record, Cmd+Option+2-9 to replay"
echo "-- =================================================="
echo ""
cat "$SCRIPT_DIR/window-recorder/init.lua"
echo ""
echo ""
echo "-- =================================================="
echo "-- Page Measure (DOM for LLM Extractor)"
echo "-- Cmd+Shift+M to measure and capture DOM context"
echo "-- =================================================="
echo ""
echo "local pageMeasureJS = [["
cat "$SCRIPT_DIR/dom-for-llm-extractor/page-measure-enhanced-fixed.min.js"
echo "]]"
echo ""
echo 'hs.hotkey.bind({"cmd", "shift"}, "M", function()'
echo ' local app = hs.application.frontmostApplication()'
echo ' local appName = app:name()'
echo ''
echo ' local escapedJS = pageMeasureJS:gsub('\''\\\\'\'',' '\''\\\\\\\\'\'')'
echo ' escapedJS = escapedJS:gsub('\''"'\'', '\''\\\\\"'\'')'
echo ''
echo ' if appName == "Google Chrome" or appName == "Google Chrome Canary" then'
echo ' local script = '\''tell application "Google Chrome" to execute front window\\'\''s active tab javascript "'\'' .. escapedJS .. '\''"'\'''
echo ' hs.osascript.applescript(script)'
echo ' elseif appName == "Safari" then'
echo ' local script = '\''tell application "Safari" to do JavaScript "'\'' .. escapedJS .. '\''" in front document'\'''
echo ' hs.osascript.applescript(script)'
echo ' elseif appName == "Arc" then'
echo ' local script = '\''tell application "Arc" to execute front window\\'\''s active tab javascript "'\'' .. escapedJS .. '\''"'\'''
echo ' hs.osascript.applescript(script)'
echo ' else'
echo ' hs.alert.show("Page Measure: Not in a supported browser")'
echo ' end'
echo 'end)'
echo ""
echo ""
echo "-- =================================================="
echo "-- Eyedropper Color Picker"
echo "-- Cmd+Option+E to pick hex color from any pixel"
echo "-- =================================================="
echo ""
cat "$SCRIPT_DIR/eyedropper-color-picker/init.lua"
}
if [ "$MODE" = "replace" ]; then
generate_config > ~/.hammerspoon/init.lua
else
echo "" >> ~/.hammerspoon/init.lua
generate_config >> ~/.hammerspoon/init.lua
fi
echo ""
echo "✓ Installed to ~/.hammerspoon/init.lua"
echo ""
echo "Next steps:"
echo " 1. Open Hammerspoon (if not running)"
echo " 2. Click menubar icon → Reload Config"
echo ""
echo "Usage:"
echo " - Cmd+Tab now always unhides apps"
echo " - Cmd+Option+R to record window position"
echo " - Cmd+Option+2-9 to restore positions"
echo " - Cmd+Shift+M to measure page elements (in browser)"
echo " - Cmd+Option+E to pick hex color from any pixel"
echo ""