@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 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,12 @@
1
+ [[plugin.deps]]
2
+ use = "yazi-rs/plugins:piper"
3
+ rev = "1962818"
4
+ hash = "384464b6df8cb807425c521f8cd790f3"
5
+
6
+ [[plugin.deps]]
7
+ use = "AnirudhG07/rich-preview"
8
+ rev = "7d616ad"
9
+ hash = "d64feec9761392cbc250d199ab4b8a3a"
10
+
11
+ [flavor]
12
+ deps = []
@@ -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 "$@"