diff --git a/lib/main.dart b/lib/main.dart index 2496bf5f..c4f72141 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -58,6 +58,7 @@ import 'package:clide/src/editor/registry.dart' show EditorRegistry; import 'package:clide/src/git/client.dart'; import 'package:clide/src/cli/argv_dispatch.dart'; import 'package:clide/src/env/shell_env.dart' show primeLoginShellPath; +import 'package:clide/src/env/supporter_binaries.dart'; import 'package:clide/src/ipc/envelope.dart'; import 'package:clide/src/ipc/mcp_server.dart'; import 'package:clide/src/ipc/paths.dart' show workspaceSocketPath, logDirectory; @@ -114,6 +115,13 @@ Future main() async { await primeLoginShellPath(); final bootSettings = SettingsStore(appDir: appDir); await bootSettings.load(); + // Resolve external supporter binaries (claude, d2, …) — explicit user-scope + // overrides first, else the primed PATH + the well-known dirs; auto-detect + // and pin them on first run (T-495, D-104). + activeSupporterBinaries = await loadSupporterBinaries( + readOverrides: () => bootSettings.get(supporterToolsKey), + writeOverrides: (m) => bootSettings.set(supporterToolsKey, m), + ); startupWorkRoot = resolveStartupWorkspace( cwdRoot: startupWorkRoot, lastProject: bootSettings.get('app.lastProject'), diff --git a/lib/src/env/supporter_binaries.dart b/lib/src/env/supporter_binaries.dart index cfd44cc1..a1755df9 100644 --- a/lib/src/env/supporter_binaries.dart +++ b/lib/src/env/supporter_binaries.dart @@ -92,6 +92,11 @@ class SupporterBinaries { bool _fileExists(String p) => File(p).existsSync(); +/// The process-wide resolver, wired at boot via [loadSupporterBinaries]. Tool +/// consumers (e.g. the d2 template, T-494) read it to resolve a binary; null in +/// headless contexts where boot wiring hasn't run. +SupporterBinaries? activeSupporterBinaries; + /// The user-scope SettingsStore key (app layer, `~/.clide`, per-machine) holding /// the tool→absolute-path override map. const supporterToolsKey = 'app.tools';