mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-10 06:58:59 +02:00
Point /ship at a repo with an .xcodeproj, .xcworkspace, or app-product Swift package and ask to release: the adapter runs the whole journey with ONE authorization moment (membership + pricing + in-session sign-in, decision- store persisted so repeat releases ask nothing) and one store-assets question only when assets are missing. fastlane is the single tool (produce/cert/ sigh/gym/pilot/deliver/frameit); credential vocabulary never reaches the user. The adapter carries 21 live releases' worth of paid-for Apple knowledge: the web session mints the permanent upload key itself (iris POST /v1/apiKeys; privateKey is base64-of-PEM, downloadable only at creation) so nobody ever types an app-specific password; error -22938 is Transporter asking for a key, not a user task; errors are CLASSIFIED before credentials are touched (validation/UnexpectedResponse = metadata, incl. Apple's expanded age-rating attributes); pricing goes through POST /v1/appPriceSchedules because fastlane's price_tier is broken against the current API; and store distribution NEVER routes through the branch gate — a clean tree on main is the solo shipper's normal case (Step 0.9 loads the adapter BEFORE the gate, pinned by test with the non-Apple gate byte-unchanged and unique). Uploads/submissions follow an idempotency-log contract (inspect App Store Connect before any re-run). Non-Mac hosts get the honest split: build legs via a macOS CI runner with the minted key as a secret, API legs local. Browser use inside the journey is banned except the named paid-app banking/tax residue. Redaction dry-run clean. Ship's parity ratio raised 1.12 -> 1.22 deliberately: the 14.8KB section is on-demand (Apple store targets only), one manifest line otherwise. Ported from time-attack/gstack (GStack 2), refined across its 21 live releases; architecture adaptation (carved section, decision-store paths, idempotency log, third-party-actions handoff) ours. Co-authored-by: Sina Matian <sina@time-attack.dev> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
63 lines
2.4 KiB
JSON
63 lines
2.4 KiB
JSON
{
|
|
"$schema": "https://gstack.dev/schemas/section-manifest.json",
|
|
"skill": "ship",
|
|
"version": 1,
|
|
"note": "PASSIVE registry (v2 plan T9 / CM2). Fields are IDs, file paths, human titles, and human-readable trigger text ONLY. The skeleton's decision-tree prose is the ONLY place that decides WHEN to read a section; required-reads live in the E2E fixtures. No machine predicate here \u2014 see docs/designs/v2_PLAN.md:663.",
|
|
"sections": [
|
|
{
|
|
"id": "apple-release",
|
|
"file": "apple-release.md",
|
|
"title": "Apple App Store / TestFlight release adapter",
|
|
"trigger": "the ship target is an Apple platform app (.xcodeproj, .xcworkspace, or an app-product Swift package) \u2014 read BEFORE Step 1's branch gate and any preflight; store distribution never routes through the branch/PR ceremony"
|
|
},
|
|
{
|
|
"id": "tests",
|
|
"file": "tests.md",
|
|
"title": "Test bootstrap, run, triage + eval suites",
|
|
"trigger": "running the test suites and (if prompt files changed) the eval suites (Steps 4-6)"
|
|
},
|
|
{
|
|
"id": "test-coverage",
|
|
"file": "test-coverage.md",
|
|
"title": "Test coverage audit (subagent)",
|
|
"trigger": "auditing test coverage of the diff (Step 7)"
|
|
},
|
|
{
|
|
"id": "plan-completion",
|
|
"file": "plan-completion.md",
|
|
"title": "Plan completion + verification audit (subagent)",
|
|
"trigger": "auditing plan completion, verification, and scope drift (Step 8)"
|
|
},
|
|
{
|
|
"id": "review-army",
|
|
"file": "review-army.md",
|
|
"title": "Pre-landing review + specialist army",
|
|
"trigger": "the pre-landing review and specialist dispatch (Step 9)"
|
|
},
|
|
{
|
|
"id": "greptile",
|
|
"file": "greptile.md",
|
|
"title": "Address Greptile review comments",
|
|
"trigger": "addressing Greptile review comments when a PR exists (Step 10)"
|
|
},
|
|
{
|
|
"id": "adversarial",
|
|
"file": "adversarial.md",
|
|
"title": "Adversarial review + learnings refresh",
|
|
"trigger": "the adversarial review and learnings capture (Step 11)"
|
|
},
|
|
{
|
|
"id": "changelog",
|
|
"file": "changelog.md",
|
|
"title": "CHANGELOG entry (release-summary + itemized)",
|
|
"trigger": "writing the CHANGELOG entry (Step 13)"
|
|
},
|
|
{
|
|
"id": "pr-body",
|
|
"file": "pr-body.md",
|
|
"title": "Documentation sync + PR/MR creation",
|
|
"trigger": "syncing docs and creating or updating the PR/MR (Steps 18-19)"
|
|
}
|
|
]
|
|
}
|