Перейти к содержимому
Прогресс курса
0 из 8 модулей

Модуль 2

Сессии и режимы Plan/Build

Сессии, табы и откат; ссылки @ и shell-команды !; расследование бага отрицательного количества через plan-агента, фикс через build и проверка curl'ом.

20 мин

Чему научишься

  • управлять сессиями и табами: /new, /sessions, Ctrl+O
  • класть файлы и вывод команд в контекст через @ и !
  • расследовать баг агентом plan и ревьюить его план
  • делать фикс агентом build и проверять результат curl'ом

Сессии и табы

Сессия это диалог с агентом от первого сообщения до выхода: история, прочитанные файлы, правки. Базовые команды: /new начинает новую сессию, /sessions показывает список, Ctrl+O открывает недавние. Табы внутри TUI переключаются по Ctrl+Tab и Ctrl+Shift+Tab, закрываются по Ctrl+X W.

Правило курса: одна задача это одна сессия. Длинная сессия копит контекст и со временем отвечает хуже; /compact сожмёт историю, но новая сессия под новую задачу надёжнее.

bashTUI: сессии и табы
/new
/sessions
Набор команд и хоткеев TUI меняется между версиями: сверяйся с документацией.

Ошибка агента откатывается целиком: /undo (Ctrl+X U) отменяет твоё последнее сообщение и его результаты, включая правки файлов; /redo (Ctrl+X R) возвращает обратно. Прежде чем откатывать, прочитай дифф: так быстрее понять, что именно сделал агент.

Файлы и shell прямо из промпта

@ кладёт файл в контекст сообщения: @src/routes/orders.ts целиком или @src/routes/orders.ts#23-44 только обработчик POST. Символ ! на пустой строке включает shell-режим: !git status выполнится локально, а вывод останется в сессии, и агент сможет на него опираться.

bashTUI: @ и shell-режим
!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. Воспроизведи баг до разговора с агентом, будет с чем сравнивать результат.

bash
curl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":-2}]}"
До фикса сервер ответит 201 и total: −640.

Plan: расследование без правок

У OpenCode два встроенных агента: build (по умолчанию) правит файлы, plan читает и анализирует, ничего не меняя. Переключение по Shift+Tab, список агентов по /agents или Ctrl+X A. Для расследования бага включи plan: агент разберёт код и предложит план, не тронув ни одного файла.

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 откатит сообщение вместе с правками.

Build: фикс по плану

Выполни план: проверка 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. Заказы с минусом в базу больше не попадают.

bash
# воспроизведение из начала модуля теперь даёт 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}]}"
Ожидаемо: первый запрос 400, второй 201 с total 640.

Сделай сам

  1. npm run dev
    # второй таб:
    curl http://localhost:3000/health
  2. curl -X POST http://localhost:3000/api/orders -H "Content-Type: application/json" -d "{\"customer\":\"Тест\",\"items\":[{\"menuId\":\"lat\",\"quantity\":-2}]}"
  3. opencode
    /new
    Сессии
  4. Shift+Tab
    Агенты plan и build
  5. POST /api/orders принимает quantity −2 и возвращает total −640. Найди причину и предложи план фикса. Файлы не менять.
  6. Shift+Tab
    Агенты plan и build
  7. /undo
    Undo и Redo
  8. 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}]}"

Отмечено 0 из 9

Проверь себя

Вопрос 1 из 5

Чем агент plan отличается от build?

Шпаргалка модуля

Сессии и табы

/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
возврат отменённого