# Промпт для другого агента (DeepSeek Harness и любой сторонний)

Файл содержит **готовый текст, который надо отправить тому агенту**, чтобы он дописал
себе в системный промпт правило очистки BOM/CRLF инструментом
`C:\AutoClaw\Clean_BOM_Senior\clean-bom-senior.sh`.

Замерено 9 октября 2026 г. на v3.0.0, коммит `c799d11635a22e6abccd903e534dd84a409117a2`:
репозиторий **публичный**, файлы на этом коммите отдаются без учётных данных
(`raw.githubusercontent.com` → HTTP 200, `sha256` сошлась).

Как пользоваться:

1. Скопировать текст из блока «ПРОМПТ» целиком и отправить агенту.
2. Агент должен ответить: куда он записал правило (путь), что файл записан UTF-8 без BOM
   и с LF, и прислать первые строки этого раздела. Если он этого не сделал — правило
   не сохранено, и прогонять его «по памяти» бессмысленно.
3. Если у агента системный промпт меняет только человек (файл только для чтения),
   он должен вернуть готовый блок для вставки, а не отчитаться о выполнении.

## Что лучше сделать на самом деле: скилл + ссылка на него

Не вставлять всё правило в системный промпт. Полный текст (установка, таблица
исключений, проверка, коды) — это **скилл**, а в системном промпте остаётся один абзац
со ссылкой на него. Причина не в объёме: скилл загружается, когда задача касается
файлов, а правило в системном промпте действует всегда — они решают разные задачи.

| Где | Что там лежит |
|---|---|
| **Скилл** `clean-bom-crlf` | полная процедура: установка, реализация под каждую ОС, таблица решений v3.0.0, исключения, — проверка байтами, коды возврата |
| **Системный промпт / `AGENTS.md`** | одна фраза-указатель: «как только задача касается файлов с кодом или текста — загрузить скилл `clean-bom-crlf` и работать по нему» |

Готовый SKILL.md лежит в репозитории: `skills/clean-bom-crlf/SKILL.md`
(и в вики: `Agent-Integration`). Он универсален — подходит любому агенту со скиллами.

---

## ПРОМПТ (копировать целиком)

```text
ЗАДАЧА: заведи себе правило очистки BOM/CRLF в виде скилла и поставь на него указатель
в постоянных правилах. Порядок такой.

1) Создай скилл `clean-bom-crlf` — возьми готовый SKILL.md, он проверен и его не надо
   переписывать:
   https://raw.githubusercontent.com/paulmann/Clean_BOM_Senior/main/skills/clean-bom-crlf/SKILL.md
   Положи его туда, откуда твой агент читает скиллы (например $DSH_HOME/skills/clean-bom-crlf/SKILL.md,
   ~/.claude/skills/clean-bom-crlf/SKILL.md или проектное .agent/skills/clean-bom-crlf/SKILL.md).
   Если твой агент скиллов не поддерживает — вставь содержимое SKILL.md как раздел правил.

2) В постоянные правила (то, что грузится в каждую сессию: AGENTS.md, system prompt и т.п.)
   добавь одну фразу-указатель:

   "Как только задача касается файлов с кодом или любого текста (создание, правка,
   генерация, патч, сборка поставки: .php .js .css .html .xml .sh .py .yaml .json .ps1
   .md .txt и т.п.) — сначала загрузи скилл `clean-bom-crlf` и дальше работай по нему,
   а результат перед сдачей проверь байтами (BOM=False, CRLF=False, кроме исключений
   из скилла)."

3) Проверь, что указатель и скилл действительно видны: загрузи скилл и покажи его
   первые строки. Если скилл в сессии не появился — скажи об этом прямо, не выдавай
   «правило записано» за работающую настройку.

4) Отчитайся: (а) путь к файлу скилла и к файлу правил; (б) что оба записаны UTF-8
   без BOM и с LF; (в) первые 20 строк раздела правил; (г) вывод `--version` инструмента.

Если инструмента нет — поставь его по разделу 1 скилла: на Linux/macOS/WSL/Git Bash
используется sh-реализация, на Windows — PowerShell-реализация, и на Windows
дополнительно нужен PowerShell 7+ (без него PowerShell-реализация не запустится).
При установке сверь sha256 clean-bom-senior.sh; не сошлась — не запускать.

Если писать в файл постоянных правил может только человек — верни готовый блок для
вставки и скажи об этом прямо: это нормальный ответ, а не отказ от задачи.
```

