feat(config): general to glm-5.2, add vision agent, drop plan model #100

Merged
slaid098 merged 5 commits from feat/config/glm-vision-agent into main 2026-08-17 17:05:17 +03:00
Owner

Что сделано

  • .opencode/opencode.json (секция agent):
    • Удалена запись plan (primary-агент теперь без явной модели — наследует глобальную из UI).
    • general.model → ollama-cloud/glm-5.2 (было deepseek-v4-pro); остальные поля general без изменений (steps: 150, permission.task, tools).
    • В permission.task у general и reviewer добавлено "vision": "allow" после "scout": "allow" → {"*": "deny", "explore": "allow", "scout": "allow", "vision": "allow"}.
    • Добавлен новый агент vision: model: ollama-cloud/minimax-m3, hidden: true, permission.task с explore/scout allow, tools все write-опции в false (commit/create_pr/create_issue/merge_pr/post_review).
    • reviewer, explore, scout, memory-syncer — без изменений.
  • .opencode/agents/vision.md (новый файл, по паттерну reviewer.md):
    • frontmatter: description, mode: subagent, temperature: 0.1, steps: 150, hidden: true, permission с edit: deny, doom_loop: deny, bash read-only allow-список (скопирован из reviewer.md, БЕЗ curl к Forgejo API — vision не работает с PR/issue).
    • body: краткий протокол на русском — получить изображение (скриншот через antidetect-browser MCP или Read файла) → проанализировать → вернуть текстовый вердикт; не коммитить/не редактировать; делегирование через explore/scout.
  • AGENTS.md: добавлена секция «Зрение» (универсальное правило, без привязки к моделям) после «Code Style» / перед «Config Edits».
  • tests/test_permissions.py:
    • test_agents_have_models: убран plan, добавлен vision.
    • test_agent_models_exact: убран plan; general → glm-5.2; добавлен vision → minimax-m3.
    • test_general_reviewer_task_permissions: ожидает {"*": "deny", "explore": "allow", "scout": "allow", "vision": "allow"} для general и reviewer.
    • Новый test_vision_readonly_and_hidden: проверяет tools (все false), hidden: true в JSON и permission.edit == "deny", permission.doom_loop == "deny" в vision.md frontmatter.
  • tests/test_agent_frontmatter.py: vision.md добавлен в AGENT_FILES; счётчики «All 2»/«all 2» → «All 3»/«all 3».

Почему

После PR #98 (per-agent models + task delegation) сложилась картина: основные кодинг-модели text-only, зрение есть только у minimax-m3. Пользователь хочет:

  1. Переключить general (кодинг) с deepseek-v4-pro на glm-5.2 — предпочтение по качеству кода.
  2. Добавить отдельный сабагент vision на minimax-m3 (image+video+text) для любых задач со зрением — скриншоты, анализ UI, проверка браузера на сайтах-детекторах бот-защиты. Архитектурно оправдано: зрение нужно редко; vision-модель не расходует токены основных моделей.
  3. Убрать model у plan (primary-агент) — модель plan'а выбирается в UI под задачу, не фиксируется в конфиге (документированное поведение opencode: primary без явной модели наследует глобальную).

reviewer/explore/scout/memory-syncer — без изменений (инварианты issue).

Watch out

  • vision с hidden: true не виден в @-меню, но вызывается через task. permission.task у general/reviewer разрешает vision (добавлено allow); у explore/scout намеренно НЕ добавлено (read-only исследователи, зрение им без надобности — отдельная задача, если понадобится).
  • Делегирование vision → explore/scout разрешено; vision → general/reviewer/memory-syncer запрещено ("*": "deny").
  • vision.md bash allow-список скопирован из reviewer.md, но убран curl к Forgejo API (vision не работает с PR/issue) и убраны serena/pipeline-status/spec-status deny-правила (оставлен только базовый read-only набор + git read-only).
  • MCP-тулы (antidetect-browser, serena, context7) НЕ перечислены в tools vision — управляются через permission (по умолчанию все MCP включены у всех агентов; vision использует antidetect-browser для скриншотов).
  • Модели glm-5.2, minimax-m3, deepseek-v4-pro — встроенные в opencode 1.18.18, регистрация в секции provider не нужна.

