[{"data":1,"prerenderedAt":917},["ShallowReactive",2],{"navigation":3,"external-navigation":214,"docs:\u002Feos\u002Fhow-to\u002Frun-git-hook-checks":443},[4,8,201],{"title":5,"path":6,"stem":7},"Documentation","\u002F","README",{"title":9,"path":10,"stem":11,"children":12},"EOS","\u002Feos","eos\u002FREADME",[13,44,121,181],{"title":14,"collapsed":15,"path":16,"stem":17,"children":18,"page":43},"Adrs",true,"\u002Feos\u002Fadrs","eos\u002Fadrs",[19,23,27,31,35,39],{"title":20,"path":21,"stem":22},"Use Turborepo for the EOS monorepo","\u002Feos\u002Fadrs\u002F0001-use-turborepo-for-eos","eos\u002Fadrs\u002F0001-use-turborepo-for-eos",{"title":24,"path":25,"stem":26},"Use Oxc for linting and formatting","\u002Feos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting","eos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting",{"title":28,"path":29,"stem":30},"Lint Markdown and validate links in CI","\u002Feos\u002Fadrs\u002F0004-lint-markdown-in-ci","eos\u002Fadrs\u002F0004-lint-markdown-in-ci",{"title":32,"path":33,"stem":34},"Use Lefthook for repository-managed Git hooks","\u002Feos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks","eos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks",{"title":36,"path":37,"stem":38},"Use Commitlint's conventional configuration","\u002Feos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration","eos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration",{"title":40,"path":41,"stem":42},"Use Nx for EOS task execution","\u002Feos\u002Fadrs\u002F0007-use-nx-for-eos","eos\u002Fadrs\u002F0007-use-nx-for-eos",false,{"title":45,"path":46,"stem":47,"children":48},"Harbourmaster","\u002Feos\u002Fharbourmaster","eos\u002Fharbourmaster\u002FREADME",[49,58,71,96],{"title":50,"path":51,"stem":52,"children":53,"page":43},"Decisions","\u002Feos\u002Fharbourmaster\u002Fdecisions","eos\u002Fharbourmaster\u002Fdecisions",[54],{"title":55,"path":56,"stem":57},"AI-50: GitHub auth and fork pull request policy","\u002Feos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy","eos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy",{"title":59,"path":60,"stem":61,"children":62,"page":43},"Explanation","\u002Feos\u002Fharbourmaster\u002Fexplanation","eos\u002Fharbourmaster\u002Fexplanation",[63,67],{"title":64,"path":65,"stem":66},"The Harbourmaster review pipeline","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline","eos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline",{"title":68,"path":69,"stem":70},"The Harbourmaster shared-action trust boundary","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary","eos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary",{"title":72,"path":73,"stem":74,"children":75,"page":43},"How To","\u002Feos\u002Fharbourmaster\u002Fhow-to","eos\u002Fharbourmaster\u002Fhow-to",[76,80,84,88,92],{"title":77,"path":78,"stem":79},"How to add Harbourmaster reviews to a repository","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository","eos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository",{"title":81,"path":82,"stem":83},"How to build a pilot dashboard","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard","eos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard",{"title":85,"path":86,"stem":87},"How to configure model routing","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing","eos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing",{"title":89,"path":90,"stem":91},"How to request a Harbourmaster review","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review",{"title":93,"path":94,"stem":95},"How to diagnose a Harbourmaster review failure","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review",{"title":97,"path":98,"stem":99,"children":100,"page":43},"Reference","\u002Feos\u002Fharbourmaster\u002Freference","eos\u002Fharbourmaster\u002Freference",[101,105,109,113,117],{"title":102,"path":103,"stem":104},"Harbourmaster command-line interface","\u002Feos\u002Fharbourmaster\u002Freference\u002Fcli","eos\u002Fharbourmaster\u002Freference\u002Fcli",{"title":106,"path":107,"stem":108},"Harbourmaster configuration","\u002Feos\u002Fharbourmaster\u002Freference\u002Fconfiguration","eos\u002Fharbourmaster\u002Freference\u002Fconfiguration",{"title":110,"path":111,"stem":112},"Harbourmaster GitHub Action","\u002Feos\u002Fharbourmaster\u002Freference\u002Fgithub-action","eos\u002Fharbourmaster\u002Freference\u002Fgithub-action",{"title":114,"path":115,"stem":116},"Harbourmaster review behavior","\u002Feos\u002Fharbourmaster\u002Freference\u002Freview-behavior","eos\u002Fharbourmaster\u002Freference\u002Freview-behavior",{"title":118,"path":119,"stem":120},"Harbourmaster telemetry","\u002Feos\u002Fharbourmaster\u002Freference\u002Ftelemetry","eos\u002Fharbourmaster\u002Freference\u002Ftelemetry",{"title":72,"path":122,"stem":123,"children":124,"page":43},"\u002Feos\u002Fhow-to","eos\u002Fhow-to",[125,129,133,137,141,145,149,153,157,161,165,169,173,177],{"title":126,"path":127,"stem":128},"How to add an external documentation source","\u002Feos\u002Fhow-to\u002Fadd-external-documentation-source","eos\u002Fhow-to\u002Fadd-external-documentation-source",{"title":130,"path":131,"stem":132},"How to connect SDLC integrations","\u002Feos\u002Fhow-to\u002Fconnect-sdlc-integrations","eos\u002Fhow-to\u002Fconnect-sdlc-integrations",{"title":134,"path":135,"stem":136},"How to consume the EOS plugin marketplace","\u002Feos\u002Fhow-to\u002Fconsume-eos-marketplace","eos\u002Fhow-to\u002Fconsume-eos-marketplace",{"title":138,"path":139,"stem":140},"How to create a spike ticket","\u002Feos\u002Fhow-to\u002Fcreate-spike-ticket","eos\u002Fhow-to\u002Fcreate-spike-ticket",{"title":142,"path":143,"stem":144},"How to finalise a repository change","\u002Feos\u002Fhow-to\u002Ffinalise-change","eos\u002Fhow-to\u002Ffinalise-change",{"title":146,"path":147,"stem":148},"How to install the EOS Docs MCP server","\u002Feos\u002Fhow-to\u002Finstall-eos-docs-mcp","eos\u002Fhow-to\u002Finstall-eos-docs-mcp",{"title":150,"path":151,"stem":152},"How to resolve a spike ticket","\u002Feos\u002Fhow-to\u002Fresolve-spike-ticket","eos\u002Fhow-to\u002Fresolve-spike-ticket",{"title":154,"path":155,"stem":156},"How to run Git hook checks","\u002Feos\u002Fhow-to\u002Frun-git-hook-checks","eos\u002Fhow-to\u002Frun-git-hook-checks",{"title":158,"path":159,"stem":160},"How to use the AI-enabled SDLC","\u002Feos\u002Fhow-to\u002Fuse-ai-enabled-sdlc","eos\u002Fhow-to\u002Fuse-ai-enabled-sdlc",{"title":162,"path":163,"stem":164},"Use the Aikido plugin","\u002Feos\u002Fhow-to\u002Fuse-aikido-plugin","eos\u002Fhow-to\u002Fuse-aikido-plugin",{"title":166,"path":167,"stem":168},"How to use Compass","\u002Feos\u002Fhow-to\u002Fuse-compass","eos\u002Fhow-to\u002Fuse-compass",{"title":170,"path":171,"stem":172},"How to use Fallow","\u002Feos\u002Fhow-to\u002Fuse-fallow","eos\u002Fhow-to\u002Fuse-fallow",{"title":174,"path":175,"stem":176},"How to use incremental mutation tests","\u002Feos\u002Fhow-to\u002Fuse-incremental-mutation-tests","eos\u002Fhow-to\u002Fuse-incremental-mutation-tests",{"title":178,"path":179,"stem":180},"How to use Scout","\u002Feos\u002Fhow-to\u002Fuse-scout","eos\u002Fhow-to\u002Fuse-scout",{"title":97,"path":182,"stem":183,"children":184,"page":43},"\u002Feos\u002Freference","eos\u002Freference",[185,189,193,197],{"title":186,"path":187,"stem":188},"Compass CLI","\u002Feos\u002Freference\u002Fcompass-cli","eos\u002Freference\u002Fcompass-cli",{"title":190,"path":191,"stem":192},"EOS marketplace skills","\u002Feos\u002Freference\u002Fmarketplace-skills","eos\u002Freference\u002Fmarketplace-skills",{"title":194,"path":195,"stem":196},"Nx task execution and cache","\u002Feos\u002Freference\u002Fnx-task-execution","eos\u002Freference\u002Fnx-task-execution",{"title":198,"path":199,"stem":200},"Scout CLI","\u002Feos\u002Freference\u002Fscout-cli","eos\u002Freference\u002Fscout-cli",{"title":202,"path":203,"stem":204,"children":205},"Product engineering","\u002Fproduct-engineering","product-engineering\u002FREADME",[206],{"title":14,"collapsed":15,"path":207,"stem":208,"children":209,"page":43},"\u002Fproduct-engineering\u002Fadrs","product-engineering\u002Fadrs",[210],{"title":211,"path":212,"stem":213},"Codify Engineering Standards as Skills","\u002Fproduct-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills","product-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills",[215,268],{"nav":216,"source":265},[217],{"title":218,"path":219,"stem":220,"children":221},"Ember","\u002Fember","ember",[222,225,257,261],{"title":223,"path":219,"stem":224},"StoreFront Documentation","ember\u002Findex",{"title":14,"path":226,"stem":227,"children":228,"page":43},"\u002Fember\u002Fadrs","ember\u002Fadrs",[229,233,237,241,245,249,253],{"title":230,"path":231,"stem":232},"Add Infection as a non-blocking mutation testing tool for Ember","\u002Fember\u002Fadrs\u002F0001-infection-mutation-testing","ember\u002Fadrs\u002F0001-infection-mutation-testing",{"title":234,"path":235,"stem":236},"Process DELETE scheduled changes before CREATE_UPDATE at the same instant","\u002Fember\u002Fadrs\u002F0002-scheduled-change-processing-order","ember\u002Fadrs\u002F0002-scheduled-change-processing-order",{"title":238,"path":239,"stem":240},"Standard rate scheduling is permanent until overridden","\u002Fember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent","ember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent",{"title":242,"path":243,"stem":244},"Promotions require an existing standard rate","\u002Fember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate","ember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate",{"title":246,"path":247,"stem":248},"UTC datetime contract between Storefront and Hub","\u002Fember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub","ember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub",{"title":250,"path":251,"stem":252},"Elapsed unprocessed scheduled changes do not block rate changes","\u002Fember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes","ember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes",{"title":254,"path":255,"stem":256},"ADR-0007: Delete ConfigureTenantAuth routing command once OIDC setup migrates to Hub","\u002Fember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command","ember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command",{"title":258,"path":259,"stem":260},"Domain Overview","\u002Fember\u002Fdomain_overview","ember\u002Fdomain_overview",{"title":262,"path":263,"stem":264},"Main Flows","\u002Fember\u002Fkey_flows","ember\u002Fkey_flows",{"collectionName":266,"label":267,"prefix":220},"external_ember","StoreFront (Ember)",{"nav":269,"source":441},[270],{"title":271,"path":272,"stem":273,"children":274},"Core","\u002Fcore","core",[275,278,306,310,332,336,346,363,420,424],{"title":276,"path":272,"stem":277},"Documentation Index","core\u002Findex",{"title":14,"path":279,"stem":280,"children":281,"page":43},"\u002Fcore\u002Fadrs","core\u002Fadrs",[282,286,290,294,298,302],{"title":283,"path":284,"stem":285},"ADR-XXXX: Short, descriptive title","\u002Fcore\u002Fadrs\u002F0000-template","core\u002Fadrs\u002F0000-template",{"title":287,"path":288,"stem":289},"ADR-1: Promotions endpoint","\u002Fcore\u002Fadrs\u002F0001-add-promotions-endpoint","core\u002Fadrs\u002F0001-add-promotions-endpoint",{"title":291,"path":292,"stem":293},"ADR-2: EOM partner report job dispatch","\u002Fcore\u002Fadrs\u002F0002-eom-report-job-dispatch","core\u002Fadrs\u002F0002-eom-report-job-dispatch",{"title":295,"path":296,"stem":297},"ADR-3: Replace PB fee waive flag with a Zero scheme override","\u002Fcore\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme","core\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme",{"title":299,"path":300,"stem":301},"ADR-4: No processor Digital Top-up capability gate in Reloadable Commercials","\u002Fcore\u002Fadrs\u002F0004-no-processor-top-up-capability-gate","core\u002Fadrs\u002F0004-no-processor-top-up-capability-gate",{"title":303,"path":304,"stem":305},"ADR-5: Sparse polymorphic sale fee override reason stamp","\u002Fcore\u002Fadrs\u002F0005-sale-fee-override-reason-stamp","core\u002Fadrs\u002F0005-sale-fee-override-reason-stamp",{"title":307,"path":308,"stem":309},"Agent Workflow","\u002Fcore\u002Fai-workflow","core\u002Fai-workflow",{"title":311,"path":312,"stem":313,"children":314},"Backend Guide","\u002Fcore\u002Fbackend","core\u002Fbackend\u002Findex",[315,316,320,324,328],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319},"Backend AI Tooling","\u002Fcore\u002Fbackend\u002Fai-tooling","core\u002Fbackend\u002Fai-tooling",{"title":321,"path":322,"stem":323},"Backend Linting and Formatting","\u002Fcore\u002Fbackend\u002Flinting-and-formatting","core\u002Fbackend\u002Flinting-and-formatting",{"title":325,"path":326,"stem":327},"Backend Setup","\u002Fcore\u002Fbackend\u002Fsetup","core\u002Fbackend\u002Fsetup",{"title":329,"path":330,"stem":331},"Backend Testing","\u002Fcore\u002Fbackend\u002Ftesting","core\u002Fbackend\u002Ftesting",{"title":333,"path":334,"stem":335},"Documentation Health","\u002Fcore\u002Fdoc-health","core\u002Fdoc-health",{"title":337,"path":338,"stem":339,"children":340},"Frontend Guide","\u002Fcore\u002Ffrontend","core\u002Ffrontend\u002Findex",[341,342],{"title":337,"path":338,"stem":339},{"title":343,"path":344,"stem":345},"Frontend Development","\u002Fcore\u002Ffrontend\u002Fdevelopment","core\u002Ffrontend\u002Fdevelopment",{"title":347,"path":348,"stem":349,"children":350,"page":43},"Modules","\u002Fcore\u002Fmodules","core\u002Fmodules",[351,355],{"title":352,"path":353,"stem":354},"Connect API","\u002Fcore\u002Fmodules\u002Fconnect-api","core\u002Fmodules\u002Fconnect-api",{"title":356,"path":357,"stem":358,"children":359,"page":43},"Secure Links","\u002Fcore\u002Fmodules\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links",[360],{"title":356,"path":361,"stem":362},"\u002Fcore\u002Fmodules\u002Fsecure-links\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links\u002Fsecure-links",{"title":364,"path":365,"stem":366,"children":367,"page":43},"Processors","\u002Fcore\u002Fprocessors","core\u002Fprocessors",[368,372,376,380,384,388,392,396,400,404,408,412,416],{"title":369,"path":370,"stem":371},"Amazon Processor and API","\u002Fcore\u002Fprocessors\u002Famazon","core\u002Fprocessors\u002Famazon",{"title":373,"path":374,"stem":375},"Amilon Processor and API","\u002Fcore\u002Fprocessors\u002Familon","core\u002Fprocessors\u002Familon",{"title":377,"path":378,"stem":379},"Cadooz Processor and API","\u002Fcore\u002Fprocessors\u002Fcadooz","core\u002Fprocessors\u002Fcadooz",{"title":381,"path":382,"stem":383},"Choice Digital Processor and API","\u002Fcore\u002Fprocessors\u002Fchoice-digital","core\u002Fprocessors\u002Fchoice-digital",{"title":385,"path":386,"stem":387},"Diggecard processor reference","\u002Fcore\u002Fprocessors\u002Fdiggecard","core\u002Fprocessors\u002Fdiggecard",{"title":389,"path":390,"stem":391},"ePay Processor and API","\u002Fcore\u002Fprocessors\u002Fepay","core\u002Fprocessors\u002Fepay",{"title":393,"path":394,"stem":395},"GoGift v2 Processor and API","\u002Fcore\u002Fprocessors\u002Fgo-gift-v2","core\u002Fprocessors\u002Fgo-gift-v2",{"title":397,"path":398,"stem":399},"InComm Processor and API","\u002Fcore\u002Fprocessors\u002Fincomm","core\u002Fprocessors\u002Fincomm",{"title":401,"path":402,"stem":403},"Ogloba Processor and API","\u002Fcore\u002Fprocessors\u002Fogloba","core\u002Fprocessors\u002Fogloba",{"title":405,"path":406,"stem":407},"SVSECard Processor and API","\u002Fcore\u002Fprocessors\u002Fsvs-ecard","core\u002Fprocessors\u002Fsvs-ecard",{"title":409,"path":410,"stem":411},"Vananam Processor and API","\u002Fcore\u002Fprocessors\u002Fvananam","core\u002Fprocessors\u002Fvananam",{"title":413,"path":414,"stem":415},"Vouchers Depot processor reference","\u002Fcore\u002Fprocessors\u002Fvouchers-depot","core\u002Fprocessors\u002Fvouchers-depot",{"title":417,"path":418,"stem":419},"You Got a Gift Processor and API","\u002Fcore\u002Fprocessors\u002Fyou-got-a-gift","core\u002Fprocessors\u002Fyou-got-a-gift",{"title":421,"path":422,"stem":423},"Development Quickstart","\u002Fcore\u002Fsetup","core\u002Fsetup",{"title":425,"path":426,"stem":427,"children":428,"page":43},"Workflows","\u002Fcore\u002Fworkflows","core\u002Fworkflows",[429,433,437],{"title":430,"path":431,"stem":432},"Hub Endpoint Workflow","\u002Fcore\u002Fworkflows\u002Fhub-endpoints","core\u002Fworkflows\u002Fhub-endpoints",{"title":434,"path":435,"stem":436},"OpenAPI Tooling","\u002Fcore\u002Fworkflows\u002Fopenapi-tooling","core\u002Fworkflows\u002Fopenapi-tooling",{"title":438,"path":439,"stem":440},"Processor Integration Workflow","\u002Fcore\u002Fworkflows\u002Fprocessors","core\u002Fworkflows\u002Fprocessors",{"collectionName":442,"label":271,"prefix":273},"external_core",{"page":444,"surround":914},{"id":445,"title":154,"body":446,"config":909,"description":452,"extension":910,"meta":911,"navigation":15,"path":155,"seo":912,"stem":156,"__hash__":913},"docs\u002Feos\u002Fhow-to\u002Frun-git-hook-checks.md",{"type":447,"value":448,"toc":901},"minimark",[449,453,458,461,464,495,510,528,531,535,538,562,605,608,639,642,660,671,675,678,689,700,703,706,709,728,731,752,756,759,771,774,789,792,806,810,821,824,862,866,873,898],[450,451,452],"p",{},"Use the repository's Lefthook configuration to validate commit messages, check\nstaged source and Markdown files before committing, and validate documentation\nlinks before pushing.",[454,455,457],"h2",{"id":456},"install-the-hooks","Install the hooks",[450,459,460],{},"Use an active mise shell for the commands in this guide.",[450,462,463],{},"Install the repository tools and workspace dependencies from the repository\nroot:",[465,466,471],"pre",{"className":467,"code":468,"language":469,"meta":470,"style":470},"language-sh shiki shiki-themes github-dark github-light","mise install\npnpm install\n","sh","",[472,473,474,487],"code",{"__ignoreMap":470},[475,476,479,483],"span",{"class":477,"line":478},"line",1,[475,480,482],{"class":481},"s-Z4r","mise",[475,484,486],{"class":485},"sg6BJ"," install\n",[475,488,490,493],{"class":477,"line":489},2,[475,491,492],{"class":481},"pnpm",[475,494,486],{"class":485},[450,496,497,498,501,502,505,506,509],{},"The Lefthook dependency installs the configured ",[472,499,500],{},"commit-msg",", ",[472,503,504],{},"pre-commit",", and\n",[472,507,508],{},"pre-push"," hooks. Verify that the generated Git hooks are present and current:",[465,511,513],{"className":467,"code":512,"language":469,"meta":470,"style":470},"pnpm exec lefthook check-install\n",[472,514,515],{"__ignoreMap":470},[475,516,517,519,522,525],{"class":477,"line":478},[475,518,492],{"class":481},[475,520,521],{"class":485}," exec",[475,523,524],{"class":485}," lefthook",[475,526,527],{"class":485}," check-install\n",[450,529,530],{},"The command exits successfully without output when the hooks are current.",[454,532,534],{"id":533},"validate-commit-messages","Validate commit messages",[450,536,537],{},"Create or amend a commit normally to validate its message with Commitlint:",[465,539,541],{"className":467,"code":540,"language":469,"meta":470,"style":470},"git commit\ngit commit --amend\n",[472,542,543,551],{"__ignoreMap":470},[475,544,545,548],{"class":477,"line":478},[475,546,547],{"class":481},"git",[475,549,550],{"class":485}," commit\n",[475,552,553,555,558],{"class":477,"line":489},[475,554,547],{"class":481},[475,556,557],{"class":485}," commit",[475,559,561],{"class":560},"s0DvM"," --amend\n",[450,563,564,565,568,569,501,572,501,575,501,578,501,581,501,584,501,587,590,591,501,594,501,597,600,601,604],{},"EOS uses the unmodified ",[472,566,567],{},"@commitlint\u002Fconfig-conventional"," preset. Commit types\nmust be one of ",[472,570,571],{},"build",[472,573,574],{},"chore",[472,576,577],{},"ci",[472,579,580],{},"docs",[472,582,583],{},"feat",[472,585,586],{},"fix",[472,588,589],{},"perf",",\n",[472,592,593],{},"refactor",[472,595,596],{},"revert",[472,598,599],{},"style",", or ",[472,602,603],{},"test",". Types must be lowercase. Subjects must\nnot be empty, use sentence\u002Fstart\u002FPascal\u002Fupper case, or end with a full stop.\nHeaders and non-URL body or footer lines must not exceed 100 characters.",[450,606,607],{},"Validate a message from standard input without creating a commit:",[465,609,611],{"className":467,"code":610,"language":469,"meta":470,"style":470},"printf '%s\\n' 'docs: explain Git hook checks' | pnpm exec commitlint --verbose\n",[472,612,613],{"__ignoreMap":470},[475,614,615,618,621,624,628,631,633,636],{"class":477,"line":478},[475,616,617],{"class":560},"printf",[475,619,620],{"class":485}," '%s\\n'",[475,622,623],{"class":485}," 'docs: explain Git hook checks'",[475,625,627],{"class":626},"scx8i"," |",[475,629,630],{"class":481}," pnpm",[475,632,521],{"class":485},[475,634,635],{"class":485}," commitlint",[475,637,638],{"class":560}," --verbose\n",[450,640,641],{},"Validate the latest commit directly:",[465,643,645],{"className":467,"code":644,"language":469,"meta":470,"style":470},"pnpm exec commitlint --last --verbose\n",[472,646,647],{"__ignoreMap":470},[475,648,649,651,653,655,658],{"class":477,"line":478},[475,650,492],{"class":481},[475,652,521],{"class":485},[475,654,635],{"class":485},[475,656,657],{"class":560}," --last",[475,659,638],{"class":560},[450,661,662,663,666,667,670],{},"Local Git hooks can be bypassed with ",[472,664,665],{},"--no-verify",". Pull-request title\nvalidation is the required merge check for the normal squash workflow. CI also\nreports invalid commits introduced directly on ",[472,668,669],{},"main",", but cannot undo a push\nthat has already landed.",[454,672,674],{"id":673},"run-the-pre-commit-checks","Run the pre-commit checks",[450,676,677],{},"Create a commit normally to run the hook against staged files:",[465,679,681],{"className":467,"code":680,"language":469,"meta":470,"style":470},"git commit\n",[472,682,683],{"__ignoreMap":470},[475,684,685,687],{"class":477,"line":478},[475,686,547],{"class":481},[475,688,550],{"class":485},[450,690,691,692,695,696,699],{},"Lefthook passes staged source filenames to ",[472,693,694],{},"ultracite fix",". Ultracite formats\nthese files and applies safe lint fixes. Lefthook adds the fixed files to the\nGit index. It then passes all staged filenames to ",[472,697,698],{},"nx affected --stdin",". Nx\nselects affected projects and runs their lint, format, and Markdown checks. Nx\nowns parallel execution and the task cache.",[450,701,702],{},"Lefthook preserves unstaged hunks before the jobs start. It restores these hunks\nafter it adds the fixed staged version to the index. The hook test verifies this\nbehavior for a file that has separate staged and unstaged hunks.",[450,704,705],{},"Filenames with spaces and commas remain separate. Lefthook quotes each filename\nfor Ultracite. The fix helper prefixes a filename that can look like a command\noption. The Nx helper uses one filename per line. Both helpers reject filenames\nwith line breaks. Rename these files and stage them again. The selected targets\ninspect their full project inputs, including unstaged files. They do not\nvalidate an isolated snapshot of the Git index.",[450,707,708],{},"Run the same checks without creating a commit when validating staged changes:",[465,710,712],{"className":467,"code":711,"language":469,"meta":470,"style":470},"pnpm exec lefthook run pre-commit\n",[472,713,714],{"__ignoreMap":470},[475,715,716,718,720,722,725],{"class":477,"line":478},[475,717,492],{"class":481},[475,719,521],{"class":485},[475,721,524],{"class":485},[475,723,724],{"class":485}," run",[475,726,727],{"class":485}," pre-commit\n",[450,729,730],{},"Run the checks against every tracked matching file when validating the complete\nrepository:",[465,732,734],{"className":467,"code":733,"language":469,"meta":470,"style":470},"pnpm exec lefthook run pre-commit --all-files\n",[472,735,736],{"__ignoreMap":470},[475,737,738,740,742,744,746,749],{"class":477,"line":478},[475,739,492],{"class":481},[475,741,521],{"class":485},[475,743,524],{"class":485},[475,745,724],{"class":485},[475,747,748],{"class":485}," pre-commit",[475,750,751],{"class":560}," --all-files\n",[454,753,755],{"id":754},"run-the-pre-push-check","Run the pre-push check",[450,757,758],{},"Push normally to validate repository documentation links when the pushed commits\ncontain Markdown changes:",[465,760,762],{"className":467,"code":761,"language":469,"meta":470,"style":470},"git push\n",[472,763,764],{"__ignoreMap":470},[475,765,766,768],{"class":477,"line":478},[475,767,547],{"class":481},[475,769,770],{"class":485}," push\n",[450,772,773],{},"Run the same repository-wide offline link check directly:",[465,775,777],{"className":467,"code":776,"language":469,"meta":470,"style":470},"nx run eos-documentation:docs:links\n",[472,778,779],{"__ignoreMap":470},[475,780,781,784,786],{"class":477,"line":478},[475,782,783],{"class":481},"nx",[475,785,724],{"class":485},[475,787,788],{"class":485}," eos-documentation:docs:links\n",[450,790,791],{},"Run all repository-wide Markdown formatting, linting, and link checks in\nparallel with:",[465,793,795],{"className":467,"code":794,"language":469,"meta":470,"style":470},"nx run eos-documentation:docs:check\n",[472,796,797],{"__ignoreMap":470},[475,798,799,801,803],{"class":477,"line":478},[475,800,783],{"class":481},[475,802,724],{"class":485},[475,804,805],{"class":485}," eos-documentation:docs:check\n",[454,807,809],{"id":808},"correct-a-failed-check","Correct a failed check",[450,811,812,813,816,817,820],{},"Read the named job and diagnostics in the hook output. For a Commitlint failure,\nedit the commit message to satisfy the reported rule and retry the commit.\nUltracite fixes supported staged source files before the checks run. Apply the\nsame fix to the repository with ",[472,814,815],{},"nx run eos:fmt",". Apply Markdown fixes with\n",[472,818,819],{},"pnpm docs:lint",". Correct remaining lint or link failures manually.",[450,822,823],{},"Stage the corrected files and retry the Git operation:",[465,825,827],{"className":467,"code":826,"language":469,"meta":470,"style":470},"git add \u003Cfiles>\ngit commit\ngit push\n",[472,828,829,849,855],{"__ignoreMap":470},[475,830,831,833,836,839,842,846],{"class":477,"line":478},[475,832,547],{"class":481},[475,834,835],{"class":485}," add",[475,837,838],{"class":626}," \u003C",[475,840,841],{"class":485},"file",[475,843,845],{"class":844},"sQ3_J","s",[475,847,848],{"class":626},">\n",[475,850,851,853],{"class":477,"line":489},[475,852,547],{"class":481},[475,854,550],{"class":485},[475,856,858,860],{"class":477,"line":857},3,[475,859,547],{"class":481},[475,861,770],{"class":485},[454,863,865],{"id":864},"repair-the-hook-installation","Repair the hook installation",[450,867,868,869,872],{},"Reinstall the generated Git hooks if ",[472,870,871],{},"check-install"," reports that they are\nmissing or stale:",[465,874,876],{"className":467,"code":875,"language":469,"meta":470,"style":470},"pnpm exec lefthook install\npnpm exec lefthook check-install\n",[472,877,878,888],{"__ignoreMap":470},[475,879,880,882,884,886],{"class":477,"line":478},[475,881,492],{"class":481},[475,883,521],{"class":485},[475,885,524],{"class":485},[475,887,486],{"class":485},[475,889,890,892,894,896],{"class":477,"line":489},[475,891,492],{"class":481},[475,893,521],{"class":485},[475,895,524],{"class":485},[475,897,527],{"class":485},[599,899,900],{},"html pre.shiki code .s-Z4r, html code.shiki .s-Z4r{--shiki-dark:#B392F0;--shiki-default:#6F42C1}html pre.shiki code .sg6BJ, html code.shiki .sg6BJ{--shiki-dark:#9ECBFF;--shiki-default:#032F62}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 .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 pre.shiki code .s0DvM, html code.shiki .s0DvM{--shiki-dark:#79B8FF;--shiki-default:#005CC5}html pre.shiki code .scx8i, html code.shiki .scx8i{--shiki-dark:#F97583;--shiki-default:#D73A49}html pre.shiki code .sQ3_J, html code.shiki .sQ3_J{--shiki-dark:#E1E4E8;--shiki-default:#24292E}",{"title":470,"searchDepth":857,"depth":857,"links":902},[903,904,905,906,907,908],{"id":456,"depth":489,"text":457},{"id":533,"depth":489,"text":534},{"id":673,"depth":489,"text":674},{"id":754,"depth":489,"text":755},{"id":808,"depth":489,"text":809},{"id":864,"depth":489,"text":865},{},"md",{},{"title":154,"description":452},"dIoluthDCiwGiqFz7fDo9XMFVOQrHukbsH9Et3ap1z8",[915,916],{"title":150,"path":151,"stem":152,"children":-1},{"title":158,"path":159,"stem":160,"children":-1},1789777547363]