From asc-release-kit
Create localized ASC screenshots for iOS apps from a real project, Xcode UI Test screenshots, and a Pixelmator Pro PXD iPhone mockup template. Use when the user asks for App Store Connect screenshots, ASC screenshot assets, localized screenshot generation, hard dependency checks, product angle discovery, Xcode UI Test screenshot capture, localized short headlines, Pixelmator Pro AppleScript PXD editing, visual QA, and PNG export.
How this skill is triggered — by the user, by Claude, or both
Slash command
/asc-release-kit:asc-screenshotsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill to run the full ASC screenshot pipeline: product angles -> UI screenshots -> localized headline copy -> Pixelmator Pro PXD files -> PNG exports.
Use this skill to run the full ASC screenshot pipeline: product angles -> UI screenshots -> localized headline copy -> Pixelmator Pro PXD files -> PNG exports.
Before starting, verify all five hard dependencies:
.pxd file that contains the iPhone mockup/template.If Pixelmator Pro, its AppleScript support, the PXD template, or the localization list are missing, stop immediately. Tell the user which of those four items is missing. Do not substitute manual screenshots, a recreated iPhone frame, non-PXD templates, or non-AppleScript PXD edits for any of these four missing items.
Xcode UI Tests follow a different rule: if they are missing, do not stop. Instead follow the Writing UI Tests When Missing section to inspect the project, generate a working screenshot test target, write it into the project, confirm it with the user, and run it. Only stop if the project cannot be read or understood well enough to write meaningful test navigation.
Hard dependency verification checklist:
name or build number, without opening or changing user documents..pxd extension, and is a local file intended to contain the iPhone mockup.Writing UI Tests When Missing.When no Xcode UI test target exists for the project, or the existing UI test target has no screenshot-capturing tests, generate and add them before running the screenshot workflow. Follow this process exactly.
Read the project read-only to understand the app structure before writing any test code:
.xcodeproj or Package.swift.@main, App conformance, SceneDelegate, or AppDelegate.ProcessInfo.processInfo.environment checks the app already uses for testing or preview modes. Use the same pattern to inject screenshot state.If the project has no UI test target at all, create one:
<AppName>UITests following the existing naming convention.<AppName>UITests/<AppName>ScreenshotTests.swift.If the project already has a UI test target but no screenshot tests, add a new file ScreenshotTests.swift inside the existing target. Do not modify existing test files.
Generate a ScreenshotTests.swift file tailored to this app's navigation. Use this structure as the base pattern:
import XCTest
final class ScreenshotTests: XCTestCase {
private var app: XCUIApplication!
override func setUpWithError() throws {
continueAfterFailure = false
app = XCUIApplication()
// Use a launch argument so the app can detect screenshot mode
// and load deterministic sample data if it supports this.
app.launchArguments += ["--screenshot-mode"]
app.launch()
}
// Add one test function per promo point.
// Name each test with a two-digit prefix so they sort by capture order.
func test01_MainScreen() throws {
// The app launches directly to the main screen.
// Wait for the UI to settle before capturing.
XCTAssertTrue(app.wait(for: .runningForeground, timeout: 5))
capture(name: "01-main-screen")
}
func test02_DetailView() throws {
// Navigate to the detail view.
app.buttons["Add Entry"].firstMatch.tap()
XCTAssertTrue(app.navigationBars.firstMatch.waitForExistence(timeout: 3))
capture(name: "02-detail-view")
}
// MARK: - Helper
private func capture(name: String) {
let screenshot = XCUIScreen.main.screenshot()
// Store as XCTAttachment so it is always preserved in the result bundle.
let attachment = XCTAttachment(screenshot: screenshot)
attachment.name = name
attachment.lifetime = .keepAlways
add(attachment)
// Also write directly to a folder so extraction is straightforward.
// Pass SCREENSHOT_OUTPUT_DIR as an environment variable when running tests
// if direct file output is preferred over xcresulttool extraction.
if let outputDir = ProcessInfo.processInfo.environment["SCREENSHOT_OUTPUT_DIR"] {
let dir = URL(fileURLWithPath: outputDir)
try? FileManager.default.createDirectory(at: dir,
withIntermediateDirectories: true)
let file = dir.appendingPathComponent("\(name).png")
try? screenshot.pngRepresentation.write(to: file)
}
}
}
Adapt the test body for each promo point identified in the promo plan. Replace the example navigation steps with real element queries derived from the inspected app. Use waitForExistence(timeout:) instead of sleep for all waits.
Do not invent UI element labels. Derive them from the inspected source: accessibilityIdentifier, accessibilityLabel, button titles, navigation bar titles, or visible text strings from the app's localization files.
To capture screenshots in multiple languages, use an Xcode Test Plan:
<AppName>Screenshots.xctestplan at the project root.{
"configurations": [
{
"id": "en-US-config",
"name": "en-US",
"options": {
"language": "en",
"region": "US"
}
},
{
"id": "zh-Hans-config",
"name": "zh-Hans",
"options": {
"language": "zh-Hans",
"region": "CN"
}
}
],
"defaultOptions": {
"testTimeoutsEnabled": true,
"defaultTestExecutionTimeAllowance": 60
},
"testTargets": [
{
"target": {
"name": "<AppName>UITests",
"type": "target"
}
}
],
"version": 1
}
If a test plan already exists in the project for other targets, add a new test plan rather than modifying the existing one.
Before writing any file to the project, show the user:
ScreenshotTests.swift content.Ask for confirmation. If the user requests changes to the navigation steps, update the generated code. Do not write to the project until the user approves.
After the user approves, immediately write the files and proceed to step 6 (run the tests). Do not stop or summarize after writing. Approval is authorization to execute the full remaining pipeline: write → build → run → extract → PXD → PNG.
After the user approves and the files are written, run the tests using XcodeBuildMCP when available, or via xcodebuild directly:
# With a test plan for all locales at once:
xcodebuild test \
-project <AppName>.xcodeproj \
-scheme <SchemeName> \
-testPlan <AppName>Screenshots \
-destination 'platform=iOS Simulator,name=iPhone 16 Pro' \
-resultBundlePath TestResults.xcresult
# Extract screenshots from the result bundle:
xcrun xcresulttool get --path TestResults.xcresult \
--format json > result.json
If SCREENSHOT_OUTPUT_DIR was set, screenshots are already in that folder; skip extraction.
To extract attachments from an .xcresult bundle without writing a custom parser, use:
# List all attachments
xcrun xcresulttool export --path TestResults.xcresult \
--output-path screenshots/ \
--type directory
Organize extracted screenshots into the per-language folder structure required by the rest of this workflow before continuing to screenshot acceptance.
At the end of the workflow, the output report must include:
ScreenshotTests.swift and test plan.xcodebuild command used to run them.--screenshot-mode was supported by the app or was passed as an unused launch argument.$pixelmator-pxd-editor is a soft dependency for PXD editing. Use it when available; otherwise follow the AppleScript rules in this skill directly and note the fallback in the output report.
$ui-ux-pro-max and $imagegen are not part of this toolkit. Do not reference or wait for them.
$pixelmator-pxd-editor if it is available; otherwise follow the Pixelmator Pro AppleScript rules in this skill and report the soft-dependency fallback at the end.data/*OriginalContentSource files directly.Two workflow steps must be delegated to subagents: promo point discovery (Step A) and headline writing (Step B). Use whatever subagent mechanism the environment provides. If none exists, perform both inline and note it in the output report.
Step A — Promo point discovery
Run after hard dependencies are confirmed, before screenshot planning. Spawn a subagent capable of product strategy or app marketing analysis with this prompt (substitute actual values):
You are helping plan App Store screenshots for an iOS app.
Project path: <project_root>
Inspect the project read-only and identify the best App Store promotional angles.
Return a table with these columns:
- Promo point: the feature or value being showcased
- Screen to capture: the exact view or state to screenshot
- Required UI state or sample data: what must be visible before the screenshot
- Why it's worth promoting: one sentence grounded in the actual project
Identify 3–6 promo points. Keep all claims grounded in what is implemented. Do not edit any files.
Step B — Localized headline writing
Run after promo points and screenshots exist, before PXD editing. Spawn a subagent capable of localized marketing copywriting with this prompt (substitute actual values):
You are writing App Store screenshot headlines for an iOS app.
Promo points: <promo_point_table>
Target locales: <locale_list>
Write one short headline per promo point per locale.
- Default length: one phrase or sentence, around 5–6 words in English, similarly compact in other languages.
- Write in the target language natively, not translated English.
- Keep all claims grounded in the confirmed promo points and visible app state.
- Do not invent features or make claims unsupported by the screenshots.
- Do not edit any files.
Return a table grouped by locale: locale | promo point | headline.
Record which subagent or agent type was used for each step in the final output report.
Before creating PXD files, every screenshot must pass these checks:
If a screenshot fails acceptance, recapture it before editing PXD files. If it cannot be recaptured through Xcode UI Tests, stop and report the blocked screenshot.
Confirm workspace and outputs.
en:英语 or zh-Hans:简体中文, following the user's naming style when provided.App Store Promo Assets/ at the outermost project root.Identify promo points.
Subagent Delegation.Capture localized screenshots.
Writing UI Tests When Missing in full before continuing: inspect the project, generate ScreenshotTests.swift and a test plan, show the code to the user, wait for approval, write the files, then immediately run the tests. Do not stop after writing.xcodebuild directly.<output-folder>/en:英语/screenshots/<output-folder>/zh-Hans:简体中文/screenshots/01-memory-timeline.png.Write localized headlines.
Subagent Delegation.Create PXD files.
$pixelmator-pxd-editor before any PXD inspection, editing, automation, or export when it is available.$pixelmator-pxd-editor is unavailable, continue only with Pixelmator Pro's official AppleScript dictionary and report the fallback at the end.page1.pxd, page2.pxd, etc., unless the user asks otherwise.replace image command.Final QA and export.
Export QA checklist:
.pxd and .png exists in the correct language folder and is non-zero size.When available, use $pixelmator-pxd-editor as the source of truth for PXD inspection, editing, allowed AppleScript commands/properties, safety defaults, and export behavior. If it is unavailable, follow this section directly and report the fallback at the end.
Use Pixelmator Pro's official AppleScript automation for all editable PXD work:
open for copied PXD files.replace image ... with ... scale mode scale to fill or scale to fit for screen replacement.replace text for known placeholder text, or set a matched text layer's text content.save as new document ... as Pixelmator Pro for the edited PXD copy.export ... as PNG for final PNG output.autosave enabled after scripts that change it.saving no; do not close unrelated user documents.Verified safe shape for common iPhone mockup templates:
set copiedPXD to POSIX file "/path/to/copied-template.pxd"
set screenshotFile to POSIX file "/path/to/screenshot.png"
set outputPXD to POSIX file "/path/to/output/page1.pxd"
set outputPNG to POSIX file "/path/to/output/page1.png"
set headlineText to "A calmer way to journal"
tell application "Pixelmator Pro"
activate
set oldAutosave to autosave enabled
set autosave enabled to false
set promoDoc to open copiedPXD
delay 1
tell promoDoc
set text content of text layer "Headline" to headlineText
set phoneGroup to group layer "iPhone 16 Pro"
set screenLayer to image layer "Media Placeholder: Replace With Your Media" of phoneGroup
replace image screenLayer with screenshotFile scale mode scale to fill
save as new document it in outputPXD as Pixelmator Pro
export it to outputPNG as PNG
end tell
close promoDoc saving no
set autosave enabled to oldAutosave
end tell
Do not assume these exact layer names. Inspect the copied PXD first, then adapt layer names while preserving the same safe copy/open/edit/save/export structure.
At completion, return:
iPhone 17 Pro, and show every screenshot as its full local absolute path..pxd and .png files.npx claudepluginhub raydeveloperf/app-store-connect-release-kit --plugin asc-release-kitSearches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.