[{"data":1,"prerenderedAt":991},["ShallowReactive",2],{"navigation":3,"external-navigation":214,"external_core:\u002Fcore\u002Fsetup":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":988},{"id":445,"title":421,"body":446,"config":983,"description":452,"extension":984,"meta":985,"navigation":15,"path":422,"seo":986,"stem":423,"__hash__":987},"external_core\u002Fcore\u002Fsetup.md",{"type":447,"value":448,"toc":969},"minimark",[449,453,458,495,499,504,507,576,586,605,615,618,710,713,718,729,732,766,774,777,839,846,849,881,885,905,909,928,965],[450,451,452],"p",{},"Use this page for a fast first-run Core setup. Detailed Core configuration lives in the backend and frontend guides.",[454,455,457],"h2",{"id":456},"prerequisites","Prerequisites",[459,460,461,472,481,484],"ul",{},[462,463,464,471],"li",{},[465,466,470],"a",{"href":467,"rel":468},"https:\u002F\u002Fdocs.determinate.systems\u002F",[469],"nofollow","Nix, via Determinate Systems"," for local development tooling.",[462,473,474,475,480],{},"Docker Desktop (or compatible Docker runtime), configured using the ",[465,476,479],{"href":477,"rel":478},"https:\u002F\u002Fapp.notion.com\u002Fp\u002FDevelopment-Environments-18c8a35c22c38178a68eea4de2949b04?source=copy_link#18c8a35c22c381a59cf2c96dce8825c6",[469],"Development Environments guide",".",[462,482,483],{},"AWS CLI configured for company SSO access.",[462,485,486,490,491,494],{},[487,488,489],"code",{},"core.test"," resolving to ",[487,492,493],{},"127.0.0.1"," for the local app hostname.",[454,496,498],{"id":497},"quickstart","Quickstart",[500,501,503],"h3",{"id":502},"_1-prepare-the-local-shell-and-backend-services-repository-root","1) Prepare the local shell and backend services (repository root)",[450,505,506],{},"These commands set up your local toolchain, create a local environment file, authenticate to AWS and the private Docker registry, start the Docker stack, and bootstrap Laravel.",[508,509,514],"pre",{"className":510,"code":511,"language":512,"meta":513,"style":513},"language-shell shiki shiki-themes github-dark github-light","# Load the project development environment (Node, ni\u002Fnr aliases, and other tooling)\nnix develop\n\n# Run first-run setup\njust setup\n\n# Open a shell inside the PHP application container\njust shell-core-web\n","shell","",[487,515,516,525,536,542,548,557,562,568],{"__ignoreMap":513},[517,518,521],"span",{"class":519,"line":520},"line",1,[517,522,524],{"class":523},"sryI4","# Load the project development environment (Node, ni\u002Fnr aliases, and other tooling)\n",[517,526,528,532],{"class":519,"line":527},2,[517,529,531],{"class":530},"s-Z4r","nix",[517,533,535],{"class":534},"sg6BJ"," develop\n",[517,537,539],{"class":519,"line":538},3,[517,540,541],{"emptyLinePlaceholder":15},"\n",[517,543,545],{"class":519,"line":544},4,[517,546,547],{"class":523},"# Run first-run setup\n",[517,549,551,554],{"class":519,"line":550},5,[517,552,553],{"class":530},"just",[517,555,556],{"class":534}," setup\n",[517,558,560],{"class":519,"line":559},6,[517,561,541],{"emptyLinePlaceholder":15},[517,563,565],{"class":519,"line":564},7,[517,566,567],{"class":523},"# Open a shell inside the PHP application container\n",[517,569,571,573],{"class":519,"line":570},8,[517,572,553],{"class":530},[517,574,575],{"class":534}," shell-core-web\n",[450,577,578,579,582,583,480],{},"Core's Docker configuration sets ",[487,580,581],{},"APP_URL=http:\u002F\u002Fcore.test"," and maps the web service to host port ",[487,584,585],{},"80",[450,587,588,589,592,593,596,597,600,601,604],{},"Use ",[487,590,591],{},"just stop"," to stop the local services, and ",[487,594,595],{},"just restart"," to restart them. These commands use ",[487,598,599],{},"docker-compose"," with ",[487,602,603],{},"AWS_PROFILE=internal-services"," and the default services from the Compose file.",[450,606,607,610,611,614],{},[487,608,609],{},"just setup"," signs Docker in to the private ECR registry, then uses ",[487,612,613],{},"just start-with-wait"," before running Composer and Laravel bootstrap commands.",[450,616,617],{},"Common setup helpers are also available through just:",[508,619,621],{"className":510,"code":620,"language":512,"meta":513,"style":513},"just setup-env-file\njust setup-hosts\njust aws-login\njust aws-check\njust ecr-login\njust start\njust start-with-wait\njust shell-core-web\njust composer-install\njust migrate\njust storage-link\njust seed-testing-local\n",[487,622,623,630,637,644,651,658,665,672,678,686,694,702],{"__ignoreMap":513},[517,624,625,627],{"class":519,"line":520},[517,626,553],{"class":530},[517,628,629],{"class":534}," setup-env-file\n",[517,631,632,634],{"class":519,"line":527},[517,633,553],{"class":530},[517,635,636],{"class":534}," setup-hosts\n",[517,638,639,641],{"class":519,"line":538},[517,640,553],{"class":530},[517,642,643],{"class":534}," aws-login\n",[517,645,646,648],{"class":519,"line":544},[517,647,553],{"class":530},[517,649,650],{"class":534}," aws-check\n",[517,652,653,655],{"class":519,"line":550},[517,654,553],{"class":530},[517,656,657],{"class":534}," ecr-login\n",[517,659,660,662],{"class":519,"line":559},[517,661,553],{"class":530},[517,663,664],{"class":534}," start\n",[517,666,667,669],{"class":519,"line":564},[517,668,553],{"class":530},[517,670,671],{"class":534}," start-with-wait\n",[517,673,674,676],{"class":519,"line":570},[517,675,553],{"class":530},[517,677,575],{"class":534},[517,679,681,683],{"class":519,"line":680},9,[517,682,553],{"class":530},[517,684,685],{"class":534}," composer-install\n",[517,687,689,691],{"class":519,"line":688},10,[517,690,553],{"class":530},[517,692,693],{"class":534}," migrate\n",[517,695,697,699],{"class":519,"line":696},11,[517,698,553],{"class":530},[517,700,701],{"class":534}," storage-link\n",[517,703,705,707],{"class":519,"line":704},12,[517,706,553],{"class":530},[517,708,709],{"class":534}," seed-testing-local\n",[450,711,712],{},"The seed command keeps the underlying script's destructive database prompt.",[714,715,717],"h4",{"id":716},"reporting-mq-consumer","Reporting MQ consumer",[450,719,720,721,724,725,728],{},"The reporting MQ consumer is optional for local development. The default ",[487,722,723],{},"AWS_PROFILE=internal-services docker-compose up -d"," command does not start ",[487,726,727],{},"core.mq-consumer",", which avoids noisy Laravel logs when the reporting MQ server is not needed or is being booted by the reporting service repository.",[450,730,731],{},"Start it only when you need to consume reporting status updates from this repository:",[508,733,735],{"className":510,"code":734,"language":512,"meta":513,"style":513},"AWS_PROFILE=internal-services docker-compose --profile reporting-mq up -d\n",[487,736,737],{"__ignoreMap":513},[517,738,739,743,747,750,753,757,760,763],{"class":519,"line":520},[517,740,742],{"class":741},"sQ3_J","AWS_PROFILE",[517,744,746],{"class":745},"scx8i","=",[517,748,749],{"class":534},"internal-services",[517,751,752],{"class":530}," docker-compose",[517,754,756],{"class":755},"s0DvM"," --profile",[517,758,759],{"class":534}," reporting-mq",[517,761,762],{"class":534}," up",[517,764,765],{"class":755}," -d\n",[500,767,769,770,773],{"id":768},"_2-bootstrap-the-laravel-app-inside-coreweb","2) Bootstrap the Laravel app (inside ",[487,771,772],{},"core.web",")",[450,775,776],{},"These commands install PHP dependencies, apply database migrations, and create the public storage symlink used by the app.",[508,778,780],{"className":510,"code":779,"language":512,"meta":513,"style":513},"# Install backend PHP dependencies from composer.lock\njust composer-install\n\n# Run database migrations with verbose output\njust migrate\n\n# Link storage\u002Fapp\u002Fpublic to public\u002Fstorage for locally served files\njust storage-link\n\n# Setup AI tooling\njust boost-install\n",[487,781,782,787,793,797,802,808,812,817,823,827,832],{"__ignoreMap":513},[517,783,784],{"class":519,"line":520},[517,785,786],{"class":523},"# Install backend PHP dependencies from composer.lock\n",[517,788,789,791],{"class":519,"line":527},[517,790,553],{"class":530},[517,792,685],{"class":534},[517,794,795],{"class":519,"line":538},[517,796,541],{"emptyLinePlaceholder":15},[517,798,799],{"class":519,"line":544},[517,800,801],{"class":523},"# Run database migrations with verbose output\n",[517,803,804,806],{"class":519,"line":550},[517,805,553],{"class":530},[517,807,693],{"class":534},[517,809,810],{"class":519,"line":559},[517,811,541],{"emptyLinePlaceholder":15},[517,813,814],{"class":519,"line":564},[517,815,816],{"class":523},"# Link storage\u002Fapp\u002Fpublic to public\u002Fstorage for locally served files\n",[517,818,819,821],{"class":519,"line":570},[517,820,553],{"class":530},[517,822,701],{"class":534},[517,824,825],{"class":519,"line":680},[517,826,541],{"emptyLinePlaceholder":15},[517,828,829],{"class":519,"line":688},[517,830,831],{"class":523},"# Setup AI tooling\n",[517,833,834,836],{"class":519,"line":696},[517,835,553],{"class":530},[517,837,838],{"class":534}," boost-install\n",[500,840,842,843,773],{"id":841},"_3-build-frontend-assets-back-on-the-host-machine-inside-nix-develop","3) Build frontend assets (back on the host machine inside ",[487,844,845],{},"nix develop",[450,847,848],{},"These commands install frontend dependencies and compile production-ready assets.",[508,850,852],{"className":510,"code":851,"language":512,"meta":513,"style":513},"# Install frontend dependencies using ni (npm in this repository)\nni\n\n# Build frontend assets used by the application\nnr build\n",[487,853,854,859,864,868,873],{"__ignoreMap":513},[517,855,856],{"class":519,"line":520},[517,857,858],{"class":523},"# Install frontend dependencies using ni (npm in this repository)\n",[517,860,861],{"class":519,"line":527},[517,862,863],{"class":530},"ni\n",[517,865,866],{"class":519,"line":538},[517,867,541],{"emptyLinePlaceholder":15},[517,869,870],{"class":519,"line":544},[517,871,872],{"class":523},"# Build frontend assets used by the application\n",[517,874,875,878],{"class":519,"line":550},[517,876,877],{"class":530},"nr",[517,879,880],{"class":534}," build\n",[454,882,884],{"id":883},"detailed-guides","Detailed Guides",[459,886,887,893,899],{},[462,888,889,890],{},"Backend setup: ",[465,891,892],{"href":326},"docs\u002Fbackend\u002Fsetup.md",[462,894,895,896],{},"Frontend setup and development: ",[465,897,898],{"href":344},"docs\u002Ffrontend\u002Fdevelopment.md",[462,900,901,902],{},"Backend testing: ",[465,903,904],{"href":330},"docs\u002Fbackend\u002Ftesting.md",[454,906,908],{"id":907},"optional-auto-load-shell-with-direnv","Optional: Auto-Load Shell With direnv",[450,910,911,912,914,915,600,918,921,922,927],{},"To auto-load ",[487,913,845],{}," when entering this repository, use ",[487,916,917],{},"direnv",[487,919,920],{},"nix-direnv",". You can do this using our ",[465,923,926],{"href":924,"rel":925},"https:\u002F\u002Fbitbucket.org\u002Fgiftcartdev\u002Fnix-development-profiles\u002Fsrc\u002Fmaster\u002F",[469],"Nix Development Profiles"," system for installing dependencies.",[508,929,931],{"className":510,"code":930,"language":512,"meta":513,"style":513},"echo 'eval \"$(direnv hook zsh)\"' >> ~\u002F.zshrc\ncp .envrc.example .envrc\ndirenv allow\n",[487,932,933,947,958],{"__ignoreMap":513},[517,934,935,938,941,944],{"class":519,"line":520},[517,936,937],{"class":755},"echo",[517,939,940],{"class":534}," 'eval \"$(direnv hook zsh)\"'",[517,942,943],{"class":745}," >>",[517,945,946],{"class":534}," ~\u002F.zshrc\n",[517,948,949,952,955],{"class":519,"line":527},[517,950,951],{"class":530},"cp",[517,953,954],{"class":534}," .envrc.example",[517,956,957],{"class":534}," .envrc\n",[517,959,960,962],{"class":519,"line":538},[517,961,917],{"class":530},[517,963,964],{"class":534}," allow\n",[966,967,968],"style",{},"html pre.shiki code .sryI4, html code.shiki .sryI4{--shiki-dark:#6A737D;--shiki-default:#6A737D}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 .sQ3_J, html code.shiki .sQ3_J{--shiki-dark:#E1E4E8;--shiki-default:#24292E}html pre.shiki code .scx8i, html code.shiki .scx8i{--shiki-dark:#F97583;--shiki-default:#D73A49}html pre.shiki code .s0DvM, html code.shiki .s0DvM{--shiki-dark:#79B8FF;--shiki-default:#005CC5}",{"title":513,"searchDepth":538,"depth":538,"links":970},[971,972,981,982],{"id":456,"depth":527,"text":457},{"id":497,"depth":527,"text":498,"children":973},[974,977,979],{"id":502,"depth":538,"text":503,"children":975},[976],{"id":716,"depth":544,"text":717},{"id":768,"depth":538,"text":978},"2) Bootstrap the Laravel app (inside core.web)",{"id":841,"depth":538,"text":980},"3) Build frontend assets (back on the host machine inside nix develop)",{"id":883,"depth":527,"text":884},{"id":907,"depth":527,"text":908},{},"md",{},{"title":421,"description":452},"5e1CV-1jwbFjuLpY1t-BXOTFgEkhrIDueOp5piUqzZc",[989,990],{"title":417,"path":418,"stem":419,"children":-1},{"title":430,"path":431,"stem":432,"children":-1},1789777548353]