[{"data":1,"prerenderedAt":1430},["ShallowReactive",2],{"navigation":3,"\u002Finstallation\u002Finstaller":194,"\u002Finstallation\u002Finstaller-surround":1425},[4,18,31,64,81,102,111,132,149],{"title":5,"path":6,"stem":7,"children":8,"page":17},"Getting started","\u002Fgetting-started","1.getting-started",[9,13],{"title":10,"path":11,"stem":12},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":14,"path":15,"stem":16},"Run your first workflow","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart",false,{"title":19,"path":20,"stem":21,"children":22,"page":17},"Core concepts","\u002Fconcepts","2.concepts",[23,27],{"title":24,"path":25,"stem":26},"The platform model","\u002Fconcepts\u002Fplatform","2.concepts\u002F1.platform",{"title":28,"path":29,"stem":30},"Architecture and boundaries","\u002Fconcepts\u002Farchitecture","2.concepts\u002F2.architecture",{"title":32,"path":33,"stem":34,"children":35,"page":17},"Installation","\u002Finstallation","3.installation",[36,40,44,48,52,56,60],{"title":37,"path":38,"stem":39},"Overview and requirements","\u002Finstallation\u002Foverview","3.installation\u002F1.overview",{"title":41,"path":42,"stem":43},"Local evaluation","\u002Finstallation\u002Flocal-evaluation","3.installation\u002F2.local-evaluation",{"title":45,"path":46,"stem":47},"Install the server","\u002Finstallation\u002Fserver","3.installation\u002F3.server",{"title":49,"path":50,"stem":51},"Install a runner","\u002Finstallation\u002Frunner","3.installation\u002F4.runner",{"title":53,"path":54,"stem":55},"Verify the installation","\u002Finstallation\u002Fverification","3.installation\u002F5.verification",{"title":57,"path":58,"stem":59},"Upgrade the platform","\u002Finstallation\u002Fupgrades","3.installation\u002F6.upgrades",{"title":61,"path":62,"stem":63},"Guided installer","\u002Finstallation\u002Finstaller","3.installation\u002F7.installer",{"title":65,"path":66,"stem":67,"children":68,"page":17},"Build workflows","\u002Fworkflows","4.workflows",[69,73,77],{"title":70,"path":71,"stem":72},"Build a Definition","\u002Fworkflows\u002Fdefinitions","4.workflows\u002F0.definitions",{"title":74,"path":75,"stem":76},"Deploy and run workflows","\u002Fworkflows\u002Fruns","4.workflows\u002F1.runs",{"title":78,"path":79,"stem":80},"Inputs, context, and secrets","\u002Fworkflows\u002Finputs-and-secrets","4.workflows\u002F2.inputs-and-secrets",{"title":82,"path":83,"stem":84,"children":85,"page":17},"Run and recover","\u002Foperations","5.operations",[86,90,94,98],{"title":87,"path":88,"stem":89},"Monitor Runs","\u002Foperations\u002Fmonitoring","5.operations\u002F1.monitoring",{"title":91,"path":92,"stem":93},"Approve prepared steps","\u002Foperations\u002Fapprovals","5.operations\u002F2.approvals",{"title":95,"path":96,"stem":97},"Recover or cancel execution","\u002Foperations\u002Frecovery","5.operations\u002F3.recovery",{"title":99,"path":100,"stem":101},"Troubleshooting","\u002Foperations\u002Ftroubleshooting","5.operations\u002F4.troubleshooting",{"title":103,"path":104,"stem":105,"children":106,"page":17},"Action catalog","\u002Fcatalog","6.catalog",[107],{"title":108,"path":109,"stem":110},"Find and use Actions","\u002Fcatalog\u002Foverview","6.catalog\u002F1.overview",{"title":112,"path":113,"stem":114,"children":115,"page":17},"Administration","\u002Fadministration","7.administration",[116,120,124,128],{"title":117,"path":118,"stem":119},"Registries and Environments","\u002Fadministration\u002Fenvironments","7.administration\u002F2.environments",{"title":121,"path":122,"stem":123},"Manage runners","\u002Fadministration\u002Frunners","7.administration\u002F3.runners",{"title":125,"path":126,"stem":127},"Access and approval policies","\u002Fadministration\u002Faccess","7.administration\u002F4.access",{"title":129,"path":130,"stem":131},"Backups and upgrades","\u002Fadministration\u002Fmaintenance","7.administration\u002F5.maintenance",{"title":133,"path":134,"stem":135,"children":136,"page":17},"Develop Actions","\u002Factions","8.actions",[137,141,145],{"title":138,"path":139,"stem":140},"Build your first Action","\u002Factions\u002Fquickstart","8.actions\u002F1.quickstart",{"title":142,"path":143,"stem":144},"Local development","\u002Factions\u002Flocal-development","8.actions\u002F2.local-development",{"title":146,"path":147,"stem":148},"Publish an Action","\u002Factions\u002Fpublishing","8.actions\u002F3.publishing",{"title":150,"path":151,"stem":152,"children":153,"page":17},"Reference","\u002Freference","9.reference",[154,158,162,166,170,174,178,182,186,190],{"title":155,"path":156,"stem":157},"Operator CLI","\u002Freference\u002Foperator-cli","9.reference\u002F1.operator-cli",{"title":159,"path":160,"stem":161},"Installer CLI","\u002Freference\u002Finstaller-cli","9.reference\u002F10.installer-cli",{"title":163,"path":164,"stem":165},"Definition syntax","\u002Freference\u002Fdefinition","9.reference\u002F2.definition",{"title":167,"path":168,"stem":169},"CLI configuration","\u002Freference\u002Fconfiguration","9.reference\u002F3.configuration",{"title":171,"path":172,"stem":173},"API integration","\u002Freference\u002Fapi","9.reference\u002F4.api",{"title":175,"path":176,"stem":177},"Action CLI","\u002Freference\u002Faction-cli","9.reference\u002F5.action-cli",{"title":179,"path":180,"stem":181},"Action SDK","\u002Freference\u002Fsdk","9.reference\u002F6.sdk",{"title":183,"path":184,"stem":185},"Contracts and compatibility","\u002Freference\u002Fcontracts","9.reference\u002F7.contracts",{"title":187,"path":188,"stem":189},"Server configuration","\u002Freference\u002Fserver-configuration","9.reference\u002F8.server-configuration",{"title":191,"path":192,"stem":193},"Runner configuration","\u002Freference\u002Frunner-configuration","9.reference\u002F9.runner-configuration",{"id":195,"title":61,"body":196,"description":1419,"extension":1420,"meta":1421,"navigation":1422,"path":62,"seo":1423,"stem":63,"__hash__":1424},"docs\u002F3.installation\u002F7.installer.md",{"type":197,"value":198,"toc":1407},"minimark",[199,207,219,224,227,251,261,315,322,326,353,376,379,388,395,410,414,420,645,670,673,679,699,710,717,726,730,733,809,829,836,857,860,864,874,1012,1019,1022,1143,1149,1160,1164,1178,1185,1205,1212,1216,1223,1226,1232,1235,1255,1262,1266,1269,1284,1287,1290,1305,1316,1319,1328,1335,1342,1346,1349,1360,1367,1371,1396,1403],[200,201,202,206],"p",{},[203,204,205],"code",{},"pyplines-installer"," reads an installation document, shows a plan, and installs its\nnamed targets. A document can contain a server, multiple runners, the operator CLI,\nand the Action development CLI. Include only what that workstation needs.",[200,208,209,210,214,215,218],{},"The installer is a ",[211,212,213],"strong",{},"tooling"," package. Server and runner versions belong to the\nseparate ",[211,216,217],{},"platform"," release group. Use a tooling release that includes the YAML\ncommands described here; older releases support the compatibility commands below.",[220,221,223],"h2",{"id":222},"prepare-the-workstation","Prepare the workstation",[200,225,226],{},"Install the installer with Python 3.12+ in a virtual environment or using pipx:",[228,229,235],"pre",{"className":230,"code":231,"filename":232,"language":233,"meta":234,"style":234},"language-sh shiki shiki-themes pyplines-light pyplines-light pyplines-dark","python3 -m venv ~\u002F.venvs\u002Fpyplines-installer\n~\u002F.venvs\u002Fpyplines-installer\u002Fbin\u002Fpython -m pip install \"pyplines-installer==$TOOLING_VERSION\"\n","Terminal","sh","",[203,236,237,245],{"__ignoreMap":234},[238,239,242],"span",{"class":240,"line":241},"line",1,[238,243,244],{},"python3 -m venv ~\u002F.venvs\u002Fpyplines-installer\n",[238,246,248],{"class":240,"line":247},2,[238,249,250],{},"~\u002F.venvs\u002Fpyplines-installer\u002Fbin\u002Fpython -m pip install \"pyplines-installer==$TOOLING_VERSION\"\n",[200,252,253,254,256,257,260],{},"The following commands assume ",[203,255,205],{}," is on your ",[203,258,259],{},"PATH",".",[262,263,264,277],"table",{},[265,266,267],"thead",{},[268,269,270,274],"tr",{},[271,272,273],"th",{},"Target",[271,275,276],{},"Additional prerequisites",[278,279,280,295,305],"tbody",{},[268,281,282,292],{},[283,284,285,288,289],"td",{},[203,286,287],{},"pyplines-server",", ",[203,290,291],{},"pyplines-runner",[283,293,294],{},"Linux with rootful Docker Engine, or macOS with Docker Desktop; Linux amd64\u002Farm64 daemon, Engine 26+, Compose 2.24+",[268,296,297,302],{},[283,298,299],{},[203,300,301],{},"pyplines-action",[283,303,304],{},"Linux\u002FmacOS amd64\u002Farm64; HTTPS access to GitHub release assets",[268,306,307,312],{},[283,308,309],{},[203,310,311],{},"pyplines-cli",[283,313,314],{},"Linux\u002FmacOS; Python with venv\u002Fpip support and access to its Python package index",[200,316,317,318,321],{},"Installing CLI targets does not require Docker. Authoring Actions requires the\nadditional tools in ",[319,320,138],"a",{"href":139},".\nThe installer does not install Docker or change host firewall rules. Windows,\nremote Docker daemons, rootless engines, and alternative macOS VM providers are\noutside the supported service configuration.",[220,323,325],{"id":324},"create-and-review-a-configuration","Create and review a configuration",[228,327,329],{"className":230,"code":328,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer init\npyplines-installer validate\npyplines-installer run --dry-run\npyplines-installer run\n",[203,330,331,336,341,347],{"__ignoreMap":234},[238,332,333],{"class":240,"line":241},[238,334,335],{},"pyplines-installer init\n",[238,337,338],{"class":240,"line":247},[238,339,340],{},"pyplines-installer validate\n",[238,342,344],{"class":240,"line":343},3,[238,345,346],{},"pyplines-installer run --dry-run\n",[238,348,350],{"class":240,"line":349},4,[238,351,352],{},"pyplines-installer run\n",[200,354,355,358,359,288,362,288,365,288,368,371,372,375],{},[203,356,357],{},"init"," begins with your goal: local development, a server, a runner, Action tools,\nor a custom combination. It offers ",[203,360,361],{},"local",[203,363,364],{},"server",[203,366,367],{},"runner",[203,369,370],{},"action",", and\n",[203,373,374],{},"custom"," presets. Local setup includes the operator CLI and optionally Action tools. It writes YAML and\nnever installs resources or overwrites an existing file. The server and runner\npresets contain endpoint and TLS settings to review before running them.",[200,377,378],{},"For automation or a source checkout, specify the preset and published versions:",[228,380,382],{"className":230,"code":381,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer init --preset local --output development.yml --platform-version \"$PLATFORM_VERSION\" --tooling-version \"$TOOLING_VERSION\"\n",[203,383,384],{"__ignoreMap":234},[238,385,386],{"class":240,"line":241},[238,387,381],{},[200,389,390,391,394],{},"Released installers default tooling targets to their own version. Development\ninstallers require an explicit published tooling version. Service presets use the\npackaged supported platform version unless overridden. The generated YAML records\nexplicit versions; running it does not select a mutable ",[203,392,393],{},"latest"," release.",[200,396,397,398,401,402,405,406,409],{},"Commands default to ",[203,399,400],{},"installation.yml"," in the current directory. An explicit file\npath remains supported. ",[203,403,404],{},"run"," checks prerequisites, shows component destinations,\nand collects known required credentials before creating resources. New administrator\npasswords are confirmed. Progress identifies the current component and operation;\npassword prompts pause the live display. Completion prints trust\u002Flogin commands\nand any required PATH setup. Unattended ",[203,407,408],{},"--yes"," runs require credential references\nand never wait for terminal input.",[220,411,413],{"id":412},"local-development-on-linux-or-macos","Local development on Linux or macOS",[200,415,416,417,419],{},"A local installation includes development TLS, a private service network, and one\nor more runners enrolled in pool ",[203,418,361],{},":",[228,421,426],{"className":422,"code":423,"filename":424,"language":425,"meta":234,"style":234},"language-yaml shiki shiki-themes pyplines-light pyplines-light pyplines-dark","apiVersion: pyplines.installer\u002Fv1\nname: development\nstate_directory: .\u002Fdevelopment-state\nprofile: local\nversions:\n  platform: 2026.10.1rc17\n  tooling: 2026.10.3rc2\ncredentials:\n  administrator_password:\n    env: PYPLINES_ADMIN_PASSWORD\ntargets:\n  server:\n    component: pyplines-server\n    api_port: 8443\n    nats_port: 4222\n  runner:\n    component: pyplines-runner\n    server:\n      target: server\n  operator:\n    component: pyplines-cli\n    directory: ~\u002F.local\u002Fbin\n","development.yml","yaml",[203,427,428,441,451,461,471,480,491,502,510,518,529,537,545,556,568,579,587,597,605,616,624,634],{"__ignoreMap":234},[238,429,430,434,437],{"class":240,"line":241},[238,431,433],{"class":432},"smnRP","apiVersion",[238,435,419],{"class":436},"sgMYo",[238,438,440],{"class":439},"sfDcV"," pyplines.installer\u002Fv1\n",[238,442,443,446,448],{"class":240,"line":247},[238,444,445],{"class":432},"name",[238,447,419],{"class":436},[238,449,450],{"class":439}," development\n",[238,452,453,456,458],{"class":240,"line":343},[238,454,455],{"class":432},"state_directory",[238,457,419],{"class":436},[238,459,460],{"class":439}," .\u002Fdevelopment-state\n",[238,462,463,466,468],{"class":240,"line":349},[238,464,465],{"class":432},"profile",[238,467,419],{"class":436},[238,469,470],{"class":439}," local\n",[238,472,474,477],{"class":240,"line":473},5,[238,475,476],{"class":432},"versions",[238,478,479],{"class":436},":\n",[238,481,483,486,488],{"class":240,"line":482},6,[238,484,485],{"class":432},"  platform",[238,487,419],{"class":436},[238,489,490],{"class":439}," 2026.10.1rc17\n",[238,492,494,497,499],{"class":240,"line":493},7,[238,495,496],{"class":432},"  tooling",[238,498,419],{"class":436},[238,500,501],{"class":439}," 2026.10.3rc2\n",[238,503,505,508],{"class":240,"line":504},8,[238,506,507],{"class":432},"credentials",[238,509,479],{"class":436},[238,511,513,516],{"class":240,"line":512},9,[238,514,515],{"class":432},"  administrator_password",[238,517,479],{"class":436},[238,519,521,524,526],{"class":240,"line":520},10,[238,522,523],{"class":432},"    env",[238,525,419],{"class":436},[238,527,528],{"class":439}," PYPLINES_ADMIN_PASSWORD\n",[238,530,532,535],{"class":240,"line":531},11,[238,533,534],{"class":432},"targets",[238,536,479],{"class":436},[238,538,540,543],{"class":240,"line":539},12,[238,541,542],{"class":432},"  server",[238,544,479],{"class":436},[238,546,548,551,553],{"class":240,"line":547},13,[238,549,550],{"class":432},"    component",[238,552,419],{"class":436},[238,554,555],{"class":439}," pyplines-server\n",[238,557,559,562,564],{"class":240,"line":558},14,[238,560,561],{"class":432},"    api_port",[238,563,419],{"class":436},[238,565,567],{"class":566},"sFGQw"," 8443\n",[238,569,571,574,576],{"class":240,"line":570},15,[238,572,573],{"class":432},"    nats_port",[238,575,419],{"class":436},[238,577,578],{"class":566}," 4222\n",[238,580,582,585],{"class":240,"line":581},16,[238,583,584],{"class":432},"  runner",[238,586,479],{"class":436},[238,588,590,592,594],{"class":240,"line":589},17,[238,591,550],{"class":432},[238,593,419],{"class":436},[238,595,596],{"class":439}," pyplines-runner\n",[238,598,600,603],{"class":240,"line":599},18,[238,601,602],{"class":432},"    server",[238,604,479],{"class":436},[238,606,608,611,613],{"class":240,"line":607},19,[238,609,610],{"class":432},"      target",[238,612,419],{"class":436},[238,614,615],{"class":439}," server\n",[238,617,619,622],{"class":240,"line":618},20,[238,620,621],{"class":432},"  operator",[238,623,479],{"class":436},[238,625,627,629,631],{"class":240,"line":626},21,[238,628,550],{"class":432},[238,630,419],{"class":436},[238,632,633],{"class":439}," pyplines-cli\n",[238,635,637,640,642],{"class":240,"line":636},22,[238,638,639],{"class":432},"    directory",[238,641,419],{"class":436},[238,643,644],{"class":439}," ~\u002F.local\u002Fbin\n",[200,646,647,648,650,651,653,654,657,658,661,662,665,666,669],{},"Replace the example versions with the selected published releases. ",[203,649,364],{},",\n",[203,652,367],{},", and ",[203,655,656],{},"operator"," are instance names; ",[203,659,660],{},"component"," selects their installer.\nA second runner can use another name and reference the same server. Additional\nlocal servers need distinct ",[203,663,664],{},"api_port"," and ",[203,667,668],{},"nats_port"," values.",[200,671,672],{},"The local profile generates a development CA and server certificate valid for one\nyear. Its CA signing key is discarded after issuance. It publishes HTTPS and NATS\non host loopback and connects containers using their own network addresses. It\ncreates a short-lived single-use enrollment and approves only the runner identity\nretained by the selected target. Remote-server runner targets retain the separate\noperator approval flow.",[200,674,675,676,678],{},"Interactive ",[203,677,404],{}," asks for confirmation and prompts for required credentials when\nthey are unavailable. Use the same administrator password when resuming setup.\nOnce bootstrap and local runner approval are complete, retries need no password.\nFor unattended operation, supply the referenced credential and use:",[228,680,682],{"className":230,"code":681,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer run development.yml --yes\npyplines-installer status development.yml\npyplines-installer doctor development.yml\n",[203,683,684,689,694],{"__ignoreMap":234},[238,685,686],{"class":240,"line":241},[238,687,688],{},"pyplines-installer run development.yml --yes\n",[238,690,691],{"class":240,"line":247},[238,692,693],{},"pyplines-installer status development.yml\n",[238,695,696],{"class":240,"line":343},[238,697,698],{},"pyplines-installer doctor development.yml\n",[200,700,701,702,705,706,709],{},"After installation, the result prints the exact operator executable, CA\nconfiguration command, and login command. Enter the administrator password from\nsetup. For this example, trust configuration points to\n",[203,703,704],{},"development-state\u002Ftls\u002Fserver\u002Fca.crt",". No system or browser trust store is changed.\nA pre-existing ",[203,707,708],{},"PYPLINES_CA_FILE"," overrides the CLI's saved CA setting.",[200,711,712,713,716],{},"The operator CLI is installed into a private, versioned Python environment below\nthe state directory. Its executable link is placed in the requested directory;\nan existing unmanaged ",[203,714,715],{},"pyplines"," command is not overwritten. Follow the printed\nPATH instructions or use the displayed absolute executable path.",[200,718,719,720,722,723,725],{},"Readiness does not configure a registry or an Environment. Continue with\n",[319,721,53],{"href":54},", selecting pool ",[203,724,361],{}," for\nthis profile. Local host ports and container-only advertised NATS make this a\nworkstation deployment; use explicit endpoints for shared installations.",[220,727,729],{"id":728},"install-the-action-development-cli","Install the Action development CLI",[200,731,732],{},"An Action-only document does not need a platform version or Docker prerequisite:",[228,734,737],{"className":422,"code":735,"filename":736,"language":425,"meta":234,"style":234},"apiVersion: pyplines.installer\u002Fv1\nname: action-development\nstate_directory: .\u002F.action-installer\nversions:\n  tooling: 2026.10.3rc2\ntargets:\n  action:\n    component: pyplines-action\n    directory: ~\u002F.local\u002Fbin\n","action-tools.yml",[203,738,739,747,756,765,771,779,785,792,801],{"__ignoreMap":234},[238,740,741,743,745],{"class":240,"line":241},[238,742,433],{"class":432},[238,744,419],{"class":436},[238,746,440],{"class":439},[238,748,749,751,753],{"class":240,"line":247},[238,750,445],{"class":432},[238,752,419],{"class":436},[238,754,755],{"class":439}," action-development\n",[238,757,758,760,762],{"class":240,"line":343},[238,759,455],{"class":432},[238,761,419],{"class":436},[238,763,764],{"class":439}," .\u002F.action-installer\n",[238,766,767,769],{"class":240,"line":349},[238,768,476],{"class":432},[238,770,479],{"class":436},[238,772,773,775,777],{"class":240,"line":473},[238,774,496],{"class":432},[238,776,419],{"class":436},[238,778,501],{"class":439},[238,780,781,783],{"class":240,"line":482},[238,782,534],{"class":432},[238,784,479],{"class":436},[238,786,787,790],{"class":240,"line":493},[238,788,789],{"class":432},"  action",[238,791,479],{"class":436},[238,793,794,796,798],{"class":240,"line":504},[238,795,550],{"class":432},[238,797,419],{"class":436},[238,799,800],{"class":439}," pyplines-action\n",[238,802,803,805,807],{"class":240,"line":512},[238,804,639],{"class":432},[238,806,419],{"class":436},[238,808,644],{"class":439},[228,810,812],{"className":230,"code":811,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer run action-tools.yml --dry-run\npyplines-installer run action-tools.yml\npyplines-action version\n",[203,813,814,819,824],{"__ignoreMap":234},[238,815,816],{"class":240,"line":241},[238,817,818],{},"pyplines-installer run action-tools.yml --dry-run\n",[238,820,821],{"class":240,"line":247},[238,822,823],{},"pyplines-installer run action-tools.yml\n",[238,825,826],{"class":240,"line":343},[238,827,828],{},"pyplines-action version\n",[200,830,831,832,835],{},"The installer downloads the native Linux\u002FmacOS binary and ",[203,833,834],{},"SHA256SUMS"," directly\nusing Python HTTPS. Neither GitHub CLI nor curl is required. It verifies the\nchecksum and reported version before atomic installation. Failed verification\npreserves the previous executable. Destination symlinks are rejected so another\npackage manager's installation is not overwritten.",[200,837,838,839,842,843,846,847,850,851,260],{},"Public assets can be downloaded anonymously. For private assets, supply\n",[203,840,841],{},"PYPLINES_GITHUB_TOKEN"," or ",[203,844,845],{},"GITHUB_TOKEN"," through your environment, or configure a\n",[203,848,849],{},"github_token"," credential reference. The token needs repository access and\nContents: read for fine-grained tokens. Authorization is not forwarded to a\nrelease asset host after a redirect. See the\n",[319,852,856],{"href":853,"rel":854},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frest\u002Freleases\u002Fassets",[855],"nofollow","GitHub release asset API",[200,858,859],{},"A successful, unchanged target is verified and reused without another download.\nThe result reports the installed path and any PATH setup needed. Shell startup\nfiles are not edited automatically.",[220,861,863],{"id":862},"explicit-server-and-runner-installations","Explicit server and runner installations",[200,865,866,867,869,870,873],{},"Omit ",[203,868,465],{}," or use ",[203,871,872],{},"profile: explicit"," to supply your own TLS and endpoints:",[228,875,878],{"className":422,"code":876,"filename":877,"language":425,"meta":234,"style":234},"apiVersion: pyplines.installer\u002Fv1\nname: operations\nstate_directory: .\u002Foperations-state\nversions:\n  platform: 2026.10.1rc17\ncredentials:\n  administrator_password:\n    file: .\u002Fcredentials\u002Fadmin-password\ntargets:\n  server:\n    component: pyplines-server\n    server_url: https:\u002F\u002Fpyplines.example.com:8443\n    nats_url: tls:\u002F\u002Fpyplines.example.com:4222\n    certificate: .\u002Ftls\u002Fserver.crt\n    private_key: .\u002Ftls\u002Fserver.key\n    ca_file: .\u002Ftls\u002Fca.crt\n","server.yml",[203,879,880,888,897,906,912,920,926,932,942,948,954,962,972,982,992,1002],{"__ignoreMap":234},[238,881,882,884,886],{"class":240,"line":241},[238,883,433],{"class":432},[238,885,419],{"class":436},[238,887,440],{"class":439},[238,889,890,892,894],{"class":240,"line":247},[238,891,445],{"class":432},[238,893,419],{"class":436},[238,895,896],{"class":439}," operations\n",[238,898,899,901,903],{"class":240,"line":343},[238,900,455],{"class":432},[238,902,419],{"class":436},[238,904,905],{"class":439}," .\u002Foperations-state\n",[238,907,908,910],{"class":240,"line":349},[238,909,476],{"class":432},[238,911,479],{"class":436},[238,913,914,916,918],{"class":240,"line":473},[238,915,485],{"class":432},[238,917,419],{"class":436},[238,919,490],{"class":439},[238,921,922,924],{"class":240,"line":482},[238,923,507],{"class":432},[238,925,479],{"class":436},[238,927,928,930],{"class":240,"line":493},[238,929,515],{"class":432},[238,931,479],{"class":436},[238,933,934,937,939],{"class":240,"line":504},[238,935,936],{"class":432},"    file",[238,938,419],{"class":436},[238,940,941],{"class":439}," .\u002Fcredentials\u002Fadmin-password\n",[238,943,944,946],{"class":240,"line":512},[238,945,534],{"class":432},[238,947,479],{"class":436},[238,949,950,952],{"class":240,"line":520},[238,951,542],{"class":432},[238,953,479],{"class":436},[238,955,956,958,960],{"class":240,"line":531},[238,957,550],{"class":432},[238,959,419],{"class":436},[238,961,555],{"class":439},[238,963,964,967,969],{"class":240,"line":539},[238,965,966],{"class":432},"    server_url",[238,968,419],{"class":436},[238,970,971],{"class":439}," https:\u002F\u002Fpyplines.example.com:8443\n",[238,973,974,977,979],{"class":240,"line":547},[238,975,976],{"class":432},"    nats_url",[238,978,419],{"class":436},[238,980,981],{"class":439}," tls:\u002F\u002Fpyplines.example.com:4222\n",[238,983,984,987,989],{"class":240,"line":558},[238,985,986],{"class":432},"    certificate",[238,988,419],{"class":436},[238,990,991],{"class":439}," .\u002Ftls\u002Fserver.crt\n",[238,993,994,997,999],{"class":240,"line":570},[238,995,996],{"class":432},"    private_key",[238,998,419],{"class":436},[238,1000,1001],{"class":439}," .\u002Ftls\u002Fserver.key\n",[238,1003,1004,1007,1009],{"class":240,"line":581},[238,1005,1006],{"class":432},"    ca_file",[238,1008,419],{"class":436},[238,1010,1011],{"class":439}," .\u002Ftls\u002Fca.crt\n",[200,1013,1014,1015,1018],{},"The server certificate must cover every endpoint hostname. On macOS, it must\ninclude the ",[203,1016,1017],{},"serverAuth"," Extended Key Usage. Provision DNS, certificates, and\nfirewall access before running this configuration.",[200,1020,1021],{},"A runner on another host refers to the existing server URL:",[228,1023,1026],{"className":422,"code":1024,"filename":1025,"language":425,"meta":234,"style":234},"apiVersion: pyplines.installer\u002Fv1\nname: worker\nstate_directory: .\u002Fworker-state\nversions:\n  platform: 2026.10.1rc17\ncredentials:\n  enrollment_token:\n    env: PYPLINES_ENROLLMENT_TOKEN\ntargets:\n  runner:\n    component: pyplines-runner\n    server:\n      url: https:\u002F\u002Fpyplines.example.com:8443\n    ca_file: .\u002Ftls\u002Fca.crt\n    max_concurrent: 1\n","runner.yml",[203,1027,1028,1036,1045,1054,1060,1068,1074,1081,1090,1096,1102,1110,1116,1125,1133],{"__ignoreMap":234},[238,1029,1030,1032,1034],{"class":240,"line":241},[238,1031,433],{"class":432},[238,1033,419],{"class":436},[238,1035,440],{"class":439},[238,1037,1038,1040,1042],{"class":240,"line":247},[238,1039,445],{"class":432},[238,1041,419],{"class":436},[238,1043,1044],{"class":439}," worker\n",[238,1046,1047,1049,1051],{"class":240,"line":343},[238,1048,455],{"class":432},[238,1050,419],{"class":436},[238,1052,1053],{"class":439}," .\u002Fworker-state\n",[238,1055,1056,1058],{"class":240,"line":349},[238,1057,476],{"class":432},[238,1059,479],{"class":436},[238,1061,1062,1064,1066],{"class":240,"line":473},[238,1063,485],{"class":432},[238,1065,419],{"class":436},[238,1067,490],{"class":439},[238,1069,1070,1072],{"class":240,"line":482},[238,1071,507],{"class":432},[238,1073,479],{"class":436},[238,1075,1076,1079],{"class":240,"line":493},[238,1077,1078],{"class":432},"  enrollment_token",[238,1080,479],{"class":436},[238,1082,1083,1085,1087],{"class":240,"line":504},[238,1084,523],{"class":432},[238,1086,419],{"class":436},[238,1088,1089],{"class":439}," PYPLINES_ENROLLMENT_TOKEN\n",[238,1091,1092,1094],{"class":240,"line":512},[238,1093,534],{"class":432},[238,1095,479],{"class":436},[238,1097,1098,1100],{"class":240,"line":520},[238,1099,584],{"class":432},[238,1101,479],{"class":436},[238,1103,1104,1106,1108],{"class":240,"line":531},[238,1105,550],{"class":432},[238,1107,419],{"class":436},[238,1109,596],{"class":439},[238,1111,1112,1114],{"class":240,"line":539},[238,1113,602],{"class":432},[238,1115,479],{"class":436},[238,1117,1118,1121,1123],{"class":240,"line":547},[238,1119,1120],{"class":432},"      url",[238,1122,419],{"class":436},[238,1124,971],{"class":439},[238,1126,1127,1129,1131],{"class":240,"line":558},[238,1128,1006],{"class":432},[238,1130,419],{"class":436},[238,1132,1011],{"class":439},[238,1134,1135,1138,1140],{"class":240,"line":570},[238,1136,1137],{"class":432},"    max_concurrent",[238,1139,419],{"class":436},[238,1141,1142],{"class":566}," 1\n",[200,1144,1145,1146,1148],{},"Create the enrollment credential and approve the runner following\n",[319,1147,49],{"href":50},". Pending approval is reported separately\nfrom readiness; the installer preserves the registered identity. If registration\nnever completed and the token expired, supply a new token and rerun the document.",[200,1150,1151,1152,1155,1156,1159],{},"Use ",[203,1153,1154],{},"server: {target: NAME}"," for a server in the same document. This adds a\nrequired dependency. ",[203,1157,1158],{},"depends_on: [NAME]"," expresses additional ordering, including\nwhen a target connects through an explicit URL to a service managed by the same\nfile. Deployment order follows dependencies, not the order of YAML entries.",[220,1161,1163],{"id":1162},"credentials-paths-and-target-selection","Credentials, paths, and target selection",[200,1165,1166,1167,842,1170,1173,1174,1177],{},"Credentials must be references: ",[203,1168,1169],{},"{env: VARIABLE_NAME}",[203,1171,1172],{},"{file: .\u002Fprivate-file}",".\nLiteral passwords and tokens are rejected. File credentials must be private\n(",[203,1175,1176],{},"chmod 600","), nonempty, and not symlinks. Root credentials are defaults; a target\ncan override its applicable credential. Values are resolved only when needed and\nare never written into installation state or the displayed plan.",[200,1179,1180,1181,1184],{},"All relative paths resolve against the YAML file's directory. ",[203,1182,1183],{},"~"," expands to the\ncurrent user's home. YAML aliases and duplicate keys are rejected.",[228,1186,1188],{"className":230,"code":1187,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer run development.yml --target runner --dry-run\npyplines-installer run development.yml --target runner --yes\npyplines-installer status development.yml --target runner\n",[203,1189,1190,1195,1200],{"__ignoreMap":234},[238,1191,1192],{"class":240,"line":241},[238,1193,1194],{},"pyplines-installer run development.yml --target runner --dry-run\n",[238,1196,1197],{"class":240,"line":247},[238,1198,1199],{},"pyplines-installer run development.yml --target runner --yes\n",[238,1201,1202],{"class":240,"line":343},[238,1203,1204],{},"pyplines-installer status development.yml --target runner\n",[200,1206,1207,1208,1211],{},"Selection includes required dependencies and shows them in the plan. Repeat\n",[203,1209,1210],{},"--target"," to select multiple targets. Prerequisite checks are read-only. Container\nmount probes and checks needing downloaded images are deferred until apply.",[220,1213,1215],{"id":1214},"state-retries-and-migration","State, retries, and migration",[200,1217,1218,1219,1222],{},"Keep the private state directory and the named Docker volumes. The state directory\ncontains ",[203,1220,1221],{},"installation-state.json",", per-target service files or Python environments,\nand generated TLS files. Server data and runner identities live in named volumes.",[200,1224,1225],{},"An interrupted run preserves completed targets. Failed targets are reported;\ntheir dependents are blocked while independent targets can complete. Rerun the same\nconfiguration to resume. State records image digests, binary checksums, ownership,\nand the Docker identity for service targets.",[200,1227,1228,1229,260],{},"Removing a target from YAML retains its state and resources; the plan reports it\nas retained. Changing a saved target's configuration or version is rejected in\nthis release. Create a separate tool target with a distinct destination for a new\ntooling version. Service upgrades and automatic rollback remain unsupported; follow the ",[319,1230,1231],{"href":58},"upgrade guidance",[200,1233,1234],{},"To bring an existing managed service installation under a new document, explicitly\nreference it:",[228,1236,1238],{"className":230,"code":1237,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer init --from-directory .\u002Fprevious-installation --name imported --output imported.yml\npyplines-installer run imported.yml --dry-run\npyplines-installer run imported.yml\n",[203,1239,1240,1245,1250],{"__ignoreMap":234},[238,1241,1242],{"class":240,"line":241},[238,1243,1244],{},"pyplines-installer init --from-directory .\u002Fprevious-installation --name imported --output imported.yml\n",[238,1246,1247],{"class":240,"line":247},[238,1248,1249],{},"pyplines-installer run imported.yml --dry-run\n",[238,1251,1252],{"class":240,"line":343},[238,1253,1254],{},"pyplines-installer run imported.yml\n",[200,1256,1257,1258,1261],{},"This writes ",[203,1259,1260],{},"existing_installation"," references and preserves the original\nconfiguration, directories, versions, and resource ownership. Keep the original\ndirectories, including TLS files. An existing local profile imports its server and\nrunner. Incomplete enrollment\u002Fapproval follows the explicit runner flow after\nimport. No existing installation is silently adopted.",[220,1263,1265],{"id":1264},"remove-an-installation","Remove an installation",[200,1267,1268],{},"Review the exact managed resources before cleanup:",[228,1270,1272],{"className":230,"code":1271,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer uninstall development.yml --dry-run\npyplines-installer uninstall development.yml\n",[203,1273,1274,1279],{"__ignoreMap":234},[238,1275,1276],{"class":240,"line":241},[238,1277,1278],{},"pyplines-installer uninstall development.yml --dry-run\n",[238,1280,1281],{"class":240,"line":247},[238,1282,1283],{},"pyplines-installer uninstall development.yml\n",[200,1285,1286],{},"Ordinary uninstall removes containers, owned networks, and installed CLI tools while\nretaining the database and runner identity volumes, development certificates, and\nstate. Run the original YAML again to reinstall using that retained data.",[200,1288,1289],{},"For a fresh start, purge all managed resources, including persistent data:",[228,1291,1293],{"className":230,"code":1292,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer uninstall development.yml --purge --dry-run\npyplines-installer uninstall development.yml --purge\n",[203,1294,1295,1300],{"__ignoreMap":234},[238,1296,1297],{"class":240,"line":241},[238,1298,1299],{},"pyplines-installer uninstall development.yml --purge --dry-run\n",[238,1301,1302],{"class":240,"line":247},[238,1303,1304],{},"pyplines-installer uninstall development.yml --purge\n",[200,1306,1307,1308,1311,1312,1315],{},"Purge permanently deletes the selected server database and runner identities. The\ninteractive command requires typing the installation name. For automation, review\nthe plan first, then use ",[203,1309,1310],{},"--purge --yes"," with global ",[203,1313,1314],{},"--json"," as needed.",[200,1317,1318],{},"If the YAML is missing or edited, use the recorded state directly:",[228,1320,1322],{"className":230,"code":1321,"filename":232,"language":233,"meta":234,"style":234},"pyplines-installer uninstall --directory .\u002Fdevelopment-state --purge\n",[203,1323,1324],{"__ignoreMap":234},[238,1325,1326],{"class":240,"line":241},[238,1327,1321],{},[200,1329,1330,1331,1334],{},"Cleanup includes recorded targets removed from YAML. To limit cleanup, repeat\n",[203,1332,1333],{},"--target NAME","; dependent runners must be included before removing their server.\nSaved Docker ownership and daemon identity are checked. Already missing resources\nare accepted, and an interrupted cleanup can be rerun using the same command.\nUnknown files and replaced CLI executables are retained and reported; state remains\nuntil cleanup is complete. Finish failed cleanup before attempting another install.",[200,1336,1337,1338,1341],{},"Supplied TLS\u002Fcredential files, user-authored YAML, shared networks and image caches,\nDocker, and the installer package are retained. User-created operator CLI settings\nand sessions are also outside installer cleanup. Runner registrations on external\nservers remain until an operator revokes them. Removing a complete local server\nwith ",[203,1339,1340],{},"--purge"," deletes its database, including those local registrations.",[220,1343,1345],{"id":1344},"docker-desktop-details","Docker Desktop details",[200,1347,1348],{},"The installer respects Docker context selection and records the context, Unix\nendpoint, daemon ID, and architecture. A different context or a Docker Desktop\nfactory reset is rejected before operating on saved services. Restore the original\nselection and data instead of deleting state to bypass the check.",[200,1350,1351,1352,1355,1356,1359],{},"The macOS CLI socket, usually ",[203,1353,1354],{},"~\u002F.docker\u002Frun\u002Fdocker.sock",", is separate from the\nrunner's ",[203,1357,1358],{},"\u002Fvar\u002Frun\u002Fdocker.sock"," inside the Linux VM. No Mac socket symlink is\nrequired. Service images follow daemon architecture; the native Action binary\nfollows host architecture, including Apple Silicon detected through Rosetta.",[200,1361,1362,1363,1366],{},"Keep host files in Docker Desktop's shared locations. ",[203,1364,1365],{},"container_mounts_unavailable","\nmeans a container could not read its mounted files or see its VM socket; check File\nsharing and container socket restrictions. Spaces and normal macOS symlink ancestors\nare supported, but managed service and state directories cannot themselves be symlinks.",[220,1368,1370],{"id":1369},"compatibility-commands","Compatibility commands",[200,1372,1373,288,1376,288,1379,288,1382,371,1384,1387,1388,1391,1392,1395],{},[203,1374,1375],{},"install server",[203,1377,1378],{},"install runner",[203,1380,1381],{},"install action",[203,1383,361],{},[203,1385,1386],{},"status\u002Fdoctor --directory DIR"," remain available during deprecation. They preserve\nthe original state layouts and share the component installation engines. They are\nhidden from the primary help output; use YAML for new installations. Existing\n",[203,1389,1390],{},"pyplines.installation\u002Fv1"," documents remain accepted by ",[203,1393,1394],{},"install --config FILE",".\nThe compatibility Action command also uses direct HTTPS downloads.",[200,1397,1398,1399,1402],{},"See the ",[319,1400,1401],{"href":160},"installer CLI reference"," for command options,\nendpoint semantics, and exit codes.",[1404,1405,1406],"style",{},"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 .smnRP, html code.shiki .smnRP{--shiki-light:#243247;--shiki-default:#243247;--shiki-dark:#DCE6F0}html pre.shiki code .sgMYo, html code.shiki .sgMYo{--shiki-light:#54657A;--shiki-default:#54657A;--shiki-dark:#A9B8CA}html pre.shiki code .sfDcV, html code.shiki .sfDcV{--shiki-light:#34694B;--shiki-default:#34694B;--shiki-dark:#9BC9AD}html pre.shiki code .sFGQw, html code.shiki .sFGQw{--shiki-light:#765093;--shiki-default:#765093;--shiki-dark:#CFB1E8}",{"title":234,"searchDepth":247,"depth":247,"links":1408},[1409,1410,1411,1412,1413,1414,1415,1416,1417,1418],{"id":222,"depth":247,"text":223},{"id":324,"depth":247,"text":325},{"id":412,"depth":247,"text":413},{"id":728,"depth":247,"text":729},{"id":862,"depth":247,"text":863},{"id":1162,"depth":247,"text":1163},{"id":1214,"depth":247,"text":1215},{"id":1264,"depth":247,"text":1265},{"id":1344,"depth":247,"text":1345},{"id":1369,"depth":247,"text":1370},"Configure and install Pyplines services and development tools from one YAML document.","md",{},true,{"title":61,"description":1419},"YznfCUKt8sqYd6aVLnWq5nIrd3EM6PazxhShXG0uWSg",[1426,1428],{"title":57,"path":58,"stem":59,"description":1427,"children":-1},"Replace server and runner artifacts while preserving execution state and a supported tooling combination.",{"title":70,"path":71,"stem":72,"description":1429,"children":-1},"Compose existing Actions into a portable operational workflow.",1792213697319]