2026 OpenClaw — фронтенд на практике:
удалённый Mac: парсинг JSON knip о неиспользуемых экспортах и короткая сводка очистки для pull request
Ревьюеру в pull request нужна не простыня из консоли, а таблица кандидатов на удаление: файл, символ, причина — в пределах десятка строк. knip умеет отдавать машиночитаемый json; на удалённом Mac с тем же pnpm/npm, что в CI, вы фиксируете один путь артефакта, прогоняете jq, формируете pr_knip_cleanup_summary.md через OpenClaw и возвращаете результат webhook’ом или gh pr comment — без секретов в Markdown. Контекст: граф зависимостей и tree-shaking в PR, метрики сборки и сводка, инкрементальная проверка TypeScript, монорепо и удалённый кэш. Slug: 2026-openclaw-knip-unused-exports-pr-summary-remote-mac.html. Тарифы и покупка без обязательного входа: тарифы, страница покупки.
- Один reporter и один контрактный JSON на job — парсер не гадает по имени файла.
jq emptyна артефакте до вызова OpenClaw; битый JSON не уходит в PR.- В теле комментария только относительные пути репозитория, без домашних каталогов remote Mac.
Idempotency-KeyизPR+SHAили HTML-маркер, чтобы повторный прогон обновлял один комментарий.- Токен шлюза OpenClaw и GitHub PAT храните раздельно; в stdout не печатайте Bearer.
| Критерий | Только stdout | JSON + jq + шаблон |
|---|---|---|
| Читаемость в PR | Длинные пути, переносы | Таблица TOP_N, счётчик остатка |
| Стабильность диффа | Порядок строк плавает | Сортировка по file, name |
| Безопасность | Риск утечки env | Только поля репозитория |
| Вход OpenClaw | Версия schema, totals, компактные issues[] |
|
01 Конфигурация knip
Зафиксируйте границы анализа: для приложения — узкий entry (например src/main.tsx) и project с glob’ами исходников; для монорепозитория либо отдельный конфиг на пакет, либо явный workspaces в корневом knip.json. Репортёр оставьте один — "json" или эквивалент флага CLI — чтобы downstream не ветвился по формату.
Короткий список ignoreDependencies и ignoreExports живите как код-ревью: каждая строка с комментарием в PR, иначе через месяц никто не помнит, почему playwright или генераторы исключены. Для динамических импортов и плагинов сборщика согласуйте с командой либо ignore по шаблону, либо дополнительный entry-файл, который knip считает достижимым.
{
"$schema": "https://unpkg.com/knip@5/schema.json",
"entry": ["src/main.tsx"],
"project": ["src/**/*.{ts,tsx}"],
"ignoreDependencies": ["@types/node"]
}
На удалённом Mac держите ту же minor-версию Node, что в workflow, и закрепите knip в devDependencies с точным semver — иначе JSON слегка меняется между прогонами и ломает jq-запросы. Вызов в CI оформляйте явным флагом --reporter json (или эквивалентом в вашей версии CLI), чтобы формат не зависел от значения по умолчанию.
02 Путь артефактов CI
Договоритесь о одном относительном пути в репозитории, например artifacts/knip/unused-exports.json или .openclaw/reports/${GITHUB_SHA}/knip.json. Скрипт job всегда создаёт каталог и пишет файл до решения «красный ли exit code»: пустой отсутствующий JSON на фоне упавшего knip даёт ложное «всё чисто».
В GitHub Actions после шага анализа добавьте actions/upload-artifact с понятным именем (knip-unused-json). Воркер на удалённом Mac скачивает артефакт в тот же относительный путь, что задокументировано в runbook, и запускает нормализацию — так ручной прогон и CI остаются симметричными. Полный отчёт храните рядом с другими JSON сводками, чтобы агенты OpenClaw читали единый каталог.
#!/usr/bin/env bash
set -euo pipefail
SHA="${GITHUB_SHA:-$(git rev-parse HEAD)}"
OUT="${KNIP_JSON_DIR:-artifacts/knip}"
mkdir -p "$OUT"
pnpm exec knip --reporter json > "$OUT/unused-exports.json" || true
jq empty "$OUT/unused-exports.json"
Ключ || true здесь лишь чтобы не потерять файл; отдельный шаг по полям issues | length решает, валить ли job. Так вы разделяете «сняли сигнал» и «политика gate».
03 Поля шаблона сводки
Сводка для PR должна иметь стабильные заголовки, чтобы дифф в комментарии был предсказуемым. Минимальный контракт pr_knip_cleanup/v1:
schema— строка версии формата.gitShaи опциональноprNumber— привязка к контексту.totals.unusedExports— число записей до обрезки.topPaths[]— до пяти каталогов с наибольшим числом находок (агрегация jq).table— Markdown-таблица с колонками «файл», «символ», «примечание» (тип правила knip или краткая подсказка).truncatedиremainingCount— если строк больше лимита PR.artifactHint— одна строка «полный JSON в артефакте CI …» без подписанных URL.
OpenClaw получает только этот объект (или пара файлов: сырой knip + нормализованный слой), генерирует Markdown и не должен подмешивать переменные окружения. Заголовки секций держите короче восьми слов — удобно склеивать с отчётами метрик сборки в одном треде PR.
04 FAQ: ложные срабатывания
Динамический import() и строковые пути. knip не всегда видит граф; добавьте статический entry, расширьте project или точечный ignoreExports с ссылкой на issue — и отметьте в сводке deferred, чтобы ревьюер не тратил время на спорный символ.
Публичный UI и внутренние скрипты. Разведите два конфига и два артефакта (knip.app.json / knip.repo.json); в комментарии PR по умолчанию показывайте только «приложение», а полный репозиторий — по кнопке или отдельной метке job.
Экспорты для тестов и storybook. Вынесите в отдельный workspace или добавьте тестовый entry; иначе каждый прогон будет шуметь и доверие к сводке упадёт. Синхронизируйте политику с анализом графа бандла: одни и те же «мёртвые» ветки не должны дублироваться противоречиво.
Лимит размера комментария GitHub. Обрежьте таблицу (например 20 строк), остальное только счётчиком; полный JSON пусть остаётся в артефакте — в теле сводки дайте имя workflow и шаг, где его скачать.
HowTo: пять минимальных шагов
- Зафиксировать
knipв lockfile и конфиг сreporter json. - В CI и на удалённом Mac писать вывод в один и тот же относительный путь.
jq: валидация, сортировка, TOP_N, агрегация по директориям дляtopPaths.- Собрать объект шаблона и отдать в OpenClaw →
pr_knip_cleanup_summary.md. - POST с
Idempotency-Keyилиgh pr comment; токен шлюза не смешивать с GitHub.
Этого достаточно для воспроизводимого runbook: от стажёра на ноутбуке до ночного job на арендованном Mac Mini M4 без расхождений путей. Если шлюз OpenClaw вызывается по HTTP, ограничьте размер тела (типично 256–512 KiB) и отклоняйте запросы без поля schema — так агент не «дорисует» вымышленные строки из полуразобранного лога.
Один формат knip JSON, один контрактный путь в CI, jq-слой и версионированные поля шаблона — и pull request получает читаемую сводку очистки, которую можно ревьюить за минуты. OpenClaw остаётся тонким прокси для текста, а политика gate и секреты живут вне Markdown.
Тарифы и покупка без навязанного входа
Арендуйте узел macOS для ночных прогонов knip, jq и доставки сводок в PR — рядом с реальным Safari и стабильными путями. Тарифы, покупка и помощь по SSH/VNC на macwww.com; каталог материалов — блог.