feat(config): drop MCP_GARMIN_SERVER, default GARMIN_WRAPPER_PYTHON
The wrapper script is embedded in the binary now (internal/garmin), so there's no script path left to configure. The interpreter path becomes optional, defaulting to python3 on PATH, matching how other optional plumbing (e.g. GENIUSRUN_OIDC_REQUIRED_ROLE) is already handled. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -22,10 +22,10 @@ type Config struct {
|
|||||||
// DBPath is the SQLite database file path.
|
// DBPath is the SQLite database file path.
|
||||||
DBPath string
|
DBPath string
|
||||||
|
|
||||||
// GarminPythonPath is mcp-garmin's venv python executable.
|
// GarminPythonPath is the python3 interpreter used to run the embedded
|
||||||
|
// Garmin wrapper script (internal/garmin's go:embed'd wrapper.py).
|
||||||
|
// Defaults to "python3" resolved via PATH if unset.
|
||||||
GarminPythonPath string
|
GarminPythonPath string
|
||||||
// GarminServerPath is mcp-garmin's server.py.
|
|
||||||
GarminServerPath string
|
|
||||||
// GarminTokenStoreRoot is the root directory under which each user's
|
// GarminTokenStoreRoot is the root directory under which each user's
|
||||||
// mcp-garmin session cache lives (one subdirectory per user id, e.g.
|
// mcp-garmin session cache lives (one subdirectory per user id, e.g.
|
||||||
// "<root>/3"). Read from the GARMIN_TOKENSTORE env var; if unset, it
|
// "<root>/3"). Read from the GARMIN_TOKENSTORE env var; if unset, it
|
||||||
@@ -60,8 +60,7 @@ func Load() (Config, error) {
|
|||||||
cfg := Config{
|
cfg := Config{
|
||||||
Addr: getEnvDefault("GENIUSRUN_ADDR", ":8080"),
|
Addr: getEnvDefault("GENIUSRUN_ADDR", ":8080"),
|
||||||
DBPath: getEnvDefault("GENIUSRUN_DB_PATH", "geniusrun.db"),
|
DBPath: getEnvDefault("GENIUSRUN_DB_PATH", "geniusrun.db"),
|
||||||
GarminPythonPath: os.Getenv("MCP_GARMIN_PYTHON"),
|
GarminPythonPath: getEnvDefault("GARMIN_WRAPPER_PYTHON", "python3"),
|
||||||
GarminServerPath: os.Getenv("MCP_GARMIN_SERVER"),
|
|
||||||
GarminTokenStoreRoot: os.Getenv("GARMIN_TOKENSTORE"),
|
GarminTokenStoreRoot: os.Getenv("GARMIN_TOKENSTORE"),
|
||||||
MinConfidence: getEnvFloat("GENIUSRUN_MIN_CONFIDENCE", 0.6),
|
MinConfidence: getEnvFloat("GENIUSRUN_MIN_CONFIDENCE", 0.6),
|
||||||
IncrementalSyncEvery: getEnvDuration("GENIUSRUN_INCREMENTAL_SYNC_EVERY", 6*time.Hour),
|
IncrementalSyncEvery: getEnvDuration("GENIUSRUN_INCREMENTAL_SYNC_EVERY", 6*time.Hour),
|
||||||
@@ -78,12 +77,6 @@ func Load() (Config, error) {
|
|||||||
log.Printf("GARMIN_TOKENSTORE not set, defaulting to %q", cfg.GarminTokenStoreRoot)
|
log.Printf("GARMIN_TOKENSTORE not set, defaulting to %q", cfg.GarminTokenStoreRoot)
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.GarminPythonPath == "" {
|
|
||||||
return cfg, fmt.Errorf("MCP_GARMIN_PYTHON is required (path to mcp-garmin's venv python)")
|
|
||||||
}
|
|
||||||
if cfg.GarminServerPath == "" {
|
|
||||||
return cfg, fmt.Errorf("MCP_GARMIN_SERVER is required (path to mcp-garmin's server.py)")
|
|
||||||
}
|
|
||||||
if cfg.PublicBaseURL == "" {
|
if cfg.PublicBaseURL == "" {
|
||||||
return cfg, fmt.Errorf("GENIUSRUN_PUBLIC_BASE_URL is required (e.g. https://geniusrun.example.com)")
|
return cfg, fmt.Errorf("GENIUSRUN_PUBLIC_BASE_URL is required (e.g. https://geniusrun.example.com)")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import (
|
|||||||
|
|
||||||
func setRequiredEnv(t *testing.T) {
|
func setRequiredEnv(t *testing.T) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
t.Setenv("MCP_GARMIN_PYTHON", "/usr/bin/python3")
|
|
||||||
t.Setenv("MCP_GARMIN_SERVER", "/opt/mcp-garmin/server.py")
|
|
||||||
t.Setenv("GENIUSRUN_PUBLIC_BASE_URL", "https://geniusrun.example.com")
|
t.Setenv("GENIUSRUN_PUBLIC_BASE_URL", "https://geniusrun.example.com")
|
||||||
t.Setenv("GENIUSRUN_OIDC_ISSUER_URL", "https://keycloak.example.com/realms/myrealm")
|
t.Setenv("GENIUSRUN_OIDC_ISSUER_URL", "https://keycloak.example.com/realms/myrealm")
|
||||||
t.Setenv("GENIUSRUN_OIDC_CLIENT_ID", "geniusrun")
|
t.Setenv("GENIUSRUN_OIDC_CLIENT_ID", "geniusrun")
|
||||||
@@ -110,6 +108,32 @@ func TestLoad_GarminTokenStoreRootExplicitOverridesDefault(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLoad_GarminPythonPathDefaultsToPython3(t *testing.T) {
|
||||||
|
setRequiredEnv(t)
|
||||||
|
t.Setenv("GARMIN_WRAPPER_PYTHON", "")
|
||||||
|
|
||||||
|
cfg, err := Load()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Load: %v", err)
|
||||||
|
}
|
||||||
|
if cfg.GarminPythonPath != "python3" {
|
||||||
|
t.Errorf("GarminPythonPath = %q, want default %q", cfg.GarminPythonPath, "python3")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoad_GarminPythonPathExplicitOverridesDefault(t *testing.T) {
|
||||||
|
setRequiredEnv(t)
|
||||||
|
t.Setenv("GARMIN_WRAPPER_PYTHON", "/opt/venv/bin/python3")
|
||||||
|
|
||||||
|
cfg, err := Load()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Load: %v", err)
|
||||||
|
}
|
||||||
|
if cfg.GarminPythonPath != "/opt/venv/bin/python3" {
|
||||||
|
t.Errorf("GarminPythonPath = %q, want explicit override", cfg.GarminPythonPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestLoad_CustomRoleAndDuration(t *testing.T) {
|
func TestLoad_CustomRoleAndDuration(t *testing.T) {
|
||||||
setRequiredEnv(t)
|
setRequiredEnv(t)
|
||||||
t.Setenv("GENIUSRUN_OIDC_REQUIRED_ROLE", "admin")
|
t.Setenv("GENIUSRUN_OIDC_REQUIRED_ROLE", "admin")
|
||||||
|
|||||||
Reference in New Issue
Block a user