Симуляция отслеживания истории файлов для sed -i
Summary
Поддержка оставшегося пункта B1 в issue #4204: обработка узкого класса shell-команд sed -i 's/pattern/replacement/flags' file как редактирования файлов, а не как непрозрачного выполнения shell-команд.
Симулированный путь предпросматривает точное изменение текста в стандартном UI подтверждения редактирования, записывает целевой файл с помощью FileHistoryService.trackEdit(), выполняет запись через FileSystemService.writeTextFile() и избегает создания shell-процесса. Это позволяет /rewind фиксировать in-place правки, выполняемые через shell, которые часто встречаются в рабочих процессах агентов.
Scope
Симулируются только простые in-place подстановки:
sed -i 's/foo/bar/' filesed -i '' -E 's/foo|bar/baz/g' filesed -i -e 's/foo/bar/' file
Команды не симулируются, если они включают составные shell-операторы, glob-шаблоны, несколько файлов, подстановки команд, ссылки на shell-переменные внутри sed-выражения, пути к файлам с раскрытыми переменными, суффиксы резервных копий, такие как -i.bak, неподдерживаемые флаги sed, неподдерживаемые sed-выражения или фоновое выполнение. В этих случаях сохраняется существующее поведение выполнения через shell.
Поддерживаемые флаги подстановки намеренно ограничены g и числовыми вхождениями. Флаги, которые могут влиять на stdout или иметь специфичное для платформы поведение sed, такие как p, I и M, откатываются к выполнению через shell. Shell-обертки с префиксами окружения также откатываются, чтобы изменения локали или окружения не могли быть молча проигнорированы симулятором.
Behavior
При подтверждении читается целевой файл, применяется распарсенная подстановка в памяти, и возвращается ToolEditConfirmationDetails с обычным diff-ом файла.
При выполнении файл перечитывается перед записью. Если содержимое файла отличается от содержимого, использованного для подтверждения, выполнение отклоняется с ошибкой FILE_CHANGED_SINCE_READ вместо записи изменения, которое пользователь не одобрял.
Если предварительный просмотр файла не удается, команда подтверждается и выполняется через существующий shell-путь вместо симуляции.
Подтверждение скрывает действия изменения во внешнем редакторе, поскольку ShellTool не является универсальным инструментом редактирования файлов с возможностью модификации. Если IDE или хост возвращает инлайн-пейлоад newContent при одобрении diff-а, симулированный sed-путь записывает это одобренное содержимое после той же проверки на устаревание содержимого.
Перед записью выполнение вызывает FileHistoryService.trackEdit(filePath), чтобы снимок истории файлов текущего хода зафиксировал резервную копию до редактирования. Вызов истории файлов выполняется по принципу “best-effort” и никогда не блокирует редактирование. Сама запись использует FileSystemService.writeTextFile() с метаданными чтения, чтобы поведение кодировки, BOM и окончаний строк оставалось согласованным с инструментами Edit и WriteFile.
Compatibility
Изменения сохраняемой схемы не требуются. Это просто еще один источник отслеживаемых правок файлов внутри существующего снимка. Неподдерживаемые shell-команды продолжают выполняться через существующий shell-путь, поэтому это не меняет общую семантику shell.
Out of Scope
Отслеживание общих shell-мутаций остается отложенным. Команды вроде perl -pi, python -c, awk, cat > file, mv, произвольные скрипты и вызовы sed для нескольких файлов не симулируются. Они требуют более широкого анализа эффектов shell, который claude-code сегодня не поддерживает и который выходит за рамки B1.