Урок 7 из 8 · 25 мин · обновлено

Git, отмена правок и права агента

Как не потерять рабочий код при работе с ИИ-агентом: коммит перед задачей, /undo и /redo, просмотр изменений через git diff. Права агента в OpenCode 2: allow, ask и deny для команд и файлов, защита .env и опасные команды.

Коммит перед задачей

Агент может испортить работающий код: переписать лишнее, удалить нужное, запутаться в своих правках. Лучшая защита — Git, система, которая хранит версии проекта. Если вы ещё не работали с ним, на этом сайте есть курс «Git и GitHub». Для работы с агентом хватит трёх команд.

Один раз в папке проекта:

Терминал
git init

Перед каждой задачей агенту — сохранить текущую версию:

Терминал
git add .
git commit -m "Трекер с тёмной темой"

Этот снимок называется коммит. Что бы агент ни сделал дальше, к коммиту можно вернуться.

Посмотреть и отменить

После работы агента посмотрите, что именно изменилось с последнего коммита:

Терминал
git diff

Строки с минусом удалены, с плюсом — добавлены. Если результат устраивает — сделайте новый коммит. Если нет — есть два пути.

Отменить последнюю правку агента командой в OpenCode:

Текст
/undo

Она откатывает изменения файлов из последнего ответа агента и убирает это сообщение из разговора. Можно повторить несколько раз, чтобы откатить несколько шагов. Передумали — /redo вернёт отменённое. Обеим командам нужен Git в папке проекта.

Вернуться к последнему коммиту целиком, если всё запуталось:

Терминал
git restore .

Команда отменяет все незакоммиченные изменения в файлах, которые Git уже знает. Новые файлы, созданные агентом, она не трогает — их удалите вручную или через git clean.

Права агента

OpenCode 2 решает, что агенту можно делать, по правилам с тремя ответами:

  • allow — разрешено без вопросов;
  • ask — спросить вас перед действием;
  • deny — запрещено.

По умолчанию агенту разрешено почти всё: читать и править файлы, запускать команды. Исключение — файлы .env, где обычно хранят пароли и ключи: перед их чтением агент спросит разрешения.

Правила пишут в файл opencode.json в корне проекта. Например, так агент будет спрашивать перед любой командой, кроме двух безопасных, а отправлять код на GitHub не сможет совсем:

JSON
{
  "$schema": "https://opencode.ai/config.json",
  "permissions": [
    { "action": "shell", "resource": "*", "effect": "ask" },
    { "action": "shell", "resource": "git status *", "effect": "allow" },
    { "action": "shell", "resource": "git diff *", "effect": "allow" },
    { "action": "shell", "resource": "git push *", "effect": "deny" }
  ]
}

Здесь action — что делает агент (shell — команды терминала, edit — правка файлов, read — чтение), resource — к чему относится правило, а * означает «что угодно».

Важно: срабатывает последнее подходящее правило. Поэтому сначала пишут общее правило, а исключения — после него. Если поставить «спрашивать для всех» последним, оно перекроет разрешения выше.

По умолчанию агент может читать и править файлы и за пределами папки проекта. Если это нежелательно, добавьте правило { "action": "external_directory", "resource": "*", "effect": "ask" }.

Читать команды перед подтверждением

Когда агент спрашивает разрешения, он показывает команду. Прочитайте её. Большинство команд безопасны: показать файлы, запустить проверку. Насторожиться стоит, если команда:

  • удаляет — rm, del, git clean, git reset --hard;
  • отправляет что-то в интернет — git push, curl с вашими данными;
  • устанавливает программы и пакеты — npm install, pip install;
  • трогает файлы вне проекта — пути вроде ~/ или C:\Users\.

Если не понимаете, что делает команда, откажите и спросите агента: «Зачем эта команда и что она изменит?»

Попробуйте сами. Сделайте в папке трекера git init и первый коммит. Попросите агента добавить кнопку «Сбросить все отметки». Посмотрите изменения через git diff, затем откатите их командой /undo и убедитесь через git diff, что изменений не осталось.

Что должно получиться
Терминал
git init
git add .
git commit -m "Трекер привычек: первая версия"

После задачи агенту git diff покажет добавленные строки кнопки и её обработчика. После /undo команда git diff ничего не выведет: файлы вернулись к состоянию коммита, а сообщение с задачей исчезло из разговора.

Если /undo сообщает об ошибке, проверьте, что git init выполнен в той же папке, где запущен OpenCode.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Зачем делать коммит перед задачей агенту?

  2. Что нужно, чтобы работали /undo и /redo?

  3. Вы хотите, чтобы агент спрашивал перед каждой командой терминала, но git status запускал сам. Как расположить правила?

  4. Агент просит разрешения выполнить rm -rf build. Что делать?