TransmuteLabs/Catalyst/tree/main/plugins/catalyst-swe-request
catalyst-swe-request
Request-text policy for devin/swe-2: registers one rule in the host's $.requestText noun.
この mod について
Request-text policy for devin/swe-2: registers one rule in the host's $.requestText noun.
インストール
まず作者の README で marketplace とプラグイン名を確認してください。コマンドはリポジトリの構成によって変わる場合があります。
claude plugin marketplace add TransmuteLabs/Catalyst claude plugin install catalyst-swe-request
原文 / README
catalyst-swe-request
Политика текста запроса для модели devin/swe-2. На session.start плагин
регистрирует в ноуне $.requestText ОДНО правило: четыре замены по целым
строкам (три варианта стандартной самопрезентации Claude Code → «You are a
coding agent.», удаление пункта «The most recent Claude models are …» вместе с
переводом строки) и две литеральные замены (форма про эмодзи; сокращение
описания инструмента Read). Вся политика живёт здесь данными (RULE в
hooks/register.ts); переписывающий движок — в хосте.
Ноун — хостовый
$.requestText предоставляет ХОСТ (пропатченный Claude Code, дверь врезает шаг 34 патча; с 2.1.280 политики в образе нет), не этот
плагин. Поле types в .claude-plugin/plugin.json отсутствует: плагин — потребитель ноуна, не поставщик.
Аугментация declare module 'claude-code' { interface EngineInterface { requestText } } на издании 2.1.287 измерена так (usbox, бинарник /Users/maratkarimov/.local/share/claude/versions/2.1.287, код 0):
plugin validate --strict plugins/catalyst-swe-request
Validating plugin manifest: …/.claude-plugin/plugin.json
Validating hooks: …/hooks/hooks.json
❯ ./register.ts hooks: session.start
❯ ./register.ts calls: $.requestText.register, $.ui.log
✔ Validation passed
Поведение при отсутствии двери
Если в хосте ноуна нет, $.requestText.register бросает; catch пишет в
$.ui.log именованную строку catalyst-swe-request: requestText unavailable: <причина> и перебрасывает отказ. Вызов логгера обёрнут своим try — если
сломан и сам канал лога, наружу всё равно уходит ИСХОДНАЯ причина, а не отказ
логгера. Брошенное из session.start сессию не
обрывает: сессия идёт на стоковом тексте запроса, а именованная строка
остаётся в debug-логе. Молчаливого проглатывания нет.
Зубы
CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude plugin test <путь к этому каталогу>
tests/behavior.test.ts держит 20 тестов:
- форма правила — модель
devin/swe-2, ровно шесть op, у каждой ровно один из ключейfind/pattern, каждыйpatternкомпилируется со своими флагами,flagsстоят только уpattern-op; - поведение всех шести операций на реплике применителя
(
tests/applier-replica.ts): три якорных варианта переписывают ЦЕЛУЮ строку, не трогают ту же фразу с префиксом на строке и сохраняют\r\nв CRLF-тексте; строка «The most recent Claude models are …» удаляется в четырёх формах (LF, CRLF, первой строкой текста, последней строкой без терминатора); литерал про эмодзи заменяется, соседний текст цел; правило Read применяется только к инструменту сname === "Read"; - всё правило целиком на теле
{ model, system, tools }— и соsystem-строкой, и соsystem-массивом блоков (неизменённый блок остаётся тем же объектом), и с чужой моделью (тело не трогается); - порядок трёх якорных вариантов свободен — перестановка не меняет результат
(контракт
DOOR-DESIGN.md:78-79); - путь обращения к ноуну — Proxy записывает полный путь, он обязан быть
ровно
requestText.register, и операция зовётся один раз; - проброс отказа — отказ ноуна реджектит вызов,
nextне зовётся, вui.logуходит именованная строка; на успешной веткеnextзовётся ровно один раз и его результат возвращается; - неизменяемость входных структур — правило без tool-op не пересоздаёт
массив
tools, правило без system-op не пересоздаёт массивsystem, не совпавший по имени инструмент и неизменённый блок остаются ТЕМИ ЖЕ объектами (реплика копирует ветвления дома__ctlSys/__ctlTools); - бросок самого логгера не отменяет ни броска, ни его причины;
- SHA-256-пин текста политики — канонизированное представление
RULE(ключи op в фиксированном порядке, массив op отсортирован) сверяется с константой в тесте: шесть строк политики — данные, на которых замерен переход 403 → 200.
tests/applier-replica.ts — реплика переписывающего движка хоста (канонный дом
поведения — Catalyst-CC-Patch/tweakcc-patch.js, шаг 34, массив door), а не
второй движок: расхождение реплики с домом — дефект.
Валидация манифеста:
claude plugin validate <путь к этому каталогу> --strict