@quickcall/all-configs 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/bin/all-configs.js +44 -0
- package/package.json +20 -4
- package/runtime/allconfigs/__init__.py +1 -0
- package/runtime/allconfigs/__main__.py +42 -0
- package/runtime/allconfigs/__pycache__/__init__.cpython-312.pyc +0 -0
- package/runtime/allconfigs/__pycache__/__main__.cpython-312.pyc +0 -0
- package/runtime/allconfigs/__pycache__/modules.cpython-312.pyc +0 -0
- package/runtime/allconfigs/__pycache__/probe.cpython-312.pyc +0 -0
- package/runtime/allconfigs/__pycache__/runner.cpython-312.pyc +0 -0
- package/runtime/allconfigs/modules.py +221 -0
- package/runtime/allconfigs/probe.py +60 -0
- package/runtime/install.sh +74 -0
- package/runtime/lib/common.sh +147 -0
- package/runtime/lib/uninstall.sh +35 -0
- package/runtime/modules/aldente/install.sh +23 -0
- package/runtime/modules/aldente/module.toml +11 -0
- package/runtime/modules/aliases/aliases.sh +31 -0
- package/runtime/modules/aliases/install.sh +36 -0
- package/runtime/modules/aliases/module.toml +7 -0
- package/runtime/modules/aqua-voice/install.sh +23 -0
- package/runtime/modules/aqua-voice/module.toml +11 -0
- package/runtime/modules/betterdisplay/install.sh +23 -0
- package/runtime/modules/betterdisplay/module.toml +11 -0
- package/runtime/modules/bitwarden/install.sh +19 -0
- package/runtime/modules/bitwarden/module.toml +11 -0
- package/runtime/modules/browsers/install.sh +33 -0
- package/runtime/modules/browsers/module.toml +11 -0
- package/runtime/modules/bun/install.sh +72 -0
- package/runtime/modules/bun/module.toml +7 -0
- package/runtime/modules/caveman/install.sh +79 -0
- package/runtime/modules/caveman/module.toml +7 -0
- package/runtime/modules/claude/install.sh +22 -0
- package/runtime/modules/claude/module.toml +7 -0
- package/runtime/modules/codex/install.sh +20 -0
- package/runtime/modules/codex/module.toml +7 -0
- package/runtime/modules/docker/install.sh +19 -0
- package/runtime/modules/docker/module.toml +11 -0
- package/runtime/modules/external-skills/install.sh +30 -0
- package/runtime/modules/external-skills/module.toml +4 -0
- package/runtime/modules/ffmpeg/install.sh +13 -0
- package/runtime/modules/ffmpeg/module.toml +11 -0
- package/runtime/modules/fonts/install.sh +62 -0
- package/runtime/modules/fonts/module.toml +8 -0
- package/runtime/modules/ghostty/config +44 -0
- package/runtime/modules/ghostty/install.sh +64 -0
- package/runtime/modules/ghostty/module.toml +9 -0
- package/runtime/modules/ghostty/themes/ayu-dark +22 -0
- package/runtime/modules/ghostty/themes/catppuccin-frappe +23 -0
- package/runtime/modules/ghostty/themes/catppuccin-latte +23 -0
- package/runtime/modules/ghostty/themes/catppuccin-latte.conf +23 -0
- package/runtime/modules/ghostty/themes/catppuccin-macchiato +23 -0
- package/runtime/modules/ghostty/themes/catppuccin-mocha +23 -0
- package/runtime/modules/ghostty/themes/visual-studio-light +27 -0
- package/runtime/modules/ghostty/themes/vscode-light +24 -0
- package/runtime/modules/ghostty/themes/vscode-light-soft +24 -0
- package/runtime/modules/ghostty/xterm-ghostty.terminfo +81 -0
- package/runtime/modules/github/install.sh +101 -0
- package/runtime/modules/github/module.toml +8 -0
- package/runtime/modules/hf/install.sh +98 -0
- package/runtime/modules/hf/module.toml +7 -0
- package/runtime/modules/karabiner/README.md +146 -0
- package/runtime/modules/karabiner/agents.md +39 -0
- package/runtime/modules/karabiner/app_launchers.json +236 -0
- package/runtime/modules/karabiner/custom_delete_mapping.json +13 -0
- package/runtime/modules/karabiner/fn_to_control.json +9 -0
- package/runtime/modules/karabiner/install.sh +60 -0
- package/runtime/modules/karabiner/karabiner.json +866 -0
- package/runtime/modules/karabiner/keychron-modifier-swap.sh +80 -0
- package/runtime/modules/karabiner/module.toml +8 -0
- package/runtime/modules/karabiner/remap_caps_lock_shift_super.json +23 -0
- package/runtime/modules/karabiner/remap_escape_to_control.json +49 -0
- package/runtime/modules/karabiner/rename_caps_lock_to_super.json +23 -0
- package/runtime/modules/karabiner/right_shift_mouse_click.json +44 -0
- package/runtime/modules/karabiner/swap_esc_delete.json +10 -0
- package/runtime/modules/karabiner/troubleshooting.md +242 -0
- package/runtime/modules/karabiner/vim_arrow_keys.json +477 -0
- package/runtime/modules/keepingyouawake/install.sh +23 -0
- package/runtime/modules/keepingyouawake/module.toml +11 -0
- package/runtime/modules/keycastr/install.sh +23 -0
- package/runtime/modules/keycastr/module.toml +11 -0
- package/runtime/modules/multi-github/install.sh +179 -0
- package/runtime/modules/multi-github/module.toml +4 -0
- package/runtime/modules/ncdu/install.sh +13 -0
- package/runtime/modules/ncdu/module.toml +11 -0
- package/runtime/modules/node/install.sh +73 -0
- package/runtime/modules/node/module.toml +11 -0
- package/runtime/modules/nvim/.neoconf.json +15 -0
- package/runtime/modules/nvim/init.lua +2 -0
- package/runtime/modules/nvim/install.sh +142 -0
- package/runtime/modules/nvim/lazy-lock.json +35 -0
- package/runtime/modules/nvim/lazyvim.json +10 -0
- package/runtime/modules/nvim/lua/config/autocmds.lua +18 -0
- package/runtime/modules/nvim/lua/config/keymaps.lua +10 -0
- package/runtime/modules/nvim/lua/config/lazy.lua +53 -0
- package/runtime/modules/nvim/lua/config/options.lua +3 -0
- package/runtime/modules/nvim/lua/plugins/image.lua +9 -0
- package/runtime/modules/nvim/lua/plugins/markdown.lua +56 -0
- package/runtime/modules/nvim/lua/plugins/noice.lua +17 -0
- package/runtime/modules/nvim/lua/plugins/rose-pine.lua +16 -0
- package/runtime/modules/nvim/lua/plugins/snacks.lua +20 -0
- package/runtime/modules/nvim/module.toml +8 -0
- package/runtime/modules/nvim/stylua.toml +3 -0
- package/runtime/modules/p10k/install.sh +46 -0
- package/runtime/modules/p10k/module.toml +8 -0
- package/runtime/modules/p10k/p10k.zsh +1711 -0
- package/runtime/modules/pi/install.sh +77 -0
- package/runtime/modules/pi/module.toml +8 -0
- package/runtime/modules/pi/packages +5 -0
- package/runtime/modules/pi/settings.json +21 -0
- package/runtime/modules/presentify/install.sh +25 -0
- package/runtime/modules/presentify/module.toml +7 -0
- package/runtime/modules/rectangle/RectangleConfig.json +353 -0
- package/runtime/modules/rectangle/install.sh +64 -0
- package/runtime/modules/rectangle/module.toml +11 -0
- package/runtime/modules/shortcat/install.sh +19 -0
- package/runtime/modules/shortcat/module.toml +11 -0
- package/runtime/modules/skills/install.sh +25 -0
- package/runtime/modules/skills/module.toml +4 -0
- package/runtime/modules/skills/skills-lock.json +35 -0
- package/runtime/modules/slack/install.sh +23 -0
- package/runtime/modules/slack/module.toml +11 -0
- package/runtime/modules/spotify/install.sh +23 -0
- package/runtime/modules/spotify/module.toml +11 -0
- package/runtime/modules/ssh-keygen/install.sh +130 -0
- package/runtime/modules/ssh-keygen/module.toml +4 -0
- package/runtime/modules/statusline/install.sh +69 -0
- package/runtime/modules/statusline/module.toml +7 -0
- package/runtime/modules/statusline/statusline.sh +168 -0
- package/runtime/modules/statusline/turn-counter.sh +11 -0
- package/runtime/modules/superfile/cheatsheet.md +127 -0
- package/runtime/modules/superfile/config.toml +181 -0
- package/runtime/modules/superfile/hotkeys.toml +96 -0
- package/runtime/modules/superfile/install.sh +73 -0
- package/runtime/modules/superfile/module.toml +7 -0
- package/runtime/modules/tailscale/install.sh +29 -0
- package/runtime/modules/tailscale/module.toml +11 -0
- package/runtime/modules/tinycast/install.sh +68 -0
- package/runtime/modules/tinycast/module.toml +7 -0
- package/runtime/modules/tinycast/settings.json +226 -0
- package/runtime/modules/tmux/.tmux.conf.local +168 -0
- package/runtime/modules/tmux/README.md +50 -0
- package/runtime/modules/tmux/install.sh +57 -0
- package/runtime/modules/tmux/installer.mjs +191 -0
- package/runtime/modules/tmux/module.toml +8 -0
- package/runtime/modules/tmux/shell-helpers.sh +20 -0
- package/runtime/modules/tmux/uninstall.sh +134 -0
- package/runtime/modules/uv/install.sh +72 -0
- package/runtime/modules/uv/module.toml +7 -0
- package/runtime/modules/vlc/install.sh +23 -0
- package/runtime/modules/vlc/module.toml +11 -0
- package/runtime/modules/vscode/install.sh +33 -0
- package/runtime/modules/vscode/keybindings.json +74 -0
- package/runtime/modules/vscode/module.toml +8 -0
- package/runtime/modules/vscode/settings.json +426 -0
- package/runtime/modules/vscode/tasks.json +1 -0
- package/runtime/modules/yt-dlp/install.sh +13 -0
- package/runtime/modules/yt-dlp/module.toml +11 -0
- package/runtime/modules/zed/install.sh +43 -0
- package/runtime/modules/zed/module.toml +8 -0
- package/runtime/modules/zed/settings.json +208 -0
- package/runtime/modules/zoxide/install.sh +41 -0
- package/runtime/modules/zoxide/module.toml +11 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
{
|
|
2
|
+
"general": {
|
|
3
|
+
"launcherShortcut": "cmd+space",
|
|
4
|
+
"showInMenuBar": false,
|
|
5
|
+
"automaticallyCheckForUpdates": true,
|
|
6
|
+
"popToRootSeconds": 90,
|
|
7
|
+
"escapeKeyBehavior": "navigateBackOrClose",
|
|
8
|
+
"autoSwitchInputSource": null,
|
|
9
|
+
"supportReminders": true,
|
|
10
|
+
"language": "en"
|
|
11
|
+
},
|
|
12
|
+
"appearance": {
|
|
13
|
+
"theme": "system",
|
|
14
|
+
"animations": true,
|
|
15
|
+
"interfaceSize": "standard",
|
|
16
|
+
"compactMode": false,
|
|
17
|
+
"compactBarCommands": [
|
|
18
|
+
"command:clipboard-history",
|
|
19
|
+
"command:search-emoji",
|
|
20
|
+
"command:search-files",
|
|
21
|
+
"command:search-quicklinks"
|
|
22
|
+
],
|
|
23
|
+
"followCursorAcrossDisplays": true,
|
|
24
|
+
"dragToReposition": false
|
|
25
|
+
},
|
|
26
|
+
"hyperKey": {
|
|
27
|
+
"key": "none",
|
|
28
|
+
"includesShift": true,
|
|
29
|
+
"quickPress": "none",
|
|
30
|
+
"secureInputCompatibility": false
|
|
31
|
+
},
|
|
32
|
+
"calculator": {
|
|
33
|
+
"numberStyle": "system"
|
|
34
|
+
},
|
|
35
|
+
"search": {
|
|
36
|
+
"showsSuggestions": true,
|
|
37
|
+
"sensitivity": "medium"
|
|
38
|
+
},
|
|
39
|
+
"applications": {
|
|
40
|
+
"enabled": true,
|
|
41
|
+
"searchScopes": [
|
|
42
|
+
"/Applications",
|
|
43
|
+
"/Applications/Utilities",
|
|
44
|
+
"/System/Applications",
|
|
45
|
+
"/System/Applications/Utilities",
|
|
46
|
+
"/System/Library/CoreServices/Applications",
|
|
47
|
+
"/System/Volumes/Preboot/Cryptexes/App/System/Applications",
|
|
48
|
+
"/System/Library/CoreServices/Finder.app",
|
|
49
|
+
"~/Applications",
|
|
50
|
+
"~/work"
|
|
51
|
+
],
|
|
52
|
+
"apps": {}
|
|
53
|
+
},
|
|
54
|
+
"systemSettings": {
|
|
55
|
+
"enabled": true,
|
|
56
|
+
"panes": {}
|
|
57
|
+
},
|
|
58
|
+
"systemActions": {
|
|
59
|
+
"enabled": true,
|
|
60
|
+
"actions": {}
|
|
61
|
+
},
|
|
62
|
+
"commands": {
|
|
63
|
+
"builtInEnabled": true,
|
|
64
|
+
"builtIn": {},
|
|
65
|
+
"enabled": false,
|
|
66
|
+
"showInLauncher": true
|
|
67
|
+
},
|
|
68
|
+
"quicklinks": {
|
|
69
|
+
"enabled": true,
|
|
70
|
+
"showInLauncher": true,
|
|
71
|
+
"opensNewWindow": false,
|
|
72
|
+
"passesSelectedText": false,
|
|
73
|
+
"confirmsBeforeDelete": true,
|
|
74
|
+
"commands": {}
|
|
75
|
+
},
|
|
76
|
+
"appleShortcuts": {
|
|
77
|
+
"enabled": false
|
|
78
|
+
},
|
|
79
|
+
"ai": {
|
|
80
|
+
"enabled": false,
|
|
81
|
+
"webSearch": false,
|
|
82
|
+
"choices": true,
|
|
83
|
+
"expandsReasoning": false,
|
|
84
|
+
"systemPrompt": "",
|
|
85
|
+
"systemPromptEnabled": true,
|
|
86
|
+
"retentionDays": "forever",
|
|
87
|
+
"opensTo": "recent",
|
|
88
|
+
"newChatAfterMinutes": 5,
|
|
89
|
+
"toolRounds": 25,
|
|
90
|
+
"commands": {}
|
|
91
|
+
},
|
|
92
|
+
"quickActions": {
|
|
93
|
+
"targetLanguage": "",
|
|
94
|
+
"commands": {}
|
|
95
|
+
},
|
|
96
|
+
"dictation": {
|
|
97
|
+
"mode": "toggle",
|
|
98
|
+
"shortcut": null,
|
|
99
|
+
"playsSounds": true,
|
|
100
|
+
"model": "redux",
|
|
101
|
+
"microphone": null,
|
|
102
|
+
"destination": "paste",
|
|
103
|
+
"adaptsCapitalization": true,
|
|
104
|
+
"liveInsertion": false,
|
|
105
|
+
"releaseAfterMinutes": 1,
|
|
106
|
+
"language": null
|
|
107
|
+
},
|
|
108
|
+
"fileSearch": {
|
|
109
|
+
"enabled": true,
|
|
110
|
+
"scopes": [
|
|
111
|
+
"~"
|
|
112
|
+
],
|
|
113
|
+
"ignorePatterns": [],
|
|
114
|
+
"removedDefaultPatterns": [],
|
|
115
|
+
"showInLauncher": false,
|
|
116
|
+
"commands": {}
|
|
117
|
+
},
|
|
118
|
+
"notes": {
|
|
119
|
+
"enabled": false,
|
|
120
|
+
"rendersMarkdown": true,
|
|
121
|
+
"showsFormattingBar": true,
|
|
122
|
+
"showsInMenuBar": false,
|
|
123
|
+
"folder": null,
|
|
124
|
+
"commands": {}
|
|
125
|
+
},
|
|
126
|
+
"snippets": {
|
|
127
|
+
"showInLauncher": true,
|
|
128
|
+
"folder": null,
|
|
129
|
+
"commands": {}
|
|
130
|
+
},
|
|
131
|
+
"navigation": {
|
|
132
|
+
"enabled": false,
|
|
133
|
+
"menuSearchShowsAppleMenu": false,
|
|
134
|
+
"menuSearchDisabledApps": [],
|
|
135
|
+
"commands": {}
|
|
136
|
+
},
|
|
137
|
+
"windowManagement": {
|
|
138
|
+
"enabled": false,
|
|
139
|
+
"showInLauncher": true,
|
|
140
|
+
"gap": 0,
|
|
141
|
+
"cycle": "off",
|
|
142
|
+
"wrapDisplays": true,
|
|
143
|
+
"keepProportions": true,
|
|
144
|
+
"layoutsShowInLauncher": true,
|
|
145
|
+
"roomsShowInLauncher": true,
|
|
146
|
+
"shortcuts": {
|
|
147
|
+
"left-half": null,
|
|
148
|
+
"right-half": null,
|
|
149
|
+
"top-half": null,
|
|
150
|
+
"bottom-half": null,
|
|
151
|
+
"top-left-quarter": null,
|
|
152
|
+
"top-right-quarter": null,
|
|
153
|
+
"bottom-left-quarter": null,
|
|
154
|
+
"bottom-right-quarter": null,
|
|
155
|
+
"first-three-fourths": null,
|
|
156
|
+
"last-three-fourths": null,
|
|
157
|
+
"first-third": null,
|
|
158
|
+
"center-third": null,
|
|
159
|
+
"last-third": null,
|
|
160
|
+
"first-two-thirds": null,
|
|
161
|
+
"last-two-thirds": null,
|
|
162
|
+
"maximize": null,
|
|
163
|
+
"almost-maximize": null,
|
|
164
|
+
"reasonable-size": null,
|
|
165
|
+
"maximize-height": null,
|
|
166
|
+
"maximize-width": null,
|
|
167
|
+
"center": null,
|
|
168
|
+
"center-half": null,
|
|
169
|
+
"center-two-thirds": null,
|
|
170
|
+
"make-larger": null,
|
|
171
|
+
"make-smaller": null,
|
|
172
|
+
"restore": null,
|
|
173
|
+
"move-left": null,
|
|
174
|
+
"move-right": null,
|
|
175
|
+
"move-up": null,
|
|
176
|
+
"move-down": null,
|
|
177
|
+
"move-to-left-edge": null,
|
|
178
|
+
"move-to-right-edge": null,
|
|
179
|
+
"move-to-top-edge": null,
|
|
180
|
+
"move-to-bottom-edge": null,
|
|
181
|
+
"next-display": null,
|
|
182
|
+
"previous-display": null,
|
|
183
|
+
"toggle-fullscreen": null,
|
|
184
|
+
"previous-space": null,
|
|
185
|
+
"next-space": null
|
|
186
|
+
},
|
|
187
|
+
"aliases": {},
|
|
188
|
+
"customSizes": [],
|
|
189
|
+
"layouts": [],
|
|
190
|
+
"rooms": [],
|
|
191
|
+
"commands": {}
|
|
192
|
+
},
|
|
193
|
+
"clipboard": {
|
|
194
|
+
"enabled": true,
|
|
195
|
+
"retentionDays": 90,
|
|
196
|
+
"defaultAction": "paste",
|
|
197
|
+
"disabledApps": [
|
|
198
|
+
"com.apple.keychainaccess",
|
|
199
|
+
"com.apple.Passwords"
|
|
200
|
+
],
|
|
201
|
+
"commands": {}
|
|
202
|
+
},
|
|
203
|
+
"emoji": {
|
|
204
|
+
"skinTone": "none",
|
|
205
|
+
"gridColumns": 8,
|
|
206
|
+
"commands": {}
|
|
207
|
+
},
|
|
208
|
+
"calendar": {
|
|
209
|
+
"showInLauncher": true,
|
|
210
|
+
"launcherLimit": 5,
|
|
211
|
+
"span": "todayAndTomorrow",
|
|
212
|
+
"joinWindowMinutes": 5,
|
|
213
|
+
"autoJoinConfirms": true,
|
|
214
|
+
"autoJoinNamedProvidersOnly": false,
|
|
215
|
+
"meetingBrowser": null,
|
|
216
|
+
"menuBar": "disabled",
|
|
217
|
+
"menuBarUpcomingEvents": "today",
|
|
218
|
+
"menuBarLinkedEventsOnly": true,
|
|
219
|
+
"menuBarHidesWhenEmpty": false,
|
|
220
|
+
"hideCurrentEventAfterMinutes": "never",
|
|
221
|
+
"commands": {}
|
|
222
|
+
},
|
|
223
|
+
"extensions": {
|
|
224
|
+
"showInLauncher": true
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Oh my tmux!
|
|
2
|
+
# https://github.com/gpakosz/.tmux
|
|
3
|
+
|
|
4
|
+
# -- general -------------------------------------------------------------------
|
|
5
|
+
|
|
6
|
+
tmux_conf_new_session_prompt=false
|
|
7
|
+
tmux_conf_new_session_retain_current_path=false
|
|
8
|
+
tmux_conf_new_window_retain_current_path=true
|
|
9
|
+
tmux_conf_new_window_reconnect_ssh=false
|
|
10
|
+
tmux_conf_new_pane_retain_current_path=true
|
|
11
|
+
tmux_conf_new_pane_reconnect_ssh=false
|
|
12
|
+
|
|
13
|
+
# -- display -------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
tmux_conf_24b_colour=auto
|
|
16
|
+
|
|
17
|
+
# -- theming -------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
tmux_conf_theme=enabled
|
|
20
|
+
|
|
21
|
+
# Pastel palette — soft, muted, no attention-grabbing colors
|
|
22
|
+
tmux_conf_theme_colour_1="#f4f2f0" # status bg (warm cream)
|
|
23
|
+
tmux_conf_theme_colour_2="#e0dcd8" # pane border (warm gray)
|
|
24
|
+
tmux_conf_theme_colour_3="#7a7888" # status text (muted)
|
|
25
|
+
tmux_conf_theme_colour_4="#8fb88a" # accent (sage)
|
|
26
|
+
tmux_conf_theme_colour_5="#f5d890" # message/mode bg (pastel yellow)
|
|
27
|
+
tmux_conf_theme_colour_6="#5c5a6a" # status left fg
|
|
28
|
+
tmux_conf_theme_colour_7="#7a7888"
|
|
29
|
+
tmux_conf_theme_colour_8="#5c5a6a"
|
|
30
|
+
tmux_conf_theme_colour_9="#8fb88a" # session block bg (sage)
|
|
31
|
+
tmux_conf_theme_colour_10="#8fb88a"
|
|
32
|
+
tmux_conf_theme_colour_11="#b5e3a8" # pastel green
|
|
33
|
+
tmux_conf_theme_colour_12="#7a7888" # status right fg
|
|
34
|
+
tmux_conf_theme_colour_13="#5c5a6a"
|
|
35
|
+
tmux_conf_theme_colour_14="#7a7888"
|
|
36
|
+
tmux_conf_theme_colour_15="#f4f2f0" # status right bg
|
|
37
|
+
tmux_conf_theme_colour_16="#8fb88a" # hostname block bg (sage)
|
|
38
|
+
tmux_conf_theme_colour_17="#e0dcd8"
|
|
39
|
+
|
|
40
|
+
# Message/mode — pastel yellow, dark text
|
|
41
|
+
tmux_conf_theme_message_fg="#5c5a6a"
|
|
42
|
+
tmux_conf_theme_message_bg="#f5d890"
|
|
43
|
+
tmux_conf_theme_mode_fg="#5c5a6a"
|
|
44
|
+
tmux_conf_theme_mode_bg="#f5d890"
|
|
45
|
+
|
|
46
|
+
# -- status line ---------------------------------------------------------------
|
|
47
|
+
|
|
48
|
+
tmux_conf_theme_left_separator_main=""
|
|
49
|
+
tmux_conf_theme_left_separator_sub="|"
|
|
50
|
+
tmux_conf_theme_right_separator_main=""
|
|
51
|
+
tmux_conf_theme_right_separator_sub="|"
|
|
52
|
+
|
|
53
|
+
tmux_conf_theme_status_left=" #S #{window_index}:#{pane_index} "
|
|
54
|
+
tmux_conf_theme_status_right=" #{prefix}#{synchronized} | #{hostname} "
|
|
55
|
+
|
|
56
|
+
# -- clipboard -----------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
tmux_conf_copy_to_os_clipboard=false
|
|
59
|
+
|
|
60
|
+
# -- user customizations -------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
# Command palette for tmux. Trigger with Option+p (M-p).
|
|
63
|
+
set -g @plugin 'eduwass/tmux-palette'
|
|
64
|
+
set -g @palette-key 'M-p'
|
|
65
|
+
|
|
66
|
+
set -g history-limit 100000
|
|
67
|
+
set -g mouse on
|
|
68
|
+
set -sg escape-time 10
|
|
69
|
+
|
|
70
|
+
set -g visual-activity off
|
|
71
|
+
set -g visual-bell off
|
|
72
|
+
set -g visual-silence off
|
|
73
|
+
setw -g monitor-activity off
|
|
74
|
+
set -g bell-action none
|
|
75
|
+
|
|
76
|
+
set -g status-position top
|
|
77
|
+
set -g extended-keys on
|
|
78
|
+
set -g extended-keys-format csi-u
|
|
79
|
+
|
|
80
|
+
setw -g xterm-keys on
|
|
81
|
+
set -as terminal-overrides ',*:kbs=\177'
|
|
82
|
+
|
|
83
|
+
# Launch login shells inside tmux so PATH/bootstrap from ~/.profile works in
|
|
84
|
+
# sessions, panes, new windows. Prevents missing user-local tools like bun/fd.
|
|
85
|
+
run-shell 'tmux set-option -g default-shell "${SHELL:-/bin/bash}"'
|
|
86
|
+
run-shell 'tmux set-option -g default-command "exec ${SHELL:-/bin/bash} -l"'
|
|
87
|
+
|
|
88
|
+
# Editor for programs launched inside tmux, including pi Ctrl+G.
|
|
89
|
+
set-environment -g VISUAL nvim
|
|
90
|
+
set-environment -g EDITOR nvim
|
|
91
|
+
|
|
92
|
+
# ─── Environment sanitization ────────────────────────────────────────────────
|
|
93
|
+
# If the tmux server is started from a terminal where a venv was auto-activated
|
|
94
|
+
# (e.g. VS Code Python extension), tmux freezes that env globally and every new
|
|
95
|
+
# pane inherits VIRTUAL_ENV + a venv-poisoned PATH. Strip it at server start.
|
|
96
|
+
set-environment -gu VIRTUAL_ENV
|
|
97
|
+
set-environment -gu VIRTUAL_ENV_PROMPT
|
|
98
|
+
set-environment -gu CONDA_PREFIX
|
|
99
|
+
set-environment -gu CONDA_DEFAULT_ENV
|
|
100
|
+
set-environment -gu PYTHONSTARTUP
|
|
101
|
+
# PATH captured at server start may point into a project .venv — strip any
|
|
102
|
+
# .venv/bin component (rewrites deterministically, safe on reload; keeps a
|
|
103
|
+
# valid PATH so run-shell children can still find tmux/sed/etc).
|
|
104
|
+
run-shell 'P=$(tmux show-environment -g PATH 2>/dev/null | cut -d= -f2-); [ -n "$P" ] && tmux set-environment -g PATH "$(echo "$P" | tr ":" "\n" | grep -v "/\.venv/bin$" | paste -sd: -)"'
|
|
105
|
+
# Stale VS Code / debugpy vars from the spawning terminal are useless here.
|
|
106
|
+
set-environment -gu BUNDLED_DEBUGPY_PATH
|
|
107
|
+
set-environment -gu VSCODE_DEBUGPY_ADAPTER_ENDPOINTS
|
|
108
|
+
set-environment -gu VSCODE_PYTHON_AUTOACTIVATE_GUARD
|
|
109
|
+
set-environment -gu VSCODE_GIT_IPC_HANDLE
|
|
110
|
+
set-environment -gu VSCODE_GIT_ASKPASS_MAIN
|
|
111
|
+
set-environment -gu VSCODE_GIT_ASKPASS_NODE
|
|
112
|
+
set-environment -gu VSCODE_GIT_ASKPASS_EXTRA_ARGS
|
|
113
|
+
|
|
114
|
+
# Soft pastel copy-mode selection (not harsh)
|
|
115
|
+
set -g copy-mode-match-style "bg=#8fb88a,fg=#5c5a6a"
|
|
116
|
+
set -g copy-mode-mark-style "bg=#8fb88a,fg=#5c5a6a"
|
|
117
|
+
|
|
118
|
+
# ─── Split keys ───────────────────────────────────────────────────────
|
|
119
|
+
unbind -
|
|
120
|
+
unbind _
|
|
121
|
+
bind | split-window -h
|
|
122
|
+
bind _ split-window -v
|
|
123
|
+
|
|
124
|
+
# ─── Swap panes ───────────────────────────────────────────────────────
|
|
125
|
+
unbind >
|
|
126
|
+
unbind <
|
|
127
|
+
bind j swap-pane -D
|
|
128
|
+
bind k swap-pane -U
|
|
129
|
+
|
|
130
|
+
# ─── Kill pane / window ───────────────────────────────────────────────
|
|
131
|
+
unbind x
|
|
132
|
+
bind q confirm-before -p "kill pane? (y/n)" kill-pane
|
|
133
|
+
bind Q confirm-before -p "kill window? (y/n)" kill-window
|
|
134
|
+
|
|
135
|
+
# ─── Copy mode ────────────────────────────────────────────────────────
|
|
136
|
+
set -g mode-keys vi
|
|
137
|
+
unbind Enter
|
|
138
|
+
bind Escape copy-mode
|
|
139
|
+
|
|
140
|
+
# ─── Maximize pane ────────────────────────────────────────────────────
|
|
141
|
+
unbind +
|
|
142
|
+
bind M run "cut -c3- '#{TMUX_CONF}' | sh -s _maximize_pane '#{session_name}' '#D'"
|
|
143
|
+
|
|
144
|
+
# ─── vim-tmux-navigator ───────────────────────────────────────────────
|
|
145
|
+
is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?|fzf)(diff)?$'"
|
|
146
|
+
bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
|
|
147
|
+
bind -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
|
|
148
|
+
bind -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
|
|
149
|
+
bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
|
|
150
|
+
|
|
151
|
+
bind -T copy-mode-vi C-h select-pane -L
|
|
152
|
+
bind -T copy-mode-vi C-j select-pane -D
|
|
153
|
+
bind -T copy-mode-vi C-k select-pane -U
|
|
154
|
+
bind -T copy-mode-vi C-l select-pane -R
|
|
155
|
+
|
|
156
|
+
# ─── Mouse: click session block → tree views ────────────────────────────────
|
|
157
|
+
# Left-click status-left = prefix+s (session tree)
|
|
158
|
+
# Right-click status-left = prefix+w (window tree)
|
|
159
|
+
bind -T root MouseDown1StatusLeft choose-tree -Zs
|
|
160
|
+
bind -T root MouseDown3StatusLeft choose-tree -Zw
|
|
161
|
+
|
|
162
|
+
# ─── Second status line: pane path (keeps tabs line clean) ──────────────────
|
|
163
|
+
set -g status 2
|
|
164
|
+
set -g status-format[1] "#[bg=#f4f2f0,fg=#7a7888,align=centre] #{pane_current_path} "
|
|
165
|
+
|
|
166
|
+
# ─── Override reload for Linux compatibility ────────────────────────────────
|
|
167
|
+
unbind r
|
|
168
|
+
bind r source-file ~/.tmux.conf \; display "tmux.conf reloaded"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Tmux Setup
|
|
2
|
+
|
|
3
|
+
Minimal, vim-style tmux config powered by [oh-my-tmux](https://github.com/gpakosz/.tmux).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
./install.sh tmux
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What's included
|
|
12
|
+
|
|
13
|
+
### Framework
|
|
14
|
+
- **oh-my-tmux** — self-contained tmux framework with Powerline status bar
|
|
15
|
+
- Pastel sage theme (warm cream, zero harsh colors)
|
|
16
|
+
- Status bar at top with session name, pane number, hostname
|
|
17
|
+
|
|
18
|
+
### Key bindings
|
|
19
|
+
|
|
20
|
+
| Key | Action |
|
|
21
|
+
|-----|--------|
|
|
22
|
+
| `prefix \|` | Split horizontal (side-by-side) |
|
|
23
|
+
| `prefix _` | Split vertical (stacked) |
|
|
24
|
+
| `prefix h/j/k/l` | Navigate panes (repeatable) |
|
|
25
|
+
| `C-h/j/k/l` | Smart pane nav + vim passthrough |
|
|
26
|
+
| `prefix C-h` | Previous window |
|
|
27
|
+
| `prefix C-l` | Next window |
|
|
28
|
+
| `prefix Tab` | Last window |
|
|
29
|
+
| `prefix 1-9` | Jump to window |
|
|
30
|
+
| `prefix j` | Swap pane down |
|
|
31
|
+
| `prefix k` | Swap pane up |
|
|
32
|
+
| `prefix H/J/K/L` | Resize pane (2 cells) |
|
|
33
|
+
| `prefix Escape` | Enter copy mode |
|
|
34
|
+
| `v` / `V` | Visual select / line select |
|
|
35
|
+
| `y` | Copy to clipboard |
|
|
36
|
+
| `prefix q` | Kill pane (confirm) |
|
|
37
|
+
| `prefix Q` | Kill window (confirm) |
|
|
38
|
+
| `prefix M` | Maximize pane to new window |
|
|
39
|
+
| `prefix C-f` | Find session |
|
|
40
|
+
| `prefix C-c` | New session |
|
|
41
|
+
| `prefix r` | Reload config |
|
|
42
|
+
| `prefix U` | URL scanner |
|
|
43
|
+
| `prefix F` | PathPicker |
|
|
44
|
+
|
|
45
|
+
### Misc
|
|
46
|
+
- History: 100,000 lines
|
|
47
|
+
- Mouse: always on (click tabs to switch windows)
|
|
48
|
+
- 1-based window/pane indexing
|
|
49
|
+
- Silent (no bell, no activity alerts)
|
|
50
|
+
- Ghostty-compatible extended keys
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
source "$ROOT_DIR/lib/common.sh"
|
|
7
|
+
|
|
8
|
+
step "Installing tmux config (oh-my-tmux)"
|
|
9
|
+
|
|
10
|
+
ensure_cmd tmux
|
|
11
|
+
|
|
12
|
+
ensure_cmd git
|
|
13
|
+
|
|
14
|
+
# ─── oh-my-tmux ───
|
|
15
|
+
|
|
16
|
+
OMT_DIR="$HOME/.oh-my-tmux"
|
|
17
|
+
if [[ -d "$OMT_DIR" ]]; then
|
|
18
|
+
ok "oh-my-tmux already cloned"
|
|
19
|
+
else
|
|
20
|
+
git clone --depth 1 --single-branch https://github.com/gpakosz/.tmux.git "$OMT_DIR"
|
|
21
|
+
ok "oh-my-tmux cloned"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# ─── Config ───
|
|
25
|
+
|
|
26
|
+
CONF_DEST="$HOME/.tmux.conf"
|
|
27
|
+
LOCAL_DEST="$HOME/.tmux.conf.local"
|
|
28
|
+
|
|
29
|
+
backup_file "$CONF_DEST"
|
|
30
|
+
backup_file "$LOCAL_DEST"
|
|
31
|
+
|
|
32
|
+
[[ -L "$CONF_DEST" ]] && rm "$CONF_DEST"
|
|
33
|
+
ln -sf "$OMT_DIR/.tmux.conf" "$CONF_DEST"
|
|
34
|
+
ok "tmux.conf ${D}→ ~/.tmux.conf (symlinked to oh-my-tmux)${R}"
|
|
35
|
+
|
|
36
|
+
ln -sf "$SCRIPT_DIR/.tmux.conf.local" "$LOCAL_DEST"
|
|
37
|
+
ok ".tmux.conf.local ${D}→ ~/.tmux.conf.local (symlinked)${R}"
|
|
38
|
+
|
|
39
|
+
# ─── Shell helpers (auto-name tmux sessions from CWD) ───
|
|
40
|
+
|
|
41
|
+
HELPERS_SRC="$SCRIPT_DIR/shell-helpers.sh"
|
|
42
|
+
SNIPPET="[ -f \"$HELPERS_SRC\" ] && source \"$HELPERS_SRC\" # claude-config tmux helpers"
|
|
43
|
+
|
|
44
|
+
for rc in "$HOME/.zshrc" "$HOME/.bashrc"; do
|
|
45
|
+
[[ -f "$rc" ]] || continue
|
|
46
|
+
if ! grep -Fq "claude-config tmux helpers" "$rc" 2>/dev/null; then
|
|
47
|
+
printf '\n%s\n' "$SNIPPET" >> "$rc"
|
|
48
|
+
ok "shell helpers ${D}→ $(basename "$rc")${R}"
|
|
49
|
+
else
|
|
50
|
+
ok "shell helpers already in $(basename "$rc")"
|
|
51
|
+
fi
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
echo ""
|
|
55
|
+
echo -e " ${GRN}Done!${R} Run ${CYN}tmux${R} to start"
|
|
56
|
+
echo -e " ${D}Prefix: Ctrl+b | Reload: prefix r${R}"
|
|
57
|
+
echo ""
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import { existsSync, copyFileSync, writeFileSync, readFileSync } from 'fs';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
|
|
7
|
+
const HOME = homedir();
|
|
8
|
+
const DEST = join(HOME, '.tmux.conf');
|
|
9
|
+
|
|
10
|
+
// Detect clipboard
|
|
11
|
+
let COPY_CMD = 'pbcopy';
|
|
12
|
+
let PASTE_CMD = 'pbpaste';
|
|
13
|
+
if (process.platform === 'linux') {
|
|
14
|
+
try { execSync('which xclip', { stdio: 'ignore' }); COPY_CMD = 'xclip -selection clipboard'; PASTE_CMD = 'xclip -selection clipboard -o'; }
|
|
15
|
+
catch { try { execSync('which xsel', { stdio: 'ignore' }); COPY_CMD = 'xsel --clipboard --input'; PASTE_CMD = 'xsel --clipboard --output'; }
|
|
16
|
+
catch { COPY_CMD = ''; PASTE_CMD = ''; } }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Check tmux
|
|
20
|
+
let tmuxVersion = '';
|
|
21
|
+
try { tmuxVersion = execSync('tmux -V', { encoding: 'utf8' }).trim().match(/[\d.]+/)?.[0] || ''; }
|
|
22
|
+
catch { /* not installed */ }
|
|
23
|
+
|
|
24
|
+
p.intro('tmux config builder');
|
|
25
|
+
|
|
26
|
+
if (!tmuxVersion) {
|
|
27
|
+
p.log.error('tmux not found — brew install tmux (mac) / apt install tmux (linux)');
|
|
28
|
+
p.outro('');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
p.log.success(`tmux ${tmuxVersion}`);
|
|
33
|
+
if (COPY_CMD) p.log.success(`clipboard: ${COPY_CMD.split(' ')[0]}`);
|
|
34
|
+
else p.log.warn('no clipboard tool found — clipboard features will be skipped');
|
|
35
|
+
|
|
36
|
+
const features = await p.multiselect({
|
|
37
|
+
message: 'Select features',
|
|
38
|
+
options: [
|
|
39
|
+
{ value: 'scrollback', label: 'Scrollback 100k', hint: 'default is 2,000 — Claude eats that fast' },
|
|
40
|
+
{ value: 'colors', label: 'True color + unicode', hint: 'full 16M colors + symbols ▶ ✓ ⚡' },
|
|
41
|
+
{ value: 'escape', label: 'No escape delay', hint: '0ms instead of 500ms — snappy vim' },
|
|
42
|
+
{ value: 'mouse', label: 'Mouse support', hint: 'click panes, scroll, drag to resize' },
|
|
43
|
+
{ value: 'splits', label: 'Intuitive splits', hint: '| and - instead of % and "' },
|
|
44
|
+
{ value: 'vimnav', label: 'Vim navigation', hint: 'h/j/k/l to move, H/J/K/L to resize' },
|
|
45
|
+
{ value: 'clipboard', label: 'System clipboard', hint: 'copy in tmux → Cmd+V works' },
|
|
46
|
+
{ value: 'statusbar', label: 'Minimal status bar', hint: 'session name + folder-labeled windows' },
|
|
47
|
+
{ value: 'autorename', label: 'Auto window names', hint: 'project, server, logs — not zsh, zsh, zsh' },
|
|
48
|
+
{ value: 'qol', label: 'Quality of life', hint: 'Ctrl+b r reload, no bells, renumber' },
|
|
49
|
+
],
|
|
50
|
+
initialValues: ['scrollback', 'colors', 'escape', 'mouse', 'splits', 'vimnav', 'clipboard', 'statusbar', 'autorename', 'qol'],
|
|
51
|
+
required: false,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
if (p.isCancel(features)) { p.outro('cancelled'); process.exit(0); }
|
|
55
|
+
|
|
56
|
+
const has = (f) => features.includes(f);
|
|
57
|
+
|
|
58
|
+
// Sub-choice: mouse drag
|
|
59
|
+
let mouseHighlight = true;
|
|
60
|
+
if (has('mouse') && has('clipboard')) {
|
|
61
|
+
const drag = await p.select({
|
|
62
|
+
message: 'Mouse drag behavior',
|
|
63
|
+
options: [
|
|
64
|
+
{ value: 'highlight', label: 'Highlight only', hint: 'press y to copy — prevents accidental overwrites' },
|
|
65
|
+
{ value: 'auto', label: 'Auto-copy on drag', hint: 'faster but can overwrite clipboard by accident' },
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
if (p.isCancel(drag)) { p.outro('cancelled'); process.exit(0); }
|
|
69
|
+
mouseHighlight = drag === 'highlight';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Build config
|
|
73
|
+
const lines = ['# Generated by tmux config builder', '# https://github.com/quickcall-dev/claude-config/tree/main/tmux', ''];
|
|
74
|
+
|
|
75
|
+
if (has('scrollback')) lines.push('set -g history-limit 100000', '');
|
|
76
|
+
if (has('colors')) lines.push('set -g default-terminal "tmux-256color"', 'set -ga terminal-overrides ",xterm-256color:Tc"', '');
|
|
77
|
+
if (has('escape')) lines.push('set -sg escape-time 0', '');
|
|
78
|
+
if (has('mouse')) lines.push('set -g mouse on', '');
|
|
79
|
+
lines.push('# kitty graphics passthrough — inline images in nvim (snacks.image)', 'set -gq allow-passthrough on', '');
|
|
80
|
+
|
|
81
|
+
if (has('splits')) {
|
|
82
|
+
lines.push(
|
|
83
|
+
'bind | split-window -h -c "#{pane_current_path}"',
|
|
84
|
+
'bind - split-window -v -c "#{pane_current_path}"',
|
|
85
|
+
'bind c new-window -c "#{pane_current_path}"',
|
|
86
|
+
''
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (has('vimnav')) {
|
|
91
|
+
lines.push(
|
|
92
|
+
'bind h select-pane -L', 'bind j select-pane -D',
|
|
93
|
+
'bind k select-pane -U', 'bind l select-pane -R',
|
|
94
|
+
'bind -r H resize-pane -L 5', 'bind -r J resize-pane -D 5',
|
|
95
|
+
'bind -r K resize-pane -U 5', 'bind -r L resize-pane -R 5',
|
|
96
|
+
''
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (has('clipboard') && COPY_CMD) {
|
|
101
|
+
lines.push(
|
|
102
|
+
'setw -g mode-keys vi',
|
|
103
|
+
`set -s copy-command '${COPY_CMD}'`,
|
|
104
|
+
'bind -T copy-mode-vi v send -X begin-selection',
|
|
105
|
+
'bind -T copy-mode-vi y send -X copy-selection-and-cancel',
|
|
106
|
+
'bind -T copy-mode-vi Enter send -X copy-selection-and-cancel',
|
|
107
|
+
);
|
|
108
|
+
if (has('mouse')) {
|
|
109
|
+
lines.push(mouseHighlight
|
|
110
|
+
? 'bind -T copy-mode-vi MouseDragEnd1Pane send -X cancel'
|
|
111
|
+
: 'bind -T copy-mode-vi MouseDragEnd1Pane send -X copy-selection-and-cancel'
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
lines.push(`bind p run "${PASTE_CMD} | tmux load-buffer - && tmux paste-buffer"`, '');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (has('statusbar')) {
|
|
118
|
+
lines.push(
|
|
119
|
+
'set -g status-interval 5', 'set -g status-position bottom',
|
|
120
|
+
'set -g status-style bg=colour235,fg=colour248',
|
|
121
|
+
'set -g status-left-length 30',
|
|
122
|
+
'set -g status-left "#[fg=colour214,bold] #S #[fg=colour248]| "',
|
|
123
|
+
'setw -g window-status-format " #I:#{b:pane_current_path} "',
|
|
124
|
+
'setw -g window-status-current-format "#[fg=colour214,bold] #I:#{b:pane_current_path} "',
|
|
125
|
+
''
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (has('autorename')) {
|
|
130
|
+
lines.push(
|
|
131
|
+
'set -g allow-rename on', 'setw -g automatic-rename on',
|
|
132
|
+
"setw -g automatic-rename-format '#{b:pane_current_path}'",
|
|
133
|
+
''
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (has('qol')) {
|
|
138
|
+
lines.push(
|
|
139
|
+
'bind r source-file ~/.tmux.conf \\; display "Config reloaded!"',
|
|
140
|
+
'bind S new-session', 'set -g renumber-windows on',
|
|
141
|
+
'set -g visual-activity off', 'set -g visual-bell off',
|
|
142
|
+
'set -g visual-silence off', 'setw -g monitor-activity off',
|
|
143
|
+
'set -g bell-action none', 'set -g focus-events on',
|
|
144
|
+
''
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const conf = lines.join('\n');
|
|
149
|
+
|
|
150
|
+
p.log.step(`${features.length}/10 features selected`);
|
|
151
|
+
|
|
152
|
+
// Install
|
|
153
|
+
let dest = DEST;
|
|
154
|
+
|
|
155
|
+
if (existsSync(DEST)) {
|
|
156
|
+
const action = await p.select({
|
|
157
|
+
message: '~/.tmux.conf already exists',
|
|
158
|
+
options: [
|
|
159
|
+
{ value: 'replace', label: 'Replace', hint: 'backs up current config' },
|
|
160
|
+
{ value: 'side', label: 'Save as .tmux.conf.claude', hint: 'try before switching' },
|
|
161
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
162
|
+
],
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (p.isCancel(action) || action === 'cancel') { p.outro('no changes'); process.exit(0); }
|
|
166
|
+
|
|
167
|
+
if (action === 'replace') {
|
|
168
|
+
const backup = `${DEST}.backup.${new Date().toISOString().replace(/[:.]/g, '').slice(0, 15)}`;
|
|
169
|
+
copyFileSync(DEST, backup);
|
|
170
|
+
writeFileSync(DEST, conf);
|
|
171
|
+
p.log.success(`backup → ${backup}`);
|
|
172
|
+
p.log.success(`installed → ${DEST}`);
|
|
173
|
+
} else {
|
|
174
|
+
dest = `${DEST}.claude`;
|
|
175
|
+
writeFileSync(dest, conf);
|
|
176
|
+
p.log.success(`saved → ${dest}`);
|
|
177
|
+
p.log.info('try: tmux source-file ~/.tmux.conf.claude');
|
|
178
|
+
p.log.info('keep: mv ~/.tmux.conf.claude ~/.tmux.conf');
|
|
179
|
+
}
|
|
180
|
+
} else {
|
|
181
|
+
writeFileSync(DEST, conf);
|
|
182
|
+
p.log.success(`installed → ${DEST}`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Reload if inside tmux
|
|
186
|
+
if (process.env.TMUX && dest === DEST) {
|
|
187
|
+
try { execSync('tmux source-file ~/.tmux.conf', { stdio: 'ignore' }); p.log.success('reloaded'); }
|
|
188
|
+
catch { /* ignore */ }
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
p.outro('Ctrl+b r to reload anytime');
|