The CLI only touches Node builtins and libsodium-wrappers (no native addons like better-sqlite3, which the server needs but the CLI never imports) -- confirmed by checking its actual import graph, not assumed. That makes it a good candidate for a single-file esbuild bundle rather than requiring a full git checkout + npm install on every machine that needs to run `keep pull`. deploy-cli.sh bundles src/cli (~18kb) and ships it straight to a host over SSH -- HOST=user@vps ./deploy-cli.sh -- mirroring flit's deploy-daemon.sh ssh-cat-chmod pattern rather than inventing a new convention. No git, no npm install, no node_modules on the target at all, just the one file plus a `node` runtime already there from whatever else is deployed on that box. Caught a real bug while building this: --banner:js="#!/usr/bin/env node" duplicated the shebang esbuild already preserves from the source file automatically, landing it on line 2 instead of line 1 -- Node only special-cases a shebang on line 1, so the bundle threw a syntax error on every invocation until the redundant banner flag was removed. Verified the bundle for real, not just that it builds: ran `keep identity init` / `identity show` against it directly and confirmed a real Ed25519 keypair comes out the other end -- the specific thing worth checking given libsodium-wrappers needed a createRequire workaround for its own broken ESM packaging, and bundling could easily have broken that differently. Also documents both CLI-provisioning paths in INTEGRATION.md (scripts/install-cli.sh for a machine you're fine cloning onto, deploy-cli.sh for one you'd rather not) as a "getting keep onto a machine" prerequisite section, ahead of the existing deploy-pattern docs that all assume it's already there. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
24 lines
900 B
Bash
Executable File
24 lines
900 B
Bash
Executable File
#!/usr/bin/env bash
|
|
# deploy-cli.sh — bundle the keep CLI into a single portable file and ship
|
|
# it straight to a host over SSH. No git clone, no npm install on the
|
|
# target — the bundle only touches Node builtins and libsodium-wrappers
|
|
# (pure JS/WASM, no native compilation), so the file itself is the whole
|
|
# artifact. Mirrors flit/deploy-daemon.sh's ssh-cat-chmod pattern.
|
|
#
|
|
# Usage: HOST=user@host ./deploy-cli.sh
|
|
set -euo pipefail
|
|
|
|
HOST="${HOST:?usage: HOST=user@host ./deploy-cli.sh}"
|
|
BIN_DIR="${BIN_DIR:-~/bin}"
|
|
|
|
echo "→ bundling keep CLI…"
|
|
npm run build:cli-bundle
|
|
|
|
echo "→ uploading to $HOST:$BIN_DIR/keep…"
|
|
ssh "$HOST" "mkdir -p $BIN_DIR && cat > $BIN_DIR/keep && chmod +x $BIN_DIR/keep" < dist-bundle/keep
|
|
|
|
echo "→ verifying…"
|
|
ssh "$HOST" "$BIN_DIR/keep --help" | head -1
|
|
|
|
echo "✓ done — re-run this script any time the CLI changes; it's one file, safe to overwrite."
|