feat(config): Add support for env var configuration
This commit introduces support for two environment variables, allowing users to override the default paths for picoclaw's home directory and configuration file. - `PICOCLAW_CONFIG`: Directly specifies the path to the `config.json` file. This is initialised first, takes precedence over the hardcoded path, and is ideal for containerized deployments or custom config management. - `PICOCLAW_HOME`: Overrides the root directory for all picoclaw data, (except the config) (e.g., `~/.picoclaw`). This is useful for portable installations or placing data in non-standard locations. This change provides greater flexibility for running picoclaw in various environments without being tied to the default home directory structure.
This commit is contained in:
parent
25f26f305b
commit
0f8cd0dc2e
4 changed files with 56 additions and 1 deletions
|
|
@ -19,6 +19,9 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetConfigPath() string {
|
func GetConfigPath() string {
|
||||||
|
if configPath := os.Getenv("PICOCLAW_CONFIG"); configPath != "" {
|
||||||
|
return configPath
|
||||||
|
}
|
||||||
home, _ := os.UserHomeDir()
|
home, _ := os.UserHomeDir()
|
||||||
return filepath.Join(home, ".picoclaw", "config.json")
|
return filepath.Join(home, ".picoclaw", "config.json")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -95,3 +95,13 @@ func TestGetConfigPath_Windows(t *testing.T) {
|
||||||
func TestGetVersion(t *testing.T) {
|
func TestGetVersion(t *testing.T) {
|
||||||
assert.Equal(t, "dev", GetVersion())
|
assert.Equal(t, "dev", GetVersion())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetConfigPath_WithEnv(t *testing.T) {
|
||||||
|
t.Setenv("PICOCLAW_CONFIG", "/tmp/custom/config.json")
|
||||||
|
t.Setenv("HOME", "/tmp/home") // Also set home to ensure env is preferred
|
||||||
|
|
||||||
|
got := GetConfigPath()
|
||||||
|
want := "/tmp/custom/config.json"
|
||||||
|
|
||||||
|
assert.Equal(t, want, got)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -442,3 +442,28 @@ func TestDefaultConfig_DMScope(t *testing.T) {
|
||||||
t.Errorf("Session.DMScope = %q, want 'per-channel-peer'", cfg.Session.DMScope)
|
t.Errorf("Session.DMScope = %q, want 'per-channel-peer'", cfg.Session.DMScope)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDefaultConfig_WorkspacePath_Default(t *testing.T) {
|
||||||
|
// Unset to ensure we test the default
|
||||||
|
t.Setenv("PICOCLAW_HOME", "")
|
||||||
|
// Set a known home for consistent test results
|
||||||
|
t.Setenv("HOME", "/tmp/home")
|
||||||
|
|
||||||
|
cfg := DefaultConfig()
|
||||||
|
want := filepath.Join("/tmp/home", ".picoclaw", "workspace")
|
||||||
|
|
||||||
|
if cfg.Agents.Defaults.Workspace != want {
|
||||||
|
t.Errorf("Default workspace path = %q, want %q", cfg.Agents.Defaults.Workspace, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDefaultConfig_WorkspacePath_WithPicoclawHome(t *testing.T) {
|
||||||
|
t.Setenv("PICOCLAW_HOME", "/custom/picoclaw/home")
|
||||||
|
|
||||||
|
cfg := DefaultConfig()
|
||||||
|
want := "/custom/picoclaw/home/workspace"
|
||||||
|
|
||||||
|
if cfg.Agents.Defaults.Workspace != want {
|
||||||
|
t.Errorf("Workspace path with PICOCLAW_HOME = %q, want %q", cfg.Agents.Defaults.Workspace, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,29 @@
|
||||||
|
|
||||||
package config
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
// DefaultConfig returns the default configuration for PicoClaw.
|
// DefaultConfig returns the default configuration for PicoClaw.
|
||||||
func DefaultConfig() *Config {
|
func DefaultConfig() *Config {
|
||||||
|
// Determine the base path for the workspace.
|
||||||
|
// Priority: $PICOCLAW_HOME > ~/.picoclaw
|
||||||
|
var homePath string
|
||||||
|
if picoclawHome := os.Getenv("PICOCLAW_HOME"); picoclawHome != "" {
|
||||||
|
homePath = picoclawHome
|
||||||
|
} else {
|
||||||
|
userHome, _ := os.UserHomeDir()
|
||||||
|
homePath = filepath.Join(userHome, ".picoclaw")
|
||||||
|
}
|
||||||
|
workspacePath := filepath.Join(homePath, "workspace")
|
||||||
|
|
||||||
return &Config{
|
return &Config{
|
||||||
Agents: AgentsConfig{
|
Agents: AgentsConfig{
|
||||||
Defaults: AgentDefaults{
|
Defaults: AgentDefaults{
|
||||||
Workspace: "~/.picoclaw/workspace",
|
Workspace: workspacePath,
|
||||||
|
|
||||||
RestrictToWorkspace: true,
|
RestrictToWorkspace: true,
|
||||||
Provider: "",
|
Provider: "",
|
||||||
Model: "",
|
Model: "",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue