Compare commits

..
4 Commits
Author SHA1 Message Date
Dmitry Dementiev 54467a2888 fix(opencode): запрещено чтение ключей и секретов через bash
- Зачем: allow-правило "cat *" в safe-агентах пропускало чтение
  ~/.ssh/*, ~/.env.secrets и подобного без ask, мимо ревьюера.
- Что: deny-паттерны на .ssh, id_rsa/id_ed25519, .pem, shadow, .env*,
  *.secrets*, .netrc в safe-build и safe-plan; .env.example оставлен allow.
  Префиксные паттерны — заслон от буквальных случаев; обход через
  интерпретаторы остаётся на ревьюере (он видит содержимое скриптов).
- Проверка: прогон cat ~/.ssh/config → Permission denied до выполнения,
  содержимое в вывод не попало.
2026-10-06 16:52:23 +03:00
Dmitry Dementiev eca939b835 chore(bash): добавлен OPENCODE_API_KEY в шаблон secrets
- Зачем: ключ Zen нужен ревьюеру разрешений Jev в окружении процесса
  opencode; ZAI больше не используется.
- Что: добавлен закомментированный export OPENCODE_API_KEY с пояснением;
  убран ZAI_API_KEY; зафиксировано комментирование CONTEXT7_API_KEY
  из рабочего дерева.
- Проверка: ещё не выполнена; ключ появится после заведения в Zen.
2026-10-06 16:41:05 +03:00
Dmitry Dementiev 22c4fcd710 chore(opencode): permission-reviewer.jsonc исключён из stow-линковки
- Зачем: плагин читает конфиг с O_NOFOLLOW и молча игнорирует симлинк
  (проверено doctor: со слинкованным файлом применяются дефолты).
- Что: добавлен .stow-local-ignore; файл деплоится копией в
  ~/.config/opencode/, репозиторий остаётся источником истины.
- Проверка: doctor видит файл и применяет model=deepseek/deepseek-flash.
2026-10-06 15:47:57 +03:00
Dmitry Dementiev 2868ba07af feat(opencode): подключён плагин opencode-permission-reviewer для V2
- Зачем: каждый ask-запрос требовал ручного подтверждения; плагин
  пропускает безопасные действия через модель-ревьюер, остальное эскалирует.
- Что: добавлена запись плагина в plugins (V2-формат) и доверенный конфиг
  permission-reviewer.jsonc (ревьюер deepseek/deepseek-flash, variant none).
- Проверка: сквозной прогон opencode run — printf hello автоодобрен
  ревьюером (risk low, confidence 0.98), запись в audit jsonl появилась.
2026-10-06 15:44:19 +03:00
6 changed files with 63 additions and 5 deletions

No files matched your search

+4 -2
View File
@@ -3,7 +3,7 @@
# Context7 API (https://context7.com)
# Используется для поиска документации библиотек
export CONTEXT7_API_KEY="your_context7_api_key_here"
#export CONTEXT7_API_KEY="your_context7_api_key_here"
# Z.AI API (https://z.ai)
# Используется для:
@@ -11,4 +11,6 @@ export CONTEXT7_API_KEY="your_context7_api_key_here"
# - Поиска в интернете (web-search-prime)
# - Чтения веб-страниц (web-reader)
# - Чтения GitHub репозиториев (zread)
export ZAI_API_KEY="your_zai_api_key_here"
# OpenCode Zen API — модель Jev для ревьюера разрешений (opencode-permission-reviewer)
#export OPENCODE_API_KEY=...
@@ -67,6 +67,19 @@ permission:
# push вообще запрещаем
"git push*": deny
# ключи и секреты не читаем даже по прямой просьбе
"*/.ssh/*": deny
"*id_rsa*": deny
"*id_ed25519*": deny
"*.pem": deny
"*shadow*": deny
"*.env": deny
"*.env.*": deny
"*.secrets*": deny
"*.netrc*": deny
# а примеры env-файлов читать можно
"*.env.example": allow
---
You are a build agent.
@@ -62,6 +62,19 @@ permission:
"git rebase*": deny
"git stash*": deny
"git push*": deny
# ключи и секреты не читаем даже по прямой просьбе
"*/.ssh/*": deny
"*id_rsa*": deny
"*id_ed25519*": deny
"*.pem": deny
"*shadow*": deny
"*.env": deny
"*.env.*": deny
"*.secrets*": deny
"*.netrc*": deny
# а примеры env-файлов читать можно
"*.env.example": allow
"git pull*": deny
"git fetch*": deny
+20 -3
View File
@@ -1,5 +1,11 @@
{
"$schema": "https://opencode.ai/config.json",
"plugins": [
{
"package": "opencode-permission-reviewer@^2.4.0",
"options": {}
}
],
"default_agent": "safe-plan",
"permission": {
"write": "ask",
@@ -24,7 +30,11 @@
},
"searxng": {
"type": "local",
"command": ["npx", "-y", "mcp-searxng"],
"command": [
"npx",
"-y",
"mcp-searxng"
],
"environment": {
"SEARXNG_URL": "http://localhost:26745"
},
@@ -32,12 +42,19 @@
},
"playwright": {
"type": "local",
"command": ["npx", "-y", "@playwright/mcp@latest"],
"command": [
"npx",
"-y",
"@playwright/mcp@latest"
],
"enabled": false
},
"duckduckgo": {
"type": "local",
"command": ["uvx", "duckduckgo-mcp-server"],
"command": [
"uvx",
"duckduckgo-mcp-server"
],
"enabled": true
}
},
@@ -0,0 +1,10 @@
{
// Модель-ревьюер разрешений. Провайдеры: deepseek, opencode-go.
// Если модель не поддерживает structured output (например opencode-go/deepseek-v4-flash),
// переключить outputFormat на "text".
"model": "deepseek/deepseek-flash",
"outputFormat": "json_schema",
"variant": "none",
// Ниже порога уверенности решение уходит человеку
"confidenceThreshold": 0.7
}
+3
View File
@@ -0,0 +1,3 @@
# плагин opencode-permission-reviewer читает конфиг с O_NOFOLLOW:
# симлинк игнорируется молча, поэтому файл деплоится копией
permission-reviewer\.jsonc