You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Make a Stacks desktop app publishable to the Mac App Store through Buddy and a reusable GitHub Actions workflow. The repeatable path should be automated from a clean macOS runner; account enrollment, legal agreements, and one-time secret creation remain explicit human steps.
buddy build:desktop currently emits a launcher, craft-runtime, desktop.json, provenance, and checksums under storage/framework/desktop-dist. It does not yet produce or validate the App Store deliverable:
no .app bundle with a complete Info.plist;
no embedded Mac App Store provisioning profile;
no parent/helper App Sandbox entitlement split;
no Mac App Distribution or Mac Installer Distribution signing;
no signed installer .pkg;
no App Store Connect validation/upload command;
no reusable workflow for importing certificates and secrets;
no automated certificate/profile reconciliation through the App Store Connect API;
no universal arm64+x64 merge for a single dual-architecture Store binary;
no listing metadata, screenshots, privacy, pricing, agreements, or review submission automation.
Apple requires App Sandbox for Mac App Store distribution and supports API-key/JWT build upload automation:
Add buddy desktop:apple:doctor to check macOS/Xcode tooling, bundle metadata, certificate identities, profile presence, API credentials, and Craft compatibility without mutating Apple or GitHub state.
Add buddy desktop:apple:init to generate a documented reusable-workflow caller without overwriting an existing workflow.
Add buddy desktop:apple:package to build the desktop payload, create a valid .app, embed the profile, sign the helper/runtime before the parent app, produce a signed installer .pkg, verify signatures and entitlements, and write provenance/checksums.
Add buddy desktop:apple:publish with package-only, --validate-only, and upload modes using App Store Connect API key auth.
Derive app name/version from the project and require explicit bundle ID, team ID, signing identities, and provisioning profile.
Default entitlements to App Sandbox plus outbound network access; allow an audited app-owned entitlement file for additional capabilities.
Ensure the embedded Craft runtime inherits the parent sandbox and cannot escape it.
Add a reusable workflow_call workflow that builds Craft from an immutable revision, imports signing material into an ephemeral keychain, runs Buddy validation/package/upload, and uploads the resulting package/provenance/checksums as workflow artifacts.
Ensure every secret is passed through environment/files with restrictive permissions and is absent from logs and artifacts.
Phase 2: Apple resource reconciliation
Use the App Store Connect API where Apple exposes the resource:
Register or reconcile the explicit bundle ID and capabilities.
Create/download/rotate Mac App Distribution and Mac Installer Distribution certificates from a caller-provided CSR/private key strategy.
Create/download/refresh the Mac App Store provisioning profile.
Add buddy desktop:apple:provision --plan and --apply, with idempotent diffs and no certificate revocation unless explicitly requested.
Upload the binary with JWT authentication and poll until processing completes.
Synchronize version metadata and attach the processed build.
Add a prepare-only mode for metadata and a separate explicit App Review submission action.
Do not attempt to automate unavailable or legally sensitive actions: Developer Program enrollment, paid-app banking/tax setup, contract acceptance, export-compliance attestations requiring owner judgment, privacy answers, age rating answers, or final release policy decisions.
Phase 3: Store readiness and multi-architecture quality
Build arm64 and x64 launcher/runtime pairs from the same revisions and merge compatible Mach-O binaries with lipo into one universal app.
Goal
Make a Stacks desktop app publishable to the Mac App Store through Buddy and a reusable GitHub Actions workflow. The repeatable path should be automated from a clean macOS runner; account enrollment, legal agreements, and one-time secret creation remain explicit human steps.
Related distribution work: pantry-pm/pantry#219.
Confirmed current gaps
buddy build:desktopcurrently emits a launcher,craft-runtime,desktop.json, provenance, and checksums understorage/framework/desktop-dist. It does not yet produce or validate the App Store deliverable:.appbundle with a completeInfo.plist;.pkg;Apple requires App Sandbox for Mac App Store distribution and supports API-key/JWT build upload automation:
Phase 1: deterministic Buddy package/sign/upload path
buddy desktop:apple:doctorto check macOS/Xcode tooling, bundle metadata, certificate identities, profile presence, API credentials, and Craft compatibility without mutating Apple or GitHub state.buddy desktop:apple:initto generate a documented reusable-workflow caller without overwriting an existing workflow.buddy desktop:apple:packageto build the desktop payload, create a valid.app, embed the profile, sign the helper/runtime before the parent app, produce a signed installer.pkg, verify signatures and entitlements, and write provenance/checksums.buddy desktop:apple:publishwith package-only,--validate-only, and upload modes using App Store Connect API key auth.workflow_callworkflow that builds Craft from an immutable revision, imports signing material into an ephemeral keychain, runs Buddy validation/package/upload, and uploads the resulting package/provenance/checksums as workflow artifacts.Phase 2: Apple resource reconciliation
Use the App Store Connect API where Apple exposes the resource:
buddy desktop:apple:provision --planand--apply, with idempotent diffs and no certificate revocation unless explicitly requested.Do not attempt to automate unavailable or legally sensitive actions: Developer Program enrollment, paid-app banking/tax setup, contract acceptance, export-compliance attestations requiring owner judgment, privacy answers, age rating answers, or final release policy decisions.
Phase 3: Store readiness and multi-architecture quality
lipointo one universal app.codesign -d --entitlements :-.Required secrets and variables
Secrets:
APPLE_APP_CERTIFICATE_BASE64APPLE_INSTALLER_CERTIFICATE_BASE64APPLE_CERTIFICATE_PASSWORDAPPLE_PROVISIONING_PROFILE_BASE64APP_STORE_CONNECT_API_KEYAPP_STORE_CONNECT_API_KEY_IDAPP_STORE_CONNECT_API_ISSUER_IDVariables/inputs:
Tests and evidence
pendingonly after signed validation artifacts exist.Acceptance criteria
.pkgfrom a clean pinned runner.