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 обновлены
39 lines
1.6 KiB
Go
39 lines
1.6 KiB
Go
// Package agents — встроенные агенты opencode (analyst, dev, ...).
|
||
//
|
||
// Агенты зашиты в бинарь через go:embed и распаковываются при запуске
|
||
// в project-каталог <worktree>/.opencode/agent/*.md. opencode при serve
|
||
// (cwd = worktree) обнаруживает .opencode поднятием вверх (ConfigPaths) и
|
||
// находит агентов по шаблону {agent,agents}/**/*.md. Глобальный конфиг
|
||
// opencode остаётся нетронутым (OPENCODE_CONFIG_DIR не выставляем).
|
||
package agents
|
||
|
||
import (
|
||
"embed"
|
||
"path/filepath"
|
||
)
|
||
|
||
//go:embed *.md
|
||
var FS embed.FS
|
||
|
||
// Names — имена распаковываемых агентов (файлы *.md, без .md).
|
||
//
|
||
// Держим в курсе: если добавить файл в каталог, он автоматически попадёт
|
||
// в FS, но для детерминированной распаковки список лучше дополнять здесь.
|
||
var Names = []string{"analyst", "dev", "reviewer", "chat", "postmortem"}
|
||
|
||
// WriteTo распаковывает всех встроенных агентов в каталог dir/agent
|
||
// (создаёт его). Файлы перезаписываются — встроенная копия всегда актуальна.
|
||
func WriteTo(dir string) error {
|
||
agentsDir := filepath.Join(dir, "agent")
|
||
for _, name := range Names {
|
||
data, err := FS.ReadFile(name + ".md")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if err := writeFile(agentsDir, name+".md", data); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|