[{"data":1,"prerenderedAt":645},["ShallowReactive",2],{"navigation_docs":3,"-contributing-development":172,"-contributing-development-surround":640},[4,30,100,134],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":29},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,21,25],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":5,"path":19,"stem":20},"\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":22,"path":23,"stem":24},"Build from source","\u002Fgetting-started\u002Fbuild-from-source","1.getting-started\u002F4.build-from-source",{"title":26,"path":27,"stem":28},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F5.troubleshooting",false,{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":29},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96],{"title":37,"path":38,"stem":39},"Interface","\u002Fguide\u002Finterface","2.guide\u002F01.interface",{"title":41,"path":42,"stem":43},"Workspace","\u002Fguide\u002Fworkspace","2.guide\u002F02.workspace",{"title":45,"path":46,"stem":47},"Collections","\u002Fguide\u002Fcollections","2.guide\u002F03.collections",{"title":49,"path":50,"stem":51},"HTTP requests","\u002Fguide\u002Fhttp-requests","2.guide\u002F04.http-requests",{"title":53,"path":54,"stem":55},"Variables","\u002Fguide\u002Fvariables","2.guide\u002F05.variables",{"title":57,"path":58,"stem":59},"Authorization","\u002Fguide\u002Fauthorization","2.guide\u002F06.authorization",{"title":61,"path":62,"stem":63},"Scripts and tests","\u002Fguide\u002Fscripts-and-tests","2.guide\u002F07.scripts-and-tests",{"title":65,"path":66,"stem":67},"Collection runner","\u002Fguide\u002Fcollection-runner","2.guide\u002F08.collection-runner",{"title":69,"path":70,"stem":71},"Import and export","\u002Fguide\u002Fimport-export","2.guide\u002F09.import-export",{"title":73,"path":74,"stem":75},"Code snippets","\u002Fguide\u002Fcode-snippets","2.guide\u002F10.code-snippets",{"title":77,"path":78,"stem":79},"gRPC","\u002Fguide\u002Fgrpc","2.guide\u002F11.grpc",{"title":81,"path":82,"stem":83},"WebSocket","\u002Fguide\u002Fwebsocket","2.guide\u002F12.websocket",{"title":85,"path":86,"stem":87},"Cookies, proxy and certificates","\u002Fguide\u002Fcookies-proxy-certificates","2.guide\u002F13.cookies-proxy-certificates",{"title":89,"path":90,"stem":91},"Settings","\u002Fguide\u002Fsettings","2.guide\u002F14.settings",{"title":93,"path":94,"stem":95},"Keyboard shortcuts","\u002Fguide\u002Fkeyboard-shortcuts","2.guide\u002F15.keyboard-shortcuts",{"title":97,"path":98,"stem":99},"Privacy and security","\u002Fguide\u002Fprivacy-and-security","2.guide\u002F16.privacy-and-security",{"title":101,"icon":102,"path":103,"stem":104,"children":105,"page":29},"Reference","i-lucide-square-terminal","\u002Freference","3.reference",[106,110,114,118,122,126,130],{"title":107,"path":108,"stem":109},"Command line","\u002Freference\u002Fcli","3.reference\u002F1.cli",{"title":111,"path":112,"stem":113},"Automation tools","\u002Freference\u002Fautomation-tools","3.reference\u002F2.automation-tools",{"title":115,"path":116,"stem":117},"Scripting API","\u002Freference\u002Fscripting-api","3.reference\u002F3.scripting-api",{"title":119,"path":120,"stem":121},"Dynamic variables","\u002Freference\u002Fdynamic-variables","3.reference\u002F4.dynamic-variables",{"title":123,"path":124,"stem":125},"UI control channel","\u002Freference\u002Fui-control-channel","3.reference\u002F5.ui-control-channel",{"title":127,"path":128,"stem":129},"Workspace format","\u002Freference\u002Fworkspace-format","3.reference\u002F6.workspace-format",{"title":131,"path":132,"stem":133},"Feature status","\u002Freference\u002Ffeature-status","3.reference\u002F7.feature-status",{"title":135,"icon":136,"path":137,"stem":138,"children":139,"page":29},"Contributing","i-lucide-git-pull-request","\u002Fcontributing","4.contributing",[140,144,148,152,156,160,164,168],{"title":141,"path":142,"stem":143},"Contributing overview","\u002Fcontributing\u002Foverview","4.contributing\u002F1.overview",{"title":145,"path":146,"stem":147},"Development","\u002Fcontributing\u002Fdevelopment","4.contributing\u002F2.development",{"title":149,"path":150,"stem":151},"Architecture","\u002Fcontributing\u002Farchitecture","4.contributing\u002F3.architecture",{"title":153,"path":154,"stem":155},"Known gaps","\u002Fcontributing\u002Fgaps","4.contributing\u002F4.gaps",{"title":157,"path":158,"stem":159},"Adding a feature","\u002Fcontributing\u002Fadding-a-feature","4.contributing\u002F5.adding-a-feature",{"title":161,"path":162,"stem":163},"Assets and clean-room","\u002Fcontributing\u002Fassets-and-clean-room","4.contributing\u002F6.assets-and-clean-room",{"title":165,"path":166,"stem":167},"Releasing","\u002Fcontributing\u002Freleasing","4.contributing\u002F7.releasing",{"title":169,"path":170,"stem":171},"Writing the documentation","\u002Fcontributing\u002Fdocumentation","4.contributing\u002F8.documentation",{"id":173,"title":145,"body":174,"description":633,"extension":634,"links":635,"meta":636,"navigation":637,"path":146,"seo":638,"stem":147,"__hash__":639},"docs\u002F4.contributing\u002F2.development.md",{"type":175,"value":176,"toc":624},"minimark",[177,182,214,218,228,233,245,251,257,422,432,436,530,534,539,577,600,604,620],[178,179,181],"h2",{"id":180},"toolchain","Toolchain",[183,184,185,204,211],"ul",{},[186,187,188,189,193,194,203],"li",{},"Stable Rust 1.95 or newer. This is ",[190,191,192],"code",{},"rust-version"," in the root ",[195,196,200],"a",{"href":197,"rel":198},"https:\u002F\u002Fgithub.com\u002Fzuramai\u002Fpostguy\u002Fblob\u002Fmain\u002FCargo.toml",[199],"nofollow",[190,201,202],{},"Cargo.toml",", the floor egui 0.36 needs. CI uses stable.",[186,205,206,207,210],{},"There is no WASM target and no ",[190,208,209],{},"craft-*"," dependency.",[186,212,213],{},"The only embedded font is Poppins, plus the default fonts that ship inside egui.",[178,215,217],{"id":216},"everyday-commands","Everyday commands",[219,220,225],"pre",{"className":221,"code":223,"language":224},[222],"language-text","cargo build -p postguy                    # desktop app\ncargo run -p postguy -- --workspace DIR --control \u002Ftmp\u002Fpostguy-control.json\n                                          # opt-in control channel (loopback, fresh owner-only token)\ncargo run -p postguy-cli -- run --script STEPS.json --root DIR   # engine harness\ncargo run -p postguy-cli -- ui --control FILE inspect             # or command\u002Fset\u002Fscreenshot\ncargo xtask ci                            # fmt, clippy -D warnings, test, layers, assets, parity, deny\ncargo xtask layers                        # dependency layering only\ncargo xtask assets [--write]              # asset policy against ATTRIBUTION.toml (ATTRIBUTION.md regenerate)\ncargo xtask parity [--partial|--json]     # parity checklist validation and progress\ncargo xtask deny                          # licences\u002Fsources (delegates to cargo-deny when installed)\ncargo xtask size [--skip-build]           # release binary sizes against the size budgets\ncargo xtask bench [--check] [--debug]      # headless frame-time capture (10k tree, 10 MB Raw)\ncargo xtask icons [--check]               # regenerate ui-egui\u002Fsrc\u002Ficons_gen.rs from assets\u002Ficons\ncargo xtask logo [--check]                # rasterize assets\u002Flogo\u002Fpostguy.svg into PNG sizes\ncargo xtask fuzz --time 300 [--seed N]    # mutation fuzzing (registered targets)\ncargo xtask screenshots [--out DIR]       # render review screenshots into target\u002Fscreenshots\u002F\n","text",[190,226,223],{"__ignoreMap":227},"",[229,230,232],"h3",{"id":231},"import-a-file-and-generate-a-snippet","Import a file and generate a snippet",[234,235,236,237,240,241,244],"p",{},"Each ",[190,238,239],{},"postguy-cli call"," process starts with no workspace open. It fails with ",[190,242,243],{},"no workspace is open; call workspace_open first",".",[234,246,247,248,244],{},"To import a file and generate a snippet, run the steps as one script. Tool arguments take ids, so use a collection id and request id you read from ",[190,249,250],{},"collection_list",[219,252,255],{"className":253,"code":254,"language":224},[222],"cargo run -p postguy-cli -- run --script steps.json --root DIR\n",[190,256,254],{"__ignoreMap":227},[219,258,262],{"className":259,"code":260,"language":261,"meta":227,"style":227},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[\n  {\"tool\": \"workspace_open\", \"args\": {\"path\": \"ws\"}},\n  {\"tool\": \"import_file\", \"args\": {\"path\": \"collection.json\"}},\n  {\"tool\": \"collection_list\", \"args\": {}}\n]\n","json",[190,263,264,273,335,384,416],{"__ignoreMap":227},[265,266,269],"span",{"class":267,"line":268},"line",1,[265,270,272],{"class":271},"sMK4o","[\n",[265,274,276,279,282,286,288,291,294,298,300,303,305,308,310,312,315,317,321,323,325,327,330,332],{"class":267,"line":275},2,[265,277,278],{"class":271},"  {",[265,280,281],{"class":271},"\"",[265,283,285],{"class":284},"spNyl","tool",[265,287,281],{"class":271},[265,289,290],{"class":271},":",[265,292,293],{"class":271}," \"",[265,295,297],{"class":296},"sfazB","workspace_open",[265,299,281],{"class":271},[265,301,302],{"class":271},",",[265,304,293],{"class":271},[265,306,307],{"class":284},"args",[265,309,281],{"class":271},[265,311,290],{"class":271},[265,313,314],{"class":271}," {",[265,316,281],{"class":271},[265,318,320],{"class":319},"sBMFI","path",[265,322,281],{"class":271},[265,324,290],{"class":271},[265,326,293],{"class":271},[265,328,329],{"class":296},"ws",[265,331,281],{"class":271},[265,333,334],{"class":271},"}},\n",[265,336,338,340,342,344,346,348,350,353,355,357,359,361,363,365,367,369,371,373,375,377,380,382],{"class":267,"line":337},3,[265,339,278],{"class":271},[265,341,281],{"class":271},[265,343,285],{"class":284},[265,345,281],{"class":271},[265,347,290],{"class":271},[265,349,293],{"class":271},[265,351,352],{"class":296},"import_file",[265,354,281],{"class":271},[265,356,302],{"class":271},[265,358,293],{"class":271},[265,360,307],{"class":284},[265,362,281],{"class":271},[265,364,290],{"class":271},[265,366,314],{"class":271},[265,368,281],{"class":271},[265,370,320],{"class":319},[265,372,281],{"class":271},[265,374,290],{"class":271},[265,376,293],{"class":271},[265,378,379],{"class":296},"collection.json",[265,381,281],{"class":271},[265,383,334],{"class":271},[265,385,387,389,391,393,395,397,399,401,403,405,407,409,411,413],{"class":267,"line":386},4,[265,388,278],{"class":271},[265,390,281],{"class":271},[265,392,285],{"class":284},[265,394,281],{"class":271},[265,396,290],{"class":271},[265,398,293],{"class":271},[265,400,250],{"class":296},[265,402,281],{"class":271},[265,404,302],{"class":271},[265,406,293],{"class":271},[265,408,307],{"class":284},[265,410,281],{"class":271},[265,412,290],{"class":271},[265,414,415],{"class":271}," {}}\n",[265,417,419],{"class":267,"line":418},5,[265,420,421],{"class":271},"]\n",[234,423,424,425,428,429,431],{},"Then add a ",[190,426,427],{},"snippet_generate"," step with the ids from that output. See ",[195,430,111],{"href":112}," for the argument list.",[178,433,435],{"id":434},"working-rules-short-form-agentsmd-is-the-law","Working rules (short form; AGENTS.md is the law)",[183,437,438,453,468,479,486,489],{},[186,439,440,441,444,445,448,449,452],{},"Use conventional commits (",[190,442,443],{},"feat(http): follow redirects with cookie capture",") and branch as ",[190,446,447],{},"\u003Ctype>\u002F\u003Cslug>",". Commit only green states. ",[190,450,451],{},"main"," is the integration branch.",[186,454,455,456,459,460,463,464,467],{},"Scope builds and tests to the crates you touched (",[190,457,458],{},"-p",", ",[190,461,462],{},"-j 2",", under a timeout). The full sweep is CI's job (",[190,465,466],{},"cargo xtask ci","), and CI runs it on every PR.",[186,469,470,471,476,477,244],{},"Build every feature in this order: engine API, then automation tool (with an end-to-end test), then UI. A feature without its tool is not done. See the ",[195,472,475],{"href":473,"rel":474},"https:\u002F\u002Fgithub.com\u002Fzuramai\u002Fpostguy\u002Fblob\u002Fmain\u002Fcrates\u002Fautomation\u002FREADME.md",[199],"automation README"," and ",[195,478,157],{"href":158},[186,480,481,482,485],{},"Keep tests hermetic. Loopback servers live in ",[190,483,484],{},"postguy-testkit",". Tests never touch the internet. Fuzz findings become synthetic regression tests that you see failing first.",[186,487,488],{},"Update the parity row of the feature you touched.",[186,490,491,492,515,518,459,521,476,524,527,528,244],{},"Verify UI changes in one of these ways:",[183,493,494,500,505],{},[186,495,496,497,244],{},"Run ",[190,498,499],{},"cargo run -p postguy-ui-egui --example shot -- OUT.png dark",[186,501,496,502,244],{},[190,503,504],{},"cargo xtask screenshots",[186,506,507,508,511,512,244],{},"Launch the app with ",[190,509,510],{},"--control"," and use ",[190,513,514],{},"postguy-cli ui",[516,517],"br",{},[190,519,520],{},"click",[190,522,523],{},"key",[190,525,526],{},"type"," are not emulated. See ",[195,529,153],{"href":154},[178,531,533],{"id":532},"gates-the-ci-bundle-runs","Gates the CI bundle runs",[234,535,536,538],{},[190,537,466],{}," runs these in order:",[540,541,542,547,552,557,562,567,572],"ol",{},[186,543,544],{},[190,545,546],{},"fmt --check",[186,548,549],{},[190,550,551],{},"clippy --workspace --all-targets -D warnings",[186,553,554],{},[190,555,556],{},"test --workspace",[186,558,559],{},[190,560,561],{},"layers",[186,563,564],{},[190,565,566],{},"assets",[186,568,569],{},[190,570,571],{},"parity",[186,573,574],{},[190,575,576],{},"deny",[234,578,579,582,583,459,586,476,589,592,593,476,596,599],{},[190,580,581],{},"clippy.toml"," allows ",[190,584,585],{},"unwrap",[190,587,588],{},"expect",[190,590,591],{},"panic"," in tests. It forbids egui's ",[190,594,595],{},"checkbox",[190,597,598],{},"radio"," draw paths in favour of our widgets.",[178,601,603],{"id":602},"parallel-agents","Parallel agents",[183,605,606,613],{},[186,607,608,609,612],{},"Use a separate ",[190,610,611],{},"CARGO_TARGET_DIR"," and a separate git worktree for each agent.",[186,614,615,616,619],{},"Ad-hoc spike crates opt out of the workspace with an empty ",[190,617,618],{},"[workspace]"," table in their manifest.",[621,622,623],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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);}",{"title":227,"searchDepth":275,"depth":275,"links":625},[626,627,630,631,632],{"id":180,"depth":275,"text":181},{"id":216,"depth":275,"text":217,"children":628},[629],{"id":231,"depth":337,"text":232},{"id":434,"depth":275,"text":435},{"id":532,"depth":275,"text":533},{"id":602,"depth":275,"text":603},"Toolchain, everyday commands, working rules and the CI gates.","md",null,{},true,{"title":145,"description":633},"LXWWcmikjJrOoldH-Bllxb0ceDEnPPC96fNzExE80hI",[641,643],{"title":141,"path":142,"stem":143,"description":642,"children":-1},"The rules every change must follow, the quality gates and the CI jobs.",{"title":149,"path":150,"stem":151,"description":644,"children":-1},"The layer table, the rules that hold across crates, the workspace on disk and the measured design decisions.",1793179614372]