oops · git:20260826.0176cf2 · 2026-08-26 · sha256 031650bc8187b265

oops git:20260826.0176cf2A

Immutable. This exact content is served forever at /api/v1/blob/031650bc8187b265.

---
name: oops
description: Отменить последнее изменение, которое сделала система в настройках Claude Code. Использовать, когда пользователь пишет /oops, говорит «отмени», «верни как было», «я передумал», «зачем ты это поменял», или явно не хочет только что сделанное изменение. Сначала показывает, что именно вернётся, и только после согласия откатывает.
---

# OOPS — сначала показать, потом вернуть

Ничего не удаляется в этой системе — всё, что применяется, лежит в бэкапе
(этим занимается `tools/apply.py`) и может вернуться. Задача /oops — показать ЧТО именно
вернётся, ПРЕЖДЕ чем это случится, и откатить только после явного согласия.

## Порядок обязателен

### 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`
- Удалять что-либо вместо отката — в этой системе ничего не удаляется