chore: resolve merge conflict with main, keeping all boundary tests

Merges origin/main into cat/claude-boundary-preconditions, preserving
all boundary config tests (inline, path, auto permission mode, and basic).

Closes coder/registry#797

Generated with OpenClaw using Claude
This commit is contained in:
DevelopmentCats 2026-04-08 15:36:52 +00:00
commit 890f6490ac
9 changed files with 83 additions and 23 deletions

View File

@ -37,7 +37,7 @@ jobs:
all: all:
- '**' - '**'
- name: Set up Terraform - name: Set up Terraform
uses: coder/coder/.github/actions/setup-tf@f7650296ceb9b020c79cd525ac7bd3c7f252ae1d # v2.31.6 uses: coder/coder/.github/actions/setup-tf@a7e9dfa7dc18625e4e0c155af3b0928a8cb3354a # v2.31.7
- name: Set up Bun - name: Set up Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with: with:
@ -87,13 +87,13 @@ jobs:
bun-version: latest bun-version: latest
# Need Terraform for its formatter # Need Terraform for its formatter
- name: Install Terraform - name: Install Terraform
uses: coder/coder/.github/actions/setup-tf@f7650296ceb9b020c79cd525ac7bd3c7f252ae1d # v2.31.6 uses: coder/coder/.github/actions/setup-tf@a7e9dfa7dc18625e4e0c155af3b0928a8cb3354a # v2.31.7
- name: Install dependencies - name: Install dependencies
run: bun install run: bun install
- name: Validate formatting - name: Validate formatting
run: bun fmt:ci run: bun fmt:ci
- name: Check for typos - name: Check for typos
uses: crate-ci/typos@631208b7aac2daa8b707f55e7331f9112b0e062d # v1.44.0 uses: crate-ci/typos@02ea592e44b3a53c302f697cddca7641cd051c3d # v1.45.0
with: with:
config: .github/typos.toml config: .github/typos.toml
validate-readme-files: validate-readme-files:

View File

@ -31,7 +31,7 @@ jobs:
bun-version: latest bun-version: latest
- name: Set up Terraform - name: Set up Terraform
uses: coder/coder/.github/actions/setup-tf@f7650296ceb9b020c79cd525ac7bd3c7f252ae1d # v2.31.6 uses: coder/coder/.github/actions/setup-tf@a7e9dfa7dc18625e4e0c155af3b0928a8cb3354a # v2.31.7
- name: Install dependencies - name: Install dependencies
run: bun install run: bun install

View File

