@silicaclaw/cli 2026.3.19-27 → 2026.3.19-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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## v1.0 beta - 2026-03-19
4
4
 
5
+ ### 2026.3.19-29
6
+
7
+ - release build:
8
+ - prepared another fresh latest-channel package build without publishing
9
+ - regenerated the npm tarball through the verified release packing workflow
10
+
11
+ ### 2026.3.19-28
12
+
13
+ - release build:
14
+ - prepared another fresh latest-channel package build without publishing
15
+ - regenerated the npm tarball through the verified release packing workflow
16
+
5
17
  ### 2026.3.19-27
6
18
 
7
19
  - release channel simplification:
package/DEMO_GUIDE.md CHANGED
@@ -1,4 +1,4 @@
1
- # SilicaClaw Demo Guide (v1.0 beta)
1
+ # SilicaClaw Demo Guide (v1.0)
2
2
 
3
3
  This guide provides 3 shortest demo paths.
4
4
 
package/INSTALL.md CHANGED
@@ -1,4 +1,4 @@
1
- # SilicaClaw Quick Start Install (v1.0 beta)
1
+ # SilicaClaw Quick Start Install (v1.0)
2
2
 
3
3
  This page follows an OpenClaw-like quick-start flow: install, run, verify.
4
4
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- v2026.3.19-27
1
+ v2026.3.19-29
@@ -191,6 +191,8 @@ export declare class LocalNodeService {
191
191
  private webrtcSeedPeers;
192
192
  private webrtcBootstrapHints;
193
193
  private webrtcBootstrapSources;
194
+ private networkStarted;
195
+ private networkStartupError;
194
196
  private appVersion;
195
197
  constructor(options?: {
196
198
  workspaceRoot?: string;
@@ -269,6 +271,8 @@ export declare class LocalNodeService {
269
271
  real_preview_transport_stats: any;
270
272
  real_preview_discovery_stats: any;
271
273
  webrtc_preview: {
274
+ started: boolean;
275
+ startup_error: string | null;
272
276
  signaling_url: any;
273
277
  signaling_endpoints: any;
274
278
  room: any;
@@ -295,6 +299,8 @@ export declare class LocalNodeService {
295
299
  limits: any;
296
300
  adapter_config: any;
297
301
  adapter_extra: {
302
+ started: boolean;
303
+ startup_error: string | null;
298
304
  signaling_url: any;
299
305
  signaling_endpoints: any;
300
306
  room: any;
@@ -363,6 +369,8 @@ export declare class LocalNodeService {
363
369
  adapter_transport_stats: any;
364
370
  adapter_discovery_stats: any;
365
371
  adapter_diagnostics_summary: {
372
+ started: boolean;
373
+ startup_error: string | null;
366
374
  signaling_url: any;
367
375
  signaling_endpoints: any;
368
376
  room: any;
@@ -406,6 +414,8 @@ export declare class LocalNodeService {
406
414
  components: any;
407
415
  limits: any;
408
416
  diagnostics_summary: {
417
+ started: boolean;
418
+ startup_error: string | null;
409
419
  signaling_url: any;
410
420
  signaling_endpoints: any;
411
421
  room: any;
@@ -144,6 +144,12 @@ function resolveWorkspaceRoot(cwd = process.cwd()) {
144
144
  return cwd;
145
145
  }
146
146
  function resolveProjectRoot(appRoot, cwd = process.cwd()) {
147
+ const envAppRoot = String(process.env.SILICACLAW_APP_DIR || "").trim();
148
+ if (envAppRoot &&
149
+ (0, fs_1.existsSync)((0, path_1.resolve)(envAppRoot, "apps", "local-console", "package.json")) &&
150
+ (0, fs_1.existsSync)((0, path_1.resolve)(envAppRoot, "package.json"))) {
151
+ return (0, path_1.resolve)(envAppRoot);
152
+ }
147
153
  const envRoot = String(process.env.SILICACLAW_WORKSPACE_DIR || "").trim();
148
154
  if (envRoot) {
149
155
  return (0, path_1.resolve)(envRoot);
@@ -728,6 +734,8 @@ class LocalNodeService {
728
734
  webrtcSeedPeers = [];
729
735
  webrtcBootstrapHints = [];
730
736
  webrtcBootstrapSources = [];
737
+ networkStarted = false;
738
+ networkStartupError = null;
731
739
  appVersion = "unknown";
732
740
  constructor(options) {
733
741
  this.workspaceRoot = options?.workspaceRoot || resolveWorkspaceRoot();
@@ -772,9 +780,18 @@ class LocalNodeService {
772
780
  async start() {
773
781
  await this.hydrateFromDisk();
774
782
  this.bindNetworkSubscriptions();
775
- await this.network.start();
776
- await this.log("info", `Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`);
777
- if (this.profile?.public_enabled && this.broadcastEnabled) {
783
+ try {
784
+ await this.network.start();
785
+ this.networkStarted = true;
786
+ this.networkStartupError = null;
787
+ await this.log("info", `Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`);
788
+ }
789
+ catch (error) {
790
+ this.networkStarted = false;
791
+ this.networkStartupError = error instanceof Error ? error.message : String(error);
792
+ await this.log("warn", `Network start failed (${this.adapterMode}, mode=${this.networkMode}): ${this.networkStartupError}`);
793
+ }
794
+ if (this.networkStarted && this.profile?.public_enabled && this.broadcastEnabled) {
778
795
  try {
779
796
  await this.broadcastNow("adapter_start");
780
797
  }
@@ -782,14 +799,19 @@ class LocalNodeService {
782
799
  await this.log("warn", `Initial broadcast failed: ${error instanceof Error ? error.message : String(error)}`);
783
800
  }
784
801
  }
785
- this.startBroadcastLoop();
802
+ if (this.networkStarted) {
803
+ this.startBroadcastLoop();
804
+ }
786
805
  }
787
806
  async stop() {
788
807
  if (this.broadcaster) {
789
808
  clearInterval(this.broadcaster);
790
809
  this.broadcaster = null;
791
810
  }
792
- await this.network.stop();
811
+ if (this.networkStarted) {
812
+ await this.network.stop();
813
+ }
814
+ this.networkStarted = false;
793
815
  }
794
816
  ensureLocalDirectoryBaseline() {
795
817
  if (this.profile) {
@@ -867,6 +889,8 @@ class LocalNodeService {
867
889
  real_preview_discovery_stats: diagnostics?.discovery_stats ?? null,
868
890
  webrtc_preview: relayCapable
869
891
  ? {
892
+ started: this.networkStarted,
893
+ startup_error: this.networkStartupError,
870
894
  signaling_url: network.signaling_url,
871
895
  signaling_endpoints: network.signaling_endpoints,
872
896
  room: network.room,
@@ -905,6 +929,8 @@ class LocalNodeService {
905
929
  adapter_config: diagnostics?.config ?? null,
906
930
  adapter_extra: relayCapable
907
931
  ? {
932
+ started: this.networkStarted,
933
+ startup_error: this.networkStartupError,
908
934
  signaling_url: network.signaling_url,
909
935
  signaling_endpoints: network.signaling_endpoints,
910
936
  room: network.room,
@@ -946,7 +972,7 @@ class LocalNodeService {
946
972
  demo_mode: this.adapterMode === "real-preview"
947
973
  ? "lan-preview"
948
974
  : this.adapterMode === "webrtc-preview" || this.adapterMode === "relay-preview"
949
- ? "internet-preview"
975
+ ? "global-preview"
950
976
  : "local-process",
951
977
  mode_explainer: this.getModeExplainer(),
952
978
  };
@@ -982,6 +1008,8 @@ class LocalNodeService {
982
1008
  adapter_discovery_stats: diagnostics?.discovery_stats ?? null,
983
1009
  adapter_diagnostics_summary: relayCapable || diagnostics
984
1010
  ? {
1011
+ started: this.networkStarted,
1012
+ startup_error: this.networkStartupError,
985
1013
  signaling_url: network.signaling_url,
986
1014
  signaling_endpoints: network.signaling_endpoints,
987
1015
  room: network.room,
@@ -1030,6 +1058,8 @@ class LocalNodeService {
1030
1058
  components: diagnostics.components,
1031
1059
  limits: diagnostics.limits,
1032
1060
  diagnostics_summary: {
1061
+ started: this.networkStarted,
1062
+ startup_error: this.networkStartupError,
1033
1063
  signaling_url: network.signaling_url,
1034
1064
  signaling_endpoints: network.signaling_endpoints,
1035
1065
  room: network.room,
@@ -1119,9 +1149,10 @@ class LocalNodeService {
1119
1149
  }
1120
1150
  getIntegrationStatus() {
1121
1151
  const runtimeGenerated = Boolean(this.socialRuntime && this.socialRuntime.last_loaded_at > 0);
1122
- const connected = this.socialFound && runtimeGenerated && !this.socialParseError;
1123
- const configured = connected && this.socialConfig.enabled;
1124
- const running = configured && this.broadcastEnabled;
1152
+ const runtimeReady = this.socialFound && runtimeGenerated && !this.socialParseError;
1153
+ const connected = runtimeReady && this.networkStarted;
1154
+ const configured = runtimeReady && this.socialConfig.enabled;
1155
+ const running = configured && this.broadcastEnabled && this.networkStarted;
1125
1156
  const publicEnabled = Boolean(this.profile?.public_enabled);
1126
1157
  const discoveryEnabled = this.socialConfig.discovery.discoverable &&
1127
1158
  this.socialConfig.discovery.allow_profile_broadcast &&
@@ -1140,9 +1171,11 @@ class LocalNodeService {
1140
1171
  ? "running"
1141
1172
  : !configured
1142
1173
  ? "not configured"
1143
- : !this.broadcastEnabled
1144
- ? "broadcast paused"
1145
- : "not running";
1174
+ : this.networkStartupError
1175
+ ? this.networkStartupError
1176
+ : !this.broadcastEnabled
1177
+ ? "broadcast paused"
1178
+ : "not running";
1146
1179
  const discoverableReason = discoverable
1147
1180
  ? "discoverable"
1148
1181
  : !running
@@ -2831,7 +2864,6 @@ async function main() {
2831
2864
  const staticDir = resolveLocalConsoleStaticDir();
2832
2865
  const staticIndexFile = (0, path_1.resolve)(staticDir, "index.html");
2833
2866
  const node = new LocalNodeService();
2834
- await node.start();
2835
2867
  app.use((0, cors_1.default)({ origin: true }));
2836
2868
  app.use(express_1.default.json());
2837
2869
  app.get("/api/identity", (_req, res) => {
@@ -3087,6 +3119,7 @@ async function main() {
3087
3119
  // eslint-disable-next-line no-console
3088
3120
  console.log(`SilicaClaw local-console running: http://localhost:${port}`);
3089
3121
  });
3122
+ await node.start();
3090
3123
  process.on("SIGINT", async () => {
3091
3124
  await node.stop();
3092
3125
  process.exit(0);
@@ -198,6 +198,14 @@ function resolveWorkspaceRoot(cwd = process.cwd()): string {
198
198
  }
199
199
 
200
200
  function resolveProjectRoot(appRoot: string, cwd = process.cwd()): string {
201
+ const envAppRoot = String(process.env.SILICACLAW_APP_DIR || "").trim();
202
+ if (
203
+ envAppRoot &&
204
+ existsSync(resolve(envAppRoot, "apps", "local-console", "package.json")) &&
205
+ existsSync(resolve(envAppRoot, "package.json"))
206
+ ) {
207
+ return resolve(envAppRoot);
208
+ }
201
209
  const envRoot = String(process.env.SILICACLAW_WORKSPACE_DIR || "").trim();
202
210
  if (envRoot) {
203
211
  return resolve(envRoot);
@@ -943,6 +951,8 @@ export class LocalNodeService {
943
951
  private webrtcSeedPeers: string[] = [];
944
952
  private webrtcBootstrapHints: string[] = [];
945
953
  private webrtcBootstrapSources: string[] = [];
954
+ private networkStarted = false;
955
+ private networkStartupError: string | null = null;
946
956
  private appVersion = "unknown";
947
957
 
948
958
  constructor(options?: { workspaceRoot?: string; projectRoot?: string; storageRoot?: string }) {
@@ -993,13 +1003,24 @@ export class LocalNodeService {
993
1003
  await this.hydrateFromDisk();
994
1004
 
995
1005
  this.bindNetworkSubscriptions();
996
- await this.network.start();
997
- await this.log(
998
- "info",
999
- `Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`
1000
- );
1006
+ try {
1007
+ await this.network.start();
1008
+ this.networkStarted = true;
1009
+ this.networkStartupError = null;
1010
+ await this.log(
1011
+ "info",
1012
+ `Local node started (${this.adapterMode}, mode=${this.networkMode}, signaling=${this.webrtcSignalingUrls[0] || "-"}, room=${this.webrtcRoom})`
1013
+ );
1014
+ } catch (error) {
1015
+ this.networkStarted = false;
1016
+ this.networkStartupError = error instanceof Error ? error.message : String(error);
1017
+ await this.log(
1018
+ "warn",
1019
+ `Network start failed (${this.adapterMode}, mode=${this.networkMode}): ${this.networkStartupError}`
1020
+ );
1021
+ }
1001
1022
 
1002
- if (this.profile?.public_enabled && this.broadcastEnabled) {
1023
+ if (this.networkStarted && this.profile?.public_enabled && this.broadcastEnabled) {
1003
1024
  try {
1004
1025
  await this.broadcastNow("adapter_start");
1005
1026
  } catch (error) {
@@ -1010,7 +1031,9 @@ export class LocalNodeService {
1010
1031
  }
1011
1032
  }
1012
1033
 
1013
- this.startBroadcastLoop();
1034
+ if (this.networkStarted) {
1035
+ this.startBroadcastLoop();
1036
+ }
1014
1037
  }
1015
1038
 
1016
1039
  async stop(): Promise<void> {
@@ -1018,7 +1041,10 @@ export class LocalNodeService {
1018
1041
  clearInterval(this.broadcaster);
1019
1042
  this.broadcaster = null;
1020
1043
  }
1021
- await this.network.stop();
1044
+ if (this.networkStarted) {
1045
+ await this.network.stop();
1046
+ }
1047
+ this.networkStarted = false;
1022
1048
  }
1023
1049
 
1024
1050
  private ensureLocalDirectoryBaseline(): void {
@@ -1101,6 +1127,8 @@ export class LocalNodeService {
1101
1127
  real_preview_discovery_stats: diagnostics?.discovery_stats ?? null,
1102
1128
  webrtc_preview: relayCapable
1103
1129
  ? {
1130
+ started: this.networkStarted,
1131
+ startup_error: this.networkStartupError,
1104
1132
  signaling_url: network.signaling_url,
1105
1133
  signaling_endpoints: network.signaling_endpoints,
1106
1134
  room: network.room,
@@ -1140,6 +1168,8 @@ export class LocalNodeService {
1140
1168
  adapter_config: diagnostics?.config ?? null,
1141
1169
  adapter_extra: relayCapable
1142
1170
  ? {
1171
+ started: this.networkStarted,
1172
+ startup_error: this.networkStartupError,
1143
1173
  signaling_url: network.signaling_url,
1144
1174
  signaling_endpoints: network.signaling_endpoints,
1145
1175
  room: network.room,
@@ -1182,7 +1212,7 @@ export class LocalNodeService {
1182
1212
  this.adapterMode === "real-preview"
1183
1213
  ? "lan-preview"
1184
1214
  : this.adapterMode === "webrtc-preview" || this.adapterMode === "relay-preview"
1185
- ? "internet-preview"
1215
+ ? "global-preview"
1186
1216
  : "local-process",
1187
1217
  mode_explainer: this.getModeExplainer(),
1188
1218
  };
@@ -1220,6 +1250,8 @@ export class LocalNodeService {
1220
1250
  adapter_discovery_stats: diagnostics?.discovery_stats ?? null,
1221
1251
  adapter_diagnostics_summary: relayCapable || diagnostics
1222
1252
  ? {
1253
+ started: this.networkStarted,
1254
+ startup_error: this.networkStartupError,
1223
1255
  signaling_url: network.signaling_url,
1224
1256
  signaling_endpoints: network.signaling_endpoints,
1225
1257
  room: network.room,
@@ -1269,6 +1301,8 @@ export class LocalNodeService {
1269
1301
  components: diagnostics.components,
1270
1302
  limits: diagnostics.limits,
1271
1303
  diagnostics_summary: {
1304
+ started: this.networkStarted,
1305
+ startup_error: this.networkStartupError,
1272
1306
  signaling_url: network.signaling_url,
1273
1307
  signaling_endpoints: network.signaling_endpoints,
1274
1308
  room: network.room,
@@ -1364,9 +1398,10 @@ export class LocalNodeService {
1364
1398
 
1365
1399
  getIntegrationStatus(): IntegrationStatusSummary {
1366
1400
  const runtimeGenerated = Boolean(this.socialRuntime && this.socialRuntime.last_loaded_at > 0);
1367
- const connected = this.socialFound && runtimeGenerated && !this.socialParseError;
1368
- const configured = connected && this.socialConfig.enabled;
1369
- const running = configured && this.broadcastEnabled;
1401
+ const runtimeReady = this.socialFound && runtimeGenerated && !this.socialParseError;
1402
+ const connected = runtimeReady && this.networkStarted;
1403
+ const configured = runtimeReady && this.socialConfig.enabled;
1404
+ const running = configured && this.broadcastEnabled && this.networkStarted;
1370
1405
  const publicEnabled = Boolean(this.profile?.public_enabled);
1371
1406
  const discoveryEnabled =
1372
1407
  this.socialConfig.discovery.discoverable &&
@@ -1388,6 +1423,8 @@ export class LocalNodeService {
1388
1423
  ? "running"
1389
1424
  : !configured
1390
1425
  ? "not configured"
1426
+ : this.networkStartupError
1427
+ ? this.networkStartupError
1391
1428
  : !this.broadcastEnabled
1392
1429
  ? "broadcast paused"
1393
1430
  : "not running";
@@ -3282,7 +3319,6 @@ export async function main() {
3282
3319
  const staticIndexFile = resolve(staticDir, "index.html");
3283
3320
 
3284
3321
  const node = new LocalNodeService();
3285
- await node.start();
3286
3322
 
3287
3323
  app.use(cors({ origin: true }));
3288
3324
  app.use(express.json());
@@ -3633,6 +3669,8 @@ export async function main() {
3633
3669
  console.log(`SilicaClaw local-console running: http://localhost:${port}`);
3634
3670
  });
3635
3671
 
3672
+ await node.start();
3673
+
3636
3674
  process.on("SIGINT", async () => {
3637
3675
  await node.stop();
3638
3676
  process.exit(0);
@@ -1 +1 @@
1
- 2026.3.19-beta.27
1
+ 2026.3.19-beta.29
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silicaclaw-broadcast",
3
- "version": "2026.3.19-beta.27",
3
+ "version": "2026.3.19-beta.29",
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-27",
3
+ "version": "2026.3.19-29",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -478,10 +478,13 @@ function update() {
478
478
  if (hasNewTarget) {
479
479
  if (npxRuntime) {
480
480
  kv("Update", `next run will use ${targetVersion}`);
481
- } else if (tryGlobalUpgrade(targetVersion)) {
482
- kv("Update", `installed ${targetVersion}`);
483
481
  } else {
484
- kv("Update", `install ${targetVersion} manually if needed`);
482
+ kv("Update", `command now points to ${targetVersion}`);
483
+ if (tryGlobalUpgrade(targetVersion)) {
484
+ kv("Global", `installed ${targetVersion}`);
485
+ } else {
486
+ kv("Global", `install ${targetVersion} manually if needed`);
487
+ }
485
488
  }
486
489
  }
487
490
 
@@ -186,6 +186,8 @@ function syncManagedRuntime() {
186
186
  "apps/public-explorer/dist",
187
187
  "apps/public-explorer/package.json",
188
188
  "apps/public-explorer/public",
189
+ "social.md",
190
+ ".openclaw",
189
191
  "package.json",
190
192
  "package-lock.json",
191
193
  "VERSION",
@@ -637,6 +639,20 @@ async function waitForCurrentAppListener(port, kind, timeoutMs = 5000) {
637
639
  return lastListener;
638
640
  }
639
641
 
642
+ async function waitForLocalConsoleHealth(timeoutMs = 8000) {
643
+ const startedAt = Date.now();
644
+ while (Date.now() - startedAt < timeoutMs) {
645
+ try {
646
+ const response = await fetch(`${LOCAL_CONSOLE_BASE_URL}/api/health`);
647
+ if (response.ok) return true;
648
+ } catch {
649
+ // ignore transient startup failures
650
+ }
651
+ await sleep(250);
652
+ }
653
+ return false;
654
+ }
655
+
640
656
  async function waitForPortToClear(port, timeoutMs = 5000) {
641
657
  const startedAt = Date.now();
642
658
  while (Date.now() - startedAt < timeoutMs) {
@@ -867,6 +883,7 @@ async function startAll() {
867
883
  NETWORK_MODE: mode,
868
884
  WEBRTC_SIGNALING_URL: signalingUrl,
869
885
  WEBRTC_ROOM: room,
886
+ SILICACLAW_APP_DIR: APP_DIR,
870
887
  SILICACLAW_WORKSPACE_DIR: WORKSPACE_DIR,
871
888
  };
872
889
  localPid = spawnBackground(
@@ -996,7 +1013,8 @@ async function main() {
996
1013
  if (cmd === "start") {
997
1014
  await startAll();
998
1015
  const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
999
- if (!listener || !isCurrentAppListener(listener, "local-console")) {
1016
+ const healthy = listener ? await waitForLocalConsoleHealth(8000) : false;
1017
+ if (!listener || !isCurrentAppListener(listener, "local-console") || !healthy) {
1000
1018
  headline();
1001
1019
  console.log("");
1002
1020
  kv("Status", paint("failed to start", COLOR.red));
@@ -1024,7 +1042,8 @@ async function main() {
1024
1042
  if (cmd === "restart") {
1025
1043
  await restartAll();
1026
1044
  const listener = await waitForCurrentAppListener(LOCAL_CONSOLE_PORT, "local-console", 15000);
1027
- if (!listener || !isCurrentAppListener(listener, "local-console")) {
1045
+ const healthy = listener ? await waitForLocalConsoleHealth(8000) : false;
1046
+ if (!listener || !isCurrentAppListener(listener, "local-console") || !healthy) {
1028
1047
  headline();
1029
1048
  console.log("");
1030
1049
  kv("Status", paint("failed to restart", COLOR.red));