fix(opencode): агенты — в <worktree>/.opencode/agent, OPENCODE_CONFIG_DIR больше не выставляем
OPENCODE_CONFIG_DIR в opencode v1.18.18 перенаправляет Global.Path.config (global.ts: config = OPENCODE_CONFIG_DIR ?? ~/.config/opencode), из-за чего глобальный конфиг (модель/провайдеры, напр. tokentool) не загружался и opencode уходил в fallback-модель. Агенты открывались, т.к. OPENCODE_CONFIG_DIR дополнительно сканируется как каталог для agent/*.md. Теперь агенты распаковываются в <worktree>/.opencode/agent/*.md, где opencode находит их через project-каталог .opencode (paths.ts, cwd=worktree). Глобальный конфиг не трогаем вовсе. - internal/opencode: удалены Server.ConfigDir/Pool.ConfigDir и env OPENCODE_CONFIG_DIR - internal/config: удалено поле OpenCodeCfg.ConfigDir (config_dir) - internal/app: ensureAgentsDir пишет в <worktree>/.opencode/agent - internal/agents: WriteTo(dir) → dir/agent/*.md - README/config.yaml.example/memory обновлены
This commit is contained in:
@@ -157,7 +157,6 @@ func New(configPath, version, updateToken string, noUI bool) (*App, error) {
|
||||
ocPool := opencode.NewPool(cfg.Paths.Worktree)
|
||||
ocPool.Bin = cfg.OpenCode.Bin
|
||||
ocPool.Config = cfg.OpenCode.Config
|
||||
ocPool.ConfigDir = cfg.OpenCode.ConfigDir
|
||||
ocPool.DBPath = cfg.OpenCode.DBPath
|
||||
ocPool.Host = cfg.OpenCode.Serve.Hostname
|
||||
ocPool.BasePort = cfg.OpenCode.Serve.Port
|
||||
@@ -665,23 +664,21 @@ func (a *App) handleUpdateCmd(ctx context.Context, uid chat.UserID) {
|
||||
// сюда не возвращаемся — SwapAndRestart завершил процесс (os.Exit)
|
||||
}
|
||||
|
||||
// ensureAgentsDir определяет каталог с агентами opencode и распаковывает
|
||||
// туда встроенных агентов (go:embed). Если config_dir не задан — использует
|
||||
// ./agents рядом с бинарём. Встроенные агенты перезаписываются (всегда актуальны).
|
||||
// ensureAgentsDir распаковывает встроенных агентов opencode (go:embed) в
|
||||
// project-каталог <worktree>/.opencode/agent/*.md. opencode при serve (cwd =
|
||||
// worktree) обнаруживает .opencode поднятием вверх (paths.ts) и сам находит
|
||||
// агентов. Глобальный конфиг opencode (модель/провайдеры) не трогаем и
|
||||
// OPENCODE_CONFIG_DIR не выставляем.
|
||||
//
|
||||
// idempotent: вызывается только из New.
|
||||
func ensureAgentsDir(cfg *config.Config) error {
|
||||
if cfg.OpenCode.ConfigDir == "" {
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return fmt.Errorf("resolve executable: %w", err)
|
||||
}
|
||||
// ./agents рядом с бинарём
|
||||
cfg.OpenCode.ConfigDir = filepath.Join(filepath.Dir(exe), "agents")
|
||||
if cfg.Paths.Worktree == "" {
|
||||
return fmt.Errorf("paths.worktree не задан — некуда раскладывать агентов")
|
||||
}
|
||||
if err := agents.WriteTo(cfg.OpenCode.ConfigDir); err != nil {
|
||||
return fmt.Errorf("write agents to %s: %w", cfg.OpenCode.ConfigDir, err)
|
||||
base := filepath.Join(cfg.Paths.Worktree, ".opencode")
|
||||
if err := agents.WriteTo(base); err != nil {
|
||||
return fmt.Errorf("write agents to %s: %w", base, err)
|
||||
}
|
||||
log.Printf("app: agents ensured in %s", cfg.OpenCode.ConfigDir)
|
||||
log.Printf("app: agents ensured in %s", base)
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user