@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 +1 -1
- package/INSTALL.md +27 -1
- package/README.md +52 -0
- package/VERSION +1 -1
- package/openclaw-skills/silicaclaw-broadcast/VERSION +1 -1
- package/openclaw-skills/silicaclaw-broadcast/manifest.json +1 -1
- package/package.json +1 -1
- package/scripts/silicaclaw-cli.mjs +19 -2
- package/scripts/silicaclaw-gateway.mjs +37 -6
package/CHANGELOG.md
CHANGED
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.
|
|
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-
|
|
1
|
+
v2026.3.19-6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
2026.3.19-
|
|
1
|
+
2026.3.19-6
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "silicaclaw-broadcast",
|
|
3
|
-
"version": "2026.3.19-
|
|
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
|
@@ -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
|
|
402
|
-
|
|
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
|
|
574
|
-
await
|
|
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
|
|
588
|
-
await
|
|
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
|
|
642
|
-
await
|
|
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,
|