From ce19b4c1ea0117b14654357784b258c871aa67bc Mon Sep 17 00:00:00 2001 From: Vadim Polulyakh Date: Wed, 18 Feb 2026 23:51:36 +0000 Subject: [PATCH 1/4] fix(ui-desktop): align config/runtime paths with GOOSE_PATH_ROOT Signed-off-by: Vadim Polulyakh --- ui/desktop/src/bin/jbang | 39 +++++++++++------- ui/desktop/src/bin/node-setup-common.sh | 46 +++++++++++++--------- ui/desktop/src/bin/uvx | 33 ++++++++++------ ui/desktop/src/main.ts | 21 +++++++++- ui/desktop/src/recipe/recipe_management.ts | 8 ++++ 5 files changed, 101 insertions(+), 46 deletions(-) diff --git a/ui/desktop/src/bin/jbang b/ui/desktop/src/bin/jbang index d06edbf61bb8..82126f4964b6 100755 --- a/ui/desktop/src/bin/jbang +++ b/ui/desktop/src/bin/jbang @@ -20,31 +20,40 @@ trap 'log "An error occurred. Exiting with status $?."' ERR log "Starting jbang setup script." -# Ensure ~/.config/goose/mcp-hermit/bin exists -log "Creating directory ~/.config/goose/mcp-hermit/bin if it does not exist." -mkdir -p ~/.config/goose/mcp-hermit/bin +if [ -n "${GOOSE_CONFIG_DIR:-}" ]; then + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" +elif [ -n "${GOOSE_PATH_ROOT:-}" ]; then + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" +else + RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" +fi +MCP_HERMIT_DIR="${RESOLVED_GOOSE_CONFIG_DIR}/mcp-hermit" + +# Ensure mcp-hermit/bin exists +log "Creating directory ${MCP_HERMIT_DIR}/bin if it does not exist." +mkdir -p "${MCP_HERMIT_DIR}/bin" -# Change to the ~/.config/goose/mcp-hermit directory -log "Changing to directory ~/.config/goose/mcp-hermit." -cd ~/.config/goose/mcp-hermit +# Change to the mcp-hermit directory +log "Changing to directory ${MCP_HERMIT_DIR}." +cd "${MCP_HERMIT_DIR}" # Check if hermit binary exists and download if not -if [ ! -f ~/.config/goose/mcp-hermit/bin/hermit ]; then +if [ ! -f "${MCP_HERMIT_DIR}/bin/hermit" ]; then log "Hermit binary not found. Downloading hermit binary." curl -fsSL "https://github.com/cashapp/hermit/releases/download/stable/hermit-$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/').gz" \ - | gzip -dc > ~/.config/goose/mcp-hermit/bin/hermit && chmod +x ~/.config/goose/mcp-hermit/bin/hermit + | gzip -dc > "${MCP_HERMIT_DIR}/bin/hermit" && chmod +x "${MCP_HERMIT_DIR}/bin/hermit" log "Hermit binary downloaded and made executable." else log "Hermit binary already exists. Skipping download." fi log "setting hermit cache to be local for MCP servers" -mkdir -p ~/.config/goose/mcp-hermit/cache -export HERMIT_STATE_DIR=~/.config/goose/mcp-hermit/cache +mkdir -p "${MCP_HERMIT_DIR}/cache" +export HERMIT_STATE_DIR="${MCP_HERMIT_DIR}/cache" # Update PATH -export PATH=~/.config/goose/mcp-hermit/bin:$PATH -log "Updated PATH to include ~/.config/goose/mcp-hermit/bin." +export PATH="${MCP_HERMIT_DIR}/bin:${PATH}" +log "Updated PATH to include ${MCP_HERMIT_DIR}/bin." # Initialize hermit log "Initializing hermit." @@ -55,10 +64,10 @@ log "Installing OpenJDK with hermit." hermit install openjdk@17 >> "$LOG_FILE" # Download and install jbang if not present -if [ ! -f ~/.config/goose/mcp-hermit/bin/jbang ]; then +if [ ! -f "${MCP_HERMIT_DIR}/bin/jbang" ]; then log "Downloading and installing jbang." curl -Ls https://sh.jbang.dev | bash -s - app setup - cp ~/.jbang/bin/jbang ~/.config/goose/mcp-hermit/bin/ + cp ~/.jbang/bin/jbang "${MCP_HERMIT_DIR}/bin/" fi # Verify installations @@ -86,4 +95,4 @@ jbang --quiet trust add * log "Executing 'jbang' command with arguments: $*" jbang --fresh --quiet "$@" || log "Failed to execute 'jbang' with arguments: $*" -log "jbang setup script completed successfully." \ No newline at end of file +log "jbang setup script completed successfully." diff --git a/ui/desktop/src/bin/node-setup-common.sh b/ui/desktop/src/bin/node-setup-common.sh index 34353034eab1..76aae1afdd39 100755 --- a/ui/desktop/src/bin/node-setup-common.sh +++ b/ui/desktop/src/bin/node-setup-common.sh @@ -23,32 +23,42 @@ trap 'log "An error occurred. Exiting with status $?."' ERR log "Starting node setup (common)." +if [ -n "${GOOSE_CONFIG_DIR:-}" ]; then + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" +elif [ -n "${GOOSE_PATH_ROOT:-}" ]; then + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" +else + RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" +fi +MCP_HERMIT_DIR="${RESOLVED_GOOSE_CONFIG_DIR}/mcp-hermit" + # One-time cleanup for existing Linux users to fix locking issues -CLEANUP_MARKER="${HOME}/.config/goose/.mcp-hermit-cleanup-v1" +CLEANUP_MARKER="${RESOLVED_GOOSE_CONFIG_DIR}/.mcp-hermit-cleanup-v1" if [[ "$(uname -s)" == "Linux" ]] && [ ! -f "${CLEANUP_MARKER}" ]; then log "Performing one-time cleanup of old mcp-hermit directory to fix locking issues." - if [ -d "${HOME}/.config/goose/mcp-hermit" ]; then - rm -rf "${HOME}/.config/goose/mcp-hermit" + if [ -d "${MCP_HERMIT_DIR}" ]; then + rm -rf "${MCP_HERMIT_DIR}" log "Removed old mcp-hermit directory." fi + mkdir -p "${RESOLVED_GOOSE_CONFIG_DIR}" touch "${CLEANUP_MARKER}" log "Cleanup completed. Marker file created." fi -# Ensure ${HOME}/.config/goose/mcp-hermit/bin exists -log "Creating directory ${HOME}/.config/goose/mcp-hermit/bin if it does not exist." -mkdir -p "${HOME}/.config/goose/mcp-hermit/bin" +# Ensure mcp-hermit/bin exists +log "Creating directory ${MCP_HERMIT_DIR}/bin if it does not exist." +mkdir -p "${MCP_HERMIT_DIR}/bin" -# Change to the ${HOME}/.config/goose/mcp-hermit directory -log "Changing to directory ${HOME}/.config/goose/mcp-hermit." -cd "${HOME}/.config/goose/mcp-hermit" +# Change to the mcp-hermit directory +log "Changing to directory ${MCP_HERMIT_DIR}." +cd "${MCP_HERMIT_DIR}" # Check if hermit binary exists and download if not -if [ ! -f "${HOME}/.config/goose/mcp-hermit/bin/hermit" ]; then +if [ ! -f "${MCP_HERMIT_DIR}/bin/hermit" ]; then log "Hermit binary not found. Downloading hermit binary." curl -fsSL "https://github.com/cashapp/hermit/releases/download/stable/hermit-$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/').gz" \ - | gzip -dc > "${HOME}/.config/goose/mcp-hermit/bin/hermit" && chmod +x "${HOME}/.config/goose/mcp-hermit/bin/hermit" + | gzip -dc > "${MCP_HERMIT_DIR}/bin/hermit" && chmod +x "${MCP_HERMIT_DIR}/bin/hermit" log "Hermit binary downloaded and made executable." else log "Hermit binary already exists. Skipping download." @@ -56,13 +66,13 @@ fi log "setting hermit cache to be local for MCP servers" -mkdir -p "${HOME}/.config/goose/mcp-hermit/cache" -export HERMIT_STATE_DIR="${HOME}/.config/goose/mcp-hermit/cache" +mkdir -p "${MCP_HERMIT_DIR}/cache" +export HERMIT_STATE_DIR="${MCP_HERMIT_DIR}/cache" # Update PATH -export PATH="${HOME}/.config/goose/mcp-hermit/bin:${PATH}" -log "Updated PATH to include ${HOME}/.config/goose/mcp-hermit/bin." +export PATH="${MCP_HERMIT_DIR}/bin:${PATH}" +log "Updated PATH to include ${MCP_HERMIT_DIR}/bin." # Verify hermit installation @@ -78,7 +88,7 @@ if [ ! -f "bin/activate-hermit" ]; then log "Creating temp dir with bin subdirectory for hermit copy to avoid self-update locks." HERMIT_TMP_DIR="/tmp/hermit_tmp_$$/bin" mkdir -p "${HERMIT_TMP_DIR}" - cp "${HOME}/.config/goose/mcp-hermit/bin/hermit" "${HERMIT_TMP_DIR}/hermit" + cp "${MCP_HERMIT_DIR}/bin/hermit" "${HERMIT_TMP_DIR}/hermit" chmod +x "${HERMIT_TMP_DIR}/hermit" export PATH="${HERMIT_TMP_DIR}:${PATH}" HERMIT_CLEANUP_DIR="/tmp/hermit_tmp_$$" @@ -124,10 +134,10 @@ if [ -n "${GOOSE_NPM_REGISTRY:-}" ] && curl -s --head --fail "${GOOSE_NPM_REGIST # Check if GOOSE_NPM_CERT is set and accessible if [ -n "${GOOSE_NPM_CERT:-}" ] && curl -s --head --fail "${GOOSE_NPM_CERT}" > /dev/null; then log "Downloading certificate from: ${GOOSE_NPM_CERT}" - curl -sSL -o "${HOME}/.config/goose/mcp-hermit/cert.pem" "${GOOSE_NPM_CERT}" + curl -sSL -o "${MCP_HERMIT_DIR}/cert.pem" "${GOOSE_NPM_CERT}" if [ $? -eq 0 ]; then log "Certificate downloaded successfully." - export NODE_EXTRA_CA_CERTS="${HOME}/.config/goose/mcp-hermit/cert.pem" + export NODE_EXTRA_CA_CERTS="${MCP_HERMIT_DIR}/cert.pem" else log "Unable to download the certificate. Skipping certificate setup." fi diff --git a/ui/desktop/src/bin/uvx b/ui/desktop/src/bin/uvx index b0f1bdbed643..72f3c98dd8c2 100755 --- a/ui/desktop/src/bin/uvx +++ b/ui/desktop/src/bin/uvx @@ -20,19 +20,28 @@ trap 'log "An error occurred. Exiting with status $?."' ERR log "Starting uvx setup script." -# Ensure ~/.config/goose/mcp-hermit/bin exists -log "Creating directory ~/.config/goose/mcp-hermit/bin if it does not exist." -mkdir -p ~/.config/goose/mcp-hermit/bin +if [ -n "${GOOSE_CONFIG_DIR:-}" ]; then + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" +elif [ -n "${GOOSE_PATH_ROOT:-}" ]; then + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" +else + RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" +fi +MCP_HERMIT_DIR="${RESOLVED_GOOSE_CONFIG_DIR}/mcp-hermit" + +# Ensure mcp-hermit/bin exists +log "Creating directory ${MCP_HERMIT_DIR}/bin if it does not exist." +mkdir -p "${MCP_HERMIT_DIR}/bin" -# Change to the ~/.config/goose/mcp-hermit directory -log "Changing to directory ~/.config/goose/mcp-hermit." -cd ~/.config/goose/mcp-hermit +# Change to the mcp-hermit directory +log "Changing to directory ${MCP_HERMIT_DIR}." +cd "${MCP_HERMIT_DIR}" # Check if hermit binary exists and download if not -if [ ! -f ~/.config/goose/mcp-hermit/bin/hermit ]; then +if [ ! -f "${MCP_HERMIT_DIR}/bin/hermit" ]; then log "Hermit binary not found. Downloading hermit binary." curl -fsSL "https://github.com/cashapp/hermit/releases/download/stable/hermit-$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/').gz" \ - | gzip -dc > ~/.config/goose/mcp-hermit/bin/hermit && chmod +x ~/.config/goose/mcp-hermit/bin/hermit + | gzip -dc > "${MCP_HERMIT_DIR}/bin/hermit" && chmod +x "${MCP_HERMIT_DIR}/bin/hermit" log "Hermit binary downloaded and made executable." else log "Hermit binary already exists. Skipping download." @@ -40,12 +49,12 @@ fi log "setting hermit cache to be local for MCP servers" -mkdir -p ~/.config/goose/mcp-hermit/cache -export HERMIT_STATE_DIR=~/.config/goose/mcp-hermit/cache +mkdir -p "${MCP_HERMIT_DIR}/cache" +export HERMIT_STATE_DIR="${MCP_HERMIT_DIR}/cache" # Update PATH -export PATH=~/.config/goose/mcp-hermit/bin:$PATH -log "Updated PATH to include ~/.config/goose/mcp-hermit/bin." +export PATH="${MCP_HERMIT_DIR}/bin:${PATH}" +log "Updated PATH to include ${MCP_HERMIT_DIR}/bin." # Verify hermit installation diff --git a/ui/desktop/src/main.ts b/ui/desktop/src/main.ts index bd1086fb2691..4e843ab6b516 100644 --- a/ui/desktop/src/main.ts +++ b/ui/desktop/src/main.ts @@ -439,6 +439,20 @@ const getBundledConfig = (): BundledConfig => { const { defaultProvider, defaultModel, predefinedModels, baseUrlShare, version } = getBundledConfig(); +const resolveGooseConfigDir = (): string => { + const explicitConfigDir = process.env.GOOSE_CONFIG_DIR?.trim(); + if (explicitConfigDir) { + return expandTilde(explicitConfigDir); + } + + const pathRoot = process.env.GOOSE_PATH_ROOT?.trim(); + if (pathRoot) { + return path.join(expandTilde(pathRoot), 'config'); + } + + return '~/.config/goose'; +}; + const GENERATED_SECRET = crypto.randomBytes(32).toString('hex'); const getServerSecret = (settings: Settings): string => { @@ -456,6 +470,8 @@ let appConfig = { GOOSE_DEFAULT_MODEL: defaultModel, GOOSE_PREDEFINED_MODELS: predefinedModels, GOOSE_API_HOST: 'http://127.0.0.1', + GOOSE_CONFIG_DIR: resolveGooseConfigDir(), + GOOSE_PATH_ROOT: process.env.GOOSE_PATH_ROOT, GOOSE_WORKING_DIR: '', // If GOOSE_ALLOWLIST_WARNING env var is not set, defaults to false (strict blocking mode) GOOSE_ALLOWLIST_WARNING: process.env.GOOSE_ALLOWLIST_WARNING === 'true', @@ -486,7 +502,10 @@ const createChat = async ( const goosedResult = await startGoosed({ serverSecret, dir: dir || os.homedir(), - env: { GOOSE_PATH_ROOT: process.env.GOOSE_PATH_ROOT }, + env: { + GOOSE_PATH_ROOT: process.env.GOOSE_PATH_ROOT, + GOOSE_CONFIG_DIR: appConfig.GOOSE_CONFIG_DIR, + }, externalGoosed: settings.externalGoosed, isPackaged: app.isPackaged, resourcesPath: app.isPackaged ? process.resourcesPath : undefined, diff --git a/ui/desktop/src/recipe/recipe_management.ts b/ui/desktop/src/recipe/recipe_management.ts index 8129a119a4df..098f1ac53d44 100644 --- a/ui/desktop/src/recipe/recipe_management.ts +++ b/ui/desktop/src/recipe/recipe_management.ts @@ -42,6 +42,14 @@ export const convertToLocaleDateString = (lastModified: string): string => { export const getStorageDirectory = (isGlobal: boolean): string => { if (isGlobal) { + const configDir = window.appConfig.get('GOOSE_CONFIG_DIR') as string | undefined; + if (configDir) { + return `${configDir}/recipes`; + } + const pathRoot = window.appConfig.get('GOOSE_PATH_ROOT') as string | undefined; + if (pathRoot) { + return `${pathRoot}/config/recipes`; + } return '~/.config/goose/recipes'; } else { // For directory recipes, build absolute path using working directory From 7f789c8b1b552c75c8a8efd60836b2d302c75acb Mon Sep 17 00:00:00 2001 From: Vadim Polulyakh Date: Wed, 18 Feb 2026 23:59:23 +0000 Subject: [PATCH 2/4] refactor(ui-desktop): prefer GOOSE_PATH_ROOT for path resolution Signed-off-by: Vadim Polulyakh --- ui/desktop/src/bin/jbang | 7 ++++--- ui/desktop/src/bin/node-setup-common.sh | 7 ++++--- ui/desktop/src/bin/uvx | 7 ++++--- ui/desktop/src/main.ts | 18 +++++------------- ui/desktop/src/recipe/recipe_management.ts | 8 ++++---- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/ui/desktop/src/bin/jbang b/ui/desktop/src/bin/jbang index 82126f4964b6..5456939a1a0f 100755 --- a/ui/desktop/src/bin/jbang +++ b/ui/desktop/src/bin/jbang @@ -20,10 +20,11 @@ trap 'log "An error occurred. Exiting with status $?."' ERR log "Starting jbang setup script." -if [ -n "${GOOSE_CONFIG_DIR:-}" ]; then - RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" -elif [ -n "${GOOSE_PATH_ROOT:-}" ]; then +if [ -n "${GOOSE_PATH_ROOT:-}" ]; then RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" +elif [ -n "${GOOSE_CONFIG_DIR:-}" ]; then + log "GOOSE_CONFIG_DIR is deprecated for desktop shims; prefer GOOSE_PATH_ROOT." + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" else RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" fi diff --git a/ui/desktop/src/bin/node-setup-common.sh b/ui/desktop/src/bin/node-setup-common.sh index 76aae1afdd39..748dd63d4961 100755 --- a/ui/desktop/src/bin/node-setup-common.sh +++ b/ui/desktop/src/bin/node-setup-common.sh @@ -23,10 +23,11 @@ trap 'log "An error occurred. Exiting with status $?."' ERR log "Starting node setup (common)." -if [ -n "${GOOSE_CONFIG_DIR:-}" ]; then - RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" -elif [ -n "${GOOSE_PATH_ROOT:-}" ]; then +if [ -n "${GOOSE_PATH_ROOT:-}" ]; then RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" +elif [ -n "${GOOSE_CONFIG_DIR:-}" ]; then + log "GOOSE_CONFIG_DIR is deprecated for desktop shims; prefer GOOSE_PATH_ROOT." + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" else RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" fi diff --git a/ui/desktop/src/bin/uvx b/ui/desktop/src/bin/uvx index 72f3c98dd8c2..369adadaa91e 100755 --- a/ui/desktop/src/bin/uvx +++ b/ui/desktop/src/bin/uvx @@ -20,10 +20,11 @@ trap 'log "An error occurred. Exiting with status $?."' ERR log "Starting uvx setup script." -if [ -n "${GOOSE_CONFIG_DIR:-}" ]; then - RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" -elif [ -n "${GOOSE_PATH_ROOT:-}" ]; then +if [ -n "${GOOSE_PATH_ROOT:-}" ]; then RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" +elif [ -n "${GOOSE_CONFIG_DIR:-}" ]; then + log "GOOSE_CONFIG_DIR is deprecated for desktop shims; prefer GOOSE_PATH_ROOT." + RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" else RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" fi diff --git a/ui/desktop/src/main.ts b/ui/desktop/src/main.ts index 4e843ab6b516..90aa6344cc43 100644 --- a/ui/desktop/src/main.ts +++ b/ui/desktop/src/main.ts @@ -439,18 +439,12 @@ const getBundledConfig = (): BundledConfig => { const { defaultProvider, defaultModel, predefinedModels, baseUrlShare, version } = getBundledConfig(); -const resolveGooseConfigDir = (): string => { - const explicitConfigDir = process.env.GOOSE_CONFIG_DIR?.trim(); - if (explicitConfigDir) { - return expandTilde(explicitConfigDir); - } - +const resolveGoosePathRoot = (): string | undefined => { const pathRoot = process.env.GOOSE_PATH_ROOT?.trim(); if (pathRoot) { - return path.join(expandTilde(pathRoot), 'config'); + return expandTilde(pathRoot); } - - return '~/.config/goose'; + return undefined; }; const GENERATED_SECRET = crypto.randomBytes(32).toString('hex'); @@ -470,8 +464,7 @@ let appConfig = { GOOSE_DEFAULT_MODEL: defaultModel, GOOSE_PREDEFINED_MODELS: predefinedModels, GOOSE_API_HOST: 'http://127.0.0.1', - GOOSE_CONFIG_DIR: resolveGooseConfigDir(), - GOOSE_PATH_ROOT: process.env.GOOSE_PATH_ROOT, + GOOSE_PATH_ROOT: resolveGoosePathRoot(), GOOSE_WORKING_DIR: '', // If GOOSE_ALLOWLIST_WARNING env var is not set, defaults to false (strict blocking mode) GOOSE_ALLOWLIST_WARNING: process.env.GOOSE_ALLOWLIST_WARNING === 'true', @@ -503,8 +496,7 @@ const createChat = async ( serverSecret, dir: dir || os.homedir(), env: { - GOOSE_PATH_ROOT: process.env.GOOSE_PATH_ROOT, - GOOSE_CONFIG_DIR: appConfig.GOOSE_CONFIG_DIR, + GOOSE_PATH_ROOT: appConfig.GOOSE_PATH_ROOT as string | undefined, }, externalGoosed: settings.externalGoosed, isPackaged: app.isPackaged, diff --git a/ui/desktop/src/recipe/recipe_management.ts b/ui/desktop/src/recipe/recipe_management.ts index 098f1ac53d44..90c2108cc750 100644 --- a/ui/desktop/src/recipe/recipe_management.ts +++ b/ui/desktop/src/recipe/recipe_management.ts @@ -42,14 +42,14 @@ export const convertToLocaleDateString = (lastModified: string): string => { export const getStorageDirectory = (isGlobal: boolean): string => { if (isGlobal) { - const configDir = window.appConfig.get('GOOSE_CONFIG_DIR') as string | undefined; - if (configDir) { - return `${configDir}/recipes`; - } const pathRoot = window.appConfig.get('GOOSE_PATH_ROOT') as string | undefined; if (pathRoot) { return `${pathRoot}/config/recipes`; } + const configDir = window.appConfig.get('GOOSE_CONFIG_DIR') as string | undefined; + if (configDir) { + return `${configDir}/recipes`; + } return '~/.config/goose/recipes'; } else { // For directory recipes, build absolute path using working directory From 7c7ac2d84050005618d95eb335fa3ba724f30121 Mon Sep 17 00:00:00 2001 From: Vadim Polulyakh Date: Thu, 19 Feb 2026 00:01:51 +0000 Subject: [PATCH 3/4] refactor(paths): remove GOOSE_CONFIG_DIR fallback usage Signed-off-by: Vadim Polulyakh --- recipe-scanner/scan-recipe.sh | 2 +- ui/desktop/src/bin/jbang | 3 --- ui/desktop/src/bin/node-setup-common.sh | 3 --- ui/desktop/src/bin/uvx | 3 --- ui/desktop/src/recipe/recipe_management.ts | 4 ---- 5 files changed, 1 insertion(+), 14 deletions(-) diff --git a/recipe-scanner/scan-recipe.sh b/recipe-scanner/scan-recipe.sh index 31ee921f9a11..585880c2983f 100755 --- a/recipe-scanner/scan-recipe.sh +++ b/recipe-scanner/scan-recipe.sh @@ -258,13 +258,13 @@ chmod -R 755 "$GOOSE_TMP" 2>/dev/null || true export XDG_STATE_HOME="$GOOSE_TMP/state" export XDG_CACHE_HOME="$GOOSE_TMP/cache" +export GOOSE_PATH_ROOT="$GOOSE_TMP" export GOOSE_TELEMETRY_ENABLED=false export GOOSE_PROJECT_TRACKER_ENABLED=false export RUST_LOG=error if [ -f "$HOME/.config/goose/config.yaml" ]; then cp "$HOME/.config/goose/config.yaml" "$GOOSE_TMP/config/config.yaml" 2>/dev/null || true - export GOOSE_CONFIG_DIR="$GOOSE_TMP/config" fi echo "✅ Goose environment configured" diff --git a/ui/desktop/src/bin/jbang b/ui/desktop/src/bin/jbang index 5456939a1a0f..c49b80025e1e 100755 --- a/ui/desktop/src/bin/jbang +++ b/ui/desktop/src/bin/jbang @@ -22,9 +22,6 @@ log "Starting jbang setup script." if [ -n "${GOOSE_PATH_ROOT:-}" ]; then RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" -elif [ -n "${GOOSE_CONFIG_DIR:-}" ]; then - log "GOOSE_CONFIG_DIR is deprecated for desktop shims; prefer GOOSE_PATH_ROOT." - RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" else RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" fi diff --git a/ui/desktop/src/bin/node-setup-common.sh b/ui/desktop/src/bin/node-setup-common.sh index 748dd63d4961..d9d55d5601da 100755 --- a/ui/desktop/src/bin/node-setup-common.sh +++ b/ui/desktop/src/bin/node-setup-common.sh @@ -25,9 +25,6 @@ log "Starting node setup (common)." if [ -n "${GOOSE_PATH_ROOT:-}" ]; then RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" -elif [ -n "${GOOSE_CONFIG_DIR:-}" ]; then - log "GOOSE_CONFIG_DIR is deprecated for desktop shims; prefer GOOSE_PATH_ROOT." - RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" else RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" fi diff --git a/ui/desktop/src/bin/uvx b/ui/desktop/src/bin/uvx index 369adadaa91e..3a9d5f7718d0 100755 --- a/ui/desktop/src/bin/uvx +++ b/ui/desktop/src/bin/uvx @@ -22,9 +22,6 @@ log "Starting uvx setup script." if [ -n "${GOOSE_PATH_ROOT:-}" ]; then RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_PATH_ROOT}/config" -elif [ -n "${GOOSE_CONFIG_DIR:-}" ]; then - log "GOOSE_CONFIG_DIR is deprecated for desktop shims; prefer GOOSE_PATH_ROOT." - RESOLVED_GOOSE_CONFIG_DIR="${GOOSE_CONFIG_DIR}" else RESOLVED_GOOSE_CONFIG_DIR="${HOME}/.config/goose" fi diff --git a/ui/desktop/src/recipe/recipe_management.ts b/ui/desktop/src/recipe/recipe_management.ts index 90c2108cc750..a47437de3878 100644 --- a/ui/desktop/src/recipe/recipe_management.ts +++ b/ui/desktop/src/recipe/recipe_management.ts @@ -46,10 +46,6 @@ export const getStorageDirectory = (isGlobal: boolean): string => { if (pathRoot) { return `${pathRoot}/config/recipes`; } - const configDir = window.appConfig.get('GOOSE_CONFIG_DIR') as string | undefined; - if (configDir) { - return `${configDir}/recipes`; - } return '~/.config/goose/recipes'; } else { // For directory recipes, build absolute path using working directory From 8cb223fe8a5c88eb3fc03d6fe702e87157d65134 Mon Sep 17 00:00:00 2001 From: Vadim Polulyakh Date: Thu, 19 Feb 2026 00:17:07 +0000 Subject: [PATCH 4/4] refactor(pr): reduce scope to desktop-only path changes Signed-off-by: Vadim Polulyakh --- recipe-scanner/scan-recipe.sh | 2 +- ui/desktop/src/main.ts | 12 ++---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/recipe-scanner/scan-recipe.sh b/recipe-scanner/scan-recipe.sh index 585880c2983f..31ee921f9a11 100755 --- a/recipe-scanner/scan-recipe.sh +++ b/recipe-scanner/scan-recipe.sh @@ -258,13 +258,13 @@ chmod -R 755 "$GOOSE_TMP" 2>/dev/null || true export XDG_STATE_HOME="$GOOSE_TMP/state" export XDG_CACHE_HOME="$GOOSE_TMP/cache" -export GOOSE_PATH_ROOT="$GOOSE_TMP" export GOOSE_TELEMETRY_ENABLED=false export GOOSE_PROJECT_TRACKER_ENABLED=false export RUST_LOG=error if [ -f "$HOME/.config/goose/config.yaml" ]; then cp "$HOME/.config/goose/config.yaml" "$GOOSE_TMP/config/config.yaml" 2>/dev/null || true + export GOOSE_CONFIG_DIR="$GOOSE_TMP/config" fi echo "✅ Goose environment configured" diff --git a/ui/desktop/src/main.ts b/ui/desktop/src/main.ts index 90aa6344cc43..39c716c7d426 100644 --- a/ui/desktop/src/main.ts +++ b/ui/desktop/src/main.ts @@ -439,14 +439,6 @@ const getBundledConfig = (): BundledConfig => { const { defaultProvider, defaultModel, predefinedModels, baseUrlShare, version } = getBundledConfig(); -const resolveGoosePathRoot = (): string | undefined => { - const pathRoot = process.env.GOOSE_PATH_ROOT?.trim(); - if (pathRoot) { - return expandTilde(pathRoot); - } - return undefined; -}; - const GENERATED_SECRET = crypto.randomBytes(32).toString('hex'); const getServerSecret = (settings: Settings): string => { @@ -464,7 +456,7 @@ let appConfig = { GOOSE_DEFAULT_MODEL: defaultModel, GOOSE_PREDEFINED_MODELS: predefinedModels, GOOSE_API_HOST: 'http://127.0.0.1', - GOOSE_PATH_ROOT: resolveGoosePathRoot(), + GOOSE_PATH_ROOT: process.env.GOOSE_PATH_ROOT, GOOSE_WORKING_DIR: '', // If GOOSE_ALLOWLIST_WARNING env var is not set, defaults to false (strict blocking mode) GOOSE_ALLOWLIST_WARNING: process.env.GOOSE_ALLOWLIST_WARNING === 'true', @@ -496,7 +488,7 @@ const createChat = async ( serverSecret, dir: dir || os.homedir(), env: { - GOOSE_PATH_ROOT: appConfig.GOOSE_PATH_ROOT as string | undefined, + GOOSE_PATH_ROOT: process.env.GOOSE_PATH_ROOT, }, externalGoosed: settings.externalGoosed, isPackaged: app.isPackaged,