@silicaclaw/cli 2026.3.19-8 → 2026.3.19-9

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,12 @@
2
2
 
3
3
  ## v1.0 beta - 2026-03-19
4
4
 
5
+ ### 2026.3.19-9
6
+
7
+ - release packaging workflow:
8
+ - added a dedicated release pack script for version sync checks, workspace build, skill validation, and npm packing
9
+ - confirmed the date-based release flow can be repeated with a single command before publish
10
+
5
11
  ### 2026.3.19-8
6
12
 
7
13
  - npm publish smoke test:
package/README.md CHANGED
@@ -74,6 +74,13 @@ Check and update CLI version:
74
74
  npx -y @silicaclaw/cli@beta update
75
75
  ```
76
76
 
77
+ Release packaging:
78
+
79
+ ```bash
80
+ npm run release:check
81
+ npm run release:pack
82
+ ```
83
+
77
84
  Background service:
78
85
 
79
86
  ```bash
package/VERSION CHANGED
@@ -1 +1 @@
1
- v2026.3.19-8
1
+ v2026.3.19-9
@@ -1 +1 @@
1
- 2026.3.19-8
1
+ 2026.3.19-9
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silicaclaw-broadcast",
3
- "version": "2026.3.19-8",
3
+ "version": "2026.3.19-9",
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-8",
3
+ "version": "2026.3.19-9",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -53,6 +53,8 @@
53
53
  "scripts": {
54
54
  "prepack": "npm run build",
55
55
  "build": "npm run -ws build",
56
+ "release:check": "node scripts/release-pack.mjs --dry-run",
57
+ "release:pack": "node scripts/release-pack.mjs",
56
58
  "dev": "npm run --workspace @silicaclaw/local-console dev",
57
59
  "onboard": "node scripts/silicaclaw-cli.mjs onboard",
58
60
  "quickstart": "bash scripts/quickstart.sh",
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "node:child_process";
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import { resolve } from "node:path";
6
+
7
+ const ROOT_DIR = resolve(new URL("..", import.meta.url).pathname);
8
+ const args = process.argv.slice(2);
9
+ const dryRun = args.includes("--dry-run");
10
+
11
+ function readJson(filePath) {
12
+ return JSON.parse(readFileSync(filePath, "utf8"));
13
+ }
14
+
15
+ function readText(filePath) {
16
+ return readFileSync(filePath, "utf8").trim();
17
+ }
18
+
19
+ function normalizeVersion(value) {
20
+ const text = String(value || "").trim();
21
+ return text.startsWith("v") ? text.slice(1) : text;
22
+ }
23
+
24
+ function assert(condition, message) {
25
+ if (!condition) {
26
+ console.error(message);
27
+ process.exit(1);
28
+ }
29
+ }
30
+
31
+ function run(cmd, cmdArgs, extraEnv = {}) {
32
+ const result = spawnSync(cmd, cmdArgs, {
33
+ cwd: ROOT_DIR,
34
+ stdio: "inherit",
35
+ env: {
36
+ ...process.env,
37
+ npm_config_cache: resolve(ROOT_DIR, ".npm-cache"),
38
+ ...extraEnv,
39
+ },
40
+ });
41
+ if (result.error) {
42
+ console.error(result.error.message);
43
+ process.exit(1);
44
+ }
45
+ if ((result.status ?? 1) !== 0) {
46
+ process.exit(result.status ?? 1);
47
+ }
48
+ }
49
+
50
+ function verifyVersionSync() {
51
+ const pkg = readJson(resolve(ROOT_DIR, "package.json"));
52
+ const lock = readJson(resolve(ROOT_DIR, "package-lock.json"));
53
+ const rootVersionFile = readText(resolve(ROOT_DIR, "VERSION"));
54
+ const skillVersionFile = readText(resolve(ROOT_DIR, "openclaw-skills", "silicaclaw-broadcast", "VERSION"));
55
+ const skillManifest = readJson(resolve(ROOT_DIR, "openclaw-skills", "silicaclaw-broadcast", "manifest.json"));
56
+
57
+ const expected = normalizeVersion(pkg.version);
58
+ const checks = [
59
+ ["package.json", normalizeVersion(pkg.version)],
60
+ ["package-lock.json", normalizeVersion(lock.version)],
61
+ ['package-lock.json packages[""]', normalizeVersion(lock.packages?.[""]?.version)],
62
+ ["VERSION", normalizeVersion(rootVersionFile)],
63
+ ["skill VERSION", normalizeVersion(skillVersionFile)],
64
+ ["skill manifest", normalizeVersion(skillManifest.version)],
65
+ ];
66
+
67
+ for (const [label, actual] of checks) {
68
+ assert(Boolean(actual), `Missing version in ${label}`);
69
+ assert(actual === expected, `Version mismatch: ${label}=${actual}, expected ${expected}`);
70
+ }
71
+
72
+ console.log(`Version sync OK: ${expected}`);
73
+ }
74
+
75
+ function main() {
76
+ assert(existsSync(resolve(ROOT_DIR, "package.json")), "package.json not found");
77
+ verifyVersionSync();
78
+
79
+ console.log("Building workspaces...");
80
+ run("npm", ["run", "build"]);
81
+
82
+ console.log("Validating bundled OpenClaw skill...");
83
+ run("node", [resolve(ROOT_DIR, "scripts", "validate-openclaw-skill.mjs")]);
84
+
85
+ console.log(dryRun ? "Running npm pack dry-run..." : "Packing npm tarball...");
86
+ run("npm", ["pack", ...(dryRun ? ["--dry-run"] : [])]);
87
+ }
88
+
89
+ main();
@@ -669,32 +669,6 @@ async function startAll() {
669
669
  const room = parseFlag("room", process.env.WEBRTC_ROOM || "silicaclaw-global-preview");
670
670
  const shouldDisableSignaling = hasFlag("no-signaling");
671
671
 
672
- const currentLocalPid = readPid(CONSOLE_PID_FILE);
673
- const currentSigPid = readPid(SIGNALING_PID_FILE);
674
- const currentListener = listeningProcessOnPort(4310);
675
- if (currentListener && isOwnedListener(currentListener, "local-console") && !isRunning(currentLocalPid)) {
676
- writeFileSync(CONSOLE_PID_FILE, String(currentListener.pid));
677
- }
678
-
679
- let localPid = readPid(CONSOLE_PID_FILE);
680
- if (!isRunning(localPid)) {
681
- removeFileIfExists(CONSOLE_PID_FILE);
682
- const env = {
683
- NETWORK_ADAPTER: adapter,
684
- NETWORK_MODE: mode,
685
- WEBRTC_SIGNALING_URL: signalingUrl,
686
- WEBRTC_ROOM: room,
687
- };
688
- localPid = spawnBackground(
689
- process.execPath,
690
- ["dist/apps/local-console/src/server.js"],
691
- env,
692
- CONSOLE_LOG_FILE,
693
- CONSOLE_PID_FILE,
694
- LOCAL_CONSOLE_DIR,
695
- );
696
- }
697
-
698
672
  const { host, port } = parseUrlHostPort(signalingUrl);
699
673
  const shouldAutoStartSignaling =
700
674
  mode === "global-preview" &&
@@ -750,6 +724,37 @@ async function startAll() {
750
724
  return { localPid: null, signalingPid: null };
751
725
  }
752
726
 
727
+ const currentLocalPid = readPid(CONSOLE_PID_FILE);
728
+ const currentSigPid = readPid(SIGNALING_PID_FILE);
729
+ const currentListener = listeningProcessOnPort(4310);
730
+ if (currentListener && isOwnedListener(currentListener, "local-console") && !isRunning(currentLocalPid)) {
731
+ writeFileSync(CONSOLE_PID_FILE, String(currentListener.pid));
732
+ }
733
+
734
+ let localPid = readPid(CONSOLE_PID_FILE);
735
+ if (!isRunning(localPid)) {
736
+ removeFileIfExists(CONSOLE_PID_FILE);
737
+ await drainOwnedListener(4310, "local-console", 8000);
738
+ const remainingLocalListener = listeningProcessOnPort(4310);
739
+ if (remainingLocalListener) {
740
+ throw new Error(`port 4310 is occupied by pid=${remainingLocalListener.pid}`);
741
+ }
742
+ const env = {
743
+ NETWORK_ADAPTER: adapter,
744
+ NETWORK_MODE: mode,
745
+ WEBRTC_SIGNALING_URL: signalingUrl,
746
+ WEBRTC_ROOM: room,
747
+ };
748
+ localPid = spawnBackground(
749
+ process.execPath,
750
+ ["dist/apps/local-console/src/server.js"],
751
+ env,
752
+ CONSOLE_LOG_FILE,
753
+ CONSOLE_PID_FILE,
754
+ LOCAL_CONSOLE_DIR,
755
+ );
756
+ }
757
+
753
758
  let signalingPid = currentSigPid;
754
759
  if (shouldAutoStartSignaling) {
755
760
  if (!isRunning(currentSigPid)) {