diff --git a/Makefile b/Makefile index fd52309..01e2861 100644 --- a/Makefile +++ b/Makefile @@ -2,13 +2,17 @@ include s9pk.mk # ── Deploy ───────────────────────────────────────────────────────────────── -# `make deploy` — interactively bumps the version, builds the x86 .s9pk, -# uploads it to FileBrowser, registers with the Start9 registry, and triggers -# a registry re-index. Reads credentials from .deploy.env — copy -# .deploy.env.example to .deploy.env and fill in your values. +# `make deploy` — bump the version (only if .release-notes-pending.txt +# exists, signalling unshipped changes), build the x86 .s9pk, upload to +# FileBrowser, register with the Start9 registry, and trigger a re-index. +# Reads credentials from .deploy.env — copy .deploy.env.example to +# .deploy.env and fill in your values. +# +# The bump step is skipped automatically if you've already run `make bump` +# (which consumes the pending-notes file). No more double-prompt. .PHONY: deploy redeploy bump deploy: - @bash bin/bump-version.sh + @bash bin/bump-version.sh --from-deploy @$(MAKE) --no-print-directory x86 @bash bin/deploy.sh diff --git a/bin/bump-version.sh b/bin/bump-version.sh index 0169c08..9d9c190 100755 --- a/bin/bump-version.sh +++ b/bin/bump-version.sh @@ -12,16 +12,40 @@ # This is the convention Claude uses after making code changes. The file is # deleted on a successful bump. # +# Flags: +# --from-deploy Treat the absence of .release-notes-pending.txt as the +# signal that no new work needs to ship — exit 0 without +# bumping. Lets `make deploy` always include this step +# without forcing a redundant bump when the user (or a +# prior run) already bumped. +# # Run standalone with `make bump`, or as the first step of `make deploy`. set -euo pipefail +FROM_DEPLOY=0 +for arg in "$@"; do + case "$arg" in + --from-deploy) FROM_DEPLOY=1 ;; + esac +done + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" VERSIONS_DIR="$PROJECT_ROOT/startos/versions" INDEX_FILE="$VERSIONS_DIR/index.ts" PENDING_NOTES_FILE="$PROJECT_ROOT/.release-notes-pending.txt" +# When invoked from `make deploy`, treat a missing pending-notes file as +# "nothing new to ship — current version is already fresh, skip the bump." +# Standalone `make bump` always prompts. +if [ "$FROM_DEPLOY" = "1" ] && [ ! -f "$PENDING_NOTES_FILE" ]; then + echo "" + echo " (No .release-notes-pending.txt — current version is already bumped. Skipping.)" + echo "" + exit 0 +fi + # --- Discover current version --- CURRENT_VAR="$(sed -nE "s/.*current:[[:space:]]*(v_[0-9_]+).*/\1/p" "$INDEX_FILE" | head -1)" if [ -z "$CURRENT_VAR" ]; then diff --git a/public/index.html b/public/index.html index c331e91..6abc92a 100644 --- a/public/index.html +++ b/public/index.html @@ -1324,21 +1324,24 @@ // ── Process ────────────────────────────────────────────────────────────── async function handleSubmit() { - // Free tier requires BYO Gemini key — bundled key is licensed-only. - const free = !isLicensed(); - const hasKey = free ? !!state.apiKey.trim() : (state.apiKey.trim() || state.hasServerKey); + // Both tiers need a Gemini key — either entered in the web UI + // (state.apiKey, localStorage) or set on the server via the StartOS + // configuration action (state.hasServerKey). The free-vs-paid line + // is concurrency + features, not key sourcing. + const hasKey = state.apiKey.trim() || state.hasServerKey; if (!state.url.trim() || !hasKey) { - if (free && !state.apiKey.trim() && state.url.trim()) { - showToast("Free mode needs your own Gemini API key — open Settings to enter one.", "🔑"); + if (!hasKey && state.url.trim()) { + showToast("Add your Gemini API key in Settings (or via the StartOS configuration action) to start summarizing.", "🔑"); } return; } const url = state.url.trim(); - // If already processing — free tier blocks, paid tier queues. + // If already processing — free tier blocks (one at a time), + // paid tier queues for batch. if (state.loading) { - if (free) { + if (!isLicensed()) { showToast("Free mode handles one video at a time. Wait for the current one to finish.", "⏳"); return; } @@ -1625,7 +1628,7 @@
${loading ? "Checking license…" - : "Activate a Keysat license to unlock the full app — library, subscriptions, channel auto-queue, and the bundled API key. Or skip to use free mode (one video at a time, bring your own Gemini key)." + : "Activate a Keysat license to unlock the full app — saved library, channel & podcast subscriptions, and auto-queue. Or skip to use free mode (one video at a time, no library)." }
${loading ? "" : ` @@ -1681,7 +1684,7 @@ "> Free mode - · one video at a time, bring your own Gemini key · + · one video at a time · no library, no subscriptions