Pending

—

Closes #99

## Что сделано - **`.opencode/opencode.json`** (секция `agent`): - Удалена запись `plan` (primary-агент теперь без явной модели — наследует глобальную из UI). - `general.model` → `ollama-cloud/glm-5.2` (было `deepseek-v4-pro`); остальные поля `general` без изменений (`steps: 150`, `permission.task`, `tools`). - В `permission.task` у `general` и `reviewer` добавлено `"vision": "allow"` после `"scout": "allow"` → `{"*": "deny", "explore": "allow", "scout": "allow", "vision": "allow"}`. - Добавлен новый агент `vision`: `model: ollama-cloud/minimax-m3`, `hidden: true`, `permission.task` с `explore`/`scout` allow, `tools` все write-опции в `false` (commit/create_pr/create_issue/merge_pr/post_review). - `reviewer`, `explore`, `scout`, `memory-syncer` — без изменений. - **`.opencode/agents/vision.md`** (новый файл, по паттерну `reviewer.md`): - frontmatter: `description`, `mode: subagent`, `temperature: 0.1`, `steps: 150`, `hidden: true`, `permission` с `edit: deny`, `doom_loop: deny`, `bash` read-only allow-список (скопирован из `reviewer.md`, БЕЗ curl к Forgejo API — vision не работает с PR/issue). - body: краткий протокол на русском — получить изображение (скриншот через antidetect-browser MCP или Read файла) → проанализировать → вернуть текстовый вердикт; не коммитить/не редактировать; делегирование через explore/scout. - **`AGENTS.md`**: добавлена секция «Зрение» (универсальное правило, без привязки к моделям) после «Code Style» / перед «Config Edits». - **`tests/test_permissions.py`**: - `test_agents_have_models`: убран `plan`, добавлен `vision`. - `test_agent_models_exact`: убран `plan`; `general` → `glm-5.2`; добавлен `vision` → `minimax-m3`. - `test_general_reviewer_task_permissions`: ожидает `{"*": "deny", "explore": "allow", "scout": "allow", "vision": "allow"}` для general и reviewer. - Новый `test_vision_readonly_and_hidden`: проверяет `tools` (все false), `hidden: true` в JSON и `permission.edit == "deny"`, `permission.doom_loop == "deny"` в `vision.md` frontmatter. - **`tests/test_agent_frontmatter.py`**: `vision.md` добавлен в `AGENT_FILES`; счётчики «All 2»/«all 2» → «All 3»/«all 3». ## Почему После PR #98 (per-agent models + task delegation) сложилась картина: основные кодинг-модели text-only, зрение есть только у `minimax-m3`. Пользователь хочет: 1. Переключить `general` (кодинг) с `deepseek-v4-pro` на `glm-5.2` — предпочтение по качеству кода. 2. Добавить отдельный сабагент `vision` на `minimax-m3` (image+video+text) для любых задач со зрением — скриншоты, анализ UI, проверка браузера на сайтах-детекторах бот-защиты. Архитектурно оправдано: зрение нужно редко; vision-модель не расходует токены основных моделей. 3. Убрать `model` у `plan` (primary-агент) — модель plan'а выбирается в UI под задачу, не фиксируется в конфиге (документированное поведение opencode: primary без явной модели наследует глобальную). `reviewer`/`explore`/`scout`/`memory-syncer` — без изменений (инварианты issue). ## Watch out - `vision` с `hidden: true` не виден в @-меню, но вызывается через `task`. `permission.task` у `general`/`reviewer` разрешает `vision` (добавлено `allow`); у `explore`/`scout` намеренно НЕ добавлено (read-only исследователи, зрение им без надобности — отдельная задача, если понадобится). - Делегирование `vision → explore/scout` разрешено; `vision → general/reviewer/memory-syncer` запрещено (`"*": "deny"`). - `vision.md` bash allow-список скопирован из `reviewer.md`, но убран curl к Forgejo API (vision не работает с PR/issue) и убраны serena/pipeline-status/spec-status deny-правила (оставлен только базовый read-only набор + git read-only). - MCP-тулы (antidetect-browser, serena, context7) НЕ перечислены в `tools` vision — управляются через `permission` (по умолчанию все MCP включены у всех агентов; vision использует antidetect-browser для скриншотов). - Модели `glm-5.2`, `minimax-m3`, `deepseek-v4-pro` — встроенные в opencode 1.18.18, регистрация в секции `provider` не нужна. ## Pending — Closes #99
style(tests): ruff format vision test assertion
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 6s
CI / bootstrap (pull_request) Successful in 10s
Permission Security Check / check (pull_request) Successful in 11s
CI / complexity (pull_request) Successful in 32s
CI / lint (pull_request) Successful in 33s
CI / typecheck (pull_request) Successful in 33s
CI / test (3.13) (pull_request) Successful in 1m46s
dc6a5094e9
Author
Owner

