-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathinstall.sh
More file actions
233 lines (212 loc) · 8.89 KB
/
Copy pathinstall.sh
File metadata and controls
233 lines (212 loc) · 8.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#!/usr/bin/env bash
# Scream Code 一键安装 (TypeScript 版)
# 前置: Node.js >= 22.19.0, Git
# 国内用户建议科学上网,如遇网络错误请多尝试几次
set -euo pipefail
# 参数解析
UPGRADE_MODE=false
FORCE_MODE=false
while [[ $# -gt 0 ]]; do
case "$1" in
--upgrade) UPGRADE_MODE=true; shift ;;
--force) FORCE_MODE=true; shift ;;
*) shift ;;
esac
done
REPO="LIUTod/scream-code"
DEFAULT_DIR="${HOME}/.scream-code"
INSTALL_DIR="${INSTALL_DIR:-$DEFAULT_DIR}"
BIN_DIR="$INSTALL_DIR/bin"
SCREAM_HOME="$INSTALL_DIR"
info() { echo "[INFO] $*"; }
warn() { echo "[WARN] $*" >&2; }
error() { echo "[ERROR] $*" >&2; }
# ══════════════════════════════════════════════════════════════════════════════
# 0. 彻底清理所有旧版本 scream(Python / pip / uv),确保全新安装不冲突
# ══════════════════════════════════════════════════════════════════════════════
info "清理旧 scream 版本..."
# ── 删除所有已知位置的旧 scream 命令 ──
for dir in \
"$HOME/.scream-code/bin" \
"$HOME/.local/bin" \
"/usr/local/bin" \
"/opt/homebrew/bin"; do
if [ -f "$dir/scream" ]; then
# 只删除本安装创建的 scream(脚本内容含 "scream-code" 标记)
if grep -q "scream-code" "$dir/scream" 2>/dev/null; then
rm -f "$dir/scream"
info "已删除旧命令: $dir/scream"
else
warn "跳过非本安装的 $dir/scream(所有权不明)"
fi
fi
done
# ── 卸载 pip / pipx / uv 全局安装的旧 scream 包 ──
for pip_cmd in pip3 pip; do
if command -v "$pip_cmd" >/dev/null 2>&1; then
"$pip_cmd" uninstall -y scream 2>/dev/null || true
fi
done
if command -v pipx >/dev/null 2>&1; then
pipx uninstall scream 2>/dev/null || true
fi
if command -v uv >/dev/null 2>&1; then
uv tool uninstall scream 2>/dev/null || true
fi
# ── 备份用户数据,升级后恢复 ──
# scream-code 把项目源码和用户数据(config.toml/logs/sessions/memory 等)都放在
# INSTALL_DIR 下。升级时不能直接 rm -rf 整个目录,否则会抹掉用户配置和记忆。
# 做法: 把已知的用户数据文件/目录移到临时备份目录, clone 完成后再移回。
USER_DATA_PATTERNS=(
"config.toml"
"tui.toml"
"logs"
"updates"
"user-history"
"sessions"
"memory"
"dream-lock.json"
"AGENTS.md"
".scream-code"
)
BACKUP_DIR=""
if [ -d "$INSTALL_DIR" ]; then
BACKUP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/scream-backup.XXXXXX")
info "备份用户数据到: $BACKUP_DIR"
for pattern in "${USER_DATA_PATTERNS[@]}"; do
if [ -e "$INSTALL_DIR/$pattern" ]; then
mv "$INSTALL_DIR/$pattern" "$BACKUP_DIR/" 2>/dev/null || true
fi
done
info "删除旧安装目录: $INSTALL_DIR"
rm -rf "$INSTALL_DIR"
fi
# ── 清理 shell 配置中的所有旧 scream-code PATH 条目 ──
for rc in "$HOME/.zshrc" "$HOME/.bashrc" "$HOME/.bash_profile" "$HOME/.zprofile"; do
if [ -f "$rc" ]; then
sed -i.bak '/\.scream-code\/bin/d' "$rc" 2>/dev/null || true
sed -i.bak '/scream-code.*PATH/d' "$rc" 2>/dev/null || true
rm -f "${rc}.bak" 2>/dev/null || true
fi
done
info "旧版本清理完毕"
# ══════════════════════════════════════════════════════════════════════════════
# 1. 检测 Node.js >= 22.0.0
# ══════════════════════════════════════════════════════════════════════════════
find_node() {
for cmd in node nodejs node22 node24 node25; do
if command -v "$cmd" >/dev/null 2>&1; then
ver_output=$($cmd --version 2>&1 | sed 's/^v//')
if [[ "$ver_output" =~ ^([0-9]+)\.([0-9]+)\. ]]; then
major="${BASH_REMATCH[1]}"
minor="${BASH_REMATCH[2]}"
if [[ "$major" -gt 22 ]] || { [[ "$major" -eq 22 ]] && [[ "$minor" -ge 19 ]]; }; then
echo "$cmd"
return 0
fi
fi
fi
done
return 1
}
info "检测 Node.js >= 22.19.0..."
NODE_CMD=$(find_node) || {
error "未找到 Node.js 22.19.0 或更高版本"
echo ""
echo "安装方式:"
echo " macOS: brew install node"
echo " 通用: https://nodejs.org/ 下载 LTS 版"
echo ""
exit 1
}
info "Node.js: $($NODE_CMD --version)"
# ── 2. 检测 Git ────────────────────────────────────────────────────────────
info "检测 Git..."
if ! command -v git >/dev/null 2>&1; then
error "未找到 Git"
echo ""
echo "安装方式:"
echo " macOS: brew install git"
echo " Ubuntu: sudo apt install git"
echo " 其他: https://git-scm.com/downloads"
echo ""
exit 1
fi
info "Git: $(git --version)"
# ── 3. 检测 / 安装 pnpm ────────────────────────────────────────────────────
info "检测 pnpm..."
if ! command -v pnpm >/dev/null 2>&1; then
info "pnpm 未安装,正在自动安装..."
if $NODE_CMD -e "process.exit(require('module').createRequire(import.meta.url)('child_process').execSync('corepack --version', {encoding:'utf8'}).trim() ? 0 : 1)" 2>/dev/null || command -v corepack >/dev/null 2>&1; then
corepack enable 2>/dev/null || true
fi
if ! command -v pnpm >/dev/null 2>&1; then
curl -fsSL https://get.pnpm.io/install.sh | sh - || {
error "pnpm 安装失败"
echo "请手动安装: https://pnpm.io/installation"
exit 1
}
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$PATH"
fi
fi
info "pnpm: $(pnpm --version)"
# ── 4. 下载项目 ─────────────────────────────────────────────────────────────
info "安装路径: $INSTALL_DIR"
info "下载 scream-code..."
git clone --depth 1 "https://github.com/$REPO.git" "$INSTALL_DIR" || {
error "下载失败"
echo "请检查网络连接(国内用户建议科学上网,或稍后重试)"
exit 1
}
cd "$INSTALL_DIR"
# ── 恢复用户数据(升级前备份的) ──
if [ -n "$BACKUP_DIR" ] && [ -d "$BACKUP_DIR" ]; then
info "恢复用户数据..."
for item in "$BACKUP_DIR"/*; do
[ -e "$item" ] && mv "$item" "$INSTALL_DIR/" 2>/dev/null || true
done
rmdir "$BACKUP_DIR" 2>/dev/null || true
fi
# ── 5. 安装依赖并构建 ──────────────────────────────────────────────────────
info "安装依赖并构建..."
pnpm install || {
error "依赖安装失败"
exit 1
}
pnpm -r build || {
error "构建失败"
exit 1
}
# ── 6. 创建 scream 命令 ────────────────────────────────────────────────────
mkdir -p "$BIN_DIR"
cat > "$BIN_DIR/scream" <<'EOF'
#!/usr/bin/env bash
SCREAM_HOME="${SCREAM_HOME:-$HOME/.scream-code}"
cd "$SCREAM_HOME"
exec node "$SCREAM_HOME/apps/scream-code/dist/main.mjs" "$@"
EOF
chmod +x "$BIN_DIR/scream"
# ── 7. 添加到 PATH ─────────────────────────────────────────────────────────
if [[ ":$PATH:" != *":$BIN_DIR:"* ]]; then
SHELL_RC=""
if [ -n "${ZSH_VERSION:-}" ] || [ "$(basename "$SHELL")" = "zsh" ]; then
SHELL_RC="$HOME/.zshrc"
elif [ -n "${BASH_VERSION:-}" ] || [ "$(basename "$SHELL")" = "bash" ]; then
SHELL_RC="$HOME/.bashrc"
fi
if [ -n "$SHELL_RC" ] && [ -f "$SHELL_RC" ]; then
echo "export PATH=\"$BIN_DIR:\$PATH\"" >> "$SHELL_RC"
info "已自动将 $BIN_DIR 加入 PATH ($SHELL_RC)"
else
echo ""
echo "请手动添加以下到 shell 配置文件 (~/.bashrc 或 ~/.zshrc):"
echo " export PATH=\"$BIN_DIR:\$PATH\""
fi
fi
export PATH="$BIN_DIR:$PATH"
info "安装完成!"
echo ""
echo "安装位置: $INSTALL_DIR"
echo "运行: scream --version"
echo ""
echo "如果命令找不到,请重新打开终端或执行: source ~/.bashrc (或 ~/.zshrc)"