configs-all 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.
Files changed (227) hide show
  1. package/.claude/settings.local.json +3 -0
  2. package/CLAUDE.md +94 -0
  3. package/README.md +424 -0
  4. package/TERMINAL_SHORTCUTS.md +96 -0
  5. package/WINDOWS_COMPATIBILITY.md +85 -0
  6. package/WINDOWS_MCP_SETUP.md +133 -0
  7. package/apps/RectangleConfig.plist +0 -0
  8. package/apps/Synergy +84 -0
  9. package/apps/iStat Menus Settings.ismp7 +0 -0
  10. package/claude/CLAUDE.md +228 -0
  11. package/claude/commands/changelog.md +36 -0
  12. package/claude/commands/commit.md +29 -0
  13. package/claude/commands/context.md +112 -0
  14. package/claude/commands/dash.md +37 -0
  15. package/claude/commands/deploy-check.md +37 -0
  16. package/claude/commands/deps.md +26 -0
  17. package/claude/commands/duplo.md +56 -0
  18. package/claude/commands/explain.md +43 -0
  19. package/claude/commands/fix-and-test.md +46 -0
  20. package/claude/commands/game-debug.md +66 -0
  21. package/claude/commands/games.md +53 -0
  22. package/claude/commands/go.md +147 -0
  23. package/claude/commands/guard.md +102 -0
  24. package/claude/commands/handoff.md +66 -0
  25. package/claude/commands/incident.md +144 -0
  26. package/claude/commands/init.md +78 -0
  27. package/claude/commands/k8s-debug.md +31 -0
  28. package/claude/commands/lint.md +27 -0
  29. package/claude/commands/merge-all.md +115 -0
  30. package/claude/commands/merge.md +129 -0
  31. package/claude/commands/mikpc.md +54 -0
  32. package/claude/commands/morning.md +72 -0
  33. package/claude/commands/partymode.md +105 -0
  34. package/claude/commands/plans.md +88 -0
  35. package/claude/commands/pr.md +41 -0
  36. package/claude/commands/prep.md +132 -0
  37. package/claude/commands/push-sync.md +82 -0
  38. package/claude/commands/push.md +34 -0
  39. package/claude/commands/research.md +73 -0
  40. package/claude/commands/retro.md +95 -0
  41. package/claude/commands/review-pr.md +96 -0
  42. package/claude/commands/review.md +41 -0
  43. package/claude/commands/scaffold-agent.md +45 -0
  44. package/claude/commands/setup.md +92 -0
  45. package/claude/commands/ship-prod.md +97 -0
  46. package/claude/commands/ship.md +82 -0
  47. package/claude/commands/simplify.md +42 -0
  48. package/claude/commands/spike.md +110 -0
  49. package/claude/commands/status.md +37 -0
  50. package/claude/commands/sync.md +72 -0
  51. package/claude/commands/test.md +29 -0
  52. package/claude/commands/triage.md +72 -0
  53. package/claude/desktop/claude_desktop_config.json +9 -0
  54. package/claude/hooks.json +15 -0
  55. package/claude/mcp-servers.duplo.json +8 -0
  56. package/claude/mcp-servers.json +62 -0
  57. package/claude/scripts/psdebug.ps1 +7 -0
  58. package/claude/settings.json +38 -0
  59. package/claude/settings.local.json +4 -0
  60. package/claude/statusline-command.sh +94 -0
  61. package/claude/templates/CLAUDE-k8s-devops.md +58 -0
  62. package/claude/templates/CLAUDE-python-agent.md +47 -0
  63. package/claude/templates/CLAUDE-typescript-frontend.md +50 -0
  64. package/docker/ai-stack/docker-compose.yml +76 -0
  65. package/docker/ai-stack/searxng/limiter.toml +3 -0
  66. package/docker/ai-stack/searxng/settings.yml +39 -0
  67. package/docker/cli/config.json.template +15 -0
  68. package/docker/cli/daemon.json +9 -0
  69. package/docker/cli/features.json +3 -0
  70. package/docker/mcp/catalog.json +9 -0
  71. package/docker/mcp/catalogs/docker-mcp.yaml +15107 -0
  72. package/docker/mcp/config.yaml +0 -0
  73. package/docker/mcp/registry.yaml +37 -0
  74. package/docker/mcp/tools.yaml +0 -0
  75. package/docs/context/.gitkeep +0 -0
  76. package/docs/context/2026-03-02-configs.md +142 -0
  77. package/docs/handoff/.gitkeep +0 -0
  78. package/docs/incidents/.gitkeep +0 -0
  79. package/docs/plans/2026-02-28-autonomous-command-suite-design.md +250 -0
  80. package/docs/plans/2026-02-28-autonomous-command-suite.md +682 -0
  81. package/docs/plans/2026-03-01-ai-stack-split-architecture.md +72 -0
  82. package/docs/plans/2026-03-02-ai-stack-expansion.md +33 -0
  83. package/docs/plans/2026-03-02-merge-commands-design.md +58 -0
  84. package/docs/plans/2026-03-02-merge-commands.md +354 -0
  85. package/docs/research/.gitkeep +0 -0
  86. package/docs/research/2026-03-02-configs-repo-architecture.md +152 -0
  87. package/docs/retros/.gitkeep +0 -0
  88. package/docs/retros/2026-03-01-ai-stack-split-architecture.md +38 -0
  89. package/docs/spikes/.gitkeep +0 -0
  90. package/gh/config.yml +16 -0
  91. package/gh/hosts.yml +5 -0
  92. package/gh/main.json +103 -0
  93. package/ghostty/config +90 -0
  94. package/git/config/base.gitconfig +46 -0
  95. package/git/config/chiefmikey.gitconfig +11 -0
  96. package/git/config/personal.gitconfig +10 -0
  97. package/git/config/work.gitconfig +14 -0
  98. package/ide/cursor/extensions.txt +111 -0
  99. package/ide/cursor/keybindings.json +307 -0
  100. package/ide/cursor/mcp.json +92 -0
  101. package/ide/cursor/settings.json +544 -0
  102. package/ide/vscode/extensions.txt +120 -0
  103. package/ide/vscode/insiders/extensions.txt +119 -0
  104. package/ide/vscode/insiders/keybindings.json +294 -0
  105. package/ide/vscode/insiders/settings.json +518 -0
  106. package/ide/vscode/keybindings.json +294 -0
  107. package/ide/vscode/settings.json +526 -0
  108. package/ide/vscode/vscode/extensions.txt +43 -0
  109. package/iterm/Mikey Pro.json +951 -0
  110. package/iterm/com.googlecode.iterm2.plist +5549 -0
  111. package/iterm/font/MesloLGS NF Bold Italic.ttf +0 -0
  112. package/iterm/font/MesloLGS NF Bold.ttf +0 -0
  113. package/iterm/font/MesloLGS NF Italic.ttf +0 -0
  114. package/iterm/font/MesloLGS NF Regular.ttf +0 -0
  115. package/package.json +15 -0
  116. package/scripts/ai/deploy-ai-stack.sh +119 -0
  117. package/scripts/ai/fix-ai-proxy.service +12 -0
  118. package/scripts/ai/fix-ai-proxy.sh +25 -0
  119. package/scripts/brew/search/brew-search-results.sh +19 -0
  120. package/scripts/brew/search/brew-search.sh +34 -0
  121. package/scripts/brew/upgrade/brew-upgrade-autoupdate.sh +5 -0
  122. package/scripts/brew/upgrade/brew-upgrade-full-auto.sh +89 -0
  123. package/scripts/brew/upgrade/brew-upgrade-full.sh +159 -0
  124. package/scripts/docker/cleanup/docker-cleanup-manage.sh +163 -0
  125. package/scripts/docker/cleanup/docker-cleanup.cron +12 -0
  126. package/scripts/docker/cleanup/docker-cleanup.sh +280 -0
  127. package/scripts/docker/install/README.md +23 -0
  128. package/scripts/docker/install/docker-al2.sh +7 -0
  129. package/scripts/docker/install/docker-compose-al2.sh +15 -0
  130. package/scripts/gh/auth/auth.sh +12 -0
  131. package/scripts/gh/config/gh-config.sh +3 -0
  132. package/scripts/gh/gist/gh-gist-create.sh +29 -0
  133. package/scripts/gh/gist/gh-gist-delete.sh +1 -0
  134. package/scripts/gh/gist/gh-gist-edit.sh +8 -0
  135. package/scripts/gh/gpg-key/gh-gpg-key-add.sh +3 -0
  136. package/scripts/gh/install/install.sh +7 -0
  137. package/scripts/gh/label/gh-label-clone.sh +0 -0
  138. package/scripts/gh/label/gh-label-create.sh +0 -0
  139. package/scripts/gh/label/gh-label-delete.sh +0 -0
  140. package/scripts/gh/label/gh-label-edit.sh +0 -0
  141. package/scripts/gh/label/gh-label-list.sh +0 -0
  142. package/scripts/gh/secret/gh-secret-delete.sh +24 -0
  143. package/scripts/gh/secret/gh-secret-set.sh +70 -0
  144. package/scripts/gh/ssh-key/gh-ssh-key-add.sh +8 -0
  145. package/scripts/git/add/git-add.sh +3 -0
  146. package/scripts/git/auth/README.md +11 -0
  147. package/scripts/git/auth/https.sh +20 -0
  148. package/scripts/git/auth/ssh-mac.sh +41 -0
  149. package/scripts/git/branch-delete/git-branch-delete.sh +16 -0
  150. package/scripts/git/checkout/git-checkout-stash.sh +32 -0
  151. package/scripts/git/temp/git-temp-pull.sh +6 -0
  152. package/scripts/git/temp/git-temp-push.sh +5 -0
  153. package/scripts/install/fresh.zsh +34 -0
  154. package/scripts/install/full-install.zsh +193 -0
  155. package/scripts/linux/codedeploy/README.md +19 -0
  156. package/scripts/linux/codedeploy/linux-codedeploy-al2.sh +13 -0
  157. package/scripts/linux/codedeploy/linux-codedeploy-index.sh +16 -0
  158. package/scripts/linux/codedeploy/linux-codedeploy-ubuntu.sh +14 -0
  159. package/scripts/linux/coredns/README.md +17 -0
  160. package/scripts/linux/coredns/linux-coredns-al2.sh +29 -0
  161. package/scripts/linux/wifi/01-netconf.yaml +21 -0
  162. package/scripts/linux/wifi/wifi-ubuntu.sh +17 -0
  163. package/scripts/mac/dock-sort/mac-dock-sort.sh +87 -0
  164. package/scripts/mac/dropbox-ignore/mac-dropbox-ignore.sh +12 -0
  165. package/scripts/mac/sudo-askpass/mac-sudo-askpass.sh +50 -0
  166. package/scripts/mac/sudo-askpass/setup-sudo-password.sh +49 -0
  167. package/scripts/mac/upgrade/mac-upgrade.sh +21 -0
  168. package/scripts/mac/vpn/mac-vpn.sh +4 -0
  169. package/scripts/mcp/aws-mcp-wrapper.ps1 +97 -0
  170. package/scripts/mcp/aws-mcp-wrapper.sh +53 -0
  171. package/scripts/mcp/duplo-mcp-wrapper.sh +31 -0
  172. package/scripts/mcp/filesystem-mcp-wrapper.ps1 +43 -0
  173. package/scripts/mcp/filesystem-mcp-wrapper.sh +34 -0
  174. package/scripts/mcp/git-mcp-wrapper.ps1 +42 -0
  175. package/scripts/mcp/git-mcp-wrapper.sh +33 -0
  176. package/scripts/mcp/github-mcp-wrapper.ps1 +43 -0
  177. package/scripts/mcp/github-mcp-wrapper.sh +19 -0
  178. package/scripts/mcp/kubernetes-mcp-wrapper.ps1 +22 -0
  179. package/scripts/mcp/kubernetes-mcp-wrapper.sh +16 -0
  180. package/scripts/mcp/mcp-launcher.ps1 +56 -0
  181. package/scripts/mcp/mcp-launcher.sh +71 -0
  182. package/scripts/mcp/mongodb-mcp-wrapper.ps1 +26 -0
  183. package/scripts/mcp/mongodb-mcp-wrapper.sh +17 -0
  184. package/scripts/mcp/notion-mcp-wrapper.ps1 +23 -0
  185. package/scripts/mcp/notion-mcp-wrapper.sh +14 -0
  186. package/scripts/mcp/postgres-mcp-wrapper.ps1 +23 -0
  187. package/scripts/mcp/postgres-mcp-wrapper.sh +16 -0
  188. package/scripts/npm/ncu/npm-ncu.sh +24 -0
  189. package/scripts/npm/upgrade/npm-upgrade.sh +51 -0
  190. package/scripts/qmk/build_reviung41.sh +28 -0
  191. package/scripts/qmk/sync_unicorne.sh +44 -0
  192. package/scripts/sync/README.md +64 -0
  193. package/scripts/sync/config-common.zsh +882 -0
  194. package/scripts/sync/pull-configs.ps1 +33 -0
  195. package/scripts/sync/pull-configs.zsh +278 -0
  196. package/scripts/sync/push-configs.ps1 +91 -0
  197. package/scripts/sync/push-configs.zsh +384 -0
  198. package/shell/alias/alias-d.zsh +333 -0
  199. package/shell/alias/alias.zsh +36 -0
  200. package/shell/alias/categories/development.zsh +157 -0
  201. package/shell/alias/categories/environment.zsh +13 -0
  202. package/shell/alias/categories/git.zsh +40 -0
  203. package/shell/alias/categories/github-functions.zsh +459 -0
  204. package/shell/alias/categories/network.zsh +46 -0
  205. package/shell/alias/categories/path.zsh +46 -0
  206. package/shell/alias/categories/system.zsh +78 -0
  207. package/shell/alias/categories/wolfe-server.zsh +11 -0
  208. package/shell/powershell/Microsoft.PowerShell_profile.ps1 +208 -0
  209. package/shell/zsh/.p10k.zsh +1832 -0
  210. package/shell/zsh/.zshrc +87 -0
  211. package/shell/zsh/config/completion.zsh +31 -0
  212. package/shell/zsh/config/functions.zsh +31 -0
  213. package/shell/zsh/config/keybindings.zsh +13 -0
  214. package/shell/zsh/config/options.zsh +56 -0
  215. package/shell/zsh/config/plugins.zsh +83 -0
  216. package/shell/zsh/config/variables.zsh +191 -0
  217. package/shell/zsh/powerlevel10k.zsh-theme +83 -0
  218. package/shell/zsh/zsh-autosuggestions.zsh +871 -0
  219. package/ssh/config +46 -0
  220. package/ssh/config.duplo +21 -0
  221. package/ssh/config.mikpc +35 -0
  222. package/ssh/personal_signing.pub +1 -0
  223. package/templates/.envrc.example +34 -0
  224. package/templates/.envrc.quickstart +17 -0
  225. package/wezterm/wezterm.lua +249 -0
  226. package/wsl/.wslconfig +3 -0
  227. package/wsl/wsl.conf +18 -0
