[{"data":1,"prerenderedAt":1116},["ShallowReactive",2],{"navigation_docs":3,"-methodology-bxshef":238,"-methodology-bxshef-surround":1113},[4,45,60],{"title":5,"description":6,"icon":7,"path":8,"stem":9,"children":10},"Методология",null,"ruler","\u002Fmethodology","1.methodology",[11,15,20,25,30,35,40],{"title":12,"path":8,"stem":13,"description":14},"bxshef: методология и проверка навыков","1.methodology\u002Findex","Как писать навыки ИИ-агентов для Битрикса и как проверять, что им можно верить",{"title":16,"path":17,"stem":18,"description":19},"Стандарт навыка","\u002Fmethodology\u002Fstandard","1.methodology\u002F1.standard","11 правил, каждое из провала на стенде",{"title":21,"path":22,"stem":23,"description":24},"Методология проверки","\u002Fmethodology\u002Fmethod","1.methodology\u002F2.method","lint → eval → стенд; что измерено",{"title":26,"path":27,"stem":28,"description":29},"bxshef — CLI","\u002Fmethodology\u002Fbxshef","1.methodology\u002F3.bxshef","lint, eval, feedback",{"title":31,"path":32,"stem":33,"description":34},"GitHub Action","\u002Fmethodology\u002Faction","1.methodology\u002F4.action","тот же lint + eval в любом репозитории навыков",{"title":36,"path":37,"stem":38,"description":39},"Заготовка репозитория","\u002Fmethodology\u002Ftemplate","1.methodology\u002F5.template","с чего начать автору модуля",{"title":41,"path":42,"stem":43,"description":44},"Приёмник отзывов","\u002Fmethodology\u002Ffeedback","1.methodology\u002F6.feedback","куда уходят отзывы ИИ-агентов",{"title":46,"description":6,"icon":47,"path":48,"stem":49,"children":50},"Навыки","sparkles","\u002Fskills","2.skills",[51,55],{"title":52,"path":48,"stem":53,"description":54},"Навыки shef.*","2.skills\u002Findex","npx skills add bx-shef\u002Fskills",{"title":56,"path":57,"stem":58,"description":59},"shef-feedback","\u002Fskills\u002Fshef-feedback","2.skills\u002F1.shef-feedback","Отправить отзыв о навыке shef-* или навыке команды. Брать ВСЕГДА, когда просят оставить или отправить отзыв о навыке — даже если сам навык в диалоге не виден, —",{"title":61,"description":6,"icon":62,"path":63,"stem":64,"children":65},"Модули shef.*","package","\u002Fmodules","3.modules",[66,69,131,179],{"title":61,"path":63,"stem":67,"description":68},"3.modules\u002Findex","Что за чем ставить",{"title":70,"description":6,"path":71,"stem":72,"children":73},"shef.options","\u002Fmodules\u002Foptions","3.modules\u002F1.options\u002Findex",[74,76,81,86,91,96,101,106,110,114,119,123,127],{"title":70,"path":71,"stem":72,"description":75},"фундамент: настройки, трейты, компоненты",{"title":77,"path":78,"stem":79,"description":80},"[`\\Shef\\Options\\Installator`] Installer","\u002Fmodules\u002Foptions\u002Finstaller","3.modules\u002F1.options\u002F1.installer","Для облегчения установок.",{"title":82,"path":83,"stem":84,"description":85},"Сборка, CI и релиз","\u002Fmodules\u002Foptions\u002Fbuild-and-install","3.modules\u002F1.options\u002F10.build-and-install","Раскладка репозитория — в module-structure.md, процесс —\nв CONTRIBUTING.md, установка глазами пользователя —\nв README.md.",{"title":87,"path":88,"stem":89,"description":90},"Раскладка репозитория","\u002Fmodules\u002Foptions\u002Fmodule-structure","3.modules\u002F1.options\u002F11.module-structure","Файл про устройство репозитория. Опорные точки модуля — в CLAUDE.md,\nпроцесс — в CONTRIBUTING.md, сборка — в\nbuild-and-install.md.",{"title":92,"path":93,"stem":94,"description":95},"Проверка на портале","\u002Fmodules\u002Foptions\u002Fportal-check","3.modules\u002F1.options\u002F12.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, кеш,\nраскладка файлов, поведение при обновлении. Проверять это приходится руками —\nи лучше по списку, потому что забытый шаг находит не разработчик, а клиент.",{"title":97,"path":98,"stem":99,"description":100},"[`\\Shef\\Options\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Foptions\u002Foptions","3.modules\u002F1.options\u002F2.options","Поддерживает следующие типы:",{"title":102,"path":103,"stem":104,"description":105},"Работа с пользователями","\u002Fmodules\u002Foptions\u002Fsecurity","3.modules\u002F1.options\u002F3.security","",{"title":107,"path":108,"stem":109,"description":105},"[`\\Shef\\Options\\Main\\Utils`] Утилиты","\u002Fmodules\u002Foptions\u002Futils","3.modules\u002F1.options\u002F4.utils",{"title":111,"path":112,"stem":113,"description":105},"[`\\Shef\\Options\\Components`] Работа с компонентами","\u002Fmodules\u002Foptions\u002Fcomponents","3.modules\u002F1.options\u002F5.components",{"title":115,"path":116,"stem":117,"description":118},"[`\\Shef\\Options\\Options`] Паттерны","\u002Fmodules\u002Foptions\u002Fpattern","3.modules\u002F1.options\u002F6.pattern","Запускаемые примеры: singleton.php,\nconfig.php, smartstd.php —\nкак их гонять, написано в examples\u002FREADME.md.",{"title":120,"path":121,"stem":122,"description":105},"[`\\Shef\\Options\\Tests`] Тестирование","\u002Fmodules\u002Foptions\u002Ftests","3.modules\u002F1.options\u002F7.tests",{"title":124,"path":125,"stem":126,"description":105},"[`\\Shef\\Options\\TraitList`] Набор трейтов","\u002Fmodules\u002Foptions\u002Ftraitlist","3.modules\u002F1.options\u002F8.traitlist",{"title":128,"path":129,"stem":130,"description":105},"Правила для ИИ-агентов в этом репозитории","\u002Fmodules\u002Foptions\u002Fagent-rules","3.modules\u002F1.options\u002F9.agent-rules",{"title":132,"description":6,"path":133,"stem":134,"children":135},"shef.problems","\u002Fmodules\u002Fproblems","3.modules\u002F2.problems\u002Findex",[136,138,143,147,152,157,161,166,169,172,175],{"title":132,"path":133,"stem":134,"description":137},"логи, журнал событий, учёт проблем",{"title":139,"path":140,"stem":141,"description":142},"[`\\Shef\\Problems\\Integration`] События и меню","\u002Fmodules\u002Fproblems\u002Fevents","3.modules\u002F2.problems\u002F1.events","Что модуль регистрирует в ядре при установке. Список — в .settings.php, ключ\ninstallEvents; что каждый обработчик существует, сверяет\ntests\u002Fsettings_test.php.",{"title":144,"path":145,"stem":146,"description":105},"Безопасность логов","\u002Fmodules\u002Fproblems\u002Fsecurity","3.modules\u002F2.problems\u002F10.security",{"title":148,"path":149,"stem":150,"description":151},"Быстрая отладка: `_pr`, `_log`, `_log1`","\u002Fmodules\u002Fproblems\u002Fdeffunctions","3.modules\u002F2.problems\u002F2.deffunctions","Функции объявляет def-functions.php, подключается он из include.php.",{"title":153,"path":154,"stem":155,"description":156},"Уровни логирования","\u002Fmodules\u002Fproblems\u002Floglevel","3.modules\u002F2.problems\u002F3.loglevel","Уровни — стандарт PSR-3, в Monolog это \\Monolog\\Level. Ниже — когда какой брать.",{"title":158,"path":159,"stem":160,"description":105},"[`\\Shef\\Problems\\Integration\\Monolog`] Monolog","\u002Fmodules\u002Fproblems\u002Fmonolog","3.modules\u002F2.problems\u002F4.monolog",{"title":162,"path":163,"stem":164,"description":165},"Ротация логов","\u002Fmodules\u002Fproblems\u002Flogrotate","3.modules\u002F2.problems\u002F5.logrotate","Логи модуля лежат в каталоге логов — по умолчанию на уровень выше корня сайта,\nдля BitrixVM \u002Fhome\u002Fbitrix\u002Fsh_log\u002F*.log, — и сами не чистятся. Ротацию делает\nlogrotate — системная утилита, а не Monolog: Monolog тоже умеет\n(RotatingFileHandler), но тогда за файлами следит каждый PHP-процесс, а не\nодна служба.",{"title":128,"path":167,"stem":168,"description":105},"\u002Fmodules\u002Fproblems\u002Fagent-rules","3.modules\u002F2.problems\u002F6.agent-rules",{"title":82,"path":170,"stem":171,"description":85},"\u002Fmodules\u002Fproblems\u002Fbuild-and-install","3.modules\u002F2.problems\u002F7.build-and-install",{"title":87,"path":173,"stem":174,"description":90},"\u002Fmodules\u002Fproblems\u002Fmodule-structure","3.modules\u002F2.problems\u002F8.module-structure",{"title":92,"path":176,"stem":177,"description":178},"\u002Fmodules\u002Fproblems\u002Fportal-check","3.modules\u002F2.problems\u002F9.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, меню,\nраскладка файлов, журнал событий, поведение при обновлении. Проверять это\nприходится руками — и лучше по списку, потому что забытый шаг находит не\nразработчик, а клиент.",{"title":180,"description":6,"path":181,"stem":182,"children":183},"shef.insync","\u002Fmodules\u002Finsync","3.modules\u002F3.insync\u002Findex",[184,186,191,194,198,203,208,213,218,222,227,232,235],{"title":180,"path":181,"stem":182,"description":185},"агенты, импорт, API-клиенты, модели",{"title":187,"path":188,"stem":189,"description":190},"[`\\Shef\\InSync\\Agents`] Агенты","\u002Fmodules\u002Finsync\u002Fagents","3.modules\u002F3.insync\u002F1.agents","Агент импорта — наследник \\Shef\\InSync\\Agents\\AAgent. Описание агента для\nb_agent — \\Shef\\InSync\\Agents\\Entity, установку и управление берёт на себя\n\\Shef\\InSync\\Agents\\Manager.",{"title":87,"path":192,"stem":193,"description":90},"\u002Fmodules\u002Finsync\u002Fmodule-structure","3.modules\u002F3.insync\u002F10.module-structure",{"title":92,"path":195,"stem":196,"description":197},"\u002Fmodules\u002Finsync\u002Fportal-check","3.modules\u002F3.insync\u002F11.portal-check","Всё, что ниже рантайма Битрикса, тестами не закрыть: установка, права, левое\nменю, раскладка компонентов, агенты, таблица импорта, поведение при\nобновлении. Проверять это приходится руками — и лучше по списку, потому что\nзабытый шаг находит не разработчик, а клиент.",{"title":199,"path":200,"stem":201,"description":202},"Безопасность","\u002Fmodules\u002Finsync\u002Fsecurity","3.modules\u002F3.insync\u002F12.security","Модуль даёт другим модулям заготовки для синхронизаций, и самые опасные места\nу него общие с ними: кто может запускать агенты и импорт, что ложится в каталоги\nимпорта, что уходит в SQL и в лог. Ниже — что держит модуль и что остаётся\nпроекту.",{"title":204,"path":205,"stem":206,"description":207},"[`\\Shef\\InSync\\Sync`] Импорт","\u002Fmodules\u002Finsync\u002Fimport","3.modules\u002F3.insync\u002F2.import","Импорт идёт в два шага через таблицу импорта \\Shef\\InSync\\Sync\\Model\\SyncTable\n(shef_insync_model):",{"title":209,"path":210,"stem":211,"description":212},"[`\\Shef\\InSync\\Api`] API","\u002Fmodules\u002Finsync\u002Fapi","3.modules\u002F3.insync\u002F3.api","Обращение к внешнему API по HTTP — наследник \\Shef\\InSync\\Api\\AConnector.",{"title":214,"path":215,"stem":216,"description":217},"[`\\Shef\\InSync\\TraitList\\Xml`] Парсинг XML","\u002Fmodules\u002Finsync\u002Fxml","3.modules\u002F3.insync\u002F4.xml","Разбор XML сделан через SbWereWolf\u002Fxml-navigator\n(статья на Хабре): XMLReader идёт по\nдокументу потоком, а каждый элемент с нужным тегом HierarchyComposer\nпревращает в массив — n имя, v значение, a атрибуты, s вложенные\nэлементы.",{"title":219,"path":220,"stem":221,"description":105},"Компоненты","\u002Fmodules\u002Finsync\u002Fcomponents","3.modules\u002F3.insync\u002F5.components",{"title":223,"path":224,"stem":225,"description":226},"Страницы","\u002Fmodules\u002Finsync\u002Fpage","3.modules\u002F3.insync\u002F6.page","Страницы модуля — в левом меню, штатным разделом intranet\n(Bitrix\\Intranet\\CustomSection): раздел «SH Импорт», код shinsync.\nВерхней панели и shef.uiclear больше нет.",{"title":228,"path":229,"stem":230,"description":231},"[`\\Shef\\InSync\\Main\\Options`] Опции настроек модуля","\u002Fmodules\u002Finsync\u002Foptions","3.modules\u002F3.insync\u002F7.options","Опции для страницы настроек модуля импорта (на ShOptionsConfig из\nshef.options): добавьте их во вкладку своего options_conf.php.",{"title":128,"path":233,"stem":234,"description":105},"\u002Fmodules\u002Finsync\u002Fagent-rules","3.modules\u002F3.insync\u002F8.agent-rules",{"title":82,"path":236,"stem":237,"description":85},"\u002Fmodules\u002Finsync\u002Fbuild-and-install","3.modules\u002F3.insync\u002F9.build-and-install",{"id":239,"title":26,"body":240,"description":29,"extension":1107,"meta":1108,"navigation":1109,"path":27,"rawbody":1110,"seo":1111,"stem":28,"__hash__":1112},"docs\u002F1.methodology\u002F3.bxshef.md",{"type":241,"value":242,"toc":1101},"minimark",[243,260,320,330,399,422,426,496,499,504,679,692,718,721,761,767,855,931,945,949,1075,1085,1097],[244,245,246,247,254,255,259],"p",{},"Навыки (стандарт ",[248,249,253],"a",{"href":250,"rel":251},"https:\u002F\u002Fagentskills.io",[252],"nofollow","Agent Skills",") для коробочного Битрикс24 и БУС живут в git-репозиториях —\nофициальных и от энтузиастов. ",[256,257,258],"strong",{},"Ставит их не bxshef",", а общий инструмент экосистемы:",[261,262,266],"pre",{"className":263,"code":264,"language":265,"meta":105,"style":105},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","npx skills add bx-shef\u002Foptions          # навыки модуля shef.options — в .agents\u002Fskills \u002F .claude\u002Fskills\nnpx skills add bx-shef\u002Fskills           # навыки базы и облака\nnpx skills check                        # есть ли обновления (skills-lock.json)\n","bash",[267,268,269,292,307],"code",{"__ignoreMap":105},[270,271,274,278,282,285,288],"span",{"class":272,"line":273},"line",1,[270,275,277],{"class":276},"sbgvK","npx",[270,279,281],{"class":280},"s_sjI"," skills",[270,283,284],{"class":280}," add",[270,286,287],{"class":280}," bx-shef\u002Foptions",[270,289,291],{"class":290},"sutJx","          # навыки модуля shef.options — в .agents\u002Fskills \u002F .claude\u002Fskills\n",[270,293,295,297,299,301,304],{"class":272,"line":294},2,[270,296,277],{"class":276},[270,298,281],{"class":280},[270,300,284],{"class":280},[270,302,303],{"class":280}," bx-shef\u002Fskills",[270,305,306],{"class":290},"           # навыки базы и облака\n",[270,308,310,312,314,317],{"class":272,"line":309},3,[270,311,277],{"class":276},[270,313,281],{"class":280},[270,315,316],{"class":280}," check",[270,318,319],{"class":290},"                        # есть ли обновления (skills-lock.json)\n",[244,321,322,325,326,329],{},[267,323,324],{},"bxshef"," отвечает за ",[256,327,328],{},"качество"," навыков — в репозитории навыков (через GitHub Action) и у разработчика:",[331,332,333,349],"table",{},[334,335,336],"thead",{},[337,338,339,343,346],"tr",{},[340,341,342],"th",{},"команда",[340,344,345],{},"что делает",[340,347,348],{},"код 1, если",[350,351,352,366,379],"tbody",{},[337,353,354,360,363],{},[355,356,357],"td",{},[267,358,359],{},"npx bxshef lint [--dir …] [--code …]",[355,361,362],{},"оформление по стандарту и по правилам из прогонов на стенде",[355,364,365],{},"есть ошибки",[337,367,368,373,376],{},[355,369,370],{},[267,371,372],{},"npx bxshef eval [--repeat 3] [--min 0.9] [--only …] [--agent claude]",[355,374,375],{},"выбирает ли модель нужный навык по фразе",[355,377,378],{},"ниже порога",[337,380,381,386,396],{},[355,382,383],{},[267,384,385],{},"npx bxshef feedback send --skill …",[355,387,388,389,392,393],{},"отзыв ИИ-агента о навыке одним вызовом — на адрес из ",[267,390,391],{},".bxshef.json"," или ",[267,394,395],{},"BXSHEF_FEEDBACK_URL",[355,397,398],{},"отзыв не отправлен",[244,400,401,402,405,406,409,410,413,414,417,418,421],{},"Где искать навыки, если ",[267,403,404],{},"--dir"," не задан: ",[267,407,408],{},".agents\u002Fskills",", затем ",[267,411,412],{},".claude\u002Fskills"," (проект), затем ",[267,415,416],{},"skills\u002F","\nс папками навыков (репозиторий навыков) от текущего каталога вверх;\nлибо текущий каталог, если это репозиторий навыков (папки с ",[267,419,420],{},"SKILL.md",").",[423,424,425],"h2",{"id":425},"lint",[427,428,429,447,475,478],"ul",{},[430,431,432,434,435,438,439,442,443,446],"li",{},[267,433,420],{}," есть; ",[267,436,437],{},"name"," = имя папки, из ",[267,440,441],{},"[a-z0-9-]","; ",[267,444,445],{},"description"," 80–1024 символов; есть заголовок.",[430,448,449,450,453,454,453,457,453,460,463,464,467,468,453,471,474],{},"У операционных навыков (имя содержит ",[267,451,452],{},"-new-",", ",[267,455,456],{},"-use-",[267,458,459],{},"-add-",[267,461,462],{},"-make-",") есть ",[267,465,466],{},"evals\u002Fselection.json",",\nв нём ≥ 3 фраз, есть фраза «на себя» и фраза на соседа или ",[267,469,470],{},"\u003Cnone>",[267,472,473],{},"expected"," ссылается на существующий навык.",[430,476,477],{},"Предупреждения: описание привязано к вендору («линейки shef.*» — в прогоне агент не брал такой навык для\nмодуля другого вендора); операционный навык без шага «отзыв».",[430,479,480,483,484,487,488,491,492,495],{},[267,481,482],{},"--code \u003Cпуть>",": каждый класс вида ",[267,485,486],{},"Vendor\\Ns\\Class"," из текста навыка объявлен в коде (по хвосту FQN или как\nnamespace). ",[267,489,490],{},"Bitrix\\*"," и корни, которых в коде нет, не проверяются; примерные вендоры — ",[267,493,494],{},"--ignore '*\\Demo\\*,Acme\\*'",".\nСтроки со словами «не существует» пропускаются — навык вправе назвать неверный класс, чтобы предостеречь.",[423,497,498],{"id":498},"eval",[244,500,501,503],{},[267,502,466],{}," у навыка:",[261,505,509],{"className":506,"code":507,"language":508,"meta":105,"style":105},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","[\n  { \"input\": \"сделай агент импорта прайса раз в час\", \"expected\": \"shef-new-agent\" },\n  { \"input\": \"добавь вторую вкладку в настройки\", \"expected\": [\"shef-new-option\", \"shef-options-settings\"], \"notes\": \"оба верны\" },\n  { \"input\": \"поправь опечатку в lang-файле\", \"expected\": \"\u003Cnone>\" }\n]\n","json",[267,510,511,517,565,634,673],{"__ignoreMap":105},[270,512,513],{"class":272,"line":273},[270,514,516],{"class":515},"sP7_E","[\n",[270,518,519,522,526,530,533,536,539,542,544,547,549,551,553,555,557,560,562],{"class":272,"line":294},[270,520,521],{"class":515},"  {",[270,523,525],{"class":524},"s39Yj"," \"",[270,527,529],{"class":528},"sseR_","input",[270,531,532],{"class":524},"\"",[270,534,535],{"class":515},":",[270,537,525],{"class":538},"sjJ54",[270,540,541],{"class":280},"сделай агент импорта прайса раз в час",[270,543,532],{"class":538},[270,545,546],{"class":515},",",[270,548,525],{"class":524},[270,550,473],{"class":528},[270,552,532],{"class":524},[270,554,535],{"class":515},[270,556,525],{"class":538},[270,558,559],{"class":280},"shef-new-agent",[270,561,532],{"class":538},[270,563,564],{"class":515}," },\n",[270,566,567,569,571,573,575,577,579,582,584,586,588,590,592,594,597,599,602,604,606,608,611,613,616,618,621,623,625,627,630,632],{"class":272,"line":309},[270,568,521],{"class":515},[270,570,525],{"class":524},[270,572,529],{"class":528},[270,574,532],{"class":524},[270,576,535],{"class":515},[270,578,525],{"class":538},[270,580,581],{"class":280},"добавь вторую вкладку в настройки",[270,583,532],{"class":538},[270,585,546],{"class":515},[270,587,525],{"class":524},[270,589,473],{"class":528},[270,591,532],{"class":524},[270,593,535],{"class":515},[270,595,596],{"class":515}," [",[270,598,532],{"class":538},[270,600,601],{"class":280},"shef-new-option",[270,603,532],{"class":538},[270,605,546],{"class":515},[270,607,525],{"class":538},[270,609,610],{"class":280},"shef-options-settings",[270,612,532],{"class":538},[270,614,615],{"class":515},"],",[270,617,525],{"class":524},[270,619,620],{"class":528},"notes",[270,622,532],{"class":524},[270,624,535],{"class":515},[270,626,525],{"class":538},[270,628,629],{"class":280},"оба верны",[270,631,532],{"class":538},[270,633,564],{"class":515},[270,635,637,639,641,643,645,647,649,652,654,656,658,660,662,664,666,668,670],{"class":272,"line":636},4,[270,638,521],{"class":515},[270,640,525],{"class":524},[270,642,529],{"class":528},[270,644,532],{"class":524},[270,646,535],{"class":515},[270,648,525],{"class":538},[270,650,651],{"class":280},"поправь опечатку в lang-файле",[270,653,532],{"class":538},[270,655,546],{"class":515},[270,657,525],{"class":524},[270,659,473],{"class":528},[270,661,532],{"class":524},[270,663,535],{"class":515},[270,665,525],{"class":538},[270,667,470],{"class":280},[270,669,532],{"class":538},[270,671,672],{"class":515}," }\n",[270,674,676],{"class":272,"line":675},5,[270,677,678],{"class":515},"]\n",[244,680,681,682,453,685,453,688,691],{},"По умолчанию — модель по API: описания всех навыков отдаются как инструменты, считается первый выбор.\nBitrixGPT через AI Router Вайбкода (",[267,683,684],{},"BXSHEF_EVAL_KEY",[267,686,687],{},"BXSHEF_EVAL_URL",[267,689,690],{},"BXSHEF_EVAL_MODEL","); любой\nOpenAI-совместимый endpoint подходит. Без ключа — пропуск с кодом 0.",[244,693,694,697,698,701,702,705,706,709,710,713,714,717],{},[267,695,696],{},"--agent claude"," — настоящий Claude Code: для каждой фразы поднимается пустой каталог с навыками, ",[267,699,700],{},"claude -p","\nс правами только на чтение и ",[267,703,704],{},"Skill",", засчитывается первый вызванный навык за ",[267,707,708],{},"--turns"," ходов. 30–90 с на фразу;\nгонять с ",[267,711,712],{},"--only"," на реальных фразах. Нужна обычная авторизация Claude Code, ключ API не нужен. Ставьте\n",[267,715,716],{},"--repeat 3",": выбор стохастичен.",[423,719,720],{"id":720},"feedback",[244,722,723,724,726,727,729,730,733,734,453,737,453,740,453,743,453,746,453,749,752,753,756,757,760],{},"Агенту ",[267,725,324],{}," не нужен: навык отзыва (",[267,728,56],{},", в шаблоне — ",[267,731,732],{},"acme-feedback",") сам\nотправляет тикет (",[267,735,736],{},"category",[267,738,739],{},"title",[267,741,742],{},"body",[267,744,745],{},"skill",[267,747,748],{},"outcome",[267,750,751],{},"helped",") одной командой\n",[267,754,755],{},"curl --data-urlencode …"," — адрес и поля написаны в навыке. Приёмник — ",[267,758,759],{},"feedback\u002F"," в этом репозитории.",[244,762,763,766],{},[267,764,765],{},"bxshef feedback send"," — то же из командной строки (собирает тикет из флагов):",[261,768,770],{"className":263,"code":769,"language":265,"meta":105,"style":105},"npx --yes bxshef@latest feedback send --skill \u003Cимя> --agent claude-code --outcome done \\\n  --task \"\u003Cзадача в одну строку>\" --helped \"\u003Cчто пригодилось>\" --issue \"unclear: \u003Cодно предложение>\"\n",[267,771,772,822],{"__ignoreMap":105},[270,773,774,776,780,783,786,789,792,796,799,803,806,809,812,815,818],{"class":272,"line":273},[270,775,277],{"class":276},[270,777,779],{"class":778},"stzsN"," --yes",[270,781,782],{"class":280}," bxshef@latest",[270,784,785],{"class":280}," feedback",[270,787,788],{"class":280}," send",[270,790,791],{"class":778}," --skill",[270,793,795],{"class":794},"smGrS"," \u003C",[270,797,798],{"class":280},"им",[270,800,802],{"class":801},"su5hD","я",[270,804,805],{"class":794},">",[270,807,808],{"class":778}," --agent",[270,810,811],{"class":280}," claude-code",[270,813,814],{"class":778}," --outcome",[270,816,817],{"class":280}," done",[270,819,821],{"class":820},"s_hVV"," \\\n",[270,823,824,827,829,832,834,837,839,842,844,847,849,852],{"class":272,"line":294},[270,825,826],{"class":778},"  --task",[270,828,525],{"class":538},[270,830,831],{"class":280},"\u003Cзадача в одну строку>",[270,833,532],{"class":538},[270,835,836],{"class":778}," --helped",[270,838,525],{"class":538},[270,840,841],{"class":280},"\u003Cчто пригодилось>",[270,843,532],{"class":538},[270,845,846],{"class":778}," --issue",[270,848,525],{"class":538},[270,850,851],{"class":280},"unclear: \u003Cодно предложение>",[270,853,854],{"class":538},"\"\n",[244,856,857,860,861,864,865,868,869,868,872,868,875,878,879,881,882,453,885,887,888,881,890,453,893,881,895,898,899,902,903,906,907,909,910,913,914,916,917,919,920,923,924,927,928,930],{},[267,858,859],{},"--helped"," и ",[267,862,863],{},"--issue"," повторяются; виды замечаний — ",[267,866,867],{},"missing"," \u002F ",[267,870,871],{},"wrong",[267,873,874],{},"unclear",[267,876,877],{},"noise"," (категория\nтикета — по самому серьёзному: ",[267,880,871],{}," → ",[267,883,884],{},"BUG",[267,886,874],{},"\u002F",[267,889,877],{},[267,891,892],{},"DOCS",[267,894,867],{},[267,896,897],{},"SUGGESTION",",\nбез замечаний — ",[267,900,901],{},"OTHER","); при ",[267,904,905],{},"done"," нужен хотя бы один ",[267,908,859],{},". Похожее на секрет не уходит.\nАдрес — ",[267,911,912],{},"{\"feedback\": \"https:\u002F\u002F…\"}"," в ",[267,915,391],{}," корня проекта, иначе ",[267,918,395],{},".\nТокен отправки, если приёмник его требует (",[267,921,922],{},"FEEDBACK_TOKEN","), — только из окружения:\n",[267,925,926],{},"BXSHEF_FEEDBACK_TOKEN"," (в ",[267,929,391],{}," не класть — файл коммитят). 401 — «токен не принят»,\n429 — «приёмник просит подождать N с».\nКоды выхода: 0 — отправлен, 1 — не отправлен (нет адреса, сеть, приёмник, секрет), 2 — ошибка в параметрах.",[244,932,933,934,860,937,940,941,944],{},"Старый путь — файлы в ",[267,935,936],{},".bxshef\u002Ffeedback\u002F",[267,938,939],{},"npx bxshef feedback [send]"," — работает как раньше;\nприёмник принимает до 20 тикетов в минуту с адреса, остальные файлы уйдут при следующем ",[267,942,943],{},"send",".",[423,946,948],{"id":947},"в-репозитории-навыков","В репозитории навыков",[261,950,954],{"className":951,"code":952,"language":953,"meta":105,"style":105},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","# .github\u002Fworkflows\u002Fskills.yml\non: [push, pull_request]\njobs:\n  skills:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: bx-shef\u002Fskills-action@v1\n        with:\n          eval-key: ${{ secrets.BXSHEF_EVAL_KEY }}   # без ключа шаг eval пропускается\n          min-selection: 0.9\n","yaml",[267,955,956,961,981,990,997,1007,1015,1029,1041,1049,1063],{"__ignoreMap":105},[270,957,958],{"class":272,"line":273},[270,959,960],{"class":290},"# .github\u002Fworkflows\u002Fskills.yml\n",[270,962,963,967,969,971,974,976,979],{"class":272,"line":294},[270,964,966],{"class":965},"syTEX","on",[270,968,535],{"class":515},[270,970,596],{"class":515},[270,972,973],{"class":280},"push",[270,975,546],{"class":515},[270,977,978],{"class":280}," pull_request",[270,980,678],{"class":515},[270,982,983,987],{"class":272,"line":309},[270,984,986],{"class":985},"sQzsp","jobs",[270,988,989],{"class":515},":\n",[270,991,992,995],{"class":272,"line":636},[270,993,994],{"class":985},"  skills",[270,996,989],{"class":515},[270,998,999,1002,1004],{"class":272,"line":675},[270,1000,1001],{"class":985},"    runs-on",[270,1003,535],{"class":515},[270,1005,1006],{"class":280}," ubuntu-latest\n",[270,1008,1010,1013],{"class":272,"line":1009},6,[270,1011,1012],{"class":985},"    steps",[270,1014,989],{"class":515},[270,1016,1018,1021,1024,1026],{"class":272,"line":1017},7,[270,1019,1020],{"class":515},"      -",[270,1022,1023],{"class":985}," uses",[270,1025,535],{"class":515},[270,1027,1028],{"class":280}," actions\u002Fcheckout@v4\n",[270,1030,1032,1034,1036,1038],{"class":272,"line":1031},8,[270,1033,1020],{"class":515},[270,1035,1023],{"class":985},[270,1037,535],{"class":515},[270,1039,1040],{"class":280}," bx-shef\u002Fskills-action@v1\n",[270,1042,1044,1047],{"class":272,"line":1043},9,[270,1045,1046],{"class":985},"        with",[270,1048,989],{"class":515},[270,1050,1052,1055,1057,1060],{"class":272,"line":1051},10,[270,1053,1054],{"class":985},"          eval-key",[270,1056,535],{"class":515},[270,1058,1059],{"class":280}," ${{ secrets.BXSHEF_EVAL_KEY }}",[270,1061,1062],{"class":290},"   # без ключа шаг eval пропускается\n",[270,1064,1066,1069,1071],{"class":272,"line":1065},11,[270,1067,1068],{"class":985},"          min-selection",[270,1070,535],{"class":515},[270,1072,1074],{"class":1073},"srdBf"," 0.9\n",[244,1076,1077,1078,453,1081,1084],{},"Action делает ",[267,1079,1080],{},"lint --code .",[267,1082,1083],{},"eval --repeat 3 --min 0.9",". Зелёный бейдж — условие попадания в каталог.",[1086,1087,1088],"note",{},[244,1089,1090,1091,1096],{},"Источник: ",[248,1092,1095],{"href":1093,"rel":1094},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002Fbxshef\u002FREADME.md",[252],"skills-standard\u002Fbxshef\u002FREADME.md"," — правки туда, сайт пересобирается сам.",[1098,1099,1100],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":105,"searchDepth":309,"depth":309,"links":1102},[1103,1104,1105,1106],{"id":425,"depth":294,"text":425},{"id":498,"depth":294,"text":498},{"id":720,"depth":294,"text":720},{"id":947,"depth":294,"text":948},"md",{},true,"---\ntitle: \"bxshef — CLI\"\ndescription: \"lint, eval, feedback\"\n---\n\nНавыки (стандарт [Agent Skills](https:\u002F\u002Fagentskills.io)) для коробочного Битрикс24 и БУС живут в git-репозиториях —\nофициальных и от энтузиастов. **Ставит их не bxshef**, а общий инструмент экосистемы:\n\n```bash\nnpx skills add bx-shef\u002Foptions          # навыки модуля shef.options — в .agents\u002Fskills \u002F .claude\u002Fskills\nnpx skills add bx-shef\u002Fskills           # навыки базы и облака\nnpx skills check                        # есть ли обновления (skills-lock.json)\n```\n\n`bxshef` отвечает за **качество** навыков — в репозитории навыков (через GitHub Action) и у разработчика:\n\n| команда | что делает | код 1, если |\n|---|---|---|\n| `npx bxshef lint [--dir …] [--code …]` | оформление по стандарту и по правилам из прогонов на стенде | есть ошибки |\n| `npx bxshef eval [--repeat 3] [--min 0.9] [--only …] [--agent claude]` | выбирает ли модель нужный навык по фразе | ниже порога |\n| `npx bxshef feedback send --skill …` | отзыв ИИ-агента о навыке одним вызовом — на адрес из `.bxshef.json` или `BXSHEF_FEEDBACK_URL` | отзыв не отправлен |\n\nГде искать навыки, если `--dir` не задан: `.agents\u002Fskills`, затем `.claude\u002Fskills` (проект), затем `skills\u002F`\nс папками навыков (репозиторий навыков) от текущего каталога вверх;\nлибо текущий каталог, если это репозиторий навыков (папки с `SKILL.md`).\n\n## lint\n\n- `SKILL.md` есть; `name` = имя папки, из `[a-z0-9-]`; `description` 80–1024 символов; есть заголовок.\n- У операционных навыков (имя содержит `-new-`, `-use-`, `-add-`, `-make-`) есть `evals\u002Fselection.json`,\n  в нём ≥ 3 фраз, есть фраза «на себя» и фраза на соседа или `\u003Cnone>`, `expected` ссылается на существующий навык.\n- Предупреждения: описание привязано к вендору («линейки shef.\\*» — в прогоне агент не брал такой навык для\n  модуля другого вендора); операционный навык без шага «отзыв».\n- `--code \u003Cпуть>`: каждый класс вида `Vendor\\Ns\\Class` из текста навыка объявлен в коде (по хвосту FQN или как\n  namespace). `Bitrix\\*` и корни, которых в коде нет, не проверяются; примерные вендоры — `--ignore '*\\Demo\\*,Acme\\*'`.\n  Строки со словами «не существует» пропускаются — навык вправе назвать неверный класс, чтобы предостеречь.\n\n## eval\n\n`evals\u002Fselection.json` у навыка:\n\n```json\n[\n  { \"input\": \"сделай агент импорта прайса раз в час\", \"expected\": \"shef-new-agent\" },\n  { \"input\": \"добавь вторую вкладку в настройки\", \"expected\": [\"shef-new-option\", \"shef-options-settings\"], \"notes\": \"оба верны\" },\n  { \"input\": \"поправь опечатку в lang-файле\", \"expected\": \"\u003Cnone>\" }\n]\n```\n\nПо умолчанию — модель по API: описания всех навыков отдаются как инструменты, считается первый выбор.\nBitrixGPT через AI Router Вайбкода (`BXSHEF_EVAL_KEY`, `BXSHEF_EVAL_URL`, `BXSHEF_EVAL_MODEL`); любой\nOpenAI-совместимый endpoint подходит. Без ключа — пропуск с кодом 0.\n\n`--agent claude` — настоящий Claude Code: для каждой фразы поднимается пустой каталог с навыками, `claude -p`\nс правами только на чтение и `Skill`, засчитывается первый вызванный навык за `--turns` ходов. 30–90 с на фразу;\nгонять с `--only` на реальных фразах. Нужна обычная авторизация Claude Code, ключ API не нужен. Ставьте\n`--repeat 3`: выбор стохастичен.\n\n## feedback\n\nАгенту `bxshef` не нужен: навык отзыва (`shef-feedback`, в шаблоне — `acme-feedback`) сам\nотправляет тикет (`category`, `title`, `body`, `skill`, `outcome`, `helped`) одной командой\n`curl --data-urlencode …` — адрес и поля написаны в навыке. Приёмник — `feedback\u002F` в этом репозитории.\n\n`bxshef feedback send` — то же из командной строки (собирает тикет из флагов):\n\n```bash\nnpx --yes bxshef@latest feedback send --skill \u003Cимя> --agent claude-code --outcome done \\\n  --task \"\u003Cзадача в одну строку>\" --helped \"\u003Cчто пригодилось>\" --issue \"unclear: \u003Cодно предложение>\"\n```\n\n`--helped` и `--issue` повторяются; виды замечаний — `missing` \u002F `wrong` \u002F `unclear` \u002F `noise` (категория\nтикета — по самому серьёзному: `wrong` → `BUG`, `unclear`\u002F`noise` → `DOCS`, `missing` → `SUGGESTION`,\nбез замечаний — `OTHER`); при `done` нужен хотя бы один `--helped`. Похожее на секрет не уходит.\nАдрес — `{\"feedback\": \"https:\u002F\u002F…\"}` в `.bxshef.json` корня проекта, иначе `BXSHEF_FEEDBACK_URL`.\nТокен отправки, если приёмник его требует (`FEEDBACK_TOKEN`), — только из окружения:\n`BXSHEF_FEEDBACK_TOKEN` (в `.bxshef.json` не класть — файл коммитят). 401 — «токен не принят»,\n429 — «приёмник просит подождать N с».\nКоды выхода: 0 — отправлен, 1 — не отправлен (нет адреса, сеть, приёмник, секрет), 2 — ошибка в параметрах.\n\nСтарый путь — файлы в `.bxshef\u002Ffeedback\u002F` и `npx bxshef feedback [send]` — работает как раньше;\nприёмник принимает до 20 тикетов в минуту с адреса, остальные файлы уйдут при следующем `send`.\n\n## В репозитории навыков\n\n```yaml\n# .github\u002Fworkflows\u002Fskills.yml\non: [push, pull_request]\njobs:\n  skills:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: bx-shef\u002Fskills-action@v1\n        with:\n          eval-key: ${{ secrets.BXSHEF_EVAL_KEY }}   # без ключа шаг eval пропускается\n          min-selection: 0.9\n```\n\nAction делает `lint --code .`, `eval --repeat 3 --min 0.9`. Зелёный бейдж — условие попадания в каталог.\n\n::note\nИсточник: [skills-standard\u002Fbxshef\u002FREADME.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fskills-standard\u002Fblob\u002Fmain\u002Fbxshef\u002FREADME.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":26,"description":29},"OayKGxBR8fZ_J5jnIyoy_12g3edfSFVbNi4N2KecQjQ",[1114,1115],{"title":21,"path":22,"stem":23,"description":24,"children":-1},{"title":31,"path":32,"stem":33,"description":34,"children":-1},1790857268556]