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:
commit
890f6490ac
6
.github/workflows/ci.yaml
vendored
6
.github/workflows/ci.yaml
vendored
@ -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:
|
||||||
|
|||||||
2
.github/workflows/version-bump.yaml
vendored
2
.github/workflows/version-bump.yaml
vendored
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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" {
|
||||||
|
|||||||
@ -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({
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user