From ce9270623de03881f8ae7327f6420e3fee649a71 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Wed, 14 Oct 2026 18:02:37 +0200 Subject: [PATCH] =?UTF-8?q?fix(opencode):=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=B8=D1=88=D0=BD=D1=8F=D1=8F=20=D1=81=D1=81?= =?UTF-8?q?=D1=8B=D0=BB=D0=BA=D0=B0=20~/.config/opencode/skills?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: opencode сам читает ~/.agents/skills и ~/.claude/skills. Ссылка загружала тот же набор третий раз, и opencode выдавал сотни предупреждений о повторяющихся именах скиллов. - Что: install.sh больше не создаёт ссылку и удаляет прежнюю, если она указывает на общие скиллы. README и AGENTS.md обновлены. - Проверка: tests/test_install.sh проходит. После удаления ссылки opencode debug skill показывает тот же набор скиллов, теперь из ~/.agents/skills. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 2 +- README.md | 4 ++-- install.sh | 12 ++++++++++-- tests/test_install.sh | 4 +++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 22a2138..a8f7347 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -28,7 +28,7 @@ This repository contains personal dotfiles and configurations for a highly produ * **Gemini CLI:** Configured via `gemini/.gemini/`. * **Policies:** `readonly-commands.toml` allows critical commands like `git status`, `git diff`, and `git add` to run without confirmation. * **Opencode:** MCP-based assistant configuration (`opencode.json`) with support for documentation, search, and web-reading. -* **Skill Bridges:** Symlinks are used to share skills across Claude and Opencode. +* **Skill Bridges:** Claude gets skills via the `~/.claude/skills` symlink; Opencode reads `~/.agents/skills` natively, no bridge needed. ## 🚀 Usage & Maintenance diff --git a/README.md b/README.md index b40179d..5a0d778 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Chezmoi использует отдельный source dir `chezmoi/` внутр | `vscode` | `server-env-setup` для VS Code Server в WSL: секреты + авто-прокси | | `chatgpt` | Отдельный ярлык `ChatGPT Proxy` с запретом прямого запуска при ошибке | -`install.sh` дополнительно настраивает opencode (симлинки, MCP-конфиг), claude (симлинк `~/.claude/skills` на общие скиллы) и подключает bash_custom. +`install.sh` дополнительно настраивает opencode (MCP-конфиг), claude (симлинк `~/.claude/skills` на общие скиллы) и подключает bash_custom. ### Windows (chezmoi) @@ -77,7 +77,7 @@ Chezmoi использует отдельный source dir `chezmoi/` внутр |------------|-------------------| | **Agents** | Каноничное хранилище скиллов: `~/.agents/skills//SKILL.md` | | **Claude** | `~/.claude/skills` -> симлинк на agents; настройки (`settings.json`, `settings.local.json`) - управляются Claude Code на машине; в `settings.json` один раз добавляется блок `env` с прокси | -| **[Opencode](https://github.com/anomalyco/opencode)** | MCP-серверы (context7, web-reader, playwright и др.), `~/.config/opencode/skills` -> симлинк на agents | +| **[Opencode](https://github.com/anomalyco/opencode)** | MCP-серверы (context7, web-reader, playwright и др.); скиллы opencode сам читает из `~/.agents/skills` | | **Codex** | `~/.codex` - обычный каталог, управляется Codex; скиллы - из общего хранилища agents; `~/.codex/.env` - прокси по умолчанию, если файла ещё нет | | **Gemini** | Политики для CLI: pre-approved readonly команды | diff --git a/install.sh b/install.sh index c6ae014..3facfb9 100755 --- a/install.sh +++ b/install.sh @@ -452,8 +452,16 @@ if [ -L "$OPENCODE_DIR/agents" ]; then esac fi -if [ -d "$SKILLS_SRC" ]; then - ensure_symlink "$SKILLS_SRC" "$OPENCODE_DIR/skills" +# Скиллы opencode сам берёт из ~/.agents/skills и ~/.claude/skills. Прежняя +# ссылка ~/.config/opencode/skills загружала тот же набор ещё раз, и opencode +# сыпал предупреждениями о дублях. Чистим её. +if [ -L "$OPENCODE_DIR/skills" ]; then + case "$(readlink "$OPENCODE_DIR/skills" 2>/dev/null || true)" in + "$SKILLS_SRC"*) + rm "$OPENCODE_DIR/skills" + info "Удалён лишний симлинк ~/.config/opencode/skills" + ;; + esac fi if [ -f "$OPENCODE_JSON_SRC" ]; then diff --git a/tests/test_install.sh b/tests/test_install.sh index f7015d5..72b3425 100755 --- a/tests/test_install.sh +++ b/tests/test_install.sh @@ -575,12 +575,14 @@ test_opencode_runtime_dir_is_preserved_and_config_is_managed() { EOF # Артефакт прежнего установщика: симлинк на удалённые профили агентов ln -s "$repo_root/opencode/.config/opencode/agents" "$home_dir/.config/opencode/agents" + # Лишняя ссылка на общие скиллы: opencode и так читает ~/.agents/skills + ln -s "$repo_root/agents/.agents/skills" "$home_dir/.config/opencode/skills" run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >/tmp/test-install.out [ -f "$home_dir/.config/opencode/package.json" ] || fail "Expected opencode runtime files to be preserved" assert_not_exists "$home_dir/.config/opencode/agents" - [ -L "$home_dir/.config/opencode/skills" ] || fail "Expected ~/.config/opencode/skills symlink" + assert_not_exists "$home_dir/.config/opencode/skills" assert_file_contains "$home_dir/.config/opencode/opencode.json" '"$schema": "https://opencode.ai/config.json"' assert_file_contains "$home_dir/.config/opencode/permission-reviewer.jsonc" '"confidenceThreshold"'