Code Review Summary

PR добавляет агента vision (minimax-m3, hidden, read-only), переключает general на glm-5.2, удаляет plan (primary наследует глобальную модель), добавляет универсальное правило «Зрение» в AGENTS.md. Все 34 теста проходят, check-permissions.py exit 0, cross-file impact безопасен (нет readers для plan/deepseek-v4-pro).

Positives

  • opencode.json — корректная структура: vision с hidden: true, permission.task (explore/scout allow, *: deny), tools все write-опции в false. general/reviewer permission.task обновлены с vision: allow (last-match-wins сохранён).
  • vision.md — frontmatter валиден: edit: deny, doom_loop: deny (внутри permission:), mode: subagent, temperature: 0.1, steps: 150, hidden: true. Bash allow-list корректно скопирован из reviewer.md без curl к Forgejo API (vision не работает с PR/issue).
  • AGENTS.md — секция «Зрение» универсальна (без привязки к моделям), размещена логично (после Code Style, перед Config Edits).
  • Тесты — test_vision_readonly_and_hidden покрывает JSON tools/hidden + frontmatter permission.edit/doom_loop. test_agent_frontmatter.py корректно обновил счётчики «2»→«3» и AGENT_FILES. test_agents_have_models/test_agent_models_exact/test_general_reviewer_task_permissions обновлены под новый набор агентов.
  • Cross-file impact — rg по .opencode/scripts/ и tests/ не нашёл readers, ссылающихся на plan agent или deepseek-v4-pro для general. pipeline-status.py:NEXT_ACTIONS упоминает только general/reviewer/memory-syncer (не переименованы). Удаление plan и смена модели general безопасны.
  • PR body — ## Что сделано/## Почему/## Watch out/## Pending заполнены осмысленно, Closes #99 привязан.

Suggestions (info, not blocking)

  • vision.md:59 [security] "python3*": allow без deny-правил для oracle-скриптов (pipeline-status.py, spec-status.py, project-status.py). В reviewer.md:63-72 есть явные deny-правила — у vision их нет. Риск ниже (vision не работает с пайплайнами), но потенциально vision может запустить oracle-скрипт через bash. Fix: добавить "python3 *pipeline-status.py*": deny и аналоги для spec-status.py/project-status.py (6 правил, как в reviewer.md:63-72).
  • tests/test_permissions.py:369 [docs] Docstring говорит «All 5 subagents», но цикл for name in ("explore", "scout", "general", "reviewer", "memory-syncer", "vision") проверяет 6. Fix: «All 6 subagents».
  • tests/test_permissions.py:431-469 [duplication] _parse_frontmatter/_parse_yaml_block дублируются из test_agent_frontmatter.py (задокументировано в комментарии «Mirrors the parser in test_agent_frontmatter.py»). Fix (опционально): вынести в conftest.py или общий helper-модуль, чтобы избежать двух копий ~40 строк.
  • vision.md [style] Нет trailing newline (соответствует reviewer.md/memory-syncer.md — не блокирующее, minor consistency).
  • opencode.json:475-481 [info] У vision нет serena_*: false в tools (в отличие от memory-syncer:462). PR body объясняет: vision использует MCP-тулы (antidetect-browser для скриншотов), Serena по умолчанию включена. Разумное проектное решение — не блокирующее.

