When decisions depend on environment/provider/backend/config, resolve them once using shared, centralized helpers, then pass the resolved value downstream. Avoid duplicated “mini re-resolvers” that can drift.
Practical rules:
Example (precedence + negatable CLI):
// Use option value source so negatable defaults don't clobber env fallback.
const mouse = (authCmd.getOptionValueSource("mouse") === "cli")
? authCmd.opts().mouse
: undefined;
const useMouse = input.mouse ?? (process.env.CLINE_NO_MOUSE !== "1" && process.env.CLINE_MOUSE !== "0");
Example (resolve once + pass through):
// Resolve backend->app base URL once (with shared helper), then build links from that exact value.
const apiBaseUrl = resolveBackendOnce(/* provider + env */);
const appBaseUrl = resolveClineAppBaseUrl(apiBaseUrl); // shared
return { privacySettingsUrl: appBaseUrl ? `${appBaseUrl}/privacy` : undefined };