@silicaclaw/cli 2026.3.20-19 → 2026.3.20-20

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-20
4
4
 
5
+ ### 2026.3.20-20
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
+
5
11
  ### 2026.3.20-19
6
12
 
7
13
  - release build:
package/VERSION CHANGED
@@ -1 +1 @@
1
- v2026.3.20-19
1
+ v2026.3.20-20
@@ -321,13 +321,13 @@ export function bindAppEvents({
321
321
 
322
322
  document.getElementById("skillsSearchInput").addEventListener("input", async (event) => {
323
323
  socialController.setSkillsQuery(String(event.target?.value || ""));
324
- await refreshSkills();
324
+ await socialController.rerenderSkills();
325
325
  });
326
326
 
327
327
  document.querySelectorAll("[data-skills-filter]").forEach((btn) => {
328
328
  btn.addEventListener("click", async () => {
329
329
  socialController.setSkillsFilter(String(btn.getAttribute("data-skills-filter") || "all"));
330
- await refreshSkills();
330
+ await socialController.rerenderSkills();
331
331
  });
332
332
  });
333
333
 
@@ -336,7 +336,7 @@ export function bindAppEvents({
336
336
  const btn = event.target instanceof Element ? event.target.closest("[data-skills-toggle]") : null;
337
337
  if (!btn) return;
338
338
  socialController.toggleSkillsExpanded(String(btn.getAttribute("data-skills-toggle") || ""));
339
- await refreshSkills();
339
+ await socialController.rerenderSkills();
340
340
  });
341
341
  });
342
342
 
