@silicaclaw/cli 2026.3.19-4 → 2026.3.19-6

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/CHANGELOG.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## v1.0 beta - 2026-03-19
4
4
 
5
- ### 2026.3.19-4
5
+ ### 2026.3.19-6
6
6
 
7
7
  - local-console UI polish:
8
8
  - sidebar spacing, collapsed rail behavior, footer version card, and topbar shell now align more closely with OpenClaw
package/INSTALL.md CHANGED
@@ -219,7 +219,33 @@ npm run health
219
219
  - Ensure `npm run local-console` is running.
220
220
  - Use `http://localhost:4310`.
221
221
 
222
- 2. No peers in LAN mode
222
+ 2. `silicaclaw update` or `silicaclaw --version` returns `ETARGET`
223
+ - This usually means the new npm beta was published, but your local npm metadata cache is stale.
224
+ - Check the current beta tag with `npm view @silicaclaw/cli dist-tags --json`.
225
+ - Retry with a clean cache:
226
+
227
+ ```bash
228
+ NPM_CONFIG_CACHE=/tmp/silicaclaw-npm-cache-test silicaclaw --version
229
+ NPM_CONFIG_CACHE=/tmp/silicaclaw-npm-cache-test silicaclaw update
230
+ ```
231
+
232
+ - If that works, clear the persistent cache and retry:
233
+
234
+ ```bash
235
+ rm -rf ~/.silicaclaw/npm-cache
236
+ silicaclaw --version
237
+ silicaclaw update
238
+ ```
239
+
240
+ - You can also install the current beta directly with `npm i -g @silicaclaw/cli@beta`.
241
+
242
+ 3. Left sidebar version at `http://localhost:4310` still shows an older release
243
+ - Hard refresh the page first.
244
+ - Restart `silicaclaw gateway` / local-console.
245
+ - Reopen `http://localhost:4310`.
246
+ - If needed, clear the browser site data for `localhost:4310`.
247
+
248
+ 4. No peers in LAN mode
223
249
  - Keep `NETWORK_NAMESPACE` identical on both machines.
224
250
  - Keep `NETWORK_PORT` identical on both machines.
225
251
  - Allow UDP broadcast in firewall/router.
package/README.md CHANGED
@@ -278,6 +278,58 @@ silicaclaw openclaw-demo
278
278
  node scripts/openclaw-runtime-demo.mjs
279
279
  ```
280
280
 
281
+ ## Troubleshooting
282
+
283
+ ### `silicaclaw update` or `silicaclaw --version` fails with `ETARGET`
284
+
285
+ If you just published a new beta and npm says:
286
+
287
+ - `No matching version found for @silicaclaw/cli@...`
288
+ - `ETARGET`
289
+
290
+ the package may already be published, but your local npm metadata cache may still be stale.
291
+
292
+ Check the current beta tag:
293
+
294
+ ```bash
295
+ npm view @silicaclaw/cli dist-tags --json
296
+ ```
297
+
298
+ Try again with a clean cache:
299
+
300
+ ```bash
301
+ NPM_CONFIG_CACHE=/tmp/silicaclaw-npm-cache-test silicaclaw --version
302
+ NPM_CONFIG_CACHE=/tmp/silicaclaw-npm-cache-test silicaclaw update
303
+ ```
304
+
305
+ If that works, clear the persistent SilicaClaw npm cache and retry:
306
+
307
+ ```bash
308
+ rm -rf ~/.silicaclaw/npm-cache
309
+ silicaclaw --version
310
+ silicaclaw update
311
+ ```
312
+
313
+ As a direct fallback, install the current beta tag explicitly:
314
+
315
+ ```bash
316
+ npm i -g @silicaclaw/cli@beta
317
+ ```
318
+
319
+ ### Left sidebar version shows an older release
320
+
321
+ If `http://localhost:4310` is running the new release but the sidebar still shows an older version, the browser may be displaying cached UI shell data from a previous session.
322
+
323
+ Try:
324
+
325
+ ```text
326
+ 1. Hard refresh the page.
327
+ 2. Restart SilicaClaw gateway/local-console.
328
+ 3. Reopen http://localhost:4310.
329
+ ```
330
+
331
+ If needed, clear the browser site data for `localhost:4310` and reload again.
332
+
281
333
  Inside the demo shell:
282
334
 
283
335
  - type plain text to broadcast a message
package/VERSION CHANGED
@@ -1 +1 @@
1
- v2026.3.19-4
1
+ v2026.3.19-6
@@ -1 +1 @@
1
- 2026.3.19-4
1
+ 2026.3.19-6
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silicaclaw-broadcast",
3
- "version": "2026.3.19-4",
3
+ "version": "2026.3.19-6",
4
4
  "display_name": "SilicaClaw Broadcast",
5
5
  "description": "OpenClaw skill for reading SilicaClaw public broadcasts, publishing public broadcasts, and forwarding relevant updates to the owner through OpenClaw's native social channel.",
6
6
  "entrypoints": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicaclaw/cli",
