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.
- package/.claude/settings.local.json +3 -0
- package/CLAUDE.md +94 -0
- package/README.md +424 -0
- package/TERMINAL_SHORTCUTS.md +96 -0
- package/WINDOWS_COMPATIBILITY.md +85 -0
- package/WINDOWS_MCP_SETUP.md +133 -0
- package/apps/RectangleConfig.plist +0 -0
- package/apps/Synergy +84 -0
- package/apps/iStat Menus Settings.ismp7 +0 -0
- package/claude/CLAUDE.md +228 -0
- package/claude/commands/changelog.md +36 -0
- package/claude/commands/commit.md +29 -0
- package/claude/commands/context.md +112 -0
- package/claude/commands/dash.md +37 -0
- package/claude/commands/deploy-check.md +37 -0
- package/claude/commands/deps.md +26 -0
- package/claude/commands/duplo.md +56 -0
- package/claude/commands/explain.md +43 -0
- package/claude/commands/fix-and-test.md +46 -0
- package/claude/commands/game-debug.md +66 -0
- package/claude/commands/games.md +53 -0
- package/claude/commands/go.md +147 -0
- package/claude/commands/guard.md +102 -0
- package/claude/commands/handoff.md +66 -0
- package/claude/commands/incident.md +144 -0
- package/claude/commands/init.md +78 -0
- package/claude/commands/k8s-debug.md +31 -0
- package/claude/commands/lint.md +27 -0
- package/claude/commands/merge-all.md +115 -0
- package/claude/commands/merge.md +129 -0
- package/claude/commands/mikpc.md +54 -0
- package/claude/commands/morning.md +72 -0
- package/claude/commands/partymode.md +105 -0
- package/claude/commands/plans.md +88 -0
- package/claude/commands/pr.md +41 -0
- package/claude/commands/prep.md +132 -0
- package/claude/commands/push-sync.md +82 -0
- package/claude/commands/push.md +34 -0
- package/claude/commands/research.md +73 -0
- package/claude/commands/retro.md +95 -0
- package/claude/commands/review-pr.md +96 -0
- package/claude/commands/review.md +41 -0
- package/claude/commands/scaffold-agent.md +45 -0
- package/claude/commands/setup.md +92 -0
- package/claude/commands/ship-prod.md +97 -0
- package/claude/commands/ship.md +82 -0
- package/claude/commands/simplify.md +42 -0
- package/claude/commands/spike.md +110 -0
- package/claude/commands/status.md +37 -0
- package/claude/commands/sync.md +72 -0
- package/claude/commands/test.md +29 -0
- package/claude/commands/triage.md +72 -0
- package/claude/desktop/claude_desktop_config.json +9 -0
- package/claude/hooks.json +15 -0
- package/claude/mcp-servers.duplo.json +8 -0
- package/claude/mcp-servers.json +62 -0
- package/claude/scripts/psdebug.ps1 +7 -0
- package/claude/settings.json +38 -0
- package/claude/settings.local.json +4 -0
- package/claude/statusline-command.sh +94 -0
- package/claude/templates/CLAUDE-k8s-devops.md +58 -0
- package/claude/templates/CLAUDE-python-agent.md +47 -0
- package/claude/templates/CLAUDE-typescript-frontend.md +50 -0
- package/docker/ai-stack/docker-compose.yml +76 -0
- package/docker/ai-stack/searxng/limiter.toml +3 -0
- package/docker/ai-stack/searxng/settings.yml +39 -0
- package/docker/cli/config.json.template +15 -0
- package/docker/cli/daemon.json +9 -0
- package/docker/cli/features.json +3 -0
- package/docker/mcp/catalog.json +9 -0
- package/docker/mcp/catalogs/docker-mcp.yaml +15107 -0
- package/docker/mcp/config.yaml +0 -0
- package/docker/mcp/registry.yaml +37 -0
- package/docker/mcp/tools.yaml +0 -0
- package/docs/context/.gitkeep +0 -0
- package/docs/context/2026-03-02-configs.md +142 -0
- package/docs/handoff/.gitkeep +0 -0
- package/docs/incidents/.gitkeep +0 -0
- package/docs/plans/2026-02-28-autonomous-command-suite-design.md +250 -0
- package/docs/plans/2026-02-28-autonomous-command-suite.md +682 -0
- package/docs/plans/2026-03-01-ai-stack-split-architecture.md +72 -0
- package/docs/plans/2026-03-02-ai-stack-expansion.md +33 -0
- package/docs/plans/2026-03-02-merge-commands-design.md +58 -0
- package/docs/plans/2026-03-02-merge-commands.md +354 -0
- package/docs/research/.gitkeep +0 -0
- package/docs/research/2026-03-02-configs-repo-architecture.md +152 -0
- package/docs/retros/.gitkeep +0 -0
- package/docs/retros/2026-03-01-ai-stack-split-architecture.md +38 -0
- package/docs/spikes/.gitkeep +0 -0
- package/gh/config.yml +16 -0
- package/gh/hosts.yml +5 -0
- package/gh/main.json +103 -0
- package/ghostty/config +90 -0
- package/git/config/base.gitconfig +46 -0
- package/git/config/chiefmikey.gitconfig +11 -0
- package/git/config/personal.gitconfig +10 -0
- package/git/config/work.gitconfig +14 -0
- package/ide/cursor/extensions.txt +111 -0
- package/ide/cursor/keybindings.json +307 -0
- package/ide/cursor/mcp.json +92 -0
- package/ide/cursor/settings.json +544 -0
- package/ide/vscode/extensions.txt +120 -0
- package/ide/vscode/insiders/extensions.txt +119 -0
- package/ide/vscode/insiders/keybindings.json +294 -0
- package/ide/vscode/insiders/settings.json +518 -0
- package/ide/vscode/keybindings.json +294 -0
- package/ide/vscode/settings.json +526 -0
- package/ide/vscode/vscode/extensions.txt +43 -0
- package/iterm/Mikey Pro.json +951 -0
- package/iterm/com.googlecode.iterm2.plist +5549 -0
- package/iterm/font/MesloLGS NF Bold Italic.ttf +0 -0
- package/iterm/font/MesloLGS NF Bold.ttf +0 -0
- package/iterm/font/MesloLGS NF Italic.ttf +0 -0
- package/iterm/font/MesloLGS NF Regular.ttf +0 -0
- package/package.json +15 -0
- package/scripts/ai/deploy-ai-stack.sh +119 -0
- package/scripts/ai/fix-ai-proxy.service +12 -0
- package/scripts/ai/fix-ai-proxy.sh +25 -0
- package/scripts/brew/search/brew-search-results.sh +19 -0
- package/scripts/brew/search/brew-search.sh +34 -0
- package/scripts/brew/upgrade/brew-upgrade-autoupdate.sh +5 -0
- package/scripts/brew/upgrade/brew-upgrade-full-auto.sh +89 -0
- package/scripts/brew/upgrade/brew-upgrade-full.sh +159 -0
- package/scripts/docker/cleanup/docker-cleanup-manage.sh +163 -0
- package/scripts/docker/cleanup/docker-cleanup.cron +12 -0
- package/scripts/docker/cleanup/docker-cleanup.sh +280 -0
- package/scripts/docker/install/README.md +23 -0
- package/scripts/docker/install/docker-al2.sh +7 -0
- package/scripts/docker/install/docker-compose-al2.sh +15 -0
- package/scripts/gh/auth/auth.sh +12 -0
- package/scripts/gh/config/gh-config.sh +3 -0
- package/scripts/gh/gist/gh-gist-create.sh +29 -0
- package/scripts/gh/gist/gh-gist-delete.sh +1 -0
- package/scripts/gh/gist/gh-gist-edit.sh +8 -0
- package/scripts/gh/gpg-key/gh-gpg-key-add.sh +3 -0
- package/scripts/gh/install/install.sh +7 -0
- package/scripts/gh/label/gh-label-clone.sh +0 -0
- package/scripts/gh/label/gh-label-create.sh +0 -0
- package/scripts/gh/label/gh-label-delete.sh +0 -0
- package/scripts/gh/label/gh-label-edit.sh +0 -0
- package/scripts/gh/label/gh-label-list.sh +0 -0
- package/scripts/gh/secret/gh-secret-delete.sh +24 -0
- package/scripts/gh/secret/gh-secret-set.sh +70 -0
- package/scripts/gh/ssh-key/gh-ssh-key-add.sh +8 -0
- package/scripts/git/add/git-add.sh +3 -0
- package/scripts/git/auth/README.md +11 -0
- package/scripts/git/auth/https.sh +20 -0
- package/scripts/git/auth/ssh-mac.sh +41 -0
- package/scripts/git/branch-delete/git-branch-delete.sh +16 -0
- package/scripts/git/checkout/git-checkout-stash.sh +32 -0
- package/scripts/git/temp/git-temp-pull.sh +6 -0
- package/scripts/git/temp/git-temp-push.sh +5 -0
- package/scripts/install/fresh.zsh +34 -0
- package/scripts/install/full-install.zsh +193 -0
- package/scripts/linux/codedeploy/README.md +19 -0
- package/scripts/linux/codedeploy/linux-codedeploy-al2.sh +13 -0
- package/scripts/linux/codedeploy/linux-codedeploy-index.sh +16 -0
- package/scripts/linux/codedeploy/linux-codedeploy-ubuntu.sh +14 -0
- package/scripts/linux/coredns/README.md +17 -0
- package/scripts/linux/coredns/linux-coredns-al2.sh +29 -0
- package/scripts/linux/wifi/01-netconf.yaml +21 -0
- package/scripts/linux/wifi/wifi-ubuntu.sh +17 -0
- package/scripts/mac/dock-sort/mac-dock-sort.sh +87 -0
- package/scripts/mac/dropbox-ignore/mac-dropbox-ignore.sh +12 -0
- package/scripts/mac/sudo-askpass/mac-sudo-askpass.sh +50 -0
- package/scripts/mac/sudo-askpass/setup-sudo-password.sh +49 -0
- package/scripts/mac/upgrade/mac-upgrade.sh +21 -0
- package/scripts/mac/vpn/mac-vpn.sh +4 -0
- package/scripts/mcp/aws-mcp-wrapper.ps1 +97 -0
- package/scripts/mcp/aws-mcp-wrapper.sh +53 -0
- package/scripts/mcp/duplo-mcp-wrapper.sh +31 -0
- package/scripts/mcp/filesystem-mcp-wrapper.ps1 +43 -0
- package/scripts/mcp/filesystem-mcp-wrapper.sh +34 -0
- package/scripts/mcp/git-mcp-wrapper.ps1 +42 -0
- package/scripts/mcp/git-mcp-wrapper.sh +33 -0
- package/scripts/mcp/github-mcp-wrapper.ps1 +43 -0
- package/scripts/mcp/github-mcp-wrapper.sh +19 -0
- package/scripts/mcp/kubernetes-mcp-wrapper.ps1 +22 -0
- package/scripts/mcp/kubernetes-mcp-wrapper.sh +16 -0
- package/scripts/mcp/mcp-launcher.ps1 +56 -0
- package/scripts/mcp/mcp-launcher.sh +71 -0
- package/scripts/mcp/mongodb-mcp-wrapper.ps1 +26 -0
- package/scripts/mcp/mongodb-mcp-wrapper.sh +17 -0
- package/scripts/mcp/notion-mcp-wrapper.ps1 +23 -0
- package/scripts/mcp/notion-mcp-wrapper.sh +14 -0
- package/scripts/mcp/postgres-mcp-wrapper.ps1 +23 -0
- package/scripts/mcp/postgres-mcp-wrapper.sh +16 -0
- package/scripts/npm/ncu/npm-ncu.sh +24 -0
- package/scripts/npm/upgrade/npm-upgrade.sh +51 -0
- package/scripts/qmk/build_reviung41.sh +28 -0
- package/scripts/qmk/sync_unicorne.sh +44 -0
- package/scripts/sync/README.md +64 -0
- package/scripts/sync/config-common.zsh +882 -0
- package/scripts/sync/pull-configs.ps1 +33 -0
- package/scripts/sync/pull-configs.zsh +278 -0
- package/scripts/sync/push-configs.ps1 +91 -0
- package/scripts/sync/push-configs.zsh +384 -0
- package/shell/alias/alias-d.zsh +333 -0
- package/shell/alias/alias.zsh +36 -0
- package/shell/alias/categories/development.zsh +157 -0
- package/shell/alias/categories/environment.zsh +13 -0
- package/shell/alias/categories/git.zsh +40 -0
- package/shell/alias/categories/github-functions.zsh +459 -0
- package/shell/alias/categories/network.zsh +46 -0
- package/shell/alias/categories/path.zsh +46 -0
- package/shell/alias/categories/system.zsh +78 -0
- package/shell/alias/categories/wolfe-server.zsh +11 -0
- package/shell/powershell/Microsoft.PowerShell_profile.ps1 +208 -0
- package/shell/zsh/.p10k.zsh +1832 -0
- package/shell/zsh/.zshrc +87 -0
- package/shell/zsh/config/completion.zsh +31 -0
- package/shell/zsh/config/functions.zsh +31 -0
- package/shell/zsh/config/keybindings.zsh +13 -0
- package/shell/zsh/config/options.zsh +56 -0
- package/shell/zsh/config/plugins.zsh +83 -0
- package/shell/zsh/config/variables.zsh +191 -0
- package/shell/zsh/powerlevel10k.zsh-theme +83 -0
- package/shell/zsh/zsh-autosuggestions.zsh +871 -0
- package/ssh/config +46 -0
- package/ssh/config.duplo +21 -0
- package/ssh/config.mikpc +35 -0
- package/ssh/personal_signing.pub +1 -0
- package/templates/.envrc.example +34 -0
- package/templates/.envrc.quickstart +17 -0
- package/wezterm/wezterm.lua +249 -0
- package/wsl/.wslconfig +3 -0
- 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 "$@"
|