lint, eval, feedback
Навыки (стандарт Agent Skills) для коробочного Битрикс24 и БУС живут в git-репозиториях — официальных и от энтузиастов. Ставит их не bxshef, а общий инструмент экосистемы:
npx skills add bx-shef/options # навыки модуля shef.options — в .agents/skills / .claude/skills
npx skills add bx-shef/skills # навыки базы и облака
npx skills check # есть ли обновления (skills-lock.json)
bxshef отвечает за качество навыков — в репозитории навыков (через GitHub Action) и у разработчика:
Где искать навыки, если --dir не задан: .agents/skills, затем .claude/skills (проект), затем skills/
с папками навыков (репозиторий навыков) от текущего каталога вверх;
либо текущий каталог, если это репозиторий навыков (папки с SKILL.md).
SKILL.md есть; name = имя папки, из [a-z0-9-]; description 80–1024 символов; есть заголовок.-new-, -use-, -add-, -make-) есть evals/selection.json,
в нём ≥ 3 фраз, есть фраза «на себя» и фраза на соседа или <none>, expected ссылается на существующий навык.--code <путь>: каждый класс вида Vendor\Ns\Class из текста навыка объявлен в коде (по хвосту FQN или как
namespace). Bitrix\* и корни, которых в коде нет, не проверяются; примерные вендоры — --ignore '*\Demo\*,Acme\*'.
Строки со словами «не существует» пропускаются — навык вправе назвать неверный класс, чтобы предостеречь.evals/selection.json у навыка:
[
{ "input": "сделай агент импорта прайса раз в час", "expected": "shef-new-agent" },
{ "input": "добавь вторую вкладку в настройки", "expected": ["shef-new-option", "shef-options-settings"], "notes": "оба верны" },
{ "input": "поправь опечатку в lang-файле", "expected": "<none>" }
]
По умолчанию — модель по API: описания всех навыков отдаются как инструменты, считается первый выбор.
BitrixGPT через AI Router Вайбкода (BXSHEF_EVAL_KEY, BXSHEF_EVAL_URL, BXSHEF_EVAL_MODEL); любой
OpenAI-совместимый endpoint подходит. Без ключа — пропуск с кодом 0.
--agent claude — настоящий Claude Code: для каждой фразы поднимается пустой каталог с навыками, claude -p
с правами только на чтение и Skill, засчитывается первый вызванный навык за --turns ходов. 30–90 с на фразу;
гонять с --only на реальных фразах. Нужна обычная авторизация Claude Code, ключ API не нужен. Ставьте
--repeat 3: выбор стохастичен.
Агенту bxshef не нужен: навык отзыва (shef-feedback, в шаблоне — acme-feedback) сам
отправляет тикет (category, title, body, skill, outcome, helped) одной командой
curl --data-urlencode … — адрес и поля написаны в навыке. Приёмник — feedback/ в этом репозитории.
bxshef feedback send — то же из командной строки (собирает тикет из флагов):
npx --yes bxshef@latest feedback send --skill <имя> --agent claude-code --outcome done \
--task "<задача в одну строку>" --helped "<что пригодилось>" --issue "unclear: <одно предложение>"
--helped и --issue повторяются; виды замечаний — missing / wrong / unclear / noise (категория
тикета — по самому серьёзному: wrong → BUG, unclear/noise → DOCS, missing → SUGGESTION,
без замечаний — OTHER); при done нужен хотя бы один --helped. Похожее на секрет не уходит.
Адрес — {"feedback": "https://…"} в .bxshef.json корня проекта, иначе BXSHEF_FEEDBACK_URL.
Токен отправки, если приёмник его требует (FEEDBACK_TOKEN), — только из окружения:
BXSHEF_FEEDBACK_TOKEN (в .bxshef.json не класть — файл коммитят). 401 — «токен не принят»,
429 — «приёмник просит подождать N с».
Коды выхода: 0 — отправлен, 1 — не отправлен (нет адреса, сеть, приёмник, секрет), 2 — ошибка в параметрах.
Старый путь — файлы в .bxshef/feedback/ и npx bxshef feedback [send] — работает как раньше;
приёмник принимает до 20 тикетов в минуту с адреса, остальные файлы уйдут при следующем send.
# .github/workflows/skills.yml
on: [push, pull_request]
jobs:
skills:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: bx-shef/skills-action@v1
with:
eval-key: ${{ secrets.BXSHEF_EVAL_KEY }} # без ключа шаг eval пропускается
min-selection: 0.9
Action делает lint --code ., eval --repeat 3 --min 0.9. Зелёный бейдж — условие попадания в каталог.