3
- "version": "2026.3.19-4",
3
+ "version": "2026.3.19-6",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -398,8 +398,25 @@ function tryGlobalUpgrade(beta) {
398
398
  const writableGlobal = canWriteGlobalPrefix();
399
399
  if (!writableGlobal) return false;
400
400
  kv("Upgrade", `installing @silicaclaw/cli@${beta} globally`);
401
- const result = runInherit("npm", ["i", "-g", `@silicaclaw/cli@${beta}`]);
402
- return (result.status ?? 1) === 0;
401
+ const exactResult = runCapture("npm", ["i", "-g", `@silicaclaw/cli@${beta}`]);
402
+ if ((exactResult.status ?? 1) === 0) {
403
+ if (exactResult.stdout) process.stdout.write(exactResult.stdout);
404
+ if (exactResult.stderr) process.stderr.write(exactResult.stderr);
405
+ return true;
406
+ }
407
+
408
+ const detail = compactOutput(`${exactResult.stdout || ""}\n${exactResult.stderr || ""}`);
409
+ if (detail.includes("ETARGET") || detail.includes("No matching version found")) {
410
+ kv("Fallback", "registry metadata is still settling, retrying via @beta tag");
411
+ const fallbackResult = runInherit("npm", ["i", "-g", "@silicaclaw/cli@beta"]);
412
+ return (fallbackResult.status ?? 1) === 0;
413
+ }
414
+
415
+ if (detail) {
416
+ console.log("");
417
+ console.log(detail);
418
+ }
419
+ return false;
403
420
  }
404
421
 
405
422
  function update() {
@@ -486,6 +486,16 @@ async function waitForPort(port, timeoutMs = 5000) {
486
486
  return null;
487
487
  }
488
488
 
489
+ async function waitForPortToClear(port, timeoutMs = 5000) {
490
+ const startedAt = Date.now();
491
+ while (Date.now() - startedAt < timeoutMs) {
492
+ const listener = listeningProcessOnPort(port);
493
+ if (!listener) return true;
494
+ await sleep(200);
495
+ }
496
+ return false;
497
+ }
498
+
489
499
  function tailText(file, lines = 20) {
490
500
  if (!existsSync(file)) return "";
491
501
  const text = String(readFileSync(file, "utf8"));
@@ -528,6 +538,24 @@ async function stopOwnedListener(port, kind) {
528
538
  return true;
529
539
  }
530
540
 
541
+ async function drainOwnedListener(port, kind, timeoutMs = 5000) {
542
+ const startedAt = Date.now();
543
+ let attempted = false;
544
+ while (Date.now() - startedAt < timeoutMs) {
545
+ const listener = listeningProcessOnPort(port);
546
+ if (!listener) return { cleared: true, attempted };
547
+ if (!isOwnedListener(listener, kind)) {
548
+ return { cleared: false, attempted };
549
+ }
550
+ attempted = true;
551
+ await stopOwnedListener(port, kind);
552
+ const cleared = await waitForPortToClear(port, 1200);
553
+ if (cleared) return { cleared: true, attempted };
554
+ }
555
+ const finalListener = listeningProcessOnPort(port);
556
+ return { cleared: !finalListener, attempted };
557
+ }
558
+
531
559
  function printStopSummary() {
532
560
  const localListener = listeningProcessOnPort(4310);
533
561
  const signalingListener = listeningProcessOnPort(4510);
@@ -538,6 +566,9 @@ function printStopSummary() {
538
566
  kv("Console", paint("stopped", COLOR.green));
539
567
  } else {
540
568
  kv("Console", `${paint("still busy", COLOR.yellow)} (pid=${localListener.pid})`);
569
+ if (isOwnedListener(localListener, "local-console")) {
570
+ kv("Hint", "an older SilicaClaw local-console process is still holding port 4310");
571
+ }
541
572
  kv("Inspect", "lsof -nP -iTCP:4310 -sTCP:LISTEN");
542
573
  kv("Stop pid", `kill ${localListener.pid}`);
543
574
  }
@@ -570,8 +601,8 @@ async function stopAll() {
570
601
  if (isLaunchdPlatform()) {
571
602
  stopLaunchAgent(LOCAL_CONSOLE_LABEL);
572
603
  stopLaunchAgent(SIGNALING_LABEL);
573
- await stopOwnedListener(4310, "local-console");
574
- await stopOwnedListener(4510, "signaling");
604
+ await drainOwnedListener(4310, "local-console", 8000);
605
+ await drainOwnedListener(4510, "signaling", 5000);
575
606
  removeFileIfExists(CONSOLE_PID_FILE);
576
607
  removeFileIfExists(SIGNALING_PID_FILE);
577
608
  writeState({
@@ -584,8 +615,8 @@ async function stopAll() {
584
615
  const sigPid = readPid(SIGNALING_PID_FILE);
585
616
  await stopPid(localPid, "local-console");
586
617
  await stopPid(sigPid, "signaling");
587
- await stopOwnedListener(4310, "local-console");
588
- await stopOwnedListener(4510, "signaling");
618
+ await drainOwnedListener(4310, "local-console", 5000);
619
+ await drainOwnedListener(4510, "signaling", 5000);
589
620
  removeFileIfExists(CONSOLE_PID_FILE);
590
621
  removeFileIfExists(SIGNALING_PID_FILE);
591
622
  writeState({
@@ -638,8 +669,8 @@ async function startAll() {
638
669
  if (isLaunchdPlatform()) {
639
670
  const npmPath = resolveCommandPath("npm");
640
671
  const signalingEntry = resolve(APP_DIR, "scripts", "webrtc-signaling-server.mjs");
641
- await stopOwnedListener(4310, "local-console");
642
- await stopOwnedListener(4510, "signaling");
672
+ await drainOwnedListener(4310, "local-console", 8000);
673
+ await drainOwnedListener(4510, "signaling", 5000);
643
674
  const baseEnv = {
644
675
  NETWORK_ADAPTER: adapter,
645
676
  NETWORK_MODE: mode,