[{"data":1,"prerenderedAt":925},["ShallowReactive",2],{"navigation_docs":3,"-modules-problems-module-structure":238,"-modules-problems-module-structure-surround":922},[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":87,"body":240,"description":90,"extension":916,"meta":917,"navigation":918,"path":173,"rawbody":919,"seo":920,"stem":174,"__hash__":921},"docs\u002F3.modules\u002F2.problems\u002F8.module-structure.md",{"type":241,"value":242,"toc":906},"minimark",[243,265,270,297,303,319,336,340,768,775,805,817,826,830,839,864,880,884,894],[244,245,246,247,254,255,260,261,264],"p",{},"Файл про устройство репозитория. Опорные точки модуля — в ",[248,249,253],"a",{"href":250,"rel":251},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FCLAUDE.md",[252],"nofollow","CLAUDE.md",",\nпроцесс — в ",[248,256,259],{"href":257,"rel":258},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FCONTRIBUTING.md",[252],"CONTRIBUTING.md",", сборка — в\n",[248,262,263],{"href":170},"build-and-install.md",".",[266,267,269],"h2",{"id":268},"модуль-лежит-в-корне-и-это-вынужденно","Модуль лежит в корне, и это вынужденно",[244,271,272,273,277,278,282,283,282,286,289,290,293,294,264],{},"Composer разворачивает в целевой каталог ",[274,275,276],"strong",{},"корень пакета целиком"," и подкаталоги\nвыбирать не умеет. Поэтому ",[279,280,281],"code",{},"lib\u002F",", ",[279,284,285],{},"install\u002F",[279,287,288],{},"lang\u002F"," лежат прямо в корне\nрепозитория, рядом с ",[279,291,292],{},"build.sh"," и ",[279,295,296],{},".github\u002F",[244,298,299,300,302],{},"Плата за это — два списка в шапке ",[279,301,292],{},":",[304,305,306,313],"ul",{},[307,308,309,312],"li",{},[274,310,311],{},"SHIP"," — уезжает на портал и в Composer-пакет;",[307,314,315,318],{},[274,316,317],{},"KEEP"," — остаётся в репозитории.",[244,320,321,324,325,328,329,332,333,264],{},[274,322,323],{},"Файл, не попавший ни в один список, роняет сборку."," Тот же список продублирован\nв ",[279,326,327],{},".gitattributes"," через ",[279,330,331],{},"export-ignore","; списки обязаны совпадать, сверяется\nавтоматически, см. ",[279,334,335],{},"check_gitattributes",[266,337,339],{"id":338},"что-где-лежит","Что где лежит",[341,342,343,358],"table",{},[344,345,346],"thead",{},[347,348,349,353,355],"tr",{},[350,351,352],"th",{},"путь",[350,354],{},[350,356,357],{},"что это",[359,360,361,377,395,414,426,446,458,478,492,511,523,544,558,572,584,601,616,628,639,651,663,685,696,709,722,737,749],"tbody",{},[347,362,363,369,371],{},[364,365,366],"td",{},[279,367,368],{},"install\u002Findex.php",[364,370,311],{},[364,372,373,374],{},"установщик, класс ",[279,375,376],{},"shef_problems extends CModule",[347,378,379,384,386],{},[364,380,381],{},[279,382,383],{},"install\u002Fversion.php",[364,385,311],{},[364,387,388,293,391,394],{},[279,389,390],{},"VERSION",[279,392,393],{},"VERSION_DATE"," — источник истины о версии",[347,396,397,402,404],{},[364,398,399],{},[279,400,401],{},"install\u002Fjs\u002Fshef-problems\u002F",[364,403,311],{},[364,405,406,407,410,411],{},"стили вывода ",[279,408,409],{},"PrHtml","; установщик раскладывает их в ",[279,412,413],{},"\u002Fbitrix\u002Fjs",[347,415,416,421,423],{},[364,417,418],{},[279,419,420],{},"admin\u002Fmenu.php",[364,422,311],{},[364,424,425],{},"меню «Учёт проблем»; ядро подключает его само, из каталога модуля",[347,427,428,433,435],{},[364,429,430],{},[279,431,432],{},"admin\u002Flogs.php",[364,434,311],{},[364,436,437,438,441,442,445],{},"страница просмотра логов; открывается заглушкой ",[279,439,440],{},"\u002Fbitrix\u002Fadmin\u002Fshef_problems_logs.php",", которую пишет установщик (",[279,443,444],{},"Main\\AdminPage",")",[347,447,448,453,455],{},[364,449,450],{},[279,451,452],{},".settings.php",[364,454,311],{},[364,456,457],{},"зависимости, события, раскладка, сервисы-логгеры, откуда брать Monolog",[347,459,460,465,467],{},[364,461,462],{},[279,463,464],{},"include.php",[364,466,311],{},[364,468,469,470,473,474,477],{},"точка входа: ",[279,471,472],{},"def-functions.php",", потом ",[279,475,476],{},"autoload.php"," — порядок важен",[347,479,480,484,486],{},[364,481,482],{},[279,483,476],{},[364,485,311],{},[364,487,488,489,491],{},"подключает ",[279,490,70],{}," и регистрирует Monolog",[347,493,494,498,500],{},[364,495,496],{},[279,497,472],{},[364,499,311],{},[364,501,502,282,505,282,508],{},[279,503,504],{},"_pr()",[279,506,507],{},"_log()",[279,509,510],{},"_log1()",[347,512,513,518,520],{},[364,514,515],{},[279,516,517],{},"default_option.php",[364,519,311],{},[364,521,522],{},"умолчания настроек",[347,524,525,533,535],{},[364,526,527,282,530],{},[279,528,529],{},"options.php",[279,531,532],{},"options_conf.php",[364,534,311],{},[364,536,537,538,541,542],{},"страница настроек на ",[279,539,540],{},"ShOptionsConfig"," из ",[279,543,70],{},[347,545,546,550,552],{},[364,547,548],{},[279,549,281],{},[364,551,311],{},[364,553,554,555],{},"классы модуля, ",[274,556,557],{},"имена файлов строго строчными",[347,559,560,565,567],{},[364,561,562],{},[279,563,564],{},"lang\u002Fru\u002F",[364,566,311],{},[364,568,569,570],{},"языковые файлы, зеркалят структуру ",[279,571,281],{},[347,573,574,579,581],{},[364,575,576],{},[279,577,578],{},"vendor\u002Fmonolog\u002Fmonolog\u002F",[364,580,311],{},[364,582,583],{},"своя копия Monolog для установки архивом",[347,585,586,597,599],{},[364,587,588,282,591,282,594],{},[279,589,590],{},"README.md",[279,592,593],{},"CHANGELOG.md",[279,595,596],{},"LICENSE",[364,598,311],{},[364,600],{},[347,602,603,608,610],{},[364,604,605],{},[279,606,607],{},"composer.json",[364,609,311],{},[364,611,612,613],{},"манифест пакета ",[279,614,615],{},"bxshef\u002Fproblems",[347,617,618,623,625],{},[364,619,620],{},[279,621,622],{},"docs\u002F",[364,624,317],{},[364,626,627],{},"вся документация, пример настроек logrotate",[347,629,630,634,636],{},[364,631,632],{},[279,633,292],{},[364,635,317],{},[364,637,638],{},"сборка и проверки",[347,640,641,646,648],{},[364,642,643],{},[279,644,645],{},"tests\u002F",[364,647,317],{},[364,649,650],{},"тесты и заглушки ядра",[347,652,653,658,660],{},[364,654,655],{},[279,656,657],{},"examples\u002F",[364,659,317],{},[364,661,662],{},"запускаемые примеры",[347,664,665,670,672],{},[364,666,667],{},[279,668,669],{},".claude\u002Fskills\u002F",[364,671,317],{},[364,673,674,675,541,678,681,682],{},"навыки агента — ",[274,676,677],{},"копия",[279,679,680],{},"bx-shef\u002Foptions",", раскладывает ",[279,683,684],{},"sync.sh",[347,686,687,691,693],{},[364,688,689],{},[279,690,296],{},[364,692,317],{},[364,694,695],{},"CI и релиз",[347,697,698,704,706],{},[364,699,700,282,702],{},[279,701,259],{},[279,703,253],{},[364,705,317],{},[364,707,708],{},"процесс и памятка агенту",[347,710,711,718,720],{},[364,712,713,282,715],{},[279,714,327],{},[279,716,717],{},".gitignore",[364,719,317],{},[364,721],{},[347,723,724,729,731],{},[364,725,726],{},[279,727,728],{},".php-cs-fixer.dist.php",[364,730,317],{},[364,732,733,734],{},"правила линтера, ",[279,735,736],{},"@PSR12",[347,738,739,744,746],{},[364,740,741],{},[279,742,743],{},"composer.lock",[364,745,317],{},[364,747,748],{},"держит зависимости линтера; пакету не нужен — Composer читает lock только у корневого проекта",[347,750,751,756,759],{},[364,752,753],{},[279,754,755],{},"vendor-dev\u002F",[364,757,758],{},"—",[364,760,761,762,765,766],{},"инструменты разработчика из ",[279,763,764],{},"composer install",", в ",[279,767,717],{},[266,769,771,772,774],{"id":770},"нижний-регистр-в-lib-обязателен","Нижний регистр в ",[279,773,281],{}," обязателен",[244,776,777,780,781,784,785,788,789,792,793,796,797,800,801,804],{},[279,778,779],{},"Bitrix\\Main\\Loader"," отображает класс в путь ",[274,782,783],{},"строчными",", разбирая первые два\nсегмента namespace как id модуля: ",[279,786,787],{},"Shef\\Problems\\Main\\Utils"," ищется как\n",[279,790,791],{},"bitrix\u002Fmodules\u002Fshef.problems\u002Flib\u002Fmain\u002Futils.php",". Поэтому свой namespace в\n",[279,794,795],{},"registerNamespace"," не нужен — там только Monolog. Отсюда же и трейты в\n",[279,798,799],{},"lib\u002Ffactory\u002Ftrait\u002F",": сегмент ",[279,802,803],{},"Trait"," в namespace PHP 8 принимает.",[244,806,807,808,282,810,813,814,264],{},"На macOS заглавная буква сходит с рук, на боевом Linux класс просто не найдётся.\nПроверяется в ",[279,809,292],{},[279,811,812],{},"check_lowercase",", и в ",[279,815,816],{},"tests\u002Fautoload_test.php",[244,818,819,820,823,824,264],{},"У ",[279,821,822],{},"vendor\u002F"," соглашение своё — PSR-4 с заглавными, путь задаёт ",[279,825,452],{},[266,827,829],{"id":828},"фронт","Фронт",[831,832,837],"pre",{"className":833,"code":835,"language":836},[834],"language-text","install\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html\u002F        -> \u002Fbitrix\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html\u002F\ninstall\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html-admin\u002F  -> \u002Fbitrix\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html-admin\u002F\n","text",[279,838,835],{"__ignoreMap":105},[244,840,841,842,844,845,848,849,852,853,856,857,860,861,264],{},"Каталог модуля браузеру недоступен, поэтому стили копирует установщик — карта\nв ",[279,843,452],{},", ключ ",[279,846,847],{},"installDir",". Расширения находятся ядром по имени\n",[279,850,851],{},"shef-problems.monolog-pr-html",": каталог через дефис — требование имён\nрасширений. Имена живут в одном месте, ",[279,854,855],{},"Constants::EXTENSION_PR_HTML"," и\n",[279,858,859],{},"EXTENSION_PR_HTML_ADMIN","; сходимость с раскладкой проверяет\n",[279,862,863],{},"tests\u002Fassets_test.php",[244,865,866,869,870,873,874,877,878,264],{},[279,867,868],{},"style.min.css"," рядом со ",[279,871,872],{},"style.css"," — минифицированная копия, её ядро берёт\nпри включённой оптимизации css. Правите стиль — пересоберите и её.\n",[279,875,876],{},"*.min.min.*"," — мусор сборщиков, его отсекает ",[279,879,717],{},[266,881,883],{"id":882},"документация-не-едет-на-портал","Документация не едет на портал",[244,885,886,887,889,890,893],{},"Документация живёт в репозитории. В поставке остаётся только ",[279,888,590],{}," — как\nreadme пакета, — и все ссылки из него ведут на GitHub. Скриншоты, которые до\n2.0.0 раскладывались в ",[279,891,892],{},"\u002Fbitrix\u002Fimages\u002Fshef.problems",", ушли вместе с\nдокументацией; каталог на обновлённых порталах убирает деинсталляция.",[895,896,897],"note",{},[244,898,899,900,905],{},"Источник: ",[248,901,904],{"href":902,"rel":903},"https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fmodule-structure.md",[252],"problems\u002Fdocs\u002Fmodule-structure.md"," — правки туда, сайт пересобирается сам.",{"title":105,"searchDepth":907,"depth":907,"links":908},3,[909,911,912,914,915],{"id":268,"depth":910,"text":269},2,{"id":338,"depth":910,"text":339},{"id":770,"depth":910,"text":913},"Нижний регистр в lib\u002F обязателен",{"id":828,"depth":910,"text":829},{"id":882,"depth":910,"text":883},"md",{},true,"---\ntitle: \"Раскладка репозитория\"\n---\n\nФайл про устройство репозитория. Опорные точки модуля — в [CLAUDE.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FCLAUDE.md),\nпроцесс — в [CONTRIBUTING.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002FCONTRIBUTING.md), сборка — в\n[build-and-install.md](\u002Fmodules\u002Fproblems\u002Fbuild-and-install).\n\n## Модуль лежит в корне, и это вынужденно\n\nComposer разворачивает в целевой каталог **корень пакета целиком** и подкаталоги\nвыбирать не умеет. Поэтому `lib\u002F`, `install\u002F`, `lang\u002F` лежат прямо в корне\nрепозитория, рядом с `build.sh` и `.github\u002F`.\n\nПлата за это — два списка в шапке `build.sh`:\n\n* **SHIP** — уезжает на портал и в Composer-пакет;\n* **KEEP** — остаётся в репозитории.\n\n**Файл, не попавший ни в один список, роняет сборку.** Тот же список продублирован\nв `.gitattributes` через `export-ignore`; списки обязаны совпадать, сверяется\nавтоматически, см. `check_gitattributes`.\n\n## Что где лежит\n\n| путь | | что это |\n|---|---|---|\n| `install\u002Findex.php` | SHIP | установщик, класс `shef_problems extends CModule` |\n| `install\u002Fversion.php` | SHIP | `VERSION` и `VERSION_DATE` — источник истины о версии |\n| `install\u002Fjs\u002Fshef-problems\u002F` | SHIP | стили вывода `PrHtml`; установщик раскладывает их в `\u002Fbitrix\u002Fjs` |\n| `admin\u002Fmenu.php` | SHIP | меню «Учёт проблем»; ядро подключает его само, из каталога модуля |\n| `admin\u002Flogs.php` | SHIP | страница просмотра логов; открывается заглушкой `\u002Fbitrix\u002Fadmin\u002Fshef_problems_logs.php`, которую пишет установщик (`Main\\AdminPage`) |\n| `.settings.php` | SHIP | зависимости, события, раскладка, сервисы-логгеры, откуда брать Monolog |\n| `include.php` | SHIP | точка входа: `def-functions.php`, потом `autoload.php` — порядок важен |\n| `autoload.php` | SHIP | подключает `shef.options` и регистрирует Monolog |\n| `def-functions.php` | SHIP | `_pr()`, `_log()`, `_log1()` |\n| `default_option.php` | SHIP | умолчания настроек |\n| `options.php`, `options_conf.php` | SHIP | страница настроек на `ShOptionsConfig` из `shef.options` |\n| `lib\u002F` | SHIP | классы модуля, **имена файлов строго строчными** |\n| `lang\u002Fru\u002F` | SHIP | языковые файлы, зеркалят структуру `lib\u002F` |\n| `vendor\u002Fmonolog\u002Fmonolog\u002F` | SHIP | своя копия Monolog для установки архивом |\n| `README.md`, `CHANGELOG.md`, `LICENSE` | SHIP | |\n| `composer.json` | SHIP | манифест пакета `bxshef\u002Fproblems` |\n| `docs\u002F` | KEEP | вся документация, пример настроек logrotate |\n| `build.sh` | KEEP | сборка и проверки |\n| `tests\u002F` | KEEP | тесты и заглушки ядра |\n| `examples\u002F` | KEEP | запускаемые примеры |\n| `.claude\u002Fskills\u002F` | KEEP | навыки агента — **копия** из `bx-shef\u002Foptions`, раскладывает `sync.sh` |\n| `.github\u002F` | KEEP | CI и релиз |\n| `CONTRIBUTING.md`, `CLAUDE.md` | KEEP | процесс и памятка агенту |\n| `.gitattributes`, `.gitignore` | KEEP | |\n| `.php-cs-fixer.dist.php` | KEEP | правила линтера, `@PSR12` |\n| `composer.lock` | KEEP | держит зависимости линтера; пакету не нужен — Composer читает lock только у корневого проекта |\n| `vendor-dev\u002F` | — | инструменты разработчика из `composer install`, в `.gitignore` |\n\n## Нижний регистр в `lib\u002F` обязателен\n\n`Bitrix\\Main\\Loader` отображает класс в путь **строчными**, разбирая первые два\nсегмента namespace как id модуля: `Shef\\Problems\\Main\\Utils` ищется как\n`bitrix\u002Fmodules\u002Fshef.problems\u002Flib\u002Fmain\u002Futils.php`. Поэтому свой namespace в\n`registerNamespace` не нужен — там только Monolog. Отсюда же и трейты в\n`lib\u002Ffactory\u002Ftrait\u002F`: сегмент `Trait` в namespace PHP 8 принимает.\n\nНа macOS заглавная буква сходит с рук, на боевом Linux класс просто не найдётся.\nПроверяется в `build.sh`, `check_lowercase`, и в `tests\u002Fautoload_test.php`.\n\nУ `vendor\u002F` соглашение своё — PSR-4 с заглавными, путь задаёт `.settings.php`.\n\n## Фронт\n\n```\ninstall\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html\u002F        -> \u002Fbitrix\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html\u002F\ninstall\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html-admin\u002F  -> \u002Fbitrix\u002Fjs\u002Fshef-problems\u002Fmonolog-pr-html-admin\u002F\n```\n\nКаталог модуля браузеру недоступен, поэтому стили копирует установщик — карта\nв `.settings.php`, ключ `installDir`. Расширения находятся ядром по имени\n`shef-problems.monolog-pr-html`: каталог через дефис — требование имён\nрасширений. Имена живут в одном месте, `Constants::EXTENSION_PR_HTML` и\n`EXTENSION_PR_HTML_ADMIN`; сходимость с раскладкой проверяет\n`tests\u002Fassets_test.php`.\n\n`style.min.css` рядом со `style.css` — минифицированная копия, её ядро берёт\nпри включённой оптимизации css. Правите стиль — пересоберите и её.\n`*.min.min.*` — мусор сборщиков, его отсекает `.gitignore`.\n\n## Документация не едет на портал\n\nДокументация живёт в репозитории. В поставке остаётся только `README.md` — как\nreadme пакета, — и все ссылки из него ведут на GitHub. Скриншоты, которые до\n2.0.0 раскладывались в `\u002Fbitrix\u002Fimages\u002Fshef.problems`, ушли вместе с\nдокументацией; каталог на обновлённых порталах убирает деинсталляция.\n\n::note\nИсточник: [problems\u002Fdocs\u002Fmodule-structure.md](https:\u002F\u002Fgithub.com\u002Fbx-shef\u002Fproblems\u002Fblob\u002Fmain\u002Fdocs\u002Fmodule-structure.md) — правки туда, сайт пересобирается сам.\n::\n\n",{"title":87,"description":90},"Mem5n6qiRZ7XdfYegpnlNywGpbZMCSa-6R-ai0KxFPs",[923,924],{"title":82,"path":170,"stem":171,"description":85,"children":-1},{"title":92,"path":176,"stem":177,"description":178,"children":-1},1790857269973]