Verdict: APPROVE

## Code Review Summary PR добавляет агента `vision` (minimax-m3, hidden, read-only), переключает `general` на `glm-5.2`, удаляет `plan` (primary наследует глобальную модель), добавляет универсальное правило «Зрение» в `AGENTS.md`. Все 34 теста проходят, `check-permissions.py` exit 0, cross-file impact безопасен (нет readers для `plan`/`deepseek-v4-pro`). ### Positives - **opencode.json** — корректная структура: `vision` с `hidden: true`, `permission.task` (explore/scout allow, `*: deny`), `tools` все write-опции в `false`. `general`/`reviewer` `permission.task` обновлены с `vision: allow` (last-match-wins сохранён). - **vision.md** — frontmatter валиден: `edit: deny`, `doom_loop: deny` (внутри `permission:`), `mode: subagent`, `temperature: 0.1`, `steps: 150`, `hidden: true`. Bash allow-list корректно скопирован из `reviewer.md` без curl к Forgejo API (vision не работает с PR/issue). - **AGENTS.md** — секция «Зрение» универсальна (без привязки к моделям), размещена логично (после Code Style, перед Config Edits). - **Тесты** — `test_vision_readonly_and_hidden` покрывает JSON `tools`/`hidden` + frontmatter `permission.edit`/`doom_loop`. `test_agent_frontmatter.py` корректно обновил счётчики «2»→«3» и `AGENT_FILES`. `test_agents_have_models`/`test_agent_models_exact`/`test_general_reviewer_task_permissions` обновлены под новый набор агентов. - **Cross-file impact** — `rg` по `.opencode/scripts/` и `tests/` не нашёл readers, ссылающихся на `plan` agent или `deepseek-v4-pro` для `general`. `pipeline-status.py:NEXT_ACTIONS` упоминает только `general`/`reviewer`/`memory-syncer` (не переименованы). Удаление `plan` и смена модели `general` безопасны. - **PR body** — `## Что сделано`/`## Почему`/`## Watch out`/`## Pending` заполнены осмысленно, `Closes #99` привязан. ### Suggestions (info, not blocking) - **vision.md:59** [security] `"python3*": allow` без deny-правил для oracle-скриптов (`pipeline-status.py`, `spec-status.py`, `project-status.py`). В `reviewer.md:63-72` есть явные deny-правила — у `vision` их нет. Риск ниже (vision не работает с пайплайнами), но потенциально vision может запустить oracle-скрипт через bash. Fix: добавить `"python3 *pipeline-status.py*": deny` и аналоги для `spec-status.py`/`project-status.py` (6 правил, как в `reviewer.md:63-72`). - **tests/test_permissions.py:369** [docs] Docstring говорит «All 5 subagents», но цикл `for name in ("explore", "scout", "general", "reviewer", "memory-syncer", "vision")` проверяет 6. Fix: «All 6 subagents». - **tests/test_permissions.py:431-469** [duplication] `_parse_frontmatter`/`_parse_yaml_block` дублируются из `test_agent_frontmatter.py` (задокументировано в комментарии «Mirrors the parser in ``test_agent_frontmatter.py``»). Fix (опционально): вынести в `conftest.py` или общий helper-модуль, чтобы избежать двух копий ~40 строк. - **vision.md** [style] Нет trailing newline (соответствует `reviewer.md`/`memory-syncer.md` — не блокирующее, minor consistency). - **opencode.json:475-481** [info] У `vision` нет `serena_*: false` в `tools` (в отличие от `memory-syncer:462`). PR body объясняет: vision использует MCP-тулы (antidetect-browser для скриншотов), Serena по умолчанию включена. Разумное проектное решение — не блокирующее. ### Verdict: APPROVE
slaid098 deleted branch feat/config/glm-vision-agent 2026-08-17 17:05:18 +03:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/opencode-config!100
No description provided.