#!/bin/bash # omarchy:summary=Install a pnpm dlx wrapper for a given npm package. # omarchy:args= [command-name] if [[ -z $1 ]]; then echo "Usage: omarchy-npm-install [command-name]" exit 1 fi package=$1 command=${2:-$1} mkdir -p "$HOME/.local/bin" cat > "$HOME/.local/bin/$command" </dev/null node_root="\$(mise where node@latest)" fi if omarchy-cmd-missing pnpm; then echo "Installing pnpm for \$package..." omarchy-pkg-add pnpm hash -r fi export PNPM_CONFIG_MINIMUM_RELEASE_AGE=7200 ensure_bin_runtime() { local bin_path=\$1 local shebang IFS= read -r shebang < "\$bin_path" if [[ \$shebang == "#!"*"/bun"* || \$shebang == "#!"*"/env bun"* ]]; then if omarchy-cmd-missing bun; then echo "Installing bun runtime for \$package..." omarchy-pkg-add bun hash -r fi fi } exec_package_bin() { local package_bin_path=\$1 shift if [[ -n \$package_bin_path ]]; then ensure_bin_runtime "\$package_bin_path" PATH="\$node_root/bin:\$PATH" exec "\$package_bin_path" "\$@" fi } # Resolve the package bin inside pnpm dlx, then run it with node@latest available for node shebangs. # Some wrappers are aliases, e.g. playwright-cli wraps the playwright bin. PATH="\$node_root/bin:\$PATH" pnpm dlx --package "\$package" true package_bin_path=\$(PATH="\$node_root/bin:\$PATH" pnpm dlx --package "\$package" which "\$package" 2>/dev/null) exec_package_bin "\$package_bin_path" "\$@" # Scoped packages like @openai/codex expose an unscoped bin like codex. package_bin_path=\$(PATH="\$node_root/bin:\$PATH" pnpm dlx --package "\$package" which "\$command" 2>/dev/null) exec_package_bin "\$package_bin_path" "\$@" echo "Could not resolve npm bin for \$package / \$command" >&2 exit 127 EOF chmod +x "$HOME/.local/bin/$command"