mirror of
https://github.com/coder/coder.git
synced 2026-09-22 05:05:20 +08:00
feat(coderd/templatebuilder): author initial module catalog for 19 modules (#26194)
> [!NOTE] > This PR was authored by Coder Agents on behalf of @jeremyruppel. Runs the `scripts/modulegen` generator against the coder/registry to produce the initial module catalog for the template builder. Generates `module.json` and `.tf.tmpl` files for 19 modules across four categories: - **IDE**: code-server, jetbrains, vscode-desktop, vscode-web, cursor, windsurf, zed, kiro - **AI Agent**: claude-code, aider, goose, amazon-q - **Source Control**: git-clone, git-config, git-commit-signing - **Utility**: dotfiles, personalize, filebrowser, jupyterlab Also updates `catalog_test.go` to validate the new embedded modules load correctly.
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
|
||||
variable "api_key" {
|
||||
description = "API key for the selected AI provider. This will be set as the appropriate environment variable based on the provider."
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
module "aider" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/aider/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
agentapi_version = {{ .Variables.agentapi_version }}
|
||||
ai_prompt = {{ .Variables.ai_prompt }}
|
||||
ai_provider = {{ .Variables.ai_provider }}
|
||||
api_key = var.api_key
|
||||
base_aider_config = {{ .Variables.base_aider_config }}
|
||||
cli_app = {{ .Variables.cli_app }}
|
||||
cli_app_display_name = {{ .Variables.cli_app_display_name }}
|
||||
custom_env_var_name = {{ .Variables.custom_env_var_name }}
|
||||
experiment_additional_extensions = {{ .Variables.experiment_additional_extensions }}
|
||||
icon = {{ .Variables.icon }}
|
||||
install_agentapi = {{ .Variables.install_agentapi }}
|
||||
install_aider = {{ .Variables.install_aider }}
|
||||
model = {{ .Variables.model }}
|
||||
post_install_script = {{ .Variables.post_install_script }}
|
||||
pre_install_script = {{ .Variables.pre_install_script }}
|
||||
report_tasks = {{ .Variables.report_tasks }}
|
||||
system_prompt = {{ .Variables.system_prompt }}
|
||||
web_app_display_name = {{ .Variables.web_app_display_name }}
|
||||
workdir = {{ .Variables.workdir }}
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
{
|
||||
"id": "aider",
|
||||
"display_name": "Aider",
|
||||
"description": "Run Aider AI pair programming in your workspace",
|
||||
"icon": "/icon/aider.svg",
|
||||
"category": "AI Agent",
|
||||
"tags": [
|
||||
"agent",
|
||||
"ai",
|
||||
"aider"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "2.0.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "agentapi_version",
|
||||
"type": "string",
|
||||
"description": "The version of AgentAPI to install.",
|
||||
"default": "v0.10.0",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "ai_prompt",
|
||||
"type": "string",
|
||||
"description": "Initial task prompt for Aider.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "ai_provider",
|
||||
"type": "string",
|
||||
"description": "AI provider to use with Aider (openai, anthropic, azure, google, etc.)",
|
||||
"default": "google",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "api_key",
|
||||
"type": "string",
|
||||
"description": "API key for the selected AI provider. This will be set as the appropriate environment variable based on the provider.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "base_aider_config",
|
||||
"type": "string",
|
||||
"description": "Base Aider configuration in yaml format. Will be stored in .aider.conf.yml file.\n \noptions include:\nread:\n - CONVENTIONS.md\n - anotherfile.txt\n - thirdfile.py\nmodel: xxx\n##Specify the OpenAI API key\nopenai-api-key: xxx\n## (deprecated, use --set-env OPENAI_API_TYPE=\u003cvalue\u003e)\nopenai-api-type: xxx\n## (deprecated, use --set-env OPENAI_API_VERSION=\u003cvalue\u003e)\nopenai-api-version: xxx\n## (deprecated, use --set-env OPENAI_API_DEPLOYMENT_ID=\u003cvalue\u003e)\nopenai-api-deployment-id: xxx\n## Set an environment variable (to control API settings, can be used multiple times)\nset-env: xxx\n## Specify multiple values like this:\nset-env:\n - xxx\n - yyy\n - zzz\n\nReference : https://aider.chat/docs/config/aider_conf.html\n",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "cli_app",
|
||||
"type": "bool",
|
||||
"description": "Whether to create a CLI app for Aider",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "cli_app_display_name",
|
||||
"type": "string",
|
||||
"description": "Display name for the CLI app",
|
||||
"default": "Aider CLI",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "custom_env_var_name",
|
||||
"type": "string",
|
||||
"description": "Custom environment variable name when using custom provider",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "experiment_additional_extensions",
|
||||
"type": "string",
|
||||
"description": "Additional extensions configuration in YAML format to append to the config.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "icon",
|
||||
"type": "string",
|
||||
"description": "The icon to use for the app.",
|
||||
"default": "/icon/aider.svg",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_agentapi",
|
||||
"type": "bool",
|
||||
"description": "Whether to install AgentAPI.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_aider",
|
||||
"type": "bool",
|
||||
"description": "Whether to install Aider.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "model",
|
||||
"type": "string",
|
||||
"description": "AI model to use with Aider. Can use Aider's built-in aliases like '4o' (gpt-4o), 'sonnet' (claude-3-7-sonnet), 'opus' (claude-3-opus), etc.",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "post_install_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run after installing Aider.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "pre_install_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run before installing Aider.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "report_tasks",
|
||||
"type": "bool",
|
||||
"description": "Whether to enable task reporting to Coder UI via AgentAPI",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "system_prompt",
|
||||
"type": "string",
|
||||
"description": "System prompt for instructing Aider on task reporting and behavior",
|
||||
"default": "You are a helpful coding assistant that helps developers write, debug, and understand code. Provide clear explanations, follow best practices, and help solve coding problems efficiently.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "web_app_display_name",
|
||||
"type": "string",
|
||||
"description": "Display name for the web app",
|
||||
"default": "Aider",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "workdir",
|
||||
"type": "string",
|
||||
"description": "The folder to run Aider in.",
|
||||
"default": "/home/coder",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
|
||||
variable "auth_tarball" {
|
||||
description = "Base64 encoded, zstd compressed tarball of a pre-authenticated ~/.local/share/amazon-q directory."
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
module "amazon-q" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/amazon-q/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
agent_config = {{ .Variables.agent_config }}
|
||||
agentapi_chat_based_path = {{ .Variables.agentapi_chat_based_path }}
|
||||
agentapi_version = {{ .Variables.agentapi_version }}
|
||||
ai_prompt = {{ .Variables.ai_prompt }}
|
||||
amazon_q_version = {{ .Variables.amazon_q_version }}
|
||||
auth_tarball = var.auth_tarball
|
||||
cli_app = {{ .Variables.cli_app }}
|
||||
cli_app_display_name = {{ .Variables.cli_app_display_name }}
|
||||
coder_mcp_instructions = {{ .Variables.coder_mcp_instructions }}
|
||||
icon = {{ .Variables.icon }}
|
||||
install_agentapi = {{ .Variables.install_agentapi }}
|
||||
install_amazon_q = {{ .Variables.install_amazon_q }}
|
||||
post_install_script = {{ .Variables.post_install_script }}
|
||||
pre_install_script = {{ .Variables.pre_install_script }}
|
||||
q_install_url = {{ .Variables.q_install_url }}
|
||||
report_tasks = {{ .Variables.report_tasks }}
|
||||
system_prompt = {{ .Variables.system_prompt }}
|
||||
trust_all_tools = {{ .Variables.trust_all_tools }}
|
||||
web_app_display_name = {{ .Variables.web_app_display_name }}
|
||||
workdir = {{ .Variables.workdir }}
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
{
|
||||
"id": "amazon-q",
|
||||
"display_name": "Amazon Q",
|
||||
"description": "Run Amazon Q in your workspace to access Amazon's AI coding assistant with MCP integration and task reporting.",
|
||||
"icon": "/icon/amazon-q.svg",
|
||||
"category": "AI Agent",
|
||||
"tags": [
|
||||
"agent",
|
||||
"ai",
|
||||
"aws",
|
||||
"amazon-q",
|
||||
"tasks"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "3.0.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_config",
|
||||
"type": "string",
|
||||
"description": "Optional Agent configuration JSON for Amazon Q.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "agentapi_chat_based_path",
|
||||
"type": "bool",
|
||||
"description": "Whether to use chat-based path for AgentAPI.Required if CODER_WILDCARD_ACCESS_URL is not defined in coder deployment",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "agentapi_version",
|
||||
"type": "string",
|
||||
"description": "The version of AgentAPI to install.",
|
||||
"default": "v0.10.0",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "ai_prompt",
|
||||
"type": "string",
|
||||
"description": "The initial task prompt to send to Amazon Q.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "amazon_q_version",
|
||||
"type": "string",
|
||||
"description": "The version of Amazon Q to install.",
|
||||
"default": "1.14.1",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "auth_tarball",
|
||||
"type": "string",
|
||||
"description": "Base64 encoded, zstd compressed tarball of a pre-authenticated ~/.local/share/amazon-q directory.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "cli_app",
|
||||
"type": "bool",
|
||||
"description": "Whether to create a CLI app for Amazon Q",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "cli_app_display_name",
|
||||
"type": "string",
|
||||
"description": "Display name for the CLI app",
|
||||
"default": "AmazonQ CLI",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "coder_mcp_instructions",
|
||||
"type": "string",
|
||||
"description": "Instructions for the Coder MCP server integration. This defines how the agent should report tasks to Coder.",
|
||||
"default": "YOU MUST REPORT ALL TASKS TO CODER.\nWhen reporting tasks you MUST follow these EXACT instructions:\n- IMMEDIATELY report status after receiving ANY user message\n- Be granular If you are investigating with multiple steps report each step to coder.\n\nTask state MUST be one of the following:\n- Use \"state\": \"working\" when actively processing WITHOUT needing additional user input\n- Use \"state\": \"complete\" only when finished with a task\n- Use \"state\": \"failure\" when you need ANY user input lack sufficient details or encounter blockers.\n\nTask summaries MUST:\n- Include specifics about what you're doing\n- Include clear and actionable steps for the user\n- Be less than 160 characters in length\n",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "icon",
|
||||
"type": "string",
|
||||
"description": "The icon to use for the app.",
|
||||
"default": "/icon/amazon-q.svg",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_agentapi",
|
||||
"type": "bool",
|
||||
"description": "Whether to install AgentAPI.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_amazon_q",
|
||||
"type": "bool",
|
||||
"description": "Whether to install Amazon Q.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "post_install_script",
|
||||
"type": "string",
|
||||
"description": "Optional script to run after installing Amazon Q.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "pre_install_script",
|
||||
"type": "string",
|
||||
"description": "Optional script to run before installing Amazon Q.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "q_install_url",
|
||||
"type": "string",
|
||||
"description": "Base URL for Amazon Q installation downloads.",
|
||||
"default": "https://desktop-release.q.us-east-1.amazonaws.com",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "report_tasks",
|
||||
"type": "bool",
|
||||
"description": "Whether to enable task reporting to Coder UI via AgentAPI",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "system_prompt",
|
||||
"type": "string",
|
||||
"description": "The system prompt to use for Amazon Q. This should instruct the agent how to do task reporting.",
|
||||
"default": "You are a helpful Coding assistant. Aim to autonomously investigate\nand solve issues the user gives you and test your work, whenever possible.\nAvoid shortcuts like mocking tests. When you get stuck, you can ask the user\nbut opt for autonomy.\n",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "trust_all_tools",
|
||||
"type": "bool",
|
||||
"description": "Whether to trust all tools in Amazon Q.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "web_app_display_name",
|
||||
"type": "string",
|
||||
"description": "Display name for the web app",
|
||||
"default": "AmazonQ",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "workdir",
|
||||
"type": "string",
|
||||
"description": "The folder to run Amazon Q in.",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
|
||||
variable "claude_code_oauth_token" {
|
||||
description = "OAuth token passed to Claude Code via the CLAUDE_CODE_OAUTH_TOKEN env var. Generate one with `claude setup-token`."
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
module "claude-code" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/claude-code/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
anthropic_api_key = {{ .Variables.anthropic_api_key }}
|
||||
claude_binary_path = {{ .Variables.claude_binary_path }}
|
||||
claude_code_oauth_token = var.claude_code_oauth_token
|
||||
claude_code_version = {{ .Variables.claude_code_version }}
|
||||
disable_autoupdater = {{ .Variables.disable_autoupdater }}
|
||||
enable_ai_gateway = {{ .Variables.enable_ai_gateway }}
|
||||
icon = {{ .Variables.icon }}
|
||||
install_claude_code = {{ .Variables.install_claude_code }}
|
||||
mcp = {{ .Variables.mcp }}
|
||||
model = {{ .Variables.model }}
|
||||
post_install_script = {{ .Variables.post_install_script }}
|
||||
pre_install_script = {{ .Variables.pre_install_script }}
|
||||
workdir = {{ .Variables.workdir }}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
{
|
||||
"id": "claude-code",
|
||||
"display_name": "Claude Code",
|
||||
"description": "Install and configure the Claude Code CLI in your workspace.",
|
||||
"icon": "/icon/claude.svg",
|
||||
"category": "AI Agent",
|
||||
"tags": [
|
||||
"agent",
|
||||
"claude-code",
|
||||
"ai",
|
||||
"anthropic",
|
||||
"ai-gateway"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "5.2.0",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "anthropic_api_key",
|
||||
"type": "string",
|
||||
"description": "API key passed to Claude Code via the ANTHROPIC_API_KEY env var.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "claude_binary_path",
|
||||
"type": "string",
|
||||
"description": "Directory where the Claude Code binary is located. Use this if Claude is pre-installed or installed outside the module to a non-default location.",
|
||||
"default": "$HOME/.local/bin",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "claude_code_oauth_token",
|
||||
"type": "string",
|
||||
"description": "OAuth token passed to Claude Code via the CLAUDE_CODE_OAUTH_TOKEN env var. Generate one with `claude setup-token`.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": true,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "claude_code_version",
|
||||
"type": "string",
|
||||
"description": "The version of Claude Code to install.",
|
||||
"default": "latest",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "disable_autoupdater",
|
||||
"type": "bool",
|
||||
"description": "Disable Claude Code automatic updates. When true, Claude Code will stay on the installed version.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "enable_ai_gateway",
|
||||
"type": "bool",
|
||||
"description": "Use AI Gateway for Claude Code. https://coder.com/docs/ai-coder/ai-gateway",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "icon",
|
||||
"type": "string",
|
||||
"description": "The icon to use for the app.",
|
||||
"default": "/icon/claude.svg",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_claude_code",
|
||||
"type": "bool",
|
||||
"description": "Whether to install Claude Code.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "mcp",
|
||||
"type": "string",
|
||||
"description": "JSON-encoded string of MCP server configurations. When set, servers are added at Claude Code's user scope so they are available across every project the workspace owner opens.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "model",
|
||||
"type": "string",
|
||||
"description": "Sets the default model for Claude Code via ANTHROPIC_MODEL env var. If empty, Claude Code uses its default. Supports aliases (sonnet, opus) or full model names.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "post_install_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run after installing Claude Code.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "pre_install_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run before installing Claude Code. Can be used for dependency ordering between modules (e.g., waiting for git-clone to complete before Claude Code initialization).",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "workdir",
|
||||
"type": "string",
|
||||
"description": "Optional project directory. When set, the module pre-creates it if missing and pre-accepts the Claude Code trust/onboarding prompt for it in ~/.claude.json.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
module "code-server" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/code-server/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
additional_args = {{ .Variables.additional_args }}
|
||||
auto_install_extensions = {{ .Variables.auto_install_extensions }}
|
||||
extensions_dir = {{ .Variables.extensions_dir }}
|
||||
folder = {{ .Variables.folder }}
|
||||
install_version = {{ .Variables.install_version }}
|
||||
offline = {{ .Variables.offline }}
|
||||
open_in = {{ .Variables.open_in }}
|
||||
port = {{ .Variables.port }}
|
||||
use_cached = {{ .Variables.use_cached }}
|
||||
use_cached_extensions = {{ .Variables.use_cached_extensions }}
|
||||
workspace = {{ .Variables.workspace }}
|
||||
}
|
||||
@@ -4,27 +4,125 @@
|
||||
"description": "VS Code in the browser",
|
||||
"icon": "/icon/code.svg",
|
||||
"category": "IDE",
|
||||
"tags": ["ide", "web"],
|
||||
"compatible_os": ["linux"],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.2.3",
|
||||
"tags": [
|
||||
"ide",
|
||||
"web",
|
||||
"code-server"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [
|
||||
"vscode-web"
|
||||
],
|
||||
"pinned_version": "1.5.0",
|
||||
"variables": [
|
||||
{
|
||||
"name": "additional_args",
|
||||
"type": "string",
|
||||
"description": "Additional command-line arguments to pass to code-server (e.g., '--disable-workspace-trust').",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of the Coder agent. Injected automatically by the builder.",
|
||||
"required": true,
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "auto_install_extensions",
|
||||
"type": "bool",
|
||||
"description": "Automatically install recommended extensions when code-server starts.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "extensions_dir",
|
||||
"type": "string",
|
||||
"description": "Override the directory to store extensions in.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to open in code-server.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_version",
|
||||
"type": "string",
|
||||
"description": "The version of code-server to install.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "offline",
|
||||
"type": "bool",
|
||||
"description": "Just run code-server in the background, don't fetch it from GitHub",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "open_in",
|
||||
"type": "string",
|
||||
"description": "Determines where the app will be opened. Valid values are `\"tab\"` and `\"slim-window\" (default)`.\n`\"tab\"` opens in a new tab in the same browser window.\n`\"slim-window\"` opens a new browser window without navigation controls.\n",
|
||||
"default": "slim-window",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "number",
|
||||
"description": "Port to run code-server on",
|
||||
"description": "The port to run code-server on.",
|
||||
"default": 13337,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "use_cached",
|
||||
"type": "bool",
|
||||
"description": "Uses cached copy code-server in the background, otherwise fetched it from GitHub",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "use_cached_extensions",
|
||||
"type": "bool",
|
||||
"description": "Uses cached copy of extensions, otherwise do a forced upgrade",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "workspace",
|
||||
"type": "string",
|
||||
"description": "The path to a `.code-workspace` file to open in code-server. Mutually exclusive with `folder`.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
module "cursor" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/cursor/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
folder = {{ .Variables.folder }}
|
||||
mcp = {{ .Variables.mcp }}
|
||||
open_recent = {{ .Variables.open_recent }}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"id": "cursor",
|
||||
"display_name": "Cursor IDE",
|
||||
"description": "Add a one-click button to launch Cursor IDE",
|
||||
"icon": "/icon/cursor.svg",
|
||||
"category": "IDE",
|
||||
"tags": [
|
||||
"ide",
|
||||
"cursor",
|
||||
"ai"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.4.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to open in Cursor IDE.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "mcp",
|
||||
"type": "string",
|
||||
"description": "JSON-encoded string to configure MCP servers for Cursor. When set, writes ~/.cursor/mcp.json.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "open_recent",
|
||||
"type": "bool",
|
||||
"description": "Open the most recent workspace or folder. Falls back to the folder if there is no recent workspace or folder to open.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
module "dotfiles" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/dotfiles/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
default_dotfiles_branch = {{ .Variables.default_dotfiles_branch }}
|
||||
default_dotfiles_uri = {{ .Variables.default_dotfiles_uri }}
|
||||
description = {{ .Variables.description }}
|
||||
dotfiles_branch = {{ .Variables.dotfiles_branch }}
|
||||
dotfiles_uri = {{ .Variables.dotfiles_uri }}
|
||||
manual_update = {{ .Variables.manual_update }}
|
||||
post_clone_script = {{ .Variables.post_clone_script }}
|
||||
user = {{ .Variables.user }}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"id": "dotfiles",
|
||||
"display_name": "Dotfiles",
|
||||
"description": "Allow developers to optionally bring their own dotfiles repository to customize their shell and IDE settings!",
|
||||
"icon": "/icon/dotfiles.svg",
|
||||
"category": "Utility",
|
||||
"tags": [
|
||||
"helper",
|
||||
"dotfiles"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.4.2",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "default_dotfiles_branch",
|
||||
"type": "string",
|
||||
"description": "The default dotfiles branch if the workspace user does not provide one",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "default_dotfiles_uri",
|
||||
"type": "string",
|
||||
"description": "The default dotfiles URI if the workspace user does not provide one",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "description",
|
||||
"type": "string",
|
||||
"description": "A custom description for the dotfiles parameter. This is shown in the UI - and allows you to customize the instructions you give to your users.",
|
||||
"default": "Enter a URL for a [dotfiles repository](https://dotfiles.github.io) to personalize your workspace. Use an SSH URL (e.g. `git@host:user/repo`) if your Git provider restricts HTTPS cloning.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "dotfiles_branch",
|
||||
"type": "string",
|
||||
"description": "The branch to use for the dotfiles repository (optional, when set, the user isn't prompted for the branch)",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "dotfiles_uri",
|
||||
"type": "string",
|
||||
"description": "The URL to a dotfiles repository. (optional, when set, the user isn't prompted for their dotfiles)",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "manual_update",
|
||||
"type": "bool",
|
||||
"description": "If true, this adds a button to workspace page to refresh dotfiles on demand.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "post_clone_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run after applying dotfiles. Runs every time, even if dotfiles were already applied.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "user",
|
||||
"type": "string",
|
||||
"description": "The name of the user to apply the dotfiles to. (optional, applies to the current user by default)",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
module "filebrowser" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/filebrowser/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
agent_name = {{ .Variables.agent_name }}
|
||||
database_path = {{ .Variables.database_path }}
|
||||
folder = {{ .Variables.folder }}
|
||||
port = {{ .Variables.port }}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"id": "filebrowser",
|
||||
"display_name": "File Browser",
|
||||
"description": "A file browser for your workspace",
|
||||
"icon": "/icon/filebrowser.svg",
|
||||
"category": "Utility",
|
||||
"tags": [
|
||||
"filebrowser",
|
||||
"web"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.1.5",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "agent_name",
|
||||
"type": "string",
|
||||
"description": "The name of the coder_agent resource. Required when `subdomain` is `false` so the path-based base URL matches the URL Coder serves.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "database_path",
|
||||
"type": "string",
|
||||
"description": "The path to the filebrowser database.",
|
||||
"default": "filebrowser.db",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "--root value for filebrowser.",
|
||||
"default": "~",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "number",
|
||||
"description": "The port to run filebrowser on.",
|
||||
"default": 13339,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
module "git-clone" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/git-clone/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
base_dir = {{ .Variables.base_dir }}
|
||||
branch_name = {{ .Variables.branch_name }}
|
||||
folder_name = {{ .Variables.folder_name }}
|
||||
post_clone_script = {{ .Variables.post_clone_script }}
|
||||
pre_clone_script = {{ .Variables.pre_clone_script }}
|
||||
url = {{ .Variables.url }}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"id": "git-clone",
|
||||
"display_name": "Git Clone",
|
||||
"description": "Clone a Git repository by URL and skip if it exists.",
|
||||
"icon": "/icon/git.svg",
|
||||
"category": "Source Control",
|
||||
"tags": [
|
||||
"git",
|
||||
"helper"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "2.0.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "base_dir",
|
||||
"type": "string",
|
||||
"description": "The base directory to clone the repository. Defaults to \"$HOME\".",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "branch_name",
|
||||
"type": "string",
|
||||
"description": "The branch name to clone. If not provided, the default branch will be cloned.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "folder_name",
|
||||
"type": "string",
|
||||
"description": "The destination folder to clone the repository into.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "post_clone_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run after cloning the repository. Runs always after git clone, even if the repository already exists.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "pre_clone_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run before cloning the repository. Runs before git clone, even if the repository already exists.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "url",
|
||||
"type": "string",
|
||||
"description": "The URL of the Git repository.",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
module "git-commit-signing" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/git-commit-signing/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"id": "git-commit-signing",
|
||||
"display_name": "Git commit signing",
|
||||
"description": "Configures Git to sign commits using your Coder SSH key",
|
||||
"icon": "/icon/git.svg",
|
||||
"category": "Source Control",
|
||||
"tags": [
|
||||
"helper",
|
||||
"git"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.0.32",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
module "git-config" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/git-config/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
allow_email_change = {{ .Variables.allow_email_change }}
|
||||
allow_username_change = {{ .Variables.allow_username_change }}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "git-config",
|
||||
"display_name": "Git Config",
|
||||
"description": "Stores Git configuration from Coder credentials",
|
||||
"icon": "/icon/git.svg",
|
||||
"category": "Source Control",
|
||||
"tags": [
|
||||
"helper",
|
||||
"git"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.0.33",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "allow_email_change",
|
||||
"type": "bool",
|
||||
"description": "Allow developers to change their git email.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "allow_username_change",
|
||||
"type": "bool",
|
||||
"description": "Allow developers to change their git username.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
module "goose" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/goose/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
additional_extensions = {{ .Variables.additional_extensions }}
|
||||
agentapi_version = {{ .Variables.agentapi_version }}
|
||||
folder = {{ .Variables.folder }}
|
||||
goose_model = {{ .Variables.goose_model }}
|
||||
goose_provider = {{ .Variables.goose_provider }}
|
||||
goose_version = {{ .Variables.goose_version }}
|
||||
icon = {{ .Variables.icon }}
|
||||
install_agentapi = {{ .Variables.install_agentapi }}
|
||||
install_goose = {{ .Variables.install_goose }}
|
||||
post_install_script = {{ .Variables.post_install_script }}
|
||||
pre_install_script = {{ .Variables.pre_install_script }}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
{
|
||||
"id": "goose",
|
||||
"display_name": "Goose",
|
||||
"description": "Run Goose in your workspace",
|
||||
"icon": "/icon/goose.svg",
|
||||
"category": "AI Agent",
|
||||
"tags": [
|
||||
"agent",
|
||||
"goose",
|
||||
"ai",
|
||||
"tasks"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "3.0.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "additional_extensions",
|
||||
"type": "string",
|
||||
"description": "Additional extensions configuration in YAML format to append to the config.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "agentapi_version",
|
||||
"type": "string",
|
||||
"description": "The version of AgentAPI to install.",
|
||||
"default": "v0.10.0",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to run Goose in.",
|
||||
"default": "/home/coder",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "goose_model",
|
||||
"type": "string",
|
||||
"description": "The model to use for Goose (e.g., claude-3-5-sonnet-latest).",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "goose_provider",
|
||||
"type": "string",
|
||||
"description": "The provider to use for Goose (e.g., anthropic).",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "goose_version",
|
||||
"type": "string",
|
||||
"description": "The version of Goose to install.",
|
||||
"default": "stable",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "icon",
|
||||
"type": "string",
|
||||
"description": "The icon to use for the app.",
|
||||
"default": "/icon/goose.svg",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_agentapi",
|
||||
"type": "bool",
|
||||
"description": "Whether to install AgentAPI.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "install_goose",
|
||||
"type": "bool",
|
||||
"description": "Whether to install Goose.",
|
||||
"default": true,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "post_install_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run after installing Goose.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "pre_install_script",
|
||||
"type": "string",
|
||||
"description": "Custom script to run before installing Goose.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
module "jetbrains" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/jetbrains/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
agent_name = {{ .Variables.agent_name }}
|
||||
channel = {{ .Variables.channel }}
|
||||
download_base_link = {{ .Variables.download_base_link }}
|
||||
folder = {{ .Variables.folder }}
|
||||
major_version = {{ .Variables.major_version }}
|
||||
releases_base_link = {{ .Variables.releases_base_link }}
|
||||
tooltip = {{ .Variables.tooltip }}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"id": "jetbrains",
|
||||
"display_name": "JetBrains Toolbox",
|
||||
"description": "Add JetBrains IDE integrations to your Coder workspaces with configurable options.",
|
||||
"icon": "/icon/jetbrains.svg",
|
||||
"category": "IDE",
|
||||
"tags": [
|
||||
"ide",
|
||||
"jetbrains",
|
||||
"parameter"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.4.0",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The resource ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "agent_name",
|
||||
"type": "string",
|
||||
"description": "The name of a Coder agent. Needed for workspaces with multiple agents.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "channel",
|
||||
"type": "string",
|
||||
"description": "JetBrains IDE release channel. Valid values are release and eap.",
|
||||
"default": "release",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "download_base_link",
|
||||
"type": "string",
|
||||
"description": "URL of the JetBrains download base link.",
|
||||
"default": "https://download.jetbrains.com",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The directory to open in the IDE. e.g. /home/coder/project",
|
||||
"required": true,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "major_version",
|
||||
"type": "string",
|
||||
"description": "The major version of the IDE. i.e. 2025.1",
|
||||
"default": "latest",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "releases_base_link",
|
||||
"type": "string",
|
||||
"description": "URL of the JetBrains releases base link.",
|
||||
"default": "https://data.services.jetbrains.com",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "tooltip",
|
||||
"type": "string",
|
||||
"description": "Markdown text that is displayed when hovering over workspace apps.",
|
||||
"default": "You need to install [JetBrains Toolbox App](https://www.jetbrains.com/toolbox-app/) to use this button.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
module "jupyterlab" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/jupyterlab/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
config = {{ .Variables.config }}
|
||||
port = {{ .Variables.port }}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"id": "jupyterlab",
|
||||
"display_name": "JupyterLab",
|
||||
"description": "A module that adds JupyterLab in your Coder template.",
|
||||
"icon": "/icon/jupyter.svg",
|
||||
"category": "Utility",
|
||||
"tags": [
|
||||
"jupyter",
|
||||
"ide",
|
||||
"web"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.2.2",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"type": "string",
|
||||
"description": "A JSON string of JupyterLab server configuration settings. When set, writes ~/.jupyter/jupyter_server_config.json.",
|
||||
"default": "{}",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "number",
|
||||
"description": "The port to run jupyterlab on.",
|
||||
"default": 19999,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
module "kiro" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/kiro/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
folder = {{ .Variables.folder }}
|
||||
mcp = {{ .Variables.mcp }}
|
||||
open_recent = {{ .Variables.open_recent }}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"id": "kiro",
|
||||
"display_name": "Kiro IDE",
|
||||
"description": "Add a one-click button to launch Kiro IDE",
|
||||
"icon": "/icon/kiro.svg",
|
||||
"category": "IDE",
|
||||
"tags": [
|
||||
"ide",
|
||||
"kiro",
|
||||
"ai",
|
||||
"aws"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.2.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to open in Kiro IDE.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "mcp",
|
||||
"type": "string",
|
||||
"description": "JSON-encoded string to configure MCP servers for Kiro. When set, writes ~/.kiro/settings/mcp.json.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "open_recent",
|
||||
"type": "bool",
|
||||
"description": "Open the most recent workspace or folder. Falls back to the folder if there is no recent workspace or folder to open.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"id": "personalize",
|
||||
"display_name": "Personalize",
|
||||
"description": "Allow developers to customize their workspace on start",
|
||||
"icon": "/icon/personalize.svg",
|
||||
"category": "Utility",
|
||||
"tags": [
|
||||
"helper",
|
||||
"personalize"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.0.32",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"type": "string",
|
||||
"description": "The path to a script that will be ran on start enabling a user to personalize their workspace.",
|
||||
"default": "~/personalize",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
module "personalize" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/personalize/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
path = {{ .Variables.path }}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"id": "vscode-desktop",
|
||||
"display_name": "VS Code Desktop",
|
||||
"description": "Add a one-click button to launch VS Code Desktop",
|
||||
"icon": "/icon/code.svg",
|
||||
"category": "IDE",
|
||||
"tags": [
|
||||
"ide",
|
||||
"vscode"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.2.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to open in VS Code.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "open_recent",
|
||||
"type": "bool",
|
||||
"description": "Open the most recent workspace or folder. Falls back to the folder if there is no recent workspace or folder to open.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
module "vscode-desktop" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/vscode-desktop/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
folder = {{ .Variables.folder }}
|
||||
open_recent = {{ .Variables.open_recent }}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"id": "vscode-web",
|
||||
"display_name": "VS Code Web",
|
||||
"description": "VS Code Web - Visual Studio Code in the browser",
|
||||
"icon": "/icon/code.svg",
|
||||
"category": "IDE",
|
||||
"tags": [
|
||||
"ide",
|
||||
"vscode",
|
||||
"web"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [
|
||||
"code-server"
|
||||
],
|
||||
"pinned_version": "1.5.0",
|
||||
"variables": [
|
||||
{
|
||||
"name": "accept_license",
|
||||
"type": "bool",
|
||||
"description": "Accept the VS Code Server license. https://code.visualstudio.com/license/server",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "auto_install_extensions",
|
||||
"type": "bool",
|
||||
"description": "Automatically install recommended extensions when VS Code Web starts.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "commit_id",
|
||||
"type": "string",
|
||||
"description": "Specify the commit ID of the VS Code Web binary to pin to a specific version. If left empty, the latest stable version is used.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "disable_trust",
|
||||
"type": "bool",
|
||||
"description": "Disables workspace trust protection for VS Code Web.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "extensions_dir",
|
||||
"type": "string",
|
||||
"description": "Override the directory to store extensions in.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to open in vscode-web.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "offline",
|
||||
"type": "bool",
|
||||
"description": "Just run VS Code Web in the background, don't fetch it from the internet.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "platform",
|
||||
"type": "string",
|
||||
"description": "The platform to use for the VS Code Web.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "port",
|
||||
"type": "number",
|
||||
"description": "The port to run VS Code Web on.",
|
||||
"default": 13338,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "telemetry_level",
|
||||
"type": "string",
|
||||
"description": "Set the telemetry level for VS Code Web.",
|
||||
"default": "error",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "use_cached",
|
||||
"type": "bool",
|
||||
"description": "Uses cached copy of VS Code Web in the background, otherwise fetches it from internet.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "workspace",
|
||||
"type": "string",
|
||||
"description": "Path to a .code-workspace file to open in vscode-web.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
module "vscode-web" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/vscode-web/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
accept_license = {{ .Variables.accept_license }}
|
||||
auto_install_extensions = {{ .Variables.auto_install_extensions }}
|
||||
commit_id = {{ .Variables.commit_id }}
|
||||
disable_trust = {{ .Variables.disable_trust }}
|
||||
extensions_dir = {{ .Variables.extensions_dir }}
|
||||
folder = {{ .Variables.folder }}
|
||||
offline = {{ .Variables.offline }}
|
||||
platform = {{ .Variables.platform }}
|
||||
port = {{ .Variables.port }}
|
||||
telemetry_level = {{ .Variables.telemetry_level }}
|
||||
use_cached = {{ .Variables.use_cached }}
|
||||
workspace = {{ .Variables.workspace }}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"id": "windsurf",
|
||||
"display_name": "Windsurf Editor",
|
||||
"description": "Add a one-click button to launch Windsurf Editor",
|
||||
"icon": "/icon/windsurf.svg",
|
||||
"category": "IDE",
|
||||
"tags": [
|
||||
"ide",
|
||||
"windsurf",
|
||||
"ai"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.3.1",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent.",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to open in Windsurf Editor.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "mcp",
|
||||
"type": "string",
|
||||
"description": "JSON-encoded string to configure MCP servers for Windsurf. When set, writes ~/.codeium/windsurf/mcp_config.json.",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "open_recent",
|
||||
"type": "bool",
|
||||
"description": "Open the most recent workspace or folder. Falls back to the folder if there is no recent workspace or folder to open.",
|
||||
"default": false,
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
module "windsurf" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/windsurf/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
folder = {{ .Variables.folder }}
|
||||
mcp = {{ .Variables.mcp }}
|
||||
open_recent = {{ .Variables.open_recent }}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"id": "zed",
|
||||
"display_name": "Zed",
|
||||
"description": "Add a one-click button to launch Zed",
|
||||
"icon": "/icon/zed.svg",
|
||||
"category": "IDE",
|
||||
"tags": [
|
||||
"ide",
|
||||
"zed",
|
||||
"editor"
|
||||
],
|
||||
"compatible_os": [
|
||||
"linux"
|
||||
],
|
||||
"conflicts_with": [],
|
||||
"pinned_version": "1.1.4",
|
||||
"variables": [
|
||||
{
|
||||
"name": "agent_id",
|
||||
"type": "string",
|
||||
"description": "The ID of a Coder agent",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": true
|
||||
},
|
||||
{
|
||||
"name": "agent_name",
|
||||
"type": "string",
|
||||
"description": "The name of the agent",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "folder",
|
||||
"type": "string",
|
||||
"description": "The folder to open in Zed",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
},
|
||||
{
|
||||
"name": "settings",
|
||||
"type": "string",
|
||||
"description": "JSON encoded settings.json",
|
||||
"default": "",
|
||||
"required": false,
|
||||
"sensitive": false,
|
||||
"computed": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
module "zed" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "{{ .RegistryBase }}/coder/zed/coder"
|
||||
version = "{{ .PinnedVersion }}"
|
||||
agent_id = coder_agent.{{ .AgentResourceName }}.id
|
||||
agent_name = {{ .Variables.agent_name }}
|
||||
folder = {{ .Variables.folder }}
|
||||
settings = {{ .Variables.settings }}
|
||||
}
|
||||
Reference in New Issue
Block a user