oops · git:20260902.5fa5897 · 2026-09-02 · sha256 6bbc63db40bc8316
oops git:20260902.5fa5897A
Immutable. This exact content is served forever at /api/v1/blob/6bbc63db40bc8316.
--- name: oops description: Отменить последнее изменение, которое система сделала в настройках Claude Code, ИЛИ вернуть папку проекта к снимку, снятому во время сборки. Использовать, когда пользователь пишет /oops, говорит «отмени», «верни как было», «верни вчерашний код», «я передумал», «зачем ты это поменял», или явно не хочет только что сделанное изменение. Сначала показывает, что именно вернётся, и только после согласия откатывает. --- # OOPS — сначала показать, потом вернуть Ничего не удаляется в этой системе. Вернуть можно две разные вещи, и путать их нельзя: настройки Claude Code (их копии делает `tools/apply.py`) и файлы самого проекта (их снимки делает `tools/checkpoint.py` на границах этапов сборки). Порядок в обоих случаях один — показать, ЧТО именно вернётся, и откатить только после явного согласия. ## Начни со снимков проекта Человек, сказавший «верни как было», почти всегда смотрит на свой проект, а не на настройки. Поэтому первый вопрос — есть ли снимки здесь: ```bash python3 "$CLAUDE_PLUGIN_ROOT/tools/checkpoint.py" . list ``` Код 0 — снимки есть, работай по трём шагам ниже. Код 1 — снимков нет, иди в раздел про настройки. Не угадывай по выводу: смотри код возврата. ### 1. Скажи, к чему предлагается вернуться Возьми из вывода `последний` — поля `этап` и `когда` — и скажи одной фразой: вернётся состояние на конец такого-то этапа, снятое тогда-то. Список целиком не зачитывай; другие снимки называй, только если человек попросит другой. ### 2. Остановись здесь Не возвращай, пока человек явно не согласился. Одно «давай» или «да» — согласие; молчание или смена темы — нет. ### 3. Только после согласия — верни ```bash python3 "$CLAUDE_PLUGIN_ROOT/tools/checkpoint.py" . back "Пишем код" ``` Последний аргумент — то же значение, что в поле `этап` (или `sha`) из шага 1. Код 0 — файлы вернулись, и только тогда говори прошедшим временем. Любой другой код — НЕ вернулись: инструмент сам печатает строку с причиной, передай её, а не «вернул». Две вещи скажи сразу, не дожидаясь вопроса: файлы, появившиеся ПОСЛЕ снимка, остаются на месте — возврат кладёт прежние поверх, а не вычищает папку; и текущая работа не пропадает — перед возвратом снимается ещё один снимок, к которому можно вернуться так же. ## Если снимков нет — значит, речь о настройках ### 1. Узнай, что откатится (только чтение, ничего не меняет) ```bash python3 "$CLAUDE_PLUGIN_ROOT/tools/oops.py" what ``` Без аргумента берётся последний откат. Скажи человеку РОВНО то, что вернул `line` из вывода, — не пересказывай своими словами и не додумывай, что именно поменяется. Если откатов нет вовсе, `found` будет `false` — так и скажи: менять пока нечего, система ещё ничего не откатывала. ### 2. Остановись здесь Не откатывай, пока человек явно не согласился. Одно «ладно» или «да» — согласие; молчание или смена темы — нет. ### 3. Только после согласия — откати ```bash python3 "$CLAUDE_PLUGIN_ROOT/tools/oops.py" undo 20260812-101500 ``` Последний аргумент — то же значение, что в поле `id` из шага 1 (это метка времени бэкапа, а не выдумка — пример здесь условный). Прежде чем сказать человеку «откатил», посмотри на код возврата — не только на строку в stderr. Ноль — откатил, можно говорить прошедшим временем. Ненулевой — НЕ откатил: `oops.py` сам в этом случае печатает строку, начинающуюся с «НЕ откатил» или «ОТКАЗ», и что делать дальше — передай её как есть, а не «откатил» из шага 1. Выдать неудавшийся откат за удавшийся — та же поломка, которую тормоз /stop называет худшей из возможных: подтверждение раньше, чем подтверждён результат. ## Секреты откат не возвращает Если в `line` шага 1 упомянуты секреты, которые не восстановятся, — скажи это прямо, не смягчая. Откат вернёт файл, но не значение пароля: оно не хранится даже в копии. То же и со снимками проекта: файл с ключами в снимок не берётся, и вернуть его снимком нельзя — инструмент называет такие файлы в своей строке, передай это человеку, а не умалчивай. ## Если откатов несколько ```bash python3 "$CLAUDE_PLUGIN_ROOT/tools/oops.py" list ``` покажет все доступные — по умолчанию берётся последний, но человек может попросить конкретный. ## Чего делать нельзя - Откатывать или возвращать без явного согласия человека - Пересказывать неудавшийся откат как удавшийся — сверяйся с кодом возврата, а не только с текстом в stderr - Молчать о том, что секрет не восстановится - Молчать о том, что появившееся после снимка осталось на месте - Придумывать, что вернёт откат, вместо чтения вывода `oops.py what` - Удалять что-либо вместо отката — в этой системе ничего не удаляется