We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
2 parents c459b77 + bc73499 commit 3bd926dCopy full SHA for 3bd926d
cmd/list.go
@@ -74,6 +74,7 @@ var listCmd = &cobra.Command{
74
fmt.Println(" exitbox rebuild <agent> Force rebuild of agent image")
75
fmt.Println(" exitbox rebuild all Rebuild all enabled agents")
76
fmt.Println(" exitbox import <agent> Import agent config from host")
77
+ fmt.Println(" exitbox skills Install, list, and remove skills for AI coding agents")
78
fmt.Println(" exitbox workspaces Manage workspaces")
79
fmt.Println(" exitbox sessions Manage sessions")
80
fmt.Println(" exitbox vault Manage vault secrets")
internal/image/base.go
@@ -27,6 +27,7 @@ import (
27
28
"github.com/cloud-exit/exitbox/internal/config"
29
"github.com/cloud-exit/exitbox/internal/container"
30
+ "github.com/cloud-exit/exitbox/internal/platform"
31
"github.com/cloud-exit/exitbox/internal/ui"
32
"github.com/cloud-exit/exitbox/static"
33
)
@@ -242,11 +243,12 @@ func buildLocalIntermediary(ctx context.Context, rt container.Runtime, cmd, base
242
243
}
244
245
246
+ uid, gid := platform.HostUIDGID()
247
args := buildArgs(cmd)
248
args = append(args,
249
"--build-arg", fmt.Sprintf("BASE_IMAGE=%s", baseRef),
- "--build-arg", fmt.Sprintf("USER_ID=%d", os.Getuid()),
- "--build-arg", fmt.Sprintf("GROUP_ID=%d", os.Getgid()),
250
+ "--build-arg", fmt.Sprintf("USER_ID=%d", uid),
251
+ "--build-arg", fmt.Sprintf("GROUP_ID=%d", gid),
252
"--build-arg", "USERNAME=user",
253
"-t", imageName,
254
"-f", dockerfilePath,
internal/platform/platform.go
@@ -17,7 +17,25 @@
17
// Package platform provides OS and architecture detection.
18
package platform
19
20
-import "runtime"
+import (
21
+ "os"
22
+ "runtime"
23
+)
24
+
25
+const (
26
+ DefaultContainerUID = 1000
+ DefaultContainerGID = 1000
+// HostUIDGID returns host user and group IDs for Docker build args.
+// On Windows it returns -1 and in this case returns DefaultContainerUID:DefaultContainerGID
+func HostUIDGID() (uid, gid int) {
+ uid, gid = os.Getuid(), os.Getgid()
34
+ if uid < 0 || gid < 0 {
35
+ return DefaultContainerUID, DefaultContainerGID
36
+ }
37
+ return uid, gid
38
+}
39
40
// DetectOS returns the current operating system as a normalized string.
41
func DetectOS() string {
internal/profile/profile.go
@@ -38,6 +38,7 @@ func All() []Profile {
{"rust", "Rust toolchain (rust + cargo via apk)", "rust cargo"},
{"go", "Go runtime (latest stable for host arch, checksum verified)", ""},
{"java", "OpenJDK with Maven and Gradle", "openjdk17-jdk maven gradle"},
+ {"dotnet", ".NET 8 SDK (dotnet CLI)", "dotnet8-sdk"},
42
{"ruby", "Ruby runtime with bundler", "ruby ruby-dev readline-dev yaml-dev sqlite-dev sqlite libxml2-dev libxslt-dev curl-dev"},
43
{"php", "PHP runtime with composer", "php83 php83-cli php83-fpm php83-mysqli php83-pgsql php83-sqlite3 php83-curl php83-gd php83-mbstring php83-xml php83-zip composer"},
44
{"database", "Database CLI clients (Postgres, MySQL/MariaDB, SQLite, Redis)", "postgresql16-client mariadb-client sqlite redis"},
internal/run/run.go
@@ -33,6 +33,7 @@ import (
"github.com/cloud-exit/exitbox/internal/generate"
"github.com/cloud-exit/exitbox/internal/ipc"
"github.com/cloud-exit/exitbox/internal/network"
"github.com/cloud-exit/exitbox/internal/profile"
"github.com/cloud-exit/exitbox/internal/project"
"github.com/cloud-exit/exitbox/internal/redactor"
@@ -264,8 +265,9 @@ func AgentContainer(rt container.Runtime, opts Options) (int, error) {
264
265
266
args = append(args, "-w", "/workspace", "-v", opts.ProjectDir+":/workspace"+mountMode)
267
- // Non-root
268
- args = append(args, "--user", fmt.Sprintf("%d:%d", os.Getuid(), os.Getgid()))
+ // Non-root (Windows: os.Getuid/Getgid are -1)
269
+ runUID, runGID := platform.HostUIDGID()
270
+ args = append(args, "--user", fmt.Sprintf("%d:%d", runUID, runGID))
271
272
// Include dirs
273
for _, dir := range opts.IncludeDirs {
internal/wizard/roles.go
@@ -78,8 +78,8 @@ var Roles = []Role{
{
Name: "Fullstack",
Description: "Full-stack web development",
81
- Profiles: []string{"node", "python", "database", "web", "build-tools"},
82
- Languages: []string{"Node/JS", "Python"},
+ Profiles: []string{"node", "python", "database", "web", "dotnet", "build-tools"},
+ Languages: []string{"Node/JS", "Python", ".NET"},
83
ToolCategories: []string{"Build Tools", "Database", "Web"},
84
},
85
@@ -133,6 +133,7 @@ var AllLanguages = []Language{
133
{Name: "Node/JS", Profile: "node"},
134
{Name: "Rust", Profile: "rust"},
135
{Name: "Java", Profile: "java"},
136
+ {Name: ".NET", Profile: "dotnet"},
137
{Name: "Ruby", Profile: "ruby"},
138
{Name: "PHP", Profile: "php"},
139
{Name: "C/C++", Profile: "c"},
0 commit comments