@brantshi1/devspace 1.2.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 +69 -0
- package/bin/devspace +272 -0
- package/configs/ghostty/config +31 -0
- package/configs/ghostty/themes/iTerm-Default +22 -0
- package/configs/yazi/package.toml +12 -0
- package/configs/yazi/yazi.toml +23 -0
- package/package.json +25 -0
- package/setup.sh +29 -0
package/README.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# ghostty-devspace
|
|
2
|
+
|
|
3
|
+
在 Ghostty 终端中一键创建开发工作区。
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌──────────┬──────────┐
|
|
7
|
+
│ │ yazi │
|
|
8
|
+
│ claude ├──────────┤
|
|
9
|
+
│ │ lazygit │
|
|
10
|
+
└──────────┴──────────┘
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 新机器安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone git@github.com:brantshin/ghostty-devspace.git
|
|
17
|
+
cd ghostty-devspace
|
|
18
|
+
./setup.sh
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
会自动安装所有依赖并部署配置(Homebrew → Node.js → Ghostty → 字体 → yazi → 插件 → lazygit → Claude Code → devspace CLI)。
|
|
22
|
+
|
|
23
|
+
已有 npm 的机器也可以:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm i -g @brant/devspace
|
|
27
|
+
devspace setup
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 使用
|
|
31
|
+
|
|
32
|
+
在 Ghostty 终端中运行:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
devspace
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 命令
|
|
39
|
+
|
|
40
|
+
| 命令 | 说明 |
|
|
41
|
+
|------|------|
|
|
42
|
+
| `devspace` | 创建三栏工作区 |
|
|
43
|
+
| `devspace setup [-f]` | 部署开发环境,`-f` 强制覆盖已有配置 |
|
|
44
|
+
| `devspace sync` | 将本机配置同步到仓库 `configs/` 目录 |
|
|
45
|
+
| `devspace -h` | 显示帮助 |
|
|
46
|
+
|
|
47
|
+
## 配置同步
|
|
48
|
+
|
|
49
|
+
源机器修改配置后:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
devspace sync
|
|
53
|
+
cd ~/ghostty-devspace
|
|
54
|
+
git add configs/ && git commit -m "update configs" && git push
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
目标机器拉取更新:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
cd ~/ghostty-devspace
|
|
61
|
+
git pull
|
|
62
|
+
devspace setup -f
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 要求
|
|
66
|
+
|
|
67
|
+
- macOS
|
|
68
|
+
- Ghostty 终端
|
|
69
|
+
- macOS 辅助功能权限(System Events)
|
package/bin/devspace
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
#!/usr/bin/env zsh
|
|
2
|
+
# devspace - Ghostty 开发工作区
|
|
3
|
+
#
|
|
4
|
+
# ┌──────────┬──────────┐
|
|
5
|
+
# │ │ yazi │
|
|
6
|
+
# │ claude ├──────────┤
|
|
7
|
+
# │ │ lazygit │
|
|
8
|
+
# └──────────┴──────────┘
|
|
9
|
+
|
|
10
|
+
VERSION="1.2.0"
|
|
11
|
+
SCRIPT_DIR="${0:a:h}"
|
|
12
|
+
REPO_DIR="${SCRIPT_DIR:h}"
|
|
13
|
+
CONFIGS_DIR="$REPO_DIR/configs"
|
|
14
|
+
|
|
15
|
+
# ── 颜色 ─────────────────────────────────────────────
|
|
16
|
+
GREEN='\033[0;32m'
|
|
17
|
+
YELLOW='\033[0;33m'
|
|
18
|
+
RED='\033[0;31m'
|
|
19
|
+
BOLD='\033[1m'
|
|
20
|
+
RESET='\033[0m'
|
|
21
|
+
|
|
22
|
+
_ok() { echo "${GREEN} ✓${RESET} $1" }
|
|
23
|
+
_info() { echo "${YELLOW} …${RESET} $1" }
|
|
24
|
+
_fail() { echo "${RED} ✗${RESET} $1" }
|
|
25
|
+
_section() { echo "\n${BOLD}[$1]${RESET}" }
|
|
26
|
+
|
|
27
|
+
# ── 工具函数 ─────────────────────────────────────────
|
|
28
|
+
_copy_config() {
|
|
29
|
+
local src="$1" dst="$2"
|
|
30
|
+
if [[ -f "$dst" ]] && ! $FORCE; then
|
|
31
|
+
_ok "$dst 已存在(跳过,用 -f 强制覆盖)"
|
|
32
|
+
return 0
|
|
33
|
+
fi
|
|
34
|
+
mkdir -p "$(dirname "$dst")"
|
|
35
|
+
cp "$src" "$dst"
|
|
36
|
+
_ok "已复制 → $dst"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
_copy_dir() {
|
|
40
|
+
local src="$1" dst="$2"
|
|
41
|
+
if [[ -d "$dst" ]] && ! $FORCE; then
|
|
42
|
+
_ok "$dst/ 已存在(跳过,用 -f 强制覆盖)"
|
|
43
|
+
return 0
|
|
44
|
+
fi
|
|
45
|
+
mkdir -p "$dst"
|
|
46
|
+
cp -R "$src"/ "$dst"/
|
|
47
|
+
_ok "已复制 → $dst/"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
_ensure_brew_pkg() {
|
|
51
|
+
local pkg="$1"
|
|
52
|
+
if brew list "$pkg" &>/dev/null; then
|
|
53
|
+
_ok "$pkg 已安装"
|
|
54
|
+
else
|
|
55
|
+
_info "安装 $pkg …"
|
|
56
|
+
brew install "$pkg" || { _fail "$pkg 安装失败"; return 1; }
|
|
57
|
+
_ok "$pkg 安装完成"
|
|
58
|
+
fi
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
_ensure_brew_cask() {
|
|
62
|
+
local cask="$1"
|
|
63
|
+
if brew list --cask "$cask" &>/dev/null; then
|
|
64
|
+
_ok "$cask 已安装"
|
|
65
|
+
else
|
|
66
|
+
_info "安装 $cask …"
|
|
67
|
+
brew install --cask "$cask" || { _fail "$cask 安装失败"; return 1; }
|
|
68
|
+
_ok "$cask 安装完成"
|
|
69
|
+
fi
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# ── sync 子命令 ──────────────────────────────────────
|
|
73
|
+
do_sync() {
|
|
74
|
+
if [[ ! -f "$REPO_DIR/package.json" ]]; then
|
|
75
|
+
echo "错误: 无法定位 ghostty-devspace 仓库" >&2
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
mkdir -p "$CONFIGS_DIR/ghostty/themes" "$CONFIGS_DIR/yazi"
|
|
80
|
+
local count=0
|
|
81
|
+
|
|
82
|
+
[[ -f "$HOME/.config/ghostty/config" ]] && cp "$HOME/.config/ghostty/config" "$CONFIGS_DIR/ghostty/config" && ((count++))
|
|
83
|
+
[[ -d "$HOME/.config/ghostty/themes" ]] && cp -R "$HOME/.config/ghostty/themes"/ "$CONFIGS_DIR/ghostty/themes"/ && ((count++))
|
|
84
|
+
[[ -f "$HOME/.config/yazi/yazi.toml" ]] && cp "$HOME/.config/yazi/yazi.toml" "$CONFIGS_DIR/yazi/yazi.toml" && ((count++))
|
|
85
|
+
[[ -f "$HOME/.config/yazi/package.toml" ]] && cp "$HOME/.config/yazi/package.toml" "$CONFIGS_DIR/yazi/package.toml" && ((count++))
|
|
86
|
+
|
|
87
|
+
echo "已同步 $count 项配置到 $CONFIGS_DIR"
|
|
88
|
+
echo "下一步: cd $REPO_DIR && git add configs/ && git commit && git push"
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# ── setup 子命令 ─────────────────────────────────────
|
|
92
|
+
do_setup() {
|
|
93
|
+
FORCE=false
|
|
94
|
+
[[ "${1:-}" == "-f" ]] && FORCE=true
|
|
95
|
+
|
|
96
|
+
echo "${BOLD}devspace setup — Ghostty 开发环境部署${RESET}"
|
|
97
|
+
|
|
98
|
+
if [[ "$(uname)" != "Darwin" ]]; then
|
|
99
|
+
_fail "仅支持 macOS"; exit 1
|
|
100
|
+
fi
|
|
101
|
+
_ok "macOS $(sw_vers -productVersion)"
|
|
102
|
+
|
|
103
|
+
if [[ ! -d "$CONFIGS_DIR" ]]; then
|
|
104
|
+
_fail "找不到 configs/ 目录"; exit 1
|
|
105
|
+
fi
|
|
106
|
+
echo "配置源: $CONFIGS_DIR"
|
|
107
|
+
|
|
108
|
+
# Homebrew
|
|
109
|
+
_section "Homebrew"
|
|
110
|
+
if command -v brew &>/dev/null; then
|
|
111
|
+
_ok "Homebrew 已安装"
|
|
112
|
+
else
|
|
113
|
+
_info "安装 Homebrew …"
|
|
114
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
115
|
+
[[ -f /opt/homebrew/bin/brew ]] && eval "$(/opt/homebrew/bin/brew shellenv)"
|
|
116
|
+
_ok "Homebrew 安装完成"
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
# Ghostty
|
|
120
|
+
_section "Ghostty"
|
|
121
|
+
if command -v ghostty &>/dev/null || [[ -d "/Applications/Ghostty.app" ]]; then
|
|
122
|
+
_ok "Ghostty 已安装"
|
|
123
|
+
else
|
|
124
|
+
_ensure_brew_cask ghostty
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# 字体
|
|
128
|
+
_section "字体"
|
|
129
|
+
if fc-list 2>/dev/null | grep -qi "JetBrainsMono Nerd Font Mono" || \
|
|
130
|
+
ls ~/Library/Fonts/JetBrainsMonoNerdFontMono-Regular.ttf &>/dev/null; then
|
|
131
|
+
_ok "JetBrainsMono Nerd Font Mono 已安装"
|
|
132
|
+
else
|
|
133
|
+
_ensure_brew_cask font-jetbrains-mono-nerd-font
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# Ghostty 配置
|
|
137
|
+
_section "Ghostty 配置"
|
|
138
|
+
_copy_config "$CONFIGS_DIR/ghostty/config" "$HOME/.config/ghostty/config"
|
|
139
|
+
_copy_dir "$CONFIGS_DIR/ghostty/themes" "$HOME/.config/ghostty/themes"
|
|
140
|
+
|
|
141
|
+
# Yazi
|
|
142
|
+
_section "Yazi"
|
|
143
|
+
_ensure_brew_pkg yazi
|
|
144
|
+
|
|
145
|
+
# Yazi 配置
|
|
146
|
+
_section "Yazi 配置"
|
|
147
|
+
_copy_config "$CONFIGS_DIR/yazi/yazi.toml" "$HOME/.config/yazi/yazi.toml"
|
|
148
|
+
_copy_config "$CONFIGS_DIR/yazi/package.toml" "$HOME/.config/yazi/package.toml"
|
|
149
|
+
|
|
150
|
+
# Yazi 插件
|
|
151
|
+
_section "Yazi 插件"
|
|
152
|
+
if command -v ya &>/dev/null; then
|
|
153
|
+
_info "安装 yazi 插件(ya pkg install)…"
|
|
154
|
+
ya pkg install || { _fail "ya pkg install 失败"; }
|
|
155
|
+
_ok "yazi 插件安装完成"
|
|
156
|
+
else
|
|
157
|
+
_fail "ya 命令不存在,请手动运行: ya pkg install"
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
# 插件依赖
|
|
161
|
+
_section "插件依赖"
|
|
162
|
+
_ensure_brew_pkg glow
|
|
163
|
+
|
|
164
|
+
if command -v rich &>/dev/null; then
|
|
165
|
+
_ok "rich-cli 已安装"
|
|
166
|
+
elif command -v pipx &>/dev/null; then
|
|
167
|
+
_info "安装 rich-cli(pipx)…"
|
|
168
|
+
pipx install rich-cli || { _fail "rich-cli 安装失败"; }
|
|
169
|
+
_ok "rich-cli 安装完成"
|
|
170
|
+
elif command -v pip3 &>/dev/null; then
|
|
171
|
+
_info "安装 rich-cli(pip3)…"
|
|
172
|
+
pip3 install rich-cli || { _fail "rich-cli 安装失败"; }
|
|
173
|
+
_ok "rich-cli 安装完成"
|
|
174
|
+
else
|
|
175
|
+
_fail "未找到 pipx 或 pip3,请手动安装 rich-cli"
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
# devspace 依赖
|
|
179
|
+
_section "devspace 依赖"
|
|
180
|
+
_ensure_brew_pkg lazygit
|
|
181
|
+
|
|
182
|
+
if command -v claude &>/dev/null; then
|
|
183
|
+
_ok "Claude Code 已安装"
|
|
184
|
+
else
|
|
185
|
+
if command -v npm &>/dev/null; then
|
|
186
|
+
_info "安装 Claude Code …"
|
|
187
|
+
npm i -g @anthropic-ai/claude-code || { _fail "Claude Code 安装失败"; }
|
|
188
|
+
_ok "Claude Code 安装完成"
|
|
189
|
+
else
|
|
190
|
+
_fail "npm 未安装,请先安装 Node.js 后运行: npm i -g @anthropic-ai/claude-code"
|
|
191
|
+
fi
|
|
192
|
+
fi
|
|
193
|
+
|
|
194
|
+
# 完成
|
|
195
|
+
echo ""
|
|
196
|
+
echo "${GREEN}${BOLD}部署完成!${RESET}"
|
|
197
|
+
echo "打开 Ghostty 后运行 ${BOLD}devspace${RESET} 即可启动开发工作区。"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
# ── 命令分发 ─────────────────────────────────────────
|
|
201
|
+
case "${1:-}" in
|
|
202
|
+
setup)
|
|
203
|
+
shift
|
|
204
|
+
do_setup "$@"
|
|
205
|
+
exit 0
|
|
206
|
+
;;
|
|
207
|
+
sync)
|
|
208
|
+
do_sync
|
|
209
|
+
exit 0
|
|
210
|
+
;;
|
|
211
|
+
-h|--help)
|
|
212
|
+
cat <<'EOF'
|
|
213
|
+
devspace - 在 Ghostty 中一键创建开发工作区
|
|
214
|
+
|
|
215
|
+
用法: devspace [命令] [选项]
|
|
216
|
+
|
|
217
|
+
在当前目录创建三栏布局:
|
|
218
|
+
左侧 claude (Claude Code)
|
|
219
|
+
右上 yazi (文件管理器)
|
|
220
|
+
右下 lazygit (Git 客户端)
|
|
221
|
+
|
|
222
|
+
命令:
|
|
223
|
+
setup [-f] 部署开发环境(安装依赖 + 配置),-f 强制覆盖
|
|
224
|
+
sync 将本机 ghostty/yazi 配置同步到仓库 configs/ 目录
|
|
225
|
+
|
|
226
|
+
选项:
|
|
227
|
+
-h, --help 显示帮助
|
|
228
|
+
-v, --version 显示版本
|
|
229
|
+
|
|
230
|
+
要求:
|
|
231
|
+
- Ghostty 终端
|
|
232
|
+
- macOS 辅助功能权限 (System Events)
|
|
233
|
+
- claude, yazi, lazygit 已安装
|
|
234
|
+
EOF
|
|
235
|
+
exit 0
|
|
236
|
+
;;
|
|
237
|
+
-v|--version)
|
|
238
|
+
echo "devspace $VERSION"
|
|
239
|
+
exit 0
|
|
240
|
+
;;
|
|
241
|
+
esac
|
|
242
|
+
|
|
243
|
+
if [[ "$TERM_PROGRAM" != "ghostty" ]]; then
|
|
244
|
+
echo "错误: 仅支持 Ghostty 终端" >&2
|
|
245
|
+
exit 1
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
send() {
|
|
249
|
+
osascript -e "tell application \"System Events\" to $1"
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
# 右分割 → 右 pane 获得焦点
|
|
253
|
+
send 'keystroke "d" using {command down}'
|
|
254
|
+
sleep 0.8
|
|
255
|
+
|
|
256
|
+
# 启动 yazi
|
|
257
|
+
send 'keystroke "yazi"'
|
|
258
|
+
sleep 0.15
|
|
259
|
+
send 'key code 36'
|
|
260
|
+
sleep 0.8
|
|
261
|
+
|
|
262
|
+
# 下分割 → 右下 pane 获得焦点
|
|
263
|
+
send 'keystroke "d" using {command down, shift down}'
|
|
264
|
+
sleep 0.8
|
|
265
|
+
|
|
266
|
+
# 启动 lazygit(焦点停留在此)
|
|
267
|
+
send 'keystroke "lazygit"'
|
|
268
|
+
sleep 0.15
|
|
269
|
+
send 'key code 36'
|
|
270
|
+
|
|
271
|
+
# 左 pane 启动 claude
|
|
272
|
+
exec claude
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
theme = Afterglow
|
|
2
|
+
font-family = JetBrainsMono Nerd Font Mono
|
|
3
|
+
font-size = 15
|
|
4
|
+
# font-thicken = true
|
|
5
|
+
# adjust-cell-height = 20%
|
|
6
|
+
|
|
7
|
+
# 透明度
|
|
8
|
+
background-opacity = 0.75
|
|
9
|
+
|
|
10
|
+
# 背景模糊
|
|
11
|
+
background-blur-radius = 10
|
|
12
|
+
|
|
13
|
+
# window-padding-x = 12
|
|
14
|
+
# window-padding-y = 8
|
|
15
|
+
# macos-titlebar-style = tabs
|
|
16
|
+
|
|
17
|
+
# cursor-style = bar
|
|
18
|
+
cursor-style-blink = true
|
|
19
|
+
mouse-hide-while-typing = true
|
|
20
|
+
copy-on-select = clipboard
|
|
21
|
+
|
|
22
|
+
# 关闭非活动 split pane 的变暗效果
|
|
23
|
+
unfocused-split-opacity = 1
|
|
24
|
+
|
|
25
|
+
# 命令完成通知(窗口未聚焦时弹窗提醒)
|
|
26
|
+
notify-on-command-finish = unfocused
|
|
27
|
+
notify-on-command-finish-action = notify
|
|
28
|
+
notify-on-command-finish-after = 5s
|
|
29
|
+
|
|
30
|
+
# 确保链接点击功能开启
|
|
31
|
+
link-url = true
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
palette = 0=#14191e
|
|
2
|
+
palette = 1=#b43c29
|
|
3
|
+
palette = 2=#00c200
|
|
4
|
+
palette = 3=#c7c400
|
|
5
|
+
palette = 4=#2743c7
|
|
6
|
+
palette = 5=#bf3fbd
|
|
7
|
+
palette = 6=#00c5c7
|
|
8
|
+
palette = 7=#c7c7c7
|
|
9
|
+
palette = 8=#676767
|
|
10
|
+
palette = 9=#dc7974
|
|
11
|
+
palette = 10=#57e690
|
|
12
|
+
palette = 11=#ece100
|
|
13
|
+
palette = 12=#a6aaf1
|
|
14
|
+
palette = 13=#e07de0
|
|
15
|
+
palette = 14=#5ffdff
|
|
16
|
+
palette = 15=#feffff
|
|
17
|
+
background = #f9f9f9
|
|
18
|
+
foreground = #101010
|
|
19
|
+
cursor-color = #000000
|
|
20
|
+
cursor-text = #ffffff
|
|
21
|
+
selection-background = #b3d7ff
|
|
22
|
+
selection-foreground = #000000
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[mgr]
|
|
2
|
+
ratio = [1, 3, 4]
|
|
3
|
+
|
|
4
|
+
[opener]
|
|
5
|
+
typora = [
|
|
6
|
+
{ run = 'open -a Typora "$@"', orphan = true, desc = "Typora" },
|
|
7
|
+
]
|
|
8
|
+
edit = [
|
|
9
|
+
{ run = 'open -a "Visual Studio Code" "$@"', orphan = true, desc = "VS Code" },
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
[open]
|
|
13
|
+
prepend_rules = [
|
|
14
|
+
{ name = "*.md", use = [ "typora", "edit", "reveal" ] },
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
[plugin]
|
|
18
|
+
prepend_previewers = [
|
|
19
|
+
{ name = "*.md", run = "rich-preview" },
|
|
20
|
+
{ name = "*.csv", run = "rich-preview" },
|
|
21
|
+
{ name = "*.rst", run = "rich-preview" },
|
|
22
|
+
{ name = "*.ipynb", run = "rich-preview" },
|
|
23
|
+
]
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@brantshi1/devspace",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Ghostty terminal workspace: claude + yazi + lazygit in split panes",
|
|
5
|
+
"bin": {
|
|
6
|
+
"devspace": "./bin/devspace"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"configs/",
|
|
11
|
+
"setup.sh"
|
|
12
|
+
],
|
|
13
|
+
"os": [
|
|
14
|
+
"darwin"
|
|
15
|
+
],
|
|
16
|
+
"keywords": [
|
|
17
|
+
"ghostty",
|
|
18
|
+
"terminal",
|
|
19
|
+
"workspace",
|
|
20
|
+
"claude",
|
|
21
|
+
"yazi",
|
|
22
|
+
"lazygit"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT"
|
|
25
|
+
}
|
package/setup.sh
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env zsh
|
|
2
|
+
# setup.sh - 引导脚本:确保 node 可用后委托给 devspace setup
|
|
3
|
+
#
|
|
4
|
+
# 用法: ./setup.sh [-f]
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
SCRIPT_DIR="${0:a:h}"
|
|
9
|
+
|
|
10
|
+
# 确保 Homebrew 可用
|
|
11
|
+
if ! command -v brew &>/dev/null; then
|
|
12
|
+
echo "安装 Homebrew …"
|
|
13
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
14
|
+
[[ -f /opt/homebrew/bin/brew ]] && eval "$(/opt/homebrew/bin/brew shellenv)"
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# 确保 Node.js 可用
|
|
18
|
+
if ! command -v node &>/dev/null; then
|
|
19
|
+
echo "安装 Node.js …"
|
|
20
|
+
brew install node
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
# 注册 devspace CLI
|
|
24
|
+
if ! command -v devspace &>/dev/null; then
|
|
25
|
+
(cd "$SCRIPT_DIR" && npm link)
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# 委托给 devspace setup
|
|
29
|
+
exec devspace setup "$@"
|