feat(update): refresh the Higgsfield CLI and skill pack

This commit is contained in:
bastien
2026-09-30 16:10:08 +02:00
parent 83043412d0
commit bbd3d209d3
2 changed files with 56 additions and 0 deletions
+14
View File
@@ -336,5 +336,19 @@ expect stdin-tests \
"$(yn test "$(count install-plugins.sh '[ -t 0 ]')" -ge 3)" yes "$(yn test "$(count install-plugins.sh '[ -t 0 ]')" -ge 3)" yes
verdict INSTALL_WIRING verdict INSTALL_WIRING
# update-all.sh: refresh before the 21st block and before the pins re-apply,
# and the updated CLI is proven by the probe, after the npm call.
# shellcheck disable=SC2016 # a literal to grep for, not an expansion
NPM_UP='npm install -g "$HF_PKG"'
sync_ln="$(ln_last update-all.sh 'higgsfield_sync_skills')"
expect before-21st "$(yn test "$sync_ln" -lt \
"$(ln_first update-all.sh '7.4. Update the 21st.dev')")" yes
expect before-pins "$(yn test "$sync_ln" -lt \
"$(ln_last update-all.sh "$PINS")")" yes
expect probe-after-npm "$(yn test \
"$(ln_first update-all.sh 'higgsfield_cli_ok')" -gt \
"$(ln_last update-all.sh "$NPM_UP")")" yes
verdict UPDATE_WIRING
# ── tally ─────────────────────────────────────────────────── # ── tally ───────────────────────────────────────────────────
printf 'PASS=%s FAIL=%s\n' "$pass" "$fail"; [ "$fail" -eq 0 ] printf 'PASS=%s FAIL=%s\n' "$pass" "$fail"; [ "$fail" -eq 0 ]
+42
View File
@@ -465,6 +465,48 @@ print(d.get('impeccable',{}).get('version','latest'))
fi fi
fi fi
# ── 7.3b. Update the Higgsfield CLI + skill pack ──
# CLI: global npm bin. Skills: re-cloned by lib/higgsfield-skills.sh, which
# replaces the SOURCE under skills-external/ only: a pack parked in
# skills-disabled/ (symlinks to those sources) stays parked. Runs before the
# effort-pins re-apply below (BDR-108).
echo ""
echo "── Updating Higgsfield CLI + skill pack..."
if ! command -v higgsfield &>/dev/null; then
info "Higgsfield CLI not installed — skipping (run: make plugin)"
else
# shellcheck source=lib/higgsfield-skills.sh disable=SC1091
source "$REPO/lib/higgsfield-skills.sh"
HF_VER=""
if [ -f "$REPO/plugins.lock.json" ] && command -v python3 &>/dev/null; then
HF_VER=$(python3 -c "
import json
with open('$REPO/plugins.lock.json') as f:
d = json.load(f)
print(d.get('higgsfield',{}).get('version','latest'))
" 2>/dev/null || true)
fi
HF_PKG="@higgsfield/cli@latest"
[ -n "$HF_VER" ] && [ "$HF_VER" != "latest" ] \
&& HF_PKG="@higgsfield/cli@${HF_VER}"
HF_NPM_OK=true
npm install -g "$HF_PKG" 2>/dev/null || HF_NPM_OK=false
# The probe first, then npm's status: an update that skips the package's
# postinstall script exits 0 and leaves the shim with no binary behind it.
if ! higgsfield_cli_ok; then
warn "Higgsfield CLI does not answer after the update — run: npm install -g --allow-scripts=@higgsfield/cli @higgsfield/cli"
elif [ "$HF_NPM_OK" = true ]; then
ok "Higgsfield CLI updated (${HF_VER:-latest})"
else
warn "Higgsfield CLI update failed — existing binary kept"
fi
if HF_N=$(higgsfield_sync_skills "$REPO"); then
ok "Higgsfield skill pack refreshed ($HF_N skills)"
else
warn "Higgsfield skill pack refresh failed — existing pack kept"
fi
fi
# ── 7.4. Update the 21st.dev CLI + skill pack ── # ── 7.4. Update the 21st.dev CLI + skill pack ──
# The CLI is a global npm bin; the skills are its hash-verified output, staged # The CLI is a global npm bin; the skills are its hash-verified output, staged
# under a throwaway HOME because `21st skills install` refuses to write # under a throwaway HOME because `21st skills install` refuses to write