install.sh

#!/bin/sh
# Maritime CLI installer: curl -fsSL https://maritime.sh/install.sh | sh
#
# Installs the maritime binary for this computer from the npm registry
# (package @maritimesh/cli--), checks its sha512, and puts it in
# ~/.maritime/bin. At a terminal it then runs 'maritime onboard': sign in,
# get an API key, and start the free trial. Agents and CI get the next
# command printed instead.
#
# Settings (environment):
# MARITIME_INSTALL_DIR where the binary goes (default ~/.maritime/bin)
# MARITIME_VERSION a version to install (default: latest)
# MARITIME_NO_ONBOARD=1 install only; do not run onboarding
set -eu

REGISTRY="https://registry.npmjs.org"
INSTALL_DIR="${MARITIME_INSTALL_DIR:-$HOME/.maritime/bin}"
VERSION="${MARITIME_VERSION:-latest}"
PATH_LINE="export PATH=\"$INSTALL_DIR:\$PATH\""

say() { printf '%s\n' "$*"; }
fail() { printf 'maritime install: %s\n' "$*" >&2; exit 1; }

need() {
 command -v "$1" >/dev/null 2>&1 || fail "this installer needs '$1'. Install it, or run: npm install -g maritime-cli"
}

platform() {
 case "$(uname -s)" in
 Darwin) os=darwin ;;
 Linux) os=linux ;;
 *) fail "unsupported system $(uname -s). On Windows run: npm install -g maritime-cli" ;;
 esac
 case "$(uname -m)" in
 arm64 | aarch64) arch=arm64 ;;
 x86_64 | amd64) arch=x64 ;;
 *) fail "unsupported processor $(uname -m)" ;;
 esac
 printf '@maritimesh/cli-%s-%s' "$os" "$arch"
}

# json_field NAME: the first "NAME":"value" string in the JSON on stdin.
json_field() {
 tr ',' '\n' | sed -n "s/.*\"$1\": *\"\([^\"\]*\)\".*/\1/p" | head -n 1
}

sha512_base64() {
 if command -v openssl >/dev/null 2>&1; then
 openssl dgst -sha512 -binary "$1" | openssl base64 -A
 elif command -v sha512sum >/dev/null 2>&1; then
 sha512sum "$1" | cut -d ' ' -f 1 | xxd -r -p | base64 | tr -d '\n'
 else
 fail "this installer needs openssl or sha512sum to check the download"
 fi
}

add_to_path() {
 case ":$PATH:" in *":$INSTALL_DIR:"*) return ;; esac
 for rc in "$HOME/.zshrc" "$HOME/.bashrc" "$HOME/.profile"; do
 if [ -f "$rc" ] && ! grep -qF "$INSTALL_DIR" "$rc"; then
 printf '\n# Maritime CLI\n%s\n' "$PATH_LINE" >>"$rc"
 say "Added $INSTALL_DIR to PATH in $rc"
 fi
 done
}

need curl
need tar
package="$(platform)"
metadata="$(curl -fsSL "$REGISTRY/$package/$VERSION")" || fail "could not reach the npm registry for $package"
tarball="$(printf '%s' "$metadata" | json_field tarball)"
integrity="$(printf '%s' "$metadata" | json_field integrity)"
version="$(printf '%s' "$metadata" | json_field version)"
[ -n "$tarball" ] && [ -n "$integrity" ] || fail "the npm registry answered without a download for $package"

work="$(mktemp -d)"
trap 'rm -rf "$work"' EXIT INT TERM
say "Downloading maritime $version for $package..."
curl -fsSL -o "$work/package.tgz" "$tarball" || fail "download failed"
[ "sha512-$(sha512_base64 "$work/package.tgz")" = "$integrity" ] || fail "the download does not match its checksum; nothing was installed"
tar -xzf "$work/package.tgz" -C "$work"
mkdir -p "$INSTALL_DIR"
mv "$work/package/bin/maritime" "$INSTALL_DIR/maritime"
chmod 755 "$INSTALL_DIR/maritime"
add_to_path
say "Installed $INSTALL_DIR/maritime (\