Модуль 2
Сессии и режимы Plan/Build
Сессии, табы и откат; ссылки @ и shell-команды !; расследование бага отрицательного количества через plan-агента, фикс через build и проверка curl'ом.
Чему научишься
- управлять сессиями и табами: /new, /sessions, Ctrl+O
- класть файлы и вывод команд в контекст через @ и !
- расследовать баг агентом plan и ревьюить его план
- делать фикс агентом build и проверять результат curl'ом
Сессии и табы
Сессия это диалог с агентом от первого сообщения до выхода: история, прочитанные файлы, правки. Базовые команды: /new начинает новую сессию, /sessions показывает список, Ctrl+O открывает недавние. Табы внутри TUI переключаются по Ctrl+Tab и Ctrl+Shift+Tab, закрываются по Ctrl+X W.
Правило курса: одна задача это одна сессия. Длинная сессия копит контекст и со временем отвечает хуже; /compact сожмёт историю, но новая сессия под новую задачу надёжнее.
/new
/sessionsОшибка агента откатывается целиком: /undo (Ctrl+X U) отменяет твоё последнее сообщение и его результаты, включая правки файлов; /redo (Ctrl+X R) возвращает обратно. Прежде чем откатывать, прочитай дифф: так быстрее понять, что именно сделал агент.
Файлы и shell прямо из промпта
@ кладёт файл в контекст сообщения: @src/routes/orders.ts целиком или @src/routes/orders.ts#23-44 только обработчик POST. Символ ! на пустой строке включает shell-режим: !git status выполнится локально, а вывод останется в сессии, и агент сможет на него опираться.
!curl -s http://localhost:3000/api/stats
@src/routes/orders.tsБаг: отрицательное количество в заказе
В orders-api посажен дефект: POST /api/orders принимает items с отрицательным quantity. Латте стоит 320, поэтому quantity −2 даёт total −640, и заказ с минусом сохраняется в data/db.json. Воспроизведи баг до разговора с агентом, будет с чем сравнивать результат.
curl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":-2}]}"Plan: расследование без правок
У OpenCode два встроенных агента: build (по умолчанию) правит файлы, plan читает и анализирует, ничего не меняя. Переключение по Shift+Tab, список агентов по /agents или Ctrl+X A. Для расследования бага включи plan: агент разберёт код и предложит план, не тронув ни одного файла.
POST /api/orders принимает quantity −2 и возвращает total −640. Найди причину и предложи план фикса. Файлы не менять.
Прочитал src/routes/orders.ts, src/services/pricing.ts и src/db.ts. Причина: в POST / проверяются только customer и непустой массив items, quantity не валидируется; orderTotal умножает цену на количество без ограничений, поэтому 320 × (−2) = −640 и заказ с минусом уходит в db.json. План: 1) в POST / проверять каждый item: quantity целое и не меньше 1, menuId существует в меню; 2) при нарушении отвечать 400 с описанием в формате {"error"}; 3) добавить регрессионный тест в tests/. Файлы не менял.
Проверки и 400 делаем. Тест пока не нужен, вернёмся к нему позже.
Принято. Итоговый план: проверка quantity и menuId в POST /, ответ 400 при нарушении, тесты откладываем. Для выполнения переключись в build по Shift+Tab и напиши «выполни план».
План читай как код-ревью. Проверь три вещи: покрывает ли план само воспроизведение (curl с quantity −2 из начала модуля), какие файлы агент собирается тронуть и чем предложит проверять результат. Непонятный пункт уточни вопросом прямо в сессии: plan ответит и разберёт деталь, оставив файлы нетронутыми.
Build: фикс
Shift+Tab возвращает build. Поручи выполнение плана и следи за диффом: перед применением правки OpenCode показывает изменения файла. Подтверждай после прочтения диффа; если применил и передумал, /undo откатит сообщение вместе с правками.
Выполни план: проверка quantity и menuId в POST /api/orders, ответ 400 при нарушении. Без тестов.
Открыл src/routes/orders.ts. В POST / перед созданием заказа добавляю проверку каждого item: quantity целое и не меньше 1, menuId находится в load().menu. При нарушении возвращаю 400 с {"error"}, в формате остальных роутов. Прогнал npm run typecheck, ошибок нет.
Изменён src/routes/orders.ts (+9 −1)
Проверь оба случая curl'ом.
quantity −2 отвечает 400 и заказ не создаётся; lat × 2 отвечает 201 с total 640. Заказы с минусом в базу больше не попадают.
# воспроизведение из начала модуля теперь даёт 400
curl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":-2}]}"
# корректный заказ проходит
curl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":2}]}"Сделай сам
npm run dev # второй таб: curl http://localhost:3000/healthcurl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":-2}]}"opencode /newShift+TabPOST /api/orders принимает quantity −2 и возвращает total −640. Найди причину и предложи план фикса. Файлы не менять.Shift+Tab/undocurl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":-2}]}" curl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":2}]}"
Отмечено 0 из 9
Проверь себя
Вопрос 1 из 5
Шпаргалка модуля
Сессии и табы
- /new
- новая сессия под новую задачу
- /sessions, Ctrl+O
- список сессий и недавние
- Ctrl+Tab / Ctrl+Shift+Tab
- переключение табов; закрыть таб Ctrl+X W
Ввод
- @файл
- файл в контекст; @файл#23-44 диапазон строк
- !команда
- shell-режим, вывод остаётся в сессии
Агенты
- Shift+Tab
- переключение между build и plan
- /agents, Ctrl+X A
- список агентов
Откат
- /undo, Ctrl+X U
- откат сообщения и его результатов
- /redo, Ctrl+X R
- возврат отменённого