@silicaclaw/cli 1.0.0-beta.10 → 1.0.0-beta.12

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicaclaw/cli",
3
- "version": "1.0.0-beta.10",
3
+ "version": "1.0.0-beta.12",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -47,6 +47,50 @@ run_cmd_may_fail() {
47
47
  return $code
48
48
  }
49
49
 
50
+ first_writable_path_dir() {
51
+ local path_value="${PATH:-}"
52
+ local old_ifs="$IFS"
53
+ IFS=':'
54
+ for d in $path_value; do
55
+ if [ -n "$d" ] && [ -d "$d" ] && [ -w "$d" ] && [ -x "$d" ]; then
56
+ printf '%s' "$d"
57
+ IFS="$old_ifs"
58
+ return 0
59
+ fi
60
+ done
61
+ IFS="$old_ifs"
62
+ return 1
63
+ }
64
+
65
+ install_command_shim() {
66
+ local bindir="$1"
67
+ local script_path="$WORK_DIR/scripts/silicaclaw-cli.mjs"
68
+ local target="$bindir/silicaclaw"
69
+ if [ ! -f "$script_path" ]; then
70
+ echo "未找到 CLI 脚本: $script_path"
71
+ return 1
72
+ fi
73
+ cat >"$target" <<EOF
74
+ #!/usr/bin/env bash
75
+ set -euo pipefail
76
+ exec node "$script_path" "\$@"
77
+ EOF
78
+ chmod +x "$target"
79
+ return 0
80
+ }
81
+
82
+ default_system_bin_dir() {
83
+ if [ -d "/usr/local/bin" ]; then
84
+ printf '/usr/local/bin'
85
+ return 0
86
+ fi
87
+ if [ -d "/opt/homebrew/bin" ]; then
88
+ printf '/opt/homebrew/bin'
89
+ return 0
90
+ fi
91
+ printf '/usr/local/bin'
92
+ }
93
+
50
94
  ask_yes_no() {
51
95
  local prompt="$1"
52
96
  local default="${2:-Y}"
@@ -172,23 +216,48 @@ fi
172
216
  title "安装系统命令(silicaclaw)"
173
217
  if command -v silicaclaw >/dev/null 2>&1; then
174
218
  echo "已检测到系统命令: $(command -v silicaclaw)"
175
- echo "跳过全局安装。"
219
+ echo "跳过命令安装。"
176
220
  else
177
- echo "为了获得生产体验(可直接运行 silicaclaw ...),建议安装全局命令。"
178
- if ask_yes_no "是否现在安装全局命令 @silicaclaw/cli@beta?" "Y"; then
179
- if run_cmd_may_fail "npm_config_cache=\"$WORK_DIR/.npm-cache\" npm i -g @silicaclaw/cli@beta"; then
180
- echo "全局命令安装成功。"
181
- else
182
- echo "普通权限安装失败(常见于 macOS /usr/local 权限)。"
183
- if ask_yes_no "是否使用 sudo 重试安装全局命令?" "Y"; then
184
- run_cmd "npm_config_cache=\"$WORK_DIR/.npm-cache\" sudo npm i -g @silicaclaw/cli@beta"
185
- echo "全局命令安装成功。"
221
+ echo "将尝试无 sudo 安装 silicaclaw 命令到 PATH 中可写目录。"
222
+ BIN_DIR="$(first_writable_path_dir || true)"
223
+ INSTALLED=0
224
+ if [ -n "${BIN_DIR:-}" ]; then
225
+ if install_command_shim "$BIN_DIR"; then
226
+ echo "命令已安装: $BIN_DIR/silicaclaw"
227
+ hash -r || true
228
+ if command -v silicaclaw >/dev/null 2>&1; then
229
+ echo "验证成功: $(command -v silicaclaw)"
230
+ INSTALLED=1
186
231
  else
187
- echo "已跳过全局安装。你仍可使用: npx @silicaclaw/cli@beta <command>"
232
+ echo "命令已写入,但当前 shell 未立即识别。请新开终端后运行 silicaclaw"
188
233
  fi
234
+ else
235
+ echo "命令安装失败。可继续使用: npx @silicaclaw/cli@beta <command>"
189
236
  fi
190
237
  else
191
- echo "已跳过全局安装。你仍可使用: npx @silicaclaw/cli@beta <command>"
238
+ echo "当前 PATH 中没有可写目录,无法无 sudo 安装系统命令。"
239
+ fi
240
+
241
+ if [ "$INSTALLED" != "1" ]; then
242
+ SYS_BIN_DIR="$(default_system_bin_dir)"
243
+ echo "为保证开箱即用体验,建议安装到系统目录: $SYS_BIN_DIR/silicaclaw"
244
+ if ask_yes_no "是否使用 sudo 安装系统命令?" "Y"; then
245
+ run_cmd "sudo mkdir -p \"$SYS_BIN_DIR\""
246
+ run_cmd "sudo tee \"$SYS_BIN_DIR/silicaclaw\" >/dev/null <<'EOF'
247
+ #!/usr/bin/env bash
248
+ set -euo pipefail
249
+ exec node \"$WORK_DIR/scripts/silicaclaw-cli.mjs\" \"\$@\"
250
+ EOF"
251
+ run_cmd "sudo chmod +x \"$SYS_BIN_DIR/silicaclaw\""
252
+ hash -r || true
253
+ if command -v silicaclaw >/dev/null 2>&1; then
254
+ echo "验证成功: $(command -v silicaclaw)"
255
+ else
256
+ echo "安装完成,但当前 shell 未刷新。请新开终端后运行 silicaclaw。"
257
+ fi
258
+ else
259
+ echo "已跳过 sudo 安装。你仍可使用: npx @silicaclaw/cli@beta <command>"
260
+ fi
192
261
  fi
193
262
  fi
194
263