diff options
| author | Claudomator Agent <agent@claudomator> | 2026-03-09 04:59:39 +0000 |
|---|---|---|
| committer | Claudomator Agent <agent@claudomator> | 2026-03-09 04:59:39 +0000 |
| commit | 67b8544b222392d8a01847e3d34559c23fd0cd12 (patch) | |
| tree | b7d27c83cac301dc9b902f3dda34d6a2a4da37d6 /internal/api/server.go | |
| parent | fc1459be18d4718f2c5f15325e1a1d07fb0b3a9e (diff) | |
api: make workspace root configurable instead of hardcoded /workspace
- Add workspaceRoot field (default "/workspace") to Server struct
- Add SetWorkspaceRoot method on Server
- Update handleListWorkspaces to use s.workspaceRoot
- Add WorkspaceRoot field to Config with default "/workspace"
- Wire cfg.WorkspaceRoot into server in serve.go
- Expose --workspace-root flag on the serve command
- Add TestListWorkspaces_UsesConfiguredRoot integration test
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/api/server.go')
| -rw-r--r-- | internal/api/server.go | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/internal/api/server.go b/internal/api/server.go index 1d87b3f..0868295 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -42,6 +42,7 @@ type Server struct { validateCmdPath string // overrides claudeBinPath for validate; used in tests scripts ScriptRegistry // optional; maps endpoint name → script path workDir string // working directory injected into elaborate system prompt + workspaceRoot string // root directory for listing workspaces; defaults to "/workspace" notifier notify.Notifier apiToken string // if non-empty, required for WebSocket (and REST) connections elaborateLimiter *ipRateLimiter // per-IP rate limiter for elaborate/validate endpoints @@ -57,6 +58,11 @@ func (s *Server) SetNotifier(n notify.Notifier) { s.notifier = n } +// SetWorkspaceRoot configures the root directory used by handleListWorkspaces. +func (s *Server) SetWorkspaceRoot(path string) { + s.workspaceRoot = path +} + func NewServer(store *storage.DB, pool *executor.Pool, logger *slog.Logger, claudeBinPath, geminiBinPath string) *Server { wd, _ := os.Getwd() s := &Server{ @@ -71,6 +77,7 @@ func NewServer(store *storage.DB, pool *executor.Pool, logger *slog.Logger, clau claudeBinPath: claudeBinPath, geminiBinPath: geminiBinPath, workDir: wd, + workspaceRoot: "/workspace", } s.routes() return s @@ -321,7 +328,7 @@ func (s *Server) handleListWorkspaces(w http.ResponseWriter, r *http.Request) { } } - entries, err := os.ReadDir("/workspace") + entries, err := os.ReadDir(s.workspaceRoot) if err != nil { writeJSON(w, http.StatusInternalServerError, map[string]string{"error": "failed to list workspaces"}) return @@ -329,7 +336,7 @@ func (s *Server) handleListWorkspaces(w http.ResponseWriter, r *http.Request) { var dirs []string for _, e := range entries { if e.IsDir() { - dirs = append(dirs, "/workspace/"+e.Name()) + dirs = append(dirs, s.workspaceRoot+"/"+e.Name()) } } writeJSON(w, http.StatusOK, dirs) |
