diff --git a/README.md b/README.md index 0b1d75c..14c542c 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,8 @@ extra `coder_script` needed, matching how the `/etc/skel` copy in every template's `startup_script` already relies on that same mechanism. Each `templates//` is a complete, independent Coder template (agent, -docker container, code-server, JetBrains) with its own copy of everything -`main.tf` needs. They're deliberately not built from a shared Terraform +docker container, code-server) with its own copy of everything `main.tf` +needs. They're deliberately not built from a shared Terraform module or shared files elsewhere in the repo: `coder templates push -d templates/` only uploads that one directory to the Coder server, so any `file()` reference reaching outside it (e.g. the old shared @@ -114,6 +114,8 @@ finishes it - and offers to install + log into: - **GitHub Copilot CLI** (`bun install -g @github/copilot`, then `copilot login`) - **Google Antigravity CLI** (`curl -fsSL https://antigravity.google/cli/install.sh | bash`, binary `agy`) - **Claude Code CLI** (`bun install -g @anthropic-ai/claude-code`, then `claude`) +- **GitHub CLI** (`gh`, via the official apt repo, then `gh auth login`) +- **Gitea CLI** (`tea`, official binary release downloaded to `~/.local/bin`, then `tea login add`) It does **not** ask about VS Code extensions, since those are handled by Terraform (see above). Once the user confirms completion it writes a diff --git a/templates/3d-printing/cli-setup-wizard.sh b/templates/3d-printing/cli-setup-wizard.sh index 20fc6ef..14aca7e 100644 --- a/templates/3d-printing/cli-setup-wizard.sh +++ b/templates/3d-printing/cli-setup-wizard.sh @@ -96,6 +96,47 @@ else echo "Skipping Claude Code CLI: bun not found on this workspace image." fi +# --- GitHub CLI (gh) --- +if command -v gh >/dev/null 2>&1; then + echo "GitHub CLI already installed, skipping." +else + if ask_yes_no "Install GitHub CLI (gh) and log in?"; then + if (sudo mkdir -p -m 755 /etc/apt/keyrings \ + && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null \ + && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list >/dev/null \ + && sudo apt-get update -qq && sudo apt-get install -y gh); then + gh auth login || echo "Install succeeded but login didn't complete. Retry any time with: gh auth login" + else + echo "GitHub CLI install failed. Retry later with: gh auth login (once gh is installed)" + fi + fi +fi + +# --- Gitea CLI (tea) --- +if command -v tea >/dev/null 2>&1; then + echo "Gitea CLI already installed, skipping." +else + if ask_yes_no "Install Gitea CLI (tea) and log in?"; then + TEA_ARCH="$(uname -m)" + case "$TEA_ARCH" in + x86_64) TEA_ARCH="amd64" ;; + aarch64) TEA_ARCH="arm64" ;; + esac + TEA_VERSION="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/tea/releases/latest | grep -o '"tag_name":[^,]*' | grep -o 'v[0-9][^"]*')" + mkdir -p "$HOME/.local/bin" + if [ -n "$TEA_VERSION" ] \ + && curl -fsSL "https://gitea.com/gitea/tea/releases/download/${TEA_VERSION}/tea-${TEA_VERSION#v}-linux-${TEA_ARCH}" -o "$HOME/.local/bin/tea" \ + && chmod +x "$HOME/.local/bin/tea"; then + echo "Add this Gitea instance now (e.g. https://git.octoturge.com)..." + tea login add || echo "Login didn't complete. Retry any time with: tea login add" + else + echo "Gitea CLI install failed. Retry later from: https://gitea.com/gitea/tea/releases" + rm -f "$HOME/.local/bin/tea" + fi + fi +fi + echo "" if ask_yes_no "Mark setup wizard as complete so it stops asking on new terminals?"; then touch "$WIZARD_DONE_FILE" diff --git a/templates/3d-printing/main.tf b/templates/3d-printing/main.tf index 1950c41..e230507 100644 --- a/templates/3d-printing/main.tf +++ b/templates/3d-printing/main.tf @@ -141,17 +141,6 @@ module "code-server" { order = 1 } -# See https://registry.coder.com/modules/coder/jetbrains -module "jetbrains" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/jetbrains/coder" - version = "~> 1.1" - agent_id = coder_agent.main.id - agent_name = "main" - folder = "/home/coder" - tooltip = "You need to [install JetBrains Toolbox](https://coder.com/docs/user-guides/workspace-access/jetbrains/toolbox) to use this app." -} - resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes. diff --git a/templates/cobol/cli-setup-wizard.sh b/templates/cobol/cli-setup-wizard.sh index 20fc6ef..14aca7e 100644 --- a/templates/cobol/cli-setup-wizard.sh +++ b/templates/cobol/cli-setup-wizard.sh @@ -96,6 +96,47 @@ else echo "Skipping Claude Code CLI: bun not found on this workspace image." fi +# --- GitHub CLI (gh) --- +if command -v gh >/dev/null 2>&1; then + echo "GitHub CLI already installed, skipping." +else + if ask_yes_no "Install GitHub CLI (gh) and log in?"; then + if (sudo mkdir -p -m 755 /etc/apt/keyrings \ + && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null \ + && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list >/dev/null \ + && sudo apt-get update -qq && sudo apt-get install -y gh); then + gh auth login || echo "Install succeeded but login didn't complete. Retry any time with: gh auth login" + else + echo "GitHub CLI install failed. Retry later with: gh auth login (once gh is installed)" + fi + fi +fi + +# --- Gitea CLI (tea) --- +if command -v tea >/dev/null 2>&1; then + echo "Gitea CLI already installed, skipping." +else + if ask_yes_no "Install Gitea CLI (tea) and log in?"; then + TEA_ARCH="$(uname -m)" + case "$TEA_ARCH" in + x86_64) TEA_ARCH="amd64" ;; + aarch64) TEA_ARCH="arm64" ;; + esac + TEA_VERSION="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/tea/releases/latest | grep -o '"tag_name":[^,]*' | grep -o 'v[0-9][^"]*')" + mkdir -p "$HOME/.local/bin" + if [ -n "$TEA_VERSION" ] \ + && curl -fsSL "https://gitea.com/gitea/tea/releases/download/${TEA_VERSION}/tea-${TEA_VERSION#v}-linux-${TEA_ARCH}" -o "$HOME/.local/bin/tea" \ + && chmod +x "$HOME/.local/bin/tea"; then + echo "Add this Gitea instance now (e.g. https://git.octoturge.com)..." + tea login add || echo "Login didn't complete. Retry any time with: tea login add" + else + echo "Gitea CLI install failed. Retry later from: https://gitea.com/gitea/tea/releases" + rm -f "$HOME/.local/bin/tea" + fi + fi +fi + echo "" if ask_yes_no "Mark setup wizard as complete so it stops asking on new terminals?"; then touch "$WIZARD_DONE_FILE" diff --git a/templates/cobol/main.tf b/templates/cobol/main.tf index 53a5753..02fe8ef 100644 --- a/templates/cobol/main.tf +++ b/templates/cobol/main.tf @@ -141,17 +141,6 @@ module "code-server" { order = 1 } -# See https://registry.coder.com/modules/coder/jetbrains -module "jetbrains" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/jetbrains/coder" - version = "~> 1.1" - agent_id = coder_agent.main.id - agent_name = "main" - folder = "/home/coder" - tooltip = "You need to [install JetBrains Toolbox](https://coder.com/docs/user-guides/workspace-access/jetbrains/toolbox) to use this app." -} - resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes. diff --git a/templates/default/cli-setup-wizard.sh b/templates/default/cli-setup-wizard.sh index 20fc6ef..14aca7e 100644 --- a/templates/default/cli-setup-wizard.sh +++ b/templates/default/cli-setup-wizard.sh @@ -96,6 +96,47 @@ else echo "Skipping Claude Code CLI: bun not found on this workspace image." fi +# --- GitHub CLI (gh) --- +if command -v gh >/dev/null 2>&1; then + echo "GitHub CLI already installed, skipping." +else + if ask_yes_no "Install GitHub CLI (gh) and log in?"; then + if (sudo mkdir -p -m 755 /etc/apt/keyrings \ + && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null \ + && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list >/dev/null \ + && sudo apt-get update -qq && sudo apt-get install -y gh); then + gh auth login || echo "Install succeeded but login didn't complete. Retry any time with: gh auth login" + else + echo "GitHub CLI install failed. Retry later with: gh auth login (once gh is installed)" + fi + fi +fi + +# --- Gitea CLI (tea) --- +if command -v tea >/dev/null 2>&1; then + echo "Gitea CLI already installed, skipping." +else + if ask_yes_no "Install Gitea CLI (tea) and log in?"; then + TEA_ARCH="$(uname -m)" + case "$TEA_ARCH" in + x86_64) TEA_ARCH="amd64" ;; + aarch64) TEA_ARCH="arm64" ;; + esac + TEA_VERSION="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/tea/releases/latest | grep -o '"tag_name":[^,]*' | grep -o 'v[0-9][^"]*')" + mkdir -p "$HOME/.local/bin" + if [ -n "$TEA_VERSION" ] \ + && curl -fsSL "https://gitea.com/gitea/tea/releases/download/${TEA_VERSION}/tea-${TEA_VERSION#v}-linux-${TEA_ARCH}" -o "$HOME/.local/bin/tea" \ + && chmod +x "$HOME/.local/bin/tea"; then + echo "Add this Gitea instance now (e.g. https://git.octoturge.com)..." + tea login add || echo "Login didn't complete. Retry any time with: tea login add" + else + echo "Gitea CLI install failed. Retry later from: https://gitea.com/gitea/tea/releases" + rm -f "$HOME/.local/bin/tea" + fi + fi +fi + echo "" if ask_yes_no "Mark setup wizard as complete so it stops asking on new terminals?"; then touch "$WIZARD_DONE_FILE" diff --git a/templates/default/main.tf b/templates/default/main.tf index fff0329..53fd340 100644 --- a/templates/default/main.tf +++ b/templates/default/main.tf @@ -141,17 +141,6 @@ module "code-server" { order = 1 } -# See https://registry.coder.com/modules/coder/jetbrains -module "jetbrains" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/jetbrains/coder" - version = "~> 1.1" - agent_id = coder_agent.main.id - agent_name = "main" - folder = "/home/coder" - tooltip = "You need to [install JetBrains Toolbox](https://coder.com/docs/user-guides/workspace-access/jetbrains/toolbox) to use this app." -} - resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes. diff --git a/templates/python/cli-setup-wizard.sh b/templates/python/cli-setup-wizard.sh index 20fc6ef..14aca7e 100644 --- a/templates/python/cli-setup-wizard.sh +++ b/templates/python/cli-setup-wizard.sh @@ -96,6 +96,47 @@ else echo "Skipping Claude Code CLI: bun not found on this workspace image." fi +# --- GitHub CLI (gh) --- +if command -v gh >/dev/null 2>&1; then + echo "GitHub CLI already installed, skipping." +else + if ask_yes_no "Install GitHub CLI (gh) and log in?"; then + if (sudo mkdir -p -m 755 /etc/apt/keyrings \ + && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null \ + && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list >/dev/null \ + && sudo apt-get update -qq && sudo apt-get install -y gh); then + gh auth login || echo "Install succeeded but login didn't complete. Retry any time with: gh auth login" + else + echo "GitHub CLI install failed. Retry later with: gh auth login (once gh is installed)" + fi + fi +fi + +# --- Gitea CLI (tea) --- +if command -v tea >/dev/null 2>&1; then + echo "Gitea CLI already installed, skipping." +else + if ask_yes_no "Install Gitea CLI (tea) and log in?"; then + TEA_ARCH="$(uname -m)" + case "$TEA_ARCH" in + x86_64) TEA_ARCH="amd64" ;; + aarch64) TEA_ARCH="arm64" ;; + esac + TEA_VERSION="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/tea/releases/latest | grep -o '"tag_name":[^,]*' | grep -o 'v[0-9][^"]*')" + mkdir -p "$HOME/.local/bin" + if [ -n "$TEA_VERSION" ] \ + && curl -fsSL "https://gitea.com/gitea/tea/releases/download/${TEA_VERSION}/tea-${TEA_VERSION#v}-linux-${TEA_ARCH}" -o "$HOME/.local/bin/tea" \ + && chmod +x "$HOME/.local/bin/tea"; then + echo "Add this Gitea instance now (e.g. https://git.octoturge.com)..." + tea login add || echo "Login didn't complete. Retry any time with: tea login add" + else + echo "Gitea CLI install failed. Retry later from: https://gitea.com/gitea/tea/releases" + rm -f "$HOME/.local/bin/tea" + fi + fi +fi + echo "" if ask_yes_no "Mark setup wizard as complete so it stops asking on new terminals?"; then touch "$WIZARD_DONE_FILE" diff --git a/templates/python/main.tf b/templates/python/main.tf index 7b2e302..46873ac 100644 --- a/templates/python/main.tf +++ b/templates/python/main.tf @@ -141,17 +141,6 @@ module "code-server" { order = 1 } -# See https://registry.coder.com/modules/coder/jetbrains -module "jetbrains" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/jetbrains/coder" - version = "~> 1.1" - agent_id = coder_agent.main.id - agent_name = "main" - folder = "/home/coder" - tooltip = "You need to [install JetBrains Toolbox](https://coder.com/docs/user-guides/workspace-access/jetbrains/toolbox) to use this app." -} - resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes. diff --git a/templates/ttrpg/cli-setup-wizard.sh b/templates/ttrpg/cli-setup-wizard.sh index 20fc6ef..14aca7e 100644 --- a/templates/ttrpg/cli-setup-wizard.sh +++ b/templates/ttrpg/cli-setup-wizard.sh @@ -96,6 +96,47 @@ else echo "Skipping Claude Code CLI: bun not found on this workspace image." fi +# --- GitHub CLI (gh) --- +if command -v gh >/dev/null 2>&1; then + echo "GitHub CLI already installed, skipping." +else + if ask_yes_no "Install GitHub CLI (gh) and log in?"; then + if (sudo mkdir -p -m 755 /etc/apt/keyrings \ + && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null \ + && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list >/dev/null \ + && sudo apt-get update -qq && sudo apt-get install -y gh); then + gh auth login || echo "Install succeeded but login didn't complete. Retry any time with: gh auth login" + else + echo "GitHub CLI install failed. Retry later with: gh auth login (once gh is installed)" + fi + fi +fi + +# --- Gitea CLI (tea) --- +if command -v tea >/dev/null 2>&1; then + echo "Gitea CLI already installed, skipping." +else + if ask_yes_no "Install Gitea CLI (tea) and log in?"; then + TEA_ARCH="$(uname -m)" + case "$TEA_ARCH" in + x86_64) TEA_ARCH="amd64" ;; + aarch64) TEA_ARCH="arm64" ;; + esac + TEA_VERSION="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/tea/releases/latest | grep -o '"tag_name":[^,]*' | grep -o 'v[0-9][^"]*')" + mkdir -p "$HOME/.local/bin" + if [ -n "$TEA_VERSION" ] \ + && curl -fsSL "https://gitea.com/gitea/tea/releases/download/${TEA_VERSION}/tea-${TEA_VERSION#v}-linux-${TEA_ARCH}" -o "$HOME/.local/bin/tea" \ + && chmod +x "$HOME/.local/bin/tea"; then + echo "Add this Gitea instance now (e.g. https://git.octoturge.com)..." + tea login add || echo "Login didn't complete. Retry any time with: tea login add" + else + echo "Gitea CLI install failed. Retry later from: https://gitea.com/gitea/tea/releases" + rm -f "$HOME/.local/bin/tea" + fi + fi +fi + echo "" if ask_yes_no "Mark setup wizard as complete so it stops asking on new terminals?"; then touch "$WIZARD_DONE_FILE" diff --git a/templates/ttrpg/main.tf b/templates/ttrpg/main.tf index 7fe16e5..81e66f6 100644 --- a/templates/ttrpg/main.tf +++ b/templates/ttrpg/main.tf @@ -141,17 +141,6 @@ module "code-server" { order = 1 } -# See https://registry.coder.com/modules/coder/jetbrains -module "jetbrains" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/jetbrains/coder" - version = "~> 1.1" - agent_id = coder_agent.main.id - agent_name = "main" - folder = "/home/coder" - tooltip = "You need to [install JetBrains Toolbox](https://coder.com/docs/user-guides/workspace-access/jetbrains/toolbox) to use this app." -} - resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes. diff --git a/templates/web/cli-setup-wizard.sh b/templates/web/cli-setup-wizard.sh index 20fc6ef..14aca7e 100644 --- a/templates/web/cli-setup-wizard.sh +++ b/templates/web/cli-setup-wizard.sh @@ -96,6 +96,47 @@ else echo "Skipping Claude Code CLI: bun not found on this workspace image." fi +# --- GitHub CLI (gh) --- +if command -v gh >/dev/null 2>&1; then + echo "GitHub CLI already installed, skipping." +else + if ask_yes_no "Install GitHub CLI (gh) and log in?"; then + if (sudo mkdir -p -m 755 /etc/apt/keyrings \ + && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null \ + && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list >/dev/null \ + && sudo apt-get update -qq && sudo apt-get install -y gh); then + gh auth login || echo "Install succeeded but login didn't complete. Retry any time with: gh auth login" + else + echo "GitHub CLI install failed. Retry later with: gh auth login (once gh is installed)" + fi + fi +fi + +# --- Gitea CLI (tea) --- +if command -v tea >/dev/null 2>&1; then + echo "Gitea CLI already installed, skipping." +else + if ask_yes_no "Install Gitea CLI (tea) and log in?"; then + TEA_ARCH="$(uname -m)" + case "$TEA_ARCH" in + x86_64) TEA_ARCH="amd64" ;; + aarch64) TEA_ARCH="arm64" ;; + esac + TEA_VERSION="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/tea/releases/latest | grep -o '"tag_name":[^,]*' | grep -o 'v[0-9][^"]*')" + mkdir -p "$HOME/.local/bin" + if [ -n "$TEA_VERSION" ] \ + && curl -fsSL "https://gitea.com/gitea/tea/releases/download/${TEA_VERSION}/tea-${TEA_VERSION#v}-linux-${TEA_ARCH}" -o "$HOME/.local/bin/tea" \ + && chmod +x "$HOME/.local/bin/tea"; then + echo "Add this Gitea instance now (e.g. https://git.octoturge.com)..." + tea login add || echo "Login didn't complete. Retry any time with: tea login add" + else + echo "Gitea CLI install failed. Retry later from: https://gitea.com/gitea/tea/releases" + rm -f "$HOME/.local/bin/tea" + fi + fi +fi + echo "" if ask_yes_no "Mark setup wizard as complete so it stops asking on new terminals?"; then touch "$WIZARD_DONE_FILE" diff --git a/templates/web/main.tf b/templates/web/main.tf index ccf4447..2ad995b 100644 --- a/templates/web/main.tf +++ b/templates/web/main.tf @@ -148,17 +148,6 @@ module "code-server" { order = 1 } -# See https://registry.coder.com/modules/coder/jetbrains -module "jetbrains" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/coder/jetbrains/coder" - version = "~> 1.1" - agent_id = coder_agent.main.id - agent_name = "main" - folder = "/home/coder" - tooltip = "You need to [install JetBrains Toolbox](https://coder.com/docs/user-guides/workspace-access/jetbrains/toolbox) to use this app." -} - resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes.