[{"data":1,"prerenderedAt":462},["ShallowReactive",2],{"navigation_docs":3,"-docs-reference-commands":64,"-docs-reference-commands-surround":457},[4,29,49],{"title":5,"path":6,"stem":7,"children":8,"page":28},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Configuration","\u002Fdocs\u002Fgetting-started\u002Fconfiguration","docs\u002F1.getting-started\u002F3.configuration","i-lucide-sliders-horizontal",{"title":25,"path":26,"stem":27,"icon":18},"Deployment","\u002Fdocs\u002Fgetting-started\u002Fdeployment","docs\u002F1.getting-started\u002F4.deployment",false,{"title":30,"path":31,"stem":32,"children":33,"page":28},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F2.architecture",[34,39,44],{"title":35,"path":36,"stem":37,"icon":38},"Layers","\u002Fdocs\u002Farchitecture\u002Flayers","docs\u002F2.architecture\u002F1.layers","i-lucide-layers",{"title":40,"path":41,"stem":42,"icon":43},"Multi-tenancy","\u002Fdocs\u002Farchitecture\u002Fmulti-tenancy","docs\u002F2.architecture\u002F2.multi-tenancy","i-lucide-building-2",{"title":45,"path":46,"stem":47,"icon":48},"Testing","\u002Fdocs\u002Farchitecture\u002Ftesting","docs\u002F2.architecture\u002F3.testing","i-lucide-flask-conical",{"title":50,"path":51,"stem":52,"children":53,"page":28},"Reference","\u002Fdocs\u002Freference","docs\u002F3.reference",[54,59],{"title":55,"path":56,"stem":57,"icon":58},"Commands","\u002Fdocs\u002Freference\u002Fcommands","docs\u002F3.reference\u002F1.commands","i-lucide-terminal",{"title":60,"path":61,"stem":62,"icon":63},"Decisions","\u002Fdocs\u002Freference\u002Fdecisions","docs\u002F3.reference\u002F2.decisions","i-lucide-git-branch",{"id":65,"title":55,"body":66,"description":450,"extension":451,"links":452,"meta":453,"navigation":454,"path":56,"seo":455,"stem":57,"__hash__":456},"docs\u002Fdocs\u002F3.reference\u002F1.commands.md",{"type":67,"value":68,"toc":442},"minimark",[69,74,134,138,197,205,209,254,258,334,341,345,370,374,378,381,438],[70,71,73],"h2",{"id":72},"develop","Develop",[75,76,81],"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm dev            # http:\u002F\u002Flocalhost:3000\npnpm build          # production build\npnpm preview        # serve the build\npnpm typecheck      # nuxt typecheck\n","bash","",[82,83,84,101,112,123],"code",{"__ignoreMap":80},[85,86,89,93,97],"span",{"class":87,"line":88},"line",1,[85,90,92],{"class":91},"sBMFI","pnpm",[85,94,96],{"class":95},"sfazB"," dev",[85,98,100],{"class":99},"sHwdD","            # http:\u002F\u002Flocalhost:3000\n",[85,102,104,106,109],{"class":87,"line":103},2,[85,105,92],{"class":91},[85,107,108],{"class":95}," build",[85,110,111],{"class":99},"          # production build\n",[85,113,115,117,120],{"class":87,"line":114},3,[85,116,92],{"class":91},[85,118,119],{"class":95}," preview",[85,121,122],{"class":99},"        # serve the build\n",[85,124,126,128,131],{"class":87,"line":125},4,[85,127,92],{"class":91},[85,129,130],{"class":95}," typecheck",[85,132,133],{"class":99},"      # nuxt typecheck\n",[70,135,137],{"id":136},"database","Database",[75,139,141],{"className":77,"code":140,"language":79,"meta":80,"style":80},"pnpm supabase \u003Ccmd> # the CLI is a project dep, not global\npnpm db:reset       # reset + migrate + seed\npnpm db:types       # regenerate shared\u002Ftypes\u002Fdatabase.types.ts\npnpm seed           # reseed (SEED_FAST=1 for the minimal set)\n",[82,142,143,167,177,187],{"__ignoreMap":80},[85,144,145,147,150,154,157,161,164],{"class":87,"line":88},[85,146,92],{"class":91},[85,148,149],{"class":95}," supabase",[85,151,153],{"class":152},"sMK4o"," \u003C",[85,155,156],{"class":95},"cm",[85,158,160],{"class":159},"sTEyZ","d",[85,162,163],{"class":152},">",[85,165,166],{"class":99}," # the CLI is a project dep, not global\n",[85,168,169,171,174],{"class":87,"line":103},[85,170,92],{"class":91},[85,172,173],{"class":95}," db:reset",[85,175,176],{"class":99},"       # reset + migrate + seed\n",[85,178,179,181,184],{"class":87,"line":114},[85,180,92],{"class":91},[85,182,183],{"class":95}," db:types",[85,185,186],{"class":99},"       # regenerate shared\u002Ftypes\u002Fdatabase.types.ts\n",[85,188,189,191,194],{"class":87,"line":125},[85,190,92],{"class":91},[85,192,193],{"class":95}," seed",[85,195,196],{"class":99},"           # reseed (SEED_FAST=1 for the minimal set)\n",[198,199,200,201,204],"caution",{},"After changing a table or function, run ",[82,202,203],{},"pnpm db:types"," or typecheck fails. Never\nedit a migration that has already been applied to a real database — add a new one.",[70,206,208],{"id":207},"test","Test",[75,210,212],{"className":77,"code":211,"language":79,"meta":80,"style":80},"pnpm test           # vitest (pure logic)\npnpm test:coverage  # with the 100% gate\npnpm test:e2e       # Playwright e2e + a11y\npnpm screenshots    # regenerate docs\u002Fscreenshots\u002F\n",[82,213,214,224,234,244],{"__ignoreMap":80},[85,215,216,218,221],{"class":87,"line":88},[85,217,92],{"class":91},[85,219,220],{"class":95}," test",[85,222,223],{"class":99},"           # vitest (pure logic)\n",[85,225,226,228,231],{"class":87,"line":103},[85,227,92],{"class":91},[85,229,230],{"class":95}," test:coverage",[85,232,233],{"class":99},"  # with the 100% gate\n",[85,235,236,238,241],{"class":87,"line":114},[85,237,92],{"class":91},[85,239,240],{"class":95}," test:e2e",[85,242,243],{"class":99},"       # Playwright e2e + a11y\n",[85,245,246,248,251],{"class":87,"line":125},[85,247,92],{"class":91},[85,249,250],{"class":95}," screenshots",[85,252,253],{"class":99},"    # regenerate docs\u002Fscreenshots\u002F\n",[70,255,257],{"id":256},"lint-and-generate","Lint and generate",[75,259,261],{"className":77,"code":260,"language":79,"meta":80,"style":80},"pnpm lint \u002F pnpm lint:fix\npnpm fmt \u002F pnpm fmt:check\npnpm lint:i18n            # key parity + usage\npnpm gen:layer \u003Cname>     # scaffold a feature layer\npnpm gen:auth-templates   # regenerate supabase\u002Ftemplates\u002F*.html\n",[82,262,263,279,293,303,323],{"__ignoreMap":80},[85,264,265,267,270,273,276],{"class":87,"line":88},[85,266,92],{"class":91},[85,268,269],{"class":95}," lint",[85,271,272],{"class":95}," \u002F",[85,274,275],{"class":95}," pnpm",[85,277,278],{"class":95}," lint:fix\n",[85,280,281,283,286,288,290],{"class":87,"line":103},[85,282,92],{"class":91},[85,284,285],{"class":95}," fmt",[85,287,272],{"class":95},[85,289,275],{"class":95},[85,291,292],{"class":95}," fmt:check\n",[85,294,295,297,300],{"class":87,"line":114},[85,296,92],{"class":91},[85,298,299],{"class":95}," lint:i18n",[85,301,302],{"class":99},"            # key parity + usage\n",[85,304,305,307,310,312,315,318,320],{"class":87,"line":125},[85,306,92],{"class":91},[85,308,309],{"class":95}," gen:layer",[85,311,153],{"class":152},[85,313,314],{"class":95},"nam",[85,316,317],{"class":159},"e",[85,319,163],{"class":152},[85,321,322],{"class":99},"     # scaffold a feature layer\n",[85,324,326,328,331],{"class":87,"line":325},5,[85,327,92],{"class":91},[85,329,330],{"class":95}," gen:auth-templates",[85,332,333],{"class":99},"   # regenerate supabase\u002Ftemplates\u002F*.html\n",[335,336,337,340],"note",{},[82,338,339],{},"forge.toml"," wires oxfmt and oxlint into a pre-commit hook that auto-fixes and\nrestages, so you don't need to run them during development.",[70,342,344],{"id":343},"set-up-and-verify","Set up and verify",[75,346,348],{"className":77,"code":347,"language":79,"meta":80,"style":80},"pnpm setup   # pick integrations, write .env\npnpm doctor  # verify what setup wrote\n",[82,349,350,360],{"__ignoreMap":80},[85,351,352,354,357],{"class":87,"line":88},[85,353,92],{"class":91},[85,355,356],{"class":95}," setup",[85,358,359],{"class":99},"   # pick integrations, write .env\n",[85,361,362,364,367],{"class":87,"line":103},[85,363,92],{"class":91},[85,365,366],{"class":95}," doctor",[85,368,369],{"class":99},"  # verify what setup wrote\n",[371,372,373],"p",{},"Both read the same subsystem manifest — adding a subsystem there wires up both.",[70,375,377],{"id":376},"changelogs","Changelogs",[371,379,380],{},"There are two, deliberately:",[382,383,384,400],"table",{},[385,386,387],"thead",{},[388,389,390,394,397],"tr",{},[391,392,393],"th",{},"File",[391,395,396],{},"Audience",[391,398,399],{},"Edited by",[401,402,403,421],"tbody",{},[388,404,405,411,414],{},[406,407,408],"td",{},[82,409,410],{},"CHANGELOG.md",[406,412,413],{},"developers",[406,415,416,417],{},"release-please — ",[418,419,420],"strong",{},"never by hand",[388,422,423,432,435],{},[406,424,425,428,429],{},[82,426,427],{},"app\u002Futils\u002Fchangelog.ts"," → ",[82,430,431],{},"\u002Fchangelog",[406,433,434],{},"your users",[406,436,437],{},"you, one entry per date",[439,440,441],"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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .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}",{"title":80,"searchDepth":103,"depth":103,"links":443},[444,445,446,447,448,449],{"id":72,"depth":103,"text":73},{"id":136,"depth":103,"text":137},{"id":207,"depth":103,"text":208},{"id":256,"depth":103,"text":257},{"id":343,"depth":103,"text":344},{"id":376,"depth":103,"text":377},"Every script worth knowing, grouped by what you're doing.","md",null,{},{"icon":58},{"title":55,"description":450},"a1e31zeHHLPQWtK4-zXwZE8DBAM_xFBaSMceeVRAA5s",[458,460],{"title":45,"path":46,"stem":47,"description":459,"icon":48,"children":-1},"Two suites with a hard line between them, and a 100% gate that means something.",{"title":60,"path":61,"stem":62,"description":461,"icon":63,"children":-1},"The architecture decision records, and the things deliberately not built.",1785950579264]