@@ -0,0 +1,384 @@
1
+ #!/bin/zsh
2
+
3
+ # Unified Configuration Push Script
4
+ # Pushes configurations from repo to system locations with validation
5
+
6
+ set -uo pipefail
7
+
8
+ # Source common functions
9
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
10
+ source "${SCRIPT_DIR}/config-common.zsh"
11
+
12
+ # Additional push-specific functions
13
+ push_zsh_theme() {
14
+ local theme_src="${CONFIG_DIR}/shell/zsh/powerlevel10k.zsh-theme"
15
+ local theme_dest=""
16
+
17
+ if [[ ! -f "$theme_src" ]]; then
18
+ warn "Theme source not found: $theme_src"
19
+ return
20
+ fi
21
+
22
+ # Determine theme destination based on platform and installation method
23
+ if [[ "$IS_MAC" == "true" ]] && command -v brew >/dev/null 2>&1; then
24
+ theme_dest="$(brew --prefix)/share/powerlevel10k/powerlevel10k.zsh-theme"
25
+ elif [[ -d "${HOME}/.oh-my-zsh/custom/themes/powerlevel10k" ]]; then
26
+ theme_dest="${HOME}/.oh-my-zsh/custom/themes/powerlevel10k/powerlevel10k.zsh-theme"
27
+ elif [[ -d "${HOME}/.config/powerlevel10k" ]]; then
28
+ theme_dest="${HOME}/.config/powerlevel10k/powerlevel10k.zsh-theme"
29
+ fi
30
+
31
+ if [[ -n "$theme_dest" ]]; then
32
+ ensure_dir "$(dirname "$theme_dest")"
33
+ safe_copy "$theme_src" "$theme_dest" ""
34
+ success "Pushed zsh theme: $theme_src → $theme_dest"
35
+ else
36
+ warn "Could not determine theme destination; skipping powerlevel10k theme install"
37
+ fi
38
+ }
39
+
40
+ push_extensions() {
41
+ local editor="$1"
42
+ local extensions_file
43
+
44
+ case "$editor" in
45
+ "cursor")
46
+ extensions_file="${CONFIG_DIR}/ide/cursor/extensions.txt"
47
+ ;;
48
+ "vscode"|"insiders")
49
+ extensions_file="${CONFIG_DIR}/ide/vscode/${editor}/extensions.txt"
50
+ ;;
51
+ *)
52
+ extensions_file="${CONFIG_DIR}/ide/vscode/${editor}/extensions.txt"
53
+ ;;
54
+ esac
55
+
56
+ if [[ -f "$extensions_file" ]]; then
57
+ info "Extensions list available for $editor (extensions managed by $editor)"
58
+ else
59
+ warn "Extensions list not found: $extensions_file"
60
+ fi
61
+ }
62
+
63
+ push_claude_dirs() {
64
+ # Sync Claude Code commands, templates, and scripts directories (repo → system)
65
+ # Copies all source files AND removes files in dest that no longer exist in source
66
+ local claude_dirs=("commands" "templates" "scripts")
67
+ for dir_name in "${claude_dirs[@]}"; do
68
+ local src_dir="${CONFIG_DIR}/claude/${dir_name}"
69
+ local dest_dir="${HOME}/.claude/${dir_name}"
70
+ if [[ -d "$src_dir" ]]; then
71
+ ensure_dir "$dest_dir"
72
+ # Sync all files from repo to system (md, ps1, sh, etc.)
73
+ for src_file in "${src_dir}"/*(N.); do
74
+ local basename="${src_file##*/}"
75
+ cp "$src_file" "${dest_dir}/${basename}"
76
+ done
77
+ # Remove files in dest that no longer exist in source
78
+ local removed_count=0
79
+ for dest_file in "${dest_dir}"/*(N.); do
80
+ local basename="${dest_file##*/}"
81
+ if [[ ! -f "${src_dir}/${basename}" ]]; then
82
+ rm "$dest_file"
83
+ info "Cleaned up removed file: ${dest_dir}/${basename}"
84
+ ((removed_count++))
85
+ fi
86
+ done
87
+ if (( removed_count > 0 )); then
88
+ success "Pushed Claude ${dir_name}: ${src_dir} → ${dest_dir} (${removed_count} stale file(s) removed)"
89
+ else
90
+ success "Pushed Claude ${dir_name}: ${src_dir} → ${dest_dir}"
91
+ fi
92
+
93
+ # On Windows, also deploy to Windows native Claude path
94
+ if [[ "$IS_WINDOWS" == "true" ]] && [[ -d "/mnt/c/Users/${WINDOWS_USER:-$USER}" ]]; then
95
+ local win_dest="/mnt/c/Users/${WINDOWS_USER:-$USER}/.claude/${dir_name}"
96
+ ensure_dir "$win_dest"
97
+ for src_file in "${src_dir}"/*(N.); do
98
+ local basename="${src_file##*/}"
99
+ cp "$src_file" "${win_dest}/${basename}"
100
+ done
101
+ # Remove stale files on Windows too
102
+ for dest_file in "${win_dest}"/*(N.); do
103
+ local basename="${dest_file##*/}"
104
+ if [[ ! -f "${src_dir}/${basename}" ]]; then
105
+ rm "$dest_file"
106
+ info "Cleaned up removed file (Windows): ${win_dest}/${basename}"
107
+ fi
108
+ done
109
+ success "Pushed Claude ${dir_name} (Windows native): ${src_dir} → ${win_dest}"
110
+ fi
111
+ else
112
+ warn "Claude ${dir_name} directory not found in repo: ${src_dir}"
113
+ fi
114
+ done
115
+ }
116
+
117
+ push_mcp_servers() {
118
+ # Sync MCP server definitions from repo into ~/.claude.json
119
+ # ~/.claude.json is Claude Code's internal state file that also holds mcpServers
120
+ # We merge just the mcpServers key without overwriting other state
121
+ local mcp_src="${CONFIG_DIR}/claude/mcp-servers.json"
122
+ if [[ ! -f "$mcp_src" ]]; then
123
+ warn "MCP servers config not found: $mcp_src"
124
+ return
125
+ fi
126
+ if ! command -v jq >/dev/null 2>&1; then
127
+ warn "jq not available; skipping MCP servers sync"
128
+ return
129
+ fi
130
+
131
+ # Read canonical MCP definitions, resolve __CONFIG_DIR__ placeholder
132
+ local mcp_json
133
+ mcp_json=$(sed "s|__CONFIG_DIR__|${CONFIG_DIR}|g" "$mcp_src")
134
+
135
+ if ! echo "$mcp_json" | jq empty 2>/dev/null; then
136
+ error "Invalid JSON in MCP servers config after substitution"
137
+ return
138
+ fi
139
+
140
+ # Merge host-specific MCP servers if a file exists (e.g., mcp-servers.duplo.json)
141
+ local host_mcp_src="${CONFIG_DIR}/claude/mcp-servers.${HOST}.json"
142
+ if [[ -f "$host_mcp_src" ]]; then
143
+ local host_mcp_json
144
+ host_mcp_json=$(sed "s|__CONFIG_DIR__|${CONFIG_DIR}|g" "$host_mcp_src")
145
+ if echo "$host_mcp_json" | jq empty 2>/dev/null; then
146
+ mcp_json=$(echo "$mcp_json" | jq --argjson host "$host_mcp_json" '. + $host')
147
+ info "Merged host-specific MCP servers from mcp-servers.${HOST}.json"
148
+ else
149
+ warn "Invalid JSON in host-specific MCP servers config: $host_mcp_src"
150
+ fi
151
+ fi
152
+
153
+ # Merge into WSL/Mac ~/.claude.json
154
+ local target="${HOME}/.claude.json"
155
+ if [[ -f "$target" ]]; then
156
+ local tmp
157
+ tmp=$(mktemp)
158
+ jq --argjson servers "$mcp_json" '.mcpServers = $servers' "$target" > "$tmp" && mv "$tmp" "$target"
159
+ success "Merged MCP servers → $target"
160
+ else
161
+ echo '{}' | jq --argjson servers "$mcp_json" '. + {mcpServers: $servers}' > "$target"
162
+ success "Created $target with MCP servers"
163
+ fi
164
+
165
+ # Enforce required preferences in ~/.claude.json
166
+ enforce_claude_preferences "$target"
167
+
168
+ # On Windows, also deploy to Windows native path with wrapper script path transforms
169
+ if [[ "$IS_WINDOWS" == "true" ]] && [[ -d "/mnt/c/Users/${WINDOWS_USER}" ]]; then
170
+ local win_target="/mnt/c/Users/${WINDOWS_USER}/.claude.json"
171
+
172
+ # Determine Windows-native CONFIG_DIR path for wrapper scripts
173
+ local win_config_path
174
+ if [[ "$CONFIG_DIR" == /mnt/c/* ]]; then
175
+ win_config_path="C:${CONFIG_DIR#/mnt/c}"
176
+ else
177
+ local rel="${CONFIG_DIR#${HOME}/}"
178
+ win_config_path="C:\\Users\\${WINDOWS_USER}\\${rel}"
179
+ fi
180
+ # Convert remaining forward slashes to backslashes
181
+ win_config_path="${win_config_path//\//\\}"
182
+
183
+ # Transform wrapper script commands for Windows native:
184
+ # command: "/path/to/wrapper.sh" → command: "powershell.exe", args: ["-NoProfile", "-File", "C:\...\wrapper.ps1", ...original_args]
185
+ local win_mcp_json
186
+ win_mcp_json=$(echo "$mcp_json" | jq --arg wcp "$win_config_path" '
187
+ to_entries | map(
188
+ if (.value.command | test("/scripts/mcp/.*\\.sh$")) then
189
+ (.value.command | capture("(?<name>[^/]+)\\.sh$").name) as $base |
190
+ .value.args = (["-NoProfile", "-File", ($wcp + "\\scripts\\mcp\\" + $base + ".ps1")] + .value.args) |
191
+ .value.command = "powershell.exe"
192
+ else . end
193
+ ) | from_entries
194
+ ')
195
+
196
+ if [[ -f "$win_target" ]]; then
197
+ local tmp
198
+ tmp=$(mktemp)
199
+ jq --argjson servers "$win_mcp_json" '.mcpServers = $servers' "$win_target" > "$tmp" && mv "$tmp" "$win_target"
200
+ success "Merged MCP servers → $win_target (Windows native)"
201
+ else
202
+ echo '{}' | jq --argjson servers "$win_mcp_json" '. + {mcpServers: $servers}' > "$win_target"
203
+ success "Created $win_target with MCP servers (Windows native)"
204
+ fi
205
+ enforce_claude_preferences "$win_target"
206
+ fi
207
+ }
208
+
209
+ enforce_claude_preferences() {
210
+ # Ensure required Claude Code preferences are set in ~/.claude.json
211
+ # These settings can get reset by updates or config changes
212
+ local target="$1"
213
+ if [[ ! -f "$target" ]]; then
214
+ return
215
+ fi
216
+ local tmp
217
+ tmp=$(mktemp)
218
+ jq '.remoteControlAtStartup = true | .autoCompactEnabled = true' "$target" > "$tmp" && mv "$tmp" "$target"
219
+ success "Enforced Claude preferences (remoteControl, autoCompact) → $target"
220
+ }
221
+
222
+ main() {
223
+ info "Starting configuration push for host: $HOST"
224
+
225
+ # Process all configuration files
226
+ while IFS= read -r config_file; do
227
+ local dest_path
228
+ local validation_func
229
+
230
+ dest_path="$(get_dest_path "$config_file")"
231
+ validation_func="$(get_validation_func "$config_file")"
232
+
233
+ # Skip if destination path is empty (e.g., Mac-only configs on Windows)
234
+ if [[ -z "$dest_path" ]]; then
235
+ continue
236
+ fi
237
+
238
+ # Special handling for git config
239
+ if [[ "$config_file" == "git/config/$(get_git_config)" ]]; then
240
+ # Ensure .config/git directory exists
241
+ ensure_dir "${HOME}/.config/git"
242
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
243
+ # Special handling for MCP config (transform on Windows)
244
+ elif [[ "$config_file" == "ide/cursor/mcp.json" ]]; then
245
+ ensure_dir "$(dirname "$dest_path")"
246
+ if [[ "$IS_WINDOWS" == "true" ]] && [[ -n "$dest_path" ]]; then
247
+ # Transform Mac format to Windows format
248
+ local temp_file
249
+ temp_file="$(mktemp)"
250
+ transform_mcp_mac_to_windows "${CONFIG_DIR}/${config_file}" "$temp_file"
251
+ if [[ -n "$validation_func" ]] && ! "$validation_func" "$temp_file"; then
252
+ error "Validation failed for transformed MCP config, skipping copy"
253
+ rm -f "$temp_file"
254
+ else
255
+ # Create backup if destination exists
256
+ if [[ -f "$dest_path" ]]; then
257
+ local backup_dir
258
+ backup_dir="$(create_backup_dir "$dest_path")"
259
+ local file_basename
260
+ file_basename="$(basename "$dest_path")"
261
+ local backup_file="${backup_dir}/${file_basename}.backup.$(date +%Y%m%d_%H%M%S)"
262
+ cp "$dest_path" "$backup_file" 2>/dev/null || warn "Could not backup: $dest_path"
263
+ info "Backed up existing file: $backup_file"
264
+ fi
265
+ if cp "$temp_file" "$dest_path" 2>/dev/null; then
266
+ success "Copied (transformed): ${config_file} → $dest_path"
267
+ else
268
+ error "Failed to copy ${config_file} → $dest_path (permission denied?)"
269
+ fi
270
+ rm -f "$temp_file"
271
+ fi
272
+ elif [[ "$IS_MAC" == "true" ]] && [[ -n "$dest_path" ]]; then
273
+ # On Mac, copy directly
274
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
275
+ fi
276
+ # Special handling for Cursor settings (transform Mac paths on Windows)
277
+ elif [[ "$config_file" == "ide/cursor/settings.json" ]]; then
278
+ ensure_dir "$(dirname "$dest_path")"
279
+ if [[ "$IS_WINDOWS" == "true" ]] && [[ -n "$dest_path" ]]; then
280
+ # Transform Mac paths to Windows format
281
+ local temp_file
282
+ temp_file="$(mktemp)"
283
+ transform_cursor_settings_mac_to_windows "${CONFIG_DIR}/${config_file}" "$temp_file"
284
+ if [[ -n "$validation_func" ]] && ! "$validation_func" "$temp_file"; then
285
+ error "Validation failed for transformed settings config, skipping copy"
286
+ rm -f "$temp_file"
287
+ else
288
+ # Create backup if destination exists
289
+ if [[ -f "$dest_path" ]]; then
290
+ local backup_dir
291
+ backup_dir="$(create_backup_dir "$dest_path")"
292
+ local file_basename
293
+ file_basename="$(basename "$dest_path")"
294
+ local backup_file="${backup_dir}/${file_basename}.backup.$(date +%Y%m%d_%H%M%S)"
295
+ cp "$dest_path" "$backup_file" 2>/dev/null || warn "Could not backup: $dest_path"
296
+ info "Backed up existing file: $backup_file"
297
+ fi
298
+ if cp "$temp_file" "$dest_path" 2>/dev/null; then
299
+ success "Copied (transformed): ${config_file} → $dest_path"
300
+ else
301
+ error "Failed to copy ${config_file} → $dest_path (permission denied?)"
302
+ fi
303
+ rm -f "$temp_file"
304
+ fi
305
+ elif [[ "$IS_MAC" == "true" ]] && [[ -n "$dest_path" ]]; then
306
+ # On Mac, copy directly
307
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
308
+ fi
309
+ # Special handling for WezTerm (deploy to both WSL and Windows native on Windows)
310
+ elif [[ "$config_file" == "wezterm/wezterm.lua" ]]; then
311
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
312
+ if [[ "$IS_WINDOWS" == "true" ]] && [[ -d "/mnt/c/Users/${WINDOWS_USER:-$USER}" ]]; then
313
+ local win_wezterm_dir="/mnt/c/Users/${WINDOWS_USER:-$USER}/.config/wezterm"
314
+ ensure_dir "$win_wezterm_dir"
315
+ safe_copy "${CONFIG_DIR}/${config_file}" "${win_wezterm_dir}/wezterm.lua" ""
316
+ fi
317
+ # Special handling for Docker MCP configs
318
+ elif [[ "$config_file" == docker/mcp/* ]]; then
319
+ # Ensure .docker/mcp directory structure exists
320
+ # On Windows, Docker Desktop reads from Windows filesystem, not WSL
321
+ if [[ "$IS_WINDOWS" == "true" ]] && [[ -d "/mnt/c/Users/${WINDOWS_USER:-$USER}" ]]; then
322
+ ensure_dir "/mnt/c/Users/${WINDOWS_USER:-$USER}/.docker/mcp/catalogs"
323
+ else
324
+ ensure_dir "${HOME}/.docker/mcp/catalogs"
325
+ fi
326
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
327
+ # Special handling for Docker CLI configs
328
+ elif [[ "$config_file" == docker/cli/* ]]; then
329
+ # Ensure .docker directory exists
330
+ ensure_dir "${HOME}/.docker"
331
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
332
+ # Special handling for Claude Code configs (deploy to both WSL and Windows native)
333
+ elif [[ "$config_file" == claude/* ]]; then
334
+ ensure_dir "$(dirname "$dest_path")"
335
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
336
+ # On Windows, also deploy to Windows native Claude path
337
+ if [[ "$IS_WINDOWS" == "true" ]] && [[ -d "/mnt/c/Users/${WINDOWS_USER:-$USER}" ]]; then
338
+ local win_claude_dest=""
339
+ case "$config_file" in
340
+ "claude/settings.json") win_claude_dest="/mnt/c/Users/${WINDOWS_USER:-$USER}/.claude/settings.json" ;;
341
+ "claude/settings.local.json") win_claude_dest="/mnt/c/Users/${WINDOWS_USER:-$USER}/.claude/settings.local.json" ;;
342
+ "claude/hooks.json") win_claude_dest="/mnt/c/Users/${WINDOWS_USER:-$USER}/.claude/hooks.json" ;;
343
+ "claude/CLAUDE.md") win_claude_dest="/mnt/c/Users/${WINDOWS_USER:-$USER}/CLAUDE.md" ;;
344
+ "claude/statusline-command.sh") win_claude_dest="/mnt/c/Users/${WINDOWS_USER:-$USER}/.claude/statusline-command.sh" ;;
345
+ esac
346
+ if [[ -n "$win_claude_dest" ]]; then
347
+ ensure_dir "$(dirname "$win_claude_dest")"
348
+ safe_copy "${CONFIG_DIR}/${config_file}" "$win_claude_dest" "$validation_func"
349
+ fi
350
+ fi
351
+ # Special handling for wsl.conf (requires elevated permissions)
352
+ elif [[ "$config_file" == "wsl/wsl.conf" ]]; then
353
+ if [[ "$IS_WINDOWS" == "true" ]]; then
354
+ if sudo cp "${CONFIG_DIR}/${config_file}" "$dest_path" 2>/dev/null; then
355
+ success "Copied (sudo): ${config_file} → $dest_path"
356
+ else
357
+ warn "Could not copy ${config_file} → $dest_path (needs sudo)"
358
+ fi
359
+ fi
360
+ else
361
+ safe_copy "${CONFIG_DIR}/${config_file}" "$dest_path" "$validation_func"
362
+ fi
363
+ done < <(get_all_configs)
364
+
365
+ # Handle Claude Code directory-based configs (commands/ and templates/)
366
+ push_claude_dirs
367
+
368
+ # Sync MCP server definitions into ~/.claude.json
369
+ push_mcp_servers
370
+
371
+ # Handle special cases
372
+ push_zsh_theme
373
+
374
+ # Handle extensions lists
375
+ push_extensions "vscode"
376
+ push_extensions "insiders"
377
+ push_extensions "cursor"
378
+
379
+ success "Configuration push completed successfully!"
380
+ info "Host: $HOST | Git config: $(get_git_config)"
381
+ }
382
+
383
+ # Run main function
384
+ main "$@"