- Scripts/release.sh archives and uploads the macOS app via the appstore-publish skill's API-driven pipeline (xcodebuild + App Store Connect key, no fastlane); ExportOptions-macOS.plist adapts the skill's iOS-centric export options for generic/platform=macOS. Scripts/metadata/ drafts the listing from the README. Canonical asc-*.swift scripts are referenced in place from indie-skills, matching Weight/HIIT. - Replace the all-rights-reserved LICENSE.md with the portfolio-standard ISC license (REVIEW2 D2b), preserving the existing copyright year/holder. - Add an IceGlassTests target (project.yml) with a real smoke test suite covering GameState's progression-rank ordering and polling-interval mapping — logic MainService relies on to reject stale API regressions.
3.4 KiB
App Store metadata
Local source-of-truth for the IceGlass (macOS) App Store listing. The
appstore-publish skill's asc-metadata.swift (invoked in place from
../indie-skills) reads this folder and pushes it to App Store Connect via
the API; only files that are present get pushed. Then asc-submit.swift
attaches the build and submits.
set -a; source .env.release; set +a; swift ../indie-skills/skills/appstore-publish/scripts/asc-metadata.swift --bundle dev.rzen.indie.IceGlass --version X.Y.Z --dry-run # preview
set -a; source .env.release; set +a; swift ../indie-skills/skills/appstore-publish/scripts/asc-metadata.swift --bundle dev.rzen.indie.IceGlass --version X.Y.Z # push
set -a; source .env.release; set +a; swift ../indie-skills/skills/appstore-publish/scripts/asc-submit.swift --bundle dev.rzen.indie.IceGlass --version X.Y.Z --submit # submit
Note: this metadata set is for the macOS app record only. IceGlass
also ships an iOS companion (IceGlass-iOS, bundle ID
dev.rzen.indie.IceGlass.iOS) that isn't wired into the release pipeline
yet — when it's ready to publish, give it its own App Store Connect app
record and its own sibling metadata directory (e.g. Scripts/metadata-ios/),
since asc-metadata.swift currently queries the IOS platform filter when
looking up versions, not MAC_OS.
Layout & character limits
| File | Field | Limit | API resource |
|---|---|---|---|
app/<locale>/name.txt |
App name | 30 | appInfoLocalizations |
app/<locale>/subtitle.txt |
Subtitle | 30 | appInfoLocalizations |
app/<locale>/privacy_url.txt |
Privacy policy URL | — | appInfoLocalizations |
app/categories.json |
Categories | — | appInfos |
version/<locale>/description.txt |
Description | 4000 | appStoreVersionLocalizations |
version/<locale>/keywords.txt |
Keywords (comma-sep) | 100 | appStoreVersionLocalizations |
version/<locale>/promotional_text.txt |
Promotional text | 170 | appStoreVersionLocalizations |
version/<locale>/whats_new.txt |
What's New | 4000 | appStoreVersionLocalizations |
version/<locale>/support_url.txt |
Support URL | — | appStoreVersionLocalizations |
version/review.json |
Review contact / demo / notes | — | appStoreReviewDetails |
screenshots/<locale>/<DISPLAY_TYPE>/*.png |
Screenshots | — | appScreenshotSets |
name + subtitle are app-level; description + keywords are
version-level. whats_new.txt only applies after the first version —
leave it out for 1.0. No whats_new.txt or screenshots/ are checked in
yet — screenshots still need to be captured (see the appstore-publish
skill's "Step 3 — Screenshots" for the simulator-capture recipe; macOS
screenshots are plain screencapture/window captures at the App Store's
required pixel sizes, not simulator grabs).
Screenshot display types (macOS)
Common types: APP_DESKTOP (1280×800 or larger, 16:10). One folder per
device class; filenames sort the order. The local set is authoritative —
re-running replaces the remote set for any display type you provide.
Not handled here (separate resource families)
Age rating (ageRatingDeclarations), pricing/availability
(appPriceSchedules / appAvailabilities), and App Privacy labels
(appDataUsages). asc-submit.swift --submit (see the appstore-publish
skill) reports any of these that block the submission.