1
+ terraform {
2
+ required_providers {
3
+ coder = {
4
+ source = " coder/coder"
5
+ }
6
+ docker = {
7
+ source = " kreuzwerker/docker"
8
+ }
9
+ }
10
+ }
11
+
12
+ provider "docker" {}
13
+ provider "coder" {}
14
+
15
+ data "coder_workspace" "me" {}
16
+ data "coder_workspace_owner" "me" {}
17
+
18
+ locals {
19
+ username = data. coder_workspace_owner . me . name
20
+ }
21
+
22
+ # Parameter for users to enter prompts directly from the workspace creation page
23
+ data "coder_parameter" "ai_prompt" {
24
+ type = " string"
25
+ name = " AI Prompt"
26
+ default = " "
27
+ description = " Write a prompt for Claude Code"
28
+ mutable = true
29
+ ephemeral = true
30
+ }
31
+
32
+ resource "coder_agent" "main" {
33
+ arch = " amd64"
34
+ os = " linux"
35
+ dir = " /home/${ local . username } "
36
+
37
+ startup_script = <<- EOT
38
+ # Ensure screen is installed (required for Claude Code)
39
+ if ! command -v screen &> /dev/null; then
40
+ echo "Installing screen for Claude Code..."
41
+ sudo apt-get update
42
+ sudo apt-get install -y screen
43
+ fi
44
+
45
+ # Ensure Node.js and npm are installed
46
+ if ! command -v node &> /dev/null; then
47
+ echo "Installing Node.js and npm..."
48
+ curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
49
+ sudo apt-get install -y nodejs
50
+ fi
51
+ EOT
52
+
53
+ env = {
54
+ # Git configuration
55
+ GIT_AUTHOR_NAME = data.coder_workspace_owner.me.name
56
+ GIT_AUTHOR_EMAIL = data.coder_workspace_owner.me.email
57
+ GIT_COMMITTER_NAME = data.coder_workspace_owner.me.name
58
+ GIT_COMMITTER_EMAIL = data.coder_workspace_owner.me.email
59
+ }
60
+
61
+ # Basic workspace metrics
62
+ metadata {
63
+ display_name = " CPU Usage"
64
+ key = " cpu_usage"
65
+ script = " coder stat cpu"
66
+ interval = 10
67
+ timeout = 1
68
+ }
69
+
70
+ metadata {
71
+ display_name = " RAM Usage"
72
+ key = " ram_usage"
73
+ script = " coder stat mem"
74
+ interval = 10
75
+ timeout = 1
76
+ }
77
+ }
78
+
79
+ # Integrate Claude Code using the official module
80
+ module "claude-code" {
81
+ source = " registry.coder.com/modules/claude-code/coder"
82
+ version = " 1.2.1"
83
+ agent_id = coder_agent. main . id
84
+
85
+ # Enable dashboard visualization features
86
+ experiment_use_screen = true
87
+ experiment_report_tasks = true
88
+ }
89
+
90
+ # Configure Claude with Anthropic API key and Sonnet model
91
+ resource "coder_env" "claude_api_key" {
92
+ agent_id = coder_agent. main . id
93
+ name = " CLAUDE_API_KEY"
94
+ value = var. anthropic_api_key
95
+ }
96
+
97
+ resource "coder_env" "claude_model" {
98
+ agent_id = coder_agent. main . id
99
+ name = " CLAUDE_MODEL"
100
+ value = " claude-3-sonnet-20240229"
101
+ }
102
+
103
+ # Pass parameter prompt to Claude Code
104
+ resource "coder_env" "claude_task_prompt" {
105
+ agent_id = coder_agent. main . id
106
+ name = " CODER_MCP_CLAUDE_TASK_PROMPT"
107
+ value = data. coder_parameter . ai_prompt . value
108
+ }
109
+
110
+ # Add VS Code integration
111
+ module "code-server" {
112
+ source = " registry.coder.com/modules/code-server/coder"
113
+ version = " 1.0.2"
114
+ agent_id = coder_agent. main . id
115
+ folder = " /home/${ local . username } "
116
+ }
117
+
118
+ # Docker resources
119
+ resource "docker_volume" "home_volume" {
120
+ name = " coder-${ data . coder_workspace . me . id } -home"
121
+ lifecycle {
122
+ ignore_changes = all
123
+ }
124
+ labels {
125
+ label = " coder.workspace_id"
126
+ value = data. coder_workspace . me . id
127
+ }
128
+ }
129
+
130
+ resource "docker_image" "main" {
131
+ name = " codercom/enterprise-base:ubuntu"
132
+ }
133
+
134
+ resource "docker_container" "workspace" {
135
+ count = data. coder_workspace . me . start_count
136
+ image = docker_image. main . name
137
+ name = " coder-${ data . coder_workspace_owner . me . name } -${ lower (data. coder_workspace . me . name )} "
138
+ hostname = data. coder_workspace . me . name
139
+
140
+ env = [" CODER_AGENT_TOKEN=${ coder_agent . main . token } " ]
141
+ entrypoint = [" sh" , " -c" , coder_agent . main . init_script ]
142
+
143
+ host {
144
+ host = " host.docker.internal"
145
+ ip = " host-gateway"
146
+ }
147
+
148
+ volumes {
149
+ container_path = " /home/${ local . username } "
150
+ volume_name = docker_volume. home_volume . name
151
+ read_only = false
152
+ }
153
+
154
+ labels {
155
+ label = " coder.owner"
156
+ value = data. coder_workspace_owner . me . name
157
+ }
158
+
159
+ labels {
160
+ label = " coder.workspace_id"
161
+ value = data. coder_workspace . me . id
162
+ }
163
+ }
164
+
165
+ # Parameter for API authentication
166
+ variable "anthropic_api_key" {
167
+ type = string
168
+ sensitive = true
169
+ description = " Anthropic API key for Claude Sonnet integration"
170
+ }
171
+
172
+ # Output with usage instructions
173
+ output "claude_usage_instructions" {
174
+ value = " Claude 3 Sonnet is available in this workspace. Use it through the terminal with 'claude-code \" Your prompt\" ' or through the VS Code extension."
175
+ }
0 commit comments