[{"data":1,"prerenderedAt":1061},["ShallowReactive",2],{"navigation_docs_en":3,"-en-cli-overview":342,"-en-cli-overview-surround":1056},[4,45,61,96,132,166,196,217,241,265],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F10.reference",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F10.reference\u002F1.configuration","i-lucide-settings",{"title":57,"path":58,"stem":59,"icon":60},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F10.reference\u002F2.dependencies","i-lucide-package",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[67,72,77,82,86,91],{"title":68,"path":69,"stem":70,"icon":71},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture","i-lucide-layers",{"title":73,"path":74,"stem":75,"icon":76},"Application lifecycle","\u002Fen\u002Fconcepts\u002Fapplication-lifecycle","en\u002F2.concepts\u002F2.application-lifecycle","i-lucide-power",{"title":78,"path":79,"stem":80,"icon":81},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F3.error-model","i-lucide-shield-alert",{"title":52,"path":83,"stem":84,"icon":85},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F4.configuration","i-lucide-settings-2",{"title":87,"path":88,"stem":89,"icon":90},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F5.codegen-pipeline","i-lucide-file-json",{"title":92,"path":93,"stem":94,"icon":95},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F6.design-patterns","i-lucide-puzzle",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":44},"HTTP & Routing","i-lucide-globe","\u002Fen\u002Fhttp","en\u002F3.http",[102,107,112,117,122,127],{"title":103,"path":104,"stem":105,"icon":106},"The server core","\u002Fen\u002Fhttp\u002Fserver","en\u002F3.http\u002F1.server","i-lucide-server",{"title":108,"path":109,"stem":110,"icon":111},"The Fiber engine","\u002Fen\u002Fhttp\u002Ffiber","en\u002F3.http\u002F2.fiber","i-lucide-zap",{"title":113,"path":114,"stem":115,"icon":116},"The chi engine","\u002Fen\u002Fhttp\u002Fchi","en\u002F3.http\u002F3.chi","i-lucide-route",{"title":118,"path":119,"stem":120,"icon":121},"Error responses","\u002Fen\u002Fhttp\u002Ferror-responses","en\u002F3.http\u002F4.error-responses","i-lucide-octagon-alert",{"title":123,"path":124,"stem":125,"icon":126},"Validation","\u002Fen\u002Fhttp\u002Fvalidation","en\u002F3.http\u002F5.validation","i-lucide-badge-check",{"title":128,"path":129,"stem":130,"icon":131},"Pagination","\u002Fen\u002Fhttp\u002Fpagination","en\u002F3.http\u002F6.pagination","i-lucide-list-ordered",{"title":133,"icon":134,"path":135,"stem":136,"children":137,"page":44},"Database","i-lucide-database","\u002Fen\u002Fdatabase","en\u002F4.database",[138,142,147,151,156,161],{"title":139,"path":140,"stem":141,"icon":134},"Overview","\u002Fen\u002Fdatabase\u002Foverview","en\u002F4.database\u002F1.overview",{"title":143,"path":144,"stem":145,"icon":146},"pgx","\u002Fen\u002Fdatabase\u002Fpgx","en\u002F4.database\u002F2.pgx","i-lucide-plug",{"title":148,"path":149,"stem":150,"icon":71},"bun","\u002Fen\u002Fdatabase\u002Fbun","en\u002F4.database\u002F3.bun",{"title":152,"path":153,"stem":154,"icon":155},"Transactions","\u002Fen\u002Fdatabase\u002Ftransactions","en\u002F4.database\u002F4.transactions","i-lucide-git-merge",{"title":157,"path":158,"stem":159,"icon":160},"Migrations","\u002Fen\u002Fdatabase\u002Fmigrations","en\u002F4.database\u002F5.migrations","i-lucide-file-stack",{"title":162,"path":163,"stem":164,"icon":165},"Seeders","\u002Fen\u002Fdatabase\u002Fseeding","en\u002F4.database\u002F6.seeding","i-lucide-sprout",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":44},"Async & Background","i-lucide-workflow","\u002Fen\u002Fasync","en\u002F5.async",[172,176,181,186,191],{"title":173,"path":174,"stem":175,"icon":131},"Queue","\u002Fen\u002Fasync\u002Fqueue","en\u002F5.async\u002F1.queue",{"title":177,"path":178,"stem":179,"icon":180},"Events","\u002Fen\u002Fasync\u002Fevents","en\u002F5.async\u002F2.events","i-lucide-radio",{"title":182,"path":183,"stem":184,"icon":185},"Outbox","\u002Fen\u002Fasync\u002Foutbox","en\u002F5.async\u002F3.outbox","i-lucide-inbox",{"title":187,"path":188,"stem":189,"icon":190},"Scheduling","\u002Fen\u002Fasync\u002Fscheduler","en\u002F5.async\u002F4.scheduler","i-lucide-calendar-clock",{"title":192,"path":193,"stem":194,"icon":195},"Worker","\u002Fen\u002Fasync\u002Fworker","en\u002F5.async\u002F5.worker","i-lucide-cog",{"title":197,"icon":198,"path":199,"stem":200,"children":201,"page":44},"Security","i-lucide-shield-check","\u002Fen\u002Fsecurity","en\u002F6.security",[202,207,212],{"title":203,"path":204,"stem":205,"icon":206},"Authentication","\u002Fen\u002Fsecurity\u002Fauthentication","en\u002F6.security\u002F1.authentication","i-lucide-key-round",{"title":208,"path":209,"stem":210,"icon":211},"RBAC","\u002Fen\u002Fsecurity\u002Frbac","en\u002F6.security\u002F2.rbac","i-lucide-users",{"title":213,"path":214,"stem":215,"icon":216},"Policies","\u002Fen\u002Fsecurity\u002Fpolicies","en\u002F6.security\u002F3.policies","i-lucide-gavel",{"title":218,"icon":219,"path":220,"stem":221,"children":222,"page":44},"Observability","i-lucide-activity","\u002Fen\u002Fobservability","en\u002F7.observability",[223,226,231,236],{"title":139,"path":224,"stem":225,"icon":219},"\u002Fen\u002Fobservability\u002Foverview","en\u002F7.observability\u002F1.overview",{"title":227,"path":228,"stem":229,"icon":230},"Logging","\u002Fen\u002Fobservability\u002Flogging","en\u002F7.observability\u002F2.logging","i-lucide-scroll-text",{"title":232,"path":233,"stem":234,"icon":235},"OpenTelemetry","\u002Fen\u002Fobservability\u002Fopentelemetry","en\u002F7.observability\u002F3.opentelemetry","i-lucide-radar",{"title":237,"path":238,"stem":239,"icon":240},"Sentry","\u002Fen\u002Fobservability\u002Fsentry","en\u002F7.observability\u002F4.sentry","i-lucide-bug",{"title":242,"icon":243,"path":244,"stem":245,"children":246,"page":44},"Storage & Mail","i-lucide-hard-drive","\u002Fen\u002Fstorage-mail","en\u002F8.storage-mail",[247,251,256,261],{"title":248,"path":249,"stem":250,"icon":243},"Storage","\u002Fen\u002Fstorage-mail\u002Fstorage","en\u002F8.storage-mail\u002F1.storage",{"title":252,"path":253,"stem":254,"icon":255},"Email","\u002Fen\u002Fstorage-mail\u002Fmail","en\u002F8.storage-mail\u002F2.mail","i-lucide-mail",{"title":257,"path":258,"stem":259,"icon":260},"Notifications","\u002Fen\u002Fstorage-mail\u002Fnotifications","en\u002F8.storage-mail\u002F3.notifications","i-lucide-bell",{"title":262,"path":263,"stem":264,"icon":180},"Realtime","\u002Fen\u002Fstorage-mail\u002Frealtime","en\u002F8.storage-mail\u002F4.realtime",{"title":266,"icon":267,"path":268,"stem":269,"children":270,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F9.cli",[271,274,279,284,289,294,299,303,308,313,318,323,328,333,337],{"title":139,"path":272,"stem":273,"icon":267},"\u002Fen\u002Fcli\u002Foverview","en\u002F9.cli\u002F1.overview",{"title":275,"path":276,"stem":277,"icon":278},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F9.cli\u002F10.add-db","i-lucide-database-zap",{"title":280,"path":281,"stem":282,"icon":283},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F9.cli\u002F11.add-compose","i-lucide-container",{"title":285,"path":286,"stem":287,"icon":288},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F9.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":290,"path":291,"stem":292,"icon":293},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F9.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":295,"path":296,"stem":297,"icon":298},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F9.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":300,"path":301,"stem":302,"icon":165},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F9.cli\u002F15.add-seeder",{"title":304,"path":305,"stem":306,"icon":307},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F9.cli\u002F2.new-project","i-lucide-folder-plus",{"title":309,"path":310,"stem":311,"icon":312},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F9.cli\u002F3.new-module","i-lucide-blocks",{"title":314,"path":315,"stem":316,"icon":317},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F9.cli\u002F4.add-surface","i-lucide-layers-2",{"title":319,"path":320,"stem":321,"icon":322},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F9.cli\u002F5.add-core","i-lucide-box",{"title":324,"path":325,"stem":326,"icon":327},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F9.cli\u002F6.add-handler","i-lucide-webhook",{"title":329,"path":330,"stem":331,"icon":332},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F9.cli\u002F7.new-migration","i-lucide-file-plus",{"title":334,"path":335,"stem":336,"icon":195},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F9.cli\u002F8.worker-generators",{"title":338,"path":339,"stem":340,"icon":341},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F9.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"id":343,"title":139,"body":344,"description":1049,"extension":1050,"links":1051,"meta":1052,"navigation":1053,"path":272,"seo":1054,"stem":273,"__hash__":1055},"docs_en\u002Fen\u002F9.cli\u002F1.overview.md",{"type":345,"value":346,"toc":1043},"minimark",[347,368,407,415,459,555,566,571,607,611,809,813,820,826,1006,1039],[348,349,350,351,355,356,359,360,362,363,367],"p",{},"Consumer projects pin the CLI in ",[352,353,354],"code",{},"go.mod"," with the Go 1.24+ ",[352,357,358],{},"tool"," directive (written by ",[352,361,304],{},"), so every teammate runs the ",[364,365,366],"strong",{},"same version",":",[369,370,375],"pre",{"className":371,"code":372,"language":373,"meta":374,"style":374},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem \u003Ccommand>\n","sh","",[352,376,377],{"__ignoreMap":374},[378,379,382,386,390,393,397,400,404],"span",{"class":380,"line":381},"line",1,[378,383,385],{"class":384},"sBMFI","go",[378,387,389],{"class":388},"sfazB"," tool",[378,391,392],{"class":388}," gpsystem",[378,394,396],{"class":395},"sMK4o"," \u003C",[378,398,399],{"class":388},"comman",[378,401,403],{"class":402},"sTEyZ","d",[378,405,406],{"class":395},">\n",[369,408,413],{"className":409,"code":411,"language":412},[410],"language-text","gpsystem\n├── new project \u003Cname> --module-path \u003Cpath> [--dir] [--kit-replace] [--engine fiber|chi] [--db pgx|bun]\n├── new module \u003Cname> [--surface \u003Cname>]\n├── new migration \u003Cname>\n├── add surface \u003Cmodule> \u003Csurface> [--db \u003Cname>]\n├── add core \u003Cmodule> [--db \u003Cname>]\n├── add handler \u003Cmodule> \u003Csurface> \u003Coperation> --method GET --path \"\u002Fx\u002F{id}\"\n├── add event \u003Cmodule> \u003Cname>\n├── add listener \u003Cmodule> \u003Cevent> \u003Cname> [--queue \u003Cq>]\n├── add job \u003Cmodule> \u003Cname> --cron \"0 3 * * *\"\n├── add mail \u003Cmodule> \u003Cname>\n├── add notification \u003Cmodule> \u003Cname>\n├── add worker\n├── add realtime\n├── add db \u003Cmodule> \u003Cname> [--connector pgx|bun]\n├── add seeder \u003Cname>\n├── add compose\n├── add docker\n├── upgrade templates [--force]\n├── upgrade imports\n└── version\n","text",[352,414,411],{"__ignoreMap":374},[348,416,417,420,421,420,424,427,428,431,432,436,437,439,440,442,443,446,447,449,450,453,454,458],{},[352,418,419],{},"add event"," \u002F ",[352,422,423],{},"add listener",[352,425,426],{},"add job"," scaffold background work for the\n",[352,429,430],{},"cmd\u002Fworker"," binary (see the ",[433,434,435],"a",{"href":69},"worker concepts","):\n",[352,438,419],{}," creates an event and wires an outbox dispatcher into the module,\n",[352,441,423],{}," subscribes to one (",[352,444,445],{},"--queue"," routes it to a named asynq queue),\n",[352,448,426],{}," schedules a recurring handler. New projects include the worker;\n",[352,451,452],{},"add worker"," retrofits it into a project generated before the feature existed.\n",[433,455,456],{"href":286},[352,457,285],{}," generates a module-owned mail notifier (payload",[460,461,462],"ul",{},[463,464,465,466,469,470,474,475,478,479,482,483,486,487,491,492,495,496,500,501,504,505,508,509,513,514,517,518,524,525,529,530,533,534,537,538,543,544,547,548,554],"li",{},"templates) and, on a project's first notifier, wires a shared ",[352,467,468],{},"mail.Mailer","\ninto every entry point. ",[433,471,472],{"href":291},[352,473,290],{},"\ngenerates a module-owned, multi-channel notification (payload + ",[352,476,477],{},"Via"," +\nper-channel content) and, on a project's first notification, wires a shared\n",[352,480,481],{},"notify.Sender"," into every entry point plus the ",[352,484,485],{},"notifications"," table\nmigration. ",[433,488,489],{"href":296},[352,490,295],{}," scaffolds the dedicated,\nhorizontally scalable ",[352,493,494],{},"cmd\u002Frealtime"," gateway that delivers notifications live\nto connected clients.\n",[433,497,498],{"href":330},[352,499,329],{}," creates a numbered goose SQL migration\nin the ",[352,502,503],{},"migrations\u002F"," directory; ",[352,506,507],{},"upgrade imports"," rewrites imports in your\nproject after a kit package reorganization. ",[433,510,511],{"href":276},[352,512,275],{}," adds\nanother, independent database connection to a module (its own pool, config\nand ",[352,515,516],{},"Dependencies"," fields, pgx or bun); ",[433,519,521],{"href":520},"\u002Fen\u002Fcli\u002Fadd-surface#binding-the-repository-to-a-named-connection",[352,522,523],{},"add surface --db","\nbinds the module's shared repository skeleton to one. ",[433,526,527],{"href":320},[352,528,319],{},"\nretrofits a module generated before the rename with the shared ",[352,531,532],{},"core\u002F"," and\nmodule-level ",[352,535,536],{},"repository\u002F"," skeletons (purely additive, touches no anchors).\n",[433,539,540],{"href":281},[352,541,542],{},"add compose","\nregenerates ",[352,545,546],{},"compose.yml"," standalone (base stack + one service per manifest\nmodule); ",[433,549,551],{"href":550},"\u002Fen\u002Fcli\u002Fadd-compose#add-docker",[352,552,553],{},"add docker"," regenerates the\nDockerfile\u002F.dockerignore.",[348,556,557,558,561,562,565],{},"Global flags on every command: ",[352,559,560],{},"--dry-run"," (print the plan, write nothing) and ",[352,563,564],{},"--force"," (allow overwriting).",[567,568,570],"h2",{"id":569},"safety-rules","Safety rules",[460,572,573,590,597,604],{},[463,574,575,576,579,580,582,583,585,586,589],{},"The ",[364,577,578],{},"full file plan is computed up front","; if any target exists, the whole run aborts before writing anything (unless ",[352,581,564],{},"). No partial writes. With ",[352,584,564],{}," the run proceeds but prints an ",[352,587,588],{},"overwriting \u003Cpath>"," line for every existing file it replaces first, so a regeneration never clobbers files silently.",[463,591,592,593,596],{},"Generated ",[352,594,595],{},".go"," files are formatted with goimports; a template that renders invalid Go fails loudly.",[463,598,599,600,603],{},"Existing files are modified ",[364,601,602],{},"only at anchor comments",", never anywhere else.",[463,605,606],{},"Insertions are idempotent: re-running a generator never duplicates a block.",[567,608,610],{"id":609},"anchors","Anchors",[612,613,614,630],"table",{},[615,616,617],"thead",{},[618,619,620,624,627],"tr",{},[621,622,623],"th",{},"Anchor",[621,625,626],{},"File",[621,628,629],{},"Inserted by",[631,632,633,649,667,681,698,712,726,746,769,794],"tbody",{},[618,634,635,641,646],{},[636,637,638],"td",{},[352,639,640],{},"gpsystem:modules",[636,642,643],{},[352,644,645],{},"spec\u002Ftypespec\u002Fmain.tsp",[636,647,648],{},"new module \u002F add surface",[618,650,651,660,665],{},[636,652,653,656,657],{},[352,654,655],{},"gpsystem:imports",", ",[352,658,659],{},"gpsystem:surfaces",[636,661,662],{},[352,663,664],{},"register.go",[636,666,648],{},[618,668,669,674,679],{},[636,670,671],{},[352,672,673],{},"gpsystem:operations",[636,675,676],{},[352,677,678],{},"\u003Csurface>.tsp",[636,680,324],{},[618,682,683,690,695],{},[636,684,685,656,687],{},[352,686,640],{},[352,688,689],{},"gpsystem:deps-init(\u003Cmodule>)",[636,691,692],{},[352,693,694],{},"cmd\u002Fworker\u002Fmain.go",[636,696,697],{},"new module \u002F add worker \u002F add event",[618,699,700,705,710],{},[636,701,702],{},[352,703,704],{},"gpsystem:listeners",[636,706,707],{},[352,708,709],{},"listeners\u002Fregister.go",[636,711,423],{},[618,713,714,719,724],{},[636,715,716],{},[352,717,718],{},"gpsystem:jobs",[636,720,721],{},[352,722,723],{},"jobs\u002Fregister.go",[636,725,426],{},[618,727,728,736,743],{},[636,729,730,656,733],{},[352,731,732],{},"gpsystem:pools",[352,734,735],{},"gpsystem:closers",[636,737,738,656,741],{},[352,739,740],{},"cmd\u002F\u003Cmodule>\u002Fmain.go",[352,742,694],{},[636,744,745],{},"add db (named connection's pool \u002F closer), add mail (shared mailer construction), add notification (shared notifier + publisher construction\u002Fcloser)",[618,747,748,753,758],{},[636,749,750],{},[352,751,752],{},"gpsystem:config",[636,754,755],{},[352,756,757],{},"internal\u002Fplatform\u002Fconfig\u002Fconfig.go",[636,759,760,761,764,765,768],{},"add db (named connection's config field), add mail (",[352,762,763],{},"Mail smtp.Config","), add realtime (",[352,766,767],{},"Realtime realtime.Config",")",[618,770,771,778,784],{},[636,772,773,656,776],{},[352,774,775],{},"gpsystem:dependencies-init",[352,777,689],{},[636,779,780,656,782],{},[352,781,740],{},[352,783,694],{},[636,785,786,787,790,791,768],{},"add mail (",[352,788,789],{},"Mailer: mailer,","), add notification (",[352,792,793],{},"Notifier: notifier,",[618,795,796,801,806],{},[636,797,798],{},[352,799,800],{},"gpsystem:topics",[636,802,803],{},[352,804,805],{},"cmd\u002Frealtime\u002Fmain.go",[636,807,808],{},"add realtime (shared topic-channel authorization)",[810,811,812],"warning",{},"Removing an anchor comment makes the corresponding generator fail with a clear error instead of guessing where to insert. Keep them in place.",[567,814,816,817],{"id":815},"the-manifest-gpsystemyaml","The manifest: ",[352,818,819],{},"gpsystem.yaml",[348,821,822,823,825],{},"Written by ",[352,824,304],{}," at the project root; the CLI finds the project by walking up to it.",[369,827,831],{"className":828,"code":829,"language":830,"meta":374,"style":374},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","version: 1\nname: shop\nmodule: github.com\u002Facme\u002Fshop\nkit: github.com\u002Fgp-system\u002Fgpsystem@v0.1.0\nengine: fiber\ndb: pgx\ntemplatesSHA: 4f2a…            # checksum of the installed oapi template set\nmodules:\n  news:\n    surfaces: [api, admin]\n    dbs:\n      - name: analytics\n        connector: bun\n    surfaceDBs:\n      admin: analytics\n","yaml",[352,832,833,845,856,867,878,889,900,915,924,932,955,963,977,988,996],{"__ignoreMap":374},[378,834,835,839,841],{"class":380,"line":381},[378,836,838],{"class":837},"swJcz","version",[378,840,367],{"class":395},[378,842,844],{"class":843},"sbssI"," 1\n",[378,846,848,851,853],{"class":380,"line":847},2,[378,849,850],{"class":837},"name",[378,852,367],{"class":395},[378,854,855],{"class":388}," shop\n",[378,857,859,862,864],{"class":380,"line":858},3,[378,860,861],{"class":837},"module",[378,863,367],{"class":395},[378,865,866],{"class":388}," github.com\u002Facme\u002Fshop\n",[378,868,870,873,875],{"class":380,"line":869},4,[378,871,872],{"class":837},"kit",[378,874,367],{"class":395},[378,876,877],{"class":388}," github.com\u002Fgp-system\u002Fgpsystem@v0.1.0\n",[378,879,881,884,886],{"class":380,"line":880},5,[378,882,883],{"class":837},"engine",[378,885,367],{"class":395},[378,887,888],{"class":388}," fiber\n",[378,890,892,895,897],{"class":380,"line":891},6,[378,893,894],{"class":837},"db",[378,896,367],{"class":395},[378,898,899],{"class":388}," pgx\n",[378,901,903,906,908,911],{"class":380,"line":902},7,[378,904,905],{"class":837},"templatesSHA",[378,907,367],{"class":395},[378,909,910],{"class":388}," 4f2a…",[378,912,914],{"class":913},"sHwdD","            # checksum of the installed oapi template set\n",[378,916,918,921],{"class":380,"line":917},8,[378,919,920],{"class":837},"modules",[378,922,923],{"class":395},":\n",[378,925,927,930],{"class":380,"line":926},9,[378,928,929],{"class":837},"  news",[378,931,923],{"class":395},[378,933,935,938,940,943,946,949,952],{"class":380,"line":934},10,[378,936,937],{"class":837},"    surfaces",[378,939,367],{"class":395},[378,941,942],{"class":395}," [",[378,944,945],{"class":388},"api",[378,947,948],{"class":395},",",[378,950,951],{"class":388}," admin",[378,953,954],{"class":395},"]\n",[378,956,958,961],{"class":380,"line":957},11,[378,959,960],{"class":837},"    dbs",[378,962,923],{"class":395},[378,964,966,969,972,974],{"class":380,"line":965},12,[378,967,968],{"class":395},"      -",[378,970,971],{"class":837}," name",[378,973,367],{"class":395},[378,975,976],{"class":388}," analytics\n",[378,978,980,983,985],{"class":380,"line":979},13,[378,981,982],{"class":837},"        connector",[378,984,367],{"class":395},[378,986,987],{"class":388}," bun\n",[378,989,991,994],{"class":380,"line":990},14,[378,992,993],{"class":837},"    surfaceDBs",[378,995,923],{"class":395},[378,997,999,1002,1004],{"class":380,"line":998},15,[378,1000,1001],{"class":837},"      admin",[378,1003,367],{"class":395},[378,1005,976],{"class":388},[348,1007,1008,1009,1012,1013,1015,1016,1018,1019,1022,1023,1026,1027,1031,1032,1022,1035,1038],{},"It is the generators' source of truth for what exists (",[352,1010,1011],{},"add surface news admin"," fails fast if the module is missing or the surface already exists), and it cross-checks ",[352,1014,861],{}," against ",[352,1017,354],{},". ",[352,1020,1021],{},"dbs","\u002F",[352,1024,1025],{},"surfaceDBs"," are only present once a module has named connections (via ",[433,1028,1029],{"href":276},[352,1030,275],{},"); older manifests without them load unchanged. The pre-rename ",[352,1033,1034],{},"domains:",[352,1036,1037],{},"domainDBs:"," keys are still read and migrated to the new keys automatically on the next save.",[1040,1041,1042],"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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":374,"searchDepth":847,"depth":847,"links":1044},[1045,1046,1047],{"id":569,"depth":847,"text":570},{"id":609,"depth":847,"text":610},{"id":815,"depth":847,"text":1048},"The manifest: gpsystem.yaml","How the gpsystem CLI works: tool directive, safety rules, anchors, manifest.","md",null,{},{"icon":267},{"title":139,"description":1049},"goomDW-mOxB8n3tmDgvc6M46gjbZR5YYYL4blD91aDk",[1057,1059],{"title":262,"path":263,"stem":264,"description":1058,"icon":180,"children":-1},"A dedicated, horizontally scalable gateway that pushes notifications live to connected clients: server→client only, built on centrifuge.",{"title":275,"path":276,"stem":277,"description":1060,"icon":278,"children":-1},"Add a named database connection to a module, with its own pool and connector.",1784668711011]