[{"data":1,"prerenderedAt":913},["ShallowReactive",2],{"navigation_docs_ru":3,"-ru-cli-diff-and-ci":361,"-ru-cli-diff-and-ci-surround":908},[4,23,49,83,93,115,343,353],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Начало работы","i-lucide-rocket","\u002Fru\u002Fgetting-started","ru\u002F1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Введение","\u002Fru\u002Fgetting-started\u002Fintroduction","ru\u002F1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Установка","\u002Fru\u002Fgetting-started\u002Finstallation","ru\u002F1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"ranklint init","\u002Fru\u002Fgetting-started\u002Finit","ru\u002F1.getting-started\u002F3.init",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Nuxt-модуль","i-lucide-box","\u002Fru\u002Fmodule","ru\u002F2.module",[29,33,37,41,45],{"title":30,"path":31,"stem":32},"Обзор","\u002Fru\u002Fmodule\u002Foverview","ru\u002F2.module\u002F1.overview",{"title":34,"path":35,"stem":36},"Sitemap","\u002Fru\u002Fmodule\u002Fsitemap","ru\u002F2.module\u002F2.sitemap",{"title":38,"path":39,"stem":40},"Robots","\u002Fru\u002Fmodule\u002Frobots","ru\u002F2.module\u002F3.robots",{"title":42,"path":43,"stem":44},"Композаблы","\u002Fru\u002Fmodule\u002Fcomposables","ru\u002F2.module\u002F4.composables",{"title":46,"path":47,"stem":48},"DevTools","\u002Fru\u002Fmodule\u002Fdevtools","ru\u002F2.module\u002F5.devtools",{"title":50,"icon":51,"path":52,"stem":53,"children":54,"page":22},"CLI","i-lucide-terminal","\u002Fru\u002Fcli","ru\u002F3.cli",[55,59,63,67,71,75,79],{"title":56,"path":57,"stem":58},"ranklint audit","\u002Fru\u002Fcli\u002Faudit","ru\u002F3.cli\u002F1.audit",{"title":60,"path":61,"stem":62},"Diff и CI","\u002Fru\u002Fcli\u002Fdiff-and-ci","ru\u002F3.cli\u002F2.diff-and-ci",{"title":64,"path":65,"stem":66},"Мониторинг прода","\u002Fru\u002Fcli\u002Fmonitor","ru\u002F3.cli\u002F3.monitor",{"title":68,"path":69,"stem":70},"Lighthouse","\u002Fru\u002Fcli\u002Flighthouse","ru\u002F3.cli\u002F4.lighthouse",{"title":72,"path":73,"stem":74},"Зоны (multi-app домены)","\u002Fru\u002Fcli\u002Fzones","ru\u002F3.cli\u002F5.zones",{"title":76,"path":77,"stem":78},"Остальные команды","\u002Fru\u002Fcli\u002Fother-commands","ru\u002F3.cli\u002F6.other-commands",{"title":80,"path":81,"stem":82},"Watch mode","\u002Fru\u002Fcli\u002Fwatch","ru\u002F3.cli\u002F7.watch",{"title":84,"icon":85,"path":86,"stem":87,"children":88,"page":22},"Конфигурация","i-lucide-settings-2","\u002Fru\u002Fconfig","ru\u002F4.config",[89],{"title":90,"path":91,"stem":92},"Справочник","\u002Fru\u002Fconfig\u002Freference","ru\u002F4.config\u002F1.reference",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":22},"Продвинутое","i-lucide-wrench","\u002Fru\u002Fadvanced","ru\u002F5.advanced",[99,103,107,111],{"title":100,"path":101,"stem":102},"Кастомные правила и пресеты","\u002Fru\u002Fadvanced\u002Fcustom-rules","ru\u002F5.advanced\u002F1.custom-rules",{"title":104,"path":105,"stem":106},"Умные эвристики","\u002Fru\u002Fadvanced\u002Fheuristics","ru\u002F5.advanced\u002F2.heuristics",{"title":108,"path":109,"stem":110},"Env-переменные","\u002Fru\u002Fadvanced\u002Fenv","ru\u002F5.advanced\u002F3.env",{"title":112,"path":113,"stem":114},"Нюансы и ограничения","\u002Fru\u002Fadvanced\u002Fnuances","ru\u002F5.advanced\u002F4.nuances",{"title":116,"icon":117,"path":118,"stem":119,"children":120},"Правила","i-lucide-list-checks","\u002Fru\u002Frules","ru\u002F6.rules\u002Findex",[121,123,148,173,190,207,228,257,306,330],{"title":122,"path":118,"stem":119},"Все правила",{"title":124,"path":125,"stem":126,"children":127,"page":22},"Headings","\u002Fru\u002Frules\u002Fheadings","ru\u002F6.rules\u002Fheadings",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"headings:h1-length","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-h1-length","ru\u002F6.rules\u002Fheadings\u002Fheadings-h1-length",{"title":133,"path":134,"stem":135},"headings:hierarchy","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-hierarchy","ru\u002F6.rules\u002Fheadings\u002Fheadings-hierarchy",{"title":137,"path":138,"stem":139},"headings:no-empty","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-no-empty","ru\u002F6.rules\u002Fheadings\u002Fheadings-no-empty",{"title":141,"path":142,"stem":143},"headings:single-h1","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-single-h1","ru\u002F6.rules\u002Fheadings\u002Fheadings-single-h1",{"title":145,"path":146,"stem":147},"headings:unique-h1","\u002Fru\u002Frules\u002Fheadings\u002Fheadings-unique-h1","ru\u002F6.rules\u002Fheadings\u002Fheadings-unique-h1",{"title":149,"path":150,"stem":151,"children":152,"page":22},"Http","\u002Fru\u002Frules\u002Fhttp","ru\u002F6.rules\u002Fhttp",[153,157,161,165,169],{"title":154,"path":155,"stem":156},"http:no-mixed-content","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-no-mixed-content","ru\u002F6.rules\u002Fhttp\u002Fhttp-no-mixed-content",{"title":158,"path":159,"stem":160},"http:no-soft-404","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-no-soft-404","ru\u002F6.rules\u002Fhttp\u002Fhttp-no-soft-404",{"title":162,"path":163,"stem":164},"http:ttfb-budget","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-ttfb-budget","ru\u002F6.rules\u002Fhttp\u002Fhttp-ttfb-budget",{"title":166,"path":167,"stem":168},"http:x-robots-consistent","\u002Fru\u002Frules\u002Fhttp\u002Fhttp-x-robots-consistent","ru\u002F6.rules\u002Fhttp\u002Fhttp-x-robots-consistent",{"title":170,"path":171,"stem":172},"mobile:viewport","\u002Fru\u002Frules\u002Fhttp\u002Fmobile-viewport","ru\u002F6.rules\u002Fhttp\u002Fmobile-viewport",{"title":174,"path":175,"stem":176,"children":177,"page":22},"I18n","\u002Fru\u002Frules\u002Fi18n","ru\u002F6.rules\u002Fi18n",[178,182,186],{"title":179,"path":180,"stem":181},"hreflang:symmetric","\u002Fru\u002Frules\u002Fi18n\u002Fhreflang-symmetric","ru\u002F6.rules\u002Fi18n\u002Fhreflang-symmetric",{"title":183,"path":184,"stem":185},"hreflang:valid-targets","\u002Fru\u002Frules\u002Fi18n\u002Fhreflang-valid-targets","ru\u002F6.rules\u002Fi18n\u002Fhreflang-valid-targets",{"title":187,"path":188,"stem":189},"i18n:no-locale-leak","\u002Fru\u002Frules\u002Fi18n\u002Fi18n-no-locale-leak","ru\u002F6.rules\u002Fi18n\u002Fi18n-no-locale-leak",{"title":191,"path":192,"stem":193,"children":194,"page":22},"Images","\u002Fru\u002Frules\u002Fimages","ru\u002F6.rules\u002Fimages",[195,199,203],{"title":196,"path":197,"stem":198},"images:alt-required","\u002Fru\u002Frules\u002Fimages\u002Fimages-alt-required","ru\u002F6.rules\u002Fimages\u002Fimages-alt-required",{"title":200,"path":201,"stem":202},"images:dimensions-required","\u002Fru\u002Frules\u002Fimages\u002Fimages-dimensions-required","ru\u002F6.rules\u002Fimages\u002Fimages-dimensions-required",{"title":204,"path":205,"stem":206},"images:no-lazy-above-fold","\u002Fru\u002Frules\u002Fimages\u002Fimages-no-lazy-above-fold","ru\u002F6.rules\u002Fimages\u002Fimages-no-lazy-above-fold",{"title":208,"path":209,"stem":210,"children":211,"page":22},"Indexability","\u002Fru\u002Frules\u002Findexability","ru\u002F6.rules\u002Findexability",[212,218,224],{"title":213,"path":214,"stem":215,"children":216},"indexability:ssr-content","\u002Fru\u002Frules\u002Findexability\u002Findexability-ssr-content","ru\u002F6.rules\u002Findexability\u002Findexability-ssr-content",[217],{"title":213,"path":214,"stem":215},{"title":219,"path":220,"stem":221,"children":222},"sitemap:no-noindex","\u002Fru\u002Frules\u002Findexability\u002Fsitemap-no-noindex","ru\u002F6.rules\u002Findexability\u002Fsitemap-no-noindex",[223],{"title":219,"path":220,"stem":221},{"title":225,"path":226,"stem":227},"sitemap:reachable","\u002Fru\u002Frules\u002Findexability\u002Fsitemap-reachable","ru\u002F6.rules\u002Findexability\u002Fsitemap-reachable",{"title":229,"path":230,"stem":231,"children":232,"page":22},"Links","\u002Fru\u002Frules\u002Flinks","ru\u002F6.rules\u002Flinks",[233,237,241,245,249,253],{"title":234,"path":235,"stem":236},"links:no-broken","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-broken","ru\u002F6.rules\u002Flinks\u002Flinks-no-broken",{"title":238,"path":239,"stem":240},"links:no-orphans","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-orphans","ru\u002F6.rules\u002Flinks\u002Flinks-no-orphans",{"title":242,"path":243,"stem":244},"links:no-redirect-chain","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-redirect-chain","ru\u002F6.rules\u002Flinks\u002Flinks-no-redirect-chain",{"title":246,"path":247,"stem":248},"links:no-utm-internal","\u002Fru\u002Frules\u002Flinks\u002Flinks-no-utm-internal","ru\u002F6.rules\u002Flinks\u002Flinks-no-utm-internal",{"title":250,"path":251,"stem":252},"links:permanent-redirects","\u002Fru\u002Frules\u002Flinks\u002Flinks-permanent-redirects","ru\u002F6.rules\u002Flinks\u002Flinks-permanent-redirects",{"title":254,"path":255,"stem":256},"links:trailing-slash-consistent","\u002Fru\u002Frules\u002Flinks\u002Flinks-trailing-slash-consistent","ru\u002F6.rules\u002Flinks\u002Flinks-trailing-slash-consistent",{"title":258,"path":259,"stem":260,"children":261,"page":22},"Meta","\u002Fru\u002Frules\u002Fmeta","ru\u002F6.rules\u002Fmeta",[262,266,270,274,278,282,286,290,294,298,302],{"title":263,"path":264,"stem":265},"canonical:no-chain","\u002Fru\u002Frules\u002Fmeta\u002Fcanonical-no-chain","ru\u002F6.rules\u002Fmeta\u002Fcanonical-no-chain",{"title":267,"path":268,"stem":269},"canonical:required","\u002Fru\u002Frules\u002Fmeta\u002Fcanonical-required","ru\u002F6.rules\u002Fmeta\u002Fcanonical-required",{"title":271,"path":272,"stem":273},"canonical:valid","\u002Fru\u002Frules\u002Fmeta\u002Fcanonical-valid","ru\u002F6.rules\u002Fmeta\u002Fcanonical-valid",{"title":275,"path":276,"stem":277},"meta:description-length","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-description-length","ru\u002F6.rules\u002Fmeta\u002Fmeta-description-length",{"title":279,"path":280,"stem":281},"meta:description-required","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-description-required","ru\u002F6.rules\u002Fmeta\u002Fmeta-description-required",{"title":283,"path":284,"stem":285},"meta:no-duplicate-description","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-no-duplicate-description","ru\u002F6.rules\u002Fmeta\u002Fmeta-no-duplicate-description",{"title":287,"path":288,"stem":289},"meta:no-duplicate-title","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-no-duplicate-title","ru\u002F6.rules\u002Fmeta\u002Fmeta-no-duplicate-title",{"title":291,"path":292,"stem":293},"meta:og-required","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-og-required","ru\u002F6.rules\u002Fmeta\u002Fmeta-og-required",{"title":295,"path":296,"stem":297},"meta:title-length","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-title-length","ru\u002F6.rules\u002Fmeta\u002Fmeta-title-length",{"title":299,"path":300,"stem":301},"meta:title-required","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-title-required","ru\u002F6.rules\u002Fmeta\u002Fmeta-title-required",{"title":303,"path":304,"stem":305},"meta:twitter-card","\u002Fru\u002Frules\u002Fmeta\u002Fmeta-twitter-card","ru\u002F6.rules\u002Fmeta\u002Fmeta-twitter-card",{"title":38,"path":307,"stem":308,"children":309,"page":22},"\u002Fru\u002Frules\u002Frobots","ru\u002F6.rules\u002Frobots",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"robots:env-policy","\u002Fru\u002Frules\u002Frobots\u002Frobots-env-policy","ru\u002F6.rules\u002Frobots\u002Frobots-env-policy",{"title":315,"path":316,"stem":317},"robots:expected-disallow","\u002Fru\u002Frules\u002Frobots\u002Frobots-expected-disallow","ru\u002F6.rules\u002Frobots\u002Frobots-expected-disallow",{"title":319,"path":320,"stem":321},"robots:reachable","\u002Fru\u002Frules\u002Frobots\u002Frobots-reachable","ru\u002F6.rules\u002Frobots\u002Frobots-reachable",{"title":323,"path":324,"stem":325},"robots:sitemap-declared","\u002Fru\u002Frules\u002Frobots\u002Frobots-sitemap-declared","ru\u002F6.rules\u002Frobots\u002Frobots-sitemap-declared",{"title":327,"path":328,"stem":329},"robots:zone-not-blocked","\u002Fru\u002Frules\u002Frobots\u002Frobots-zone-not-blocked","ru\u002F6.rules\u002Frobots\u002Frobots-zone-not-blocked",{"title":331,"path":332,"stem":333,"children":334,"page":22},"Structured Data","\u002Fru\u002Frules\u002Fstructured-data","ru\u002F6.rules\u002Fstructured-data",[335,339],{"title":336,"path":337,"stem":338},"jsonld:parseable","\u002Fru\u002Frules\u002Fstructured-data\u002Fjsonld-parseable","ru\u002F6.rules\u002Fstructured-data\u002Fjsonld-parseable",{"title":340,"path":341,"stem":342},"jsonld:valid-schema","\u002Fru\u002Frules\u002Fstructured-data\u002Fjsonld-valid-schema","ru\u002F6.rules\u002Fstructured-data\u002Fjsonld-valid-schema",{"title":344,"icon":345,"path":346,"stem":347,"children":348,"page":22},"Гайды","i-lucide-book-open","\u002Fru\u002Fguides","ru\u002F7.guides",[349],{"title":350,"path":351,"stem":352},"SEO-чеклист для Nuxt-проекта","\u002Fru\u002Fguides\u002Fseo-checklist-nuxt","ru\u002F7.guides\u002F1.seo-checklist-nuxt",{"title":354,"path":355,"stem":356,"children":357,"icon":360},"Изменения","\u002Fru\u002Fchangelog","ru\u002F8.changelog\u002Findex",[358],{"title":359,"path":355,"stem":356},"Изменения и релизы ranklint","i-lucide-history",{"id":362,"title":60,"body":363,"description":902,"extension":903,"links":904,"meta":905,"navigation":644,"path":61,"seo":906,"stem":62,"__hash__":907},"docs_ru\u002Fru\u002F3.cli\u002F2.diff-and-ci.md",{"type":364,"value":365,"toc":895},"minimark",[366,371,437,454,457,468,491,524,528,563,611,710,726,730,740,770,793,797,881,891],[367,368,370],"h2",{"id":369},"ranklint-diff","ranklint diff",[372,373,374,387],"table",{},[375,376,377],"thead",{},[378,379,380,384],"tr",{},[381,382,383],"th",{},"Флаг",[381,385,386],{},"Описание",[388,389,390,407,417,427],"tbody",{},[378,391,392,399],{},[393,394,395],"td",{},[396,397,398],"code",{},"--base",[393,400,401,402,406],{},"путь к report.json ",[403,404,405],"em",{},"или"," git-ref — тогда отчёт достаётся из артефактов CI",[378,408,409,414],{},[393,410,411],{},[396,412,413],{},"--current",[393,415,416],{},"текущий report.json",[378,418,419,424],{},[393,420,421],{},[396,422,423],{},"--reporter",[393,425,426],{},"markdown | json",[378,428,429,434],{},[393,430,431],{},[396,432,433],{},"--output",[393,435,436],{},"в файл",[438,439,440,441,444,445,449,450,453],"p",{},"CI-адаптер по окружению: ",[396,442,443],{},"GITHUB_ACTIONS=true"," → GitHub (артефакт по имени, zip распаковывается встроенным ридером), иначе GitLab (job-артефакт ветки). Политика ошибок: ",[446,447,448],"strong",{},"нет CI-контекста → warn + полный отчёт «first run»"," (base не найден — не ошибка); ",[446,451,452],{},"ошибка загрузки (401\u002F403\u002Fсеть) → падение",", чтобы протухший токен не маскировался вечным first run. Exit 1 только при новых error-issues.",[367,455,60],{"id":456},"diff-и-ci",[438,458,459,460,463,464,467],{},"Ключ проблемы: ",[396,461,462],{},"checkId + url без origin + selector"," — стабилен между окружениями (UAT сравнивается с prod). ",[396,465,466],{},"diffReports"," → newIssues \u002F fixedIssues \u002F pagesDelta.",[438,469,470,471,474,475,478,479,482,483,486,487,490],{},"Хранилища базовых отчётов (",[396,472,473],{},"ReportStorage","): ",[446,476,477],{},"fs"," (директория JSON, latest по mtime), ",[446,480,481],{},"GitLab artifacts"," (read-only, по job-артефакту ветки), ",[446,484,485],{},"GitHub artifacts"," (read-only: список по имени, фильтр по ветке, скачивание zip — свой минимальный zip-ридер: EOCD → central directory → inflateRawSync; битый вход → null, не исключение), ",[446,488,489],{},"S3"," (для монитора; SDK — опциональный peer, любой S3-совместимый endpoint).",[438,492,493,494,497,498,501,502,505,506,501,509,512,513,501,516,519,520,523],{},"Готовые CI-пресеты: ",[396,495,496],{},"presets\u002Fgitlab-ci\u002Fseo.yml"," (джобы ",[396,499,500],{},".ranklint-audit",", ",[396,503,504],{},".ranklint-diff"," с автокомментом в MR, ",[396,507,508],{},".ranklint-lighthouse",[396,510,511],{},".ranklint-monitor"," с кешем Playwright и отчётов) и ",[396,514,515],{},"presets\u002Fgithub-actions\u002Fseo.yml",[396,517,518],{},"presets\u002Fgithub-actions\u002Fmonitor.yml"," (монитор по расписанию с кешем отчётов). Репортер ",[396,521,522],{},"github"," — аннотации в PR.",[367,525,527],{"id":526},"sarif-для-github-code-scanning","SARIF для GitHub Code Scanning",[438,529,530,531,534,535,538,539,542,543,546,547,550,551,554,555,558,559,562],{},"SARIF — формат, который GitHub читает на вкладке ",[446,532,533],{},"Security → Code scanning",". ",[396,536,537],{},"ranklint audit --reporter sarif"," пишет документ SARIF 2.1.0: один run, ",[396,540,541],{},"tool.driver.name: ranklint",", по правилу на каждый ",[396,544,545],{},"checkId"," с ",[396,548,549],{},"helpUri"," на доку правила, по результату на каждый issue с ",[396,552,553],{},"level"," (error \u002F warning \u002F note), URL страницы как location и стабильный ",[396,556,557],{},"partialFingerprints.primaryLocationLineHash"," из diff-ключа ",[396,560,561],{},"checkId + путь + selector",", чтобы GitHub сохранял алерт между прогонами, а не заводил новый.",[564,565,570],"pre",{"className":566,"code":567,"language":568,"meta":569,"style":569},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ranklint audit --url \"$URL\" --reporter sarif --output ranklint.sarif\n","bash","",[396,571,572],{"__ignoreMap":569},[573,574,577,581,585,588,592,596,599,602,605,608],"span",{"class":575,"line":576},"line",1,[573,578,580],{"class":579},"sBMFI","ranklint",[573,582,584],{"class":583},"sfazB"," audit",[573,586,587],{"class":583}," --url",[573,589,591],{"class":590},"sMK4o"," \"",[573,593,595],{"class":594},"sTEyZ","$URL",[573,597,598],{"class":590},"\"",[573,600,601],{"class":583}," --reporter",[573,603,604],{"class":583}," sarif",[573,606,607],{"class":583}," --output",[573,609,610],{"class":583}," ranklint.sarif\n",[564,612,616],{"className":613,"code":614,"language":615,"meta":569,"style":569},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","permissions:\n  security-events: write\n\nsteps:\n  - run: ranklint audit --url \"$URL\" --reporter sarif --output ranklint.sarif\n  - uses: github\u002Fcodeql-action\u002Fupload-sarif@v3\n    with:\n      sarif_file: ranklint.sarif\n      category: ranklint\n","yaml",[396,617,618,627,639,646,654,668,681,689,699],{"__ignoreMap":569},[573,619,620,624],{"class":575,"line":576},[573,621,623],{"class":622},"swJcz","permissions",[573,625,626],{"class":590},":\n",[573,628,630,633,636],{"class":575,"line":629},2,[573,631,632],{"class":622},"  security-events",[573,634,635],{"class":590},":",[573,637,638],{"class":583}," write\n",[573,640,642],{"class":575,"line":641},3,[573,643,645],{"emptyLinePlaceholder":644},true,"\n",[573,647,649,652],{"class":575,"line":648},4,[573,650,651],{"class":622},"steps",[573,653,626],{"class":590},[573,655,657,660,663,665],{"class":575,"line":656},5,[573,658,659],{"class":590},"  -",[573,661,662],{"class":622}," run",[573,664,635],{"class":590},[573,666,667],{"class":583}," ranklint audit --url \"$URL\" --reporter sarif --output ranklint.sarif\n",[573,669,671,673,676,678],{"class":575,"line":670},6,[573,672,659],{"class":590},[573,674,675],{"class":622}," uses",[573,677,635],{"class":590},[573,679,680],{"class":583}," github\u002Fcodeql-action\u002Fupload-sarif@v3\n",[573,682,684,687],{"class":575,"line":683},7,[573,685,686],{"class":622},"    with",[573,688,626],{"class":590},[573,690,692,695,697],{"class":575,"line":691},8,[573,693,694],{"class":622},"      sarif_file",[573,696,635],{"class":590},[573,698,610],{"class":583},[573,700,702,705,707],{"class":575,"line":701},9,[573,703,704],{"class":622},"      category",[573,706,635],{"class":590},[573,708,709],{"class":583}," ranklint\n",[438,711,712,713,715,716,719,720,722,723,725],{},"В переиспользуемом пресете ",[396,714,515],{}," шаг включается инпутом ",[396,717,718],{},"sarif: true",". Находки появляются в ",[446,721,533],{}," с фильтром по инструменту ",[396,724,580],{},". Локации — абсолютные URL страниц, а не файлы репозитория: SARIF это допускает, алерты группируются по id правила.",[367,727,729],{"id":728},"sticky-комментарий-в-pr-и-mr","Sticky-комментарий в PR и MR",[438,731,732,735,736,739],{},[396,733,734],{},"markdownDiff"," начинает вывод скрытым маркером ",[396,737,738],{},"\u003C!-- ranklint-diff -->",". Пресеты используют его, чтобы обновлять прежний комментарий, а не добавлять новый на каждый прогон пайплайна.",[438,741,742,743,745,746,749,750,753,754,757,758,761,762,765,766,769],{},"GitLab: джоба ",[396,744,504],{}," проходит постранично ",[396,747,748],{},"GET \u002Fmerge_requests\u002F:iid\u002Fnotes"," (",[396,751,752],{},"per_page=100","), находит note, тело которой начинается с маркера, и шлёт ",[396,755,756],{},"PUT ...\u002Fnotes\u002F:note_id","; если такой нет, остаётся ",[396,759,760],{},"POST",". Для поиска нужен ",[396,763,764],{},"jq"," в образе и ",[396,767,768],{},"RANKLINT_GITLAB_TOKEN"," со scope api.",[438,771,772,773,776,777,780,781,784,785,788,789,792],{},"GitHub: шаг ",[396,774,775],{},"Comment on PR"," получает комментарии PR через ",[396,778,779],{},"actions\u002Fgithub-script",", ищет тот же маркер и зовёт ",[396,782,783],{},"updateComment"," или ",[396,786,787],{},"createComment",". Шагу нужен ",[396,790,791],{},"pull-requests: write",".",[367,794,796],{"id":795},"gitlab-ci","GitLab CI",[564,798,800],{"className":613,"code":799,"language":615,"meta":569,"style":569},"include:\n  - remote: 'https:\u002F\u002Fraw.githubusercontent.com\u002Faakazancev\u002Franklint\u002Fmain\u002Fpresets\u002Fgitlab-ci\u002Fseo.yml'\n\nseo:audit:\n  extends: .ranklint-audit\n  needs: [deploy:uat]\n  variables:\n    RANKLINT_URL: $CI_ENVIRONMENT_URL\n",[396,801,802,809,827,831,838,848,864,871],{"__ignoreMap":569},[573,803,804,807],{"class":575,"line":576},[573,805,806],{"class":622},"include",[573,808,626],{"class":590},[573,810,811,813,816,818,821,824],{"class":575,"line":629},[573,812,659],{"class":590},[573,814,815],{"class":622}," remote",[573,817,635],{"class":590},[573,819,820],{"class":590}," '",[573,822,823],{"class":583},"https:\u002F\u002Fraw.githubusercontent.com\u002Faakazancev\u002Franklint\u002Fmain\u002Fpresets\u002Fgitlab-ci\u002Fseo.yml",[573,825,826],{"class":590},"'\n",[573,828,829],{"class":575,"line":641},[573,830,645],{"emptyLinePlaceholder":644},[573,832,833,836],{"class":575,"line":648},[573,834,835],{"class":622},"seo:audit",[573,837,626],{"class":590},[573,839,840,843,845],{"class":575,"line":656},[573,841,842],{"class":622},"  extends",[573,844,635],{"class":590},[573,846,847],{"class":583}," .ranklint-audit\n",[573,849,850,853,855,858,861],{"class":575,"line":670},[573,851,852],{"class":622},"  needs",[573,854,635],{"class":590},[573,856,857],{"class":590}," [",[573,859,860],{"class":583},"deploy:uat",[573,862,863],{"class":590},"]\n",[573,865,866,869],{"class":575,"line":683},[573,867,868],{"class":622},"  variables",[573,870,626],{"class":590},[573,872,873,876,878],{"class":575,"line":691},[573,874,875],{"class":622},"    RANKLINT_URL",[573,877,635],{"class":590},[573,879,880],{"class":583}," $CI_ENVIRONMENT_URL\n",[438,882,883,886,887,890],{},[396,884,885],{},"ranklint diff --base main"," достаёт базовый отчёт из артефактов CI: в GitLab — из job-артефакта ветки, в GitHub Actions — из артефакта ",[396,888,889],{},"ranklint-report"," (распаковка zip встроена). Отсутствующий base — не ошибка: diff деградирует до полного отчёта.",[892,893,894],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":569,"searchDepth":629,"depth":629,"links":896},[897,898,899,900,901],{"id":369,"depth":629,"text":370},{"id":456,"depth":629,"text":60},{"id":526,"depth":629,"text":527},{"id":728,"depth":629,"text":729},{"id":795,"depth":629,"text":796},"Сравнение отчёта с базовым и подключение ranklint к пайплайнам GitLab и GitHub.","md",null,{},{"title":60,"description":902},"HvOOUGuOibQT-LCXDcp3kVayXaSrnQghI9vOwXlzNFQ",[909,911],{"title":56,"path":57,"stem":58,"description":910,"children":-1},"Краул задеплоенного сайта или локальной сборки с падением CI на error-issues.",{"title":64,"path":65,"stem":66,"description":912,"children":-1},"Аудиты прода по расписанию с обогащением полевыми данными и алертами на новые проблемы.",1791750384346]