---

## Приложение: исходный текст правила

Этот блок — то, что должно попасть в скилл. Если агент не умеет забирать файл по ссылке
(нет сети, закрытый контур), отправьте ему этот текст.

--- НАЧАЛО ПРАВИЛА ---

## Очистка BOM/CRLF (обязательно)

**Условие на результат.** Любой текстовый файл, который я создал или изменил в рамках
задачи и который остаётся в репозитории или уходит в поставку, перед сдачей результата
приводится к состоянию BOM=False и CRLF=False. Исключения перечислены ниже; для них
условие обратное (например, у .bat должно быть CRLF=True).

**Инструмент.** C:\AutoClaw\Clean_BOM_Senior\clean-bom-senior.sh, версия 3.0.0
(замерено 2026-10-09). Перед любой записью он классифицирует файл по фактическим байтам
и сам решает, нужна ли чистка и не является ли BOM несущим (Smart BOM Policy).
Поэтому правило — про условие на результат, а не про флаги.

### 1. Если инструмента нет — поставить (проверено, репозиторий публичный)

Windows (PowerShell):
  $dst = 'C:\AutoClaw\Clean_BOM_Senior'
  $repo = 'https://raw.githubusercontent.com/paulmann/Clean_BOM_Senior'
  $pin = 'c799d11635a22e6abccd903e534dd84a409117a2'
  New-Item -ItemType Directory -Force $dst, "$dst\bin" | Out-Null
  foreach ($f in 'clean-bom-senior.sh','clean-bom-senior.ps1','clean-bom-senior.bat','VERSION') {
    Invoke-WebRequest -UseBasicParsing -Uri "$repo/$pin/$f" -OutFile (Join-Path $dst $f)
  }
  Invoke-WebRequest -UseBasicParsing -Uri "$repo/$pin/bin/bom.js" -OutFile "$dst\bin\bom.js"
  (Get-FileHash "$dst\clean-bom-senior.sh" -Algorithm SHA256).Hash.ToLower()

Linux/macOS/WSL:
  curl -fsSL -o clean-bom-senior.sh \
    https://raw.githubusercontent.com/paulmann/Clean_BOM_Senior/c799d11635a22e6abccd903e534dd84a409117a2/clean-bom-senior.sh
  printf '%s  %s\n' ec1634249bff874d10b0d2999760be603153b1f0fcccc06a5f6b0be667504693 clean-bom-senior.sh | sha256sum -c -

Контрольная сумма clean-bom-senior.sh должна быть
ec1634249bff874d10b0d2999760be603153b1f0fcccc06a5f6b0be667504693.
Не сошлась — файл не запускать, доложить. Если сети нет — сказать прямо и не имитировать
успех: чистка, выполненная «на глаз», хуже ненайденного BOM.

### 2. Чем чистить на какой платформе

  Linux/macOS/WSL/Git Bash : bash clean-bom-senior.sh --quiet <файлы...>
  Windows без Git Bash     : node bin/bom.js --quiet <файлы...>      (нативная реализация)
  Windows, только PowerShell: pwsh -File clean-bom-senior.ps1 --quiet <файлы...>
  Гейт без записи (везде)  : --check   → 0 чисто, 10 есть что чистить

Все три реализации сверены байт-в-байт (sh↔node 8 фикстур, sh↔ps1 77 сценариев).

### 3. Как вызывать

  * Только явные пути к файлам. Никогда без аргументов: без них обход идёт от текущего
    каталога и переписывает чужие файлы.
  * Аргумент-каталог работает, но берёт ТОЛЬКО расширения по умолчанию
    (php css js txt xml htm html). Файл с другим расширением молча не очистится —
    поэтому либо явные пути, либо --add-ext <список>.
  * Один вызов принимает несколько файлов; повторный прогон идемпотентен.

