Files
rzen a755cce3e2 Add App Store release pipeline, adopt ISC license, add unit test target
- 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.
2026-07-05 10:27:36 -04:00

59 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.