@silicaclaw/cli 1.0.0-beta.25 → 1.0.0-beta.29

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.
@@ -71,6 +71,24 @@ const WEBRTC_SEED_PEERS = process.env.WEBRTC_SEED_PEERS || "";
71
71
  const WEBRTC_BOOTSTRAP_HINTS = process.env.WEBRTC_BOOTSTRAP_HINTS || "";
72
72
  const PROFILE_VERSION = "v0.9";
73
73
 
74
+ function readWorkspaceVersion(workspaceRoot: string): string {
75
+ const pkgFile = resolve(workspaceRoot, "package.json");
76
+ if (existsSync(pkgFile)) {
77
+ try {
78
+ const pkg = JSON.parse(readFileSync(pkgFile, "utf8")) as { version?: string };
79
+ if (pkg.version) return String(pkg.version);
80
+ } catch {
81
+ // ignore
82
+ }
83
+ }
84
+ const versionFile = resolve(workspaceRoot, "VERSION");
85
+ if (existsSync(versionFile)) {
86
+ const raw = readFileSync(versionFile, "utf8").trim();
87
+ if (raw) return raw;
88
+ }
89
+ return "unknown";
90
+ }
91
+
74
92
  function resolveWorkspaceRoot(cwd = process.cwd()): string {
75
93
  if (existsSync(resolve(cwd, "apps", "local-console", "package.json"))) {
76
94
  return cwd;
@@ -211,10 +229,12 @@ class LocalNodeService {
211
229
  private webrtcSeedPeers: string[] = [];
212
230
  private webrtcBootstrapHints: string[] = [];
213
231
  private webrtcBootstrapSources: string[] = [];
232
+ private appVersion = "unknown";
214
233
 
215
234
  constructor() {
216
235
  this.workspaceRoot = resolveWorkspaceRoot();
217
236
  this.storageRoot = resolveStorageRoot(this.workspaceRoot);
237
+ this.appVersion = readWorkspaceVersion(this.workspaceRoot);
218
238
  migrateLegacyDataIfNeeded(this.workspaceRoot, this.storageRoot);
219
239
 
220
240
  this.identityRepo = new IdentityRepo(this.storageRoot);
@@ -283,6 +303,7 @@ class LocalNodeService {
283
303
  ).length;
284
304
 
285
305
  return {
306
+ app_version: this.appVersion,
286
307
  agent_id: this.identity?.agent_id ?? "",
287
308
  public_enabled: Boolean(this.profile?.public_enabled),
288
309
  broadcast_enabled: this.broadcastEnabled,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicaclaw/cli",
3
- "version": "1.0.0-beta.25",
3
+ "version": "1.0.0-beta.29",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -21,16 +21,49 @@ esac
21
21
 
22
22
  STEP=1
23
23
 
24
+ ORANGE=$'\033[38;5;208m'
25
+ BOLD=$'\033[1m'
26
+ DIM=$'\033[2m'
27
+ GREEN=$'\033[32m'
28
+ YELLOW=$'\033[33m'
29
+ RESET=$'\033[0m'
30
+
31
+ if [ ! -t 1 ] || [ -n "${NO_COLOR:-}" ]; then
32
+ ORANGE=""
33
+ BOLD=""
34
+ DIM=""
35
+ GREEN=""
36
+ YELLOW=""
37
+ RESET=""
38
+ fi
39
+
24
40
  line() {
25
41
  printf '\n%s\n' "------------------------------------------------------------"
26
42
  }
27
43
 
28
44
  title() {
29
45
  line
30
- printf '[Step %s] %s\n' "$STEP" "$1"
46
+ printf '%s[Step %s]%s %s\n' "$BOLD" "$STEP" "$RESET" "$1"
31
47
  STEP=$((STEP + 1))
32
48
  }
33
49
 
50
+ headline() {
51
+ printf '%sSilicaClaw%s %s%s%s\n' "$ORANGE$BOLD" "$RESET" "$DIM" "$(cat "$WORK_DIR/VERSION" 2>/dev/null || printf 'unknown')" "$RESET"
52
+ printf '%sPublic identity and discovery for OpenClaw agents.%s\n' "$DIM" "$RESET"
53
+ }
54
+
55
+ kv() {
56
+ printf '%s%-14s%s %s\n' "$DIM" "$1" "$RESET" "$2"
57
+ }
58
+
59
+ note() {
60
+ printf '%s%s%s\n' "$YELLOW" "$1" "$RESET"
61
+ }
62
+
63
+ success() {
64
+ printf '%s%s%s\n' "$GREEN" "$1" "$RESET"
65
+ }
66
+
34
67
  run_cmd() {
35
68
  local cmd="$1"
36
69
  printf '→ %s\n' "$cmd"
@@ -190,8 +223,10 @@ url_port_or_default() {
190
223
  }
191
224
 
192
225
  title "SilicaClaw Quick Start 启动"
193
- echo "目录: $ROOT_DIR"
194
- echo "目标: 用终端一步步完成安装与启动(类似 OpenClaw Quick Start)"
226
+ headline
227
+ echo ""
228
+ kv "目录" "$ROOT_DIR"
229
+ kv "目标" "一步步完成安装、联网与启动"
195
230
  pause_continue
196
231
 
197
232
  if [ "$IS_NPX_MODE" -eq 1 ]; then
@@ -208,7 +243,8 @@ if [ "$IS_NPX_MODE" -eq 1 ]; then
208
243
  fi
209
244
 
210
245
  mkdir -p "$TARGET_DIR"
211
- echo "正在复制项目文件到: $TARGET_DIR"
246
+ kv "安装目录" "$TARGET_DIR"
247
+ echo "正在复制项目文件..."
212
248
  if command -v rsync >/dev/null 2>&1; then
213
249
  rsync -a --delete \
214
250
  --exclude '.git/' \
@@ -221,7 +257,8 @@ if [ "$IS_NPX_MODE" -eq 1 ]; then
221
257
  rm -rf "$TARGET_DIR/.git" "$TARGET_DIR/node_modules" "$TARGET_DIR/.npm-cache"
222
258
  fi
223
259
  WORK_DIR="$TARGET_DIR"
224
- echo "工作目录已切换到: $WORK_DIR"
260
+ success "工作目录已切换"
261
+ kv "目录" "$WORK_DIR"
225
262
  pause_continue
226
263
  fi
227
264
 
@@ -237,8 +274,8 @@ fi
237
274
 
238
275
  NODE_VER="$(node -p "process.versions.node")"
239
276
  NPM_VER="$(npm -v)"
240
- echo "node: $NODE_VER"
241
- echo "npm : $NPM_VER"
277
+ kv "node" "$NODE_VER"
278
+ kv "npm" "$NPM_VER"
242
279
 
243
280
  if ! node -e "const v=process.versions.node.split('.').map(Number); if (v[0] < 18) process.exit(1)"; then
244
281
  echo "Node.js 版本过低,请升级到 18+"
@@ -258,32 +295,33 @@ fi
258
295
 
259
296
  title "安装系统命令(silicaclaw)"
260
297
  if command -v silicaclaw >/dev/null 2>&1; then
261
- echo "已检测到系统命令: $(command -v silicaclaw)"
262
- echo "跳过命令安装。"
298
+ success "已检测到 silicaclaw 命令"
299
+ kv "路径" "$(command -v silicaclaw)"
263
300
  else
264
- echo "将尝试无 sudo 安装 silicaclaw 命令到 PATH 中可写目录。"
301
+ echo "将尝试安装可持久使用的 silicaclaw 命令。"
265
302
  BIN_DIR="$(first_writable_path_dir || true)"
266
303
  INSTALLED=0
267
304
  if [ -n "${BIN_DIR:-}" ]; then
268
305
  if install_command_shim "$BIN_DIR"; then
269
- echo "命令已安装: $BIN_DIR/silicaclaw"
306
+ success "命令已写入"
307
+ kv "路径" "$BIN_DIR/silicaclaw"
270
308
  hash -r || true
271
309
  if command -v silicaclaw >/dev/null 2>&1; then
272
- echo "验证成功: $(command -v silicaclaw)"
310
+ kv "验证" "$(command -v silicaclaw)"
273
311
  INSTALLED=1
274
312
  else
275
- echo "命令已写入,但当前 shell 未立即识别。请新开终端后运行 silicaclaw。"
313
+ note "当前 shell 还未刷新。新开终端后即可直接运行 silicaclaw。"
276
314
  fi
277
315
  else
278
- echo "命令安装失败。可继续使用: npx @silicaclaw/cli@beta <command>"
316
+ note "命令安装未完成,仍可继续使用 npx"
279
317
  fi
280
318
  else
281
- echo "当前 PATH 中没有可写目录,无法无 sudo 安装系统命令。"
319
+ note "PATH 中没有可写目录,无法直接安装到现有 PATH。"
282
320
  fi
283
321
 
284
322
  if [ "$INSTALLED" != "1" ]; then
285
323
  SYS_BIN_DIR="$(default_system_bin_dir)"
286
- echo "为保证开箱即用体验,建议安装到系统目录: $SYS_BIN_DIR/silicaclaw"
324
+ kv "建议路径" "$SYS_BIN_DIR/silicaclaw"
287
325
  if ask_yes_no "是否使用 sudo 安装系统命令?" "Y"; then
288
326
  run_cmd "sudo mkdir -p \"$SYS_BIN_DIR\""
289
327
  run_cmd "sudo tee \"$SYS_BIN_DIR/silicaclaw\" >/dev/null <<'EOF'
@@ -294,26 +332,27 @@ EOF"
294
332
  run_cmd "sudo chmod +x \"$SYS_BIN_DIR/silicaclaw\""
295
333
  hash -r || true
296
334
  if command -v silicaclaw >/dev/null 2>&1; then
297
- echo "验证成功: $(command -v silicaclaw)"
335
+ success "系统命令安装完成"
336
+ kv "验证" "$(command -v silicaclaw)"
298
337
  INSTALLED=1
299
338
  else
300
- echo "安装完成,但当前 shell 未刷新。请新开终端后运行 silicaclaw。"
339
+ note "安装完成,但当前 shell 未刷新。新开终端后再试。"
301
340
  fi
302
341
  else
303
- echo "已跳过 sudo 安装。"
342
+ note "已跳过 sudo 安装。"
304
343
  fi
305
344
  fi
306
345
 
307
346
  if [ "$INSTALLED" != "1" ]; then
308
- echo "无需改 PATH/环境变量,也可一键使用 silicaclaw。"
347
+ echo "你也可以选择无需全局安装的命令别名模式。"
309
348
  if ask_yes_no "是否自动写入 shell alias(silicaclaw -> npx @silicaclaw/cli@beta)?" "Y"; then
310
349
  if install_npx_alias; then
311
- echo "alias 安装完成。新开终端后可直接使用 silicaclaw。"
350
+ success "alias 安装完成"
312
351
  else
313
- echo "alias 安装失败。可继续使用: npx @silicaclaw/cli@beta <command>"
352
+ note "alias 安装失败。继续使用 npx 即可。"
314
353
  fi
315
354
  else
316
- echo "你仍可继续使用: npx @silicaclaw/cli@beta <command>"
355
+ kv "临时用法" "npx @silicaclaw/cli@beta <command>"
317
356
  fi
318
357
  fi
319
358
  fi
@@ -334,8 +373,8 @@ title "选择网络模式"
334
373
  echo "1) local 单机预览(最快)"
335
374
  echo "2) lan 局域网预览(A/B 双机)"
336
375
  echo "3) global-preview 互联网预览(Relay,推荐)"
337
- echo "提示: 不确定就直接回车(默认 global-preview)。"
338
- echo "提示: 互联网场景需要一个所有节点都可访问的 relay/signaling 地址。"
376
+ note "不确定就直接回车,默认 global-preview"
377
+ note "互联网模式需要所有节点都能访问同一个 relay"
339
378
  if [ "$CONNECT_MODE" = "1" ]; then
340
379
  MODE_PICK="3"
341
380
  echo "connect 模式:已自动选择 global-preview。"
@@ -363,13 +402,13 @@ case "$MODE_PICK" in
363
402
  if [ -n "$PUBLIC_IP" ]; then
364
403
  SIGNALING_DEFAULT="https://relay.silicaclaw.com"
365
404
  fi
366
- echo "提示: signaling 地址需要“所有节点可访问”。"
405
+ note "signaling 地址需要所有节点都可访问。"
367
406
  if [ -n "$PUBLIC_IP" ]; then
368
- echo "已检测到本机公网 IP: $PUBLIC_IP"
369
- echo "如果你这台机器就是 signaling 服务器,可直接回车使用默认值。"
407
+ kv "公网 IP" "$PUBLIC_IP"
408
+ note "如果这台机器就是 relay 所在主机,可直接使用默认值。"
370
409
  else
371
- echo "未检测到公网 IP,将使用默认值: $SIGNALING_DEFAULT"
372
- echo "如需私有 relay,可改成你自己的公网地址。"
410
+ kv "默认 relay" "$SIGNALING_DEFAULT"
411
+ note "如需私有 relay,可改成你自己的公网地址。"
373
412
  fi
374
413
  read -r -p "请输入 signaling URL(默认 ${SIGNALING_DEFAULT}): " WEBRTC_SIGNALING_URL_INPUT || true
375
414
  WEBRTC_SIGNALING_URL_VALUE="${WEBRTC_SIGNALING_URL_INPUT:-$SIGNALING_DEFAULT}"
@@ -380,13 +419,13 @@ case "$MODE_PICK" in
380
419
 
381
420
  SIGNALING_HOST="$(url_host "$WEBRTC_SIGNALING_URL_VALUE")"
382
421
  if [ "$SIGNALING_HOST" = "localhost" ] || [ "$SIGNALING_HOST" = "127.0.0.1" ]; then
383
- echo "提示: 当前 signaling URL 是本机地址,仅本机可用,不适合跨网络双机演示。"
422
+ note "当前 signaling URL 是本机地址,仅本机可用,不适合异地双机。"
384
423
  fi
385
424
 
386
425
  if ask_yes_no "是否在当前机器自动后台启动 signaling server(用于演示)?" "Y"; then
387
426
  AUTO_START_SIGNALING=1
388
427
  SIGNALING_PORT_VALUE="$(url_port_or_default "$WEBRTC_SIGNALING_URL_VALUE" "4510")"
389
- echo "将尝试以 PORT=$SIGNALING_PORT_VALUE 后台启动 signaling server"
428
+ kv "本地 relay" "PORT=$SIGNALING_PORT_VALUE"
390
429
  fi
391
430
 
392
431
  read -r -p "请输入 room(默认 silicaclaw-global-preview): " WEBRTC_ROOM_VALUE_INPUT || true
@@ -398,7 +437,9 @@ case "$MODE_PICK" in
398
437
  ;;
399
438
  esac
400
439
 
401
- echo "已选择: $NETWORK_MODE ($NETWORK_ADAPTER)"
440
+ success "网络模式已选择"
441
+ kv "Mode" "$NETWORK_MODE"
442
+ kv "Adapter" "$NETWORK_ADAPTER"
402
443
 
403
444
  title "启动 local-console"
404
445
  echo "1) gateway(推荐) 后台服务模式,可用 start/stop/restart/status 管理"
@@ -413,18 +454,19 @@ if [ "$START_MODE_PICK" = "2" ]; then
413
454
  SIGNALING_LOG="$WORK_DIR/.silicaclaw/signaling.log"
414
455
  SIGNALING_PID_FILE="$WORK_DIR/.silicaclaw/signaling.pid"
415
456
  run_cmd "cd \"$WORK_DIR\" && PORT=${SIGNALING_PORT_VALUE:-4510} nohup npm run webrtc-signaling > \"$SIGNALING_LOG\" 2>&1 & echo \$! > \"$SIGNALING_PID_FILE\""
416
- echo "已后台启动 signaling server,日志: $SIGNALING_LOG"
417
- echo "停止 signaling: kill \$(cat \"$SIGNALING_PID_FILE\")"
457
+ success "已后台启动 signaling server"
458
+ kv "日志" "$SIGNALING_LOG"
459
+ kv "停止" "kill \$(cat \"$SIGNALING_PID_FILE\")"
418
460
  fi
419
461
  echo "将使用以下参数启动(dev watch):"
420
- echo "NETWORK_ADAPTER=$NETWORK_ADAPTER"
421
- echo "WEBRTC_SIGNALING_URL=$WEBRTC_SIGNALING_URL_VALUE"
422
- echo "WEBRTC_ROOM=$WEBRTC_ROOM_VALUE"
462
+ kv "Adapter" "$NETWORK_ADAPTER"
463
+ kv "Relay" "$WEBRTC_SIGNALING_URL_VALUE"
464
+ kv "Room" "$WEBRTC_ROOM_VALUE"
423
465
  pause_continue
424
466
  run_cmd "cd \"$WORK_DIR\" && NETWORK_ADAPTER=$NETWORK_ADAPTER WEBRTC_SIGNALING_URL=$WEBRTC_SIGNALING_URL_VALUE WEBRTC_ROOM=$WEBRTC_ROOM_VALUE npm run local-console"
425
467
  else
426
468
  echo "将使用以下参数启动(dev watch):"
427
- echo "NETWORK_ADAPTER=$NETWORK_ADAPTER"
469
+ kv "Adapter" "$NETWORK_ADAPTER"
428
470
  pause_continue
429
471
  run_cmd "cd \"$WORK_DIR\" && NETWORK_ADAPTER=$NETWORK_ADAPTER npm run local-console"
430
472
  fi
@@ -434,14 +476,16 @@ else
434
476
  GATEWAY_CMD="$GATEWAY_CMD --signaling-url=$WEBRTC_SIGNALING_URL_VALUE --room=$WEBRTC_ROOM_VALUE"
435
477
  fi
436
478
  echo "将使用 gateway 后台启动:"
437
- echo "$GATEWAY_CMD"
479
+ kv "Command" "$GATEWAY_CMD"
438
480
  pause_continue
439
481
  run_cmd "$GATEWAY_CMD"
440
482
  echo ""
441
- echo "已启动完成。常用命令:"
442
- echo "cd \"$WORK_DIR\" && npm run gateway -- status"
443
- echo "cd \"$WORK_DIR\" && npm run gateway -- logs local-console"
444
- echo "cd \"$WORK_DIR\" && npm run gateway -- stop"
483
+ success "已启动完成"
484
+ kv "打开" "http://localhost:4310"
485
+ echo ""
486
+ echo "常用命令:"
487
+ kv "Status" "silicaclaw status"
488
+ kv "Logs" "silicaclaw logs local-console"
489
+ kv "Stop" "silicaclaw stop"
445
490
  echo ""
446
- echo "打开: http://localhost:4310"
447
491
  fi