#!/bin/bash # Install an npx wrapper for a given npm package. # Usage: omarchy-npx-install [command-name] # # If command-name is omitted, it defaults to the package name. # Example: omarchy-npx-install opencode-ai opencode if [[ -z $1 ]]; then echo "Usage: omarchy-npx-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 node_bin="\$node_root/bin/node" npx_bin="\$node_root/bin/npx" # Resolve the package bin inside npx, then run it with node@latest without leaking node@latest into PATH. # Some wrappers are aliases, e.g. playwright-cli wraps the playwright bin. package_bin_path=\$("\$node_bin" "\$npx_bin" --yes --package "\$package" -- which "\$package" 2>/dev/null) if [[ -n \$package_bin_path ]]; then exec "\$node_bin" "\$package_bin_path" "\$@" fi # Scoped packages like @openai/codex expose an unscoped bin like codex. package_bin_path=\$("\$node_bin" "\$npx_bin" --yes --package "\$package" -- which "\$command" 2>/dev/null) if [[ -n \$package_bin_path ]]; then exec "\$node_bin" "\$package_bin_path" "\$@" fi echo "Could not resolve npm bin for \$package / \$command" >&2 exit 127 EOF chmod +x "$HOME/.local/bin/$command"