Фронтенд · OpenClaw · knip · HowTo 2026

2026 OpenClaw — фронтенд на практике:
удалённый Mac: парсинг JSON knip о неиспользуемых экспортах и короткая сводка очистки для pull request

23.04.2026 Качество и CI около 8 мин

Ревьюеру в 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. Тарифы и покупка без обязательного входа: тарифы, страница покупки.

Чек-лист перед merge
  • Один reporter и один контрактный JSON на job — парсер не гадает по имени файла.
  • jq empty на артефакте до вызова OpenClaw; битый JSON не уходит в PR.
  • В теле комментария только относительные пути репозитория, без домашних каталогов remote Mac.
  • Idempotency-Key из PR+SHA или HTML-маркер, чтобы повторный прогон обновлял один комментарий.
  • Токен шлюза OpenClaw и GitHub PAT храните раздельно; в stdout не печатайте Bearer.
Сигнал: сырой лог knip vs нормализованный JSON для OpenClaw
Критерий Только 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: пять минимальных шагов

  1. Зафиксировать knip в lockfile и конфиг с reporter json.
  2. В CI и на удалённом Mac писать вывод в один и тот же относительный путь.
  3. jq: валидация, сортировка, TOP_N, агрегация по директориям для topPaths.
  4. Собрать объект шаблона и отдать в OpenClaw → pr_knip_cleanup_summary.md.
  5. 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.

Удалённый Mac под knip и OpenClaw

Тарифы и покупка без навязанного входа

Арендуйте узел macOS для ночных прогонов knip, jq и доставки сводок в PR — рядом с реальным Safari и стабильными путями. Тарифы, покупка и помощь по SSH/VNC на macwww.com; каталог материалов — блог.

knip JSON OpenClaw Сводка в PR
Mac под knip и OpenClaw