## Summary - Fix version pinning bug in the OpenCode install script (`registry/coder-labs/modules/opencode/scripts/install.sh`, line 42) **Bug:** The install command was: ```bash VERSION=$ARG_OPENCODE_VERSION curl -fsSL https://opencode.ai/install | bash ``` `VERSION` was set as an environment variable prefix to `curl` (the left side of the pipe), so the `bash` process on the right side of the pipe never received it. In a shell pipeline, each command runs in its own subprocess, so env var prefixes only apply to the immediately following command. This caused the installer script to always install the latest version instead of the pinned version specified by the user. **Fix:** Move `VERSION` to prefix `bash` instead of `curl`: ```bash curl -fsSL https://opencode.ai/install | VERSION=$ARG_OPENCODE_VERSION bash ``` Now the `VERSION` variable is correctly available to the install script executed by `bash`. ## Test plan - [x] Set `opencode_version` to a specific version (e.g., `0.1.0`) and verify that version is installed instead of latest - [x] Set `opencode_version` to `latest` and verify the latest version is still installed (this code path is unchanged) - [x] Verify `opencode --version` output matches the requested version after install --------- Co-authored-by: 35C4n0r <70096901+35C4n0r@users.noreply.github.com>
132 lines
4.0 KiB
Bash
Executable File
132 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
command_exists() {
|
|
command -v "$1" > /dev/null 2>&1
|
|
}
|
|
|
|
ARG_WORKDIR=${ARG_WORKDIR:-"$HOME"}
|
|
ARG_REPORT_TASKS=${ARG_REPORT_TASKS:-true}
|
|
ARG_MCP_APP_STATUS_SLUG=${ARG_MCP_APP_STATUS_SLUG:-}
|
|
ARG_OPENCODE_VERSION=${ARG_OPENCODE_VERSION:-latest}
|
|
ARG_INSTALL_OPENCODE=${ARG_INSTALL_OPENCODE:-true}
|
|
ARG_AUTH_JSON=$(echo -n "$ARG_AUTH_JSON" | base64 -d 2> /dev/null || echo "")
|
|
ARG_OPENCODE_CONFIG=$(echo -n "$ARG_OPENCODE_CONFIG" | base64 -d 2> /dev/null || echo "")
|
|
|
|
# Print all received environment variables
|
|
printf "=== INSTALL CONFIG ===\n"
|
|
printf "ARG_WORKDIR: %s\n" "$ARG_WORKDIR"
|
|
printf "ARG_REPORT_TASKS: %s\n" "$ARG_REPORT_TASKS"
|
|
printf "ARG_MCP_APP_STATUS_SLUG: %s\n" "$ARG_MCP_APP_STATUS_SLUG"
|
|
printf "ARG_OPENCODE_VERSION: %s\n" "$ARG_OPENCODE_VERSION"
|
|
printf "ARG_INSTALL_OPENCODE: %s\n" "$ARG_INSTALL_OPENCODE"
|
|
if [ -n "$ARG_AUTH_JSON" ]; then
|
|
printf "ARG_AUTH_JSON: [AUTH DATA RECEIVED]\n"
|
|
else
|
|
printf "ARG_AUTH_JSON: [NOT PROVIDED]\n"
|
|
fi
|
|
if [ -n "$ARG_OPENCODE_CONFIG" ]; then
|
|
printf "ARG_OPENCODE_CONFIG: [RECEIVED]\n"
|
|
else
|
|
printf "ARG_OPENCODE_CONFIG: [NOT PROVIDED]\n"
|
|
fi
|
|
printf "==================================\n"
|
|
|
|
install_opencode() {
|
|
if [ "$ARG_INSTALL_OPENCODE" = "true" ]; then
|
|
if ! command_exists opencode; then
|
|
echo "Installing OpenCode (version: ${ARG_OPENCODE_VERSION})..."
|
|
if [ "$ARG_OPENCODE_VERSION" = "latest" ]; then
|
|
curl -fsSL https://opencode.ai/install | bash
|
|
else
|
|
curl -fsSL https://opencode.ai/install | VERSION="${ARG_OPENCODE_VERSION}" bash
|
|
fi
|
|
export PATH=/home/coder/.opencode/bin:$PATH
|
|
printf "Opencode location: %s\n" "$(which opencode)"
|
|
if ! command_exists opencode; then
|
|
echo "ERROR: Failed to install OpenCode"
|
|
exit 1
|
|
fi
|
|
echo "OpenCode installed successfully"
|
|
else
|
|
echo "OpenCode already installed"
|
|
fi
|
|
else
|
|
echo "OpenCode installation skipped (ARG_INSTALL_OPENCODE=false)"
|
|
fi
|
|
}
|
|
|
|
setup_opencode_config() {
|
|
local opencode_config_file="$HOME/.config/opencode/opencode.json"
|
|
local auth_json_file="$HOME/.local/share/opencode/auth.json"
|
|
|
|
mkdir -p "$(dirname "$auth_json_file")"
|
|
mkdir -p "$(dirname "$opencode_config_file")"
|
|
|
|
setup_opencode_auth "$auth_json_file"
|
|
|
|
if [ -n "$ARG_OPENCODE_CONFIG" ]; then
|
|
echo "Writing to the config file"
|
|
echo "$ARG_OPENCODE_CONFIG" > "$opencode_config_file"
|
|
fi
|
|
|
|
if [ "$ARG_REPORT_TASKS" = "true" ]; then
|
|
setup_coder_mcp_server "$opencode_config_file"
|
|
fi
|
|
|
|
echo "MCP configuration completed: $opencode_config_file"
|
|
}
|
|
|
|
setup_opencode_auth() {
|
|
local auth_json_file="$1"
|
|
|
|
if [ -n "$ARG_AUTH_JSON" ]; then
|
|
echo "$ARG_AUTH_JSON" > "$auth_json_file"
|
|
printf "added auth json to %s" "$auth_json_file"
|
|
else
|
|
printf "auth json not provided"
|
|
fi
|
|
}
|
|
|
|
setup_coder_mcp_server() {
|
|
local opencode_config_file="$1"
|
|
|
|
# Set environment variables based on task reporting setting
|
|
echo "Configuring OpenCode task reporting"
|
|
export CODER_MCP_APP_STATUS_SLUG="$ARG_MCP_APP_STATUS_SLUG"
|
|
export CODER_MCP_AI_AGENTAPI_URL="http://localhost:3284"
|
|
echo "Coder integration configured for task reporting"
|
|
|
|
# Add coder MCP server configuration to the JSON file
|
|
echo "Adding Coder MCP server configuration"
|
|
|
|
# Create the coder server configuration JSON
|
|
coder_config=$(
|
|
cat << EOF
|
|
{
|
|
"type": "local",
|
|
"command": ["coder", "exp", "mcp", "server"],
|
|
"enabled": true,
|
|
"environment": {
|
|
"CODER_MCP_APP_STATUS_SLUG": "${CODER_MCP_APP_STATUS_SLUG:-}",
|
|
"CODER_MCP_AI_AGENTAPI_URL": "${CODER_MCP_AI_AGENTAPI_URL:-}",
|
|
"CODER_AGENT_URL": "${CODER_AGENT_URL:-}",
|
|
"CODER_AGENT_TOKEN": "${CODER_AGENT_TOKEN:-}",
|
|
"CODER_MCP_ALLOWED_TOOLS": "coder_report_task"
|
|
}
|
|
}
|
|
EOF
|
|
)
|
|
|
|
temp_file=$(mktemp)
|
|
jq --argjson coder_config "$coder_config" '.mcp.coder = $coder_config' "$opencode_config_file" > "$temp_file"
|
|
mv "$temp_file" "$opencode_config_file"
|
|
echo "Coder MCP server configuration added"
|
|
|
|
}
|
|
|
|
install_opencode
|
|
setup_opencode_config
|
|
|
|
echo "OpenCode module setup completed."
|