Плагин на хуке `context` запоминает скилы, загруженные в сессии (в ctx.storage), и после завершённой compaction возвращает в системный промпт тексты тех, что были загружены до неё и не загружены заново. Один раз на compaction пишет в чат служебное сообщение (без хода модели) и строку в log/skill-compact-resurrect.log. Опции: maxRestoredSkills, notify.
skill-compact-resurrect
Плагин для OpenCode 2. Когда сессия переживает compaction, скилы, загруженные до неё, пропадают из контекста: сводка их не содержит, а модель об этом не знает и продолжает работать без инструкций скила. Плагин возвращает эти скилы в системный промпт сразу после compaction.
Как работает
Скил попадает в сессию двумя путями: модель вызывает тул skill ({ id }) и получает текст скила
результатом тула, или пользователь вызывает скил сам — тогда в истории появляется сообщение типа skill.
Compaction заменяет всё это сводкой.
Плагин висит на хуке context, который срабатывает перед каждым запросом к модели:
- Читает текущий контекст сессии (
session.context) и запоминает имена всех загруженных скилов. Список хранится вctx.storage, поэтому переживает перезапуск OpenCode. Повторный вызов скила переносит его в конец списка, как самый свежий. - Если в контексте есть завершённая compaction, добавляет в системный промпт этого запроса тексты скилов, загруженных до неё и не загруженных заново после.
Сами скилы в историю не пишутся: они живут в системном промпте до следующей compaction, а после неё возвращаются снова. Скил, который модель загрузила повторно, не дублируется. Если скил с тех пор удалили или переименовали, плагин об этом скажет.
Системный промпт в интерфейсе не виден, поэтому один раз на каждую compaction плагин:
- пишет в чат короткое служебное сообщение — «♻ После compaction восстановлены скилы: …». Ход модели оно
не запускает (
resume: false); - добавляет строку в
$XDG_DATA_HOME/opencode/log/skill-compact-resurrect.log.
Установка
Положить ссылку на файл в plugins/ конфига OpenCode — он подхватывает такие файлы сам:
ln -sfn "$PWD/skill-compact-resurrect.v2.ts" "${XDG_CONFIG_HOME:-$HOME/.config}/opencode/plugins/"
В "plugin" в opencode.jsonc его не добавлять: имя там считается npm-пакетом. Изменения в файле
применяются после перезапуска OpenCode.
Опции
Задаются в opencode.jsonc: "plugins": { "package": "<путь>", "options": { … } }.
| Опция | По умолчанию | Что |
|---|---|---|
maxRestoredSkills |
все | сколько последних скилов возвращать |
notify |
true |
писать ли сообщение в чат |
Проверка
После compaction в сессии, где загружались скилы, в чате должно появиться сообщение «♻ После compaction восстановлены скилы: …», а в журнале — строка вида:
2026-10-29T12:00:00.000Z ses_… after msg_…: restored [bmad-build, bmad-spec]
Нет ни того, ни другого — проверить, что ссылка на плагин лежит в plugins/ нужного конфига (того, что
OpenCode получает в XDG_CONFIG_HOME).
Требуется OpenCode 2 (API плагинов v2: ctx.session.hook, ctx.session.context, ctx.session.synthetic,
ctx.skill, ctx.storage). Проверено на 2.1.3.