@@ -36,6 +36,7 @@ export function createSocialController({
36
36
  installed: false,
37
37
  dialogue: false,
38
38
  };
39
+ let lastSkillsPayload = null;
39
40
 
40
41
  function skillModeLabel(mode) {
41
42
  if (mode === "workspace") return t("labels.skillsModeWorkspace");
@@ -106,13 +107,13 @@ export function createSocialController({
106
107
  `;
107
108
  }
108
109
 
109
- function renderFilteredSkillCards({ skills, section, gridId, footerId, renderer, limit }) {
110
+ function renderFilteredSkillCards({ skills, section, gridId, footerId, renderer, limit, emptyText }) {
110
111
  const filtered = skills.filter((skill) => skillMatchesSearch(skill) && skillMatchesFilter(skill, section));
111
112
  const expanded = skillsExpanded[section];
112
113
  const visible = expanded ? filtered : filtered.slice(0, limit);
113
114
  document.getElementById(gridId).innerHTML = visible.length
114
115
  ? visible.map((skill) => renderer(skill)).join("")
115
- : `<div class="skills-empty">${t("hints.skillsNoFilterMatch")}</div>`;
116
+ : `<div class="skills-empty">${filtered.length === 0 && skills.length > 0 ? t("hints.skillsNoFilterMatch") : emptyText}</div>`;
116
117
  renderSkillsSectionFooter({
117
118
  footerId,
118
119
  section,
@@ -135,6 +136,10 @@ export function createSocialController({
135
136
  });
136
137
  }
137
138
 
139
+ function formatSectionCount(visibleCount, totalCount) {
140
+ return visibleCount === totalCount ? String(totalCount) : `${visibleCount}/${totalCount}`;
141
+ }
142
+
138
143
  function setCachedContent(id, value, mode = "html") {
139
144
  const cacheKey = `${mode}:${id}`;
140
145
  if (sectionRenderCache.get(cacheKey) === value) {
@@ -701,8 +706,12 @@ export function createSocialController({
701
706
  `;
702
707
  }
703
708
 
704
- async function refreshSkills() {
705
- const payload = (await api("/api/skills")).data || {};
709
+ async function refreshSkills(options = {}) {
710
+ const useCached = options.useCached === true;
711
+ const payload = useCached && lastSkillsPayload
712
+ ? lastSkillsPayload
713
+ : ((await api("/api/skills")).data || {});
714
+ lastSkillsPayload = payload;
706
715
  const bundled = Array.isArray(payload.bundled_skills) ? payload.bundled_skills : [];
707
716
  const installed = Array.isArray(payload.installed_skills) ? payload.installed_skills : [];
708
717
  const openclaw = payload.openclaw || {};
@@ -784,13 +793,9 @@ export function createSocialController({
784
793
  [t("labels.skillsAutoPush"), ownerPushSkill?.installed_in_openclaw ? t("common.yes") : t("common.no")],
785
794
  ].map(([k, v]) => `<div class="skills-summary-card"><div class="label">${k}</div><div class="value">${escapeHtml(v)}</div></div>`).join("");
786
795
 
787
- document.getElementById("skillsFeaturedCount").textContent = `${featuredSkills.length}`;
788
- document.getElementById("skillsBundledCount").textContent = `${bundled.length}`;
789
- document.getElementById("skillsInstalledCount").textContent = `${installed.length}`;
790
- document.getElementById("skillsDialogueCount").textContent = `${featuredSkills.length}`;
791
-
792
- document.getElementById("skillsFeaturedSpotlights").innerHTML = featuredSkills.length
793
- ? featuredSkills.map((skill) => `
796
+ const filteredFeaturedSkills = featuredSkills.filter((skill) => skillMatchesSearch(skill) && skillMatchesFilter(skill, "bundled"));
797
+ document.getElementById("skillsFeaturedSpotlights").innerHTML = filteredFeaturedSkills.length
798
+ ? filteredFeaturedSkills.map((skill) => `
794
799
  <div class="skills-spotlight">
795
800
  <div class="skill-card__eyebrow">${escapeHtml(skill.name === "silicaclaw-owner-push" ? t("labels.skillsAutoPush") : t("labels.skillsBroadcastLearning"))}</div>
796
801
  <div class="skills-spotlight__title">${escapeHtml(skill.display_name || skill.name)}</div>
@@ -801,7 +806,7 @@ export function createSocialController({
801
806
  </div>
802
807
  </div>
803
808
  `).join("")
804
- : `<div class="skills-empty">${t("hints.skillsNoBundled")}</div>`;
809
+ : `<div class="skills-empty">${featuredSkills.length > 0 ? t("hints.skillsNoFilterMatch") : t("hints.skillsNoBundled")}</div>`;
805
810
 
806
811
  const bundledMatchCount = renderFilteredSkillCards({
807
812
  skills: bundledSorted,
@@ -809,6 +814,7 @@ export function createSocialController({
809
814
  gridId: "skillsBundledGrid",
810
815
  footerId: "skillsBundledFooter",
811
816
  limit: SKILLS_SECTION_LIMIT,
817
+ emptyText: t("hints.skillsNoBundled"),
812
818
  renderer: (skill) => renderSkillCard(skill, {
813
819
  eyebrow: skill.install_mode === "workspace" || skill.install_mode === "legacy" ? skill.install_mode : "bundled",
814
820
  statusText: skill.update_available
@@ -829,6 +835,7 @@ export function createSocialController({
829
835
  gridId: "skillsInstalledGrid",
830
836
  footerId: "skillsInstalledFooter",
831
837
  limit: SKILLS_SECTION_LIMIT,
838
+ emptyText: t("hints.skillsNoInstalled"),
832
839
  renderer: (skill) => renderSkillCard(skill, {
833
840
  eyebrow: skill.install_mode || "installed",
834
841
  statusText: skill.update_available
@@ -846,9 +853,15 @@ export function createSocialController({
846
853
  gridId: "skillsDialogueGrid",
847
854
  footerId: "skillsDialogueFooter",
848
855
  limit: SKILLS_DIALOGUE_LIMIT,
856
+ emptyText: t("hints.skillsNoDialogueExamples"),
849
857
  renderer: (skill) => renderDialogueCard(skill),
850
858
  });
851
859
 
860
+ document.getElementById("skillsFeaturedCount").textContent = formatSectionCount(filteredFeaturedSkills.length, featuredSkills.length);
861
+ document.getElementById("skillsBundledCount").textContent = formatSectionCount(bundledMatchCount, bundled.length);
862
+ document.getElementById("skillsInstalledCount").textContent = formatSectionCount(installedMatchCount, installed.length);
863
+ document.getElementById("skillsDialogueCount").textContent = formatSectionCount(dialogueMatchCount, featuredSkills.length);
864
+
852
865
  renderSkillsFilterMeta({
853
866
  bundledCount: bundledMatchCount,
854
867
  installedCount: installedMatchCount,
@@ -879,6 +892,7 @@ export function createSocialController({
879
892
  refreshSocial,
880
893
  renderLogs,
881
894
  renderSocialMessages,
895
+ rerenderSkills: () => refreshSkills({ useCached: true }),
882
896
  setSkillsFilter,
883
897
  setSkillsQuery,
884
898
  setLogLevelFilter,
@@ -1 +1 @@
1
- 2026.3.20-beta.19
1
+ 2026.3.20-beta.20
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silicaclaw-broadcast",
3
- "version": "2026.3.20-beta.19",
3
+ "version": "2026.3.20-beta.20",
4
4
  "display_name": "SilicaClaw Broadcast",
5
5
  "description": "Official OpenClaw skill for a bounded local SilicaClaw broadcast workflow: read public broadcasts, publish public broadcasts, and optionally forward owner-relevant summaries through OpenClaw's native channel.",
6
6
  "entrypoints": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicaclaw/cli",
3
- "version": "2026.3.20-19",
3
+ "version": "2026.3.20-20",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"