Releases: tddworks/asc-cli
Releases · tddworks/asc-cli
asc v0.17.0
Added
GET /api/v1/apps?include=icon— enriches each app in the response with its primary build'siconAsset(templateUrl,width,height). Icon fetch is opt-in to keep the default list-apps path fast. Without?include=icon, behaviour is unchanged. Template URL placeholders ({w},{h},{f}) can be substituted client-side to render at any size (e.g.120x120bb.png).- Domain types
ImageAsset,App.iconAsset— new optionaliconAssetonApp(omitted from JSON when nil), newImageAssetvalue type underDomain/Shared/withurl(maxSize:format:)helper. Populated from SDKBuild.iconAssetTokenvia/v1/apps/{id}/appStoreVersions?include=build AppRepository.fetchAppIcon(appId:)— returnsImageAsset?by joining the latest app version to its build. Returnsnilwhen no version has an attached buildGET /api/v1/apps/{appId}/app-infos— new REST route backed byAppInfoRepository. Previously the affordance onAppadvertised this path but the controller returned 404.AppInfois nowPresentableand usesstructuredAffordances, so responses include_linksto app-info localizations, age rating, and the enclosing app-infos listAppInfo.appStoreState/AppInfo.state— app-infos responses now include lifecycle fields (appStoreStateuses legacy ASC version states likeREADY_FOR_SALE;stateuses the newerAppInfo.Stateenum likeREADY_FOR_DISTRIBUTION,PREPARE_FOR_SUBMISSION). Agents can use these to pick the live-version app-info vs the version-being-prepared. Computed booleansisLiveandisEditableexpose the common decisionsAppInfo.appStoreAgeRating— computed App Store age rating (e.g.FOUR_PLUS,NINE_PLUS,TWELVE_PLUS,SEVENTEEN_PLUS) now surfaced on app-infos responses. This is what the App Store listing page displays; cheaper than fetching the fullageRatingDeclarationwhen only the label is neededasc app-categories get --category-id <id>+GET /api/v1/app-categories/{id}— fetch a single App Store category by ID.AppInforesponses now includegetPrimaryCategory,getSecondaryCategory, and four subcategory affordances (conditional on the respective ID being set), each pointing at the new endpoint. Backed by newAppCategoryRepository.getCategory(id:)GET /api/v1/app-categories— list categories exposed at the REST layer (previously CLI-only). Optional?platform=query param mirrors the CLI flagGET /api/v1/app-infos/{appInfoId}/localizations— new REST route backed byAppInfoRepository.listLocalizations.AppInfoLocalizationis nowPresentablewithstructuredAffordancesincluding update/delete links- Unified REST path resolver — removed the global
{param → segment}alias table fromRESTPathResolver. New single rule: for resource actions (get/update/delete/submit/…), the command name IS the REST segment. CLI flag aliases (e.g.--localization-id,--product-id) are presentation concerns and no longer drive REST routing. Fixes ambiguity where the same CLI flag belonged to multiple resources GET /api/v1/age-rating/{appInfoId}— fetch the age rating declaration for an app-info. Previously onlyasc age-rating getworked; the REST route was advertised via_links.getAgeRatingbut returned 404.AgeRatingDeclarationis nowPresentablewithstructuredAffordancesPATCH /api/v1/app-infos/{appInfoId}— update app-info categories (primary, secondary, up to two subcategories each) via REST. JSON body acceptsprimaryCategoryId,primarySubcategoryOneId,primarySubcategoryTwoId,secondaryCategoryId,secondarySubcategoryOneId,secondarySubcategoryTwoId— any subset. Returns the updatedAppInfowith_linksthat now includegetPrimaryCategory/getSecondaryCategorypointing at the new valuesGET /api/v1/version-localizations/{localizationId}/screenshot-setsandGET /api/v1/screenshot-sets/{setId}/screenshots— screenshot-related_linksonAppStoreVersionLocalizationandAppScreenshotSetresponses now resolve to working REST endpoints.AppStoreVersionLocalization,AppScreenshotSet, andAppScreenshotnow usestructuredAffordances(replacing rawaffordances); the latter two also gainedPresentableconformance
Changed
- REST controllers split by resource (SRP/OCP refactor) — the former
AppsControllerwas a god controller accumulating 15+ routes across 8 unrelated resources (apps, versions, localizations, screenshot-sets, screenshots, builds, testflight, reviews, iap, subscription-groups, app-infos, app-info-localizations, app-categories, age-rating). Now split into 13 focused controllers, one per REST resource type —AppsController,VersionsController,VersionLocalizationsController,ScreenshotSetsController,ScreenshotsController,BuildsController,TestFlightController,CustomerReviewsController,IAPController,SubscriptionGroupsController,AppInfosController,AppCategoriesController,AgeRatingController. Each takes only the 1–2 repositories it actually needs.RESTRoutes.configurecomposes them with one line per resource. Adding a new resource no longer requires editing an existing controller
Fixed
RESTPathResolver.ensureInitializedrace — theinitializedflag was being set before the domain route registrations ran, so concurrent callers could observeinitialized == truewhile theroutesdictionary was still empty. Now uses a separateinitLockand sets the flag only after all_*Routesregistrations complete. Fixes intermittent test failures where screenshot/localization_linksresolved to top-level paths under parallel test executioninclude=primaryCategory,…on app-infos request — added toSDKAppInfoRepository.listAppInfosalongsidefields[appInfos]. The ASC API returns only relationshiplinkswithfields[]alone;include=is required to populaterelationships.primaryCategory.data.idso the mapper can surfaceprimaryCategoryIdetc.
Fixed
AppInfo.primaryCategoryId/ secondary categories missing from/v1/apps/{id}/appInfos— the ASC API returns relationshipdatasparsely unless the client requests the explicit sparse fieldset.SDKAppInfoRepository.listAppInfosnow passesfields[appInfos]=primaryCategory,primarySubcategoryOne,primarySubcategoryTwo,secondaryCategory,secondarySubcategoryOne,secondarySubcategoryTwo, so the mappedAppInfocarries the category IDs
asc v0.16.9
Added
asc review-submissions list— list App Store review submissions for an app. Required--app-id; optional--state <CSV>(e.g.WAITING_FOR_REVIEW,IN_REVIEW,READY_FOR_REVIEWorUNRESOLVED_ISSUES) and--limit. Backed bySubmissionRepository.listSubmissions(appId:states:limit:)asc certificates listfiltering flags —--limit(server-side),--expired-only(client-side, drops unexpired certs),--before <ISO8601>(client-side, keeps certs with expirationDate strictly before the cutoff)- REST endpoint
GET /api/v1/apps/{appId}/review-submissions— newReviewSubmissionsControllerin theasc web-server. Supports?state=…&limit=…query params; mirrors the CLI. No fleet route — Apple's OpenAPI spec marksfilter[app]as required, so review submissions can only be listed per-app - REST endpoint
GET /api/v1/certificatesquery params — now honours?type=&limit=&expired-only=&before=(previously ignored).beforeaccepts both full ISO8601 (2026-11-01T00:00:00Z) and date-only (2026-11-01, interpreted as midnight UTC). Same filter semantics as the CLI - REST endpoint
GET /api/v1/builds— fleet listing with optional?app-id=&platform=&version=&limit=query params./api/v1/apps/{appId}/buildsstill works for the nested form
Changed
CertificateRepository.listCertificatessignature now takes(certificateType:limit:)— forwardslimitto the SDKReviewSubmissionREST links — affordance migrated from rawaffordancesdictionary tostructuredAffordances, so REST responses now render_linkscorrectly (e.g./api/v1/apps/{appId}/versions)
asc v0.1.68
Added
asc testflight groups create— create external or internal TestFlight beta groups (--internalflag toggles internal;--public-link-enabled/--feedback-enabledfor external groups)asc initreview contact flags —--contact-first-name,--contact-last-name,--contact-phone,--contact-emailsave review contact info to.asc/project.jsonfor reuse across versionsProjectConfigreview contact fields — optionalcontactFirstName,contactLastName,contactPhone,contactEmailwithhasReviewContactcomputed propertysetReviewContact/updateReviewContactaffordances —ProjectConfignow suggests setting review contact when missing
asc v0.1.67
Bug fixes and improvements.
asc v0.1.66
Added
ThemeDesigndomain model — composes from Gallery-native types (GalleryPalette+[Decoration]) for structured theme output. Generated by AI once, applied deterministically to all screenshotsThemeDesignApplier— re-renders throughGalleryHTMLRenderer.renderScreen()pipeline with overridden palette and merged decorations (no HTML patching)GalleryPalette.textColor— optional explicit text color, overrides the auto-detect heuristicDecoration.label()shape — text/emoji decorative elements (e.g.Decoration(shape: .label("✨"), ...))DecorationAnimation— float, drift, pulse, spin, twinkle animations for decorationsScreenLayout.withDecorations()— creates a copy with additional decorationsGalleryHTMLRenderer.renderDecorations()— rendersScreenLayout.decorations(previously dead code) usingcqiunitsbuildDesignContext()onScreenTheme— prompt method that instructs AI to returnThemeDesignJSONdesign()onThemeProvider/ThemeRepository— generate a ThemeDesign from AI in one call--design-only/--apply-designCLI flags — batch theme workflow- REST endpoints —
POST /app-shots/themes/designandPOST /app-shots/themes/apply-design
Changed
GalleryHTMLRendererrefactored to Mustache templates — all HTML extracted from Swift into 7.mustachetemplate files using swift-mustache. The renderer only builds context dictionaries; all HTML, CSS colors (via CSS custom properties intheme-vars.mustache), and keyframe animations live in templates. Templates are pre-compiled at startup viaMustacheLibraryfor performance. Preview rendering is cached per template ID.DecorationShape.displayCharacter— computed property on the model instead of renderer logicGalleryPalette.isLight+headlineColor— theme detection and text color derivation moved from renderer to paletteDecorationextended — new optional fields:color,background,borderRadius,animation- Theme selection no longer requires auto-compose — clicking a theme applies immediately to slides with existing preview HTML via
ThemeDesign(1 AI call for design, then deterministic apply to all slides) - Blitz plugin:
design()implemented — generatesThemeDesignvia compose bridgemode: "design", enabling the fast design→apply-design flow
asc v0.1.65
Changed
Presentableprotocol — domain models own their table headers and row values; eliminatesheaders:/rowMapper:boilerplate from 37 list commands- REST controllers with DI — routes rewritten as controller structs (
AppsController,CodeSigningController, etc.) with injected repo dependencies; repos created once at server startup, not per request - No more
Command.parse([])in REST layer — controllers call domain repos and operations directly; CLI and REST are equal thin adapters AffordanceRegistryuses structuredAffordance— plugin affordances now render to both CLI commands and REST_links(previously CLI-only)ScreenshotTemplatedomain operations —apply(content:),renderFragment(content:)as rich domain methods;ThemedPagevalue type for page wrappingScreenshotTemplateCodable includespreviewHTMLanddeviceCount— REST consumers get preview data without special handling
asc v0.1.64
Added
- REST API with HATEOAS —
GET /api/v1entry point plus 12 resource endpoints (apps, versions, builds, testflight, certificates, bundle-ids, devices, profiles, simulators, plugins, territories) calling domain repositories directly (in-process, no subprocess), returning JSON with_linksfor agent navigation APIRootmodel — HATEOAS entry point atGET /api/v1listing all available top-level resources with navigable_links- Structured
Affordancetype — single source of truth for both CLI commands and REST links; models define affordances once, rendered to either format byOutputFormatter APILinkandAffordanceMode— domain types supporting dual-mode affordance rendering (.cli→"affordances",.rest→"_links")RESTPathResolver— resolves CLI command + params into REST API paths using a route table covering 35+ resource types across the full domain hierarchy- HTML-to-PNG export —
--preview imageoption onasc app-shots templates applyandasc app-shots themes applyrenders composed HTML to PNG via WebKit, with--image-outputfor custom output path HTMLRendererprotocol —@Mockabledomain protocol for HTML-to-image rendering, implemented byWebKitHTMLRendererusing WKWebView snapshot
asc v0.1.63
Added
- Plugin Marketplace —
asc plugins market listandasc plugins market search --query Xto browse and search plugins from tddworks/asc-registry - Multi-source plugin registry —
PluginSourceprotocol withGitHubPluginSourceimplementation; composable sources inPluginMarketRepository asc plugins install --name X— download and install.pluginbundles from the marketplaceasc plugins uninstall --name X— remove installed plugin bundles (matches by slug or registry ID)- Plugins page in Command Center — web UI with Installed and Marketplace tabs, stats bar, install/uninstall with loading spinners
- Enriched plugin manifest —
manifest.jsonnow supportsdescription,author,repositoryURL,categories; installed plugins display the same rich info as marketplace listings - Centralized plugin affordance merging —
AffordanceRegistryaffordances merged automatically inOutputFormatterviaWithPluginAffordances; domain models no longer need manual registry calls - Example plugin —
examples/hello-plugin/demonstratesAffordanceRegistry, server routes, and UI affordance handlers - Plugin registry repo — tddworks/asc-registry with
registry.jsonand release assets for ASC Pro + Hello Plugin
Changed
- Unified
Pluginmodel — mergedPluginandMarketPlugininto a single model withisInstalled,downloadURL?,slug?fields - Refactored plugin system — replaced event-based script plugins with dylib
.pluginbundle management - Removed event plugin system — deleted
PluginEvent,PluginEventPayload,PluginResult,PluginRunner,PluginEventBusand all infrastructure - Removed event bus from commands —
BuildsUploadandVersionsSubmitno longer emit plugin events - Apps page affordance buttons — plugin affordances (e.g.
greetfrom Hello Plugin) render as clickable buttons viaappAffordanceHandlersregistry
asc v0.1.62
Added
asc web-server— Swift/Hummingbird HTTP+WebSocket server replacing Node.js. Single binary, zero external dependencies, HTTPS with self-signed cert- Plugin architecture —
.pluginbundles in~/.asc/plugins/extend the CLI with routes, commands, affordances, and UI. Dylibs built withdynamic_lookup(~300KB) AffordanceRegistry— plugins extend domain model affordances at runtime (e.g. pro plugin addsstreamto booted simulators)- Affordance-driven UI — web app renders buttons from CAEOAS affordances, not hardcoded features. Plugins register handlers via
window.simAffordanceHandlers - Command Center Simulators page — device list with search/filter, stats cards, affordance-driven actions
asc v0.1.61
Added
- Screenshot image URLs —
asc screenshots listnow returnsimageUrlfor each screenshot, so you can view and render real App Store images directly from CLI output - Screenshot platform filtering — filter and browse screenshots by platform (iPhone, iPad, etc.) in the web UI
- Simulator screenshot capture — capture and browse simulator screenshots in the web gallery
- Simulator live streaming — stream your simulator screen in real-time via MJPEG to the browser
Changed
- Simulator interaction feedback — improved tap ripple effect and gesture responsiveness in the streaming UI