@ -13,7 +13,7 @@ Run [GitHub Copilot CLI](https://docs.github.com/copilot/concepts/agents/about-c
```tf ```tf
module "copilot" { module "copilot" {
source = "registry.coder.com/coder-labs/copilot/coder" source = "registry.coder.com/coder-labs/copilot/coder"
version = "0.4.0" version = "0.4.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
workdir = "/home/coder/projects" workdir = "/home/coder/projects"
} }
@ -51,7 +51,7 @@ data "coder_parameter" "ai_prompt" {
module "copilot" { module "copilot" {
source = "registry.coder.com/coder-labs/copilot/coder" source = "registry.coder.com/coder-labs/copilot/coder"
version = "0.4.0" version = "0.4.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
workdir = "/home/coder/projects" workdir = "/home/coder/projects"
@ -71,7 +71,7 @@ Customize tool permissions, MCP servers, and Copilot settings:
```tf ```tf
module "copilot" { module "copilot" {
source = "registry.coder.com/coder-labs/copilot/coder" source = "registry.coder.com/coder-labs/copilot/coder"
version = "0.4.0" version = "0.4.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
workdir = "/home/coder/projects" workdir = "/home/coder/projects"
@ -142,7 +142,7 @@ variable "github_token" {
module "copilot" { module "copilot" {
source = "registry.coder.com/coder-labs/copilot/coder" source = "registry.coder.com/coder-labs/copilot/coder"
version = "0.4.0" version = "0.4.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
workdir = "/home/coder/projects" workdir = "/home/coder/projects"
github_token = var.github_token github_token = var.github_token
@ -156,7 +156,7 @@ Run Copilot as a command-line tool without task reporting or web interface. This
```tf ```tf
module "copilot" { module "copilot" {
source = "registry.coder.com/coder-labs/copilot/coder" source = "registry.coder.com/coder-labs/copilot/coder"
version = "0.4.0" version = "0.4.1"
agent_id = coder_agent.example.id agent_id = coder_agent.example.id
workdir = "/home/coder" workdir = "/home/coder"
report_tasks = false report_tasks = false
@ -179,7 +179,7 @@ module "aibridge-proxy" {
module "copilot" { module "copilot" {
source = "registry.coder.com/coder-labs/copilot/coder" source = "registry.coder.com/coder-labs/copilot/coder"
version = "0.4.0" version = "0.4.1"
agent_id = coder_agent.main.id agent_id = coder_agent.main.id
workdir = "/home/coder/projects" workdir = "/home/coder/projects"
enable_aibridge_proxy = true enable_aibridge_proxy = true

View File

@ -117,18 +117,23 @@ run "copilot_model_not_created_for_default" {
} }
} }
run "model_validation_accepts_valid_models" { run "copilot_model_accepts_custom_model" {
command = plan command = plan
variables { variables {
agent_id = "test-agent" agent_id = "test-agent"
workdir = "/home/coder" workdir = "/home/coder"
copilot_model = "gpt-5" copilot_model = "o3-pro"
} }
assert { assert {
condition = contains(["claude-sonnet-4", "claude-sonnet-4.5", "gpt-5"], var.copilot_model) condition = var.copilot_model == "o3-pro"
error_message = "Model should be one of the valid options" error_message = "copilot_model should accept any model string"
}
assert {
condition = length(resource.coder_env.copilot_model) == 1
error_message = "copilot_model env var should be created for non-default model"
} }
} }

View File

@ -33,12 +33,8 @@ variable "github_token" {
variable "copilot_model" { variable "copilot_model" {
type = string type = string
description = "Model to use. Supported values: claude-sonnet-4, claude-sonnet-4.5 (default), gpt-5." description = "The model to use for Copilot. Any model supported by GitHub Copilot can be used."
default = "claude-sonnet-4.5" default = "claude-sonnet-4.5"
validation {
condition = contains(["claude-sonnet-4", "claude-sonnet-4.5", "gpt-5"], var.copilot_model)
error_message = "copilot_model must be one of: claude-sonnet-4, claude-sonnet-4.5, gpt-5."
}
} }
variable "copilot_config" { variable "copilot_config" {

View File

@ -182,6 +182,24 @@ describe("claude-code", async () => {
expect(startLog.stdout).toContain(`--permission-mode ${mode}`); expect(startLog.stdout).toContain(`--permission-mode ${mode}`);
}); });
test("claude-auto-permission-mode", async () => {
const mode = "auto";
const { id } = await setup({
moduleVariables: {
permission_mode: mode,
ai_prompt: "test prompt",
},
});
await execModuleScript(id);
const startLog = await execContainer(id, [
"bash",
"-c",
"cat /home/coder/.claude-module/agentapi-start.log",
]);
expect(startLog.stdout).toContain(`--permission-mode ${mode}`);
});
test("claude-model", async () => { test("claude-model", async () => {
const model = "opus"; const model = "opus";
const { coderEnvVars } = await setup({ const { coderEnvVars } = await setup({

View File

@ -161,8 +161,8 @@ variable "permission_mode" {
description = "Permission mode for the cli, check https://docs.anthropic.com/en/docs/claude-code/iam#permission-modes" description = "Permission mode for the cli, check https://docs.anthropic.com/en/docs/claude-code/iam#permission-modes"
default = "" default = ""
validation { validation {
condition = contains(["", "default", "acceptEdits", "plan", "bypassPermissions"], var.permission_mode) condition = contains(["", "default", "acceptEdits", "plan", "auto", "bypassPermissions"], var.permission_mode)
error_message = "interaction_mode must be one of: default, acceptEdits, plan, bypassPermissions." error_message = "interaction_mode must be one of: default, acceptEdits, plan, auto, bypassPermissions."
} }
} }
@ -465,6 +465,7 @@ module "agentapi" {
ARG_MCP='${var.mcp != null ? base64encode(replace(var.mcp, "'", "'\\''")) : ""}' \ ARG_MCP='${var.mcp != null ? base64encode(replace(var.mcp, "'", "'\\''")) : ""}' \
ARG_MCP_CONFIG_REMOTE_PATH='${base64encode(jsonencode(var.mcp_config_remote_path))}' \ ARG_MCP_CONFIG_REMOTE_PATH='${base64encode(jsonencode(var.mcp_config_remote_path))}' \
ARG_ENABLE_AIBRIDGE='${var.enable_aibridge}' \ ARG_ENABLE_AIBRIDGE='${var.enable_aibridge}' \
ARG_PERMISSION_MODE='${var.permission_mode}' \
/tmp/install.sh /tmp/install.sh
EOT EOT
} }

View File

@ -183,7 +183,7 @@ run "test_claude_code_permission_mode_validation" {
} }
assert { assert {
condition = contains(["", "default", "acceptEdits", "plan", "bypassPermissions"], var.permission_mode) condition = contains(["", "default", "acceptEdits", "plan", "auto", "bypassPermissions"], var.permission_mode)
error_message = "Permission mode should be one of the valid options" error_message = "Permission mode should be one of the valid options"
} }
} }
@ -256,7 +256,22 @@ run "test_claude_code_with_boundary_config_path" {
} }
} }
run "test_claude_code_with_boundary_no_config" { run "test_claude_code_auto_permission_mode" {
command = plan
variables {
agent_id = "test-agent-auto"
workdir = "/home/coder/test"
permission_mode = "auto"
}
assert {
condition = var.permission_mode == "auto"
error_message = "Permission mode should be set to auto"
}
}
run "test_claude_code_with_boundary" {
command = plan command = plan
variables { variables {

View File

@ -22,6 +22,7 @@ ARG_MCP_CONFIG_REMOTE_PATH=$(echo -n "${ARG_MCP_CONFIG_REMOTE_PATH:-}" | base64
ARG_ALLOWED_TOOLS=${ARG_ALLOWED_TOOLS:-} ARG_ALLOWED_TOOLS=${ARG_ALLOWED_TOOLS:-}
ARG_DISALLOWED_TOOLS=${ARG_DISALLOWED_TOOLS:-} ARG_DISALLOWED_TOOLS=${ARG_DISALLOWED_TOOLS:-}
ARG_ENABLE_AIBRIDGE=${ARG_ENABLE_AIBRIDGE:-false} ARG_ENABLE_AIBRIDGE=${ARG_ENABLE_AIBRIDGE:-false}
ARG_PERMISSION_MODE=${ARG_PERMISSION_MODE:-}
export PATH="$ARG_CLAUDE_BINARY_PATH:$PATH" export PATH="$ARG_CLAUDE_BINARY_PATH:$PATH"
@ -195,6 +196,7 @@ function configure_standalone_mode() {
jq --arg workdir "$ARG_WORKDIR" --arg apikey "${CLAUDE_API_KEY:-}" \ jq --arg workdir "$ARG_WORKDIR" --arg apikey "${CLAUDE_API_KEY:-}" \
'.autoUpdaterStatus = "disabled" | '.autoUpdaterStatus = "disabled" |
.autoModeAccepted = true |
.bypassPermissionsModeAccepted = true | .bypassPermissionsModeAccepted = true |
.hasAcknowledgedCostThreshold = true | .hasAcknowledgedCostThreshold = true |
.hasCompletedOnboarding = true | .hasCompletedOnboarding = true |
@ -207,6 +209,7 @@ function configure_standalone_mode() {
cat > "$claude_config" << EOF cat > "$claude_config" << EOF
{ {
"autoUpdaterStatus": "disabled", "autoUpdaterStatus": "disabled",
"autoModeAccepted": true,
"bypassPermissionsModeAccepted": true, "bypassPermissionsModeAccepted": true,
"hasAcknowledgedCostThreshold": true, "hasAcknowledgedCostThreshold": true,
"hasCompletedOnboarding": true, "hasCompletedOnboarding": true,
@ -235,6 +238,28 @@ function report_tasks() {
fi fi
} }
function accept_auto_mode() {
# Pre-accept the auto mode TOS prompt so it doesn't appear interactively.
# Claude Code shows a confirmation dialog for auto mode that blocks
# non-interactive/headless usage.
# Note: bypassPermissions acceptance is already handled by
# coder exp mcp configure (task mode) and configure_standalone_mode.
local claude_config="$HOME/.claude.json"
if [ -f "$claude_config" ]; then
jq '.autoModeAccepted = true' \
"$claude_config" > "${claude_config}.tmp" && mv "${claude_config}.tmp" "$claude_config"
else
echo '{"autoModeAccepted": true}' > "$claude_config"
fi
echo "Pre-accepted auto mode prompt"
}
install_claude_code_cli install_claude_code_cli
setup_claude_configurations setup_claude_configurations
report_tasks report_tasks
if [ "$ARG_PERMISSION_MODE" = "auto" ]; then
accept_auto_mode
fi