160 lines
5.6 KiB
Bash
160 lines
5.6 KiB
Bash
#!/bin/bash
|
|
# Install script for amazon-q module
|
|
|
|
set -o errexit
|
|
set -o pipefail
|
|
|
|
command_exists() {
|
|
command -v "$1" > /dev/null 2>&1
|
|
}
|
|
|
|
# Inputs
|
|
ARG_INSTALL=${ARG_INSTALL:-true}
|
|
ARG_VERSION=${ARG_VERSION:-latest}
|
|
ARG_Q_INSTALL_URL=${ARG_Q_INSTALL_URL:-https://desktop-release.q.us-east-1.amazonaws.com}
|
|
ARG_AUTH_TARBALL=${ARG_AUTH_TARBALL:-}
|
|
ARG_AGENT_CONFIG=${ARG_AGENT_CONFIG:-}
|
|
ARG_AGENT_NAME=${ARG_AGENT_NAME:-default-agent}
|
|
ARG_MODULE_DIR_NAME=${ARG_MODULE_DIR_NAME:-.aws/.amazonq}
|
|
ARG_CODER_MCP_APP_STATUS_SLUG=${ARG_CODER_MCP_APP_STATUS_SLUG:-}
|
|
ARG_CODER_MCP_INSTRUCTIONS=${ARG_CODER_MCP_INSTRUCTIONS:-}
|
|
ARG_REPORT_TASKS=${ARG_REPORT_TASKS:-true}
|
|
|
|
mkdir -p "$HOME/$ARG_MODULE_DIR_NAME"
|
|
|
|
# Decode base64 inputs
|
|
ARG_AGENT_CONFIG_DECODED=""
|
|
if [ -n "$ARG_AGENT_CONFIG" ]; then
|
|
ARG_AGENT_CONFIG_DECODED=$(echo -n "$ARG_AGENT_CONFIG" | base64 -d)
|
|
fi
|
|
|
|
ARG_CODER_MCP_INSTRUCTIONS_DECODED=""
|
|
if [ -n "$ARG_CODER_MCP_INSTRUCTIONS" ]; then
|
|
ARG_CODER_MCP_INSTRUCTIONS_DECODED=$(echo -n "$ARG_CODER_MCP_INSTRUCTIONS" | base64 -d)
|
|
fi
|
|
|
|
echo "--------------------------------"
|
|
echo "install: $ARG_INSTALL"
|
|
echo "version: $ARG_VERSION"
|
|
echo "q_install_url: $ARG_Q_INSTALL_URL"
|
|
echo "agent_name: $ARG_AGENT_NAME"
|
|
echo "coder_mcp_app_status_slug: $ARG_CODER_MCP_APP_STATUS_SLUG"
|
|
echo "module_dir_name: $ARG_MODULE_DIR_NAME"
|
|
echo "auth_tarball_provided: ${ARG_AUTH_TARBALL}"
|
|
echo "report_tasks: ${ARG_REPORT_TASKS}"
|
|
echo "--------------------------------"
|
|
|
|
# Install Amazon Q if requested
|
|
function install_amazon_q() {
|
|
if [ "$ARG_INSTALL" = "true" ]; then
|
|
echo "Installing Amazon Q..."
|
|
PREV_DIR="$PWD"
|
|
TMP_DIR="$(mktemp -d)"
|
|
cd "$TMP_DIR"
|
|
|
|
ARCH="$(uname -m)"
|
|
case "$ARCH" in
|
|
"x86_64")
|
|
Q_URL="${ARG_Q_INSTALL_URL}/${ARG_VERSION}/q-x86_64-linux.zip"
|
|
;;
|
|
"aarch64" | "arm64")
|
|
Q_URL="${ARG_Q_INSTALL_URL}/${ARG_VERSION}/q-aarch64-linux.zip"
|
|
;;
|
|
*)
|
|
echo "Error: Unsupported architecture: $ARCH. Amazon Q only supports x86_64 and arm64."
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo "Downloading Amazon Q for $ARCH from $Q_URL..."
|
|
curl --proto '=https' --tlsv1.2 -sSf "$Q_URL" -o "q.zip"
|
|
unzip q.zip
|
|
./q/install.sh --no-confirm
|
|
cd "$PREV_DIR"
|
|
rm -rf "$TMP_DIR"
|
|
|
|
# Ensure binaries are discoverable; create stable symlink to q
|
|
CANDIDATES=(
|
|
"$(command -v q || true)"
|
|
"$HOME/.local/bin/q"
|
|
)
|
|
FOUND_BIN=""
|
|
for c in "${CANDIDATES[@]}"; do
|
|
if [ -n "$c" ] && [ -x "$c" ]; then
|
|
FOUND_BIN="$c"
|
|
break
|
|
fi
|
|
done
|
|
export PATH="$PATH:$HOME/.local/bin"
|
|
echo "Installed Amazon Q at: $(command -v q || true) (resolved: $FOUND_BIN)"
|
|
fi
|
|
}
|
|
|
|
# Extract authentication tarball
|
|
function extract_auth_tarball() {
|
|
if [ -n "$ARG_AUTH_TARBALL" ]; then
|
|
echo "Extracting auth tarball..."
|
|
|
|
if ! command_exists zstd; then
|
|
echo "Error: zstd is required to extract the authentication tarball but is not installed."
|
|
echo "Please install zstd using the pre_install_script parameter."
|
|
exit 1
|
|
fi
|
|
|
|
PREV_DIR="$PWD"
|
|
echo "$ARG_AUTH_TARBALL" | base64 -d > /tmp/auth.tar.zst
|
|
rm -rf ~/.local/share/amazon-q
|
|
mkdir -p ~/.local/share/amazon-q
|
|
cd ~/.local/share/amazon-q
|
|
tar -I zstd -xf /tmp/auth.tar.zst
|
|
rm /tmp/auth.tar.zst
|
|
cd "$PREV_DIR"
|
|
echo "Extracted auth tarball to ~/.local/share/amazon-q"
|
|
else
|
|
echo "Warning: No auth tarball provided. Amazon Q may require manual authentication."
|
|
fi
|
|
}
|
|
|
|
# Configure MCP integration and create agent
|
|
function configure_agent() {
|
|
# Create Amazon Q agent configuration directory
|
|
AGENT_CONFIG_DIR="$HOME/.aws/amazonq/cli-agents"
|
|
mkdir -p "$AGENT_CONFIG_DIR"
|
|
ALLOWED_TOOLS="coder_get_workspace\,coder_create_workspace\,coder_list_workspaces\,coder_list_templates\,coder_template_version_parameters\,coder_get_authenticated_user\,coder_create_workspace_build\,coder_create_template_version\,coder_get_workspace_agent_logs\,coder_get_workspace_build_logs\,coder_get_template_version_logs\,coder_update_template_active_version\,coder_upload_tar_file\,coder_create_template\,coder_delete_template\,coder_workspace_bash"
|
|
if [ -n "$ARG_AGENT_CONFIG_DECODED" ]; then
|
|
echo "Applying custom MCP configuration..."
|
|
# Use agent name as filename for the configuration
|
|
echo "$ARG_AGENT_CONFIG_DECODED" > "$AGENT_CONFIG_DIR/${ARG_AGENT_NAME}.json"
|
|
echo "Custom configuration saved to $AGENT_CONFIG_DIR/${ARG_AGENT_NAME}.json"
|
|
fi
|
|
if [ "$ARG_REPORT_TASKS" = "true" ]; then
|
|
echo "Configuring Amazon Q to report tasks via Coder MCP..."
|
|
q mcp add --name coder \
|
|
--command "coder" \
|
|
--agent "$ARG_AGENT_NAME" \
|
|
--args "exp,mcp,server,--allowed-tools,coder_report_task,--instructions,'$ARG_CODER_MCP_INSTRUCTIONS_DECODED'" \
|
|
--env "CODER_MCP_APP_STATUS_SLUG=${ARG_CODER_MCP_APP_STATUS_SLUG}" \
|
|
--env "CODER_MCP_AI_AGENTAPI_URL=http://localhost:3284" \
|
|
--env "CODER_AGENT_URL=${CODER_AGENT_URL}" \
|
|
--env "CODER_AGENT_TOKEN=${CODER_AGENT_TOKEN}" \
|
|
--force || echo "Warning: Failed to add Coder MCP server"
|
|
else
|
|
q mcp add --name coder \
|
|
--command "coder" \
|
|
--agent "$ARG_AGENT_NAME" \
|
|
--args "exp,mcp,server,--allowed-tools,coder_report_task" \
|
|
--env "CODER_AGENT_URL=${CODER_AGENT_URL}" \
|
|
--env "CODER_AGENT_TOKEN=${CODER_AGENT_TOKEN}" \
|
|
--force || echo "Warning: Failed to add Coder MCP server"
|
|
fi
|
|
echo "Added Coder MCP server into $ARG_AGENT_NAME in Amazon Q configuration"
|
|
q settings chat.defaultAgent "$ARG_AGENT_NAME"
|
|
}
|
|
|
|
# Main execution
|
|
install_amazon_q
|
|
extract_auth_tarball
|
|
configure_agent
|
|
|
|
echo "Amazon Q installation and configuration complete!"
|