### 4. Что инструмент делает (замерено на v3.0.0)

  UTF-8 BOM + код (php js css html xml sh py yaml json)      → BOM снят, CRLF→LF
  UTF-8 BOM + чисто ASCII (любое расширение)                 → BOM снят
  BOM + не-ASCII в txt csv tsv ps1 psm1 psd1 и в ЛЮБЫХ
    неизвестных расширениях (включая md)                     → BOM СОХРАНЁН намеренно
                                                               (Excel и PowerShell 5.1
                                                               читают такой файл только
                                                               с BOM), CRLF нормализованы
  то же + --bom-policy=strip либо --force                    → BOM снят
  CRLF без BOM (файл передан явным путём)                     → CRLF→LF
  UTF-16/32 BOM (FF FE, FE FF, FF FE 00 00, 00 00 FE FF)      → не трогается НИКОГДА
  NUL-байты в файле                                           → не трогается НИКОГДА
  невалидный UTF-8                                           → не трогается по умолчанию;
                                                               --force = побайтовая чистка
  файл уже чистый                                             → не перезаписывается вовсе
                                                               (inode и mtime не меняются)

### 5. Когда НЕ прогонять (или прогонять особой формой)

  * .bat, .cmd, .reg — CRLF у них обязателен: cmd.exe LF-батник не исполняет (exit 255).
    Замер: явный путь превращает @echo off\r\n в @echo off\n, то есть ломает файл.
    Единственная безопасная форма для снятия BOM у батника — --no-rn-normalize
    (замерено: BOM снят, CRLF сохранены).
  * Бинарные и ресурсные файлы (изображения, архивы, шрифты, .exe, .dll) — не подавать.
  * UTF-16/32 и файлы с NUL — не «запрещено», а «инструмент сам откажется»: нужен iconv.
  * Невалидный UTF-8 — --force только осознанно (файл в cp1251/latin-1).
  * Не-ASCII в чувствительном расширении — BOM там функция. Снимать осознанно: файл
    с шебангом (#!/usr/bin/env pwsh), который должен запускаться и под Unix, обязан быть
    ASCII без BOM, иначе ядро читает BOM как магию и запускает /bin/sh.

### 6. Проверка после очистки — байтами, а не «выглядит нормально»

PowerShell:
  $b = [IO.File]::ReadAllBytes('<файл>')
  $bom = $b.Length -ge 3 -and $b[0] -eq 0xEF -and $b[1] -eq 0xBB -and $b[2] -eq 0xBF
  $crlf = ([IO.File]::ReadAllText('<файл>')) -match "`r`n"
  "BOM=$bom CRLF=$crlf"      # ожидается False False (кроме исключений из п.5)

POSIX:
  head -c 3 '<файл>' | od -An -tx1 | tr -d ' \n'    # ожидается не efbbbf
  tr -dc '\r' < '<файл>' | wc -c                    # ожидается 0

`grep -c '\r'` — форма, которая выглядит очевидной и врёт на GNU grep: `\r` в BRE не
перевод строки, шаблон вырождается в букву `r`, и чистый файл показывает ненулевой счёт
(замерено 1 на GNU 3.11/Debian). Считайте через `tr`; если нужен именно grep, в шаблоне
должен быть настоящий байт CR: `grep -c "$(printf '\r')"`.

Для исключений п.5 проверка ОБРАТНАЯ: у .bat/.cmd ожидается CRLF=True;
у не-ASCII .ps1/.txt/.md — BOM=True, и это не дефект.

### 7. Коды возврата (чтобы не считать успех по молчанию)

  0  успех (чисто либо всё очищено)
  1  были ошибки обработки отдельных файлов; --strict увидел kept/protected/skipped
  2  ошибка в аргументах
  3  проблема окружения (нет зависимости, недоступен temp, сеть, --update на npm-установке)
  4  внутренняя ошибка
  10 --check: есть файлы, требующие очистки
  11 --check-update: в репозитории есть версия новее
  Приоритет при конфликте: 2/3/4 > 1 > 10/11 > 0.

### 8. Что считается провалом этого правила

  * «Успех» без проверки байтов (п.6) — отчёт о чистке без замеров не принимается.
  * Запись в уже чистый файл (инструмент этого не делает; если mtime изменился — дефект).
  * Прогон без аргументов или по каталогу с нужным расширением вне списка по умолчанию —
    тихая неудача: файл не очищен, а отчёт говорит «готово».
  * Подача .bat/.cmd обычным вызовом — ломает исполнение файла.
  * Снятие BOM у не-ASCII .ps1/.txt/.md без осознанного решения.

--- КОНЕЦ ПРАВИЛА ---
```
