Auf App Platform veröffentlichen
Ablauf: Im Sandbox bauen und testen → bereitstellbar machen → Plan vorschlagen und Zustimmung einholen → auf GitHub pushen → App Platform App erstellen → auf ACTIVE warten → URL überprüfen.
Erstelle niemals ein Repository, führe keinen Push durch und erstelle/aktualisiere/lösche keine App, bevor der Benutzer den Plan in Schritt 2 genehmigt hat. Eine Anfrage wie „Veröffentliche es“ ist nicht diese Genehmigung. Bauen und Testen im Sandbox benötigt keine Genehmigung.
Verwende niemals die apps-Aktion publish, docker oder doctl – keines davon funktioniert auf diesem Computer. Alles läuft über zwei gemeinsame Credentials, die du über den Credential-Broker des Kerns aufrufst. Du siehst niemals die Tokens.
Verwende eine explizite sandbox_id für jeden Befehl und wähle das Credential in execute.credentials für jeden Befehl, der den Broker aufruft (digitalocean, github oder github-git). Der Kern stellt AGENT_CREDENTIAL_TOKEN nur für diese Befehle bereit. Verwende nicht rm -rf; erstelle stattdessen ein neues Verzeichnis mit mktemp -d.
Was der Computer hat
Node 24 + npm, Python 3.12 + pip, git, gh (nicht eingeloggt; nicht verwenden), curl, gcc, make. Kein docker, doctl, jq, wget, unzip. JSON mit node -e oder python3 -c parsen.
Credentials (was jedes kann)
| Credential | Host | Erlaubt |
|---|---|---|
digitalocean | api.digitalocean.com | GET/POST/PUT/DELETE unter /v2/apps und /v2/regions |
github | api.github.com | GET/POST/PATCH unter /user und /repos/jnaidu-do |
github-git | github.com (git push/clone) | GET/POST unter /jnaidu-do/ |
Alles wird unter dem gemeinsamen GitHub-Konto jnaidu-do erstellt (ein deploymentsweites Credential, nicht das eigene des Benutzers). Sag dies im Plan. Wenn der Benutzer sein eigenes Konto möchte, teile ihm mit, dass dies noch nicht eingerichtet ist. Ein 403 path_not_allowed / method_not_allowed bedeutet, dass die Anfrage außerhalb dieses Bereichs liegt – versuche keine Variationen; teile dem Benutzer mit, dass es nicht erlaubt ist.
Broker-Helfer
Füge dies einmal pro Befehl ein (Shell-Zustand bleibt nicht erhalten). Es gibt den HTTP-Status nach stderr und den Antworttext nach stdout aus:
bk() { # bk <credential> <METHODE> <url> [json-body]
p=$(node -e 'const [c,m,u,b]=process.argv.slice(1);console.log(JSON.stringify({credential:c,method:m,url:u,headers:{accept: